From owner-p4-projects@FreeBSD.ORG  Mon Dec  6 03:53:57 2004
Return-Path: <owner-p4-projects@FreeBSD.ORG>
Delivered-To: p4-projects@freebsd.org
Received: by hub.freebsd.org (Postfix, from userid 32767)
	id 4B90216A500; Mon,  6 Dec 2004 03:53:57 +0000 (GMT)
Delivered-To: perforce@freebsd.org
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id E4CEF16A4D0
	for <perforce@freebsd.org>; Mon,  6 Dec 2004 03:53:56 +0000 (GMT)
Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115])
	by mx1.FreeBSD.org (Postfix) with ESMTP id C77B443D31
	for <perforce@freebsd.org>; Mon,  6 Dec 2004 03:53:56 +0000 (GMT)
	(envelope-from sam@freebsd.org)
Received: from repoman.freebsd.org (localhost [127.0.0.1])
	by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id iB63ruhm040987
	for <perforce@freebsd.org>; Mon, 6 Dec 2004 03:53:56 GMT
	(envelope-from sam@freebsd.org)
Received: (from perforce@localhost)
	by repoman.freebsd.org (8.13.1/8.13.1/Submit) id iB63ruCl040984
	for perforce@freebsd.org; Mon, 6 Dec 2004 03:53:56 GMT
	(envelope-from sam@freebsd.org)
Date: Mon, 6 Dec 2004 03:53:56 GMT
Message-Id: <200412060353.iB63ruCl040984@repoman.freebsd.org>
X-Authentication-Warning: repoman.freebsd.org: perforce set sender to
	sam@freebsd.org using -f
From: Sam Leffler <sam@FreeBSD.org>
To: Perforce Change Reviews <perforce@freebsd.org>
Subject: PERFORCE change 66512 for review
X-BeenThere: p4-projects@freebsd.org
X-Mailman-Version: 2.1.1
Precedence: list
List-Id: p4 projects tree changes <p4-projects.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>,
	<mailto:p4-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/p4-projects>
List-Post: <mailto:p4-projects@freebsd.org>
List-Help: <mailto:p4-projects-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>,
	<mailto:p4-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 06 Dec 2004 03:53:58 -0000

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 */
 };