Re: [PATCHv3 1/4] usb: Provide usb_device_speed_name() function

From: Felipe Balbi
Date: Fri Aug 19 2011 - 19:15:21 EST


Hi,

On Sat, Aug 20, 2011 at 12:32:59AM +0200, Michal Nazarewicz wrote:
> From: Michal Nazarewicz <mina86@xxxxxxxxxx>
>
> In a few places kernel wants to print a human-readable USB
> device speed name (eg. "high") instead of a raw number
> (eg. 3). Usually a switch is introduced in those places
> leading to code repetition. To mitigate this issue, this
> commit introduces usb_device_speed_name() function, which
> returns a human-readable name of provided speed.
>
> Signed-off-by: Michal Nazarewicz <mina86@xxxxxxxxxx>
> ---
> drivers/usb/Makefile | 3 +++
> drivers/usb/common.c | 24 ++++++++++++++++++++++++
> drivers/usb/gadget/udc-core.c | 19 ++-----------------
> include/linux/usb/ch9.h | 8 ++++++++
> 4 files changed, 37 insertions(+), 17 deletions(-)
> create mode 100644 drivers/usb/common.c
>
> diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile
> index 30ddf8d..a3167cc 100644
> --- a/drivers/usb/Makefile
> +++ b/drivers/usb/Makefile
> @@ -51,3 +51,6 @@ obj-$(CONFIG_USB_MUSB_HDRC) += musb/
> obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/
> obj-$(CONFIG_USB_OTG_UTILS) += otg/
> obj-$(CONFIG_USB_GADGET) += gadget/
> +
> +obj-$(CONFIG_USB) += common.o
> +obj-$(CONFIG_USB_GADGET) += common.o
> diff --git a/drivers/usb/common.c b/drivers/usb/common.c
> new file mode 100644
> index 0000000..e9d7141
> --- /dev/null
> +++ b/drivers/usb/common.c
> @@ -0,0 +1,24 @@
> +/*
> + * Provides code common for host and device side USB.
> + */
> +
> +#include <linux/kernel.h> /* for ARRAY_SIZE() */
> +#include <linux/module.h> /* for EXPORT_SYMBOL_GPL() */
> +#include <linux/usb/ch9.h>
> +
> +const char *usb_device_speed_name(enum usb_device_speed speed)

somehow usb_speed_string() sounds better to me.

> +{
> + static const char *const names[] = {
> + "UNKNOWN",
> + "low-speed",
> + "full-speed",
> + "high-speed",
> + "wireless",
> + "super-speed",
> + };
> +
> + if (speed < 0 || speed >= ARRAY_SIZE(names))
> + speed = USB_SPEED_UNKNOWN;

I generally dislike depending on a particular ordering of enumerations.
While's it's highly unlikely that anyone will change that, if someone
does change, then it'll take a long time to actually find the bug on the
print here :-)

I woud rather use a switch in this case.

> diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
> index 05ba472..e1ecdbc 100644
> --- a/drivers/usb/gadget/udc-core.c
> +++ b/drivers/usb/gadget/udc-core.c
> @@ -375,23 +375,8 @@ static ssize_t usb_udc_speed_show(struct device *dev,
> struct device_attribute *attr, char *buf)
> {
> struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
> - struct usb_gadget *gadget = udc->gadget;
> -
> - 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");
> - }
> + return snprintf(buf, PAGE_SIZE, "%s\n",
> + usb_device_speed_name(udc->gadget->speed));
> }
> static DEVICE_ATTR(speed, S_IRUSR, usb_udc_speed_show, NULL);

you said 'several locations', but there's only one ? No other driver is
using something similar ?

--
balbi

Attachment: signature.asc
Description: Digital signature