aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/sata_sil.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
index 7d43cd3a50fc..0898cbe6458c 100644
--- a/drivers/scsi/sata_sil.c
+++ b/drivers/scsi/sata_sil.c
@@ -56,7 +56,7 @@ enum {
56 SIL_FLAG_MOD15WRITE = (1 << 30), 56 SIL_FLAG_MOD15WRITE = (1 << 30),
57 57
58 SIL_DFL_HOST_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 58 SIL_DFL_HOST_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
59 ATA_FLAG_MMIO, 59 ATA_FLAG_MMIO | ATA_FLAG_HRST_TO_RESUME,
60 60
61 /* 61 /*
62 * Controller IDs 62 * Controller IDs
@@ -186,7 +186,6 @@ static const struct ata_port_operations sil_ops = {
186 .check_status = ata_check_status, 186 .check_status = ata_check_status,
187 .exec_command = ata_exec_command, 187 .exec_command = ata_exec_command,
188 .dev_select = ata_std_dev_select, 188 .dev_select = ata_std_dev_select,
189 .probe_reset = ata_std_probe_reset,
190 .post_set_mode = sil_post_set_mode, 189 .post_set_mode = sil_post_set_mode,
191 .bmdma_setup = ata_bmdma_setup, 190 .bmdma_setup = ata_bmdma_setup,
192 .bmdma_start = ata_bmdma_start, 191 .bmdma_start = ata_bmdma_start,
@@ -344,6 +343,11 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
344 struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); 343 struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
345 u8 status; 344 u8 status;
346 345
346 if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) {
347 ata_ehi_hotplugged(&ap->eh_info);
348 goto freeze;
349 }
350
347 if (unlikely(!qc || qc->tf.ctl & ATA_NIEN)) 351 if (unlikely(!qc || qc->tf.ctl & ATA_NIEN))
348 goto freeze; 352 goto freeze;
349 353
@@ -415,7 +419,7 @@ static irqreturn_t sil_interrupt(int irq, void *dev_instance,
415 if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED)) 419 if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED))
416 continue; 420 continue;
417 421
418 if (!(bmdma2 & SIL_DMA_COMPLETE)) 422 if (!(bmdma2 & (SIL_DMA_COMPLETE | SIL_DMA_SATA_IRQ)))
419 continue; 423 continue;
420 424
421 sil_host_intr(ap, bmdma2); 425 sil_host_intr(ap, bmdma2);
@@ -432,6 +436,9 @@ static void sil_freeze(struct ata_port *ap)
432 void __iomem *mmio_base = ap->host_set->mmio_base; 436 void __iomem *mmio_base = ap->host_set->mmio_base;
433 u32 tmp; 437 u32 tmp;
434 438
439 /* global IRQ mask doesn't block SATA IRQ, turn off explicitly */
440 writel(0, mmio_base + sil_port[ap->port_no].sien);
441
435 /* plug IRQ */ 442 /* plug IRQ */
436 tmp = readl(mmio_base + SIL_SYSCFG); 443 tmp = readl(mmio_base + SIL_SYSCFG);
437 tmp |= SIL_MASK_IDE0_INT << ap->port_no; 444 tmp |= SIL_MASK_IDE0_INT << ap->port_no;
@@ -448,6 +455,9 @@ static void sil_thaw(struct ata_port *ap)
448 ata_chk_status(ap); 455 ata_chk_status(ap);
449 ata_bmdma_irq_clear(ap); 456 ata_bmdma_irq_clear(ap);
450 457
458 /* turn on SATA IRQ */
459 writel(SIL_SIEN_N, mmio_base + sil_port[ap->port_no].sien);
460
451 /* turn on IRQ */ 461 /* turn on IRQ */
452 tmp = readl(mmio_base + SIL_SYSCFG); 462 tmp = readl(mmio_base + SIL_SYSCFG);
453 tmp &= ~(SIL_MASK_IDE0_INT << ap->port_no); 463 tmp &= ~(SIL_MASK_IDE0_INT << ap->port_no);
@@ -621,11 +631,6 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
621 mmio_base + sil_port[2].bmdma); 631 mmio_base + sil_port[2].bmdma);
622 } 632 }
623 633
624 /* mask all SATA phy-related interrupts */
625 /* TODO: unmask bit 6 (SError N bit) for hotplug */
626 for (i = 0; i < probe_ent->n_ports; i++)
627 writel(0, mmio_base + sil_port[i].sien);
628
629 pci_set_master(pdev); 634 pci_set_master(pdev);
630 635
631 /* FIXME: check ata_device_add return value */ 636 /* FIXME: check ata_device_add return value */