diff options
author | Dave Airlie <airlied@redhat.com> | 2015-08-17 00:13:53 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-08-17 00:13:53 -0400 |
commit | 4eebf60b7452fbd551fd7dece855ba7825a49cbc (patch) | |
tree | 490b4d194ba09c90e10201ab7fc084a0bda0ed27 /drivers/usb | |
parent | 8f9cb50789e76f3e224e8861adf650e55c747af4 (diff) | |
parent | 2c6625cd545bdd66acff14f3394865d43920a5c7 (diff) |
Merge tag 'v4.2-rc7' into drm-next
Linux 4.2-rc7
Backmerge master for i915 fixes
Diffstat (limited to 'drivers/usb')
27 files changed, 172 insertions, 38 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 74fea4fa41b1..3ad48e1c0c57 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -1024,7 +1024,18 @@ static struct platform_driver ci_hdrc_driver = { | |||
1024 | }, | 1024 | }, |
1025 | }; | 1025 | }; |
1026 | 1026 | ||
1027 | module_platform_driver(ci_hdrc_driver); | 1027 | static int __init ci_hdrc_platform_register(void) |
1028 | { | ||
1029 | ci_hdrc_host_driver_init(); | ||
1030 | return platform_driver_register(&ci_hdrc_driver); | ||
1031 | } | ||
1032 | module_init(ci_hdrc_platform_register); | ||
1033 | |||
1034 | static void __exit ci_hdrc_platform_unregister(void) | ||
1035 | { | ||
1036 | platform_driver_unregister(&ci_hdrc_driver); | ||
1037 | } | ||
1038 | module_exit(ci_hdrc_platform_unregister); | ||
1028 | 1039 | ||
1029 | MODULE_ALIAS("platform:ci_hdrc"); | 1040 | MODULE_ALIAS("platform:ci_hdrc"); |
1030 | MODULE_LICENSE("GPL v2"); | 1041 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index 6cf87b8b13a8..7161439def19 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c | |||
@@ -249,9 +249,12 @@ int ci_hdrc_host_init(struct ci_hdrc *ci) | |||
249 | rdrv->name = "host"; | 249 | rdrv->name = "host"; |
250 | ci->roles[CI_ROLE_HOST] = rdrv; | 250 | ci->roles[CI_ROLE_HOST] = rdrv; |
251 | 251 | ||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | void ci_hdrc_host_driver_init(void) | ||
256 | { | ||
252 | ehci_init_driver(&ci_ehci_hc_driver, &ehci_ci_overrides); | 257 | ehci_init_driver(&ci_ehci_hc_driver, &ehci_ci_overrides); |
253 | orig_bus_suspend = ci_ehci_hc_driver.bus_suspend; | 258 | orig_bus_suspend = ci_ehci_hc_driver.bus_suspend; |
254 | ci_ehci_hc_driver.bus_suspend = ci_ehci_bus_suspend; | 259 | ci_ehci_hc_driver.bus_suspend = ci_ehci_bus_suspend; |
255 | |||
256 | return 0; | ||
257 | } | 260 | } |
diff --git a/drivers/usb/chipidea/host.h b/drivers/usb/chipidea/host.h index 5707bf379bfb..0f12f131bdd3 100644 --- a/drivers/usb/chipidea/host.h +++ b/drivers/usb/chipidea/host.h | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | int ci_hdrc_host_init(struct ci_hdrc *ci); | 6 | int ci_hdrc_host_init(struct ci_hdrc *ci); |
7 | void ci_hdrc_host_destroy(struct ci_hdrc *ci); | 7 | void ci_hdrc_host_destroy(struct ci_hdrc *ci); |
8 | void ci_hdrc_host_driver_init(void); | ||
8 | 9 | ||
9 | #else | 10 | #else |
10 | 11 | ||
@@ -18,6 +19,11 @@ static inline void ci_hdrc_host_destroy(struct ci_hdrc *ci) | |||
18 | 19 | ||
19 | } | 20 | } |
20 | 21 | ||
22 | static void ci_hdrc_host_driver_init(void) | ||
23 | { | ||
24 | |||
25 | } | ||
26 | |||
21 | #endif | 27 | #endif |
22 | 28 | ||
23 | #endif /* __DRIVERS_USB_CHIPIDEA_HOST_H */ | 29 | #endif /* __DRIVERS_USB_CHIPIDEA_HOST_H */ |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 519a77ba214c..b30e7423549b 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -1944,6 +1944,7 @@ static void __exit acm_exit(void) | |||
1944 | usb_deregister(&acm_driver); | 1944 | usb_deregister(&acm_driver); |
1945 | tty_unregister_driver(acm_tty_driver); | 1945 | tty_unregister_driver(acm_tty_driver); |
1946 | put_tty_driver(acm_tty_driver); | 1946 | put_tty_driver(acm_tty_driver); |
1947 | idr_destroy(&acm_minors); | ||
1947 | } | 1948 | } |
1948 | 1949 | ||
1949 | module_init(acm_init); | 1950 | module_init(acm_init); |
diff --git a/drivers/usb/common/ulpi.c b/drivers/usb/common/ulpi.c index 0e6f968e93fe..01c0c0477a9e 100644 --- a/drivers/usb/common/ulpi.c +++ b/drivers/usb/common/ulpi.c | |||
@@ -242,7 +242,7 @@ static int __init ulpi_init(void) | |||
242 | { | 242 | { |
243 | return bus_register(&ulpi_bus); | 243 | return bus_register(&ulpi_bus); |
244 | } | 244 | } |
245 | module_init(ulpi_init); | 245 | subsys_initcall(ulpi_init); |
246 | 246 | ||
247 | static void __exit ulpi_exit(void) | 247 | static void __exit ulpi_exit(void) |
248 | { | 248 | { |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index be5b2074f906..cbcd0920fb51 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1022,9 +1022,12 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
1022 | dev_name(&usb_dev->dev), retval); | 1022 | dev_name(&usb_dev->dev), retval); |
1023 | return (retval < 0) ? retval : -EMSGSIZE; | 1023 | return (retval < 0) ? retval : -EMSGSIZE; |
1024 | } | 1024 | } |
1025 | if (usb_dev->speed == USB_SPEED_SUPER) { | 1025 | |
1026 | if (le16_to_cpu(usb_dev->descriptor.bcdUSB) >= 0x0201) { | ||
1026 | retval = usb_get_bos_descriptor(usb_dev); | 1027 | retval = usb_get_bos_descriptor(usb_dev); |
1027 | if (retval < 0) { | 1028 | if (!retval) { |
1029 | usb_dev->lpm_capable = usb_device_supports_lpm(usb_dev); | ||
1030 | } else if (usb_dev->speed == USB_SPEED_SUPER) { | ||
1028 | mutex_unlock(&usb_bus_list_lock); | 1031 | mutex_unlock(&usb_bus_list_lock); |
1029 | dev_dbg(parent_dev, "can't read %s bos descriptor %d\n", | 1032 | dev_dbg(parent_dev, "can't read %s bos descriptor %d\n", |
1030 | dev_name(&usb_dev->dev), retval); | 1033 | dev_name(&usb_dev->dev), retval); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 43cb2f2e3b43..73dfa194160b 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -122,7 +122,7 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev) | |||
122 | return usb_get_intfdata(hdev->actconfig->interface[0]); | 122 | return usb_get_intfdata(hdev->actconfig->interface[0]); |
123 | } | 123 | } |
124 | 124 | ||
125 | static int usb_device_supports_lpm(struct usb_device *udev) | 125 | int usb_device_supports_lpm(struct usb_device *udev) |
126 | { | 126 | { |
127 | /* USB 2.1 (and greater) devices indicate LPM support through | 127 | /* USB 2.1 (and greater) devices indicate LPM support through |
128 | * their USB 2.0 Extended Capabilities BOS descriptor. | 128 | * their USB 2.0 Extended Capabilities BOS descriptor. |
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 7eb1e26798e5..457255a3306a 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
@@ -65,6 +65,7 @@ extern int usb_hub_init(void); | |||
65 | extern void usb_hub_cleanup(void); | 65 | extern void usb_hub_cleanup(void); |
66 | extern int usb_major_init(void); | 66 | extern int usb_major_init(void); |
67 | extern void usb_major_cleanup(void); | 67 | extern void usb_major_cleanup(void); |
68 | extern int usb_device_supports_lpm(struct usb_device *udev); | ||
68 | 69 | ||
69 | #ifdef CONFIG_PM | 70 | #ifdef CONFIG_PM |
70 | 71 | ||
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 2ef3c8d6a9db..69e769c35cf5 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
@@ -727,6 +727,10 @@ static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) | |||
727 | dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ISOCH_DELAY"); | 727 | dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ISOCH_DELAY"); |
728 | ret = dwc3_ep0_set_isoch_delay(dwc, ctrl); | 728 | ret = dwc3_ep0_set_isoch_delay(dwc, ctrl); |
729 | break; | 729 | break; |
730 | case USB_REQ_SET_INTERFACE: | ||
731 | dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_INTERFACE"); | ||
732 | dwc->start_config_issued = false; | ||
733 | /* Fall through */ | ||
730 | default: | 734 | default: |
731 | dwc3_trace(trace_dwc3_ep0, "Forwarding to gadget driver"); | 735 | dwc3_trace(trace_dwc3_ep0, "Forwarding to gadget driver"); |
732 | ret = dwc3_ep0_delegate_req(dwc, ctrl); | 736 | ret = dwc3_ep0_delegate_req(dwc, ctrl); |
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index f7f35a36c09a..6df9715a4bcd 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c | |||
@@ -699,6 +699,10 @@ static inline int hidg_get_minor(void) | |||
699 | int ret; | 699 | int ret; |
700 | 700 | ||
701 | ret = ida_simple_get(&hidg_ida, 0, 0, GFP_KERNEL); | 701 | ret = ida_simple_get(&hidg_ida, 0, 0, GFP_KERNEL); |
702 | if (ret >= HIDG_MINORS) { | ||
703 | ida_simple_remove(&hidg_ida, ret); | ||
704 | ret = -ENODEV; | ||
705 | } | ||
702 | 706 | ||
703 | return ret; | 707 | return ret; |
704 | } | 708 | } |
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c index 44173df27273..357f63f47b42 100644 --- a/drivers/usb/gadget/function/f_printer.c +++ b/drivers/usb/gadget/function/f_printer.c | |||
@@ -1248,7 +1248,15 @@ static struct config_item_type printer_func_type = { | |||
1248 | 1248 | ||
1249 | static inline int gprinter_get_minor(void) | 1249 | static inline int gprinter_get_minor(void) |
1250 | { | 1250 | { |
1251 | return ida_simple_get(&printer_ida, 0, 0, GFP_KERNEL); | 1251 | int ret; |
1252 | |||
1253 | ret = ida_simple_get(&printer_ida, 0, 0, GFP_KERNEL); | ||
1254 | if (ret >= PRINTER_MINORS) { | ||
1255 | ida_simple_remove(&printer_ida, ret); | ||
1256 | ret = -ENODEV; | ||
1257 | } | ||
1258 | |||
1259 | return ret; | ||
1252 | } | 1260 | } |
1253 | 1261 | ||
1254 | static inline void gprinter_put_minor(int minor) | 1262 | static inline void gprinter_put_minor(int minor) |
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 6d3eb8b00a48..531861547253 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c | |||
@@ -1162,14 +1162,14 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) | |||
1162 | factor = 1000; | 1162 | factor = 1000; |
1163 | } else { | 1163 | } else { |
1164 | ep_desc = &hs_epin_desc; | 1164 | ep_desc = &hs_epin_desc; |
1165 | factor = 125; | 1165 | factor = 8000; |
1166 | } | 1166 | } |
1167 | 1167 | ||
1168 | /* pre-compute some values for iso_complete() */ | 1168 | /* pre-compute some values for iso_complete() */ |
1169 | uac2->p_framesize = opts->p_ssize * | 1169 | uac2->p_framesize = opts->p_ssize * |
1170 | num_channels(opts->p_chmask); | 1170 | num_channels(opts->p_chmask); |
1171 | rate = opts->p_srate * uac2->p_framesize; | 1171 | rate = opts->p_srate * uac2->p_framesize; |
1172 | uac2->p_interval = (1 << (ep_desc->bInterval - 1)) * factor; | 1172 | uac2->p_interval = factor / (1 << (ep_desc->bInterval - 1)); |
1173 | uac2->p_pktsize = min_t(unsigned int, rate / uac2->p_interval, | 1173 | uac2->p_pktsize = min_t(unsigned int, rate / uac2->p_interval, |
1174 | prm->max_psize); | 1174 | prm->max_psize); |
1175 | 1175 | ||
diff --git a/drivers/usb/gadget/udc/bdc/bdc_ep.c b/drivers/usb/gadget/udc/bdc/bdc_ep.c index b04980cf6dc4..1efa61265d8d 100644 --- a/drivers/usb/gadget/udc/bdc/bdc_ep.c +++ b/drivers/usb/gadget/udc/bdc/bdc_ep.c | |||
@@ -779,7 +779,7 @@ static int ep_dequeue(struct bdc_ep *ep, struct bdc_req *req) | |||
779 | /* The current hw dequeue pointer */ | 779 | /* The current hw dequeue pointer */ |
780 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS0(0)); | 780 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS0(0)); |
781 | deq_ptr_64 = tmp_32; | 781 | deq_ptr_64 = tmp_32; |
782 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS0(1)); | 782 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS1(0)); |
783 | deq_ptr_64 |= ((u64)tmp_32 << 32); | 783 | deq_ptr_64 |= ((u64)tmp_32 << 32); |
784 | 784 | ||
785 | /* we have the dma addr of next bd that will be fetched by hardware */ | 785 | /* we have the dma addr of next bd that will be fetched by hardware */ |
diff --git a/drivers/usb/gadget/udc/mv_udc_core.c b/drivers/usb/gadget/udc/mv_udc_core.c index d32160d6463f..5da37c957b53 100644 --- a/drivers/usb/gadget/udc/mv_udc_core.c +++ b/drivers/usb/gadget/udc/mv_udc_core.c | |||
@@ -2167,7 +2167,7 @@ static int mv_udc_probe(struct platform_device *pdev) | |||
2167 | return -ENODEV; | 2167 | return -ENODEV; |
2168 | } | 2168 | } |
2169 | 2169 | ||
2170 | udc->phy_regs = ioremap(r->start, resource_size(r)); | 2170 | udc->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r)); |
2171 | if (udc->phy_regs == NULL) { | 2171 | if (udc->phy_regs == NULL) { |
2172 | dev_err(&pdev->dev, "failed to map phy I/O memory\n"); | 2172 | dev_err(&pdev->dev, "failed to map phy I/O memory\n"); |
2173 | return -EBUSY; | 2173 | return -EBUSY; |
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c index d69c35558f68..89ed5e71a199 100644 --- a/drivers/usb/gadget/udc/udc-core.c +++ b/drivers/usb/gadget/udc/udc-core.c | |||
@@ -60,13 +60,15 @@ static DEFINE_MUTEX(udc_lock); | |||
60 | int usb_gadget_map_request(struct usb_gadget *gadget, | 60 | int usb_gadget_map_request(struct usb_gadget *gadget, |
61 | struct usb_request *req, int is_in) | 61 | struct usb_request *req, int is_in) |
62 | { | 62 | { |
63 | struct device *dev = gadget->dev.parent; | ||
64 | |||
63 | if (req->length == 0) | 65 | if (req->length == 0) |
64 | return 0; | 66 | return 0; |
65 | 67 | ||
66 | if (req->num_sgs) { | 68 | if (req->num_sgs) { |
67 | int mapped; | 69 | int mapped; |
68 | 70 | ||
69 | mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs, | 71 | mapped = dma_map_sg(dev, req->sg, req->num_sgs, |
70 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 72 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
71 | if (mapped == 0) { | 73 | if (mapped == 0) { |
72 | dev_err(&gadget->dev, "failed to map SGs\n"); | 74 | dev_err(&gadget->dev, "failed to map SGs\n"); |
@@ -75,11 +77,11 @@ int usb_gadget_map_request(struct usb_gadget *gadget, | |||
75 | 77 | ||
76 | req->num_mapped_sgs = mapped; | 78 | req->num_mapped_sgs = mapped; |
77 | } else { | 79 | } else { |
78 | req->dma = dma_map_single(&gadget->dev, req->buf, req->length, | 80 | req->dma = dma_map_single(dev, req->buf, req->length, |
79 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 81 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
80 | 82 | ||
81 | if (dma_mapping_error(&gadget->dev, req->dma)) { | 83 | if (dma_mapping_error(dev, req->dma)) { |
82 | dev_err(&gadget->dev, "failed to map buffer\n"); | 84 | dev_err(dev, "failed to map buffer\n"); |
83 | return -EFAULT; | 85 | return -EFAULT; |
84 | } | 86 | } |
85 | } | 87 | } |
@@ -95,12 +97,12 @@ void usb_gadget_unmap_request(struct usb_gadget *gadget, | |||
95 | return; | 97 | return; |
96 | 98 | ||
97 | if (req->num_mapped_sgs) { | 99 | if (req->num_mapped_sgs) { |
98 | dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs, | 100 | dma_unmap_sg(gadget->dev.parent, req->sg, req->num_mapped_sgs, |
99 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 101 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
100 | 102 | ||
101 | req->num_mapped_sgs = 0; | 103 | req->num_mapped_sgs = 0; |
102 | } else { | 104 | } else { |
103 | dma_unmap_single(&gadget->dev, req->dma, req->length, | 105 | dma_unmap_single(gadget->dev.parent, req->dma, req->length, |
104 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 106 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
105 | } | 107 | } |
106 | } | 108 | } |
@@ -321,6 +323,7 @@ err4: | |||
321 | 323 | ||
322 | err3: | 324 | err3: |
323 | put_device(&udc->dev); | 325 | put_device(&udc->dev); |
326 | device_del(&gadget->dev); | ||
324 | 327 | ||
325 | err2: | 328 | err2: |
326 | put_device(&gadget->dev); | 329 | put_device(&gadget->dev); |
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index f7d561ed3c23..d029bbe9eb36 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c | |||
@@ -981,10 +981,6 @@ rescan_all: | |||
981 | int completed, modified; | 981 | int completed, modified; |
982 | __hc32 *prev; | 982 | __hc32 *prev; |
983 | 983 | ||
984 | /* Is this ED already invisible to the hardware? */ | ||
985 | if (ed->state == ED_IDLE) | ||
986 | goto ed_idle; | ||
987 | |||
988 | /* only take off EDs that the HC isn't using, accounting for | 984 | /* only take off EDs that the HC isn't using, accounting for |
989 | * frame counter wraps and EDs with partially retired TDs | 985 | * frame counter wraps and EDs with partially retired TDs |
990 | */ | 986 | */ |
@@ -1012,12 +1008,10 @@ skip_ed: | |||
1012 | } | 1008 | } |
1013 | 1009 | ||
1014 | /* ED's now officially unlinked, hc doesn't see */ | 1010 | /* ED's now officially unlinked, hc doesn't see */ |
1015 | ed->state = ED_IDLE; | ||
1016 | ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_H); | 1011 | ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_H); |
1017 | ed->hwNextED = 0; | 1012 | ed->hwNextED = 0; |
1018 | wmb(); | 1013 | wmb(); |
1019 | ed->hwINFO &= ~cpu_to_hc32(ohci, ED_SKIP | ED_DEQUEUE); | 1014 | ed->hwINFO &= ~cpu_to_hc32(ohci, ED_SKIP | ED_DEQUEUE); |
1020 | ed_idle: | ||
1021 | 1015 | ||
1022 | /* reentrancy: if we drop the schedule lock, someone might | 1016 | /* reentrancy: if we drop the schedule lock, someone might |
1023 | * have modified this list. normally it's just prepending | 1017 | * have modified this list. normally it's just prepending |
@@ -1088,6 +1082,7 @@ rescan_this: | |||
1088 | if (list_empty(&ed->td_list)) { | 1082 | if (list_empty(&ed->td_list)) { |
1089 | *last = ed->ed_next; | 1083 | *last = ed->ed_next; |
1090 | ed->ed_next = NULL; | 1084 | ed->ed_next = NULL; |
1085 | ed->state = ED_IDLE; | ||
1091 | list_del(&ed->in_use_list); | 1086 | list_del(&ed->in_use_list); |
1092 | } else if (ohci->rh_state == OHCI_RH_RUNNING) { | 1087 | } else if (ohci->rh_state == OHCI_RH_RUNNING) { |
1093 | *last = ed->ed_next; | 1088 | *last = ed->ed_next; |
diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c index e9a6eec39142..cfcfadfc94fc 100644 --- a/drivers/usb/host/ohci-tmio.c +++ b/drivers/usb/host/ohci-tmio.c | |||
@@ -58,7 +58,7 @@ | |||
58 | #define CCR_PM_CKRNEN 0x0002 | 58 | #define CCR_PM_CKRNEN 0x0002 |
59 | #define CCR_PM_USBPW1 0x0004 | 59 | #define CCR_PM_USBPW1 0x0004 |
60 | #define CCR_PM_USBPW2 0x0008 | 60 | #define CCR_PM_USBPW2 0x0008 |
61 | #define CCR_PM_USBPW3 0x0008 | 61 | #define CCR_PM_USBPW3 0x0010 |
62 | #define CCR_PM_PMEE 0x0100 | 62 | #define CCR_PM_PMEE 0x0100 |
63 | #define CCR_PM_PMES 0x8000 | 63 | #define CCR_PM_PMES 0x8000 |
64 | 64 | ||
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index e75c565feb53..78241b5550df 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
@@ -484,10 +484,13 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci, | |||
484 | u32 pls = status_reg & PORT_PLS_MASK; | 484 | u32 pls = status_reg & PORT_PLS_MASK; |
485 | 485 | ||
486 | /* resume state is a xHCI internal state. | 486 | /* resume state is a xHCI internal state. |
487 | * Do not report it to usb core. | 487 | * Do not report it to usb core, instead, pretend to be U3, |
488 | * thus usb core knows it's not ready for transfer | ||
488 | */ | 489 | */ |
489 | if (pls == XDEV_RESUME) | 490 | if (pls == XDEV_RESUME) { |
491 | *status |= USB_SS_PORT_LS_U3; | ||
490 | return; | 492 | return; |
493 | } | ||
491 | 494 | ||
492 | /* When the CAS bit is set then warm reset | 495 | /* When the CAS bit is set then warm reset |
493 | * should be performed on port | 496 | * should be performed on port |
@@ -588,7 +591,14 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, | |||
588 | status |= USB_PORT_STAT_C_RESET << 16; | 591 | status |= USB_PORT_STAT_C_RESET << 16; |
589 | /* USB3.0 only */ | 592 | /* USB3.0 only */ |
590 | if (hcd->speed == HCD_USB3) { | 593 | if (hcd->speed == HCD_USB3) { |
591 | if ((raw_port_status & PORT_PLC)) | 594 | /* Port link change with port in resume state should not be |
595 | * reported to usbcore, as this is an internal state to be | ||
596 | * handled by xhci driver. Reporting PLC to usbcore may | ||
597 | * cause usbcore clearing PLC first and port change event | ||
598 | * irq won't be generated. | ||
599 | */ | ||
600 | if ((raw_port_status & PORT_PLC) && | ||
601 | (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME) | ||
592 | status |= USB_PORT_STAT_C_LINK_STATE << 16; | 602 | status |= USB_PORT_STAT_C_LINK_STATE << 16; |
593 | if ((raw_port_status & PORT_WRC)) | 603 | if ((raw_port_status & PORT_WRC)) |
594 | status |= USB_PORT_STAT_C_BH_RESET << 16; | 604 | status |= USB_PORT_STAT_C_BH_RESET << 16; |
@@ -1120,10 +1130,10 @@ int xhci_bus_suspend(struct usb_hcd *hcd) | |||
1120 | spin_lock_irqsave(&xhci->lock, flags); | 1130 | spin_lock_irqsave(&xhci->lock, flags); |
1121 | 1131 | ||
1122 | if (hcd->self.root_hub->do_remote_wakeup) { | 1132 | if (hcd->self.root_hub->do_remote_wakeup) { |
1123 | if (bus_state->resuming_ports) { | 1133 | if (bus_state->resuming_ports || /* USB2 */ |
1134 | bus_state->port_remote_wakeup) { /* USB3 */ | ||
1124 | spin_unlock_irqrestore(&xhci->lock, flags); | 1135 | spin_unlock_irqrestore(&xhci->lock, flags); |
1125 | xhci_dbg(xhci, "suspend failed because " | 1136 | xhci_dbg(xhci, "suspend failed because a port is resuming\n"); |
1126 | "a port is resuming\n"); | ||
1127 | return -EBUSY; | 1137 | return -EBUSY; |
1128 | } | 1138 | } |
1129 | } | 1139 | } |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index f8336408ef07..9a8c936cd42c 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -1427,10 +1427,10 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
1427 | /* Attempt to use the ring cache */ | 1427 | /* Attempt to use the ring cache */ |
1428 | if (virt_dev->num_rings_cached == 0) | 1428 | if (virt_dev->num_rings_cached == 0) |
1429 | return -ENOMEM; | 1429 | return -ENOMEM; |
1430 | virt_dev->num_rings_cached--; | ||
1430 | virt_dev->eps[ep_index].new_ring = | 1431 | virt_dev->eps[ep_index].new_ring = |
1431 | virt_dev->ring_cache[virt_dev->num_rings_cached]; | 1432 | virt_dev->ring_cache[virt_dev->num_rings_cached]; |
1432 | virt_dev->ring_cache[virt_dev->num_rings_cached] = NULL; | 1433 | virt_dev->ring_cache[virt_dev->num_rings_cached] = NULL; |
1433 | virt_dev->num_rings_cached--; | ||
1434 | xhci_reinit_cached_ring(xhci, virt_dev->eps[ep_index].new_ring, | 1434 | xhci_reinit_cached_ring(xhci, virt_dev->eps[ep_index].new_ring, |
1435 | 1, type); | 1435 | 1, type); |
1436 | } | 1436 | } |
@@ -1792,7 +1792,8 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
1792 | int size; | 1792 | int size; |
1793 | int i, j, num_ports; | 1793 | int i, j, num_ports; |
1794 | 1794 | ||
1795 | del_timer_sync(&xhci->cmd_timer); | 1795 | if (timer_pending(&xhci->cmd_timer)) |
1796 | del_timer_sync(&xhci->cmd_timer); | ||
1796 | 1797 | ||
1797 | /* Free the Event Ring Segment Table and the actual Event Ring */ | 1798 | /* Free the Event Ring Segment Table and the actual Event Ring */ |
1798 | size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); | 1799 | size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 4a4cb1d91ac8..5590eac2b22d 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -23,10 +23,15 @@ | |||
23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/acpi.h> | ||
26 | 27 | ||
27 | #include "xhci.h" | 28 | #include "xhci.h" |
28 | #include "xhci-trace.h" | 29 | #include "xhci-trace.h" |
29 | 30 | ||
31 | #define PORT2_SSIC_CONFIG_REG2 0x883c | ||
32 | #define PROG_DONE (1 << 30) | ||
33 | #define SSIC_PORT_UNUSED (1 << 31) | ||
34 | |||
30 | /* Device for a quirk */ | 35 | /* Device for a quirk */ |
31 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 | 36 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
32 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 | 37 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
@@ -176,20 +181,63 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
176 | } | 181 | } |
177 | 182 | ||
178 | /* | 183 | /* |
184 | * In some Intel xHCI controllers, in order to get D3 working, | ||
185 | * through a vendor specific SSIC CONFIG register at offset 0x883c, | ||
186 | * SSIC PORT need to be marked as "unused" before putting xHCI | ||
187 | * into D3. After D3 exit, the SSIC port need to be marked as "used". | ||
188 | * Without this change, xHCI might not enter D3 state. | ||
179 | * Make sure PME works on some Intel xHCI controllers by writing 1 to clear | 189 | * Make sure PME works on some Intel xHCI controllers by writing 1 to clear |
180 | * the Internal PME flag bit in vendor specific PMCTRL register at offset 0x80a4 | 190 | * the Internal PME flag bit in vendor specific PMCTRL register at offset 0x80a4 |
181 | */ | 191 | */ |
182 | static void xhci_pme_quirk(struct xhci_hcd *xhci) | 192 | static void xhci_pme_quirk(struct usb_hcd *hcd, bool suspend) |
183 | { | 193 | { |
194 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
195 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | ||
184 | u32 val; | 196 | u32 val; |
185 | void __iomem *reg; | 197 | void __iomem *reg; |
186 | 198 | ||
199 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
200 | pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI) { | ||
201 | |||
202 | reg = (void __iomem *) xhci->cap_regs + PORT2_SSIC_CONFIG_REG2; | ||
203 | |||
204 | /* Notify SSIC that SSIC profile programming is not done */ | ||
205 | val = readl(reg) & ~PROG_DONE; | ||
206 | writel(val, reg); | ||
207 | |||
208 | /* Mark SSIC port as unused(suspend) or used(resume) */ | ||
209 | val = readl(reg); | ||
210 | if (suspend) | ||
211 | val |= SSIC_PORT_UNUSED; | ||
212 | else | ||
213 | val &= ~SSIC_PORT_UNUSED; | ||
214 | writel(val, reg); | ||
215 | |||
216 | /* Notify SSIC that SSIC profile programming is done */ | ||
217 | val = readl(reg) | PROG_DONE; | ||
218 | writel(val, reg); | ||
219 | readl(reg); | ||
220 | } | ||
221 | |||
187 | reg = (void __iomem *) xhci->cap_regs + 0x80a4; | 222 | reg = (void __iomem *) xhci->cap_regs + 0x80a4; |
188 | val = readl(reg); | 223 | val = readl(reg); |
189 | writel(val | BIT(28), reg); | 224 | writel(val | BIT(28), reg); |
190 | readl(reg); | 225 | readl(reg); |
191 | } | 226 | } |
192 | 227 | ||
228 | #ifdef CONFIG_ACPI | ||
229 | static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) | ||
230 | { | ||
231 | static const u8 intel_dsm_uuid[] = { | ||
232 | 0xb7, 0x0c, 0x34, 0xac, 0x01, 0xe9, 0xbf, 0x45, | ||
233 | 0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23, | ||
234 | }; | ||
235 | acpi_evaluate_dsm(ACPI_HANDLE(&dev->dev), intel_dsm_uuid, 3, 1, NULL); | ||
236 | } | ||
237 | #else | ||
238 | static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { } | ||
239 | #endif /* CONFIG_ACPI */ | ||
240 | |||
193 | /* called during probe() after chip reset completes */ | 241 | /* called during probe() after chip reset completes */ |
194 | static int xhci_pci_setup(struct usb_hcd *hcd) | 242 | static int xhci_pci_setup(struct usb_hcd *hcd) |
195 | { | 243 | { |
@@ -263,6 +311,9 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
263 | HCC_MAX_PSA(xhci->hcc_params) >= 4) | 311 | HCC_MAX_PSA(xhci->hcc_params) >= 4) |
264 | xhci->shared_hcd->can_do_streams = 1; | 312 | xhci->shared_hcd->can_do_streams = 1; |
265 | 313 | ||
314 | if (xhci->quirks & XHCI_PME_STUCK_QUIRK) | ||
315 | xhci_pme_acpi_rtd3_enable(dev); | ||
316 | |||
266 | /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ | 317 | /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ |
267 | pm_runtime_put_noidle(&dev->dev); | 318 | pm_runtime_put_noidle(&dev->dev); |
268 | 319 | ||
@@ -307,7 +358,7 @@ static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | |||
307 | pdev->no_d3cold = true; | 358 | pdev->no_d3cold = true; |
308 | 359 | ||
309 | if (xhci->quirks & XHCI_PME_STUCK_QUIRK) | 360 | if (xhci->quirks & XHCI_PME_STUCK_QUIRK) |
310 | xhci_pme_quirk(xhci); | 361 | xhci_pme_quirk(hcd, true); |
311 | 362 | ||
312 | return xhci_suspend(xhci, do_wakeup); | 363 | return xhci_suspend(xhci, do_wakeup); |
313 | } | 364 | } |
@@ -340,7 +391,7 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) | |||
340 | usb_enable_intel_xhci_ports(pdev); | 391 | usb_enable_intel_xhci_ports(pdev); |
341 | 392 | ||
342 | if (xhci->quirks & XHCI_PME_STUCK_QUIRK) | 393 | if (xhci->quirks & XHCI_PME_STUCK_QUIRK) |
343 | xhci_pme_quirk(xhci); | 394 | xhci_pme_quirk(hcd, false); |
344 | 395 | ||
345 | retval = xhci_resume(xhci, hibernated); | 396 | retval = xhci_resume(xhci, hibernated); |
346 | return retval; | 397 | return retval; |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 94416ff70810..32f4d564494a 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -82,7 +82,7 @@ dma_addr_t xhci_trb_virt_to_dma(struct xhci_segment *seg, | |||
82 | return 0; | 82 | return 0; |
83 | /* offset in TRBs */ | 83 | /* offset in TRBs */ |
84 | segment_offset = trb - seg->trbs; | 84 | segment_offset = trb - seg->trbs; |
85 | if (segment_offset > TRBS_PER_SEGMENT) | 85 | if (segment_offset >= TRBS_PER_SEGMENT) |
86 | return 0; | 86 | return 0; |
87 | return seg->dma + (segment_offset * sizeof(*trb)); | 87 | return seg->dma + (segment_offset * sizeof(*trb)); |
88 | } | 88 | } |
@@ -1546,6 +1546,9 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
1546 | usb_hcd_resume_root_hub(hcd); | 1546 | usb_hcd_resume_root_hub(hcd); |
1547 | } | 1547 | } |
1548 | 1548 | ||
1549 | if (hcd->speed == HCD_USB3 && (temp & PORT_PLS_MASK) == XDEV_INACTIVE) | ||
1550 | bus_state->port_remote_wakeup &= ~(1 << faked_port_index); | ||
1551 | |||
1549 | if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) { | 1552 | if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) { |
1550 | xhci_dbg(xhci, "port resume event for port %d\n", port_id); | 1553 | xhci_dbg(xhci, "port resume event for port %d\n", port_id); |
1551 | 1554 | ||
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 7da0d6043d33..526ebc0c7e72 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -3453,6 +3453,9 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
3453 | return -EINVAL; | 3453 | return -EINVAL; |
3454 | } | 3454 | } |
3455 | 3455 | ||
3456 | if (virt_dev->tt_info) | ||
3457 | old_active_eps = virt_dev->tt_info->active_eps; | ||
3458 | |||
3456 | if (virt_dev->udev != udev) { | 3459 | if (virt_dev->udev != udev) { |
3457 | /* If the virt_dev and the udev does not match, this virt_dev | 3460 | /* If the virt_dev and the udev does not match, this virt_dev |
3458 | * may belong to another udev. | 3461 | * may belong to another udev. |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 31e46cc55807..ed2ebf647c38 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -285,6 +285,7 @@ struct xhci_op_regs { | |||
285 | #define XDEV_U0 (0x0 << 5) | 285 | #define XDEV_U0 (0x0 << 5) |
286 | #define XDEV_U2 (0x2 << 5) | 286 | #define XDEV_U2 (0x2 << 5) |
287 | #define XDEV_U3 (0x3 << 5) | 287 | #define XDEV_U3 (0x3 << 5) |
288 | #define XDEV_INACTIVE (0x6 << 5) | ||
288 | #define XDEV_RESUME (0xf << 5) | 289 | #define XDEV_RESUME (0xf << 5) |
289 | /* true: port has power (see HCC_PPC) */ | 290 | /* true: port has power (see HCC_PPC) */ |
290 | #define PORT_POWER (1 << 9) | 291 | #define PORT_POWER (1 << 9) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 19b85ee98a72..876423b8892c 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -1099,6 +1099,8 @@ static const struct usb_device_id option_ids[] = { | |||
1099 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 1099 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
1100 | { USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x68c0, 0xff), | 1100 | { USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x68c0, 0xff), |
1101 | .driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC73xx */ | 1101 | .driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC73xx */ |
1102 | { USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x9041, 0xff), | ||
1103 | .driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC7305/MC7355 */ | ||
1102 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, | 1104 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
1103 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, | 1105 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
1104 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), | 1106 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 9c63897b3a56..d156545728c2 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
@@ -145,7 +145,6 @@ static const struct usb_device_id id_table[] = { | |||
145 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ | 145 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ |
146 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ | 146 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ |
147 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ | 147 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ |
148 | {DEVICE_SWI(0x1199, 0x9041)}, /* Sierra Wireless MC7305/MC7355 */ | ||
149 | {DEVICE_SWI(0x1199, 0x9051)}, /* Netgear AirCard 340U */ | 148 | {DEVICE_SWI(0x1199, 0x9051)}, /* Netgear AirCard 340U */ |
150 | {DEVICE_SWI(0x1199, 0x9053)}, /* Sierra Wireless Modem */ | 149 | {DEVICE_SWI(0x1199, 0x9053)}, /* Sierra Wireless Modem */ |
151 | {DEVICE_SWI(0x1199, 0x9054)}, /* Sierra Wireless Modem */ | 150 | {DEVICE_SWI(0x1199, 0x9054)}, /* Sierra Wireless Modem */ |
@@ -158,6 +157,7 @@ static const struct usb_device_id id_table[] = { | |||
158 | {DEVICE_SWI(0x413c, 0x81a4)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ | 157 | {DEVICE_SWI(0x413c, 0x81a4)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ |
159 | {DEVICE_SWI(0x413c, 0x81a8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ | 158 | {DEVICE_SWI(0x413c, 0x81a8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ |
160 | {DEVICE_SWI(0x413c, 0x81a9)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ | 159 | {DEVICE_SWI(0x413c, 0x81a9)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ |
160 | {DEVICE_SWI(0x413c, 0x81b1)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */ | ||
161 | 161 | ||
162 | /* Huawei devices */ | 162 | /* Huawei devices */ |
163 | {DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */ | 163 | {DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */ |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 46179a0828eb..07d1ecd564f7 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -289,6 +289,7 @@ static const struct usb_device_id id_table[] = { | |||
289 | { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68AA, 0xFF, 0xFF, 0xFF), | 289 | { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68AA, 0xFF, 0xFF, 0xFF), |
290 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist | 290 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist |
291 | }, | 291 | }, |
292 | { USB_DEVICE(0x1199, 0x68AB) }, /* Sierra Wireless AR8550 */ | ||
292 | /* AT&T Direct IP LTE modems */ | 293 | /* AT&T Direct IP LTE modems */ |
293 | { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF), | 294 | { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF), |
294 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist | 295 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index caf188800c67..6b2479123de7 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -2065,6 +2065,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200, | |||
2065 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 2065 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2066 | US_FL_NO_READ_DISC_INFO ), | 2066 | US_FL_NO_READ_DISC_INFO ), |
2067 | 2067 | ||
2068 | /* Reported by Oliver Neukum <oneukum@suse.com> | ||
2069 | * This device morphes spontaneously into another device if the access | ||
2070 | * pattern of Windows isn't followed. Thus writable media would be dirty | ||
2071 | * if the initial instance is used. So the device is limited to its | ||
2072 | * virtual CD. | ||
2073 | * And yes, the concept that BCD goes up to 9 is not heeded */ | ||
2074 | UNUSUAL_DEV( 0x19d2, 0x1225, 0x0000, 0xffff, | ||
2075 | "ZTE,Incorporated", | ||
2076 | "ZTE WCDMA Technologies MSM", | ||
2077 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
2078 | US_FL_SINGLE_LUN ), | ||
2079 | |||
2068 | /* Reported by Sven Geggus <sven-usbst@geggus.net> | 2080 | /* Reported by Sven Geggus <sven-usbst@geggus.net> |
2069 | * This encrypted pen drive returns bogus data for the initial READ(10). | 2081 | * This encrypted pen drive returns bogus data for the initial READ(10). |
2070 | */ | 2082 | */ |
@@ -2074,6 +2086,17 @@ UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200, | |||
2074 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 2086 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2075 | US_FL_INITIAL_READ10 ), | 2087 | US_FL_INITIAL_READ10 ), |
2076 | 2088 | ||
2089 | /* Reported by Hans de Goede <hdegoede@redhat.com> | ||
2090 | * These are mini projectors using USB for both power and video data transport | ||
2091 | * The usb-storage interface is a virtual windows driver CD, which the gm12u320 | ||
2092 | * driver automatically converts into framebuffer & kms dri device nodes. | ||
2093 | */ | ||
2094 | UNUSUAL_DEV( 0x1de1, 0xc102, 0x0000, 0xffff, | ||
2095 | "Grain-media Technology Corp.", | ||
2096 | "USB3.0 Device GM12U320", | ||
2097 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
2098 | US_FL_IGNORE_DEVICE ), | ||
2099 | |||
2077 | /* Patch by Richard Schütz <r.schtz@t-online.de> | 2100 | /* Patch by Richard Schütz <r.schtz@t-online.de> |
2078 | * This external hard drive enclosure uses a JMicron chip which | 2101 | * This external hard drive enclosure uses a JMicron chip which |
2079 | * needs the US_FL_IGNORE_RESIDUE flag to work properly. */ | 2102 | * needs the US_FL_IGNORE_RESIDUE flag to work properly. */ |