Commit e538dfda authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Greg Kroah-Hartman

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: default avatarMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c58a76cd
...@@ -12,6 +12,11 @@ menuconfig USB_SUPPORT ...@@ -12,6 +12,11 @@ menuconfig USB_SUPPORT
if USB_SUPPORT if USB_SUPPORT
config USB_COMMON
tristate
default y
depends on USB || USB_GADGET
# Host-side USB depends on having a host controller # Host-side USB depends on having a host controller
# NOTE: dummy_hcd is always an option, but it's ignored here ... # NOTE: dummy_hcd is always an option, but it's ignored here ...
# NOTE: SL-811 option should be board-specific ... # NOTE: SL-811 option should be board-specific ...
......
...@@ -53,3 +53,5 @@ obj-$(CONFIG_USB_MUSB_HDRC) += musb/ ...@@ -53,3 +53,5 @@ obj-$(CONFIG_USB_MUSB_HDRC) += musb/
obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/ obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/
obj-$(CONFIG_USB_OTG_UTILS) += otg/ obj-$(CONFIG_USB_OTG_UTILS) += otg/
obj-$(CONFIG_USB_GADGET) += gadget/ obj-$(CONFIG_USB_GADGET) += gadget/
obj-$(CONFIG_USB_COMMON) += usb-common.o
...@@ -2793,7 +2793,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, ...@@ -2793,7 +2793,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
int i, j, retval; int i, j, retval;
unsigned delay = HUB_SHORT_RESET_TIME; unsigned delay = HUB_SHORT_RESET_TIME;
enum usb_device_speed oldspeed = udev->speed; enum usb_device_speed oldspeed = udev->speed;
char *speed, *type; const char *speed;
int devnum = udev->devnum; int devnum = udev->devnum;
/* root hub ports have a slightly longer reset period /* root hub ports have a slightly longer reset period
...@@ -2854,24 +2854,15 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, ...@@ -2854,24 +2854,15 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
goto fail; goto fail;
} }
type = ""; if (udev->speed == USB_SPEED_WIRELESS)
switch (udev->speed) { speed = "variable speed Wireless";
case USB_SPEED_LOW: speed = "low"; break; else
case USB_SPEED_FULL: speed = "full"; break; speed = usb_speed_string(udev->speed);
case USB_SPEED_HIGH: speed = "high"; break;
case USB_SPEED_SUPER:
speed = "super";
break;
case USB_SPEED_WIRELESS:
speed = "variable";
type = "Wireless ";
break;
default: speed = "?"; break;
}
if (udev->speed != USB_SPEED_SUPER) if (udev->speed != USB_SPEED_SUPER)
dev_info(&udev->dev, dev_info(&udev->dev,
"%s %s speed %sUSB device number %d using %s\n", "%s %s USB device number %d using %s\n",
(udev->config) ? "reset" : "new", speed, type, (udev->config) ? "reset" : "new", speed,
devnum, udev->bus->controller->driver->name); devnum, udev->bus->controller->driver->name);
/* Set up TT records, if needed */ /* Set up TT records, if needed */
......
...@@ -3005,13 +3005,8 @@ __acquires(dev->lock) ...@@ -3005,13 +3005,8 @@ __acquires(dev->lock)
/* link up all endpoints */ /* link up all endpoints */
udc_setup_endpoints(dev); udc_setup_endpoints(dev);
if (dev->gadget.speed == USB_SPEED_HIGH) { dev_info(&dev->pdev->dev, "Connect: %s\n",
dev_info(&dev->pdev->dev, "Connect: speed = %s\n", usb_speed_string(dev->gadget.speed));
"high");
} else if (dev->gadget.speed == USB_SPEED_FULL) {
dev_info(&dev->pdev->dev, "Connect: speed = %s\n",
"full");
}
/* init ep 0 */ /* init ep 0 */
activate_control_endpoints(dev); activate_control_endpoints(dev);
......
...@@ -1718,13 +1718,12 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) ...@@ -1718,13 +1718,12 @@ static irqreturn_t usba_udc_irq(int irq, void *devid)
spin_lock(&udc->lock); spin_lock(&udc->lock);
} }
if (status & USBA_HIGH_SPEED) { if (status & USBA_HIGH_SPEED)
DBG(DBG_BUS, "High-speed bus reset detected\n");
udc->gadget.speed = USB_SPEED_HIGH; udc->gadget.speed = USB_SPEED_HIGH;
} else { else
DBG(DBG_BUS, "Full-speed bus reset detected\n");
udc->gadget.speed = USB_SPEED_FULL; udc->gadget.speed = USB_SPEED_FULL;
} DBG(DBG_BUS, "%s bus reset detected\n",
usb_speed_string(udc->gadget.speed));
ep0 = &usba_ep[0]; ep0 = &usba_ep[0];
ep0->desc = &usba_ep0_desc; ep0->desc = &usba_ep0_desc;
......
...@@ -617,25 +617,9 @@ static int set_config(struct usb_composite_dev *cdev, ...@@ -617,25 +617,9 @@ static int set_config(struct usb_composite_dev *cdev,
result = 0; result = 0;
} }
INFO(cdev, "%s speed config #%d: %s\n", INFO(cdev, "%s config #%d: %s\n",
({ char *speed; usb_speed_string(gadget->speed),
switch (gadget->speed) { number, c ? c->label : "unconfigured");
case USB_SPEED_LOW:
speed = "low";
break;
case USB_SPEED_FULL:
speed = "full";
break;
case USB_SPEED_HIGH:
speed = "high";
break;
case USB_SPEED_SUPER:
speed = "super";
break;
default:
speed = "?";
break;
} ; speed; }), number, c ? c->label : "unconfigured");
if (!c) if (!c)
goto done; goto done;
......
...@@ -2862,17 +2862,10 @@ static int do_set_config(struct fsg_dev *fsg, u8 new_config) ...@@ -2862,17 +2862,10 @@ static int do_set_config(struct fsg_dev *fsg, u8 new_config)
fsg->config = new_config; fsg->config = new_config;
if ((rc = do_set_interface(fsg, 0)) != 0) if ((rc = do_set_interface(fsg, 0)) != 0)
fsg->config = 0; // Reset on errors fsg->config = 0; // Reset on errors
else { else
char *speed; INFO(fsg, "%s config #%d\n",
usb_speed_string(fsg->gadget->speed),
switch (fsg->gadget->speed) { fsg->config);
case USB_SPEED_LOW: speed = "low"; break;
case USB_SPEED_FULL: speed = "full"; break;
case USB_SPEED_HIGH: speed = "high"; break;
default: speed = "?"; break;
}
INFO(fsg, "%s speed config #%d\n", speed, fsg->config);
}
} }
return rc; return rc;
} }
......
...@@ -1715,34 +1715,31 @@ static void dtd_complete_irq(struct fsl_udc *udc) ...@@ -1715,34 +1715,31 @@ static void dtd_complete_irq(struct fsl_udc *udc)
} }
} }
static inline enum usb_device_speed portscx_device_speed(u32 reg)
{
switch (speed & PORTSCX_PORT_SPEED_MASK) {
case PORTSCX_PORT_SPEED_HIGH:
return USB_SPEED_HIGH;
case PORTSCX_PORT_SPEED_FULL:
return USB_SPEED_FULL;
case PORTSCX_PORT_SPEED_LOW:
return USB_SPEED_LOW;
default:
return USB_SPEED_UNKNOWN;
}
}
/* Process a port change interrupt */ /* Process a port change interrupt */
static void port_change_irq(struct fsl_udc *udc) static void port_change_irq(struct fsl_udc *udc)
{ {
u32 speed;
if (udc->bus_reset) if (udc->bus_reset)
udc->bus_reset = 0; udc->bus_reset = 0;
/* Bus resetting is finished */ /* Bus resetting is finished */
if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) { if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET))
/* Get the speed */ /* Get the speed */
speed = (fsl_readl(&dr_regs->portsc1) udc->gadget.speed =
& PORTSCX_PORT_SPEED_MASK); portscx_device_speed(fsl_readl(&dr_regs->portsc1));
switch (speed) {
case PORTSCX_PORT_SPEED_HIGH:
udc->gadget.speed = USB_SPEED_HIGH;
break;
case PORTSCX_PORT_SPEED_FULL:
udc->gadget.speed = USB_SPEED_FULL;
break;
case PORTSCX_PORT_SPEED_LOW:
udc->gadget.speed = USB_SPEED_LOW;
break;
default:
udc->gadget.speed = USB_SPEED_UNKNOWN;
break;
}
}
/* Update USB state */ /* Update USB state */
if (!udc->resume_state) if (!udc->resume_state)
...@@ -2167,20 +2164,8 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count, ...@@ -2167,20 +2164,8 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
default: default:
s = "None"; break; s = "None"; break;
} }
s;} ), ( { s;} ),
char *s; usb_speed_string(portscx_device_speed(tmp_reg)),
switch (tmp_reg & PORTSCX_PORT_SPEED_UNDEF) {
case PORTSCX_PORT_SPEED_FULL:
s = "Full Speed"; break;
case PORTSCX_PORT_SPEED_LOW:
s = "Low Speed"; break;
case PORTSCX_PORT_SPEED_HIGH:
s = "High Speed"; break;
default:
s = "Undefined"; break;
}
s;
} ),
(tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ? (tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ?
"Normal PHY mode" : "Low power mode", "Normal PHY mode" : "Low power mode",
(tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" : (tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" :
......
...@@ -640,17 +640,8 @@ gmidi_set_config(struct gmidi_device *dev, unsigned number, gfp_t gfp_flags) ...@@ -640,17 +640,8 @@ gmidi_set_config(struct gmidi_device *dev, unsigned number, gfp_t gfp_flags)
if (result) { if (result) {
gmidi_reset_config(dev); gmidi_reset_config(dev);
} else { } else {
char *speed;
switch (gadget->speed) {
case USB_SPEED_LOW: speed = "low"; break;
case USB_SPEED_FULL: speed = "full"; break;
case USB_SPEED_HIGH: speed = "high"; break;
default: speed = "?"; break;
}
dev->config = number; dev->config = number;
INFO(dev, "%s speed\n", speed); INFO(dev, "%s speed\n", usb_speed_string(gadget->speed));
} }
return result; return result;
} }
......
...@@ -1690,20 +1690,7 @@ static ssize_t show_langwell_udc(struct device *_dev, ...@@ -1690,20 +1690,7 @@ static ssize_t show_langwell_udc(struct device *_dev,
"BmAttributes: %d\n\n", "BmAttributes: %d\n\n",
LPM_PTS(tmp_reg), LPM_PTS(tmp_reg),
(tmp_reg & LPM_STS) ? 1 : 0, (tmp_reg & LPM_STS) ? 1 : 0,
({ usb_speed_string(lpm_device_speed(tmp_reg)),
char *s;
switch (LPM_PSPD(tmp_reg)) {
case LPM_SPEED_FULL:
s = "Full Speed"; break;
case LPM_SPEED_LOW:
s = "Low Speed"; break;
case LPM_SPEED_HIGH:
s = "High Speed"; break;
default:
s = "Unknown Speed"; break;
}
s;
}),
(tmp_reg & LPM_PFSC) ? "Force Full Speed" : "Not Force", (tmp_reg & LPM_PFSC) ? "Force Full Speed" : "Not Force",
(tmp_reg & LPM_PHCD) ? "Disabled" : "Enabled", (tmp_reg & LPM_PHCD) ? "Disabled" : "Enabled",
LPM_BA(tmp_reg)); LPM_BA(tmp_reg));
...@@ -2647,12 +2634,24 @@ static void handle_trans_complete(struct langwell_udc *dev) ...@@ -2647,12 +2634,24 @@ static void handle_trans_complete(struct langwell_udc *dev)
dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__);
} }
static inline enum usb_device_speed lpm_device_speed(u32 reg)
{
switch (LPM_PSPD(reg)) {
case LPM_SPEED_HIGH:
return USB_SPEED_HIGH;
case LPM_SPEED_FULL:
return USB_SPEED_FULL;
case LPM_SPEED_LOW:
return USB_SPEED_LOW;
default:
return USB_SPEED_UNKNOWN;
}
}
/* port change detect interrupt handler */ /* port change detect interrupt handler */
static void handle_port_change(struct langwell_udc *dev) static void handle_port_change(struct langwell_udc *dev)
{ {
u32 portsc1, devlc; u32 portsc1, devlc;
u32 speed;
dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__); dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__);
...@@ -2667,24 +2666,9 @@ static void handle_port_change(struct langwell_udc *dev) ...@@ -2667,24 +2666,9 @@ static void handle_port_change(struct langwell_udc *dev)
/* bus reset is finished */ /* bus reset is finished */
if (!(portsc1 & PORTS_PR)) { if (!(portsc1 & PORTS_PR)) {
/* get the speed */ /* get the speed */
speed = LPM_PSPD(devlc); dev->gadget.speed = lpm_device_speed(devlc);
switch (speed) { dev_vdbg(&dev->pdev->dev, "dev->gadget.speed = %d\n",
case LPM_SPEED_HIGH: dev->gadget.speed);
dev->gadget.speed = USB_SPEED_HIGH;
break;
case LPM_SPEED_FULL:
dev->gadget.speed = USB_SPEED_FULL;
break;
case LPM_SPEED_LOW:
dev->gadget.speed = USB_SPEED_LOW;
break;
default:
dev->gadget.speed = USB_SPEED_UNKNOWN;
break;
}
dev_vdbg(&dev->pdev->dev,
"speed = %d, dev->gadget.speed = %d\n",
speed, dev->gadget.speed);
} }
/* LPM L0 to L1 */ /* LPM L0 to L1 */
......
...@@ -1764,8 +1764,8 @@ net2272_handle_stat0_irqs(struct net2272 *dev, u8 stat) ...@@ -1764,8 +1764,8 @@ net2272_handle_stat0_irqs(struct net2272 *dev, u8 stat)
dev->gadget.speed = USB_SPEED_HIGH; dev->gadget.speed = USB_SPEED_HIGH;
else else
dev->gadget.speed = USB_SPEED_FULL; dev->gadget.speed = USB_SPEED_FULL;
dev_dbg(dev->dev, "%s speed\n", dev_dbg(dev->dev, "%s\n",
(dev->gadget.speed == USB_SPEED_HIGH) ? "high" : "full"); usb_speed_string(dev->gadget.speed));
} }
ep = &dev->ep[0]; ep = &dev->ep[0];
......
...@@ -2257,9 +2257,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) ...@@ -2257,9 +2257,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat)
else else
dev->gadget.speed = USB_SPEED_FULL; dev->gadget.speed = USB_SPEED_FULL;
net2280_led_speed (dev, dev->gadget.speed); net2280_led_speed (dev, dev->gadget.speed);
DEBUG (dev, "%s speed\n", DEBUG(dev, "%s\n", usb_speed_string(dev->gadget.speed));
(dev->gadget.speed == USB_SPEED_HIGH)
? "high" : "full");
} }
ep = &dev->ep [0]; ep = &dev->ep [0];
......
...@@ -962,23 +962,15 @@ printer_set_config(struct printer_dev *dev, unsigned number) ...@@ -962,23 +962,15 @@ printer_set_config(struct printer_dev *dev, unsigned number)
usb_gadget_vbus_draw(dev->gadget, usb_gadget_vbus_draw(dev->gadget,
dev->gadget->is_otg ? 8 : 100); dev->gadget->is_otg ? 8 : 100);
} else { } else {
char *speed;
unsigned power; unsigned power;
power = 2 * config_desc.bMaxPower; power = 2 * config_desc.bMaxPower;
usb_gadget_vbus_draw(dev->gadget, power); usb_gadget_vbus_draw(dev->gadget, power);
switch (gadget->speed) {
case USB_SPEED_FULL: speed = "full"; break;
#ifdef CONFIG_USB_GADGET_DUALSPEED
case USB_SPEED_HIGH: speed = "high"; break;
#endif
default: speed = "?"; break;
}
dev->config = number; dev->config = number;
INFO(dev, "%s speed config #%d: %d mA, %s\n", INFO(dev, "%s config #%d: %d mA, %s\n",
speed, number, power, driver_desc); usb_speed_string(gadget->speed),
number, power, driver_desc);
} }
return result; return result;
} }
......
...@@ -1951,30 +1951,26 @@ static void s3c_hsotg_irq_enumdone(struct s3c_hsotg *hsotg) ...@@ -1951,30 +1951,26 @@ static void s3c_hsotg_irq_enumdone(struct s3c_hsotg *hsotg)
case S3C_DSTS_EnumSpd_FS: case S3C_DSTS_EnumSpd_FS:
case S3C_DSTS_EnumSpd_FS48: case S3C_DSTS_EnumSpd_FS48:
hsotg->gadget.speed = USB_SPEED_FULL; hsotg->gadget.speed = USB_SPEED_FULL;
dev_info(hsotg->dev, "new device is full-speed\n");
ep0_mps = EP0_MPS_LIMIT; ep0_mps = EP0_MPS_LIMIT;
ep_mps = 64; ep_mps = 64;
break; break;
case S3C_DSTS_EnumSpd_HS: case S3C_DSTS_EnumSpd_HS:
dev_info(hsotg->dev, "new device is high-speed\n");
hsotg->gadget.speed = USB_SPEED_HIGH; hsotg->gadget.speed = USB_SPEED_HIGH;
ep0_mps = EP0_MPS_LIMIT; ep0_mps = EP0_MPS_LIMIT;
ep_mps = 512; ep_mps = 512;
break; break;
case S3C_DSTS_EnumSpd_LS: case S3C_DSTS_EnumSpd_LS:
hsotg->gadget.speed = USB_SPEED_LOW; hsotg->gadget.speed = USB_SPEED_LOW;
dev_info(hsotg->dev, "new device is low-speed\n");
/* note, we don't actually support LS in this driver at the /* note, we don't actually support LS in this driver at the
* moment, and the documentation seems to imply that it isn't * moment, and the documentation seems to imply that it isn't
* supported by the PHYs on some of the devices. * supported by the PHYs on some of the devices.
*/ */
break; break;
} }
dev_info(hsotg->dev, "new device is %s\n",
usb_speed_string(hsotg->gadget.speed));
/* we should now know the maximum packet size for an /* we should now know the maximum packet size for an
* endpoint, so set the endpoints to a default value. */ * endpoint, so set the endpoints to a default value. */
......
...@@ -375,23 +375,8 @@ static ssize_t usb_udc_speed_show(struct device *dev, ...@@ -375,23 +375,8 @@ static ssize_t usb_udc_speed_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct usb_udc *udc = container_of(dev, struct usb_udc, dev); struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
struct usb_gadget *gadget = udc->gadget; return snprintf(buf, PAGE_SIZE, "%s\n",
usb_speed_string(udc->gadget->speed));
switch (gadget->speed) {
case USB_SPEED_LOW:
return snprintf(buf, PAGE_SIZE, "low-speed\n");
case USB_SPEED_FULL:
return snprintf(buf, PAGE_SIZE, "full-speed\n");
case USB_SPEED_HIGH:
return snprintf(buf, PAGE_SIZE, "high-speed\n");
case USB_SPEED_WIRELESS:
return snprintf(buf, PAGE_SIZE, "wireless\n");
case USB_SPEED_SUPER:
return snprintf(buf, PAGE_SIZE, "super-speed\n");
case USB_SPEED_UNKNOWN: /* FALLTHROUGH */
default:
return snprintf(buf, PAGE_SIZE, "UNKNOWN\n");
}
} }
static DEVICE_ATTR(speed, S_IRUSR, usb_udc_speed_show, NULL); static DEVICE_ATTR(speed, S_IRUSR, usb_udc_speed_show, NULL);
......
...@@ -2300,25 +2300,8 @@ usbtest_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -2300,25 +2300,8 @@ usbtest_probe(struct usb_interface *intf, const struct usb_device_id *id)
usb_set_intfdata(intf, dev); usb_set_intfdata(intf, dev);
dev_info(&intf->dev, "%s\n", info->name); dev_info(&intf->dev, "%s\n", info->name);
dev_info(&intf->dev, "%s speed {control%s%s%s%s%s} tests%s\n", dev_info(&intf->dev, "%s {control%s%s%s%s%s} tests%s\n",
({ char *tmp; usb_speed_string(udev->speed),
switch (udev->speed) {
case USB_SPEED_LOW:
tmp = "low";
break;
case USB_SPEED_FULL:
tmp = "full";
break;
case USB_SPEED_HIGH:
tmp = "high";
break;
case USB_SPEED_SUPER:
tmp = "super";
break;
default:
tmp = "unknown";
break;
}; tmp; }),
info->ctrl_out ? " in/out" : "", info->ctrl_out ? " in/out" : "",
rtest, wtest, rtest, wtest,
irtest, iwtest, irtest, iwtest,
......
/*
* Provides code common for host and device side USB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, version 2.
*
* If either host side (ie. CONFIG_USB=y) or device side USB stack
* (ie. CONFIG_USB_GADGET=y) is compiled in the kernel, this module is
* compiled-in as well. Otherwise, if either of the two stacks is
* compiled as module, this file is compiled as module as well.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/usb/ch9.h>
const char *usb_speed_string(enum usb_device_speed speed)
{
static const char *const names[] = {
[USB_SPEED_UNKNOWN] = "UNKNOWN",
[USB_SPEED_LOW] = "low-speed",
[USB_SPEED_FULL] = "full-speed",
[USB_SPEED_HIGH] = "high-speed",
[USB_SPEED_WIRELESS] = "wireless",
[USB_SPEED_SUPER] = "super-speed",
};
if (speed < 0 || speed >= ARRAY_SIZE(names))
speed = USB_SPEED_UNKNOWN;
return names[speed];
}
EXPORT_SYMBOL_GPL(usb_speed_string);
MODULE_LICENSE("GPL");
...@@ -868,6 +868,18 @@ enum usb_device_speed { ...@@ -868,6 +868,18 @@ enum usb_device_speed {
USB_SPEED_SUPER, /* usb 3.0 */ USB_SPEED_SUPER, /* usb 3.0 */
}; };
#ifdef __KERNEL__
/**
* usb_speed_string() - Returns human readable-name of the speed.
* @speed: The speed to return human-readable name for. If it's not
* any of the speeds defined in usb_device_speed enum, string for
* USB_SPEED_UNKNOWN will be returned.
*/
extern const char *usb_speed_string(enum usb_device_speed speed);
#endif
enum usb_device_state { enum usb_device_state {
/* NOTATTACHED isn't in the USB spec, and this state acts /* NOTATTACHED isn't in the USB spec, and this state acts
* the same as ATTACHED ... but it's clearer this way. * the same as ATTACHED ... but it's clearer this way.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment