]> git.sur5r.net Git - u-boot/blobdiff - drivers/usb/gadget/ether.c
USB-CDC: correct wrong alignment in ether.c
[u-boot] / drivers / usb / gadget / ether.c
index 5b2f6dd00784a37aa6b4e6fa9263c815d986cc10..9fc6a369c31ef904232d15057abf322d9e2836e9 100644 (file)
@@ -677,7 +677,7 @@ static struct usb_gadget_strings    stringtab = {
 
 /*============================================================================*/
 static u8 control_req[USB_BUFSIZ];
-static u8 status_req[STATUS_BYTECOUNT];
+static u8 status_req[STATUS_BYTECOUNT] __attribute__ ((aligned(4)));
 
 
 
@@ -801,7 +801,7 @@ done:
 
        /* on error, disable any endpoints  */
        if (result < 0) {
-               if (!subset_active(dev))
+               if (!subset_active(dev) && dev->status_ep)
                        (void) usb_ep_disable (dev->status_ep);
                dev->status = NULL;
                (void) usb_ep_disable (dev->in_ep);
@@ -836,7 +836,7 @@ static void eth_reset_config (struct eth_dev *dev)
        if (dev->out) {
                usb_ep_disable (dev->out_ep);
                if (dev->rx_req) {
-                       usb_ep_free_request (dev->in_ep, dev->rx_req);
+                       usb_ep_free_request (dev->out_ep, dev->rx_req);
                        dev->rx_req=NULL;
                }
        }
@@ -1421,6 +1421,11 @@ static void eth_unbind (struct usb_gadget *gadget)
 
        debug("%s...\n", __func__);
 
+       /* we've already been disconnected ... no i/o is active */
+       if (dev->req) {
+               usb_ep_free_request (gadget->ep0, dev->req);
+               dev->req = NULL;
+       }
        if (dev->stat_req) {
                usb_ep_free_request (dev->status_ep, dev->stat_req);
                dev->stat_req = NULL;
@@ -1432,7 +1437,7 @@ static void eth_unbind (struct usb_gadget *gadget)
        }
 
        if (dev->rx_req) {
-               usb_ep_free_request (dev->in_ep, dev->rx_req);
+               usb_ep_free_request (dev->out_ep, dev->rx_req);
                dev->rx_req=NULL;
        }
 
@@ -1583,12 +1588,12 @@ static int eth_bind(struct usb_gadget *gadget)
        if (bcdDevice)
                device_desc.bcdDevice = cpu_to_le16(bcdDevice);
        if (iManufacturer)
-               strcpy (manufacturer, iManufacturer);
+               strlcpy (manufacturer, iManufacturer, sizeof manufacturer);
        if (iProduct)
-               strcpy (product_desc, iProduct);
+               strlcpy (product_desc, iProduct, sizeof product_desc);
        if (iSerialNumber) {
                device_desc.iSerialNumber = STRING_SERIALNUMBER,
-               strcpy(serial_number, iSerialNumber);
+               strlcpy(serial_number, iSerialNumber, sizeof serial_number);
        }
 
        /* all we really need is bulk IN/OUT */
@@ -1721,14 +1726,13 @@ autoconf_fail:
        /* ... and maybe likewise for status transfer */
 #if defined(DEV_CONFIG_CDC)
        if (dev->status_ep) {
-               dev->stat_req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL);
-               dev->stat_req->buf = status_req;
+               dev->stat_req = usb_ep_alloc_request(dev->status_ep, GFP_KERNEL);
                if (!dev->stat_req) {
-                       dev->stat_req->buf=NULL;
-                       usb_ep_free_request (gadget->ep0, dev->req);
+                       usb_ep_free_request (dev->status_ep, dev->req);
 
                        goto fail;
                }
+               dev->stat_req->buf = status_req;
                dev->stat_req->context = NULL;
        }
 #endif