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/printer.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/printer.c')
-rw-r--r-- | drivers/usb/gadget/printer.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 00e5f19c75ba..d5df8dd9d58e 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
@@ -1148,6 +1148,8 @@ printer_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
1148 | switch (wValue >> 8) { | 1148 | switch (wValue >> 8) { |
1149 | 1149 | ||
1150 | case USB_DT_DEVICE: | 1150 | case USB_DT_DEVICE: |
1151 | device_desc.bMaxPacketSize0 = | ||
1152 | gadget->ep0->maxpacket; | ||
1151 | value = min(wLength, (u16) sizeof device_desc); | 1153 | value = min(wLength, (u16) sizeof device_desc); |
1152 | memcpy(req->buf, &device_desc, value); | 1154 | memcpy(req->buf, &device_desc, value); |
1153 | break; | 1155 | break; |
@@ -1155,6 +1157,12 @@ printer_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
1155 | case USB_DT_DEVICE_QUALIFIER: | 1157 | case USB_DT_DEVICE_QUALIFIER: |
1156 | if (!gadget->is_dualspeed) | 1158 | if (!gadget->is_dualspeed) |
1157 | break; | 1159 | break; |
1160 | /* | ||
1161 | * assumes ep0 uses the same value for both | ||
1162 | * speeds | ||
1163 | */ | ||
1164 | dev_qualifier.bMaxPacketSize0 = | ||
1165 | gadget->ep0->maxpacket; | ||
1158 | value = min(wLength, | 1166 | value = min(wLength, |
1159 | (u16) sizeof dev_qualifier); | 1167 | (u16) sizeof dev_qualifier); |
1160 | memcpy(req->buf, &dev_qualifier, value); | 1168 | memcpy(req->buf, &dev_qualifier, value); |
@@ -1450,15 +1458,11 @@ autoconf_fail: | |||
1450 | out_ep->driver_data = out_ep; /* claim */ | 1458 | out_ep->driver_data = out_ep; /* claim */ |
1451 | 1459 | ||
1452 | #ifdef CONFIG_USB_GADGET_DUALSPEED | 1460 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
1453 | /* assumes ep0 uses the same value for both speeds ... */ | 1461 | /* assumes that all endpoints are dual-speed */ |
1454 | dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0; | ||
1455 | |||
1456 | /* and that all endpoints are dual-speed */ | ||
1457 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; | 1462 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; |
1458 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; | 1463 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; |
1459 | #endif /* DUALSPEED */ | 1464 | #endif /* DUALSPEED */ |
1460 | 1465 | ||
1461 | device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; | ||
1462 | usb_gadget_set_selfpowered(gadget); | 1466 | usb_gadget_set_selfpowered(gadget); |
1463 | 1467 | ||
1464 | if (gadget->is_otg) { | 1468 | if (gadget->is_otg) { |