diff options
Diffstat (limited to 'drivers/usb/host/ehci-pci.c')
| -rw-r--r-- | drivers/usb/host/ehci-pci.c | 59 |
1 files changed, 24 insertions, 35 deletions
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index a1bd2bea6deb..cadffacd945b 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
| @@ -76,6 +76,30 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 76 | dbg_hcs_params(ehci, "reset"); | 76 | dbg_hcs_params(ehci, "reset"); |
| 77 | dbg_hcc_params(ehci, "reset"); | 77 | dbg_hcc_params(ehci, "reset"); |
| 78 | 78 | ||
| 79 | /* ehci_init() causes memory for DMA transfers to be | ||
| 80 | * allocated. Thus, any vendor-specific workarounds based on | ||
| 81 | * limiting the type of memory used for DMA transfers must | ||
| 82 | * happen before ehci_init() is called. */ | ||
| 83 | switch (pdev->vendor) { | ||
| 84 | case PCI_VENDOR_ID_NVIDIA: | ||
| 85 | /* NVidia reports that certain chips don't handle | ||
| 86 | * QH, ITD, or SITD addresses above 2GB. (But TD, | ||
| 87 | * data buffer, and periodic schedule are normal.) | ||
| 88 | */ | ||
| 89 | switch (pdev->device) { | ||
| 90 | case 0x003c: /* MCP04 */ | ||
| 91 | case 0x005b: /* CK804 */ | ||
| 92 | case 0x00d8: /* CK8 */ | ||
| 93 | case 0x00e8: /* CK8S */ | ||
| 94 | if (pci_set_consistent_dma_mask(pdev, | ||
| 95 | DMA_31BIT_MASK) < 0) | ||
| 96 | ehci_warn(ehci, "can't enable NVidia " | ||
| 97 | "workaround for >2GB RAM\n"); | ||
| 98 | break; | ||
| 99 | } | ||
| 100 | break; | ||
| 101 | } | ||
| 102 | |||
| 79 | /* cache this readonly data; minimize chip reads */ | 103 | /* cache this readonly data; minimize chip reads */ |
| 80 | ehci->hcs_params = readl(&ehci->caps->hcs_params); | 104 | ehci->hcs_params = readl(&ehci->caps->hcs_params); |
| 81 | 105 | ||
| @@ -88,8 +112,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 88 | if (retval) | 112 | if (retval) |
| 89 | return retval; | 113 | return retval; |
| 90 | 114 | ||
| 91 | /* NOTE: only the parts below this line are PCI-specific */ | ||
| 92 | |||
| 93 | switch (pdev->vendor) { | 115 | switch (pdev->vendor) { |
| 94 | case PCI_VENDOR_ID_TDI: | 116 | case PCI_VENDOR_ID_TDI: |
| 95 | if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { | 117 | if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { |
| @@ -107,19 +129,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 107 | break; | 129 | break; |
| 108 | case PCI_VENDOR_ID_NVIDIA: | 130 | case PCI_VENDOR_ID_NVIDIA: |
| 109 | switch (pdev->device) { | 131 | switch (pdev->device) { |
| 110 | /* NVidia reports that certain chips don't handle | ||
| 111 | * QH, ITD, or SITD addresses above 2GB. (But TD, | ||
| 112 | * data buffer, and periodic schedule are normal.) | ||
| 113 | */ | ||
| 114 | case 0x003c: /* MCP04 */ | ||
| 115 | case 0x005b: /* CK804 */ | ||
| 116 | case 0x00d8: /* CK8 */ | ||
| 117 | case 0x00e8: /* CK8S */ | ||
| 118 | if (pci_set_consistent_dma_mask(pdev, | ||
| 119 | DMA_31BIT_MASK) < 0) | ||
| 120 | ehci_warn(ehci, "can't enable NVidia " | ||
| 121 | "workaround for >2GB RAM\n"); | ||
| 122 | break; | ||
| 123 | /* Some NForce2 chips have problems with selective suspend; | 132 | /* Some NForce2 chips have problems with selective suspend; |
| 124 | * fixed in newer silicon. | 133 | * fixed in newer silicon. |
| 125 | */ | 134 | */ |
| @@ -370,23 +379,3 @@ static struct pci_driver ehci_pci_driver = { | |||
| 370 | .resume = usb_hcd_pci_resume, | 379 | .resume = usb_hcd_pci_resume, |
| 371 | #endif | 380 | #endif |
| 372 | }; | 381 | }; |
| 373 | |||
| 374 | static int __init ehci_hcd_pci_init(void) | ||
| 375 | { | ||
| 376 | if (usb_disabled()) | ||
| 377 | return -ENODEV; | ||
| 378 | |||
| 379 | pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n", | ||
| 380 | hcd_name, | ||
| 381 | sizeof(struct ehci_qh), sizeof(struct ehci_qtd), | ||
| 382 | sizeof(struct ehci_itd), sizeof(struct ehci_sitd)); | ||
| 383 | |||
| 384 | return pci_register_driver(&ehci_pci_driver); | ||
| 385 | } | ||
| 386 | module_init(ehci_hcd_pci_init); | ||
| 387 | |||
| 388 | static void __exit ehci_hcd_pci_cleanup(void) | ||
| 389 | { | ||
| 390 | pci_unregister_driver(&ehci_pci_driver); | ||
| 391 | } | ||
| 392 | module_exit(ehci_hcd_pci_cleanup); | ||
