diff options
| -rw-r--r-- | drivers/ata/ata_generic.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index d4ccf74c4c94..7107a6929deb 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
| @@ -32,6 +32,11 @@ | |||
| 32 | * A generic parallel ATA driver using libata | 32 | * A generic parallel ATA driver using libata |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | enum { | ||
| 36 | ATA_GEN_CLASS_MATCH = (1 << 0), | ||
| 37 | ATA_GEN_FORCE_DMA = (1 << 1), | ||
| 38 | }; | ||
| 39 | |||
| 35 | /** | 40 | /** |
| 36 | * generic_set_mode - mode setting | 41 | * generic_set_mode - mode setting |
| 37 | * @link: link to set up | 42 | * @link: link to set up |
| @@ -46,13 +51,17 @@ | |||
| 46 | static int generic_set_mode(struct ata_link *link, struct ata_device **unused) | 51 | static int generic_set_mode(struct ata_link *link, struct ata_device **unused) |
| 47 | { | 52 | { |
| 48 | struct ata_port *ap = link->ap; | 53 | struct ata_port *ap = link->ap; |
| 54 | const struct pci_device_id *id = ap->host->private_data; | ||
| 49 | int dma_enabled = 0; | 55 | int dma_enabled = 0; |
| 50 | struct ata_device *dev; | 56 | struct ata_device *dev; |
| 51 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 57 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 52 | 58 | ||
| 53 | /* Bits 5 and 6 indicate if DMA is active on master/slave */ | 59 | if (id->driver_data & ATA_GEN_FORCE_DMA) { |
| 54 | if (ap->ioaddr.bmdma_addr) | 60 | dma_enabled = 0xff; |
| 61 | } else if (ap->ioaddr.bmdma_addr) { | ||
| 62 | /* Bits 5 and 6 indicate if DMA is active on master/slave */ | ||
| 55 | dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); | 63 | dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); |
| 64 | } | ||
| 56 | 65 | ||
| 57 | if (pdev->vendor == PCI_VENDOR_ID_CENATEK) | 66 | if (pdev->vendor == PCI_VENDOR_ID_CENATEK) |
| 58 | dma_enabled = 0xFF; | 67 | dma_enabled = 0xFF; |
| @@ -126,7 +135,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id | |||
| 126 | const struct ata_port_info *ppi[] = { &info, NULL }; | 135 | const struct ata_port_info *ppi[] = { &info, NULL }; |
| 127 | 136 | ||
| 128 | /* Don't use the generic entry unless instructed to do so */ | 137 | /* Don't use the generic entry unless instructed to do so */ |
| 129 | if (id->driver_data == 1 && all_generic_ide == 0) | 138 | if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0) |
| 130 | return -ENODEV; | 139 | return -ENODEV; |
| 131 | 140 | ||
| 132 | /* Devices that need care */ | 141 | /* Devices that need care */ |
| @@ -155,7 +164,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id | |||
| 155 | return rc; | 164 | return rc; |
| 156 | pcim_pin_device(dev); | 165 | pcim_pin_device(dev); |
| 157 | } | 166 | } |
| 158 | return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, NULL, 0); | 167 | return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0); |
| 159 | } | 168 | } |
| 160 | 169 | ||
| 161 | static struct pci_device_id ata_generic[] = { | 170 | static struct pci_device_id ata_generic[] = { |
| @@ -167,13 +176,15 @@ static struct pci_device_id ata_generic[] = { | |||
| 167 | { PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), }, | 176 | { PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), }, |
| 168 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), }, | 177 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), }, |
| 169 | { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), }, | 178 | { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), }, |
| 170 | { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), }, | 179 | { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), |
| 180 | .driver_data = ATA_GEN_FORCE_DMA }, | ||
| 171 | /* | 181 | /* |
| 172 | * For some reason, MCP89 on MacBook 7,1 doesn't work with | 182 | * For some reason, MCP89 on MacBook 7,1 doesn't work with |
| 173 | * ahci, use ata_generic instead. | 183 | * ahci, use ata_generic instead. |
| 174 | */ | 184 | */ |
| 175 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA, | 185 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA, |
| 176 | PCI_VENDOR_ID_APPLE, 0xcb89, }, | 186 | PCI_VENDOR_ID_APPLE, 0xcb89, |
| 187 | .driver_data = ATA_GEN_FORCE_DMA }, | ||
| 177 | #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE) | 188 | #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE) |
| 178 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), }, | 189 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), }, |
| 179 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), }, | 190 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), }, |
| @@ -181,7 +192,8 @@ static struct pci_device_id ata_generic[] = { | |||
| 181 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), }, | 192 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), }, |
| 182 | #endif | 193 | #endif |
| 183 | /* Must come last. If you add entries adjust this table appropriately */ | 194 | /* Must come last. If you add entries adjust this table appropriately */ |
| 184 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 1}, | 195 | { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL), |
| 196 | .driver_data = ATA_GEN_CLASS_MATCH }, | ||
| 185 | { 0, }, | 197 | { 0, }, |
| 186 | }; | 198 | }; |
| 187 | 199 | ||
