--- id2/include/linux/libata.h 2005-09-30 17:48:55.000000000 +0800 +++ id6/include/linux/libata.h 2005-10-03 10:18:29.000000000 +0800 @@ -319,8 +319,6 @@ struct ata_port { struct ata_host_stats stats; struct ata_host_set *host_set; - struct work_struct dataout_task; - struct work_struct pio_task; unsigned int hsm_task_state; unsigned long pio_task_timeout; --- id5/drivers/scsi/libata-core.c 2005-10-03 10:25:01.000000000 +0800 +++ id6/drivers/scsi/libata-core.c 2005-10-03 11:07:01.000000000 +0800 @@ -2732,8 +2732,8 @@ static void atapi_send_cdb(struct ata_po } /** - * ata_dataout_task - Write first data block to hardware - * @_data: Port to which ATA/ATAPI device is attached. + * ata_pio_first_block - Write first data block to hardware + * @ap: Port to which ATA/ATAPI device is attached. * * When device has indicated its readiness to accept * the data, this function sends out the CDB or @@ -2746,9 +2746,8 @@ static void atapi_send_cdb(struct ata_po * Kernel thread context (may sleep) */ -static void ata_dataout_task(void *_data) +static void ata_pio_first_block(struct ata_port *ap) { - struct ata_port *ap = _data; struct ata_queued_cmd *qc; u8 status; unsigned long flags; @@ -3018,7 +3017,8 @@ fsm_start: qc_completed = 0; switch (ap->hsm_task_state) { - case HSM_ST_IDLE: + case HSM_ST_FIRST: + ata_pio_first_block(ap); return; case HSM_ST: @@ -3038,6 +3038,9 @@ fsm_start: case HSM_ST_ERR: ata_pio_error(ap); return; + default: + BUG(); + return; } if (timeout) @@ -3518,10 +3521,10 @@ int ata_qc_issue_prot(struct ata_queued_ 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); + queue_work(ata_wq, &ap->pio_task); /* always send first data block using - * the ata_dataout_task() codepath. + * the ata_pio_task() codepath. */ } else { /* PIO data in protocol */ @@ -3548,7 +3551,7 @@ int ata_qc_issue_prot(struct ata_queued_ /* send cdb by polling if no cdb interrupt */ if ((!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) || (qc->tf.flags & ATA_TFLAG_POLLING)) - queue_work(ata_wq, &ap->dataout_task); + queue_work(ata_wq, &ap->pio_task); break; case ATA_PROT_ATAPI_DMA: @@ -3560,7 +3563,7 @@ int ata_qc_issue_prot(struct ata_queued_ /* send cdb by polling if no cdb interrupt */ if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) - queue_work(ata_wq, &ap->dataout_task); + queue_work(ata_wq, &ap->pio_task); break; default: @@ -4141,7 +4144,6 @@ static void ata_host_init(struct ata_por ap->active_tag = ATA_TAG_POISON; ap->last_ctl = 0xFF; - INIT_WORK(&ap->dataout_task, ata_dataout_task, ap); INIT_WORK(&ap->pio_task, ata_pio_task, ap); for (i = 0; i < ATA_MAX_DEVICES; i++)