Pull USB driver fixes from Greg KH: "Here are a number of small USB fixes for 4.4-rc5. All of them have been in linux-next. The majority are gadget and phy issues, with a few new quirks and device ids added as well" * tag 'usb-4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (32 commits) USB: add quirk for devices with broken LPM xhci: fix usb2 resume timing and races. usb: musb: fail with error when no DMA controller set usb: gadget: uvc: fix permissions of configfs attributes usb: musb: core: Fix pm runtime for deferred probe usb: phy: msm: fix a possible NULL dereference USB: host: ohci-at91: fix a crash in ohci_hcd_at91_overcurrent_irq usb: Quiet down false peer failure messages usb: xhci: fix config fail of FS hub behind a HS hub with MTT xhci: Fix memory leak in xhci_pme_acpi_rtd3_enable() usb: Use the USB_SS_MULT() macro to decode burst multiplier for log message USB: whci-hcd: add check for dma mapping error usb: core : hub: Fix BOS 'NULL pointer' kernel panic USB: quirks: Apply ALWAYS_POLL to all ELAN devices usb-storage: Fix scsi-sd failure "Invalid field in cdb" for USB adapter JMicron USB: quirks: Fix another ELAN touchscreen usb: dwc3: gadget: don't prestart interrupt endpoints USB: serial: Another Infineon flash loader USB ID USB: cdc_acm: Ignore Infineon Flash Loader utility USB: cp210x: Remove CP2110 ID from compatibility list ...
Unified · Split
| @@ -316,11 +316,6 @@ · 315 unmodified lines | ||
| 316 | 316 | #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001 |
| 317 | 317 | |
| 318 | 318 | #define USB_VENDOR_ID_ELAN 0x04f3 |
| 319 | −#define USB_DEVICE_ID_ELAN_TOUCHSCREEN 0x0089 | |
| 320 | −#define USB_DEVICE_ID_ELAN_TOUCHSCREEN_009B 0x009b | |
| 321 | −#define USB_DEVICE_ID_ELAN_TOUCHSCREEN_0103 0x0103 | |
| 322 | −#define USB_DEVICE_ID_ELAN_TOUCHSCREEN_010c 0x010c | |
| 323 | −#define USB_DEVICE_ID_ELAN_TOUCHSCREEN_016F 0x016f | |
| 324 | 319 | |
| 325 | 320 | #define USB_VENDOR_ID_ELECOM 0x056e |
| 326 | 321 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 |
| @@ -72,11 +72,7 @@ static const struct hid_blacklist { · 71 unmodified lines | ||
| 72 | 72 | { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, |
| 73 | 73 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
| 74 | 74 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU, HID_QUIRK_MULTI_INPUT }, |
| 75 | − { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN, HID_QUIRK_ALWAYS_POLL }, | |
| 76 | − { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_009B, HID_QUIRK_ALWAYS_POLL }, | |
| 77 | − { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_0103, HID_QUIRK_ALWAYS_POLL }, | |
| 78 | − { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_010c, HID_QUIRK_ALWAYS_POLL }, | |
| 79 | − { USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_016F, HID_QUIRK_ALWAYS_POLL }, | |
| 75 | + { USB_VENDOR_ID_ELAN, HID_ANY_ID, HID_QUIRK_ALWAYS_POLL }, | |
| 80 | 76 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, |
| 81 | 77 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, |
| 82 | 78 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, |
| @@ -340,7 +336,8 @@ static const struct hid_blacklist *usbhid_exists_squirk(const u16 idVendor, · 257 unmodified lines | ||
| 340 | 336 | |
| 341 | 337 | for (; hid_blacklist[n].idVendor; n++) |
| 342 | 338 | if (hid_blacklist[n].idVendor == idVendor && |
| 343 | − hid_blacklist[n].idProduct == idProduct) | |
| 339 | + (hid_blacklist[n].idProduct == (__u16) HID_ANY_ID || | |
| 340 | + hid_blacklist[n].idProduct == idProduct)) | |
| 344 | 341 | bl_entry = &hid_blacklist[n]; |
| 345 | 342 | |
| 346 | 343 | if (bl_entry != NULL) |
| @@ -1838,6 +1838,11 @@ static const struct usb_device_id acm_ids[] = { · 1837 unmodified lines | ||
| 1838 | 1838 | }, |
| 1839 | 1839 | #endif |
| 1840 | 1840 | |
| 1841 | + /* Exclude Infineon Flash Loader utility */ | |
| 1842 | + { USB_DEVICE(0x058b, 0x0041), | |
| 1843 | + .driver_info = IGNORE_DEVICE, | |
| 1844 | + }, | |
| 1845 | + | |
| 1841 | 1846 | /* control interfaces without any protocol set */ |
| 1842 | 1847 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
| 1843 | 1848 | USB_CDC_PROTO_NONE) }, |
| @@ -115,7 +115,8 @@ static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, · 114 unmodified lines | ||
| 115 | 115 | USB_SS_MULT(desc->bmAttributes) > 3) { |
| 116 | 116 | dev_warn(ddev, "Isoc endpoint has Mult of %d in " |
| 117 | 117 | "config %d interface %d altsetting %d ep %d: " |
| 118 | − "setting to 3\n", desc->bmAttributes + 1, | |
| 118 | + "setting to 3\n", | |
| 119 | + USB_SS_MULT(desc->bmAttributes), | |
| 119 | 120 | cfgno, inum, asnum, ep->desc.bEndpointAddress); |
| 120 | 121 | ep->ss_ep_comp.bmAttributes = 2; |
| 121 | 122 | } |
| @@ -124,6 +124,10 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev) · 123 unmodified lines | ||
| 124 | 124 | |
| 125 | 125 | int usb_device_supports_lpm(struct usb_device *udev) |
| 126 | 126 | { |
| 127 | + /* Some devices have trouble with LPM */ | |
| 128 | + if (udev->quirks & USB_QUIRK_NO_LPM) | |
| 129 | + return 0; | |
| 130 | + | |
| 127 | 131 | /* USB 2.1 (and greater) devices indicate LPM support through |
| 128 | 132 | * their USB 2.0 Extended Capabilities BOS descriptor. |
| 129 | 133 | */ |
| @@ -4512,6 +4516,8 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, · 4382 unmodified lines | ||
| 4512 | 4516 | goto fail; |
| 4513 | 4517 | } |
| 4514 | 4518 | |
| 4519 | + usb_detect_quirks(udev); | |
| 4520 | + | |
| 4515 | 4521 | if (udev->wusb == 0 && le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0201) { |
| 4516 | 4522 | retval = usb_get_bos_descriptor(udev); |
| 4517 | 4523 | if (!retval) { |
| @@ -4710,7 +4716,6 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, · 192 unmodified lines | ||
| 4710 | 4716 | if (status < 0) |
| 4711 | 4717 | goto loop; |
| 4712 | 4718 | |
| 4713 | − usb_detect_quirks(udev); | |
| 4714 | 4719 | if (udev->quirks & USB_QUIRK_DELAY_INIT) |
| 4715 | 4720 | msleep(1000); |
| 4716 | 4721 | |
| @@ -5326,9 +5331,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) · 609 unmodified lines | ||
| 5326 | 5331 | if (udev->usb2_hw_lpm_enabled == 1) |
| 5327 | 5332 | usb_set_usb2_hardware_lpm(udev, 0); |
| 5328 | 5333 | |
| 5329 | − bos = udev->bos; | |
| 5330 | − udev->bos = NULL; | |
| 5331 | − | |
| 5332 | 5334 | /* Disable LPM and LTM while we reset the device and reinstall the alt |
| 5333 | 5335 | * settings. Device-initiated LPM settings, and system exit latency |
| 5334 | 5336 | * settings are cleared when the device is reset, so we have to set |
| @@ -5337,15 +5339,18 @@ static int usb_reset_and_verify_device(struct usb_device *udev) · 2 unmodified lines | ||
| 5337 | 5339 | ret = usb_unlocked_disable_lpm(udev); |
| 5338 | 5340 | if (ret) { |
| 5339 | 5341 | dev_err(&udev->dev, "%s Failed to disable LPM\n.", __func__); |
| 5340 | − goto re_enumerate; | |
| 5342 | + goto re_enumerate_no_bos; | |
| 5341 | 5343 | } |
| 5342 | 5344 | ret = usb_disable_ltm(udev); |
| 5343 | 5345 | if (ret) { |
| 5344 | 5346 | dev_err(&udev->dev, "%s Failed to disable LTM\n.", |
| 5345 | 5347 | __func__); |
| 5346 | − goto re_enumerate; | |
| 5348 | + goto re_enumerate_no_bos; | |
| 5347 | 5349 | } |
| 5348 | 5350 | |
| 5351 | + bos = udev->bos; | |
| 5352 | + udev->bos = NULL; | |
| 5353 | + | |
| 5349 | 5354 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { |
| 5350 | 5355 | |
| 5351 | 5356 | /* ep0 maxpacket size may change; let the HCD know about it. |
| @@ -5442,10 +5447,11 @@ done: · 90 unmodified lines | ||
| 5442 | 5447 | return 0; |
| 5443 | 5448 | |
| 5444 | 5449 | re_enumerate: |
| 5445 | − /* LPM state doesn't matter when we're about to destroy the device. */ | |
| 5446 | − hub_port_logical_disconnect(parent_hub, port1); | |
| 5447 | 5450 | usb_release_bos_descriptor(udev); |
| 5448 | 5451 | udev->bos = bos; |
| 5452 | +re_enumerate_no_bos: | |
| 5453 | + /* LPM state doesn't matter when we're about to destroy the device. */ | |
| 5454 | + hub_port_logical_disconnect(parent_hub, port1); | |
| 5449 | 5455 | return -ENODEV; |
| 5450 | 5456 | } |
| 5451 | 5457 | |
| @@ -206,7 +206,7 @@ static int link_peers(struct usb_port *left, struct usb_port *right) · 205 unmodified lines | ||
| 206 | 206 | else |
| 207 | 207 | method = "default"; |
| 208 | 208 | |
| 209 | − pr_warn("usb: failed to peer %s and %s by %s (%s:%s) (%s:%s)\n", | |
| 209 | + pr_debug("usb: failed to peer %s and %s by %s (%s:%s) (%s:%s)\n", | |
| 210 | 210 | dev_name(&left->dev), dev_name(&right->dev), method, |
| 211 | 211 | dev_name(&left->dev), |
| 212 | 212 | lpeer ? dev_name(&lpeer->dev) : "none", |
| @@ -265,7 +265,7 @@ static void link_peers_report(struct usb_port *left, struct usb_port *right) · 52 unmodified lines | ||
| 265 | 265 | if (rc == 0) { |
| 266 | 266 | dev_dbg(&left->dev, "peered to %s\n", dev_name(&right->dev)); |
| 267 | 267 | } else { |
| 268 | − dev_warn(&left->dev, "failed to peer to %s (%d)\n", | |
| 268 | + dev_dbg(&left->dev, "failed to peer to %s (%d)\n", | |
| 269 | 269 | dev_name(&right->dev), rc); |
| 270 | 270 | pr_warn_once("usb: port power management may be unreliable\n"); |
| 271 | 271 | usb_port_block_power_off = 1; |
| @@ -125,6 +125,9 @@ static const struct usb_device_id usb_quirk_list[] = { · 124 unmodified lines | ||
| 125 | 125 | { USB_DEVICE(0x04f3, 0x016f), .driver_info = |
| 126 | 126 | USB_QUIRK_DEVICE_QUALIFIER }, |
| 127 | 127 | |
| 128 | + { USB_DEVICE(0x04f3, 0x21b8), .driver_info = | |
| 129 | + USB_QUIRK_DEVICE_QUALIFIER }, | |
| 130 | + | |
| 128 | 131 | /* Roland SC-8820 */ |
| 129 | 132 | { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME }, |
| 130 | 133 | |
| @@ -199,6 +202,12 @@ static const struct usb_device_id usb_quirk_list[] = { · 68 unmodified lines | ||
| 199 | 202 | { USB_DEVICE(0x1a0a, 0x0200), .driver_info = |
| 200 | 203 | USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, |
| 201 | 204 | |
| 205 | + /* Blackmagic Design Intensity Shuttle */ | |
| 206 | + { USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM }, | |
| 207 | + | |
| 208 | + /* Blackmagic Design UltraStudio SDI */ | |
| 209 | + { USB_DEVICE(0x1edb, 0xbd4f), .driver_info = USB_QUIRK_NO_LPM }, | |
| 210 | + | |
| 202 | 211 | { } /* terminating entry must be last */ |
| 203 | 212 | }; |
| 204 | 213 | |
| @@ -125,9 +125,11 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) · 124 unmodified lines | ||
| 125 | 125 | if (ret) |
| 126 | 126 | return ret; |
| 127 | 127 | |
| 128 | − ret = clk_prepare_enable(hsotg->clk); | |
| 129 | − if (ret) | |
| 130 | − return ret; | |
| 128 | + if (hsotg->clk) { | |
| 129 | + ret = clk_prepare_enable(hsotg->clk); | |
| 130 | + if (ret) | |
| 131 | + return ret; | |
| 132 | + } | |
| 131 | 133 | |
| 132 | 134 | if (hsotg->uphy) |
| 133 | 135 | ret = usb_phy_init(hsotg->uphy); |
| @@ -175,7 +177,8 @@ static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg) · 41 unmodified lines | ||
| 175 | 177 | if (ret) |
| 176 | 178 | return ret; |
| 177 | 179 | |
| 178 | − clk_disable_unprepare(hsotg->clk); | |
| 180 | + if (hsotg->clk) | |
| 181 | + clk_disable_unprepare(hsotg->clk); | |
| 179 | 182 | |
| 180 | 183 | ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), |
| 181 | 184 | hsotg->supplies); |
| @@ -212,14 +215,41 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) · 30 unmodified lines | ||
| 212 | 215 | */ |
| 213 | 216 | hsotg->phy = devm_phy_get(hsotg->dev, "usb2-phy"); |
| 214 | 217 | if (IS_ERR(hsotg->phy)) { |
| 215 | − hsotg->phy = NULL; | |
| 218 | + ret = PTR_ERR(hsotg->phy); | |
| 219 | + switch (ret) { | |
| 220 | + case -ENODEV: | |
| 221 | + case -ENOSYS: | |
| 222 | + hsotg->phy = NULL; | |
| 223 | + break; | |
| 224 | + case -EPROBE_DEFER: | |
| 225 | + return ret; | |
| 226 | + default: | |
| 227 | + dev_err(hsotg->dev, "error getting phy %d\n", ret); | |
| 228 | + return ret; | |
| 229 | + } | |
| 230 | + } | |
| 231 | + | |
| 232 | + if (!hsotg->phy) { | |
| 216 | 233 | hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); |
| 217 | − if (IS_ERR(hsotg->uphy)) | |
| 218 | − hsotg->uphy = NULL; | |
| 219 | − else | |
| 220 | − hsotg->plat = dev_get_platdata(hsotg->dev); | |
| 234 | + if (IS_ERR(hsotg->uphy)) { | |
| 235 | + ret = PTR_ERR(hsotg->uphy); | |
| 236 | + switch (ret) { | |
| 237 | + case -ENODEV: | |
| 238 | + case -ENXIO: | |
| 239 | + hsotg->uphy = NULL; | |
| 240 | + break; | |
| 241 | + case -EPROBE_DEFER: | |
| 242 | + return ret; | |
| 243 | + default: | |
| 244 | + dev_err(hsotg->dev, "error getting usb phy %d\n", | |
| 245 | + ret); | |
| 246 | + return ret; | |
| 247 | + } | |
| 248 | + } | |
| 221 | 249 | } |
| 222 | 250 | |
| 251 | + hsotg->plat = dev_get_platdata(hsotg->dev); | |
| 252 | + | |
| 223 | 253 | if (hsotg->phy) { |
| 224 | 254 | /* |
| 225 | 255 | * If using the generic PHY framework, check if the PHY bus |
| @@ -229,11 +259,6 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) · 3 unmodified lines | ||
| 229 | 259 | hsotg->phyif = GUSBCFG_PHYIF8; |
| 230 | 260 | } |
| 231 | 261 | |
| 232 | − if (!hsotg->phy && !hsotg->uphy && !hsotg->plat) { | |
| 233 | − dev_err(hsotg->dev, "no platform data or transceiver defined\n"); | |
| 234 | − return -EPROBE_DEFER; | |
| 235 | − } | |
| 236 | − | |
| 237 | 262 | /* Clock */ |
| 238 | 263 | hsotg->clk = devm_clk_get(hsotg->dev, "otg"); |
| 239 | 264 | if (IS_ERR(hsotg->clk)) { |
| @@ -342,20 +367,6 @@ static int dwc2_driver_probe(struct platform_device *dev) · 102 unmodified lines | ||
| 342 | 367 | if (retval) |
| 343 | 368 | return retval; |
| 344 | 369 | |
| 345 | − irq = platform_get_irq(dev, 0); | |
| 346 | − if (irq < 0) { | |
| 347 | − dev_err(&dev->dev, "missing IRQ resource\n"); | |
| 348 | − return irq; | |
| 349 | − } | |
| 350 | − | |
| 351 | − dev_dbg(hsotg->dev, "registering common handler for irq%d\n", | |
| 352 | − irq); | |
| 353 | − retval = devm_request_irq(hsotg->dev, irq, | |
| 354 | − dwc2_handle_common_intr, IRQF_SHARED, | |
| 355 | − dev_name(hsotg->dev), hsotg); | |
| 356 | − if (retval) | |
| 357 | − return retval; | |
| 358 | − | |
| 359 | 370 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); |
| 360 | 371 | hsotg->regs = devm_ioremap_resource(&dev->dev, res); |
| 361 | 372 | if (IS_ERR(hsotg->regs)) |
| @@ -390,6 +401,20 @@ static int dwc2_driver_probe(struct platform_device *dev) · 28 unmodified lines | ||
| 390 | 401 | |
| 391 | 402 | dwc2_set_all_params(hsotg->core_params, -1); |
| 392 | 403 | |
| 404 | + irq = platform_get_irq(dev, 0); | |
| 405 | + if (irq < 0) { | |
| 406 | + dev_err(&dev->dev, "missing IRQ resource\n"); | |
| 407 | + return irq; | |
| 408 | + } | |
| 409 | + | |
| 410 | + dev_dbg(hsotg->dev, "registering common handler for irq%d\n", | |
| 411 | + irq); | |
| 412 | + retval = devm_request_irq(hsotg->dev, irq, | |
| 413 | + dwc2_handle_common_intr, IRQF_SHARED, | |
| 414 | + dev_name(hsotg->dev), hsotg); | |
| 415 | + if (retval) | |
| 416 | + return retval; | |
| 417 | + | |
| 393 | 418 | retval = dwc2_lowlevel_hw_enable(hsotg); |
| 394 | 419 | if (retval) |
| 395 | 420 | return retval; |
| @@ -1078,6 +1078,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) · 1077 unmodified lines | ||
| 1078 | 1078 | * little bit faster. |
| 1079 | 1079 | */ |
| 1080 | 1080 | if (!usb_endpoint_xfer_isoc(dep->endpoint.desc) && |
| 1081 | + !usb_endpoint_xfer_int(dep->endpoint.desc) && | |
| 1081 | 1082 | !(dep->flags & DWC3_EP_BUSY)) { |
| 1082 | 1083 | ret = __dwc3_gadget_kick_transfer(dep, 0, true); |
| 1083 | 1084 | goto out; |
| @@ -423,7 +423,7 @@ static ssize_t __ffs_ep0_read_events(struct ffs_data *ffs, char __user *buf, · 422 unmodified lines | ||
| 423 | 423 | spin_unlock_irq(&ffs->ev.waitq.lock); |
| 424 | 424 | mutex_unlock(&ffs->mutex); |
| 425 | 425 | |
| 426 | − return unlikely(__copy_to_user(buf, events, size)) ? -EFAULT : size; | |
| 426 | + return unlikely(copy_to_user(buf, events, size)) ? -EFAULT : size; | |
| 427 | 427 | } |
| 428 | 428 | |
| 429 | 429 | static ssize_t ffs_ep0_read(struct file *file, char __user *buf, |
| @@ -513,7 +513,7 @@ static ssize_t ffs_ep0_read(struct file *file, char __user *buf, · 83 unmodified lines | ||
| 513 | 513 | |
| 514 | 514 | /* unlocks spinlock */ |
| 515 | 515 | ret = __ffs_ep0_queue_wait(ffs, data, len); |
| 516 | − if (likely(ret > 0) && unlikely(__copy_to_user(buf, data, len))) | |
| 516 | + if (likely(ret > 0) && unlikely(copy_to_user(buf, data, len))) | |
| 517 | 517 | ret = -EFAULT; |
| 518 | 518 | goto done_mutex; |
| 519 | 519 | |
| @@ -3493,7 +3493,7 @@ static char *ffs_prepare_buffer(const char __user *buf, size_t len) · 2973 unmodified lines | ||
| 3493 | 3493 | if (unlikely(!data)) |
| 3494 | 3494 | return ERR_PTR(-ENOMEM); |
| 3495 | 3495 | |
| 3496 | − if (unlikely(__copy_from_user(data, buf, len))) { | |
| 3496 | + if (unlikely(copy_from_user(data, buf, len))) { | |
| 3497 | 3497 | kfree(data); |
| 3498 | 3498 | return ERR_PTR(-EFAULT); |
| 3499 | 3499 | } |
| @@ -370,6 +370,7 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt) · 369 unmodified lines | ||
| 370 | 370 | if (err) { |
| 371 | 371 | ERROR(midi, "%s queue req: %d\n", |
| 372 | 372 | midi->out_ep->name, err); |
| 373 | + free_ep_req(midi->out_ep, req); | |
| 373 | 374 | } |
| 374 | 375 | } |
| 375 | 376 | |
| @@ -545,7 +546,7 @@ static void f_midi_transmit(struct f_midi *midi, struct usb_request *req) · 169 unmodified lines | ||
| 545 | 546 | } |
| 546 | 547 | } |
| 547 | 548 | |
| 548 | − if (req->length > 0) { | |
| 549 | + if (req->length > 0 && ep->enabled) { | |
| 549 | 550 | int err; |
| 550 | 551 | |
| 551 | 552 | err = usb_ep_queue(ep, req, GFP_ATOMIC); |
| @@ -20,7 +20,7 @@ · 19 unmodified lines | ||
| 20 | 20 | #define UVC_ATTR(prefix, cname, aname) \ |
| 21 | 21 | static struct configfs_attribute prefix##attr_##cname = { \ |
| 22 | 22 | .ca_name = __stringify(aname), \ |
| 23 | − .ca_mode = S_IRUGO, \ | |
| 23 | + .ca_mode = S_IRUGO | S_IWUGO, \ | |
| 24 | 24 | .ca_owner = THIS_MODULE, \ |
| 25 | 25 | .show = prefix##cname##_show, \ |
| 26 | 26 | .store = prefix##cname##_store, \ |
| @@ -2536,6 +2536,9 @@ static int pxa_udc_suspend(struct platform_device *_dev, pm_message_t state) · 2535 unmodified lines | ||
| 2536 | 2536 | udc->pullup_resume = udc->pullup_on; |
| 2537 | 2537 | dplus_pullup(udc, 0); |
| 2538 | 2538 | |
| 2539 | + if (udc->driver) | |
| 2540 | + udc->driver->disconnect(&udc->gadget); | |
| 2541 | + | |
| 2539 | 2542 | return 0; |
| 2540 | 2543 | } |
| 2541 | 2544 | |
| @@ -473,6 +473,8 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) · 472 unmodified lines | ||
| 473 | 473 | if (!pdata) |
| 474 | 474 | return -ENOMEM; |
| 475 | 475 | |
| 476 | + pdev->dev.platform_data = pdata; | |
| 477 | + | |
| 476 | 478 | if (!of_property_read_u32(np, "num-ports", &ports)) |
| 477 | 479 | pdata->ports = ports; |
| 478 | 480 | |
| @@ -483,6 +485,7 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) · 4 unmodified lines | ||
| 483 | 485 | */ |
| 484 | 486 | if (i >= pdata->ports) { |
| 485 | 487 | pdata->vbus_pin[i] = -EINVAL; |
| 488 | + pdata->overcurrent_pin[i] = -EINVAL; | |
| 486 | 489 | continue; |
| 487 | 490 | } |
| 488 | 491 | |
| @@ -513,10 +516,8 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) · 24 unmodified lines | ||
| 513 | 516 | } |
| 514 | 517 | |
| 515 | 518 | at91_for_each_port(i) { |
| 516 | − if (i >= pdata->ports) { | |
| 517 | − pdata->overcurrent_pin[i] = -EINVAL; | |
| 518 | − continue; | |
| 519 | − } | |
| 519 | + if (i >= pdata->ports) | |
| 520 | + break; | |
| 520 | 521 | |
| 521 | 522 | pdata->overcurrent_pin[i] = |
| 522 | 523 | of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags); |
| @@ -552,8 +553,6 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) · 29 unmodified lines | ||
| 552 | 553 | } |
| 553 | 554 | } |
| 554 | 555 | |
| 555 | − pdev->dev.platform_data = pdata; | |
| 556 | − | |
| 557 | 556 | device_init_wakeup(&pdev->dev, 1); |
| 558 | 557 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev); |
| 559 | 558 | } |
| @@ -377,6 +377,10 @@ static int qset_fill_page_list(struct whc *whc, struct whc_std *std, gfp_t mem_f · 376 unmodified lines | ||
| 377 | 377 | if (std->pl_virt == NULL) |
| 378 | 378 | return -ENOMEM; |
| 379 | 379 | std->dma_addr = dma_map_single(whc->wusbhc.dev, std->pl_virt, pl_len, DMA_TO_DEVICE); |
| 380 | + if (dma_mapping_error(whc->wusbhc.dev, std->dma_addr)) { | |
| 381 | + kfree(std->pl_virt); | |
| 382 | + return -EFAULT; | |
| 383 | + } | |
| 380 | 384 | |
| 381 | 385 | for (p = 0; p < std->num_pointers; p++) { |
| 382 | 386 | std->pl_virt[p].buf_ptr = cpu_to_le64(dma_addr); |
| @@ -733,8 +733,30 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, · 732 unmodified lines | ||
| 733 | 733 | if ((raw_port_status & PORT_RESET) || |
| 734 | 734 | !(raw_port_status & PORT_PE)) |
| 735 | 735 | return 0xffffffff; |
| 736 | − if (time_after_eq(jiffies, | |
| 737 | − bus_state->resume_done[wIndex])) { | |
| 736 | + /* did port event handler already start resume timing? */ | |
| 737 | + if (!bus_state->resume_done[wIndex]) { | |
| 738 | + /* If not, maybe we are in a host initated resume? */ | |
| 739 | + if (test_bit(wIndex, &bus_state->resuming_ports)) { | |
| 740 | + /* Host initated resume doesn't time the resume | |
| 741 | + * signalling using resume_done[]. | |
| 742 | + * It manually sets RESUME state, sleeps 20ms | |
| 743 | + * and sets U0 state. This should probably be | |
| 744 | + * changed, but not right now. | |
| 745 | + */ | |
| 746 | + } else { | |
| 747 | + /* port resume was discovered now and here, | |
| 748 | + * start resume timing | |
| 749 | + */ | |
| 750 | + unsigned long timeout = jiffies + | |
| 751 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | |
| 752 | + | |
| 753 | + set_bit(wIndex, &bus_state->resuming_ports); | |
| 754 | + bus_state->resume_done[wIndex] = timeout; | |
| 755 | + mod_timer(&hcd->rh_timer, timeout); | |
| 756 | + } | |
| 757 | + /* Has resume been signalled for USB_RESUME_TIME yet? */ | |
| 758 | + } else if (time_after_eq(jiffies, | |
| 759 | + bus_state->resume_done[wIndex])) { | |
| 738 | 760 | int time_left; |
| 739 | 761 | |
| 740 | 762 | xhci_dbg(xhci, "Resume USB2 port %d\n", |
| @@ -775,13 +797,26 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, · 34 unmodified lines | ||
| 775 | 797 | } else { |
| 776 | 798 | /* |
| 777 | 799 | * The resume has been signaling for less than |
| 778 | − * 20ms. Report the port status as SUSPEND, | |
| 779 | − * let the usbcore check port status again | |
| 780 | − * and clear resume signaling later. | |
| 800 | + * USB_RESUME_TIME. Report the port status as SUSPEND, | |
| 801 | + * let the usbcore check port status again and clear | |
| 802 | + * resume signaling later. | |
| 781 | 803 | */ |
| 782 | 804 | status |= USB_PORT_STAT_SUSPEND; |
| 783 | 805 | } |
| 784 | 806 | } |
| 807 | + /* | |
| 808 | + * Clear stale usb2 resume signalling variables in case port changed | |
| 809 | + * state during resume signalling. For example on error | |
| 810 | + */ | |
| 811 | + if ((bus_state->resume_done[wIndex] || | |
| 812 | + test_bit(wIndex, &bus_state->resuming_ports)) && | |
| 813 | + (raw_port_status & PORT_PLS_MASK) != XDEV_U3 && | |
| 814 | + (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME) { | |
| 815 | + bus_state->resume_done[wIndex] = 0; | |
| 816 | + clear_bit(wIndex, &bus_state->resuming_ports); | |
| 817 | + } | |
| 818 | + | |
| 819 | + | |
| 785 | 820 | if ((raw_port_status & PORT_PLS_MASK) == XDEV_U0 && |
| 786 | 821 | (raw_port_status & PORT_POWER)) { |
| 787 | 822 | if (bus_state->suspended_ports & (1 << wIndex)) { |
| @@ -1115,6 +1150,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, · 327 unmodified lines | ||
| 1115 | 1150 | if ((temp & PORT_PE) == 0) |
| 1116 | 1151 | goto error; |
| 1117 | 1152 | |
| 1153 | + set_bit(wIndex, &bus_state->resuming_ports); | |
| 1118 | 1154 | xhci_set_link_state(xhci, port_array, wIndex, |
| 1119 | 1155 | XDEV_RESUME); |
| 1120 | 1156 | spin_unlock_irqrestore(&xhci->lock, flags); |
| @@ -1122,6 +1158,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, · 1 unmodified line | ||
| 1122 | 1158 | spin_lock_irqsave(&xhci->lock, flags); |
| 1123 | 1159 | xhci_set_link_state(xhci, port_array, wIndex, |
| 1124 | 1160 | XDEV_U0); |
| 1161 | + clear_bit(wIndex, &bus_state->resuming_ports); | |
| 1125 | 1162 | } |
| 1126 | 1163 | bus_state->port_c_suspend |= 1 << wIndex; |
| 1127 | 1164 | |
| @@ -188,10 +188,14 @@ static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) · 187 unmodified lines | ||
| 188 | 188 | 0xb7, 0x0c, 0x34, 0xac, 0x01, 0xe9, 0xbf, 0x45, |
| 189 | 189 | 0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23, |
| 190 | 190 | }; |
| 191 | − acpi_evaluate_dsm(ACPI_HANDLE(&dev->dev), intel_dsm_uuid, 3, 1, NULL); | |
| 191 | + union acpi_object *obj; | |
| 192 | + | |
| 193 | + obj = acpi_evaluate_dsm(ACPI_HANDLE(&dev->dev), intel_dsm_uuid, 3, 1, | |
| 194 | + NULL); | |
| 195 | + ACPI_FREE(obj); | |
| 192 | 196 | } |
| 193 | 197 | #else |
| 194 | − static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { } | |
| 198 | +static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { } | |
| 195 | 199 | #endif /* CONFIG_ACPI */ |
| 196 | 200 | |
| 197 | 201 | /* called during probe() after chip reset completes */ |
| @@ -1583,7 +1583,8 @@ static void handle_port_status(struct xhci_hcd *xhci, · 1582 unmodified lines | ||
| 1583 | 1583 | */ |
| 1584 | 1584 | bogus_port_status = true; |
| 1585 | 1585 | goto cleanup; |
| 1586 | − } else { | |
| 1586 | + } else if (!test_bit(faked_port_index, | |
| 1587 | + &bus_state->resuming_ports)) { | |
| 1587 | 1588 | xhci_dbg(xhci, "resume HS port %d\n", port_id); |
| 1588 | 1589 | bus_state->resume_done[faked_port_index] = jiffies + |
| 1589 | 1590 | msecs_to_jiffies(USB_RESUME_TIMEOUT); |
| @@ -4778,8 +4778,16 @@ int xhci_update_hub_device(struct usb_hcd *hcd, struct usb_device *hdev, · 4777 unmodified lines | ||
| 4778 | 4778 | ctrl_ctx->add_flags |= cpu_to_le32(SLOT_FLAG); |
| 4779 | 4779 | slot_ctx = xhci_get_slot_ctx(xhci, config_cmd->in_ctx); |
| 4780 | 4780 | slot_ctx->dev_info |= cpu_to_le32(DEV_HUB); |
| 4781 | + /* | |
| 4782 | + * refer to section 6.2.2: MTT should be 0 for full speed hub, | |
| 4783 | + * but it may be already set to 1 when setup an xHCI virtual | |
| 4784 | + * device, so clear it anyway. | |
| 4785 | + */ | |
| 4781 | 4786 | if (tt->multi) |
| 4782 | 4787 | slot_ctx->dev_info |= cpu_to_le32(DEV_MTT); |
| 4788 | + else if (hdev->speed == USB_SPEED_FULL) | |
| 4789 | + slot_ctx->dev_info &= cpu_to_le32(~DEV_MTT); | |
| 4790 | + | |
| 4783 | 4791 | if (xhci->hci_version > 0x95) { |
| 4784 | 4792 | xhci_dbg(xhci, "xHCI version %x needs hub " |
| 4785 | 4793 | "TT think time and number of ports\n", |
| @@ -159,7 +159,7 @@ config USB_TI_CPPI_DMA · 158 unmodified lines | ||
| 159 | 159 | |
| 160 | 160 | config USB_TI_CPPI41_DMA |
| 161 | 161 | bool 'TI CPPI 4.1 (AM335x)' |
| 162 | − depends on ARCH_OMAP | |
| 162 | + depends on ARCH_OMAP && DMADEVICES | |
| 163 | 163 | select TI_CPPI41 |
| 164 | 164 | |
| 165 | 165 | config USB_TUSB_OMAP_DMA |
| @@ -2017,7 +2017,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) · 2016 unmodified lines | ||
| 2017 | 2017 | /* We need musb_read/write functions initialized for PM */ |
| 2018 | 2018 | pm_runtime_use_autosuspend(musb->controller); |
| 2019 | 2019 | pm_runtime_set_autosuspend_delay(musb->controller, 200); |
| 2020 | − pm_runtime_irq_safe(musb->controller); | |
| 2021 | 2020 | pm_runtime_enable(musb->controller); |
| 2022 | 2021 | |
| 2023 | 2022 | /* The musb_platform_init() call: |
| @@ -2095,6 +2094,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) · 71 unmodified lines | ||
| 2095 | 2094 | #ifndef CONFIG_MUSB_PIO_ONLY |
| 2096 | 2095 | if (!musb->ops->dma_init || !musb->ops->dma_exit) { |
| 2097 | 2096 | dev_err(dev, "DMA controller not set\n"); |
| 2097 | + status = -ENODEV; | |
| 2098 | 2098 | goto fail2; |
| 2099 | 2099 | } |
| 2100 | 2100 | musb_dma_controller_create = musb->ops->dma_init; |
| @@ -2218,6 +2218,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) · 117 unmodified lines | ||
| 2218 | 2218 | |
| 2219 | 2219 | pm_runtime_put(musb->controller); |
| 2220 | 2220 | |
| 2221 | + /* | |
| 2222 | + * For why this is currently needed, see commit 3e43a0725637 | |
| 2223 | + * ("usb: musb: core: add pm_runtime_irq_safe()") | |
| 2224 | + */ | |
| 2225 | + pm_runtime_irq_safe(musb->controller); | |
| 2226 | + | |
| 2221 | 2227 | return 0; |
| 2222 | 2228 | |
| 2223 | 2229 | fail5: |
| @@ -1506,7 +1506,6 @@ static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg) · 1505 unmodified lines | ||
| 1506 | 1506 | { |
| 1507 | 1507 | struct msm_otg_platform_data *pdata; |
| 1508 | 1508 | struct extcon_dev *ext_id, *ext_vbus; |
| 1509 | − const struct of_device_id *id; | |
| 1510 | 1509 | struct device_node *node = pdev->dev.of_node; |
| 1511 | 1510 | struct property *prop; |
| 1512 | 1511 | int len, ret, words; |
| @@ -1518,8 +1517,9 @@ static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg) · 5 unmodified lines | ||
| 1518 | 1517 | |
| 1519 | 1518 | motg->pdata = pdata; |
| 1520 | 1519 | |
| 1521 | − id = of_match_device(msm_otg_dt_match, &pdev->dev); | |
| 1522 | − pdata->phy_type = (enum msm_usb_phy_type) id->data; | |
| 1520 | + pdata->phy_type = (enum msm_usb_phy_type)of_device_get_match_data(&pdev->dev); | |
| 1521 | + if (!pdata->phy_type) | |
| 1522 | + return 1; | |
| 1523 | 1523 | |
| 1524 | 1524 | motg->link_rst = devm_reset_control_get(&pdev->dev, "link"); |
| 1525 | 1525 | if (IS_ERR(motg->link_rst)) |
| @@ -143,12 +143,17 @@ static const struct mxs_phy_data imx6sx_phy_data = { · 142 unmodified lines | ||
| 143 | 143 | .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, |
| 144 | 144 | }; |
| 145 | 145 | |
| 146 | +static const struct mxs_phy_data imx6ul_phy_data = { | |
| 147 | + .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, | |
| 148 | +}; | |
| 149 | + | |
| 146 | 150 | static const struct of_device_id mxs_phy_dt_ids[] = { |
| 147 | 151 | { .compatible = "fsl,imx6sx-usbphy", .data = &imx6sx_phy_data, }, |
| 148 | 152 | { .compatible = "fsl,imx6sl-usbphy", .data = &imx6sl_phy_data, }, |
| 149 | 153 | { .compatible = "fsl,imx6q-usbphy", .data = &imx6q_phy_data, }, |
| 150 | 154 | { .compatible = "fsl,imx23-usbphy", .data = &imx23_phy_data, }, |
| 151 | 155 | { .compatible = "fsl,vf610-usbphy", .data = &vf610_phy_data, }, |
| 156 | + { .compatible = "fsl,imx6ul-usbphy", .data = &imx6ul_phy_data, }, | |
| 152 | 157 | { /* sentinel */ } |
| 153 | 158 | }; |
| 154 | 159 | MODULE_DEVICE_TABLE(of, mxs_phy_dt_ids); |
| @@ -131,7 +131,8 @@ static void __usbhsg_queue_pop(struct usbhsg_uep *uep, · 130 unmodified lines | ||
| 131 | 131 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); |
| 132 | 132 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); |
| 133 | 133 | |
| 134 | − dev_dbg(dev, "pipe %d : queue pop\n", usbhs_pipe_number(pipe)); | |
| 134 | + if (pipe) | |
| 135 | + dev_dbg(dev, "pipe %d : queue pop\n", usbhs_pipe_number(pipe)); | |
| 135 | 136 | |
| 136 | 137 | ureq->req.status = status; |
| 137 | 138 | spin_unlock(usbhs_priv_to_lock(priv)); |
| @@ -685,7 +686,13 @@ static int usbhsg_ep_dequeue(struct usb_ep *ep, struct usb_request *req) · 547 unmodified lines | ||
| 685 | 686 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); |
| 686 | 687 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); |
| 687 | 688 | |
| 688 | − usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq)); | |
| 689 | + if (pipe) | |
| 690 | + usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq)); | |
| 691 | + | |
| 692 | + /* | |
| 693 | + * To dequeue a request, this driver should call the usbhsg_queue_pop() | |
| 694 | + * even if the pipe is NULL. | |
| 695 | + */ | |
| 689 | 696 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); |
| 690 | 697 | |
| 691 | 698 | return 0; |
| @@ -132,7 +132,6 @@ static const struct usb_device_id id_table[] = { · 131 unmodified lines | ||
| 132 | 132 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
| 133 | 133 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
| 134 | 134 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ |
| 135 | − { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */ | |
| 136 | 135 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ |
| 137 | 136 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ |
| 138 | 137 | { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ |
| @@ -53,6 +53,7 @@ DEVICE(funsoft, FUNSOFT_IDS); · 52 unmodified lines | ||
| 53 | 53 | |
| 54 | 54 | /* Infineon Flashloader driver */ |
| 55 | 55 | #define FLASHLOADER_IDS() \ |
| 56 | + { USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \ | |
| 56 | 57 | { USB_DEVICE(0x8087, 0x0716) } |
| 57 | 58 | DEVICE(flashloader, FLASHLOADER_IDS); |
| 58 | 59 | |
| @@ -796,6 +796,10 @@ static int uas_slave_configure(struct scsi_device *sdev) · 795 unmodified lines | ||
| 796 | 796 | if (devinfo->flags & US_FL_NO_REPORT_OPCODES) |
| 797 | 797 | sdev->no_report_opcodes = 1; |
| 798 | 798 | |
| 799 | + /* A few buggy USB-ATA bridges don't understand FUA */ | |
| 800 | + if (devinfo->flags & US_FL_BROKEN_FUA) | |
| 801 | + sdev->broken_fua = 1; | |
| 802 | + | |
| 799 | 803 | scsi_change_queue_depth(sdev, devinfo->qdepth - 2); |
| 800 | 804 | return 0; |
| 801 | 805 | } |
| @@ -1987,7 +1987,7 @@ UNUSUAL_DEV( 0x14cd, 0x6600, 0x0201, 0x0201, · 1986 unmodified lines | ||
| 1987 | 1987 | US_FL_IGNORE_RESIDUE ), |
| 1988 | 1988 | |
| 1989 | 1989 | /* Reported by Michael Büsch <m@bues.ch> */ |
| 1990 | −UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0114, | |
| 1990 | +UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116, | |
| 1991 | 1991 | "JMicron", |
| 1992 | 1992 | "USB to ATA/ATAPI Bridge", |
| 1993 | 1993 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| @@ -132,7 +132,7 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, · 131 unmodified lines | ||
| 132 | 132 | "JMicron", |
| 133 | 133 | "JMS567", |
| 134 | 134 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 135 | − US_FL_NO_REPORT_OPCODES), | |
| 135 | + US_FL_BROKEN_FUA | US_FL_NO_REPORT_OPCODES), | |
| 136 | 136 | |
| 137 | 137 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ |
| 138 | 138 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, |
| @@ -47,4 +47,7 @@ · 46 unmodified lines | ||
| 47 | 47 | /* device generates spurious wakeup, ignore remote wakeup capability */ |
| 48 | 48 | #define USB_QUIRK_IGNORE_REMOTE_WAKEUP BIT(9) |
| 49 | 49 | |
| 50 | +/* device can't handle Link Power Management */ | |
| 51 | +#define USB_QUIRK_NO_LPM BIT(10) | |
| 52 | + | |
| 50 | 53 | #endif /* __LINUX_USB_QUIRKS_H */ |