diff options
author | Albert Lee <albertcc@tw.ibm.com> | 2005-09-27 05:39:50 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-28 12:07:13 -0400 |
commit | e50362eccd8809a224cda5f71714a088ba37b2ab (patch) | |
tree | 762b753691ef8c4645efaa677b32c57fd33ecbc0 /drivers/scsi/sata_qstor.c | |
parent | 312f7da2824c82800ee78d6190f12854456957af (diff) |
[PATCH] libata: interrupt driven pio for LLD
libata.h:
libata-core:
Add ATA_FLAG_PIO_POLLING flag for LLDs that expect interrupt for
command completion only.
sata_nv.c:
sata_vsc.c:
irq handler is wrapper around ata_host_intr(), can handle PIO interrupts.
sata_promise.c:
sata_sx4.c:
sata_qstor.c:
sata_mv.c:
Private irq handler.
Polling mode ATA_FLAG_PIO_POLLING used for compatibility.
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/scsi/sata_qstor.c')
-rw-r--r-- | drivers/scsi/sata_qstor.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c index ffcdeb68641c..a604afafaecc 100644 --- a/drivers/scsi/sata_qstor.c +++ b/drivers/scsi/sata_qstor.c | |||
@@ -175,7 +175,7 @@ static struct ata_port_info qs_port_info[] = { | |||
175 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 175 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
176 | ATA_FLAG_SATA_RESET | | 176 | ATA_FLAG_SATA_RESET | |
177 | //FIXME ATA_FLAG_SRST | | 177 | //FIXME ATA_FLAG_SRST | |
178 | ATA_FLAG_MMIO, | 178 | ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING, |
179 | .pio_mask = 0x10, /* pio4 */ | 179 | .pio_mask = 0x10, /* pio4 */ |
180 | .udma_mask = 0x7f, /* udma0-6 */ | 180 | .udma_mask = 0x7f, /* udma0-6 */ |
181 | .port_ops = &qs_ata_ops, | 181 | .port_ops = &qs_ata_ops, |
@@ -389,14 +389,13 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set) | |||
389 | DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n", | 389 | DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n", |
390 | sff1, sff0, port_no, sHST, sDST); | 390 | sff1, sff0, port_no, sHST, sDST); |
391 | handled = 1; | 391 | handled = 1; |
392 | if (ap && !(ap->flags & | 392 | if (ap && !(ap->flags & ATA_FLAG_PORT_DISABLED)) { |
393 | (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { | ||
394 | struct ata_queued_cmd *qc; | 393 | struct ata_queued_cmd *qc; |
395 | struct qs_port_priv *pp = ap->private_data; | 394 | struct qs_port_priv *pp = ap->private_data; |
396 | if (!pp || pp->state != qs_state_pkt) | 395 | if (!pp || pp->state != qs_state_pkt) |
397 | continue; | 396 | continue; |
398 | qc = ata_qc_from_tag(ap, ap->active_tag); | 397 | qc = ata_qc_from_tag(ap, ap->active_tag); |
399 | if (qc && (!(qc->tf.ctl & ATA_NIEN))) { | 398 | if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { |
400 | switch (sHST) { | 399 | switch (sHST) { |
401 | case 0: /* sucessful CPB */ | 400 | case 0: /* sucessful CPB */ |
402 | case 3: /* device error */ | 401 | case 3: /* device error */ |
@@ -422,13 +421,13 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set) | |||
422 | struct ata_port *ap; | 421 | struct ata_port *ap; |
423 | ap = host_set->ports[port_no]; | 422 | ap = host_set->ports[port_no]; |
424 | if (ap && | 423 | if (ap && |
425 | !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { | 424 | !(ap->flags & ATA_FLAG_PORT_DISABLED)) { |
426 | struct ata_queued_cmd *qc; | 425 | struct ata_queued_cmd *qc; |
427 | struct qs_port_priv *pp = ap->private_data; | 426 | struct qs_port_priv *pp = ap->private_data; |
428 | if (!pp || pp->state != qs_state_mmio) | 427 | if (!pp || pp->state != qs_state_mmio) |
429 | continue; | 428 | continue; |
430 | qc = ata_qc_from_tag(ap, ap->active_tag); | 429 | qc = ata_qc_from_tag(ap, ap->active_tag); |
431 | if (qc && (!(qc->tf.ctl & ATA_NIEN))) { | 430 | if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { |
432 | 431 | ||
433 | /* check main status, clearing INTRQ */ | 432 | /* check main status, clearing INTRQ */ |
434 | u8 status = ata_chk_status(ap); | 433 | u8 status = ata_chk_status(ap); |