diff options
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/config.c | 1 | ||||
-rw-r--r-- | drivers/usb/core/hcd.c | 16 | ||||
-rw-r--r-- | drivers/usb/core/hcd.h | 1 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 11 | ||||
-rw-r--r-- | drivers/usb/core/urb.c | 6 |
5 files changed, 31 insertions, 4 deletions
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 568244c99bdc..e9426acf5682 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
@@ -92,6 +92,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, | |||
92 | if (usb_endpoint_xfer_int(d)) { | 92 | if (usb_endpoint_xfer_int(d)) { |
93 | i = 1; | 93 | i = 1; |
94 | switch (to_usb_device(ddev)->speed) { | 94 | switch (to_usb_device(ddev)->speed) { |
95 | case USB_SPEED_SUPER: | ||
95 | case USB_SPEED_HIGH: | 96 | case USB_SPEED_HIGH: |
96 | /* Many device manufacturers are using full-speed | 97 | /* Many device manufacturers are using full-speed |
97 | * bInterval values in high-speed interrupt endpoint | 98 | * bInterval values in high-speed interrupt endpoint |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index c65d95604028..120bb56c4b84 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1870,8 +1870,20 @@ int usb_add_hcd(struct usb_hcd *hcd, | |||
1870 | retval = -ENOMEM; | 1870 | retval = -ENOMEM; |
1871 | goto err_allocate_root_hub; | 1871 | goto err_allocate_root_hub; |
1872 | } | 1872 | } |
1873 | rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH : | 1873 | |
1874 | USB_SPEED_FULL; | 1874 | switch (hcd->driver->flags & HCD_MASK) { |
1875 | case HCD_USB11: | ||
1876 | rhdev->speed = USB_SPEED_FULL; | ||
1877 | break; | ||
1878 | case HCD_USB2: | ||
1879 | rhdev->speed = USB_SPEED_HIGH; | ||
1880 | break; | ||
1881 | case HCD_USB3: | ||
1882 | rhdev->speed = USB_SPEED_SUPER; | ||
1883 | break; | ||
1884 | default: | ||
1885 | goto err_allocate_root_hub; | ||
1886 | } | ||
1875 | hcd->self.root_hub = rhdev; | 1887 | hcd->self.root_hub = rhdev; |
1876 | 1888 | ||
1877 | /* wakeup flag init defaults to "everything works" for root hubs, | 1889 | /* wakeup flag init defaults to "everything works" for root hubs, |
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index 7a47498b0aac..4f6ee60d97c6 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h | |||
@@ -174,6 +174,7 @@ struct hc_driver { | |||
174 | #define HCD_USB11 0x0010 /* USB 1.1 */ | 174 | #define HCD_USB11 0x0010 /* USB 1.1 */ |
175 | #define HCD_USB2 0x0020 /* USB 2.0 */ | 175 | #define HCD_USB2 0x0020 /* USB 2.0 */ |
176 | #define HCD_USB3 0x0040 /* USB 3.0 */ | 176 | #define HCD_USB3 0x0040 /* USB 3.0 */ |
177 | #define HCD_MASK 0x0070 | ||
177 | 178 | ||
178 | /* called to init HCD and root hub */ | 179 | /* called to init HCD and root hub */ |
179 | int (*reset) (struct usb_hcd *hcd); | 180 | int (*reset) (struct usb_hcd *hcd); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index c7a1a1d4bcb1..fa0208e0da6a 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -2471,6 +2471,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
2471 | * reported as 0xff in the device descriptor). WUSB1.0[4.8.1]. | 2471 | * reported as 0xff in the device descriptor). WUSB1.0[4.8.1]. |
2472 | */ | 2472 | */ |
2473 | switch (udev->speed) { | 2473 | switch (udev->speed) { |
2474 | case USB_SPEED_SUPER: | ||
2474 | case USB_SPEED_VARIABLE: /* fixed at 512 */ | 2475 | case USB_SPEED_VARIABLE: /* fixed at 512 */ |
2475 | udev->ep0.desc.wMaxPacketSize = cpu_to_le16(512); | 2476 | udev->ep0.desc.wMaxPacketSize = cpu_to_le16(512); |
2476 | break; | 2477 | break; |
@@ -2496,6 +2497,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
2496 | case USB_SPEED_LOW: speed = "low"; break; | 2497 | case USB_SPEED_LOW: speed = "low"; break; |
2497 | case USB_SPEED_FULL: speed = "full"; break; | 2498 | case USB_SPEED_FULL: speed = "full"; break; |
2498 | case USB_SPEED_HIGH: speed = "high"; break; | 2499 | case USB_SPEED_HIGH: speed = "high"; break; |
2500 | case USB_SPEED_SUPER: | ||
2501 | speed = "super"; | ||
2502 | break; | ||
2499 | case USB_SPEED_VARIABLE: | 2503 | case USB_SPEED_VARIABLE: |
2500 | speed = "variable"; | 2504 | speed = "variable"; |
2501 | type = "Wireless "; | 2505 | type = "Wireless "; |
@@ -2634,8 +2638,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
2634 | if (retval) | 2638 | if (retval) |
2635 | goto fail; | 2639 | goto fail; |
2636 | 2640 | ||
2637 | i = udev->descriptor.bMaxPacketSize0 == 0xff? /* wusb device? */ | 2641 | if (udev->descriptor.bMaxPacketSize0 == 0xff || |
2638 | 512 : udev->descriptor.bMaxPacketSize0; | 2642 | udev->speed == USB_SPEED_SUPER) |
2643 | i = 512; | ||
2644 | else | ||
2645 | i = udev->descriptor.bMaxPacketSize0; | ||
2639 | if (le16_to_cpu(udev->ep0.desc.wMaxPacketSize) != i) { | 2646 | if (le16_to_cpu(udev->ep0.desc.wMaxPacketSize) != i) { |
2640 | if (udev->speed != USB_SPEED_FULL || | 2647 | if (udev->speed != USB_SPEED_FULL || |
2641 | !(i == 8 || i == 16 || i == 32 || i == 64)) { | 2648 | !(i == 8 || i == 16 || i == 32 || i == 64)) { |
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 3376055f36e7..02eb0ef7a4c3 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -351,6 +351,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) | |||
351 | if (xfertype == USB_ENDPOINT_XFER_ISOC) { | 351 | if (xfertype == USB_ENDPOINT_XFER_ISOC) { |
352 | int n, len; | 352 | int n, len; |
353 | 353 | ||
354 | /* FIXME SuperSpeed isoc endpoints have up to 16 bursts */ | ||
354 | /* "high bandwidth" mode, 1-3 packets/uframe? */ | 355 | /* "high bandwidth" mode, 1-3 packets/uframe? */ |
355 | if (dev->speed == USB_SPEED_HIGH) { | 356 | if (dev->speed == USB_SPEED_HIGH) { |
356 | int mult = 1 + ((max >> 11) & 0x03); | 357 | int mult = 1 + ((max >> 11) & 0x03); |
@@ -426,6 +427,11 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) | |||
426 | return -EINVAL; | 427 | return -EINVAL; |
427 | /* too big? */ | 428 | /* too big? */ |
428 | switch (dev->speed) { | 429 | switch (dev->speed) { |
430 | case USB_SPEED_SUPER: /* units are 125us */ | ||
431 | /* Handle up to 2^(16-1) microframes */ | ||
432 | if (urb->interval > (1 << 15)) | ||
433 | return -EINVAL; | ||
434 | max = 1 << 15; | ||
429 | case USB_SPEED_HIGH: /* units are microframes */ | 435 | case USB_SPEED_HIGH: /* units are microframes */ |
430 | /* NOTE usb handles 2^15 */ | 436 | /* NOTE usb handles 2^15 */ |
431 | if (urb->interval > (1024 * 8)) | 437 | if (urb->interval > (1024 * 8)) |