提交 c3b28894 编写于 作者: T Tejun Heo 提交者: Jeff Garzik

libata-sff: separate out BMDMA irq handler

Separate out BMDMA irq handler from SFF irq handler.  The misnamed
host_intr() functions are renamed to ata_sff_port_intr() and
ata_bmdma_port_intr().  Common parts are factored into
__ata_sff_port_intr() and __ata_sff_interrupt() and used by sff and
bmdma interrupt routines.

All BMDMA drivers now use ata_bmdma_interrupt() or
ata_bmdma_port_intr() while all non-BMDMA SFF ones use
ata_sff_interrupt() or ata_sff_port_intr().

For now, ata_pci_sff_init_one() uses ata_bmdma_interrupt() as it's
used by both SFF and BMDMA drivers.
Signed-off-by: NTejun Heo <tj@kernel.org>
Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
上级 37f65b8b
...@@ -1626,7 +1626,7 @@ static int __devinit piix_init_one(struct pci_dev *pdev, ...@@ -1626,7 +1626,7 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
host->flags |= ATA_HOST_PARALLEL_SCAN; host->flags |= ATA_HOST_PARALLEL_SCAN;
pci_set_master(pdev); pci_set_master(pdev);
return ata_pci_sff_activate_host(host, ata_sff_interrupt, &piix_sht); return ata_pci_sff_activate_host(host, ata_bmdma_interrupt, &piix_sht);
} }
static void piix_remove_one(struct pci_dev *pdev) static void piix_remove_one(struct pci_dev *pdev)
......
...@@ -1469,27 +1469,27 @@ bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc) ...@@ -1469,27 +1469,27 @@ bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc)
} }
EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf); EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf);
/** static unsigned int ata_sff_idle_irq(struct ata_port *ap)
* ata_sff_host_intr - Handle host interrupt for given (port, task)
* @ap: Port on which interrupt arrived (possibly...)
* @qc: Taskfile currently active in engine
*
* Handle host interrupt for given queued command. Currently,
* only DMA interrupts are handled. All other commands are
* handled via polling with interrupts disabled (nIEN bit).
*
* LOCKING:
* spin_lock_irqsave(host lock)
*
* RETURNS:
* One if interrupt was handled, zero if not (shared irq).
*/
unsigned int ata_sff_host_intr(struct ata_port *ap,
struct ata_queued_cmd *qc)
{ {
struct ata_eh_info *ehi = &ap->link.eh_info; ap->stats.idle_irq++;
u8 status, host_stat = 0;
bool bmdma_stopped = false; #ifdef ATA_IRQ_TRAP
if ((ap->stats.idle_irq % 1000) == 0) {
ap->ops->sff_check_status(ap);
if (ap->ops->sff_irq_clear)
ap->ops->sff_irq_clear(ap);
ata_port_printk(ap, KERN_WARNING, "irq trap\n");
return 1;
}
#endif
return 0; /* irq not handled */
}
static unsigned int __ata_sff_port_intr(struct ata_port *ap,
struct ata_queued_cmd *qc,
bool hsmv_on_idle)
{
u8 status;
VPRINTK("ata%u: protocol %d task_state %d\n", VPRINTK("ata%u: protocol %d task_state %d\n",
ap->print_id, qc->tf.protocol, ap->hsm_task_state); ap->print_id, qc->tf.protocol, ap->hsm_task_state);
...@@ -1506,47 +1506,24 @@ unsigned int ata_sff_host_intr(struct ata_port *ap, ...@@ -1506,47 +1506,24 @@ unsigned int ata_sff_host_intr(struct ata_port *ap,
* need to check ata_is_atapi(qc->tf.protocol) again. * need to check ata_is_atapi(qc->tf.protocol) again.
*/ */
if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
goto idle_irq; return ata_sff_idle_irq(ap);
break;
case HSM_ST_LAST:
if (qc->tf.protocol == ATA_PROT_DMA ||
qc->tf.protocol == ATAPI_PROT_DMA) {
/* check status of DMA engine */
host_stat = ap->ops->bmdma_status(ap);
VPRINTK("ata%u: host_stat 0x%X\n",
ap->print_id, host_stat);
/* if it's not our irq... */
if (!(host_stat & ATA_DMA_INTR))
goto idle_irq;
/* before we do anything else, clear DMA-Start bit */
ap->ops->bmdma_stop(qc);
bmdma_stopped = true;
if (unlikely(host_stat & ATA_DMA_ERR)) {
/* error when transfering data to/from memory */
qc->err_mask |= AC_ERR_HOST_BUS;
ap->hsm_task_state = HSM_ST_ERR;
}
}
break; break;
case HSM_ST: case HSM_ST:
case HSM_ST_LAST:
break; break;
default: default:
goto idle_irq; return ata_sff_idle_irq(ap);
} }
/* check main status, clearing INTRQ if needed */ /* check main status, clearing INTRQ if needed */
status = ata_sff_irq_status(ap); status = ata_sff_irq_status(ap);
if (status & ATA_BUSY) { if (status & ATA_BUSY) {
if (bmdma_stopped) { if (hsmv_on_idle) {
/* BMDMA engine is already stopped, we're screwed */ /* BMDMA engine is already stopped, we're screwed */
qc->err_mask |= AC_ERR_HSM; qc->err_mask |= AC_ERR_HSM;
ap->hsm_task_state = HSM_ST_ERR; ap->hsm_task_state = HSM_ST_ERR;
} else } else
goto idle_irq; return ata_sff_idle_irq(ap);
} }
/* clear irq events */ /* clear irq events */
...@@ -1555,43 +1532,30 @@ unsigned int ata_sff_host_intr(struct ata_port *ap, ...@@ -1555,43 +1532,30 @@ unsigned int ata_sff_host_intr(struct ata_port *ap,
ata_sff_hsm_move(ap, qc, status, 0); ata_sff_hsm_move(ap, qc, status, 0);
if (unlikely(qc->err_mask) && (qc->tf.protocol == ATA_PROT_DMA ||
qc->tf.protocol == ATAPI_PROT_DMA))
ata_ehi_push_desc(ehi, "BMDMA stat 0x%x", host_stat);
return 1; /* irq handled */ return 1; /* irq handled */
idle_irq:
ap->stats.idle_irq++;
#ifdef ATA_IRQ_TRAP
if ((ap->stats.idle_irq % 1000) == 0) {
ap->ops->sff_check_status(ap);
if (ap->ops->sff_irq_clear)
ap->ops->sff_irq_clear(ap);
ata_port_printk(ap, KERN_WARNING, "irq trap\n");
return 1;
}
#endif
return 0; /* irq not handled */
} }
EXPORT_SYMBOL_GPL(ata_sff_host_intr);
/** /**
* ata_sff_interrupt - Default ATA host interrupt handler * ata_sff_port_intr - Handle SFF port interrupt
* @irq: irq line (unused) * @ap: Port on which interrupt arrived (possibly...)
* @dev_instance: pointer to our ata_host information structure * @qc: Taskfile currently active in engine
* *
* Default interrupt handler for PCI IDE devices. Calls * Handle port interrupt for given queued command.
* ata_sff_host_intr() for each port that is not disabled.
* *
* LOCKING: * LOCKING:
* Obtains host lock during operation. * spin_lock_irqsave(host lock)
* *
* RETURNS: * RETURNS:
* IRQ_NONE or IRQ_HANDLED. * One if interrupt was handled, zero if not (shared irq).
*/ */
irqreturn_t ata_sff_interrupt(int irq, void *dev_instance) unsigned int ata_sff_port_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
{
return __ata_sff_port_intr(ap, qc, false);
}
EXPORT_SYMBOL_GPL(ata_sff_port_intr);
static inline irqreturn_t __ata_sff_interrupt(int irq, void *dev_instance,
unsigned int (*port_intr)(struct ata_port *, struct ata_queued_cmd *))
{ {
struct ata_host *host = dev_instance; struct ata_host *host = dev_instance;
bool retried = false; bool retried = false;
...@@ -1611,7 +1575,7 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance) ...@@ -1611,7 +1575,7 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)
qc = ata_qc_from_tag(ap, ap->link.active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc) { if (qc) {
if (!(qc->tf.flags & ATA_TFLAG_POLLING)) if (!(qc->tf.flags & ATA_TFLAG_POLLING))
handled |= ata_sff_host_intr(ap, qc); handled |= port_intr(ap, qc);
else else
polling |= 1 << i; polling |= 1 << i;
} else } else
...@@ -1661,6 +1625,25 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance) ...@@ -1661,6 +1625,25 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
} }
/**
* ata_sff_interrupt - Default SFF ATA host interrupt handler
* @irq: irq line (unused)
* @dev_instance: pointer to our ata_host information structure
*
* Default interrupt handler for PCI IDE devices. Calls
* ata_sff_port_intr() for each port that is not disabled.
*
* LOCKING:
* Obtains host lock during operation.
*
* RETURNS:
* IRQ_NONE or IRQ_HANDLED.
*/
irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)
{
return __ata_sff_interrupt(irq, dev_instance, ata_sff_port_intr);
}
EXPORT_SYMBOL_GPL(ata_sff_interrupt); EXPORT_SYMBOL_GPL(ata_sff_interrupt);
/** /**
...@@ -1698,7 +1681,7 @@ void ata_sff_lost_interrupt(struct ata_port *ap) ...@@ -1698,7 +1681,7 @@ void ata_sff_lost_interrupt(struct ata_port *ap)
status); status);
/* Run the host interrupt logic as if the interrupt had not been /* Run the host interrupt logic as if the interrupt had not been
lost */ lost */
ata_sff_host_intr(ap, qc); ata_sff_port_intr(ap, qc);
} }
EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt); EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
...@@ -2541,7 +2524,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev, ...@@ -2541,7 +2524,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev,
host->flags |= hflag; host->flags |= hflag;
pci_set_master(pdev); pci_set_master(pdev);
rc = ata_pci_sff_activate_host(host, ata_sff_interrupt, sht); rc = ata_pci_sff_activate_host(host, ata_bmdma_interrupt, sht);
out: out:
if (rc == 0) if (rc == 0)
devres_remove_group(&pdev->dev, NULL); devres_remove_group(&pdev->dev, NULL);
...@@ -2787,6 +2770,75 @@ unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc) ...@@ -2787,6 +2770,75 @@ unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc)
} }
EXPORT_SYMBOL_GPL(ata_bmdma_qc_issue); EXPORT_SYMBOL_GPL(ata_bmdma_qc_issue);
/**
* ata_bmdma_port_intr - Handle BMDMA port interrupt
* @ap: Port on which interrupt arrived (possibly...)
* @qc: Taskfile currently active in engine
*
* Handle port interrupt for given queued command.
*
* LOCKING:
* spin_lock_irqsave(host lock)
*
* RETURNS:
* One if interrupt was handled, zero if not (shared irq).
*/
unsigned int ata_bmdma_port_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
{
struct ata_eh_info *ehi = &ap->link.eh_info;
u8 host_stat = 0;
bool bmdma_stopped = false;
unsigned int handled;
if (ap->hsm_task_state == HSM_ST_LAST && ata_is_dma(qc->tf.protocol)) {
/* check status of DMA engine */
host_stat = ap->ops->bmdma_status(ap);
VPRINTK("ata%u: host_stat 0x%X\n", ap->print_id, host_stat);
/* if it's not our irq... */
if (!(host_stat & ATA_DMA_INTR))
return ata_sff_idle_irq(ap);
/* before we do anything else, clear DMA-Start bit */
ap->ops->bmdma_stop(qc);
bmdma_stopped = true;
if (unlikely(host_stat & ATA_DMA_ERR)) {
/* error when transfering data to/from memory */
qc->err_mask |= AC_ERR_HOST_BUS;
ap->hsm_task_state = HSM_ST_ERR;
}
}
handled = __ata_sff_port_intr(ap, qc, bmdma_stopped);
if (unlikely(qc->err_mask) && ata_is_dma(qc->tf.protocol))
ata_ehi_push_desc(ehi, "BMDMA stat 0x%x", host_stat);
return handled;
}
EXPORT_SYMBOL_GPL(ata_bmdma_port_intr);
/**
* ata_bmdma_interrupt - Default BMDMA ATA host interrupt handler
* @irq: irq line (unused)
* @dev_instance: pointer to our ata_host information structure
*
* Default interrupt handler for PCI IDE devices. Calls
* ata_bmdma_port_intr() for each port that is not disabled.
*
* LOCKING:
* Obtains host lock during operation.
*
* RETURNS:
* IRQ_NONE or IRQ_HANDLED.
*/
irqreturn_t ata_bmdma_interrupt(int irq, void *dev_instance)
{
return __ata_sff_interrupt(irq, dev_instance, ata_bmdma_port_intr);
}
EXPORT_SYMBOL_GPL(ata_bmdma_interrupt);
/** /**
* ata_bmdma_error_handler - Stock error handler for BMDMA controller * ata_bmdma_error_handler - Stock error handler for BMDMA controller
* @ap: port to handle error for * @ap: port to handle error for
......
...@@ -525,7 +525,7 @@ static int atp867x_init_one(struct pci_dev *pdev, ...@@ -525,7 +525,7 @@ static int atp867x_init_one(struct pci_dev *pdev,
pci_set_master(pdev); pci_set_master(pdev);
rc = ata_host_activate(host, pdev->irq, ata_sff_interrupt, rc = ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &atp867x_sht); IRQF_SHARED, &atp867x_sht);
if (rc) if (rc)
dev_printk(KERN_ERR, &pdev->dev, "failed to activate host\n"); dev_printk(KERN_ERR, &pdev->dev, "failed to activate host\n");
......
...@@ -221,7 +221,7 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi ...@@ -221,7 +221,7 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi
continue; continue;
rc = devm_request_irq(&pdev->dev, irq[ap->port_no], rc = devm_request_irq(&pdev->dev, irq[ap->port_no],
ata_sff_interrupt, 0, DRV_NAME, host); ata_bmdma_interrupt, 0, DRV_NAME, host);
if (rc) if (rc)
return rc; return rc;
......
...@@ -248,7 +248,7 @@ static int hpt3x3_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -248,7 +248,7 @@ static int hpt3x3_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
ata_port_pbar_desc(ap, 4, offset_cmd[i], "cmd"); ata_port_pbar_desc(ap, 4, offset_cmd[i], "cmd");
} }
pci_set_master(pdev); pci_set_master(pdev);
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &hpt3x3_sht); IRQF_SHARED, &hpt3x3_sht);
} }
......
...@@ -470,7 +470,7 @@ static int __devinit pata_icside_add_ports(struct pata_icside_info *info) ...@@ -470,7 +470,7 @@ static int __devinit pata_icside_add_ports(struct pata_icside_info *info)
pata_icside_setup_ioaddr(ap, info->base, info, info->port[i]); pata_icside_setup_ioaddr(ap, info->base, info, info->port[i]);
} }
return ata_host_activate(host, ec->irq, ata_sff_interrupt, 0, return ata_host_activate(host, ec->irq, ata_bmdma_interrupt, 0,
&pata_icside_sht); &pata_icside_sht);
} }
......
...@@ -1110,7 +1110,7 @@ static int __devinit pata_macio_common_init(struct pata_macio_priv *priv, ...@@ -1110,7 +1110,7 @@ static int __devinit pata_macio_common_init(struct pata_macio_priv *priv,
/* Start it up */ /* Start it up */
priv->irq = irq; priv->irq = irq;
return ata_host_activate(priv->host, irq, ata_sff_interrupt, 0, return ata_host_activate(priv->host, irq, ata_bmdma_interrupt, 0,
&pata_macio_sht); &pata_macio_sht);
} }
......
...@@ -659,7 +659,7 @@ mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv, ...@@ -659,7 +659,7 @@ mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv,
ata_port_desc(ap, "ata_regs 0x%lx", raw_ata_regs); ata_port_desc(ap, "ata_regs 0x%lx", raw_ata_regs);
/* activate host */ /* activate host */
return ata_host_activate(host, priv->ata_irq, ata_sff_interrupt, 0, return ata_host_activate(host, priv->ata_irq, ata_bmdma_interrupt, 0,
&mpc52xx_ata_sht); &mpc52xx_ata_sht);
} }
......
...@@ -149,7 +149,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -149,7 +149,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
ninja32_program(base); ninja32_program(base);
/* FIXME: Should we disable them at remove ? */ /* FIXME: Should we disable them at remove ? */
return ata_host_activate(host, dev->irq, ata_sff_interrupt, return ata_host_activate(host, dev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &ninja32_sht); IRQF_SHARED, &ninja32_sht);
} }
......
...@@ -754,7 +754,7 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de ...@@ -754,7 +754,7 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
return -EIO; return -EIO;
pci_set_master(pdev); pci_set_master(pdev);
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &pdc2027x_sht); IRQF_SHARED, &pdc2027x_sht);
} }
......
...@@ -354,7 +354,7 @@ static int __devinit rdc_init_one(struct pci_dev *pdev, ...@@ -354,7 +354,7 @@ static int __devinit rdc_init_one(struct pci_dev *pdev,
host->flags |= ATA_HOST_PARALLEL_SCAN; host->flags |= ATA_HOST_PARALLEL_SCAN;
pci_set_master(pdev); pci_set_master(pdev);
return ata_pci_sff_activate_host(host, ata_sff_interrupt, &rdc_sht); return ata_pci_sff_activate_host(host, ata_bmdma_interrupt, &rdc_sht);
} }
static void rdc_remove_one(struct pci_dev *pdev) static void rdc_remove_one(struct pci_dev *pdev)
......
...@@ -1105,7 +1105,7 @@ static int scc_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1105,7 +1105,7 @@ static int scc_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc) if (rc)
return rc; return rc;
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &scc_sht); IRQF_SHARED, &scc_sht);
} }
......
...@@ -374,7 +374,7 @@ static int __devinit sil680_init_one(struct pci_dev *pdev, ...@@ -374,7 +374,7 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
ata_sff_std_ports(&host->ports[1]->ioaddr); ata_sff_std_ports(&host->ports[1]->ioaddr);
/* Register & activate */ /* Register & activate */
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &sil680_sht); IRQF_SHARED, &sil680_sht);
use_ioports: use_ioports:
......
...@@ -2811,7 +2811,7 @@ static void mv_port_intr(struct ata_port *ap, u32 port_cause) ...@@ -2811,7 +2811,7 @@ static void mv_port_intr(struct ata_port *ap, u32 port_cause)
} else if (!edma_was_enabled) { } else if (!edma_was_enabled) {
struct ata_queued_cmd *qc = mv_get_active_qc(ap); struct ata_queued_cmd *qc = mv_get_active_qc(ap);
if (qc) if (qc)
ata_sff_host_intr(ap, qc); ata_bmdma_port_intr(ap, qc);
else else
mv_unexpected_intr(ap, edma_was_enabled); mv_unexpected_intr(ap, edma_was_enabled);
} }
......
...@@ -920,7 +920,7 @@ static int nv_host_intr(struct ata_port *ap, u8 irq_stat) ...@@ -920,7 +920,7 @@ static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
} }
/* handle interrupt */ /* handle interrupt */
return ata_sff_host_intr(ap, qc); return ata_bmdma_port_intr(ap, qc);
} }
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance) static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
...@@ -1505,7 +1505,7 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance) ...@@ -1505,7 +1505,7 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance)
qc = ata_qc_from_tag(ap, ap->link.active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
handled += ata_sff_host_intr(ap, qc); handled += ata_bmdma_port_intr(ap, qc);
} else { } else {
/* /*
* No request pending? Clear interrupt status * No request pending? Clear interrupt status
......
...@@ -454,7 +454,7 @@ static inline unsigned int qs_intr_mmio(struct ata_host *host) ...@@ -454,7 +454,7 @@ static inline unsigned int qs_intr_mmio(struct ata_host *host)
if (!pp || pp->state != qs_state_mmio) if (!pp || pp->state != qs_state_mmio)
continue; continue;
if (!(qc->tf.flags & ATA_TFLAG_POLLING)) if (!(qc->tf.flags & ATA_TFLAG_POLLING))
handled |= ata_sff_host_intr(ap, qc); handled |= ata_sff_port_intr(ap, qc);
} }
return handled; return handled;
} }
......
...@@ -308,7 +308,7 @@ static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -308,7 +308,7 @@ static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master(pdev); pci_set_master(pdev);
pci_intx(pdev, 1); pci_intx(pdev, 1);
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &sis_sht); IRQF_SHARED, &sis_sht);
} }
......
...@@ -502,7 +502,7 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en ...@@ -502,7 +502,7 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en
writel(0x0, mmio_base + K2_SATA_SIM_OFFSET); writel(0x0, mmio_base + K2_SATA_SIM_OFFSET);
pci_set_master(pdev); pci_set_master(pdev);
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &k2_sata_sht); IRQF_SHARED, &k2_sata_sht);
} }
......
...@@ -242,7 +242,7 @@ static int uli_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -242,7 +242,7 @@ static int uli_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master(pdev); pci_set_master(pdev);
pci_intx(pdev, 1); pci_intx(pdev, 1);
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &uli_sht); IRQF_SHARED, &uli_sht);
} }
......
...@@ -628,7 +628,7 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -628,7 +628,7 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
svia_configure(pdev); svia_configure(pdev);
pci_set_master(pdev); pci_set_master(pdev);
return ata_host_activate(host, pdev->irq, ata_sff_interrupt, return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &svia_sht); IRQF_SHARED, &svia_sht);
} }
......
...@@ -245,7 +245,7 @@ static void vsc_port_intr(u8 port_status, struct ata_port *ap) ...@@ -245,7 +245,7 @@ static void vsc_port_intr(u8 port_status, struct ata_port *ap)
qc = ata_qc_from_tag(ap, ap->link.active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && likely(!(qc->tf.flags & ATA_TFLAG_POLLING))) if (qc && likely(!(qc->tf.flags & ATA_TFLAG_POLLING)))
handled = ata_sff_host_intr(ap, qc); handled = ata_bmdma_port_intr(ap, qc);
/* We received an interrupt during a polled command, /* We received an interrupt during a polled command,
* or some other spurious condition. Interrupt reporting * or some other spurious condition. Interrupt reporting
......
...@@ -1593,7 +1593,7 @@ extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, ...@@ -1593,7 +1593,7 @@ extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
extern void ata_sff_queue_pio_task(struct ata_port *ap, unsigned long delay); extern void ata_sff_queue_pio_task(struct ata_port *ap, unsigned long delay);
extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc); extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc);
extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc); extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);
extern unsigned int ata_sff_host_intr(struct ata_port *ap, extern unsigned int ata_sff_port_intr(struct ata_port *ap,
struct ata_queued_cmd *qc); struct ata_queued_cmd *qc);
extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance); extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);
extern void ata_sff_lost_interrupt(struct ata_port *ap); extern void ata_sff_lost_interrupt(struct ata_port *ap);
...@@ -1628,6 +1628,9 @@ extern int ata_pci_sff_init_one(struct pci_dev *pdev, ...@@ -1628,6 +1628,9 @@ extern int ata_pci_sff_init_one(struct pci_dev *pdev,
extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc); extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc);
extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc); extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc);
extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc); extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc);
extern unsigned int ata_bmdma_port_intr(struct ata_port *ap,
struct ata_queued_cmd *qc);
extern irqreturn_t ata_bmdma_interrupt(int irq, void *dev_instance);
extern void ata_bmdma_error_handler(struct ata_port *ap); extern void ata_bmdma_error_handler(struct ata_port *ap);
extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc); extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc);
extern void ata_bmdma_irq_clear(struct ata_port *ap); extern void ata_bmdma_irq_clear(struct ata_port *ap);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册