Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Dec 2004 03:53:56 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 66512 for review
Message-ID:  <200412060353.iB63ruCl040984@repoman.freebsd.org>

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

Change 66512 by sam@sam_ebb on 2004/12/06 03:53:41

	Fix memory allocation for dma descriptors: use a tag/descriptor
	block so we specify the proper size of memory to allocate
	instead of inheriting maxmem from the tag used for frame handling.
	
	This reduces memory use on i386 from ~900K to ~90K.

Affected files ...

.. //depot/projects/wifi/sys/dev/ath/if_ath.c#39 edit
.. //depot/projects/wifi/sys/dev/ath/if_athvar.h#16 edit

Differences ...

==== //depot/projects/wifi/sys/dev/ath/if_ath.c#39 (text+ko) ====

@@ -2114,32 +2114,52 @@
 	    __func__, name, nbuf, ndesc);
 
 	dd->dd_name = name;
+	dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc;
+
+	/*
+	 * Setup DMA descriptor area.
+	 */
+	error = bus_dma_tag_create(NULL,	/* parent */
+		       PAGE_SIZE, 0,		/* alignment, bounds */
+		       BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
+		       BUS_SPACE_MAXADDR,	/* highaddr */
+		       NULL, NULL,		/* filter, filterarg */
+		       dd->dd_desc_len,		/* maxsize */
+		       1,			/* nsegments */
+		       BUS_SPACE_MAXADDR,	/* maxsegsize */
+		       BUS_DMA_ALLOCNOW,	/* flags */
+		       NULL,			/* lockfunc */
+		       NULL,			/* lockarg */
+		       &dd->dd_dmat);
+	if (error != 0) {
+		if_printf(ifp, "cannot allocate %s DMA tag\n", dd->dd_name);
+		return error;
+	}
 
 	/* allocate descriptors */
-	dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc;
-	error = bus_dmamap_create(sc->sc_dmat, BUS_DMA_NOWAIT, &dd->dd_dmamap);
+	error = bus_dmamap_create(dd->dd_dmat, BUS_DMA_NOWAIT, &dd->dd_dmamap);
 	if (error != 0) {
 		if_printf(ifp, "unable to create dmamap for %s descriptors, "
 			"error %u\n", dd->dd_name, error);
-		return error;
+		goto fail0;
 	}
 
-	error = bus_dmamem_alloc(sc->sc_dmat, (void**) &dd->dd_desc,
+	error = bus_dmamem_alloc(dd->dd_dmat, (void**) &dd->dd_desc,
 				 BUS_DMA_NOWAIT, &dd->dd_dmamap);
 	if (error != 0) {
 		if_printf(ifp, "unable to alloc memory for %u %s descriptors, "
 			"error %u\n", nbuf * ndesc, dd->dd_name, error);
-		goto fail0;
+		goto fail1;
 	}
 
-	error = bus_dmamap_load(sc->sc_dmat, dd->dd_dmamap,
+	error = bus_dmamap_load(dd->dd_dmat, dd->dd_dmamap,
 				dd->dd_desc, dd->dd_desc_len,
 				ath_load_cb, &dd->dd_desc_paddr,
 				BUS_DMA_NOWAIT);
 	if (error != 0) {
 		if_printf(ifp, "unable to map %s descriptors, error %u\n",
 			dd->dd_name, error);
-		goto fail1;
+		goto fail2;
 	}
 
 	ds = dd->dd_desc;
@@ -2153,7 +2173,7 @@
 	if (bf == NULL) {
 		if_printf(ifp, "malloc of %s buffers failed, size %u\n",
 			dd->dd_name, bsize);
-		goto fail2;
+		goto fail3;
 	}
 	dd->dd_bufptr = bf;
 
@@ -2172,12 +2192,14 @@
 		STAILQ_INSERT_TAIL(head, bf, bf_list);
 	}
 	return 0;
+fail3:
+	bus_dmamap_unload(dd->dd_dmat, dd->dd_dmamap);
 fail2:
-	bus_dmamap_unload(sc->sc_dmat, dd->dd_dmamap);
+	bus_dmamem_free(dd->dd_dmat, dd->dd_desc, dd->dd_dmamap);
 fail1:
-	bus_dmamem_free(sc->sc_dmat, dd->dd_desc, dd->dd_dmamap);
+	bus_dmamap_destroy(dd->dd_dmat, dd->dd_dmamap);
 fail0:
-	bus_dmamap_destroy(sc->sc_dmat, dd->dd_dmamap);
+	bus_dma_tag_destroy(dd->dd_dmat);
 	memset(dd, 0, sizeof(*dd));
 	return error;
 #undef DS2PHYS
@@ -2190,9 +2212,10 @@
 	struct ath_buf *bf;
 	struct ieee80211_node *ni;
 
-	bus_dmamap_unload(sc->sc_dmat, dd->dd_dmamap);
-	bus_dmamem_free(sc->sc_dmat, dd->dd_desc, dd->dd_dmamap);
-	bus_dmamap_destroy(sc->sc_dmat, dd->dd_dmamap);
+	bus_dmamap_unload(dd->dd_dmat, dd->dd_dmamap);
+	bus_dmamem_free(dd->dd_dmat, dd->dd_desc, dd->dd_dmamap);
+	bus_dmamap_destroy(dd->dd_dmat, dd->dd_dmamap);
+	bus_dma_tag_destroy(dd->dd_dmat);
 
 	STAILQ_FOREACH(bf, head, bf_list) {
 		if (bf->bf_m) {

==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#16 (text+ko) ====

@@ -103,6 +103,7 @@
 	bus_addr_t		dd_desc_paddr;	/* physical addr of dd_desc */
 	bus_addr_t		dd_desc_len;	/* size of dd_desc */
 	bus_dma_segment_t	dd_dseg;
+	bus_dma_tag_t		dd_dmat;	/* bus DMA tag */
 	bus_dmamap_t		dd_dmamap;	/* DMA map for descriptors */
 	struct ath_buf		*dd_bufptr;	/* associated buffers */
 };



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