|
@@ -63,7 +63,6 @@ const struct ata_port_operations ata_sff_port_ops = {
|
|
|
.sff_tf_read = ata_sff_tf_read,
|
|
|
.sff_exec_command = ata_sff_exec_command,
|
|
|
.sff_data_xfer = ata_sff_data_xfer,
|
|
|
- .sff_irq_clear = ata_sff_irq_clear,
|
|
|
.sff_drain_fifo = ata_sff_drain_fifo,
|
|
|
|
|
|
.lost_interrupt = ata_sff_lost_interrupt,
|
|
@@ -395,32 +394,11 @@ void ata_sff_irq_on(struct ata_port *ap)
|
|
|
ata_sff_set_devctl(ap, ap->ctl);
|
|
|
ata_wait_idle(ap);
|
|
|
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ata_sff_irq_on);
|
|
|
|
|
|
-/**
|
|
|
- * ata_sff_irq_clear - Clear PCI IDE BMDMA interrupt.
|
|
|
- * @ap: Port associated with this ATA transaction.
|
|
|
- *
|
|
|
- * Clear interrupt and error flags in DMA status register.
|
|
|
- *
|
|
|
- * May be used as the irq_clear() entry in ata_port_operations.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * spin_lock_irqsave(host lock)
|
|
|
- */
|
|
|
-void ata_sff_irq_clear(struct ata_port *ap)
|
|
|
-{
|
|
|
- void __iomem *mmio = ap->ioaddr.bmdma_addr;
|
|
|
-
|
|
|
- if (!mmio)
|
|
|
- return;
|
|
|
-
|
|
|
- iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(ata_sff_irq_clear);
|
|
|
-
|
|
|
/**
|
|
|
* ata_sff_tf_load - send taskfile registers to host controller
|
|
|
* @ap: Port to which output is sent
|
|
@@ -1572,7 +1550,8 @@ unsigned int ata_sff_host_intr(struct ata_port *ap,
|
|
|
}
|
|
|
|
|
|
/* clear irq events */
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
|
|
|
ata_sff_hsm_move(ap, qc, status, 0);
|
|
|
|
|
@@ -1588,7 +1567,8 @@ idle_irq:
|
|
|
#ifdef ATA_IRQ_TRAP
|
|
|
if ((ap->stats.idle_irq % 1000) == 0) {
|
|
|
ap->ops->sff_check_status(ap);
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
ata_port_printk(ap, KERN_WARNING, "irq trap\n");
|
|
|
return 1;
|
|
|
}
|
|
@@ -1658,7 +1638,8 @@ retry:
|
|
|
|
|
|
if (idle & (1 << i)) {
|
|
|
ap->ops->sff_check_status(ap);
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
} else {
|
|
|
/* clear INTRQ and check if BUSY cleared */
|
|
|
if (!(ap->ops->sff_check_status(ap) & ATA_BUSY))
|
|
@@ -1744,7 +1725,8 @@ void ata_sff_freeze(struct ata_port *ap)
|
|
|
*/
|
|
|
ap->ops->sff_check_status(ap);
|
|
|
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ata_sff_freeze);
|
|
|
|
|
@@ -1761,7 +1743,8 @@ void ata_sff_thaw(struct ata_port *ap)
|
|
|
{
|
|
|
/* clear & re-enable interrupts */
|
|
|
ap->ops->sff_check_status(ap);
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
ata_sff_irq_on(ap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ata_sff_thaw);
|
|
@@ -2580,6 +2563,7 @@ const struct ata_port_operations ata_bmdma_port_ops = {
|
|
|
.qc_prep = ata_bmdma_qc_prep,
|
|
|
.qc_issue = ata_bmdma_qc_issue,
|
|
|
|
|
|
+ .sff_irq_clear = ata_bmdma_irq_clear,
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
|
.bmdma_start = ata_bmdma_start,
|
|
|
.bmdma_stop = ata_bmdma_stop,
|
|
@@ -2848,7 +2832,8 @@ void ata_bmdma_error_handler(struct ata_port *ap)
|
|
|
/* if we're gonna thaw, make sure IRQ is clear */
|
|
|
if (thaw) {
|
|
|
ap->ops->sff_check_status(ap);
|
|
|
- ap->ops->sff_irq_clear(ap);
|
|
|
+ if (ap->ops->sff_irq_clear)
|
|
|
+ ap->ops->sff_irq_clear(ap);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2881,6 +2866,28 @@ void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd);
|
|
|
|
|
|
+/**
|
|
|
+ * ata_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt.
|
|
|
+ * @ap: Port associated with this ATA transaction.
|
|
|
+ *
|
|
|
+ * Clear interrupt and error flags in DMA status register.
|
|
|
+ *
|
|
|
+ * May be used as the irq_clear() entry in ata_port_operations.
|
|
|
+ *
|
|
|
+ * LOCKING:
|
|
|
+ * spin_lock_irqsave(host lock)
|
|
|
+ */
|
|
|
+void ata_bmdma_irq_clear(struct ata_port *ap)
|
|
|
+{
|
|
|
+ void __iomem *mmio = ap->ioaddr.bmdma_addr;
|
|
|
+
|
|
|
+ if (!mmio)
|
|
|
+ return;
|
|
|
+
|
|
|
+ iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
|
|
|
+
|
|
|
/**
|
|
|
* ata_bmdma_setup - Set up PCI IDE BMDMA transaction
|
|
|
* @qc: Info associated with this ATA transaction.
|