Commit e538dfdae85244fd2c4231725d82cc1f1bc4942c

Authored by Michal Nazarewicz
Committed by Greg Kroah-Hartman
1 parent c58a76cdd7

usb: Provide usb_speed_string() function

In a few places in the kernel, the code prints
a human-readable USB device speed (eg. "high speed").
This involves a switch statement sometimes wrapped
around in ({ ... }) block leading to code repetition.

To mitigate this issue, this commit introduces
usb_speed_string() function, which returns
a human-readable name of provided speed.

It also changes a few places switch was used to use
this new function.  This changes a bit the way the
speed is printed in few instances at the same time
standardising it.

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Showing 18 changed files with 125 additions and 195 deletions Side-by-side Diff

... ... @@ -12,6 +12,11 @@
12 12  
13 13 if USB_SUPPORT
14 14  
  15 +config USB_COMMON
  16 + tristate
  17 + default y
  18 + depends on USB || USB_GADGET
  19 +
15 20 # Host-side USB depends on having a host controller
16 21 # NOTE: dummy_hcd is always an option, but it's ignored here ...
17 22 # NOTE: SL-811 option should be board-specific ...
drivers/usb/Makefile
... ... @@ -53,4 +53,6 @@
53 53 obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/
54 54 obj-$(CONFIG_USB_OTG_UTILS) += otg/
55 55 obj-$(CONFIG_USB_GADGET) += gadget/
  56 +
  57 +obj-$(CONFIG_USB_COMMON) += usb-common.o
drivers/usb/core/hub.c
... ... @@ -2793,7 +2793,7 @@
2793 2793 int i, j, retval;
2794 2794 unsigned delay = HUB_SHORT_RESET_TIME;
2795 2795 enum usb_device_speed oldspeed = udev->speed;
2796   - char *speed, *type;
  2796 + const char *speed;
2797 2797 int devnum = udev->devnum;
2798 2798  
2799 2799 /* root hub ports have a slightly longer reset period
2800 2800  
... ... @@ -2853,25 +2853,16 @@
2853 2853 default:
2854 2854 goto fail;
2855 2855 }
2856   -
2857   - type = "";
2858   - switch (udev->speed) {
2859   - case USB_SPEED_LOW: speed = "low"; break;
2860   - case USB_SPEED_FULL: speed = "full"; break;
2861   - case USB_SPEED_HIGH: speed = "high"; break;
2862   - case USB_SPEED_SUPER:
2863   - speed = "super";
2864   - break;
2865   - case USB_SPEED_WIRELESS:
2866   - speed = "variable";
2867   - type = "Wireless ";
2868   - break;
2869   - default: speed = "?"; break;
2870   - }
  2856 +
  2857 + if (udev->speed == USB_SPEED_WIRELESS)
  2858 + speed = "variable speed Wireless";
  2859 + else
  2860 + speed = usb_speed_string(udev->speed);
  2861 +
2871 2862 if (udev->speed != USB_SPEED_SUPER)
2872 2863 dev_info(&udev->dev,
2873   - "%s %s speed %sUSB device number %d using %s\n",
2874   - (udev->config) ? "reset" : "new", speed, type,
  2864 + "%s %s USB device number %d using %s\n",
  2865 + (udev->config) ? "reset" : "new", speed,
2875 2866 devnum, udev->bus->controller->driver->name);
2876 2867  
2877 2868 /* Set up TT records, if needed */
drivers/usb/gadget/amd5536udc.c
... ... @@ -3005,13 +3005,8 @@
3005 3005  
3006 3006 /* link up all endpoints */
3007 3007 udc_setup_endpoints(dev);
3008   - if (dev->gadget.speed == USB_SPEED_HIGH) {
3009   - dev_info(&dev->pdev->dev, "Connect: speed = %s\n",
3010   - "high");
3011   - } else if (dev->gadget.speed == USB_SPEED_FULL) {
3012   - dev_info(&dev->pdev->dev, "Connect: speed = %s\n",
3013   - "full");
3014   - }
  3008 + dev_info(&dev->pdev->dev, "Connect: %s\n",
  3009 + usb_speed_string(dev->gadget.speed));
3015 3010  
3016 3011 /* init ep 0 */
3017 3012 activate_control_endpoints(dev);
drivers/usb/gadget/atmel_usba_udc.c
... ... @@ -1718,13 +1718,12 @@
1718 1718 spin_lock(&udc->lock);
1719 1719 }
1720 1720  
1721   - if (status & USBA_HIGH_SPEED) {
1722   - DBG(DBG_BUS, "High-speed bus reset detected\n");
  1721 + if (status & USBA_HIGH_SPEED)
1723 1722 udc->gadget.speed = USB_SPEED_HIGH;
1724   - } else {
1725   - DBG(DBG_BUS, "Full-speed bus reset detected\n");
  1723 + else
1726 1724 udc->gadget.speed = USB_SPEED_FULL;
1727   - }
  1725 + DBG(DBG_BUS, "%s bus reset detected\n",
  1726 + usb_speed_string(udc->gadget.speed));
1728 1727  
1729 1728 ep0 = &usba_ep[0];
1730 1729 ep0->desc = &usba_ep0_desc;
drivers/usb/gadget/composite.c
... ... @@ -617,25 +617,9 @@
617 617 result = 0;
618 618 }
619 619  
620   - INFO(cdev, "%s speed config #%d: %s\n",
621   - ({ char *speed;
622   - switch (gadget->speed) {
623   - case USB_SPEED_LOW:
624   - speed = "low";
625   - break;
626   - case USB_SPEED_FULL:
627   - speed = "full";
628   - break;
629   - case USB_SPEED_HIGH:
630   - speed = "high";
631   - break;
632   - case USB_SPEED_SUPER:
633   - speed = "super";
634   - break;
635   - default:
636   - speed = "?";
637   - break;
638   - } ; speed; }), number, c ? c->label : "unconfigured");
  620 + INFO(cdev, "%s config #%d: %s\n",
  621 + usb_speed_string(gadget->speed),
  622 + number, c ? c->label : "unconfigured");
639 623  
640 624 if (!c)
641 625 goto done;
drivers/usb/gadget/file_storage.c
... ... @@ -2862,17 +2862,10 @@
2862 2862 fsg->config = new_config;
2863 2863 if ((rc = do_set_interface(fsg, 0)) != 0)
2864 2864 fsg->config = 0; // Reset on errors
2865   - else {
2866   - char *speed;
2867   -
2868   - switch (fsg->gadget->speed) {
2869   - case USB_SPEED_LOW: speed = "low"; break;
2870   - case USB_SPEED_FULL: speed = "full"; break;
2871   - case USB_SPEED_HIGH: speed = "high"; break;
2872   - default: speed = "?"; break;
2873   - }
2874   - INFO(fsg, "%s speed config #%d\n", speed, fsg->config);
2875   - }
  2865 + else
  2866 + INFO(fsg, "%s config #%d\n",
  2867 + usb_speed_string(fsg->gadget->speed),
  2868 + fsg->config);
2876 2869 }
2877 2870 return rc;
2878 2871 }
drivers/usb/gadget/fsl_udc_core.c
... ... @@ -1715,34 +1715,31 @@
1715 1715 }
1716 1716 }
1717 1717  
  1718 +static inline enum usb_device_speed portscx_device_speed(u32 reg)
  1719 +{
  1720 + switch (speed & PORTSCX_PORT_SPEED_MASK) {
  1721 + case PORTSCX_PORT_SPEED_HIGH:
  1722 + return USB_SPEED_HIGH;
  1723 + case PORTSCX_PORT_SPEED_FULL:
  1724 + return USB_SPEED_FULL;
  1725 + case PORTSCX_PORT_SPEED_LOW:
  1726 + return USB_SPEED_LOW;
  1727 + default:
  1728 + return USB_SPEED_UNKNOWN;
  1729 + }
  1730 +}
  1731 +
1718 1732 /* Process a port change interrupt */
1719 1733 static void port_change_irq(struct fsl_udc *udc)
1720 1734 {
1721   - u32 speed;
1722   -
1723 1735 if (udc->bus_reset)
1724 1736 udc->bus_reset = 0;
1725 1737  
1726 1738 /* Bus resetting is finished */
1727   - if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) {
  1739 + if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET))
1728 1740 /* Get the speed */
1729   - speed = (fsl_readl(&dr_regs->portsc1)
1730   - & PORTSCX_PORT_SPEED_MASK);
1731   - switch (speed) {
1732   - case PORTSCX_PORT_SPEED_HIGH:
1733   - udc->gadget.speed = USB_SPEED_HIGH;
1734   - break;
1735   - case PORTSCX_PORT_SPEED_FULL:
1736   - udc->gadget.speed = USB_SPEED_FULL;
1737   - break;
1738   - case PORTSCX_PORT_SPEED_LOW:
1739   - udc->gadget.speed = USB_SPEED_LOW;
1740   - break;
1741   - default:
1742   - udc->gadget.speed = USB_SPEED_UNKNOWN;
1743   - break;
1744   - }
1745   - }
  1741 + udc->gadget.speed =
  1742 + portscx_device_speed(fsl_readl(&dr_regs->portsc1));
1746 1743  
1747 1744 /* Update USB state */
1748 1745 if (!udc->resume_state)
... ... @@ -2167,20 +2164,8 @@
2167 2164 default:
2168 2165 s = "None"; break;
2169 2166 }
2170   - s;} ), ( {
2171   - char *s;
2172   - switch (tmp_reg & PORTSCX_PORT_SPEED_UNDEF) {
2173   - case PORTSCX_PORT_SPEED_FULL:
2174   - s = "Full Speed"; break;
2175   - case PORTSCX_PORT_SPEED_LOW:
2176   - s = "Low Speed"; break;
2177   - case PORTSCX_PORT_SPEED_HIGH:
2178   - s = "High Speed"; break;
2179   - default:
2180   - s = "Undefined"; break;
2181   - }
2182   - s;
2183   - } ),
  2167 + s;} ),
  2168 + usb_speed_string(portscx_device_speed(tmp_reg)),
2184 2169 (tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ?
2185 2170 "Normal PHY mode" : "Low power mode",
2186 2171 (tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" :
drivers/usb/gadget/gmidi.c
... ... @@ -640,17 +640,8 @@
640 640 if (result) {
641 641 gmidi_reset_config(dev);
642 642 } else {
643   - char *speed;
644   -
645   - switch (gadget->speed) {
646   - case USB_SPEED_LOW: speed = "low"; break;
647   - case USB_SPEED_FULL: speed = "full"; break;
648   - case USB_SPEED_HIGH: speed = "high"; break;
649   - default: speed = "?"; break;
650   - }
651   -
652 643 dev->config = number;
653   - INFO(dev, "%s speed\n", speed);
  644 + INFO(dev, "%s speed\n", usb_speed_string(gadget->speed));
654 645 }
655 646 return result;
656 647 }
drivers/usb/gadget/langwell_udc.c
... ... @@ -1690,20 +1690,7 @@
1690 1690 "BmAttributes: %d\n\n",
1691 1691 LPM_PTS(tmp_reg),
1692 1692 (tmp_reg & LPM_STS) ? 1 : 0,
1693   - ({
1694   - char *s;
1695   - switch (LPM_PSPD(tmp_reg)) {
1696   - case LPM_SPEED_FULL:
1697   - s = "Full Speed"; break;
1698   - case LPM_SPEED_LOW:
1699   - s = "Low Speed"; break;
1700   - case LPM_SPEED_HIGH:
1701   - s = "High Speed"; break;
1702   - default:
1703   - s = "Unknown Speed"; break;
1704   - }
1705   - s;
1706   - }),
  1693 + usb_speed_string(lpm_device_speed(tmp_reg)),
1707 1694 (tmp_reg & LPM_PFSC) ? "Force Full Speed" : "Not Force",
1708 1695 (tmp_reg & LPM_PHCD) ? "Disabled" : "Enabled",
1709 1696 LPM_BA(tmp_reg));
1710 1697  
... ... @@ -2647,12 +2634,24 @@
2647 2634 dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__);
2648 2635 }
2649 2636  
  2637 +static inline enum usb_device_speed lpm_device_speed(u32 reg)
  2638 +{
  2639 + switch (LPM_PSPD(reg)) {
  2640 + case LPM_SPEED_HIGH:
  2641 + return USB_SPEED_HIGH;
  2642 + case LPM_SPEED_FULL:
  2643 + return USB_SPEED_FULL;
  2644 + case LPM_SPEED_LOW:
  2645 + return USB_SPEED_LOW;
  2646 + default:
  2647 + return USB_SPEED_UNKNOWN;
  2648 + }
  2649 +}
2650 2650  
2651 2651 /* port change detect interrupt handler */
2652 2652 static void handle_port_change(struct langwell_udc *dev)
2653 2653 {
2654 2654 u32 portsc1, devlc;
2655   - u32 speed;
2656 2655  
2657 2656 dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__);
2658 2657  
... ... @@ -2667,24 +2666,9 @@
2667 2666 /* bus reset is finished */
2668 2667 if (!(portsc1 & PORTS_PR)) {
2669 2668 /* get the speed */
2670   - speed = LPM_PSPD(devlc);
2671   - switch (speed) {
2672   - case LPM_SPEED_HIGH:
2673   - dev->gadget.speed = USB_SPEED_HIGH;
2674   - break;
2675   - case LPM_SPEED_FULL:
2676   - dev->gadget.speed = USB_SPEED_FULL;
2677   - break;
2678   - case LPM_SPEED_LOW:
2679   - dev->gadget.speed = USB_SPEED_LOW;
2680   - break;
2681   - default:
2682   - dev->gadget.speed = USB_SPEED_UNKNOWN;
2683   - break;
2684   - }
2685   - dev_vdbg(&dev->pdev->dev,
2686   - "speed = %d, dev->gadget.speed = %d\n",
2687   - speed, dev->gadget.speed);
  2669 + dev->gadget.speed = lpm_device_speed(devlc);
  2670 + dev_vdbg(&dev->pdev->dev, "dev->gadget.speed = %d\n",
  2671 + dev->gadget.speed);
2688 2672 }
2689 2673  
2690 2674 /* LPM L0 to L1 */
drivers/usb/gadget/net2272.c
... ... @@ -1764,8 +1764,8 @@
1764 1764 dev->gadget.speed = USB_SPEED_HIGH;
1765 1765 else
1766 1766 dev->gadget.speed = USB_SPEED_FULL;
1767   - dev_dbg(dev->dev, "%s speed\n",
1768   - (dev->gadget.speed == USB_SPEED_HIGH) ? "high" : "full");
  1767 + dev_dbg(dev->dev, "%s\n",
  1768 + usb_speed_string(dev->gadget.speed));
1769 1769 }
1770 1770  
1771 1771 ep = &dev->ep[0];
drivers/usb/gadget/net2280.c
... ... @@ -2257,9 +2257,7 @@
2257 2257 else
2258 2258 dev->gadget.speed = USB_SPEED_FULL;
2259 2259 net2280_led_speed (dev, dev->gadget.speed);
2260   - DEBUG (dev, "%s speed\n",
2261   - (dev->gadget.speed == USB_SPEED_HIGH)
2262   - ? "high" : "full");
  2260 + DEBUG(dev, "%s\n", usb_speed_string(dev->gadget.speed));
2263 2261 }
2264 2262  
2265 2263 ep = &dev->ep [0];
drivers/usb/gadget/printer.c
... ... @@ -962,23 +962,15 @@
962 962 usb_gadget_vbus_draw(dev->gadget,
963 963 dev->gadget->is_otg ? 8 : 100);
964 964 } else {
965   - char *speed;
966 965 unsigned power;
967 966  
968 967 power = 2 * config_desc.bMaxPower;
969 968 usb_gadget_vbus_draw(dev->gadget, power);
970 969  
971   - switch (gadget->speed) {
972   - case USB_SPEED_FULL: speed = "full"; break;
973   -#ifdef CONFIG_USB_GADGET_DUALSPEED
974   - case USB_SPEED_HIGH: speed = "high"; break;
975   -#endif
976   - default: speed = "?"; break;
977   - }
978   -
979 970 dev->config = number;
980   - INFO(dev, "%s speed config #%d: %d mA, %s\n",
981   - speed, number, power, driver_desc);
  971 + INFO(dev, "%s config #%d: %d mA, %s\n",
  972 + usb_speed_string(gadget->speed),
  973 + number, power, driver_desc);
982 974 }
983 975 return result;
984 976 }
drivers/usb/gadget/s3c-hsotg.c
... ... @@ -1951,30 +1951,26 @@
1951 1951 case S3C_DSTS_EnumSpd_FS:
1952 1952 case S3C_DSTS_EnumSpd_FS48:
1953 1953 hsotg->gadget.speed = USB_SPEED_FULL;
1954   - dev_info(hsotg->dev, "new device is full-speed\n");
1955   -
1956 1954 ep0_mps = EP0_MPS_LIMIT;
1957 1955 ep_mps = 64;
1958 1956 break;
1959 1957  
1960 1958 case S3C_DSTS_EnumSpd_HS:
1961   - dev_info(hsotg->dev, "new device is high-speed\n");
1962 1959 hsotg->gadget.speed = USB_SPEED_HIGH;
1963   -
1964 1960 ep0_mps = EP0_MPS_LIMIT;
1965 1961 ep_mps = 512;
1966 1962 break;
1967 1963  
1968 1964 case S3C_DSTS_EnumSpd_LS:
1969 1965 hsotg->gadget.speed = USB_SPEED_LOW;
1970   - dev_info(hsotg->dev, "new device is low-speed\n");
1971   -
1972 1966 /* note, we don't actually support LS in this driver at the
1973 1967 * moment, and the documentation seems to imply that it isn't
1974 1968 * supported by the PHYs on some of the devices.
1975 1969 */
1976 1970 break;
1977 1971 }
  1972 + dev_info(hsotg->dev, "new device is %s\n",
  1973 + usb_speed_string(hsotg->gadget.speed));
1978 1974  
1979 1975 /* we should now know the maximum packet size for an
1980 1976 * endpoint, so set the endpoints to a default value. */
drivers/usb/gadget/udc-core.c
... ... @@ -375,23 +375,8 @@
375 375 struct device_attribute *attr, char *buf)
376 376 {
377 377 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
378   - struct usb_gadget *gadget = udc->gadget;
379   -
380   - switch (gadget->speed) {
381   - case USB_SPEED_LOW:
382   - return snprintf(buf, PAGE_SIZE, "low-speed\n");
383   - case USB_SPEED_FULL:
384   - return snprintf(buf, PAGE_SIZE, "full-speed\n");
385   - case USB_SPEED_HIGH:
386   - return snprintf(buf, PAGE_SIZE, "high-speed\n");
387   - case USB_SPEED_WIRELESS:
388   - return snprintf(buf, PAGE_SIZE, "wireless\n");
389   - case USB_SPEED_SUPER:
390   - return snprintf(buf, PAGE_SIZE, "super-speed\n");
391   - case USB_SPEED_UNKNOWN: /* FALLTHROUGH */
392   - default:
393   - return snprintf(buf, PAGE_SIZE, "UNKNOWN\n");
394   - }
  378 + return snprintf(buf, PAGE_SIZE, "%s\n",
  379 + usb_speed_string(udc->gadget->speed));
395 380 }
396 381 static DEVICE_ATTR(speed, S_IRUSR, usb_udc_speed_show, NULL);
397 382  
drivers/usb/misc/usbtest.c
... ... @@ -2300,25 +2300,8 @@
2300 2300  
2301 2301 usb_set_intfdata(intf, dev);
2302 2302 dev_info(&intf->dev, "%s\n", info->name);
2303   - dev_info(&intf->dev, "%s speed {control%s%s%s%s%s} tests%s\n",
2304   - ({ char *tmp;
2305   - switch (udev->speed) {
2306   - case USB_SPEED_LOW:
2307   - tmp = "low";
2308   - break;
2309   - case USB_SPEED_FULL:
2310   - tmp = "full";
2311   - break;
2312   - case USB_SPEED_HIGH:
2313   - tmp = "high";
2314   - break;
2315   - case USB_SPEED_SUPER:
2316   - tmp = "super";
2317   - break;
2318   - default:
2319   - tmp = "unknown";
2320   - break;
2321   - }; tmp; }),
  2303 + dev_info(&intf->dev, "%s {control%s%s%s%s%s} tests%s\n",
  2304 + usb_speed_string(udev->speed),
2322 2305 info->ctrl_out ? " in/out" : "",
2323 2306 rtest, wtest,
2324 2307 irtest, iwtest,
drivers/usb/usb-common.c
  1 +/*
  2 + * Provides code common for host and device side USB.
  3 + *
  4 + * This program is free software; you can redistribute it and/or
  5 + * modify it under the terms of the GNU General Public License as
  6 + * published by the Free Software Foundation, version 2.
  7 + *
  8 + * If either host side (ie. CONFIG_USB=y) or device side USB stack
  9 + * (ie. CONFIG_USB_GADGET=y) is compiled in the kernel, this module is
  10 + * compiled-in as well. Otherwise, if either of the two stacks is
  11 + * compiled as module, this file is compiled as module as well.
  12 + */
  13 +
  14 +#include <linux/kernel.h>
  15 +#include <linux/module.h>
  16 +#include <linux/usb/ch9.h>
  17 +
  18 +const char *usb_speed_string(enum usb_device_speed speed)
  19 +{
  20 + static const char *const names[] = {
  21 + [USB_SPEED_UNKNOWN] = "UNKNOWN",
  22 + [USB_SPEED_LOW] = "low-speed",
  23 + [USB_SPEED_FULL] = "full-speed",
  24 + [USB_SPEED_HIGH] = "high-speed",
  25 + [USB_SPEED_WIRELESS] = "wireless",
  26 + [USB_SPEED_SUPER] = "super-speed",
  27 + };
  28 +
  29 + if (speed < 0 || speed >= ARRAY_SIZE(names))
  30 + speed = USB_SPEED_UNKNOWN;
  31 + return names[speed];
  32 +}
  33 +EXPORT_SYMBOL_GPL(usb_speed_string);
  34 +
  35 +MODULE_LICENSE("GPL");
include/linux/usb/ch9.h
... ... @@ -868,6 +868,18 @@
868 868 USB_SPEED_SUPER, /* usb 3.0 */
869 869 };
870 870  
  871 +#ifdef __KERNEL__
  872 +
  873 +/**
  874 + * usb_speed_string() - Returns human readable-name of the speed.
  875 + * @speed: The speed to return human-readable name for. If it's not
  876 + * any of the speeds defined in usb_device_speed enum, string for
  877 + * USB_SPEED_UNKNOWN will be returned.
  878 + */
  879 +extern const char *usb_speed_string(enum usb_device_speed speed);
  880 +
  881 +#endif
  882 +
871 883 enum usb_device_state {
872 884 /* NOTATTACHED isn't in the USB spec, and this state acts
873 885 * the same as ATTACHED ... but it's clearer this way.