Merge tag 'for-usb-next-2012-09-25' of git://git.kernel.org/pub/scm/linux/kernel...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Sep 2012 22:34:17 +0000 (15:34 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Sep 2012 22:34:17 +0000 (15:34 -0700)
xHCI bug fixes for 3.7

Hi Greg,

Here's three small bug fixes for 3.7.  They fix a NULL pointer deference
and lost USB device unplug events, as well as making sure the xHCI
driver doesn't prevent system suspend.

Sarah Sharp

drivers/usb/host/xhci-pci.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h

index 9bfd4ca1153c32cd51d3468608948a31a3a08953..8345d7c23061c2346b0f1e8d4f826c4c3ed2b7c6 100644 (file)
@@ -103,6 +103,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
                 * PPT chipsets.
                 */
                xhci->quirks |= XHCI_SPURIOUS_REBOOT;
+               xhci->quirks |= XHCI_AVOID_BEI;
        }
        if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
                        pdev->device == PCI_DEVICE_ID_ASROCK_P67) {
index f270e70559bda32ee96e82cae39e570e3f618438..c6ebb176dc4fb33d1307b9068ea7d27728356637 100644 (file)
@@ -3672,7 +3672,9 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
                        } else {
                                td->last_trb = ep_ring->enqueue;
                                field |= TRB_IOC;
-                               if (xhci->hci_version == 0x100) {
+                               if (xhci->hci_version == 0x100 &&
+                                               !(xhci->quirks &
+                                                       XHCI_AVOID_BEI)) {
                                        /* Set BEI bit except for the last td */
                                        if (i < num_tds - 1)
                                                field |= TRB_BEI;
index a4b0ce13fa0c8928806cc5d624ca9e32fa57bb70..8d7fcbbe6ade92df9dab163402be686544ae7f84 100644 (file)
@@ -471,6 +471,8 @@ static bool compliance_mode_recovery_timer_quirk_check(void)
 
        dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME);
        dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+       if (!dmi_product_name || !dmi_sys_vendor)
+               return false;
 
        if (!(strstr(dmi_sys_vendor, "Hewlett-Packard")))
                return false;
@@ -888,7 +890,7 @@ int xhci_suspend(struct xhci_hcd *xhci)
        command &= ~CMD_RUN;
        xhci_writel(xhci, command, &xhci->op_regs->command);
        if (handshake(xhci, &xhci->op_regs->status,
-                     STS_HALT, STS_HALT, 100*100)) {
+                     STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) {
                xhci_warn(xhci, "WARN: xHC CMD_RUN timeout\n");
                spin_unlock_irq(&xhci->lock);
                return -ETIMEDOUT;
index e44e2d3c83b0f43ea4c42365be6ce88c8ef349e0..53df4e70ca074ccc37593f99d09cc6f23d991b25 100644 (file)
@@ -1511,6 +1511,7 @@ struct xhci_hcd {
 #define XHCI_INTEL_HOST                (1 << 12)
 #define XHCI_SPURIOUS_REBOOT   (1 << 13)
 #define XHCI_COMP_MODE_QUIRK   (1 << 14)
+#define XHCI_AVOID_BEI         (1 << 15)
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;
        /* There are two roothubs to keep track of bus suspend info for */