PERFORCE change 64769 for review

Sam Leffler sam at FreeBSD.org
Tue Nov 9 17:18:40 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=64769

Change 64769 by sam at sam_ebb on 2004/11/10 01:17:43

	switch ibss beacon generation from using swba to a self-linked
	descriptor marked with veol

Affected files ...

.. //depot/projects/wifi/sys/dev/ath/if_ath.c#15 edit
.. //depot/projects/wifi/sys/dev/ath/if_athvar.h#6 edit

Differences ...

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

@@ -499,6 +499,12 @@
 	}
 	sc->sc_defant = ath_hal_getdefantenna(ah);
 
+	/*
+	 * Not all chips have the VEOL support we want to
+	 * use with IBSS beacons; check here for it.
+	 */
+	sc->sc_hasveol = ath_hal_veolsupported(ah);
+
 	/* get mac address from hardware */
 	ath_hal_getmac(ah, ic->ic_myaddr);
 
@@ -1577,7 +1583,7 @@
 	struct ath_node *an = ATH_NODE(ni);
 	struct ath_desc *ds;
 	u_int8_t rate;
-	int error;
+	int error, flags;
 
 	DPRINTF(sc, ATH_DEBUG_BEACON, "%s: m %p len %u\n",
 		__func__, m, m->m_len);
@@ -1596,7 +1602,12 @@
 	/* setup descriptors */
 	ds = bf->bf_desc;
 
-	ds->ds_link = 0;
+	flags = HAL_TXDESC_NOACK;
+	if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol) {
+		ds->ds_link = bf->bf_daddr;	/* self-linked */
+		flags = HAL_TXDESC_VEOL;
+	} else
+		ds->ds_link = 0;
 	ds->ds_data = bf->bf_segs[0].ds_addr;
 	/*
 	 * Calculate rate code.
@@ -1614,7 +1625,7 @@
 		, rate, 1			/* series 0 rate/tries */
 		, HAL_TXKEYIX_INVALID		/* no encryption */
 		, 0				/* antenna mode */
-		, HAL_TXDESC_NOACK		/* no ack for beacons */
+		, flags				/* no ack, veol for beacons */
 		, 0				/* rts/cts rate */
 		, 0				/* rts/cts duration */
 	);
@@ -1820,7 +1831,8 @@
 
 	nexttbtt = (LE_READ_4(ni->ni_tstamp.data + 4) << 22) |
 	    (LE_READ_4(ni->ni_tstamp.data) >> 10);
-	DPRINTF(sc, ATH_DEBUG_BEACON, "%s: nexttbtt=%u\n", __func__, nexttbtt);
+	DPRINTF(sc, ATH_DEBUG_BEACON, "%s: nexttbtt %u intval %u\n",
+		__func__, nexttbtt, ni->ni_intval);
 	nexttbtt += ni->ni_intval;
 	intval = ni->ni_intval & HAL_BEACON_PERIOD;
 	if (ic->ic_opmode == IEEE80211_M_STA) {
@@ -1893,17 +1905,36 @@
 		sc->sc_imask |= HAL_INT_BMISS;
 		ath_hal_intrset(ah, sc->sc_imask);
 	} else {
-		DPRINTF(sc, ATH_DEBUG_BEACON, "%s: intval %u nexttbtt %u\n",
-			__func__, ni->ni_intval, nexttbtt);
 		ath_hal_intrset(ah, 0);
 		if (nexttbtt == ni->ni_intval)
 			intval |= HAL_BEACON_RESET_TSF;
-		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
+		if (ic->ic_opmode == IEEE80211_M_IBSS) {
+			/*
+			 * In IBSS mode enable the beacon timers but only
+			 * enable SWBA interrupts if we need to manually
+			 * prepare beacon frames.  Otherwise we use a
+			 * self-linked tx descriptor and let the hardware
+			 * deal with things.
+			 */
+			intval |= HAL_BEACON_ENA;
+			if (!sc->sc_hasveol)
+				sc->sc_imask |= HAL_INT_SWBA;
+		} else if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
+			/*
+			 * In AP mode we enable the beacon timers and
+			 * SWBA interrupts to prepare beacon frames.
+			 */
 			intval |= HAL_BEACON_ENA;
 			sc->sc_imask |= HAL_INT_SWBA;	/* beacon prepare */
 		}
 		ath_hal_beaconinit(ah, nexttbtt, intval);
 		ath_hal_intrset(ah, sc->sc_imask);
+		/*
+		 * When using a self-linked beacon descriptor in
+		 * ibss mode load it once here.
+		 */
+		if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol)
+			ath_beacon_proc(sc, 0);
 	}
 }
 
@@ -2143,9 +2174,8 @@
 			sc->sc_stats.ast_rx_busdma++;
 			return error;
 		}
-		KASSERT(bf->bf_nseg == 1,
-			("ath_rxbuf_init: multi-segment packet; nseg %u",
-			bf->bf_nseg));
+		KASSERT(bf->bf_nseg == 1, ("%s: multi-segment packet; nseg %u",
+			__func__, bf->bf_nseg));
 	}
 	bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREREAD);
 

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

@@ -155,7 +155,8 @@
 				sc_splitmic: 1,	/* split TKIP MIC keys */
 				sc_needmib : 1,	/* enable MIB stats intr */
 				sc_hasdiversity : 1,/* rx diversity available */
-				sc_diversity : 1;/* enable rx diversity */
+				sc_diversity : 1,/* enable rx diversity */
+				sc_hasveol : 1;	/* tx VEOL support */
 						/* rate tables */
 	const HAL_RATE_TABLE	*sc_rates[IEEE80211_MODE_MAX];
 	const HAL_RATE_TABLE	*sc_currates;	/* current rate table */
@@ -399,6 +400,8 @@
 	ath_hal_setcapability(_ah, HAL_CAP_DIAG, 0, _v, NULL)
 #define	ath_hal_getnumtxqueues(_ah, _pv) \
 	(ath_hal_getcapability(_ah, HAL_CAP_NUM_TXQUEUES, 0, _pv) == HAL_OK)
+#define	ath_hal_veolsupported(_ah) \
+	(ath_hal_getcapability(_ah, HAL_CAP_VEOL, 0, NULL) == HAL_OK)
 
 #define	ath_hal_setuprxdesc(_ah, _ds, _size, _intreq) \
 	((*(_ah)->ah_setupRxDesc)((_ah), (_ds), (_size), (_intreq)))


More information about the p4-projects mailing list