if (qc->tf.protocol == ATA_PROT_ATAPI_DMA || qc->tf.protocol == ATA_PROT_ATAPI_NODATA) { unsigned long flags; 
if (is_atapi_taskfile(&qc->tf)) { /* send CDB */ atapi_send_cdb(ap, qc); 
static void atapi_packet_task(void *_data){	struct ata_port *ap = _data;	struct ata_queued_cmd *qc;	u8 status;	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_CDB_QUICK, ATA_TMOUT_CDB))		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 SCSI cdb */	DPRINTK("send cdb\n");	assert(ap->cdb_len >= 12);	if (qc->tf.protocol == ATA_PROT_ATAPI_DMA ||	    qc->tf.protocol == ATA_PROT_ATAPI_NODATA) {		unsigned long flags;		/* Once we're done issuing command and kicking bmdma,		 * irq handler takes over.  To not lose irq, we need		 * to clear NOINTR flag before sending cdb, but		 * interrupt handler shouldn't be invoked before we're		 * finished.  Hence, the following locking.		 */		spin_lock_irqsave(&ap->host_set->lock, flags);		ap->flags &= ~ATA_FLAG_NOINTR;		ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1);		if (qc->tf.protocol == ATA_PROT_ATAPI_DMA)			ap->ops->bmdma_start(qc);	/* initiate bmdma */		spin_unlock_irqrestore(&ap->host_set->lock, flags);	} else {		ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1);		/* PIO commands are handled by polling */		ap->hsm_task_state = HSM_ST;		queue_work(ata_wq, &ap->pio_task);	}	return;err_out:	ata_poll_qc_complete(qc, ATA_ERR);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/312f7da2824c82800ee78d6190f12854456957af/libata-core.c/clean/drivers/scsi/libata-core.c