aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/ahci.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index b697da483b70..35ede5c31b9f 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -169,14 +169,16 @@ enum {
169 PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */ 169 PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */
170 PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */ 170 PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */
171 171
172 /* hpriv->flags bits */
173 AHCI_HFLAG_NO_NCQ = (1 << 0),
174 AHCI_HFLAG_IGN_IRQ_IF_ERR = (1 << 1), /* ignore IRQ_IF_ERR */
175 AHCI_HFLAG_IGN_SERR_INTERNAL = (1 << 2), /* ignore SERR_INTERNAL */
176 AHCI_HFLAG_32BIT_ONLY = (1 << 3), /* force 32bit */
177 AHCI_HFLAG_MV_PATA = (1 << 4), /* PATA port */
178 AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */
179
172 /* ap->flags bits */ 180 /* ap->flags bits */
173 AHCI_FLAG_NO_NCQ = (1 << 24), 181 AHCI_FLAG_NO_HOTPLUG = (1 << 24), /* ignore PxSERR.DIAG.N */
174 AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */
175 AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */
176 AHCI_FLAG_32BIT_ONLY = (1 << 28), /* force 32bit */
177 AHCI_FLAG_MV_PATA = (1 << 29), /* PATA port */
178 AHCI_FLAG_NO_MSI = (1 << 30), /* no PCI MSI */
179 AHCI_FLAG_NO_HOTPLUG = (1 << 31), /* ignore PxSERR.DIAG.N */
180 182
181 AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 183 AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
182 ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | 184 ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
@@ -200,6 +202,7 @@ struct ahci_sg {
200}; 202};
201 203
202struct ahci_host_priv { 204struct ahci_host_priv {
205 unsigned int flags; /* AHCI_HFLAG_* */
203 u32 cap; /* cap to use */ 206 u32 cap; /* cap to use */
204 u32 port_map; /* port map to use */ 207 u32 port_map; /* port map to use */
205 u32 saved_cap; /* saved initial cap */ 208 u32 saved_cap; /* saved initial cap */
@@ -341,6 +344,8 @@ static const struct ata_port_operations ahci_vt8251_ops = {
341 .port_stop = ahci_port_stop, 344 .port_stop = ahci_port_stop,
342}; 345};
343 346
347#define AHCI_HFLAGS(flags) .private_data = (void *)(flags)
348
344static const struct ata_port_info ahci_port_info[] = { 349static const struct ata_port_info ahci_port_info[] = {
345 /* board_ahci */ 350 /* board_ahci */
346 { 351 {
@@ -352,7 +357,8 @@ static const struct ata_port_info ahci_port_info[] = {
352 }, 357 },
353 /* board_ahci_vt8251 */ 358 /* board_ahci_vt8251 */
354 { 359 {
355 .flags = AHCI_FLAG_COMMON | AHCI_FLAG_NO_NCQ, 360 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ),
361 .flags = AHCI_FLAG_COMMON,
356 .link_flags = AHCI_LFLAG_COMMON | ATA_LFLAG_HRST_TO_RESUME, 362 .link_flags = AHCI_LFLAG_COMMON | ATA_LFLAG_HRST_TO_RESUME,
357 .pio_mask = 0x1f, /* pio0-4 */ 363 .pio_mask = 0x1f, /* pio0-4 */
358 .udma_mask = ATA_UDMA6, 364 .udma_mask = ATA_UDMA6,
@@ -360,7 +366,8 @@ static const struct ata_port_info ahci_port_info[] = {
360 }, 366 },
361 /* board_ahci_ign_iferr */ 367 /* board_ahci_ign_iferr */
362 { 368 {
363 .flags = AHCI_FLAG_COMMON | AHCI_FLAG_IGN_IRQ_IF_ERR, 369 AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
370 .flags = AHCI_FLAG_COMMON,
364 .link_flags = AHCI_LFLAG_COMMON, 371 .link_flags = AHCI_LFLAG_COMMON,
365 .pio_mask = 0x1f, /* pio0-4 */ 372 .pio_mask = 0x1f, /* pio0-4 */
366 .udma_mask = ATA_UDMA6, 373 .udma_mask = ATA_UDMA6,
@@ -368,9 +375,9 @@ static const struct ata_port_info ahci_port_info[] = {
368 }, 375 },
369 /* board_ahci_sb600 */ 376 /* board_ahci_sb600 */
370 { 377 {
371 .flags = AHCI_FLAG_COMMON | 378 AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
372 AHCI_FLAG_IGN_SERR_INTERNAL | 379 AHCI_HFLAG_32BIT_ONLY),
373 AHCI_FLAG_32BIT_ONLY, 380 .flags = AHCI_FLAG_COMMON,
374 .link_flags = AHCI_LFLAG_COMMON, 381 .link_flags = AHCI_LFLAG_COMMON,
375 .pio_mask = 0x1f, /* pio0-4 */ 382 .pio_mask = 0x1f, /* pio0-4 */
376 .udma_mask = ATA_UDMA6, 383 .udma_mask = ATA_UDMA6,
@@ -378,11 +385,10 @@ static const struct ata_port_info ahci_port_info[] = {
378 }, 385 },
379 /* board_ahci_mv */ 386 /* board_ahci_mv */
380 { 387 {
381 .sht = &ahci_sht, 388 AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
389 AHCI_HFLAG_MV_PATA),
382 .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 390 .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
383 ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | 391 ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
384 AHCI_FLAG_NO_NCQ | AHCI_FLAG_NO_MSI |
385 AHCI_FLAG_MV_PATA,
386 .link_flags = AHCI_LFLAG_COMMON, 392 .link_flags = AHCI_LFLAG_COMMON,
387 .pio_mask = 0x1f, /* pio0-4 */ 393 .pio_mask = 0x1f, /* pio0-4 */
388 .udma_mask = ATA_UDMA6, 394 .udma_mask = ATA_UDMA6,
@@ -534,7 +540,6 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap)
534/** 540/**
535 * ahci_save_initial_config - Save and fixup initial config values 541 * ahci_save_initial_config - Save and fixup initial config values
536 * @pdev: target PCI device 542 * @pdev: target PCI device
537 * @pi: associated ATA port info
538 * @hpriv: host private area to store config values 543 * @hpriv: host private area to store config values
539 * 544 *
540 * Some registers containing configuration info might be setup by 545 * Some registers containing configuration info might be setup by
@@ -548,7 +553,6 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap)
548 * None. 553 * None.
549 */ 554 */
550static void ahci_save_initial_config(struct pci_dev *pdev, 555static void ahci_save_initial_config(struct pci_dev *pdev,
551 const struct ata_port_info *pi,
552 struct ahci_host_priv *hpriv) 556 struct ahci_host_priv *hpriv)
553{ 557{
554 void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; 558 void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
@@ -562,13 +566,13 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
562 hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL); 566 hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
563 567
564 /* some chips have errata preventing 64bit use */ 568 /* some chips have errata preventing 64bit use */
565 if ((cap & HOST_CAP_64) && (pi->flags & AHCI_FLAG_32BIT_ONLY)) { 569 if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) {
566 dev_printk(KERN_INFO, &pdev->dev, 570 dev_printk(KERN_INFO, &pdev->dev,
567 "controller can't do 64bit DMA, forcing 32bit\n"); 571 "controller can't do 64bit DMA, forcing 32bit\n");
568 cap &= ~HOST_CAP_64; 572 cap &= ~HOST_CAP_64;
569 } 573 }
570 574
571 if ((cap & HOST_CAP_NCQ) && (pi->flags & AHCI_FLAG_NO_NCQ)) { 575 if ((cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_NO_NCQ)) {
572 dev_printk(KERN_INFO, &pdev->dev, 576 dev_printk(KERN_INFO, &pdev->dev,
573 "controller can't do NCQ, turning off CAP_NCQ\n"); 577 "controller can't do NCQ, turning off CAP_NCQ\n");
574 cap &= ~HOST_CAP_NCQ; 578 cap &= ~HOST_CAP_NCQ;
@@ -579,7 +583,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
579 * is asserted through the standard AHCI port 583 * is asserted through the standard AHCI port
580 * presence register, as bit 4 (counting from 0) 584 * presence register, as bit 4 (counting from 0)
581 */ 585 */
582 if (pi->flags & AHCI_FLAG_MV_PATA) { 586 if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
583 dev_printk(KERN_ERR, &pdev->dev, 587 dev_printk(KERN_ERR, &pdev->dev,
584 "MV_AHCI HACK: port_map %x -> %x\n", 588 "MV_AHCI HACK: port_map %x -> %x\n",
585 hpriv->port_map, 589 hpriv->port_map,
@@ -919,13 +923,14 @@ static void ahci_port_init(struct pci_dev *pdev, struct ata_port *ap,
919 923
920static void ahci_init_controller(struct ata_host *host) 924static void ahci_init_controller(struct ata_host *host)
921{ 925{
926 struct ahci_host_priv *hpriv = host->private_data;
922 struct pci_dev *pdev = to_pci_dev(host->dev); 927 struct pci_dev *pdev = to_pci_dev(host->dev);
923 void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; 928 void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
924 int i; 929 int i;
925 void __iomem *port_mmio; 930 void __iomem *port_mmio;
926 u32 tmp; 931 u32 tmp;
927 932
928 if (host->ports[0]->flags & AHCI_FLAG_MV_PATA) { 933 if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
929 port_mmio = __ahci_port_base(host, 4); 934 port_mmio = __ahci_port_base(host, 4);
930 935
931 writel(0, port_mmio + PORT_IRQ_MASK); 936 writel(0, port_mmio + PORT_IRQ_MASK);
@@ -1307,6 +1312,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
1307 1312
1308static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) 1313static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
1309{ 1314{
1315 struct ahci_host_priv *hpriv = ap->host->private_data;
1310 struct ahci_port_priv *pp = ap->private_data; 1316 struct ahci_port_priv *pp = ap->private_data;
1311 struct ata_eh_info *host_ehi = &ap->link.eh_info; 1317 struct ata_eh_info *host_ehi = &ap->link.eh_info;
1312 struct ata_link *link = NULL; 1318 struct ata_link *link = NULL;
@@ -1334,7 +1340,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
1334 host_ehi->serror |= serror; 1340 host_ehi->serror |= serror;
1335 1341
1336 /* some controllers set IRQ_IF_ERR on device errors, ignore it */ 1342 /* some controllers set IRQ_IF_ERR on device errors, ignore it */
1337 if (ap->flags & AHCI_FLAG_IGN_IRQ_IF_ERR) 1343 if (hpriv->flags & AHCI_HFLAG_IGN_IRQ_IF_ERR)
1338 irq_stat &= ~PORT_IRQ_IF_ERR; 1344 irq_stat &= ~PORT_IRQ_IF_ERR;
1339 1345
1340 if (irq_stat & PORT_IRQ_TF_ERR) { 1346 if (irq_stat & PORT_IRQ_TF_ERR) {
@@ -1347,7 +1353,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
1347 else 1353 else
1348 active_ehi->err_mask |= AC_ERR_DEV; 1354 active_ehi->err_mask |= AC_ERR_DEV;
1349 1355
1350 if (ap->flags & AHCI_FLAG_IGN_SERR_INTERNAL) 1356 if (hpriv->flags & AHCI_HFLAG_IGN_SERR_INTERNAL)
1351 host_ehi->serror &= ~SERR_INTERNAL; 1357 host_ehi->serror &= ~SERR_INTERNAL;
1352 } 1358 }
1353 1359
@@ -1977,15 +1983,16 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1977 if (rc) 1983 if (rc)
1978 return rc; 1984 return rc;
1979 1985
1980 if ((pi.flags & AHCI_FLAG_NO_MSI) || pci_enable_msi(pdev))
1981 pci_intx(pdev, 1);
1982
1983 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); 1986 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
1984 if (!hpriv) 1987 if (!hpriv)
1985 return -ENOMEM; 1988 return -ENOMEM;
1989 hpriv->flags |= (unsigned long)pi.private_data;
1990
1991 if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev))
1992 pci_intx(pdev, 1);
1986 1993
1987 /* save initial config */ 1994 /* save initial config */
1988 ahci_save_initial_config(pdev, &pi, hpriv); 1995 ahci_save_initial_config(pdev, hpriv);
1989 1996
1990 /* prepare host */ 1997 /* prepare host */
1991 if (hpriv->cap & HOST_CAP_NCQ) 1998 if (hpriv->cap & HOST_CAP_NCQ)