if (is_atapi_taskfile(&qc->tf)) { /* send CDB */ atapi_send_cdb(ap, qc);  if (qc->tf.flags & ATA_TFLAG_POLLING) queue_work(ata_wq, &ap->pio_task); } else { 
if (qc->tf.protocol == ATA_PROT_PIO) { 
static void ata_dataout_task(void *_data){	struct ata_port *ap = _data;	struct ata_queued_cmd *qc;	u8 status;	unsigned long flags;	qc = ata_qc_from_tag(ap, ap->active_tag);	assert(qc != NULL);	assert(qc->flags & ATA_QCFLAG_ACTIVE);	/* sleep-wait for BSY to clear */	DPRINTK("busy wait\n");	if (ata_busy_sleep(ap, ATA_TMOUT_DATAOUT_QUICK, ATA_TMOUT_DATAOUT))		goto err_out;	/* make sure DRQ is set */	status = ata_chk_status(ap);	if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ)		goto err_out;	/* Send the CDB (atapi) or the first data block (ata pio out).	 * During the state transition, interrupt handler shouldn't	 * be invoked before the data transfer is complete and	 * hsm_task_state is changed. Hence, the following locking.	 */	spin_lock_irqsave(&ap->host_set->lock, flags);	if (is_atapi_taskfile(&qc->tf)) {		/* send CDB */		atapi_send_cdb(ap, qc);		if (qc->tf.flags & ATA_TFLAG_POLLING)			queue_work(ata_wq, &ap->pio_task);	} else {		/* PIO data out protocol.		 * send first data block.		 */		/* ata_pio_sector() might change the state to HSM_ST_LAST.		 * so, the state is changed here before ata_pio_sector().		 */		ap->hsm_task_state = HSM_ST;		ata_pio_sector(qc);		ata_altstatus(ap); /* flush */		/* interrupt handler takes over from here */	}	spin_unlock_irqrestore(&ap->host_set->lock, flags);	return;err_out:	ata_pio_error(ap);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/86a7397cda08a65bc4f306e812c846e2437b5347/libata-core.c/clean/drivers/scsi/libata-core.c