ata_generic: implement ATA_GEN_* flags and force enable DMA on MBP 7,1
IDE mode of MCP89 on MBP 7,1 doesn't set DMA enable bits in the BMDMA status register. Make the following changes to work around the problem. * Instead of using hard coded 1 in id->driver_data as class code match, use ATA_GEN_CLASS_MATCH and carry the matched id in host->private_data. * Instead of matching PCI_VENDOR_ID_CENATEK, use ATA_GEN_FORCE_DMA flag in id instead. * Add ATA_GEN_FORCE_DMA to the id entry of MBP 7,1. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Peer Chen <pchen@nvidia.com> Cc: stable@kernel.org Reported-by: Anders Østhus <grapz666@gmail.com> Reported-by: Andreas Graf <andreas_graf@csgraf.de> Reported-by: Benoit Gschwind <gschwind@gnu-log.net> Reported-by: Damien Cassou <damien.cassou@gmail.com> Reported-by: tixetsal@juno.com Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
Родитель
c6353b4520
Коммит
1529c69adc
|
@ -32,6 +32,11 @@
|
|||
* A generic parallel ATA driver using libata
|
||||
*/
|
||||
|
||||
enum {
|
||||
ATA_GEN_CLASS_MATCH = (1 << 0),
|
||||
ATA_GEN_FORCE_DMA = (1 << 1),
|
||||
};
|
||||
|
||||
/**
|
||||
* generic_set_mode - mode setting
|
||||
* @link: link to set up
|
||||
|
@ -46,13 +51,17 @@
|
|||
static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
const struct pci_device_id *id = ap->host->private_data;
|
||||
int dma_enabled = 0;
|
||||
struct ata_device *dev;
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
|
||||
/* Bits 5 and 6 indicate if DMA is active on master/slave */
|
||||
if (ap->ioaddr.bmdma_addr)
|
||||
if (id->driver_data & ATA_GEN_FORCE_DMA) {
|
||||
dma_enabled = 0xff;
|
||||
} else if (ap->ioaddr.bmdma_addr) {
|
||||
/* Bits 5 and 6 indicate if DMA is active on master/slave */
|
||||
dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
|
||||
}
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_CENATEK)
|
||||
dma_enabled = 0xFF;
|
||||
|
@ -126,7 +135,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
|
|||
const struct ata_port_info *ppi[] = { &info, NULL };
|
||||
|
||||
/* Don't use the generic entry unless instructed to do so */
|
||||
if (id->driver_data == 1 && all_generic_ide == 0)
|
||||
if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
|
||||
return -ENODEV;
|
||||
|
||||
/* Devices that need care */
|
||||
|
@ -155,7 +164,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
|
|||
return rc;
|
||||
pcim_pin_device(dev);
|
||||
}
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0);
|
||||
}
|
||||
|
||||
static struct pci_device_id ata_generic[] = {
|
||||
|
@ -167,13 +176,15 @@ static struct pci_device_id ata_generic[] = {
|
|||
{ PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE),
|
||||
.driver_data = ATA_GEN_FORCE_DMA },
|
||||
/*
|
||||
* For some reason, MCP89 on MacBook 7,1 doesn't work with
|
||||
* ahci, use ata_generic instead.
|
||||
*/
|
||||
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA,
|
||||
PCI_VENDOR_ID_APPLE, 0xcb89, },
|
||||
PCI_VENDOR_ID_APPLE, 0xcb89,
|
||||
.driver_data = ATA_GEN_FORCE_DMA },
|
||||
#if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), },
|
||||
|
@ -181,7 +192,8 @@ static struct pci_device_id ata_generic[] = {
|
|||
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), },
|
||||
#endif
|
||||
/* Must come last. If you add entries adjust this table appropriately */
|
||||
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 1},
|
||||
{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
|
||||
.driver_data = ATA_GEN_CLASS_MATCH },
|
||||
{ 0, },
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче