USB: simplify the interface of usb_get_status()
authorAlan Stern <stern@rowland.harvard.edu>
Tue, 30 Jul 2013 19:35:40 +0000 (15:35 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Aug 2013 00:29:02 +0000 (17:29 -0700)
This patch simplifies the interface presented by usb_get_status().
Instead of forcing callers to check for the proper data length and
convert the status value to host byte order, the function will now
do these things itself.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/hub.c
drivers/usb/core/message.c
drivers/usb/misc/usbtest.c

index c881830af55f08cc9ba521fed6e9c5e3cb92e5ff..11a92198bfc76ff8f8e887952aa2478b98d2302a 100644 (file)
@@ -1464,11 +1464,10 @@ static int hub_configure(struct usb_hub *hub,
         * and battery-powered root hubs (may provide just 8 mA).
         */
        ret = usb_get_status(hdev, USB_RECIP_DEVICE, 0, &hubstatus);
-       if (ret < 2) {
+       if (ret) {
                message = "can't get hub status";
                goto fail;
        }
-       le16_to_cpus(&hubstatus);
        hcd = bus_to_hcd(hdev->bus);
        if (hdev == hdev->bus->root_hub) {
                if (hcd->power_budget > 0)
@@ -3101,8 +3100,6 @@ static int finish_port_resume(struct usb_device *udev)
        if (status == 0) {
                devstatus = 0;
                status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
-               if (status >= 0)
-                       status = (status > 0 ? 0 : -ENODEV);
 
                /* If a normal resume failed, try doing a reset-resume */
                if (status && !udev->reset_resume && udev->persist_enabled) {
@@ -3123,7 +3120,6 @@ static int finish_port_resume(struct usb_device *udev)
         */
        } else if (udev->actconfig && !udev->reset_resume) {
                if (!hub_is_superspeed(udev->parent)) {
-                       le16_to_cpus(&devstatus);
                        if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP))
                                status = usb_control_msg(udev,
                                                usb_sndctrlpipe(udev, 0),
@@ -3135,7 +3131,6 @@ static int finish_port_resume(struct usb_device *udev)
                } else {
                        status = usb_get_status(udev, USB_RECIP_INTERFACE, 0,
                                        &devstatus);
-                       le16_to_cpus(&devstatus);
                        if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP
                                        | USB_INTRF_STAT_FUNC_RW))
                                status =
@@ -4481,11 +4476,10 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
 
                        status = usb_get_status(udev, USB_RECIP_DEVICE, 0,
                                        &devstat);
-                       if (status < 2) {
+                       if (status) {
                                dev_dbg(&udev->dev, "get status %d ?\n", status);
                                goto loop_disable;
                        }
-                       le16_to_cpus(&devstat);
                        if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
                                dev_err(&udev->dev,
                                        "can't connect bus-powered hub "
index e7ee1e451660a4c9a29cee88dc9c97f3aec534c0..6549a975b0c5e7afc63a55d76e838fefa6d14489 100644 (file)
@@ -934,13 +934,13 @@ int usb_get_device_descriptor(struct usb_device *dev, unsigned int size)
  *
  * This call is synchronous, and may not be used in an interrupt context.
  *
- * Returns the number of bytes received on success, or else the status code
- * returned by the underlying usb_control_msg() call.
+ * Returns 0 and the status value in *@data (in host byte order) on success,
+ * or else the status code from the underlying usb_control_msg() call.
  */
 int usb_get_status(struct usb_device *dev, int type, int target, void *data)
 {
        int ret;
-       u16 *status = kmalloc(sizeof(*status), GFP_KERNEL);
+       __le16 *status = kmalloc(sizeof(*status), GFP_KERNEL);
 
        if (!status)
                return -ENOMEM;
@@ -949,7 +949,12 @@ int usb_get_status(struct usb_device *dev, int type, int target, void *data)
                USB_REQ_GET_STATUS, USB_DIR_IN | type, 0, target, status,
                sizeof(*status), USB_CTRL_GET_TIMEOUT);
 
-       *(u16 *)data = *status;
+       if (ret == 2) {
+               *(u16 *) data = le16_to_cpu(*status);
+               ret = 0;
+       } else if (ret >= 0) {
+               ret = -EIO;
+       }
        kfree(status);
        return ret;
 }
index 8b4ca1cb450aacce4dffaf67b0ca650b0cfa2544..aa28ac8c7607deeb49136340f0def4dd5f6fa05d 100644 (file)
@@ -747,9 +747,9 @@ static int ch9_postconfig(struct usbtest_dev *dev)
 
        /* [9.4.5] get_status always works */
        retval = usb_get_status(udev, USB_RECIP_DEVICE, 0, dev->buf);
-       if (retval != 2) {
+       if (retval) {
                dev_err(&iface->dev, "get dev status --> %d\n", retval);
-               return (retval < 0) ? retval : -EDOM;
+               return retval;
        }
 
        /* FIXME configuration.bmAttributes says if we could try to set/clear
@@ -758,9 +758,9 @@ static int ch9_postconfig(struct usbtest_dev *dev)
 
        retval = usb_get_status(udev, USB_RECIP_INTERFACE,
                        iface->altsetting[0].desc.bInterfaceNumber, dev->buf);
-       if (retval != 2) {
+       if (retval) {
                dev_err(&iface->dev, "get interface status --> %d\n", retval);
-               return (retval < 0) ? retval : -EDOM;
+               return retval;
        }
        /* FIXME get status for each endpoint in the interface */
 
@@ -1351,7 +1351,6 @@ static int verify_halted(struct usbtest_dev *tdev, int ep, struct urb *urb)
                                ep, retval);
                return retval;
        }
-       le16_to_cpus(&status);
        if (status != 1) {
                ERROR(tdev, "ep %02x bogus status: %04x != 1\n", ep, status);
                return -EINVAL;