[PATCH] libata irq-pio: cleanup ata_qc_issue_prot()
ata_qc_issue_prot(): - cleanup and let the PIO data out case always go through the ata_dataout_task() codepath. (Previously for PIO data out case, 2 code pathes were used - irq case goes through ata_data_out_task() codepath. - polling case jumps over the HSM_ST_FIRST state and goes to HSM_ST and ata_pio_task() directly.) ata_dataout_task(): - rearrange the queue_work() code to handle the PIO data out + polling case. Signed-off-by: Albert Lee <albertcc@tw.ibm.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
This commit is contained in:
@@ -3407,24 +3407,24 @@ int ata_qc_issue_prot(struct ata_queued_cmd *qc)
|
|||||||
|
|
||||||
ata_tf_to_host_nolock(ap, &qc->tf);
|
ata_tf_to_host_nolock(ap, &qc->tf);
|
||||||
|
|
||||||
if (qc->tf.flags & ATA_TFLAG_POLLING) {
|
if (qc->tf.flags & ATA_TFLAG_WRITE) {
|
||||||
/* polling PIO */
|
/* PIO data out protocol */
|
||||||
ap->hsm_task_state = HSM_ST;
|
ap->hsm_task_state = HSM_ST_FIRST;
|
||||||
queue_work(ata_wq, &ap->pio_task);
|
queue_work(ata_wq, &ap->dataout_task);
|
||||||
|
|
||||||
|
/* always send first data block using
|
||||||
|
* the ata_dataout_task() codepath.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/* interrupt driven PIO */
|
/* PIO data in protocol */
|
||||||
if (qc->tf.flags & ATA_TFLAG_WRITE) {
|
ap->hsm_task_state = HSM_ST;
|
||||||
/* PIO data out protocol */
|
|
||||||
ap->hsm_task_state = HSM_ST_FIRST;
|
|
||||||
queue_work(ata_wq, &ap->dataout_task);
|
|
||||||
|
|
||||||
/* send first data block by polling */
|
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||||
} else {
|
queue_work(ata_wq, &ap->pio_task);
|
||||||
/* PIO data in protocol */
|
|
||||||
ap->hsm_task_state = HSM_ST;
|
|
||||||
|
|
||||||
/* interrupt handler takes over from here */
|
/* if polling, ata_pio_task() handles the rest.
|
||||||
}
|
* otherwise, interrupt handler takes over from here.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -4005,15 +4005,15 @@ static void ata_dataout_task(void *_data)
|
|||||||
ap->hsm_task_state = HSM_ST;
|
ap->hsm_task_state = HSM_ST;
|
||||||
ata_pio_sector(qc);
|
ata_pio_sector(qc);
|
||||||
ata_altstatus(ap); /* flush */
|
ata_altstatus(ap); /* flush */
|
||||||
|
} else
|
||||||
/* interrupt handler takes over from here */
|
|
||||||
} else {
|
|
||||||
/* send CDB */
|
/* send CDB */
|
||||||
atapi_send_cdb(ap, qc);
|
atapi_send_cdb(ap, qc);
|
||||||
|
|
||||||
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
/* if polling, ata_pio_task() handles the rest.
|
||||||
queue_work(ata_wq, &ap->pio_task);
|
* otherwise, interrupt handler takes over from here.
|
||||||
}
|
*/
|
||||||
|
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||||
|
queue_work(ata_wq, &ap->pio_task);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&ap->host_set->lock, flags);
|
spin_unlock_irqrestore(&ap->host_set->lock, flags);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user