aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/inode.c
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2011-06-23 08:26:11 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-07-01 17:31:12 -0400
commit765f5b830e547229bb752e7b232ee83e2b3d49d5 (patch)
treeffa37920a165fd3a964b7e0f333f6509d3e59de3 /drivers/usb/gadget/inode.c
parent193ab2a6070039e7ee2b9b9bebea754a7c52fd1b (diff)
usb: gadget: defer setting maxpacket till ->setup()
maxpacket is set by the udc driver for ep0 very early. This value is copied by the function gadget used later for the USB_DT_DEVICE and USB_DT_DEVICE_QUALIFIER query. This seems to work fine so far. For USB3 we need set a different value here. In SS speed it is 2^x with x=9 and in HS we set something <= 64. If the UDC starts in SS and continues in HS after the cable has been plugged it will report a too small value. There setting of this value is defered and taken automaticly from the ep0 pointer where the UDC driver can update it according to the speed it detected _after_ a cable has been plugged. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/gadget/inode.c')
-rw-r--r--drivers/usb/gadget/inode.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
index a9a455692397..1b240990448f 100644
--- a/drivers/usb/gadget/inode.c
+++ b/drivers/usb/gadget/inode.c
@@ -1347,7 +1347,7 @@ static void make_qualifier (struct dev_data *dev)
1347 qual.bDeviceProtocol = desc->bDeviceProtocol; 1347 qual.bDeviceProtocol = desc->bDeviceProtocol;
1348 1348
1349 /* assumes ep0 uses the same value for both speeds ... */ 1349 /* assumes ep0 uses the same value for both speeds ... */
1350 qual.bMaxPacketSize0 = desc->bMaxPacketSize0; 1350 qual.bMaxPacketSize0 = dev->gadget->ep0->maxpacket;
1351 1351
1352 qual.bNumConfigurations = 1; 1352 qual.bNumConfigurations = 1;
1353 qual.bRESERVED = 0; 1353 qual.bRESERVED = 0;
@@ -1404,7 +1404,6 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
1404 } 1404 }
1405 1405
1406 dev->state = STATE_DEV_CONNECTED; 1406 dev->state = STATE_DEV_CONNECTED;
1407 dev->dev->bMaxPacketSize0 = gadget->ep0->maxpacket;
1408 1407
1409 INFO (dev, "connected\n"); 1408 INFO (dev, "connected\n");
1410 event = next_event (dev, GADGETFS_CONNECT); 1409 event = next_event (dev, GADGETFS_CONNECT);
@@ -1432,6 +1431,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
1432 1431
1433 case USB_DT_DEVICE: 1432 case USB_DT_DEVICE:
1434 value = min (w_length, (u16) sizeof *dev->dev); 1433 value = min (w_length, (u16) sizeof *dev->dev);
1434 dev->dev->bMaxPacketSize0 = dev->gadget->ep0->maxpacket;
1435 req->buf = dev->dev; 1435 req->buf = dev->dev;
1436 break; 1436 break;
1437#ifdef CONFIG_USB_GADGET_DUALSPEED 1437#ifdef CONFIG_USB_GADGET_DUALSPEED
@@ -1712,7 +1712,6 @@ gadgetfs_bind (struct usb_gadget *gadget)
1712 set_gadget_data (gadget, dev); 1712 set_gadget_data (gadget, dev);
1713 dev->gadget = gadget; 1713 dev->gadget = gadget;
1714 gadget->ep0->driver_data = dev; 1714 gadget->ep0->driver_data = dev;
1715 dev->dev->bMaxPacketSize0 = gadget->ep0->maxpacket;
1716 1715
1717 /* preallocate control response and buffer */ 1716 /* preallocate control response and buffer */
1718 dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL); 1717 dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL);