aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2013-08-15 21:00:46 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2013-08-15 21:00:46 -0400
commit5845c13a70b40f1ce4dfe83acb7796bed8a60672 (patch)
tree94408827a9da0a2e16cd189692cbb425345e92a8 /drivers/usb
parent224563b6ce034b82f8511969d9496113da34fb2c (diff)
parent52fb61250a7a132b0cfb9f4a1060a1f3c49e5a25 (diff)
Merge tag 'for-usb-2013-08-15-step-1' into for-usb-next
xhci: Step 1 to fix usb-linus and usb-next. Hi Greg, This is the first of three steps to fix your usb-linus and usb-next trees. As I mentioned, commit 4fae6f0fa86f92e6bc7429371b1e177ad0aaac66 "USB: handle LPM errors during device suspend correctly" was incorrectly added to usb-next when it should have been added to usb-linus and marked for stable. Two port power off bug fixes touch the same code that patch touches, but it's not easy to simply move commit 4fae6f0f patch to usb-linus because commit 28e861658e23ca94692f98e245d254c75c8088a7 "USB: refactor code for enabling/disabling remote wakeup" also touched those code sections. I propose a two step process to fix this: 1. Pull these four patches into usb-linus. 2. Revert commit 28e861658e23ca94692f98e245d254c75c8088a7 from usb-next. Merge usb-linus into usb-next, and resolve the conflicts. I will be sending pull requests for these steps. This pull request is step one, and contains the backported version of commit 4fae6f0fa86f92e6bc7429371b1e177ad0aaac66, the two port power off fixes, and an unrelated xhci-plat bug fix. Sarah Sharp Resolved conflicts: drivers/usb/core/hub.c
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/class/usbtmc.c8
-rw-r--r--drivers/usb/core/hub.c14
-rw-r--r--drivers/usb/core/port.c13
-rw-r--r--drivers/usb/core/quirks.c6
-rw-r--r--drivers/usb/host/ehci-sched.c13
-rw-r--r--drivers/usb/host/xhci-mem.c1
-rw-r--r--drivers/usb/host/xhci-plat.c2
-rw-r--r--drivers/usb/host/xhci.c8
-rw-r--r--drivers/usb/host/xhci.h1
-rw-r--r--drivers/usb/misc/adutux.c2
-rw-r--r--drivers/usb/serial/keyspan.c2
-rw-r--r--drivers/usb/serial/mos7720.c21
-rw-r--r--drivers/usb/serial/mos7840.c2
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.c9
-rw-r--r--drivers/usb/serial/usb_wwan.c20
-rw-r--r--drivers/usb/wusbcore/wa-xfer.c9
16 files changed, 72 insertions, 59 deletions
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index 60dd8918aeb9..66c4001306f0 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -1117,11 +1117,11 @@ static int usbtmc_probe(struct usb_interface *intf,
1117 /* Determine if it is a Rigol or not */ 1117 /* Determine if it is a Rigol or not */
1118 data->rigol_quirk = 0; 1118 data->rigol_quirk = 0;
1119 dev_dbg(&intf->dev, "Trying to find if device Vendor 0x%04X Product 0x%04X has the RIGOL quirk\n", 1119 dev_dbg(&intf->dev, "Trying to find if device Vendor 0x%04X Product 0x%04X has the RIGOL quirk\n",
1120 data->usb_dev->descriptor.idVendor, 1120 le16_to_cpu(data->usb_dev->descriptor.idVendor),
1121 data->usb_dev->descriptor.idProduct); 1121 le16_to_cpu(data->usb_dev->descriptor.idProduct));
1122 for(n = 0; usbtmc_id_quirk[n].idVendor > 0; n++) { 1122 for(n = 0; usbtmc_id_quirk[n].idVendor > 0; n++) {
1123 if ((usbtmc_id_quirk[n].idVendor == data->usb_dev->descriptor.idVendor) && 1123 if ((usbtmc_id_quirk[n].idVendor == le16_to_cpu(data->usb_dev->descriptor.idVendor)) &&
1124 (usbtmc_id_quirk[n].idProduct == data->usb_dev->descriptor.idProduct)) { 1124 (usbtmc_id_quirk[n].idProduct == le16_to_cpu(data->usb_dev->descriptor.idProduct))) {
1125 dev_dbg(&intf->dev, "Setting this device as having the RIGOL quirk\n"); 1125 dev_dbg(&intf->dev, "Setting this device as having the RIGOL quirk\n");
1126 data->rigol_quirk = 1; 1126 data->rigol_quirk = 1;
1127 break; 1127 break;
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 5d6d28a76e0a..175179eb17ee 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -3054,19 +3054,9 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
3054 usb_set_device_state(udev, USB_STATE_SUSPENDED); 3054 usb_set_device_state(udev, USB_STATE_SUSPENDED);
3055 } 3055 }
3056 3056
3057 /*
3058 * Check whether current status meets the requirement of
3059 * usb port power off mechanism
3060 */
3061 if (status == 0 && !udev->do_remote_wakeup && udev->persist_enabled) { 3057 if (status == 0 && !udev->do_remote_wakeup && udev->persist_enabled) {
3062 enum pm_qos_flags_status pm_qos_stat; 3058 pm_runtime_put_sync(&port_dev->dev);
3063 3059 port_dev->did_runtime_put = true;
3064 pm_qos_stat = dev_pm_qos_flags(&port_dev->dev,
3065 PM_QOS_FLAG_NO_POWER_OFF);
3066 if (pm_qos_stat != PM_QOS_FLAGS_ALL) {
3067 pm_runtime_put_sync(&port_dev->dev);
3068 port_dev->did_runtime_put = true;
3069 }
3070 } 3060 }
3071 3061
3072 usb_mark_last_busy(hub->hdev); 3062 usb_mark_last_busy(hub->hdev);
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index d6b0fadf53e9..9909911665ce 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -89,22 +89,19 @@ static int usb_port_runtime_resume(struct device *dev)
89 retval = usb_hub_set_port_power(hdev, hub, port1, true); 89 retval = usb_hub_set_port_power(hdev, hub, port1, true);
90 if (port_dev->child && !retval) { 90 if (port_dev->child && !retval) {
91 /* 91 /*
92 * Wait for usb hub port to be reconnected in order to make 92 * Attempt to wait for usb hub port to be reconnected in order
93 * the resume procedure successful. 93 * to make the resume procedure successful. The device may have
94 * disconnected while the port was powered off, so ignore the
95 * return status.
94 */ 96 */
95 retval = hub_port_debounce_be_connected(hub, port1); 97 retval = hub_port_debounce_be_connected(hub, port1);
96 if (retval < 0) { 98 if (retval < 0)
97 dev_dbg(&port_dev->dev, "can't get reconnection after setting port power on, status %d\n", 99 dev_dbg(&port_dev->dev, "can't get reconnection after setting port power on, status %d\n",
98 retval); 100 retval);
99 goto out;
100 }
101 usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_ENABLE); 101 usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_ENABLE);
102
103 /* Set return value to 0 if debounce successful */
104 retval = 0; 102 retval = 0;
105 } 103 }
106 104
107out:
108 clear_bit(port1, hub->busy_bits); 105 clear_bit(port1, hub->busy_bits);
109 usb_autopm_put_interface(intf); 106 usb_autopm_put_interface(intf);
110 return retval; 107 return retval;
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index a63598895077..5b44cd47da5b 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -78,6 +78,12 @@ static const struct usb_device_id usb_quirk_list[] = {
78 { USB_DEVICE(0x04d8, 0x000c), .driver_info = 78 { USB_DEVICE(0x04d8, 0x000c), .driver_info =
79 USB_QUIRK_CONFIG_INTF_STRINGS }, 79 USB_QUIRK_CONFIG_INTF_STRINGS },
80 80
81 /* CarrolTouch 4000U */
82 { USB_DEVICE(0x04e7, 0x0009), .driver_info = USB_QUIRK_RESET_RESUME },
83
84 /* CarrolTouch 4500U */
85 { USB_DEVICE(0x04e7, 0x0030), .driver_info = USB_QUIRK_RESET_RESUME },
86
81 /* Samsung Android phone modem - ID conflict with SPH-I500 */ 87 /* Samsung Android phone modem - ID conflict with SPH-I500 */
82 { USB_DEVICE(0x04e8, 0x6601), .driver_info = 88 { USB_DEVICE(0x04e8, 0x6601), .driver_info =
83 USB_QUIRK_CONFIG_INTF_STRINGS }, 89 USB_QUIRK_CONFIG_INTF_STRINGS },
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index 94388738a6f7..66310894ad97 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -1434,21 +1434,20 @@ iso_stream_schedule (
1434 1434
1435 /* Behind the scheduling threshold? */ 1435 /* Behind the scheduling threshold? */
1436 if (unlikely(start < next)) { 1436 if (unlikely(start < next)) {
1437 unsigned now2 = (now - base) & (mod - 1);
1437 1438
1438 /* USB_ISO_ASAP: Round up to the first available slot */ 1439 /* USB_ISO_ASAP: Round up to the first available slot */
1439 if (urb->transfer_flags & URB_ISO_ASAP) 1440 if (urb->transfer_flags & URB_ISO_ASAP)
1440 start += (next - start + period - 1) & -period; 1441 start += (next - start + period - 1) & -period;
1441 1442
1442 /* 1443 /*
1443 * Not ASAP: Use the next slot in the stream. If 1444 * Not ASAP: Use the next slot in the stream,
1444 * the entire URB falls before the threshold, fail. 1445 * no matter what.
1445 */ 1446 */
1446 else if (start + span - period < next) { 1447 else if (start + span - period < now2) {
1447 ehci_dbg(ehci, "iso urb late %p (%u+%u < %u)\n", 1448 ehci_dbg(ehci, "iso underrun %p (%u+%u < %u)\n",
1448 urb, start + base, 1449 urb, start + base,
1449 span - period, next + base); 1450 span - period, now2 + base);
1450 status = -EXDEV;
1451 goto fail;
1452 } 1451 }
1453 } 1452 }
1454 1453
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index b150360d1e78..53b972c2a09f 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -24,6 +24,7 @@
24#include <linux/pci.h> 24#include <linux/pci.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/dmapool.h> 26#include <linux/dmapool.h>
27#include <linux/dma-mapping.h>
27 28
28#include "xhci.h" 29#include "xhci.h"
29#include "xhci-trace.h" 30#include "xhci-trace.h"
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index be5e70d2300c..d9c169f470d3 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -26,7 +26,7 @@ static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci)
26 * here that the generic code does not try to make a pci_dev from our 26 * here that the generic code does not try to make a pci_dev from our
27 * dev struct in order to setup MSI 27 * dev struct in order to setup MSI
28 */ 28 */
29 xhci->quirks |= XHCI_BROKEN_MSI; 29 xhci->quirks |= XHCI_PLAT;
30} 30}
31 31
32/* called during probe() after chip reset completes */ 32/* called during probe() after chip reset completes */
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 7299b591a341..ba0ec0a96481 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -27,6 +27,7 @@
27#include <linux/moduleparam.h> 27#include <linux/moduleparam.h>
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/dmi.h> 29#include <linux/dmi.h>
30#include <linux/dma-mapping.h>
30 31
31#include "xhci.h" 32#include "xhci.h"
32#include "xhci-trace.h" 33#include "xhci-trace.h"
@@ -347,9 +348,14 @@ static void __maybe_unused xhci_msix_sync_irqs(struct xhci_hcd *xhci)
347static int xhci_try_enable_msi(struct usb_hcd *hcd) 348static int xhci_try_enable_msi(struct usb_hcd *hcd)
348{ 349{
349 struct xhci_hcd *xhci = hcd_to_xhci(hcd); 350 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
350 struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); 351 struct pci_dev *pdev;
351 int ret; 352 int ret;
352 353
354 /* The xhci platform device has set up IRQs through usb_add_hcd. */
355 if (xhci->quirks & XHCI_PLAT)
356 return 0;
357
358 pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller);
353 /* 359 /*
354 * Some Fresco Logic host controllers advertise MSI, but fail to 360 * Some Fresco Logic host controllers advertise MSI, but fail to
355 * generate interrupts. Don't even try to enable MSI. 361 * generate interrupts. Don't even try to enable MSI.
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index d2045916531b..46aa14894148 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1537,6 +1537,7 @@ struct xhci_hcd {
1537#define XHCI_SPURIOUS_REBOOT (1 << 13) 1537#define XHCI_SPURIOUS_REBOOT (1 << 13)
1538#define XHCI_COMP_MODE_QUIRK (1 << 14) 1538#define XHCI_COMP_MODE_QUIRK (1 << 14)
1539#define XHCI_AVOID_BEI (1 << 15) 1539#define XHCI_AVOID_BEI (1 << 15)
1540#define XHCI_PLAT (1 << 16)
1540 unsigned int num_active_eps; 1541 unsigned int num_active_eps;
1541 unsigned int limit_active_eps; 1542 unsigned int limit_active_eps;
1542 /* There are two roothubs to keep track of bus suspend info for */ 1543 /* There are two roothubs to keep track of bus suspend info for */
diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c
index 7078e9bf0fc0..3eaa83f05086 100644
--- a/drivers/usb/misc/adutux.c
+++ b/drivers/usb/misc/adutux.c
@@ -783,7 +783,7 @@ static int adu_probe(struct usb_interface *interface,
783 783
784 /* let the user know what node this device is now attached to */ 784 /* let the user know what node this device is now attached to */
785 dev_info(&interface->dev, "ADU%d %s now attached to /dev/usb/adutux%d\n", 785 dev_info(&interface->dev, "ADU%d %s now attached to /dev/usb/adutux%d\n",
786 udev->descriptor.idProduct, dev->serial_number, 786 le16_to_cpu(udev->descriptor.idProduct), dev->serial_number,
787 (dev->minor - ADU_MINOR_BASE)); 787 (dev->minor - ADU_MINOR_BASE));
788exit: 788exit:
789 return retval; 789 return retval;
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index e731bbc166a0..d6960aebe246 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -2307,7 +2307,7 @@ static int keyspan_startup(struct usb_serial *serial)
2307 if (d_details == NULL) { 2307 if (d_details == NULL) {
2308 dev_err(&serial->dev->dev, "%s - unknown product id %x\n", 2308 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2309 __func__, le16_to_cpu(serial->dev->descriptor.idProduct)); 2309 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2310 return 1; 2310 return -ENODEV;
2311 } 2311 }
2312 2312
2313 /* Setup private data for serial driver */ 2313 /* Setup private data for serial driver */
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index 51da424327b0..b01300164fc0 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -90,6 +90,7 @@ struct urbtracker {
90 struct list_head urblist_entry; 90 struct list_head urblist_entry;
91 struct kref ref_count; 91 struct kref ref_count;
92 struct urb *urb; 92 struct urb *urb;
93 struct usb_ctrlrequest *setup;
93}; 94};
94 95
95enum mos7715_pp_modes { 96enum mos7715_pp_modes {
@@ -271,6 +272,7 @@ static void destroy_urbtracker(struct kref *kref)
271 struct mos7715_parport *mos_parport = urbtrack->mos_parport; 272 struct mos7715_parport *mos_parport = urbtrack->mos_parport;
272 273
273 usb_free_urb(urbtrack->urb); 274 usb_free_urb(urbtrack->urb);
275 kfree(urbtrack->setup);
274 kfree(urbtrack); 276 kfree(urbtrack);
275 kref_put(&mos_parport->ref_count, destroy_mos_parport); 277 kref_put(&mos_parport->ref_count, destroy_mos_parport);
276} 278}
@@ -355,7 +357,6 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
355 struct urbtracker *urbtrack; 357 struct urbtracker *urbtrack;
356 int ret_val; 358 int ret_val;
357 unsigned long flags; 359 unsigned long flags;
358 struct usb_ctrlrequest setup;
359 struct usb_serial *serial = mos_parport->serial; 360 struct usb_serial *serial = mos_parport->serial;
360 struct usb_device *usbdev = serial->dev; 361 struct usb_device *usbdev = serial->dev;
361 362
@@ -373,14 +374,20 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
373 kfree(urbtrack); 374 kfree(urbtrack);
374 return -ENOMEM; 375 return -ENOMEM;
375 } 376 }
376 setup.bRequestType = (__u8)0x40; 377 urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_KERNEL);
377 setup.bRequest = (__u8)0x0e; 378 if (!urbtrack->setup) {
378 setup.wValue = get_reg_value(reg, dummy); 379 usb_free_urb(urbtrack->urb);
379 setup.wIndex = get_reg_index(reg); 380 kfree(urbtrack);
380 setup.wLength = 0; 381 return -ENOMEM;
382 }
383 urbtrack->setup->bRequestType = (__u8)0x40;
384 urbtrack->setup->bRequest = (__u8)0x0e;
385 urbtrack->setup->wValue = get_reg_value(reg, dummy);
386 urbtrack->setup->wIndex = get_reg_index(reg);
387 urbtrack->setup->wLength = 0;
381 usb_fill_control_urb(urbtrack->urb, usbdev, 388 usb_fill_control_urb(urbtrack->urb, usbdev,
382 usb_sndctrlpipe(usbdev, 0), 389 usb_sndctrlpipe(usbdev, 0),
383 (unsigned char *)&setup, 390 (unsigned char *)urbtrack->setup,
384 NULL, 0, async_complete, urbtrack); 391 NULL, 0, async_complete, urbtrack);
385 kref_init(&urbtrack->ref_count); 392 kref_init(&urbtrack->ref_count);
386 INIT_LIST_HEAD(&urbtrack->urblist_entry); 393 INIT_LIST_HEAD(&urbtrack->urblist_entry);
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index dfa678906632..fdf953539c62 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -2145,7 +2145,7 @@ static int mos7810_check(struct usb_serial *serial)
2145static int mos7840_probe(struct usb_serial *serial, 2145static int mos7840_probe(struct usb_serial *serial,
2146 const struct usb_device_id *id) 2146 const struct usb_device_id *id)
2147{ 2147{
2148 u16 product = serial->dev->descriptor.idProduct; 2148 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
2149 u8 *buf; 2149 u8 *buf;
2150 int device_type; 2150 int device_type;
2151 2151
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
index 5c07d55ece7a..760b78560f67 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -1463,14 +1463,15 @@ static int ti_download_firmware(struct ti_device *tdev)
1463 char buf[32]; 1463 char buf[32];
1464 1464
1465 /* try ID specific firmware first, then try generic firmware */ 1465 /* try ID specific firmware first, then try generic firmware */
1466 sprintf(buf, "ti_usb-v%04x-p%04x.fw", dev->descriptor.idVendor, 1466 sprintf(buf, "ti_usb-v%04x-p%04x.fw",
1467 dev->descriptor.idProduct); 1467 le16_to_cpu(dev->descriptor.idVendor),
1468 le16_to_cpu(dev->descriptor.idProduct));
1468 status = request_firmware(&fw_p, buf, &dev->dev); 1469 status = request_firmware(&fw_p, buf, &dev->dev);
1469 1470
1470 if (status != 0) { 1471 if (status != 0) {
1471 buf[0] = '\0'; 1472 buf[0] = '\0';
1472 if (dev->descriptor.idVendor == MTS_VENDOR_ID) { 1473 if (le16_to_cpu(dev->descriptor.idVendor) == MTS_VENDOR_ID) {
1473 switch (dev->descriptor.idProduct) { 1474 switch (le16_to_cpu(dev->descriptor.idProduct)) {
1474 case MTS_CDMA_PRODUCT_ID: 1475 case MTS_CDMA_PRODUCT_ID:
1475 strcpy(buf, "mts_cdma.fw"); 1476 strcpy(buf, "mts_cdma.fw");
1476 break; 1477 break;
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c
index 8257d30c4072..85365784040b 100644
--- a/drivers/usb/serial/usb_wwan.c
+++ b/drivers/usb/serial/usb_wwan.c
@@ -291,18 +291,18 @@ static void usb_wwan_indat_callback(struct urb *urb)
291 tty_flip_buffer_push(&port->port); 291 tty_flip_buffer_push(&port->port);
292 } else 292 } else
293 dev_dbg(dev, "%s: empty read urb received\n", __func__); 293 dev_dbg(dev, "%s: empty read urb received\n", __func__);
294 294 }
295 /* Resubmit urb so we continue receiving */ 295 /* Resubmit urb so we continue receiving */
296 err = usb_submit_urb(urb, GFP_ATOMIC); 296 err = usb_submit_urb(urb, GFP_ATOMIC);
297 if (err) { 297 if (err) {
298 if (err != -EPERM) { 298 if (err != -EPERM) {
299 dev_err(dev, "%s: resubmit read urb failed. (%d)\n", __func__, err); 299 dev_err(dev, "%s: resubmit read urb failed. (%d)\n",
300 /* busy also in error unless we are killed */ 300 __func__, err);
301 usb_mark_last_busy(port->serial->dev); 301 /* busy also in error unless we are killed */
302 }
303 } else {
304 usb_mark_last_busy(port->serial->dev); 302 usb_mark_last_busy(port->serial->dev);
305 } 303 }
304 } else {
305 usb_mark_last_busy(port->serial->dev);
306 } 306 }
307} 307}
308 308
diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c
index f5c81afc6e96..cef940f4de7c 100644
--- a/drivers/usb/wusbcore/wa-xfer.c
+++ b/drivers/usb/wusbcore/wa-xfer.c
@@ -1231,6 +1231,12 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb)
1231 } 1231 }
1232 spin_lock_irqsave(&xfer->lock, flags); 1232 spin_lock_irqsave(&xfer->lock, flags);
1233 rpipe = xfer->ep->hcpriv; 1233 rpipe = xfer->ep->hcpriv;
1234 if (rpipe == NULL) {
1235 pr_debug("%s: xfer id 0x%08X has no RPIPE. %s",
1236 __func__, wa_xfer_id(xfer),
1237 "Probably already aborted.\n" );
1238 goto out_unlock;
1239 }
1234 /* Check the delayed list -> if there, release and complete */ 1240 /* Check the delayed list -> if there, release and complete */
1235 spin_lock_irqsave(&wa->xfer_list_lock, flags2); 1241 spin_lock_irqsave(&wa->xfer_list_lock, flags2);
1236 if (!list_empty(&xfer->list_node) && xfer->seg == NULL) 1242 if (!list_empty(&xfer->list_node) && xfer->seg == NULL)
@@ -1649,8 +1655,7 @@ static void wa_xfer_result_cb(struct urb *urb)
1649 break; 1655 break;
1650 } 1656 }
1651 usb_status = xfer_result->bTransferStatus & 0x3f; 1657 usb_status = xfer_result->bTransferStatus & 0x3f;
1652 if (usb_status == WA_XFER_STATUS_ABORTED 1658 if (usb_status == WA_XFER_STATUS_NOT_FOUND)
1653 || usb_status == WA_XFER_STATUS_NOT_FOUND)
1654 /* taken care of already */ 1659 /* taken care of already */
1655 break; 1660 break;
1656 xfer_id = xfer_result->dwTransferID; 1661 xfer_id = xfer_result->dwTransferID;