svn commit: r244845 - projects/altix2/sys/dev/isp

Marcel Moolenaar marcel at FreeBSD.org
Sun Dec 30 00:47:31 UTC 2012


Author: marcel
Date: Sun Dec 30 00:47:30 2012
New Revision: 244845
URL: http://svnweb.freebsd.org/changeset/base/244845

Log:
  o   Convert the busdma_sync operations.
  o   Improve busdma_mem_alloc buffer allocation.

Modified:
  projects/altix2/sys/dev/isp/isp_freebsd.h
  projects/altix2/sys/dev/isp/isp_pci.c

Modified: projects/altix2/sys/dev/isp/isp_freebsd.h
==============================================================================
--- projects/altix2/sys/dev/isp/isp_freebsd.h	Sun Dec 30 00:45:42 2012	(r244844)
+++ projects/altix2/sys/dev/isp/isp_freebsd.h	Sun Dec 30 00:47:30 2012	(r244845)
@@ -427,22 +427,22 @@ switch (type) {							\
 case SYNC_SFORDEV:						\
 {								\
 	struct isp_fc *fc = ISP_FC_PC(isp, chan);		\
-	busdma_sync(fc->tdmd, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
+	busdma_sync(fc->tdmd, BUSDMA_SYNC_PREREAD|BUSDMA_SYNC_PREWRITE); \
 	break;							\
 }								\
 case SYNC_REQUEST:						\
 	busdma_sync(isp->isp_osinfo.cdmd,			\
-	   BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);		\
+	   BUSDMA_SYNC_PREREAD | BUSDMA_SYNC_PREWRITE);		\
 	break;							\
 case SYNC_SFORCPU:						\
 {								\
 	struct isp_fc *fc = ISP_FC_PC(isp, chan);		\
-	busdma_sync(fc->tdmd, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); \
+	busdma_sync(fc->tdmd, BUSDMA_SYNC_POSTREAD|BUSDMA_SYNC_POSTWRITE); \
 	break;							\
 }								\
 case SYNC_RESULT:						\
 	busdma_sync(isp->isp_osinfo.cdmd,			\
-	   BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);	\
+	   BUSDMA_SYNC_POSTREAD | BUSDMA_SYNC_POSTWRITE);	\
 	break;							\
 case SYNC_REG:							\
 	bus_space_barrier(isp->isp_osinfo.bus_tag,		\

Modified: projects/altix2/sys/dev/isp/isp_pci.c
==============================================================================
--- projects/altix2/sys/dev/isp/isp_pci.c	Sun Dec 30 00:45:42 2012	(r244844)
+++ projects/altix2/sys/dev/isp/isp_pci.c	Sun Dec 30 00:47:30 2012	(r244845)
@@ -1451,6 +1451,10 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	bus_size_t slim;	/* segment size */
 	bus_addr_t llim;	/* low limit of unavailable dma */
 	bus_addr_t hlim;	/* high limit of unavailable dma */
+	isp_ecmd_t *ecmd;
+	uintptr_t vaddr;
+	bus_addr_t busaddr;
+	size_t size;
 
 	/*
 	 * Already been here? If so, leave...
@@ -1590,15 +1594,45 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 		return (error);
 	}
 
-	isp->isp_rquest = (void *)busdma_md_get_vaddr(isp->isp_osinfo.cdmd, 0);
-	isp->isp_rquest_dma = busdma_md_get_busaddr(isp->isp_osinfo.cdmd, 0);
-	isp->isp_result_dma = isp->isp_rquest_dma + ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp));
-	isp->isp_result = (char *)isp->isp_rquest + ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp));
+	busaddr = busdma_md_get_busaddr(isp->isp_osinfo.cdmd, 0);
+	vaddr = busdma_md_get_vaddr(isp->isp_osinfo.cdmd, 0);
 
+	size = busdma_md_get_size(isp->isp_osinfo.cdmd, 0);
+	isp_prt(isp, ISP_LOGDEBUG0, "request/result area @ 0x%jx/0x%jx",
+	    (uintmax_t)busaddr, (uintmax_t)size);
+
+	isp->isp_rquest = (void *)vaddr;
+	isp->isp_rquest_dma = busaddr;
+	size = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp));
+	busaddr += size;
+	vaddr += size;
+
+	isp->isp_result = (void *)vaddr;
+	isp->isp_result_dma = busaddr;
+	size = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp));
+	busaddr += size;
+	vaddr += size;
+
+	if (isp->isp_type >= ISP_HA_FC_2300) {
+		isp->isp_osinfo.ecmd_base = (void *)vaddr;
+		isp->isp_osinfo.ecmd_dma = busaddr;
+		size = N_XCMDS * XCMD_SIZE;
+		busaddr += size;
+		vaddr += size;
+
+		isp->isp_osinfo.ecmd_free = isp->isp_osinfo.ecmd_base;
+		for (ecmd = isp->isp_osinfo.ecmd_free;
+		    ecmd < &isp->isp_osinfo.ecmd_free[N_XCMDS]; ecmd++) {
+			if (ecmd == &isp->isp_osinfo.ecmd_free[N_XCMDS - 1])
+				ecmd->next = NULL;
+			else
+				ecmd->next = ecmd + 1;
+		}
+	}
 #ifdef  ISP_TARGET_MODE
 	if (IS_24XX(isp)) {
-		isp->isp_atioq_dma = isp->isp_result_dma + ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp));
-		isp->isp_atioq = (char *)isp->isp_result + ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp));
+		isp->isp_atioq_dma = busaddr;
+		isp->isp_atioq = (void *)vaddr;
 	}
 #endif
 
@@ -1615,13 +1649,13 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 				busdma_tag_destroy(fc->tdmat);
 				goto bad;
 			}
+			busaddr = busdma_md_get_busaddr(fc->tdmd, 0);
+			size = busdma_md_get_size(fc->tdmd, 0);
+			vaddr = busdma_md_get_vaddr(fc->tdmd, 0);
 			isp_prt(isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx",
-			    (uintmax_t)busdma_md_get_busaddr(fc->tdmd, 0),
-			    (uintmax_t)busdma_md_get_size(fc->tdmd, 0));
-			FCPARAM(isp, cmap)->isp_scdma =
-			    busdma_md_get_busaddr(fc->tdmd, 0);
-			FCPARAM(isp, cmap)->isp_scratch =
-			    (void *)busdma_md_get_vaddr(fc->tdmd, 0);
+			    (uintmax_t)busaddr, (uintmax_t)size);
+			FCPARAM(isp, cmap)->isp_scdma = busaddr;
+			FCPARAM(isp, cmap)->isp_scratch = (void *)vaddr;
 			if (isp->isp_type >= ISP_HA_FC_2300) {
 				for (i = 0; i < INITIAL_NEXUS_COUNT; i++) {
 					struct isp_nexus *n = malloc(sizeof (struct isp_nexus), M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -1689,7 +1723,6 @@ typedef struct {
 	void *cmd_token;
 	void *rq;	/* original request */
 	int error;
-	bus_size_t mapsize;
 } mush_t;
 
 #define	MUSHERR_NOQENTRIES	-2
@@ -1714,9 +1747,8 @@ tdma_cb(void *arg, busdma_md_t md, int e
 	csio = mp->cmd_token;
 	isp = mp->isp;
 	rq = mp->rq;
-	ddir = ISP_NOXFR;
-	nseg = busdma_md_get_nsegs(md);
-	if (nseg) {
+	if (md != NULL) {
+		nseg = busdma_md_get_nsegs(md);
 		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);
@@ -1734,12 +1766,19 @@ tdma_cb(void *arg, busdma_md_t md, int e
 			}
 		}
 		if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-			busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE);
+			busdma_sync(PISP_PCMD(csio)->dmap,
+			    BUSDMA_SYNC_PREWRITE);
 			ddir = ISP_TO_DEVICE;
 		} else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) {
-			busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD);
+			busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_PREREAD);
 			ddir = ISP_FROM_DEVICE;
+		} else {
+			md = NULL;
+			ddir = ISP_NOXFR;
 		}
+	} else {
+		md = NULL;
+		ddir = ISP_NOXFR;
 	}
 
 	error = isp_send_tgt_cmd(isp, rq, md, XS_XFRLEN(csio), ddir, &csio->sense_data, csio->sense_len);
@@ -1772,9 +1811,8 @@ dma_cb(void *arg, busdma_md_t md, int er
 	csio = mp->cmd_token;
 	isp = mp->isp;
 	rq = mp->rq;
-	ddir = ISP_NOXFR;
-	nseg = busdma_md_get_nsegs(md);
-	if (nseg) {
+	if (md != NULL) {
+		nseg = busdma_md_get_nsegs(md);
 		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);
@@ -1794,12 +1832,17 @@ dma_cb(void *arg, busdma_md_t md, int er
 			}
 		}
 		if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-			busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD);
+			busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_PREREAD);
 			ddir = ISP_FROM_DEVICE;
 		} else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) {
-			busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE);
+			busdma_sync(PISP_PCMD(csio)->dmap,
+			    BUSDMA_SYNC_PREWRITE);
 			ddir = ISP_TO_DEVICE;
+		} else {
+			ddir = ISP_NOXFR;
 		}
+	} else {
+		ddir = ISP_NOXFR;
 	}
 
 	error = isp_send_cmd(isp, rq, md, XS_XFRLEN(csio), ddir, (ispds64_t *)csio->req_map);
@@ -1826,7 +1869,6 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct
 	mp->cmd_token = csio;
 	mp->rq = ff;
 	mp->error = 0;
-	mp->mapsize = 0;
 
 #ifdef	ISP_TARGET_MODE
 	if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO)


More information about the svn-src-projects mailing list