diff options
-rw-r--r-- | drivers/scsi/sata_sil.c | 21 |
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 */ |