diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-03-10 21:45:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-03-10 21:45:23 -0400 |
| commit | 2b752acd91ecee926483b5f64a8f8bfe06e081fb (patch) | |
| tree | 8cc17b38613bc75ecd18fdb4cd345a20b1644924 /drivers | |
| parent | f5dbb55b995b77d396fe2204495a0af3e24d28c2 (diff) | |
| parent | 15c4a4e2f1337a442fe6c66266a8829afc8ff96f (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
USB:Update mailing list information in documentation
USB: fix ehci unlink regressions
USB: new ftdi_sio device id
USB: Remove __KERNEL__ check from non-exported gadget.h.
USB: g_printer.h does not need to be "unifdef"ed.
USB: fsl_usb2_udc: fix broken Kconfig
USB: option: add novatel device ids
USB: usbaudio: handle kcalloc failure
USB: cypress_m8: add UPS Powercom (0d9f:0002)
USB: drivers/usb/storage/sddr55.c: fix uninitialized var warnings
USB: fix usb-serial generic recursive lock
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/gadget/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 62 | ||||
| -rw-r--r-- | drivers/usb/serial/cypress_m8.c | 2 | ||||
| -rw-r--r-- | drivers/usb/serial/cypress_m8.h | 4 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 1 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.h | 3 | ||||
| -rw-r--r-- | drivers/usb/serial/generic.c | 10 | ||||
| -rw-r--r-- | drivers/usb/serial/option.c | 75 | ||||
| -rw-r--r-- | drivers/usb/storage/sddr55.c | 4 |
9 files changed, 127 insertions, 36 deletions
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index c13955164686..6f45dd669b33 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -131,7 +131,7 @@ config USB_ATMEL_USBA | |||
| 131 | 131 | ||
| 132 | config USB_GADGET_FSL_USB2 | 132 | config USB_GADGET_FSL_USB2 |
| 133 | boolean "Freescale Highspeed USB DR Peripheral Controller" | 133 | boolean "Freescale Highspeed USB DR Peripheral Controller" |
| 134 | depends on MPC834x || PPC_MPC831x | 134 | depends on FSL_SOC |
| 135 | select USB_GADGET_DUALSPEED | 135 | select USB_GADGET_DUALSPEED |
| 136 | help | 136 | help |
| 137 | Some of Freescale PowerPC processors have a High Speed | 137 | Some of Freescale PowerPC processors have a High Speed |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index b8ad55aff842..46ee7f4c0912 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -281,23 +281,44 @@ static void ehci_iaa_watchdog(unsigned long param) | |||
| 281 | { | 281 | { |
| 282 | struct ehci_hcd *ehci = (struct ehci_hcd *) param; | 282 | struct ehci_hcd *ehci = (struct ehci_hcd *) param; |
| 283 | unsigned long flags; | 283 | unsigned long flags; |
| 284 | u32 status, cmd; | ||
| 285 | 284 | ||
| 286 | spin_lock_irqsave (&ehci->lock, flags); | 285 | spin_lock_irqsave (&ehci->lock, flags); |
| 287 | WARN_ON(!ehci->reclaim); | ||
| 288 | 286 | ||
| 289 | status = ehci_readl(ehci, &ehci->regs->status); | 287 | /* Lost IAA irqs wedge things badly; seen first with a vt8235. |
| 290 | cmd = ehci_readl(ehci, &ehci->regs->command); | 288 | * So we need this watchdog, but must protect it against both |
| 291 | ehci_dbg(ehci, "IAA watchdog: status %x cmd %x\n", status, cmd); | 289 | * (a) SMP races against real IAA firing and retriggering, and |
| 292 | 290 | * (b) clean HC shutdown, when IAA watchdog was pending. | |
| 293 | /* lost IAA irqs wedge things badly; seen first with a vt8235 */ | 291 | */ |
| 294 | if (ehci->reclaim) { | 292 | if (ehci->reclaim |
| 295 | if (status & STS_IAA) { | 293 | && !timer_pending(&ehci->iaa_watchdog) |
| 296 | ehci_vdbg (ehci, "lost IAA\n"); | 294 | && HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) { |
| 295 | u32 cmd, status; | ||
| 296 | |||
| 297 | /* If we get here, IAA is *REALLY* late. It's barely | ||
| 298 | * conceivable that the system is so busy that CMD_IAAD | ||
| 299 | * is still legitimately set, so let's be sure it's | ||
| 300 | * clear before we read STS_IAA. (The HC should clear | ||
| 301 | * CMD_IAAD when it sets STS_IAA.) | ||
| 302 | */ | ||
| 303 | cmd = ehci_readl(ehci, &ehci->regs->command); | ||
| 304 | if (cmd & CMD_IAAD) | ||
| 305 | ehci_writel(ehci, cmd & ~CMD_IAAD, | ||
| 306 | &ehci->regs->command); | ||
| 307 | |||
| 308 | /* If IAA is set here it either legitimately triggered | ||
| 309 | * before we cleared IAAD above (but _way_ late, so we'll | ||
| 310 | * still count it as lost) ... or a silicon erratum: | ||
| 311 | * - VIA seems to set IAA without triggering the IRQ; | ||
| 312 | * - IAAD potentially cleared without setting IAA. | ||
| 313 | */ | ||
| 314 | status = ehci_readl(ehci, &ehci->regs->status); | ||
| 315 | if ((status & STS_IAA) || !(cmd & CMD_IAAD)) { | ||
| 297 | COUNT (ehci->stats.lost_iaa); | 316 | COUNT (ehci->stats.lost_iaa); |
| 298 | ehci_writel(ehci, STS_IAA, &ehci->regs->status); | 317 | ehci_writel(ehci, STS_IAA, &ehci->regs->status); |
| 299 | } | 318 | } |
| 300 | ehci_writel(ehci, cmd & ~CMD_IAAD, &ehci->regs->command); | 319 | |
| 320 | ehci_vdbg(ehci, "IAA watchdog: status %x cmd %x\n", | ||
| 321 | status, cmd); | ||
| 301 | end_unlink_async(ehci); | 322 | end_unlink_async(ehci); |
| 302 | } | 323 | } |
| 303 | 324 | ||
| @@ -631,7 +652,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
| 631 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) | 652 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) |
| 632 | { | 653 | { |
| 633 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 654 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
| 634 | u32 status, pcd_status = 0; | 655 | u32 status, pcd_status = 0, cmd; |
| 635 | int bh; | 656 | int bh; |
| 636 | 657 | ||
| 637 | spin_lock (&ehci->lock); | 658 | spin_lock (&ehci->lock); |
| @@ -652,7 +673,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 652 | 673 | ||
| 653 | /* clear (just) interrupts */ | 674 | /* clear (just) interrupts */ |
| 654 | ehci_writel(ehci, status, &ehci->regs->status); | 675 | ehci_writel(ehci, status, &ehci->regs->status); |
| 655 | ehci_readl(ehci, &ehci->regs->command); /* unblock posted write */ | 676 | cmd = ehci_readl(ehci, &ehci->regs->command); |
| 656 | bh = 0; | 677 | bh = 0; |
| 657 | 678 | ||
| 658 | #ifdef EHCI_VERBOSE_DEBUG | 679 | #ifdef EHCI_VERBOSE_DEBUG |
| @@ -673,8 +694,17 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 673 | 694 | ||
| 674 | /* complete the unlinking of some qh [4.15.2.3] */ | 695 | /* complete the unlinking of some qh [4.15.2.3] */ |
| 675 | if (status & STS_IAA) { | 696 | if (status & STS_IAA) { |
| 676 | COUNT (ehci->stats.reclaim); | 697 | /* guard against (alleged) silicon errata */ |
| 677 | end_unlink_async(ehci); | 698 | if (cmd & CMD_IAAD) { |
| 699 | ehci_writel(ehci, cmd & ~CMD_IAAD, | ||
| 700 | &ehci->regs->command); | ||
| 701 | ehci_dbg(ehci, "IAA with IAAD still set?\n"); | ||
| 702 | } | ||
| 703 | if (ehci->reclaim) { | ||
| 704 | COUNT(ehci->stats.reclaim); | ||
| 705 | end_unlink_async(ehci); | ||
| 706 | } else | ||
| 707 | ehci_dbg(ehci, "IAA with nothing to reclaim?\n"); | ||
| 678 | } | 708 | } |
| 679 | 709 | ||
| 680 | /* remote wakeup [4.3.1] */ | 710 | /* remote wakeup [4.3.1] */ |
| @@ -781,7 +811,7 @@ static int ehci_urb_enqueue ( | |||
| 781 | static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) | 811 | static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) |
| 782 | { | 812 | { |
| 783 | /* failfast */ | 813 | /* failfast */ |
| 784 | if (!HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) | 814 | if (!HC_IS_RUNNING(ehci_to_hcd(ehci)->state) && ehci->reclaim) |
| 785 | end_unlink_async(ehci); | 815 | end_unlink_async(ehci); |
| 786 | 816 | ||
| 787 | /* if it's not linked then there's nothing to do */ | 817 | /* if it's not linked then there's nothing to do */ |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 08c65c1a3771..779d07851a4d 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -94,6 +94,7 @@ static struct usb_device_id id_table_earthmate [] = { | |||
| 94 | 94 | ||
| 95 | static struct usb_device_id id_table_cyphidcomrs232 [] = { | 95 | static struct usb_device_id id_table_cyphidcomrs232 [] = { |
| 96 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 96 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
| 97 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | ||
| 97 | { } /* Terminating entry */ | 98 | { } /* Terminating entry */ |
| 98 | }; | 99 | }; |
| 99 | 100 | ||
| @@ -106,6 +107,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 106 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, | 107 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, |
| 107 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, | 108 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, |
| 108 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 109 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
| 110 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | ||
| 109 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, | 111 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, |
| 110 | { } /* Terminating entry */ | 112 | { } /* Terminating entry */ |
| 111 | }; | 113 | }; |
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index e1c7c27e18b7..0388065bb794 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h | |||
| @@ -19,6 +19,10 @@ | |||
| 19 | #define VENDOR_ID_CYPRESS 0x04b4 | 19 | #define VENDOR_ID_CYPRESS 0x04b4 |
| 20 | #define PRODUCT_ID_CYPHIDCOM 0x5500 | 20 | #define PRODUCT_ID_CYPHIDCOM 0x5500 |
| 21 | 21 | ||
| 22 | /* Powercom UPS, chip CY7C63723 */ | ||
| 23 | #define VENDOR_ID_POWERCOM 0x0d9f | ||
| 24 | #define PRODUCT_ID_UPS 0x0002 | ||
| 25 | |||
| 22 | /* Nokia CA-42 USB to serial cable */ | 26 | /* Nokia CA-42 USB to serial cable */ |
| 23 | #define VENDOR_ID_DAZZLE 0x07d0 | 27 | #define VENDOR_ID_DAZZLE 0x07d0 |
| 24 | #define PRODUCT_ID_CA42 0x4101 | 28 | #define PRODUCT_ID_CA42 0x4101 |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 91dc433dbcf1..3abb3c863647 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -359,6 +359,7 @@ static struct | |||
