Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Aug 2009 19:24:32 GMT
From:      Alexander Motin <mav@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 167333 for review
Message-ID:  <200908141924.n7EJOWQJ022140@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167333

Change 167333 by mav@mav_mavbook on 2009/08/14 19:23:42

	Add some ATAPI support to ATA_CAM wrapper.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/dev/ata/ata-all.c#22 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/dev/ata/ata-all.c#22 (text+ko) ====

@@ -149,7 +149,9 @@
     /* reset the controller HW, the channel and device(s) */
     while (ATA_LOCKING(dev, ATA_LF_LOCK) != ch->unit)
 	pause("ataatch", 1);
+#ifndef ATA_CAM
     ATA_RESET(dev);
+#endif
     ATA_LOCKING(dev, ATA_LF_UNLOCK);
 
     /* allocate DMA resources if DMA HW present*/
@@ -1188,11 +1190,6 @@
 	if (ccb->ccb_h.func_code == XPT_ATA_IO) {
 		request->data = ccb->ataio.data_ptr;
 		request->bytecount = ccb->ataio.dxfer_len;
-	} else {
-		request->data = ccb->csio.data_ptr;
-		request->bytecount = ccb->csio.dxfer_len;
-	}
-	if (ccb->ccb_h.func_code == XPT_ATA_IO) {
 		request->u.ata.command = ccb->ataio.cmd.command;
 		request->u.ata.feature = ((uint16_t)ccb->ataio.cmd.features_exp << 8) |
 					  (uint16_t)ccb->ataio.cmd.features;
@@ -1206,14 +1203,29 @@
 				      (uint64_t)ccb->ataio.cmd.lba_low;
 		if (ccb->ataio.cmd.flags & CAM_ATAIO_48BIT)
 			request->flags |= ATA_R_48BIT;
-		if (ccb->ataio.cmd.flags & CAM_ATAIO_DMA)
+		if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE &&
+		    ccb->ataio.cmd.flags & CAM_ATAIO_DMA)
+			request->flags |= ATA_R_DMA;
+		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
+			request->flags |= ATA_R_READ;
+		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT)
+			request->flags |= ATA_R_WRITE;
+	} else {
+		request->data = ccb->csio.data_ptr;
+		request->bytecount = ccb->csio.dxfer_len;
+		bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ?
+		    ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes,
+		    request->u.atapi.ccb, ccb->csio.cdb_len);
+		request->flags |= ATA_R_ATAPI;
+		if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE /*&&
+		    ccb->ataio.cmd.flags & CAM_ATAIO_DMA*/)
 			request->flags |= ATA_R_DMA;
 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
 			request->flags |= ATA_R_READ;
 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT)
 			request->flags |= ATA_R_WRITE;
 	}
-	request->transfersize = min(request->bytecount, 512);
+	request->transfersize = min(request->bytecount, 16*512);
 //	request->callback = ad_done;
 	request->retries = 0;
 	request->timeout = ccb->ccb_h.timeout / 1000;
@@ -1223,7 +1235,6 @@
 	ch->running = request;
 	ch->state = ATA_ACTIVE;
 	if (ch->hw.begin_transaction(request) == ATA_OP_FINISHED) {
-device_printf(dev, "XXX: EARLY FINISH!\n");
 	    ch->running = NULL;
 	    ch->state = ATA_IDLE;
 	    ata_cam_end_transaction(dev, request);
@@ -1241,7 +1252,10 @@
 	ccb->ccb_h.status &= ~CAM_STATUS_MASK;
 	if (request->result == 0)
 		ccb->ccb_h.status |= CAM_REQ_CMP;
-	else
+	else if (ccb->ccb_h.func_code == XPT_SCSI_IO) {
+		ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
+		ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
+	} else
 		ccb->ccb_h.status |= CAM_REQ_CMP_ERR;
 	ata_free_request(request);
 	xpt_done(ccb);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908141924.n7EJOWQJ022140>