svn commit: r251899 - in stable/9/sys/dev: isci mps

Scott Long scottl at FreeBSD.org
Tue Jun 18 05:37:07 UTC 2013


Author: scottl
Date: Tue Jun 18 05:37:06 2013
New Revision: 251899
URL: http://svnweb.freebsd.org/changeset/base/251899

Log:
  MFC r248825, 248775
  
  Add unmapped i/o support for the mps and isci drivers.
  
  Submitted by:	mav, jimharris
  Obtained from:	Netflix

Modified:
  stable/9/sys/dev/isci/isci_controller.c
  stable/9/sys/dev/isci/isci_io_request.c
  stable/9/sys/dev/mps/mps_sas.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/isci/isci_controller.c
==============================================================================
--- stable/9/sys/dev/isci/isci_controller.c	Tue Jun 18 05:22:17 2013	(r251898)
+++ stable/9/sys/dev/isci/isci_controller.c	Tue Jun 18 05:37:06 2013	(r251899)
@@ -632,7 +632,8 @@ void isci_action(struct cam_sim *sim, un
 			cpi->version_num = 1;
 			cpi->hba_inquiry = PI_TAG_ABLE;
 			cpi->target_sprt = 0;
-			cpi->hba_misc = PIM_NOBUSRESET | PIM_SEQSCAN;
+			cpi->hba_misc = PIM_NOBUSRESET | PIM_SEQSCAN |
+			    PIM_UNMAPPED;
 			cpi->hba_eng_cnt = 0;
 			cpi->max_target = SCI_MAX_REMOTE_DEVICES - 1;
 			cpi->max_lun = ISCI_MAX_LUN;

Modified: stable/9/sys/dev/isci/isci_io_request.c
==============================================================================
--- stable/9/sys/dev/isci/isci_io_request.c	Tue Jun 18 05:22:17 2013	(r251898)
+++ stable/9/sys/dev/isci/isci_io_request.c	Tue Jun 18 05:37:06 2013	(r251899)
@@ -506,10 +506,31 @@ uint8_t *
 scif_cb_io_request_get_virtual_address_from_sgl(void * scif_user_io_request,
     uint32_t byte_offset)
 {
-	struct ISCI_IO_REQUEST *isci_request =
-	    (struct ISCI_IO_REQUEST *)scif_user_io_request;
+	struct ISCI_IO_REQUEST	*isci_request;
+	union ccb		*ccb;
+
 
-	return (isci_request->ccb->csio.data_ptr + byte_offset);
+	isci_request = scif_user_io_request;
+	ccb = isci_request->ccb;
+
+	/*
+	 * This callback is only invoked for SCSI/ATA translation of
+	 *  PIO commands such as INQUIRY and READ_CAPACITY, to allow
+	 *  the driver to write the translated data directly into the
+	 *  data buffer.  It is never invoked for READ/WRITE commands.
+	 *  The driver currently assumes only READ/WRITE commands will
+	 *  be unmapped.
+	 *
+	 * As a safeguard against future changes to unmapped commands,
+	 *  add an explicit panic here should the DATA_MASK != VADDR.
+	 *  Otherwise, we would return some garbage pointer back to the
+	 *  caller which would result in a panic or more subtle data
+	 *  corruption later on.
+	 */
+	if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
+		panic("%s: requesting pointer into unmapped ccb", __func__);
+
+	return (ccb->csio.data_ptr + byte_offset);
 }
 
 /**
@@ -747,10 +768,6 @@ isci_io_request_execute_scsi_io(union cc
 	io_request->current_sge_index = 0;
 	io_request->parent.remote_device_handle = device->sci_object;
 
-	if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
-		panic("Unexpected cam data format!  flags = 0x%x\n",
-		    ccb->ccb_h.flags);
-
 	error = bus_dmamap_load_ccb(io_request->parent.dma_tag,
 	    io_request->parent.dma_map, ccb,
 	    isci_io_request_construct, io_request, 0x0);

Modified: stable/9/sys/dev/mps/mps_sas.c
==============================================================================
--- stable/9/sys/dev/mps/mps_sas.c	Tue Jun 18 05:22:17 2013	(r251898)
+++ stable/9/sys/dev/mps/mps_sas.c	Tue Jun 18 05:37:06 2013	(r251899)
@@ -914,7 +914,7 @@ mpssas_action(struct cam_sim *sim, union
 		cpi->version_num = 1;
 		cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
 		cpi->target_sprt = 0;
-		cpi->hba_misc = PIM_NOBUSRESET;
+		cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED;
 		cpi->hba_eng_cnt = 0;
 		cpi->max_target = sassc->sc->facts->MaxTargets - 1;
 		cpi->max_lun = 255;
@@ -2238,6 +2238,7 @@ mpssas_scsiio_complete(struct mps_softc 
 		if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) &&
 		    (csio->cdb_io.cdb_bytes[1] & SI_EVPD) &&
 		    (csio->cdb_io.cdb_bytes[2] == SVPD_SUPPORTED_PAGE_LIST) &&
+		    ((csio->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) &&
 		    (csio->data_ptr != NULL) && (((uint8_t *)cm->cm_data)[0] ==
 		    T_SEQUENTIAL) && (sc->control_TLR) &&
 		    (sc->mapping_table[csio->ccb_h.target_id].device_info &


More information about the svn-src-all mailing list