diff options
| author | Jeff Garzik <jgarzik@redhat.com> | 2004-05-13 14:39:17 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@redhat.com> | 2004-05-13 14:39:17 -0400 |
| commit | 63a2ea09fb6fa17943a9bfd9cb1732704eb96d01 (patch) | |
| tree | 93b3d354857bfd6907cc5cabe3aa22630b243b60 | |
| parent | 2e0b05720b394ba2c6bb36364ff963d07d9ccb05 (diff) | |
[libata] random minor bug fixes
* Only call ata_sg_setup{_one} if ATA_QCFLAG_SG is set. Preparation
for future use, as currently ATA_QCFLAG_SG is always set when
ata_qc_issue is called.
This change in theory is incorrect for Promise TX/SX4 drivers,
since those drivers set up the Promise-specific packet in their
->fill_sg hook, which is now called conditionally.
A FIXME that doesn't affect anything, for now.
* ATA_PROT_ATAPI and ATA_PROT_ATAPI_DMA command issue need to be
differentiated.
* Create and use ata_qc_set_polling() to consistently set/clear the
flags associated with using polling instead of interrupts.
| -rw-r--r-- | drivers/scsi/libata-core.c | 27 | ||||
| -rw-r--r-- | drivers/scsi/libata-scsi.c | 3 | ||||
| -rw-r--r-- | include/linux/libata.h | 7 |
3 files changed, 24 insertions, 13 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 0758649eaec6..cec430d4990b 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -2396,16 +2396,18 @@ int ata_qc_issue(struct ata_queued_cmd *qc) struct ata_port *ap = qc->ap; struct scsi_cmnd *cmd = qc->scsicmd; - /* set up SG table */ - if (cmd->use_sg) { - if (ata_sg_setup(qc)) - goto err_out; - } else { - if (ata_sg_setup_one(qc)) - goto err_out; - } + if (qc->flags & ATA_QCFLAG_SG) { + /* set up SG table */ + if (cmd->use_sg) { + if (ata_sg_setup(qc)) + goto err_out; + } else { + if (ata_sg_setup_one(qc)) + goto err_out; + } - ap->ops->fill_sg(qc); + ap->ops->fill_sg(qc); + } qc->ap->active_tag = qc->tag; qc->flags |= ATA_QCFLAG_ACTIVE; @@ -2450,14 +2452,17 @@ static int ata_qc_issue_prot(struct ata_queued_cmd *qc) break; case ATA_PROT_PIO: /* load tf registers, initiate polling pio */ - qc->flags |= ATA_QCFLAG_POLL; - qc->tf.ctl |= ATA_NIEN; /* disable interrupts */ + ata_qc_set_polling(qc); ata_tf_to_host_nolock(ap, &qc->tf); ap->pio_task_state = PIO_ST; queue_work(ata_wq, &ap->pio_task); break; case ATA_PROT_ATAPI: + ata_tf_to_host_nolock(ap, &qc->tf); + queue_work(ata_wq, &ap->packet_task); + break; + case ATA_PROT_ATAPI_DMA: ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ ap->ops->bmdma_setup(qc); /* set up bmdma */ diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index a8f1b72aa0e9..8456f458c2f8 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c @@ -912,9 +912,8 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) if ((cmd->sc_data_direction == SCSI_DATA_NONE) || ((qc->flags & ATA_QCFLAG_DMA) == 0)) { - qc->flags |= ATA_QCFLAG_POLL; + ata_qc_set_polling(qc); qc->tf.protocol = ATA_PROT_ATAPI; - qc->tf.ctl |= ATA_NIEN; /* disable interrupts */ qc->tf.lbam = (8 * 1024) & 0xff; qc->tf.lbah = (8 * 1024) >> 8; } else { diff --git a/include/linux/libata.h b/include/linux/libata.h index cf2a784a8850..05ebe16fc02f 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -481,6 +481,13 @@ static inline u8 ata_wait_idle(struct ata_port *ap) return status; } +static inline void ata_qc_set_polling(struct ata_queued_cmd *qc) +{ + qc->flags |= ATA_QCFLAG_POLL; + qc->flags &= ~ATA_QCFLAG_DMA; + qc->tf.ctl |= ATA_NIEN; +} + static inline struct ata_queued_cmd *ata_qc_from_tag (struct ata_port *ap, unsigned int tag) { |
