Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Mar 2017 14:44:03 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r315908 - head/sys/dev/isp
Message-ID:  <201703241444.v2OEi3t9044424@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Fri Mar 24 14:44:03 2017
New Revision: 315908
URL: https://svnweb.freebsd.org/changeset/base/315908

Log:
  Unify initiator and target DMA setup and command sending.
  
  The code is so alike that it is pointless to keep it separate.
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/isp/isp_freebsd.c
  head/sys/dev/isp/isp_freebsd.h
  head/sys/dev/isp/isp_library.c
  head/sys/dev/isp/isp_library.h
  head/sys/dev/isp/isp_pci.c
  head/sys/dev/isp/isp_sbus.c
  head/sys/dev/isp/ispvar.h

Modified: head/sys/dev/isp/isp_freebsd.c
==============================================================================
--- head/sys/dev/isp/isp_freebsd.c	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/isp_freebsd.c	Fri Mar 24 14:44:03 2017	(r315908)
@@ -1372,10 +1372,7 @@ isp_target_start_ctio(ispsoftc_t *isp, u
 		} else {
 			ct2_entry_t *cto = (ct2_entry_t *) local;
 
-			if (isp->isp_osinfo.sixtyfourbit)
-				cto->ct_header.rqs_entry_type = RQSTYPE_CTIO3;
-			else
-				cto->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
+			cto->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
 			cto->ct_header.rqs_entry_count = 1;
 			cto->ct_header.rqs_seqno |= ATPD_SEQ_NOTIFY_CAM;
 			ATPD_SET_SEQNO(cto, atp);
@@ -1468,14 +1465,8 @@ isp_target_start_ctio(ispsoftc_t *isp, u
 					isp_prt(isp, ISP_LOGTDEBUG0, "%s: ests base %p vaddr %p ecmd_dma %jx addr %jx len %u", __func__, isp->isp_osinfo.ecmd_base, atp->ests,
 					    (uintmax_t) isp->isp_osinfo.ecmd_dma, (uintmax_t)addr, MIN_FCP_RESPONSE_SIZE + sense_length);
 					cto->rsp.m2.ct_datalen = MIN_FCP_RESPONSE_SIZE + sense_length;
-					if (cto->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
-						cto->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base = DMA_LO32(addr);
-						cto->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi = DMA_HI32(addr);
-						cto->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count = MIN_FCP_RESPONSE_SIZE + sense_length;
-					} else {
-						cto->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base = DMA_LO32(addr);
-						cto->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count = MIN_FCP_RESPONSE_SIZE + sense_length;
-					}
+					cto->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base = DMA_LO32(addr);
+					cto->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count = MIN_FCP_RESPONSE_SIZE + sense_length;
 				}
 				if (sense_length) {
 					isp_prt(isp, ISP_LOGTDEBUG0, "%s: CTIO2[0x%x] seq %u nc %d CDB0=%x sstatus=0x%x flags=0x%x resid=%d sense: %x %x/%x/%x", __func__,
@@ -3468,7 +3459,7 @@ isp_action(struct cam_sim *sim, union cc
 		cpi->max_lun = ISP_MAX_LUNS(isp) == 0 ?
 		    255 : ISP_MAX_LUNS(isp) - 1;
 		cpi->bus_id = cam_sim_bus(sim);
-		if (isp->isp_osinfo.sixtyfourbit)
+		if (sizeof (bus_size_t) > 4)
 			cpi->maxio = (ISP_NSEG64_MAX - 1) * PAGE_SIZE;
 		else
 			cpi->maxio = (ISP_NSEG_MAX - 1) * PAGE_SIZE;

Modified: head/sys/dev/isp/isp_freebsd.h
==============================================================================
--- head/sys/dev/isp/isp_freebsd.h	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/isp_freebsd.h	Fri Mar 24 14:44:03 2017	(r315908)
@@ -293,7 +293,6 @@ struct isposinfo {
 	struct isp_pcmd *	pcmd_pool;
 	struct isp_pcmd *	pcmd_free;
 
-	int			sixtyfourbit;	/* sixtyfour bit platform */
 	int			mbox_sleeping;
 	int			mbox_sleep_ok;
 	int			mboxbsy;
@@ -505,6 +504,13 @@ default:							\
         d->ds_base = DMA_LO32(e->ds_addr);	\
         d->ds_count = e->ds_len;		\
 }
+#if (BUS_SPACE_MAXADDR > UINT32_MAX)
+#define XS_NEED_DMA64_SEG(s, n)					\
+	(((bus_dma_segment_t *)s)[n].ds_addr +			\
+	    ((bus_dma_segment_t *)s)[n].ds_len > UINT32_MAX)
+#else
+#define XS_NEED_DMA64_SEG(s, n)	(0)
+#endif
 #define	XS_ISP(ccb)		cam_sim_softc(xpt_path_sim((ccb)->ccb_h.path))
 #define	XS_CHANNEL(ccb)		cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
 #define	XS_TGT(ccb)		(ccb)->ccb_h.target_id

Modified: head/sys/dev/isp/isp_library.c
==============================================================================
--- head/sys/dev/isp/isp_library.c	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/isp_library.c	Fri Mar 24 14:44:03 2017	(r315908)
@@ -61,8 +61,8 @@ int
 isp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir, ispds64_t *ecmd)
 {
 	uint8_t storage[QENTRY_LEN];
-	uint8_t type, nqe;
-	uint32_t seg, curseg, seglim, nxt, nxtnxt, ddf;
+	uint8_t type, nqe, need64;
+	uint32_t seg, seglim, nxt, nxtnxt, ddf;
 	ispds_t *dsp = NULL;
 	ispds64_t *dsp64 = NULL;
 	void *qe0, *qe1;
@@ -88,8 +88,21 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 		goto copy_and_sync;
 	}
 
+	need64 = 0;
+	for (seg = 0; seg < nsegs; seg++)
+		need64 |= XS_NEED_DMA64_SEG(segp, seg);
+	if (need64) {
+		if (type == RQSTYPE_T2RQS)
+			((isphdr_t *)fqe)->rqs_entry_type = type = RQSTYPE_T3RQS;
+		else if (type == RQSTYPE_REQUEST)
+			((isphdr_t *)fqe)->rqs_entry_type = type = RQSTYPE_A64;
+		else if (type == RQSTYPE_CTIO2)
+			((isphdr_t *)fqe)->rqs_entry_type = type = RQSTYPE_CTIO3;
+	}
+
 	/*
-	 * First figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry.
+	 * First figure out how many pieces of data to transfer, what
+	 * kind and how many we can put into the first queue entry.
 	 */
 	switch (type) {
 	case RQSTYPE_REQUEST:
@@ -121,15 +134,27 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 		dsp64 = &((ispreqt7_t *)fqe)->req_dataseg;
 		seglim = 1;
 		break;
+#ifdef	ISP_TARGET_MODE
+	case RQSTYPE_CTIO2:
+		dsp = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg;
+		seglim = ISP_RQDSEG_T2;
+		break;
+	case RQSTYPE_CTIO3:
+		dsp64 = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg64;
+		seglim = ISP_RQDSEG_T3;
+		break;
+	case RQSTYPE_CTIO7:
+		dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
+		seglim = 1;
+		break;
+#endif
 	default:
 		return (CMD_COMPLETE);
 	}
-
-	if (seglim > nsegs) {
+	if (seglim > nsegs)
 		seglim = nsegs;
-	}
-
-	for (seg = curseg = 0; curseg < seglim; curseg++) {
+	seg = 0;
+	while (seg < seglim) {
 		if (dsp64) {
 			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
 		} else {
@@ -137,7 +162,6 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 		}
 	}
 
-
 	/*
 	 * Second, start building additional continuation segments as needed.
 	 */
@@ -164,10 +188,10 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 			crq->req_header.rqs_entry_count = 1;
 			dsp = crq->req_dataseg;
 		}
-		if (seg + seglim > nsegs) {
-			seglim = nsegs - seg;
-		}
-		for (curseg = 0; curseg < seglim; curseg++) {
+		seglim += seg;
+		if (seglim > nsegs)
+			seglim = nsegs;
+		while (seg < seglim) {
 			if (dsp64) {
 				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
 			} else {
@@ -191,23 +215,17 @@ copy_and_sync:
 	switch (type) {
 	case RQSTYPE_REQUEST:
 		((ispreq_t *)fqe)->req_flags |= ddf;
-		/*
-		 * This is historical and not clear whether really needed.
-		 */
-		if (nsegs == 0) {
+		/* This is historical and not clear whether really needed. */
+		if (nsegs == 0)
 			nsegs = 1;
-		}
 		((ispreq_t *)fqe)->req_seg_count = nsegs;
 		isp_put_request(isp, fqe, qe0);
 		break;
 	case RQSTYPE_CMDONLY:
 		((ispreq_t *)fqe)->req_flags |= ddf;
-		/*
-		 * This is historical and not clear whether really needed.
-		 */
-		if (nsegs == 0) {
+		/* This is historical and not clear whether really needed. */
+		if (nsegs == 0)
 			nsegs = 1;
-		}
 		((ispextreq_t *)fqe)->req_seg_count = nsegs;
 		isp_put_extended_request(isp, fqe, qe0);
 		break;
@@ -233,11 +251,34 @@ copy_and_sync:
 		}
 		break;
 	case RQSTYPE_T7RQS:
-        	((ispreqt7_t *)fqe)->req_alen_datadir = ddf;
+		((ispreqt7_t *)fqe)->req_alen_datadir = ddf;
 		((ispreqt7_t *)fqe)->req_seg_count = nsegs;
 		((ispreqt7_t *)fqe)->req_dl = totalcnt;
 		isp_put_request_t7(isp, fqe, qe0);
 		break;
+#ifdef	ISP_TARGET_MODE
+	case RQSTYPE_CTIO2:
+	case RQSTYPE_CTIO3:
+		if (((ct2_entry_t *)fqe)->ct_flags & CT2_FLAG_MODE2) {
+			((ct2_entry_t *)fqe)->ct_seg_count = 1;
+		} else {
+			((ct2_entry_t *)fqe)->ct_seg_count = nsegs;
+		}
+		if (ISP_CAP_2KLOGIN(isp)) {
+			isp_put_ctio2e(isp, fqe, qe0);
+		} else {
+			isp_put_ctio2(isp, fqe, qe0);
+		}
+		break;
+	case RQSTYPE_CTIO7:
+		if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
+			((ct7_entry_t *)fqe)->ct_seg_count = 1;
+		} else {
+			((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
+		}
+		isp_put_ctio7(isp, fqe, qe0);
+		break;
+#endif
 	default:
 		return (CMD_COMPLETE);
 	}
@@ -2057,168 +2098,6 @@ isp_put_fcp_rsp_iu(ispsoftc_t *isp, fcp_
 	ISP_IOZPUT_32(isp, src->fcp_rsp_rsplen, &dst->fcp_rsp_rsplen);
 }
 
-#ifdef	ISP_TARGET_MODE
-
-/*
- * Command shipping- finish off first queue entry and do dma mapping and
- * additional segments as needed.
- *
- * Called with the first queue entry mostly filled out.
- * Our job here is to finish that and add additional data
- * segments if needed.
- *
- * We used to do synthetic entries to split data and status
- * at this level, but that started getting too tricky.
- */
-int
-isp_send_tgt_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir, void *snsptr, uint32_t snslen)
-{
-	uint8_t storage[QENTRY_LEN];
-	uint8_t type, nqe;
-	uint32_t seg, curseg, seglim, nxt, nxtnxt;
-	ispds_t *dsp = NULL;
-	ispds64_t *dsp64 = NULL;
-	void *qe0, *qe1;
-
-	qe0 = isp_getrqentry(isp);
-	if (qe0 == NULL) {
-		return (CMD_EAGAIN);
-	}
-	nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
-
-	type = ((isphdr_t *)fqe)->rqs_entry_type;
-	nqe = 1;
-	seglim = 0;
-
-	/*
-	 * If we have data to transmit, figure out how many segments can fit into the first entry.
-	 */
-	if (ddir != ISP_NOXFR) {
-		/*
-		 * First, figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry.
-		 */
-		switch (type) {
-		case RQSTYPE_CTIO2:
-			dsp = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg;
-			seglim = ISP_RQDSEG_T2;
-			break;
-		case RQSTYPE_CTIO3:
-			dsp64 = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg64;
-			seglim = ISP_RQDSEG_T3;
-			break;
-		case RQSTYPE_CTIO7:
-			dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
-			seglim = 1;
-			break;
-		default:
-			return (CMD_COMPLETE);
-		}
-	}
-
-	/*
-	 * First, fill out any of the data transfer stuff that fits
-	 * in the first queue entry.
-	 */
-	if (seglim > nsegs) {
-		seglim = nsegs;
-	}
-
-	for (seg = curseg = 0; curseg < seglim; curseg++) {
-		if (dsp64) {
-			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
-		} else {
-			XS_GET_DMA_SEG(dsp++, segp, seg++);
-		}
-	}
-
-	/*
-	 * Second, start building additional continuation segments as needed.
-	 */
-	while (seg < nsegs) {
-		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
-		if (nxtnxt == isp->isp_reqodx) {
-			isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
-			if (nxtnxt == isp->isp_reqodx)
-				return (CMD_EAGAIN);
-		}
-		ISP_MEMZERO(storage, QENTRY_LEN);
-		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
-		nxt = nxtnxt;
-		if (dsp64) {
-			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
-			seglim = ISP_CDSEG64;
-			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
-			crq->req_header.rqs_entry_count = 1;
-			dsp64 = crq->req_dataseg;
-		} else {
-			ispcontreq_t *crq = (ispcontreq_t *) storage;
-			seglim = ISP_CDSEG;
-			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
-			crq->req_header.rqs_entry_count = 1;
-			dsp = crq->req_dataseg;
-		}
-		if (seg + seglim > nsegs) {
-			seglim = nsegs - seg;
-		}
-		for (curseg = 0; curseg < seglim; curseg++) {
-			if (dsp64) {
-				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
-			} else {
-				XS_GET_DMA_SEG(dsp++, segp, seg++);
-			}
-		}
-		if (dsp64) {
-			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
-		} else {
-			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
-		}
-		if (isp->isp_dblev & ISP_LOGTDEBUG1) {
-			isp_print_bytes(isp, "additional queue entry",
-			    QENTRY_LEN, qe1);
-		}
-		nqe++;
-        }
-
-	/*
-	 * Third, not patch up the first queue entry with the number of segments
-	 * we actually are going to be transmitting. At the same time, handle
-	 * any mode 2 requests.
-	 */
-	((isphdr_t *)fqe)->rqs_entry_count = nqe;
-	switch (type) {
-	case RQSTYPE_CTIO2:
-	case RQSTYPE_CTIO3:
-		if (((ct2_entry_t *)fqe)->ct_flags & CT2_FLAG_MODE2) {
-			((ct2_entry_t *)fqe)->ct_seg_count = 1;
-		} else {
-			((ct2_entry_t *)fqe)->ct_seg_count = nsegs;
-		}
-		if (ISP_CAP_2KLOGIN(isp)) {
-			isp_put_ctio2e(isp, fqe, qe0);
-		} else {
-			isp_put_ctio2(isp, fqe, qe0);
-		}
-		break;
-	case RQSTYPE_CTIO7:
-		if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
-			((ct7_entry_t *)fqe)->ct_seg_count = 1;
-		} else {
-			((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
-		}
-		isp_put_ctio7(isp, fqe, qe0);
-		break;
-	default:
-		return (CMD_COMPLETE);
-	}
-	if (isp->isp_dblev & ISP_LOGTDEBUG1) {
-		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, qe0);
-	}
-	ISP_ADD_REQUEST(isp, nxt);
-	return (CMD_QUEUED);
-}
-
-#endif
-
 /*
  * Find port database entries
  */

Modified: head/sys/dev/isp/isp_library.h
==============================================================================
--- head/sys/dev/isp/isp_library.h	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/isp_library.h	Fri Mar 24 14:44:03 2017	(r315908)
@@ -156,9 +156,8 @@ void isp_put_fcp_rsp_iu(ispsoftc_t *isp,
 #else
 #include "isp_target.h"
 #endif
-
-int isp_send_tgt_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t, void *, uint32_t);
 #endif
+
 int isp_find_pdb_empty(ispsoftc_t *, int, fcportdb_t **);
 int isp_find_pdb_by_wwpn(ispsoftc_t *, int, uint64_t, fcportdb_t **);
 int isp_find_pdb_by_handle(ispsoftc_t *, int, uint16_t, fcportdb_t **);

Modified: head/sys/dev/isp/isp_pci.c
==============================================================================
--- head/sys/dev/isp/isp_pci.c	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/isp_pci.c	Fri Mar 24 14:44:03 2017	(r315908)
@@ -682,8 +682,6 @@ isp_pci_attach(device_t dev)
 	pcs->pci_dev = dev;
 	isp->isp_dev = dev;
 	isp->isp_nchan = 1;
-	if (sizeof (bus_addr_t) > 4)
-		isp->isp_osinfo.sixtyfourbit = 1;
 	mtx_init(&isp->isp_lock, "isp", NULL, MTX_DEF);
 
 	/*
@@ -1527,7 +1525,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 		slim = (1UL << 24);
 		llim = BUS_SPACE_MAXADDR_32BIT;
 	}
-	if (isp->isp_osinfo.sixtyfourbit)
+	if (sizeof (bus_size_t) > 4)
 		nsegs = ISP_NSEG64_MAX;
 	else
 		nsegs = ISP_NSEG_MAX;
@@ -1839,122 +1837,39 @@ typedef struct {
 
 #define	MUSHERR_NOQENTRIES	-2
 
-#ifdef	ISP_TARGET_MODE
-static void
-tdma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
-{
-	mush_t *mp;
-	ispsoftc_t *isp;
-	struct ccb_scsiio *csio;
-	isp_ddir_t ddir;
-	ispreq_t *rq;
-
-	mp = (mush_t *) arg;
-	if (error) {
-		mp->error = error;
-		return;
-	}
-	csio = mp->cmd_token;
-	isp = mp->isp;
-	rq = mp->rq;
-	if (nseg) {
-		if (isp->isp_osinfo.sixtyfourbit) {
-			if (nseg >= ISP_NSEG64_MAX) {
-				isp_prt(isp, ISP_LOGERR, "number of segments (%d) exceed maximum we can support (%d)", nseg, ISP_NSEG64_MAX);
-				mp->error = EFAULT;
-				return;
-			}
-			if (rq->req_header.rqs_entry_type == RQSTYPE_CTIO2) {
-				rq->req_header.rqs_entry_type = RQSTYPE_CTIO3;
-			}
-		} else {
-			if (nseg >= ISP_NSEG_MAX) {
-				isp_prt(isp, ISP_LOGERR, "number of segments (%d) exceed maximum we can support (%d)", nseg, ISP_NSEG_MAX);
-				mp->error = EFAULT;
-				return;
-			}
-		}
-		if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-			bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE);
-			ddir = ISP_TO_DEVICE;
-		} else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) {
-			bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD);
-			ddir = ISP_FROM_DEVICE;
-		} else {
-			dm_segs = NULL;
-			nseg = 0;
-			ddir = ISP_NOXFR;
-		}
-	} else {
-		dm_segs = NULL;
-		nseg = 0;
-		ddir = ISP_NOXFR;
-	}
-
-	error = isp_send_tgt_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir, &csio->sense_data, csio->sense_len);
-	switch (error) {
-	case CMD_EAGAIN:
-		mp->error = MUSHERR_NOQENTRIES;
-	case CMD_QUEUED:
-		break;
-	default:
-		mp->error = EIO;
-	}
-}
-#endif
-
 static void
 dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
 {
-	mush_t *mp;
-	ispsoftc_t *isp;
-	struct ccb_scsiio *csio;
+	mush_t *mp = (mush_t *) arg;
+	ispsoftc_t *isp= mp->isp;
+	struct ccb_scsiio *csio = mp->cmd_token;
 	isp_ddir_t ddir;
-	ispreq_t *rq;
+	int sdir;
 
-	mp = (mush_t *) arg;
 	if (error) {
 		mp->error = error;
 		return;
 	}
-	csio = mp->cmd_token;
-	isp = mp->isp;
-	rq = mp->rq;
-	if (nseg) {
-		if (isp->isp_osinfo.sixtyfourbit) {
-			if (nseg >= ISP_NSEG64_MAX) {
-				isp_prt(isp, ISP_LOGERR, "number of segments (%d) exceed maximum we can support (%d)", nseg, ISP_NSEG64_MAX);
-				mp->error = EFAULT;
-				return;
-			}
-			if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
-				rq->req_header.rqs_entry_type = RQSTYPE_T3RQS;
-			} else if (rq->req_header.rqs_entry_type == RQSTYPE_REQUEST) {
-				rq->req_header.rqs_entry_type = RQSTYPE_A64;
-			}
-		} else {
-			if (nseg >= ISP_NSEG_MAX) {
-				isp_prt(isp, ISP_LOGERR, "number of segments (%d) exceed maximum we can support (%d)", nseg, ISP_NSEG_MAX);
-				mp->error = EFAULT;
-				return;
-			}
-		}
+	if (nseg == 0) {
+		ddir = ISP_NOXFR;
+	} else {
 		if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-			bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD);
 			ddir = ISP_FROM_DEVICE;
-		} else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) {
-			bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE);
+		} else {
 			ddir = ISP_TO_DEVICE;
+		}
+		if ((csio->ccb_h.func_code == XPT_CONT_TARGET_IO) ^
+		    ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)) {
+			sdir = BUS_DMASYNC_PREREAD;
 		} else {
-			ddir = ISP_NOXFR;
+			sdir = BUS_DMASYNC_PREWRITE;
 		}
-	} else {
-		dm_segs = NULL;
-		nseg = 0;
-		ddir = ISP_NOXFR;
+		bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap,
+		    sdir);
 	}
 
-	error = isp_send_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir, (ispds64_t *)csio->req_map);
+	error = isp_send_cmd(isp, mp->rq, dm_segs, nseg, XS_XFRLEN(csio),
+	    ddir, (ispds64_t *)csio->req_map);
 	switch (error) {
 	case CMD_EAGAIN:
 		mp->error = MUSHERR_NOQENTRIES;
@@ -1971,7 +1886,6 @@ static int
 isp_pci_dmasetup(ispsoftc_t *isp, struct ccb_scsiio *csio, void *ff)
 {
 	mush_t mush, *mp;
-	void (*eptr)(void *, bus_dma_segment_t *, int, int);
 	int error;
 
 	mp = &mush;
@@ -1980,15 +1894,8 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct
 	mp->rq = ff;
 	mp->error = 0;
 
-#ifdef	ISP_TARGET_MODE
-	if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO)
-		eptr = tdma2;
-	else
-#endif
-		eptr = dma2;
-
 	error = bus_dmamap_load_ccb(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap,
-	    (union ccb *)csio, eptr, mp, 0);
+	    (union ccb *)csio, dma2, mp, 0);
 	if (error == EINPROGRESS) {
 		bus_dmamap_unload(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap);
 		mp->error = EINVAL;

Modified: head/sys/dev/isp/isp_sbus.c
==============================================================================
--- head/sys/dev/isp/isp_sbus.c	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/isp_sbus.c	Fri Mar 24 14:44:03 2017	(r315908)
@@ -592,37 +592,36 @@ typedef struct {
 static void
 dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
 {
-	mush_t *mp;
-	ispsoftc_t *isp;
-	struct ccb_scsiio *csio;
+	mush_t *mp = (mush_t *) arg;
+	ispsoftc_t *isp = mp->isp;
+	struct ccb_scsiio *csio = mp->cmd_token;
 	isp_ddir_t ddir;
-	ispreq_t *rq;
+	int sdir;
 
-	mp = (mush_t *) arg;
 	if (error) {
 		mp->error = error;
 		return;
 	}
-	csio = mp->cmd_token;
-	isp = mp->isp;
-	rq = mp->rq;
-	if (nseg) {
+	if (nseg == 0) {
+		ddir = ISP_NOXFR;
+	} else {
 		if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-			bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD);
 			ddir = ISP_FROM_DEVICE;
-		} else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) {
-			bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE);
+		} else {
 			ddir = ISP_TO_DEVICE;
+		}
+		if ((csio->ccb_h.func_code == XPT_CONT_TARGET_IO) ^
+		    ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)) {
+			sdir = BUS_DMASYNC_PREREAD;
 		} else {
-			ddir = ISP_NOXFR;
+			sdir = BUS_DMASYNC_PREWRITE;
 		}
-	} else {
-		dm_segs = NULL;
-		nseg = 0;
-		ddir = ISP_NOXFR;
+		bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap,
+		    sdir);
 	}
 
-	if (isp_send_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir, NULL) != CMD_QUEUED) {
+	if (isp_send_cmd(isp, mp->rq, dm_segs, nseg, XS_XFRLEN(csio),
+	    ddir, NULL) != CMD_QUEUED) {
 		mp->error = MUSHERR_NOQENTRIES;
 	}
 }

Modified: head/sys/dev/isp/ispvar.h
==============================================================================
--- head/sys/dev/isp/ispvar.h	Fri Mar 24 14:40:53 2017	(r315907)
+++ head/sys/dev/isp/ispvar.h	Fri Mar 24 14:44:03 2017	(r315908)
@@ -999,6 +999,7 @@ void isp_async(ispsoftc_t *, ispasync_t,
  *	XS_DMA_ADDR_T		Platform PCI DMA Address Type
  *	XS_GET_DMA_SEG(..)	Get 32 bit dma segment list value
  *	XS_GET_DMA64_SEG(..)	Get 64 bit dma segment list value
+ *	XS_NEED_DMA64_SEG(..)	dma segment needs 64 bit storage
  *	XS_ISP(xs)		gets an instance out of an XS_T
  *	XS_CHANNEL(xs)		gets the channel (bus # for DUALBUS cards) ""
  *	XS_TGT(xs)		gets the target ""



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