PERFORCE change 66512 for review
Sam Leffler
sam at FreeBSD.org
Sun Dec 5 19:53:58 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=66512
Change 66512 by sam at 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 */
};
More information about the p4-projects
mailing list