Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Jul 2012 02:26:33 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238708 - head/sys/dev/ath
Message-ID:  <201207230226.q6N2QXap054321@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Mon Jul 23 02:26:33 2012
New Revision: 238708
URL: http://svn.freebsd.org/changeset/base/238708

Log:
  Begin modifying the descriptor allocation functions to support a variable
  sized TX descriptor.
  
  This is required for the AR93xx EDMA support which requires 128 byte
  TX descriptors (which is significantly larger than the earlier
  hardware.)

Modified:
  head/sys/dev/ath/if_ath.c
  head/sys/dev/ath/if_ath_tx.c
  head/sys/dev/ath/if_athvar.h

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c	Sun Jul 22 23:21:21 2012	(r238707)
+++ head/sys/dev/ath/if_ath.c	Mon Jul 23 02:26:33 2012	(r238708)
@@ -2762,15 +2762,15 @@ ath_descdma_setup(struct ath_softc *sc,
 	uint8_t *ds;
 	struct ath_buf *bf;
 	int i, bsize, error;
-	int desc_len;
 
-	desc_len = sizeof(struct ath_desc);
+	dd->dd_descsize = sizeof(struct ath_desc);
 
-	DPRINTF(sc, ATH_DEBUG_RESET, "%s: %s DMA: %u buffers %u desc/buf\n",
-	    __func__, name, nbuf, ndesc);
+	DPRINTF(sc, ATH_DEBUG_RESET,
+	    "%s: %s DMA: %u buffers %u desc/buf, %d bytes per descriptor\n",
+	    __func__, name, nbuf, ndesc, dd->dd_descsize);
 
 	dd->dd_name = name;
-	dd->dd_desc_len = desc_len * nbuf * ndesc;
+	dd->dd_desc_len = dd->dd_descsize * nbuf * ndesc;
 
 	/*
 	 * Merlin work-around:
@@ -2778,7 +2778,7 @@ ath_descdma_setup(struct ath_softc *sc,
 	 * Assume one skipped descriptor per 4KB page.
 	 */
 	if (! ath_hal_split4ktrans(sc->sc_ah)) {
-		int numdescpage = 4096 / (desc_len * ndesc);
+		int numdescpage = 4096 / (dd->dd_descsize * ndesc);
 		dd->dd_desc_len = (nbuf / numdescpage + 1) * 4096;
 	}
 
@@ -2845,7 +2845,7 @@ ath_descdma_setup(struct ath_softc *sc,
 	dd->dd_bufptr = bf;
 
 	TAILQ_INIT(head);
-	for (i = 0; i < nbuf; i++, bf++, ds += (ndesc * desc_len)) {
+	for (i = 0; i < nbuf; i++, bf++, ds += (ndesc * dd->dd_descsize)) {
 		bf->bf_desc = (struct ath_desc *) ds;
 		bf->bf_daddr = DS2PHYS(dd, ds);
 		if (! ath_hal_split4ktrans(sc->sc_ah)) {
@@ -2855,7 +2855,7 @@ ath_descdma_setup(struct ath_softc *sc,
 			 * in the descriptor.
 			 */
 			 if (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr,
-			     desc_len * ndesc)) {
+			     dd->dd_descsize * ndesc)) {
 				/* Start at the next page */
 				ds += 0x1000 - (bf->bf_daddr & 0xFFF);
 				bf->bf_desc = (struct ath_desc *) ds;
@@ -2915,7 +2915,8 @@ ath_descdma_setup_rx_edma(struct ath_sof
 	 * However, dd_desc_len is used by ath_descdma_free() to determine
 	 * whether we have already freed this DMA mapping.
 	 */
-	dd->dd_desc_len = rx_status_len;
+	dd->dd_desc_len = rx_status_len * nbuf;
+	dd->dd_descsize = rx_status_len;
 
 	/* allocate rx buffers */
 	bsize = sizeof(struct ath_buf) * nbuf;

Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c	Sun Jul 22 23:21:21 2012	(r238707)
+++ head/sys/dev/ath/if_ath_tx.c	Mon Jul 23 02:26:33 2012	(r238708)
@@ -302,6 +302,11 @@ ath_tx_chaindesclist(struct ath_softc *s
 	struct ath_hal *ah = sc->sc_ah;
 	struct ath_desc *ds, *ds0;
 	int i;
+	/*
+	 * XXX There's txdma and txdma_mgmt; the descriptor
+	 * sizes must match.
+	 */
+	struct ath_descdma *dd = &sc->sc_txdma;
 
 	/*
 	 * Fillin the remainder of the descriptor info.
@@ -313,7 +318,7 @@ ath_tx_chaindesclist(struct ath_softc *s
 			ath_hal_settxdesclink(ah, ds, 0);
 		else
 			ath_hal_settxdesclink(ah, ds,
-			    bf->bf_daddr + sizeof(*ds) * (i + 1));
+			    bf->bf_daddr + dd->dd_descsize * (i + 1));
 		ath_hal_filltxdesc(ah, ds
 			, bf->bf_segs[i].ds_len	/* segment length */
 			, i == 0		/* first segment */
@@ -341,6 +346,11 @@ ath_tx_chaindesclist_subframe(struct ath
 	struct ath_hal *ah = sc->sc_ah;
 	struct ath_desc *ds, *ds0;
 	int i;
+	/*
+	 * XXX There's txdma and txdma_mgmt; the descriptor
+	 * sizes must match.
+	 */
+	struct ath_descdma *dd = &sc->sc_txdma;
 
 	ds0 = ds = bf->bf_desc;
 
@@ -354,7 +364,7 @@ ath_tx_chaindesclist_subframe(struct ath
 			ath_hal_settxdesclink(ah, ds, 0);
 		else
 			ath_hal_settxdesclink(ah, ds,
-			    bf->bf_daddr + sizeof(*ds) * (i + 1));
+			    bf->bf_daddr + dd->dd_descsize * (i + 1));
 
 		/*
 		 * This performs the setup for an aggregate frame.

Modified: head/sys/dev/ath/if_athvar.h
==============================================================================
--- head/sys/dev/ath/if_athvar.h	Sun Jul 22 23:21:21 2012	(r238707)
+++ head/sys/dev/ath/if_athvar.h	Mon Jul 23 02:26:33 2012	(r238708)
@@ -277,6 +277,7 @@ typedef TAILQ_HEAD(ath_bufhead_s, ath_bu
 struct ath_descdma {
 	const char*		dd_name;
 	struct ath_desc		*dd_desc;	/* descriptors */
+	int			dd_descsize;	/* size of single descriptor */
 	bus_addr_t		dd_desc_paddr;	/* physical addr of dd_desc */
 	bus_size_t		dd_desc_len;	/* size of dd_desc */
 	bus_dma_segment_t	dd_dseg;



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