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

Marcel Moolenaar marcel at FreeBSD.org
Mon Jun 4 18:16:19 UTC 2012


Author: marcel
Date: Mon Jun  4 18:16:19 2012
New Revision: 236573
URL: http://svn.freebsd.org/changeset/base/236573

Log:
  Rewrite using busdma/mi. Things tend to become simpler...
  Note that isp_sbus.c has not been converted yet.

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

Modified: projects/altix2/sys/dev/isp/isp_freebsd.c
==============================================================================
--- projects/altix2/sys/dev/isp/isp_freebsd.c	Mon Jun  4 18:02:09 2012	(r236572)
+++ projects/altix2/sys/dev/isp/isp_freebsd.c	Mon Jun  4 18:16:19 2012	(r236573)
@@ -5795,11 +5795,11 @@ void
 isp_common_dmateardown(ispsoftc_t *isp, struct ccb_scsiio *csio, uint32_t hdl)
 {
 	if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
-		bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_POSTREAD);
+		busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_POSTREAD);
 	} else {
-		bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_POSTWRITE);
+		busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_POSTWRITE);
 	}
-	bus_dmamap_unload(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap);
+	busdma_md_unload(PISP_PCMD(csio)->dmap);
 }
 
 void

Modified: projects/altix2/sys/dev/isp/isp_freebsd.h
==============================================================================
--- projects/altix2/sys/dev/isp/isp_freebsd.h	Mon Jun  4 18:02:09 2012	(r236572)
+++ projects/altix2/sys/dev/isp/isp_freebsd.h	Mon Jun  4 18:16:19 2012	(r236573)
@@ -42,6 +42,7 @@
 
 #include <sys/proc.h>
 #include <sys/bus.h>
+#include <sys/busdma.h>
 #include <sys/taskqueue.h>
 
 #include <machine/bus.h>
@@ -150,7 +151,7 @@ typedef struct tstate {
  */
 struct isp_pcmd {
 	struct isp_pcmd *	next;
-	bus_dmamap_t 		dmap;	/* dma map for this command */
+	busdma_md_t 		dmap;	/* dma map for this command */
 	struct ispsoftc *	isp;	/* containing isp */
 	struct callout		wdog;	/* watchdog timer */
 };
@@ -167,8 +168,8 @@ struct isp_fc {
 	struct cam_path *path;
 	struct ispsoftc *isp;
 	struct proc *kproc;
-	bus_dma_tag_t tdmat;
-	bus_dmamap_t tdmap;
+	busdma_tag_t tdmat;
+	busdma_md_t tdmd;
 	uint64_t def_wwpn;
 	uint64_t def_wwnn;
 	uint32_t loop_down_time;
@@ -245,10 +246,10 @@ struct isposinfo {
 	 * DMA related sdtuff
 	 */
 	bus_space_tag_t		bus_tag;
-	bus_dma_tag_t		dmat;
 	bus_space_handle_t	bus_handle;
-	bus_dma_tag_t		cdmat;
-	bus_dmamap_t		cdmap;
+	busdma_tag_t		dmat;
+	busdma_tag_t		cdmat;
+	busdma_md_t		cdmd;
 
 	/*
 	 * Command and transaction related related stuff
@@ -358,25 +359,21 @@ switch (type) {							\
 case SYNC_SFORDEV:						\
 {								\
 	struct isp_fc *fc = ISP_FC_PC(isp, chan);		\
-	bus_dmamap_sync(fc->tdmat, fc->tdmap,			\
-	   BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);		\
+	busdma_sync(fc->tdmd, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
 	break;							\
 }								\
 case SYNC_REQUEST:						\
-	bus_dmamap_sync(isp->isp_osinfo.cdmat,			\
-	   isp->isp_osinfo.cdmap, 				\
+	busdma_sync(isp->isp_osinfo.cdmd,			\
 	   BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);		\
 	break;							\
 case SYNC_SFORCPU:						\
 {								\
 	struct isp_fc *fc = ISP_FC_PC(isp, chan);		\
-	bus_dmamap_sync(fc->tdmat, fc->tdmap,			\
-	   BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);	\
+	busdma_sync(fc->tdmd, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); \
 	break;							\
 }								\
 case SYNC_RESULT:						\
-	bus_dmamap_sync(isp->isp_osinfo.cdmat, 			\
-	   isp->isp_osinfo.cdmap,				\
+	busdma_sync(isp->isp_osinfo.cdmd,			\
 	   BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);	\
 	break;							\
 case SYNC_REG:							\
@@ -411,24 +408,22 @@ default:							\
 
 #define	XS_T			struct ccb_scsiio
 #define	XS_DMA_ADDR_T		bus_addr_t
-#define XS_GET_DMA64_SEG(a, b, c)		\
-{						\
-	ispds64_t *d = a;			\
-	bus_dma_segment_t *e = b;		\
-	uint32_t f = c;				\
-	e += f;					\
-        d->ds_base = DMA_LO32(e->ds_addr);	\
-        d->ds_basehi = DMA_HI32(e->ds_addr);	\
-        d->ds_count = e->ds_len;		\
+#define XS_GET_DMA64_SEG(a, md, c)			\
+{							\
+	ispds64_t *_d = a;				\
+	u_int _n = c;					\
+	bus_addr_t _a = busdma_md_get_busaddr(md, _n);	\
+	_d->ds_base = DMA_LO32(_a);			\
+	_d->ds_basehi = DMA_HI32(_a);			\
+	_d->ds_count = busdma_md_get_size(md, _n);	\
 }
-#define XS_GET_DMA_SEG(a, b, c)			\
-{						\
-	ispds_t *d = a;				\
-	bus_dma_segment_t *e = b;		\
-	uint32_t f = c;				\
-	e += f;					\
-        d->ds_base = DMA_LO32(e->ds_addr);	\
-        d->ds_count = e->ds_len;		\
+#define XS_GET_DMA_SEG(a, md, c)			\
+{							\
+	ispds_t *_d = a;				\
+	u_int _n = c;					\
+	bus_addr_t _a = busdma_md_get_busaddr(md, _n);	\
+	_d->ds_base = DMA_LO32(_a);			\
+	_d->ds_count = busdma_md_get_size(md, _n);	\
 }
 #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))
@@ -660,27 +655,8 @@ void isp_common_dmateardown(ispsoftc_t *
 /*
  * Platform Version specific defines
  */
-#ifdef ISP_USE_BUSDMA
 #include <sys/busdma.h>
 
-#define	BUS_DMA_ROOTARG(x)	x
-#define	isp_dma_tag_create(dev, align, bndry, lowaddr, hiaddr, filter,	\
-		f_arg, maxsize, nsegs, maxsegsz, flags, tag_p)		\
-	busdma_tag_create(dev, lowaddr, align, bndry, maxsize, nsegs,	\
-	    maxsegsz, flags, (busdma_tag_t *)tag_p)
-
-#define	isp_dma_tag_derive(parent, align, bndry, lowaddr, highaddr,	\
-		filter, f_arg, maxsize, nsegs, maxsegsz, flags, tag_p)	\
-	busdma_tag_derive((busdma_tag_t)parent, lowaddr, align, bndry,	\
-	    maxsize, nsegs, maxsegsz, flags, (busdma_tag_t *)tag_p)
-#else
-#define	BUS_DMA_ROOTARG(x)	bus_get_dma_tag(x)
-#define	isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z)	\
-	bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \
-	busdma_lock_mutex, &isp->isp_osinfo.lock, z)
-#define	isp_dma_tag_derive	isp_dma_tag_create
-#endif /* ISP_USE_BUSDMA */
-
 #define	isp_setup_intr	bus_setup_intr
 
 #define	isp_sim_alloc(a, b, c, d, e, f, g, h)	\

Modified: projects/altix2/sys/dev/isp/isp_library.c
==============================================================================
--- projects/altix2/sys/dev/isp/isp_library.c	Mon Jun  4 18:02:09 2012	(r236572)
+++ projects/altix2/sys/dev/isp/isp_library.c	Mon Jun  4 18:16:19 2012	(r236573)
@@ -58,7 +58,8 @@ const char *isp_class3_roles[4] = {
  * Called with the first queue entry at least partially filled out.
  */
 int
-isp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir)
+isp_send_cmd(ispsoftc_t *isp, void *fqe, busdma_md_t md, uint32_t totalcnt,
+    isp_ddir_t ddir)
 {
 	uint8_t storage[QENTRY_LEN];
 	uint8_t type, nqe;
@@ -66,6 +67,7 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 	ispds_t *dsp = NULL;
 	ispds64_t *dsp64 = NULL;
 	void *qe0, *qe1;
+	u_int nsegs;
 
 	qe0 = isp_getrqentry(isp);
 	if (qe0 == NULL) {
@@ -75,6 +77,7 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 
 	type = ((isphdr_t *)fqe)->rqs_entry_type;
 	nqe = 1;
+	nsegs = busdma_md_get_nsegs(md);
 
 	/*
 	 * If we have no data to transmit, just copy the first IOCB and start it up.
@@ -131,9 +134,9 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 
 	for (seg = curseg = 0; curseg < seglim; curseg++) {
 		if (dsp64) {
-			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
+			XS_GET_DMA64_SEG(dsp64++, md, seg++);
 		} else {
-			XS_GET_DMA_SEG(dsp++, segp, seg++);
+			XS_GET_DMA_SEG(dsp++, md, seg++);
 		}
 	}
 
@@ -167,9 +170,9 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe,
 		}
 		for (curseg = 0; curseg < seglim; curseg++) {
 			if (dsp64) {
-				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
+				XS_GET_DMA64_SEG(dsp64++, md, seg++);
 			} else {
-				XS_GET_DMA_SEG(dsp++, segp, seg++);
+				XS_GET_DMA_SEG(dsp++, md, seg++);
 			}
 		}
 		if (dsp64) {
@@ -2007,7 +2010,8 @@ isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t
  * Called with the first queue entry at least partially filled out.
  */
 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)
+isp_send_tgt_cmd(ispsoftc_t *isp, void *fqe, busdma_md_t md, uint32_t totalcnt,
+    isp_ddir_t ddir, void *snsptr, uint32_t snslen)
 {
 	uint8_t storage[QENTRY_LEN], storage2[QENTRY_LEN];
 	uint8_t type, nqe;
@@ -2015,6 +2019,7 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void *
 	ispds_t *dsp = NULL;
 	ispds64_t *dsp64 = NULL;
 	void *qe0, *qe1, *sqe = NULL;
+	u_int nsegs;
 
 	qe0 = isp_getrqentry(isp);
 	if (qe0 == NULL) {
@@ -2025,6 +2030,7 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void *
 	type = ((isphdr_t *)fqe)->rqs_entry_type;
 	nqe = 1;
 	seglim = 0;
+	nsegs = busdma_md_get_nsegs(md);
 
 	/*
 	 * If we have no data to transmit, just copy the first IOCB and start it up.
@@ -2140,9 +2146,9 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void *
 
 	for (seg = curseg = 0; curseg < seglim; curseg++) {
 		if (dsp64) {
-			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
+			XS_GET_DMA64_SEG(dsp64++, md, seg++);
 		} else {
-			XS_GET_DMA_SEG(dsp++, segp, seg++);
+			XS_GET_DMA_SEG(dsp++, md, seg++);
 		}
 	}
 
@@ -2181,9 +2187,9 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void *
 		}
 		for (curseg = 0; curseg < seglim; curseg++) {
 			if (dsp64) {
-				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
+				XS_GET_DMA64_SEG(dsp64++, md, seg++);
 			} else {
-				XS_GET_DMA_SEG(dsp++, segp, seg++);
+				XS_GET_DMA_SEG(dsp++, md, seg++);
 			}
 		}
 		if (dsp64) {

Modified: projects/altix2/sys/dev/isp/isp_library.h
==============================================================================
--- projects/altix2/sys/dev/isp/isp_library.h	Mon Jun  4 18:02:09 2012	(r236572)
+++ projects/altix2/sys/dev/isp/isp_library.h	Mon Jun  4 18:16:19 2012	(r236573)
@@ -36,7 +36,7 @@
  * stuff figured out, you can make all the code in one spot.
  */
 typedef enum { ISP_TO_DEVICE, ISP_FROM_DEVICE, ISP_NOXFR} isp_ddir_t;
-int isp_send_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t);
+int isp_send_cmd(ispsoftc_t *, void *, busdma_md_t, uint32_t, isp_ddir_t);
 
 /*
  * Handle management functions.
@@ -155,7 +155,7 @@ void isp_put_ct_hdr(ispsoftc_t *isp, ct_
 #include "isp_target.h"
 #endif
 
-int isp_send_tgt_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t, void *, uint32_t);
+int isp_send_tgt_cmd(ispsoftc_t *, void *, busdma_md_t, uint32_t, isp_ddir_t, void *, uint32_t);
 
 int isp_allocate_xs_tgt(ispsoftc_t *, void *, uint32_t *);
 void *isp_find_xs_tgt(ispsoftc_t *, uint32_t);

Modified: projects/altix2/sys/dev/isp/isp_pci.c
==============================================================================
--- projects/altix2/sys/dev/isp/isp_pci.c	Mon Jun  4 18:02:09 2012	(r236572)
+++ projects/altix2/sys/dev/isp/isp_pci.c	Mon Jun  4 18:16:19 2012	(r236573)
@@ -354,7 +354,7 @@ struct isp_pcisoftc {
 	int				rgd;
 	void *				ih;
 	int16_t				pci_poff[_NREG_BLKS];
-	bus_dma_tag_t			dmat;
+	busdma_tag_t			dmat;
 	int				msicount;
 };
 
@@ -1436,75 +1436,14 @@ isp_pci_wr_reg_2400(ispsoftc_t *isp, int
 	}
 }
 
-
-struct imush {
-	ispsoftc_t *isp;
-	caddr_t vbase;
-	int chan;
-	int error;
-};
-
-static void imc(void *, bus_dma_segment_t *, int, int);
-static void imc1(void *, bus_dma_segment_t *, int, int);
-
-static void
-imc(void *arg, bus_dma_segment_t *segs, int nseg, int error)
-{
-	struct imush *imushp = (struct imush *) arg;
-
-	if (error) {
-		imushp->error = error;
-		return;
-	}
-	if (nseg != 1) {
-		imushp->error = EINVAL;
-		return;
-	}
-	isp_prt(imushp->isp, ISP_LOGDEBUG0, "request/result area @ 0x%jx/0x%jx", (uintmax_t) segs->ds_addr, (uintmax_t) segs->ds_len);
-	imushp->isp->isp_rquest = imushp->vbase;
-	imushp->isp->isp_rquest_dma = segs->ds_addr;
-	segs->ds_addr += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(imushp->isp));
-	imushp->vbase += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(imushp->isp));
-	imushp->isp->isp_result_dma = segs->ds_addr;
-	imushp->isp->isp_result = imushp->vbase;
-
-#ifdef	ISP_TARGET_MODE
-	if (IS_24XX(imushp->isp)) {
-		segs->ds_addr += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(imushp->isp));
-		imushp->vbase += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(imushp->isp));
-		imushp->isp->isp_atioq_dma = segs->ds_addr;
-		imushp->isp->isp_atioq = imushp->vbase;
-	}
-#endif
-}
-
-static void
-imc1(void *arg, bus_dma_segment_t *segs, int nseg, int error)
-{
-	struct imush *imushp = (struct imush *) arg;
-	if (error) {
-		imushp->error = error;
-		return;
-	}
-	if (nseg != 1) {
-		imushp->error = EINVAL;
-		return;
-	}
-	isp_prt(imushp->isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx", (uintmax_t) segs->ds_addr, (uintmax_t) segs->ds_len);
-	FCPARAM(imushp->isp, imushp->chan)->isp_scdma = segs->ds_addr;
-	FCPARAM(imushp->isp, imushp->chan)->isp_scratch = imushp->vbase;
-}
-
 static int
 isp_pci_mbxdma(ispsoftc_t *isp)
 {
-	caddr_t base;
 	uint32_t len;
 	int i, error, ns, cmap = 0;
 	bus_size_t slim;	/* segment size */
 	bus_addr_t llim;	/* low limit of unavailable dma */
 	bus_addr_t hlim;	/* high limit of unavailable dma */
-	struct imush im;
 
 	/*
 	 * Already been here? If so, leave...
@@ -1553,11 +1492,13 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	}
 #endif
 
-	if (isp_dma_tag_create(BUS_DMA_ROOTARG(ISP_PCD(isp)), 1, slim, llim, hlim, NULL, NULL, BUS_SPACE_MAXSIZE, ISP_NSEGS, slim, 0, &isp->isp_osinfo.dmat)) {
+	error = busdma_tag_create(ISP_PCD(isp), 1, slim, llim,
+	    BUS_SPACE_MAXSIZE, ISP_NSEGS, slim, 0, &isp->isp_osinfo.dmat);
+	if (error) {
 		free(isp->isp_osinfo.pcmd_pool, M_DEVBUF);
 		ISP_LOCK(isp);
 		isp_prt(isp, ISP_LOGERR, "could not create master dma tag");
-		return (1);
+		return (error);
 	}
 
 	len = sizeof (isp_hdl_t) * isp->isp_maxcmds;
@@ -1606,7 +1547,9 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	 * Create a tag for the control spaces. We don't always need this
 	 * to be 32 bits, but we do this for simplicity and speed's sake.
 	 */
-	if (isp_dma_tag_derive(isp->isp_osinfo.dmat, QENTRY_LEN, slim, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, len, ns, slim, 0, &isp->isp_osinfo.cdmat)) {
+	error = busdma_tag_derive(isp->isp_osinfo.dmat, QENTRY_LEN, slim,
+	    BUS_SPACE_MAXADDR_32BIT, len, ns, slim, 0, &isp->isp_osinfo.cdmat);
+	if (error) {
 		isp_prt(isp, ISP_LOGERR, "cannot create a dma tag for control spaces");
 		free(isp->isp_osinfo.pcmd_pool, M_DEVBUF);
 		free(isp->isp_xflist, M_DEVBUF);
@@ -1614,62 +1557,65 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 		free(isp->isp_tgtlist, M_DEVBUF);
 #endif
 		ISP_LOCK(isp);
-		return (1);
+		return (error);
 	}
 
-	if (bus_dmamem_alloc(isp->isp_osinfo.cdmat, (void **)&base, BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &isp->isp_osinfo.cdmap) != 0) {
+	error = busdma_mem_alloc(isp->isp_osinfo.cdmat, 0,
+	    &isp->isp_osinfo.cdmd);
+	if (error != 0) {
 		isp_prt(isp, ISP_LOGERR, "cannot allocate %d bytes of CCB memory", len);
-		bus_dma_tag_destroy(isp->isp_osinfo.cdmat);
+		busdma_tag_destroy(isp->isp_osinfo.cdmat);
 		free(isp->isp_osinfo.pcmd_pool, M_DEVBUF);
 		free(isp->isp_xflist, M_DEVBUF);
 #ifdef	ISP_TARGET_MODE
 		free(isp->isp_tgtlist, M_DEVBUF);
 #endif
 		ISP_LOCK(isp);
-		return (1);
+		return (error);
 	}
 
-	im.isp = isp;
-	im.chan = 0;
-	im.vbase = base;
-	im.error = 0;
-
-	bus_dmamap_load(isp->isp_osinfo.cdmat, isp->isp_osinfo.cdmap, base, len, imc, &im, 0);
-	if (im.error) {
-		isp_prt(isp, ISP_LOGERR, "error %d loading dma map for control areas", im.error);
-		goto bad;
+	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));
+
+#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));
 	}
+#endif
 
 	if (IS_FC(isp)) {
 		for (cmap = 0; cmap < isp->isp_nchan; cmap++) {
 			struct isp_fc *fc = ISP_FC_PC(isp, cmap);
-			if (isp_dma_tag_derive(isp->isp_osinfo.dmat, 64, slim, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, ISP_FC_SCRLEN, 1, slim, 0, &fc->tdmat)) {
+			error = busdma_tag_derive(isp->isp_osinfo.dmat, 64,
+			    slim, BUS_SPACE_MAXADDR_32BIT, ISP_FC_SCRLEN, 1,
+			    slim, 0, &fc->tdmat);
+			if (error)
 				goto bad;
-			}
-			if (bus_dmamem_alloc(fc->tdmat, (void **)&base, BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &fc->tdmap) != 0) {
-				bus_dma_tag_destroy(fc->tdmat);
-				goto bad;
-			}
-			im.isp = isp;
-			im.chan = cmap;
-			im.vbase = base;
-			im.error = 0;
-			bus_dmamap_load(fc->tdmat, fc->tdmap, base, ISP_FC_SCRLEN, imc1, &im, 0);
-			if (im.error) {
-				bus_dmamem_free(fc->tdmat, base, fc->tdmap);
-				bus_dma_tag_destroy(fc->tdmat);
+			error = busdma_mem_alloc(fc->tdmat, 0, &fc->tdmd);
+			if (error) {
+				busdma_tag_destroy(fc->tdmat);
 				goto bad;
 			}
+			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);
 		}
 	}
 
 	for (i = 0; i < isp->isp_maxcmds; i++) {
 		struct isp_pcmd *pcmd = &isp->isp_osinfo.pcmd_pool[i];
-		error = bus_dmamap_create(isp->isp_osinfo.dmat, 0, &pcmd->dmap);
+		error = busdma_md_create(isp->isp_osinfo.dmat, 0, &pcmd->dmap);
 		if (error) {
 			isp_prt(isp, ISP_LOGERR, "error %d creating per-cmd DMA maps", error);
 			while (--i >= 0) {
-				bus_dmamap_destroy(isp->isp_osinfo.dmat, isp->isp_osinfo.pcmd_pool[i].dmap);
+				busdma_md_destroy(isp->isp_osinfo.pcmd_pool[i].dmap);
 			}
 			goto bad;
 		}
@@ -1687,11 +1633,11 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 bad:
 	while (--cmap >= 0) {
 		struct isp_fc *fc = ISP_FC_PC(isp, cmap);
-		bus_dmamem_free(fc->tdmat, base, fc->tdmap);
-		bus_dma_tag_destroy(fc->tdmat);
+		busdma_mem_free(fc->tdmd);
+		busdma_tag_destroy(fc->tdmat);
 	}
-	bus_dmamem_free(isp->isp_osinfo.cdmat, base, isp->isp_osinfo.cdmap);
-	bus_dma_tag_destroy(isp->isp_osinfo.cdmat);
+	busdma_mem_free(isp->isp_osinfo.cdmd);
+	busdma_tag_destroy(isp->isp_osinfo.cdmat);
 	free(isp->isp_xflist, M_DEVBUF);
 #ifdef	ISP_TARGET_MODE
 	free(isp->isp_tgtlist, M_DEVBUF);
@@ -1713,26 +1659,16 @@ typedef struct {
 #define	MUSHERR_NOQENTRIES	-2
 
 #ifdef	ISP_TARGET_MODE
-static void tdma2_2(void *, bus_dma_segment_t *, int, bus_size_t, int);
-static void tdma2(void *, bus_dma_segment_t *, int, int);
-
-static void
-tdma2_2(void *arg, bus_dma_segment_t *dm_segs, int nseg, bus_size_t mapsize, int error)
-{
-	mush_t *mp;
-	mp = (mush_t *)arg;
-	mp->mapsize = mapsize;
-	tdma2(arg, dm_segs, nseg, error);
-}
 
 static void
-tdma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
+tdma_cb(void *arg, busdma_md_t md, int error)
 {
 	mush_t *mp;
 	ispsoftc_t *isp;
 	struct ccb_scsiio *csio;
 	isp_ddir_t ddir;
 	ispreq_t *rq;
+	u_int nseg;
 
 	mp = (mush_t *) arg;
 	if (error) {
@@ -1742,6 +1678,8 @@ tdma2(void *arg, bus_dma_segment_t *dm_s
 	csio = mp->cmd_token;
 	isp = mp->isp;
 	rq = mp->rq;
+	ddir = ISP_NOXFR;
+	nseg = busdma_md_get_nsegs(md);
 	if (nseg) {
 		if (sizeof (bus_addr_t) > 4) {
 			if (nseg >= ISP_NSEG64_MAX) {
@@ -1760,48 +1698,30 @@ tdma2(void *arg, bus_dma_segment_t *dm_s
 			}
 		}
 		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);
+			busdma_sync(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);
+			busdma_sync(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;
 	}
 
-	if (isp_send_tgt_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir, &csio->sense_data, csio->sense_len) != CMD_QUEUED) {
+	if (isp_send_tgt_cmd(isp, rq, md, XS_XFRLEN(csio), ddir,
+	    &csio->sense_data, csio->sense_len) != CMD_QUEUED) {
 		mp->error = MUSHERR_NOQENTRIES;
 	}
 }
 #endif
 
-static void dma2_2(void *, bus_dma_segment_t *, int, bus_size_t, int);
-static void dma2(void *, bus_dma_segment_t *, int, int);
-
-static void
-dma2_2(void *arg, bus_dma_segment_t *dm_segs, int nseg, bus_size_t mapsize, int error)
-{
-	mush_t *mp;
-	mp = (mush_t *)arg;
-	mp->mapsize = mapsize;
-	dma2(arg, dm_segs, nseg, error);
-}
-
 static void
-dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
+dma_cb(void *arg, busdma_md_t md, int error)
 {
 	mush_t *mp;
 	ispsoftc_t *isp;
 	struct ccb_scsiio *csio;
 	isp_ddir_t ddir;
 	ispreq_t *rq;
+	u_int nseg;
 
 	mp = (mush_t *) arg;
 	if (error) {
@@ -1811,6 +1731,8 @@ dma2(void *arg, bus_dma_segment_t *dm_se
 	csio = mp->cmd_token;
 	isp = mp->isp;
 	rq = mp->rq;
+	ddir = ISP_NOXFR;
+	nseg = busdma_md_get_nsegs(md);
 	if (nseg) {
 		if (sizeof (bus_addr_t) > 4) {
 			if (nseg >= ISP_NSEG64_MAX) {
@@ -1831,21 +1753,15 @@ dma2(void *arg, bus_dma_segment_t *dm_se
 			}
 		}
 		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);
+			busdma_sync(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);
+			busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE);
 			ddir = ISP_TO_DEVICE;
-		} else {
-			ddir = ISP_NOXFR;
 		}
-	} else {
-		dm_segs = NULL;
-		nseg = 0;
-		ddir = ISP_NOXFR;
 	}
 
-	if (isp_send_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir) != CMD_QUEUED) {
+	if (isp_send_cmd(isp, rq, md, XS_XFRLEN(csio), ddir) != CMD_QUEUED) {
 		mp->error = MUSHERR_NOQENTRIES;
 	}
 }
@@ -1854,8 +1770,7 @@ 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);
-	void (*eptr2)(void *, bus_dma_segment_t *, int, bus_size_t, int);
+	busdma_callback_f cbf;
 
 	mp = &mush;
 	mp->isp = isp;
@@ -1865,47 +1780,43 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct
 	mp->mapsize = 0;
 
 #ifdef	ISP_TARGET_MODE
-	if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO) {
-		eptr = tdma2;
-		eptr2 = tdma2_2;
-	} else
+	if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO)
+		cbf = tdma_cb;
+	else
 #endif
-	{
-		eptr = dma2;
-		eptr2 = dma2_2;
-	}
-
+		cbf = dma_cb;
 
-	if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE || (csio->dxfer_len == 0)) {
-		(*eptr)(mp, NULL, 0, 0);
+	if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE ||
+	    (csio->dxfer_len == 0)) {
+		(*cbf)(mp, NULL, 0);
 	} else if ((csio->ccb_h.flags & CAM_SCATTER_VALID) == 0) {
+		int error;
 		if ((csio->ccb_h.flags & CAM_DATA_PHYS) == 0) {
-			int error;
-			error = bus_dmamap_load(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, csio->data_ptr, csio->dxfer_len, eptr, mp, 0);
+			error = busdma_md_load_linear(PISP_PCMD(csio)->dmap,
+			    csio->data_ptr, csio->dxfer_len, cbf, mp, 0);
+		} else {
+			error = busdma_md_load_phys(PISP_PCMD(csio)->dmap,
+			    (uintptr_t)csio->data_ptr, csio->dxfer_len, cbf,
+			    mp, 0);
+		}
 #if 0
-			xpt_print(csio->ccb_h.path, "%s: bus_dmamap_load " "ptr %p len %d returned %d\n", __func__, csio->data_ptr, csio->dxfer_len, error);
+		xpt_print(csio->ccb_h.path, "%s: busdma_md_load ptr %p len %d "
+		    "returned %d\n", __func__, csio->data_ptr, csio->dxfer_len,
+		    error);
 #endif
-
-			if (error == EINPROGRESS) {
-				bus_dmamap_unload(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap);
-				mp->error = EINVAL;
-				isp_prt(isp, ISP_LOGERR, "deferred dma allocation not supported");
-			} else if (error && mp->error == 0) {
+		if (error == EINPROGRESS) {
+			busdma_md_unload(PISP_PCMD(csio)->dmap);
+			mp->error = EINVAL;
+			isp_prt(isp, ISP_LOGERR,
+			    "deferred dma allocation not supported");
+		} else if (error && mp->error == 0) {
 #ifdef	DIAGNOSTIC
-				isp_prt(isp, ISP_LOGERR, "error %d in dma mapping code", error);
+			isp_prt(isp, ISP_LOGERR,
+			    "error %d in dma mapping code", error);
 #endif
-				mp->error = error;
-			}
-		} else {
-			/* Pointer to physical buffer */
-			struct bus_dma_segment seg;
-			seg.ds_addr = (bus_addr_t)(vm_offset_t)csio->data_ptr;
-			seg.ds_len = csio->dxfer_len;
-			(*eptr)(mp, &seg, 1, 0);
+			mp->error = error;
 		}
 	} else {
-		struct bus_dma_segment *segs;
-
 		if ((csio->ccb_h.flags & CAM_DATA_PHYS) != 0) {
 			isp_prt(isp, ISP_LOGERR, "Physical segment pointers unsupported");
 			mp->error = EINVAL;
@@ -1929,16 +1840,16 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct
 			sguio.uio_resid = csio->dxfer_len;
 			sguio.uio_segflg = UIO_SYSSPACE;
 
-			error = bus_dmamap_load_uio(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, &sguio, eptr2, mp, 0);
+			error = busdma_md_load_uio(PISP_PCMD(csio)->dmap,
+			    &sguio, cbf, mp, 0);
 
 			if (error != 0 && mp->error == 0) {
 				isp_prt(isp, ISP_LOGERR, "error %d in dma mapping code", error);
 				mp->error = error;
 			}
 		} else {
-			/* Just use the segments provided */
-			segs = (struct bus_dma_segment *) csio->data_ptr;
-			(*eptr)(mp, segs, csio->sglist_cnt, 0);
+			isp_prt(isp, ISP_LOGERR, "Physical segment pointers unsupported");
+			mp->error = EINVAL;
 		}
 	}
 	if (mp->error) {


More information about the svn-src-projects mailing list