xs->flags |= ITSDONE;
ahc_setup_data(struct ahc_softc *ahc, struct scsi_xfer *xs,	       struct scb *scb){	struct hardware_scb *hscb;		hscb = scb->hscb;	xs->resid = xs->status = 0;	xs->error = CAM_REQ_INPROG;	hscb->cdb_len = xs->cmdlen;	if (hscb->cdb_len > sizeof(hscb->cdb32)) {		int s;		ahc_set_transaction_status(scb, CAM_REQ_INVALID);		ahc_lock(ahc, &s);		ahc_free_scb(ahc, scb);		ahc_unlock(ahc, &s);		scsi_done(xs);		return (COMPLETE);	}	if (hscb->cdb_len > 12) {		memcpy(hscb->cdb32, xs->cmd, hscb->cdb_len);		scb->flags |= SCB_CDB32_PTR;	} else {		memcpy(hscb->shared_data.cdb, xs->cmd, hscb->cdb_len);	}			/* Only use S/G if there is a transfer */	if (xs->datalen) {		int error;                error = bus_dmamap_load(ahc->parent_dmat,					scb->dmamap, xs->data,					xs->datalen, NULL,					(xs->flags & SCSI_NOSLEEP) ?					BUS_DMA_NOWAIT : BUS_DMA_WAITOK);		if (error) {#ifdef AHC_DEBUG                        printf("%s: in ahc_setup_data(): bus_dmamap_load() "			       "= %d\n",			       ahc_name(ahc), error);#endif			xs->error = XS_BUSY;			scsi_done(xs);			return (TRY_AGAIN_LATER);	/* XXX fvdl */}		error = ahc_execute_scb(scb,					scb->dmamap->dm_segs,					scb->dmamap->dm_nsegs);		return error;	} else {		return ahc_execute_scb(scb, NULL, 0);	}}