diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2011-06-23 08:26:11 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-07-01 17:31:12 -0400 |
commit | 765f5b830e547229bb752e7b232ee83e2b3d49d5 (patch) | |
tree | ffa37920a165fd3a964b7e0f333f6509d3e59de3 /drivers/usb/gadget/inode.c | |
parent | 193ab2a6070039e7ee2b9b9bebea754a7c52fd1b (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.c | 5 |
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); |