Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54f00389 authored by Albert Lee's avatar Albert Lee Committed by Jeff Garzik
Browse files

[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: default avatarAlbert Lee <albertcc@tw.ibm.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 86a7397c
Loading
Loading
Loading
Loading
+23 −23
Original line number Diff line number Diff line
@@ -3407,24 +3407,24 @@ int ata_qc_issue_prot(struct ata_queued_cmd *qc)

		ata_tf_to_host_nolock(ap, &qc->tf);

		if (qc->tf.flags & ATA_TFLAG_POLLING) {
			/* polling PIO */
			ap->hsm_task_state = HSM_ST;
			queue_work(ata_wq, &ap->pio_task);
		} else {
			/* interrupt driven PIO */
		if (qc->tf.flags & ATA_TFLAG_WRITE) {
			/* PIO data out protocol */
			ap->hsm_task_state = HSM_ST_FIRST;
			queue_work(ata_wq, &ap->dataout_task);

				/* send first data block by polling */
			/* always send first data block using
			 * the ata_dataout_task() codepath.
			 */
		} else {
			/* PIO data in protocol */
			ap->hsm_task_state = HSM_ST;

				/* interrupt handler takes over from here */
			}
			if (qc->tf.flags & ATA_TFLAG_POLLING)
				queue_work(ata_wq, &ap->pio_task);

			/* if polling, ata_pio_task() handles the rest.
			 * otherwise, interrupt handler takes over from here.
			 */
		}

		break;
@@ -4005,15 +4005,15 @@ static void ata_dataout_task(void *_data)
		ap->hsm_task_state = HSM_ST;
		ata_pio_sector(qc);
		ata_altstatus(ap); /* flush */

		/* interrupt handler takes over from here */
	} else {
	} else
		/* send CDB */
		atapi_send_cdb(ap, qc);

	/* if polling, ata_pio_task() handles the rest.
	 * 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);