Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Nov 2005 06:34:06 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 87257 for review
Message-ID:  <200511260634.jAQ6Y608042011@repoman.freebsd.org>

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

Change 87257 by sam@sam_ebb on 2005/11/26 06:33:35

	first cut at wme and fixing ifs parameters

Affected files ...

.. //depot/projects/wifi/sys/dev/ral/if_ral.c#14 edit
.. //depot/projects/wifi/sys/dev/ral/if_ralvar.h#5 edit

Differences ...

==== //depot/projects/wifi/sys/dev/ral/if_ral.c#14 (text+ko) ====

@@ -109,7 +109,7 @@
 static uint8_t		ral_plcp_signal(int);
 static void		ral_setup_tx_desc(struct ral_softc *,
 			    struct ral_tx_desc *, uint32_t, int, int, int,
-			    bus_addr_t);
+			    u_int, u_int, u_int, bus_addr_t);
 static int		ral_tx_bcn(struct ral_softc *, struct mbuf *,
 			    struct ieee80211_node *);
 static int		ral_tx_mgt(struct ral_softc *, struct mbuf *,
@@ -136,6 +136,7 @@
 static void		ral_enable_tsf_sync(struct ral_softc *);
 static void		ral_update_plcp(struct ral_softc *);
 static void		ral_update_slot(struct ifnet *);
+static int		ral_wme_update(struct ieee80211com *);
 static void		ral_update_led(struct ral_softc *, int, int);
 static void		ral_set_bssid(struct ral_softc *, const uint8_t *);
 static void		ral_set_macaddr(struct ral_softc *, uint8_t *);
@@ -427,6 +428,7 @@
 		| IEEE80211_C_TXPMGT
 		| IEEE80211_C_BGSCAN		/* capable of bg scanning */
 		| IEEE80211_C_WPA		/* capable of WPA1+WPA2 */
+		| IEEE80211_C_WME		/* capable of WME */
 		;
 
 	if (sc->rf_rev == RAL_RF_5222) {
@@ -473,6 +475,7 @@
 	ieee80211_ifattach(ic);
 	ic->ic_node_alloc = ral_node_alloc;
 	ic->ic_updateslot = ral_update_slot;
+	ic->ic_wme.wme_update = ral_wme_update;
 	ic->ic_reset = ral_reset;
 	ic->ic_scan_start = ral_scan_start;
 	ic->ic_scan_end = ral_scan_end;
@@ -1650,7 +1653,8 @@
 
 static void
 ral_setup_tx_desc(struct ral_softc *sc, struct ral_tx_desc *desc,
-    uint32_t flags, int len, int rate, int encrypt, bus_addr_t physaddr)
+    uint32_t flags, int len, int rate, int encrypt,
+    u_int aifsn, u_int logcwmin, u_int logcwmax, bus_addr_t physaddr)
 {
 	struct ieee80211com *ic = &sc->sc_ic;
 	uint16_t plcp_length;
@@ -1664,7 +1668,10 @@
 		desc->flags |= htole32(RAL_TX_OFDM);
 
 	desc->physaddr = htole32(physaddr);
-	desc->wme = htole16(RAL_AIFSN(3) | RAL_LOGCWMIN(4) | RAL_LOGCWMAX(6));
+	desc->wme = htole16(RAL_AIFSN(aifsn)
+			  | RAL_LOGCWMIN(logcwmin)
+		  	  | RAL_LOGCWMAX(logcwmax))
+			  ;
 
 	/*
 	 * Fill PLCP fields.
@@ -1738,8 +1745,27 @@
 	data->m = m0;
 	data->ni = ni;
 
-	ral_setup_tx_desc(sc, desc, RAL_TX_IFS_NEWBACKOFF | RAL_TX_TIMESTAMP,
-	    m0->m_pkthdr.len, rate, 0, segs->ds_addr);
+	if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
+		/*
+		 * Always burst out beacon and CAB traffic.
+		 */
+		ral_setup_tx_desc(sc, desc,
+		    RAL_TX_IFS_NEWBACKOFF | RAL_TX_TIMESTAMP,
+		    m0->m_pkthdr.len, rate, 0, RAL_BEACON_AIFS_DEFAULT,
+		    RAL_BEACON_CWMIN_DEFAULT, RAL_BEACON_CWMAX_DEFAULT,
+		    segs->ds_addr);
+	} else {
+		struct wmeParams *wmep =
+			&ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_BE];
+		/*
+		 * Adhoc mode; important thing is to use 2x cwmin.
+		 */
+		ral_setup_tx_desc(sc, desc,
+		    RAL_TX_IFS_NEWBACKOFF | RAL_TX_TIMESTAMP,
+		    m0->m_pkthdr.len, rate, 0, wmep->wmep_aifsn,
+		    wmep->wmep_logcwmin+1, wmep->wmep_logcwmax,
+		    segs->ds_addr);
+	}
 
 	DPRINTFN(10, ("sending beacon frame len=%u idx=%u rate=%u\n",
 	    m0->m_pkthdr.len, sc->bcnq.cur, rate));
@@ -1757,6 +1783,7 @@
 ral_tx_mgt(struct ral_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
 {
 	struct ieee80211com *ic = &sc->sc_ic;
+	const struct wmeParams *wmep;
 	struct ral_tx_desc *desc;
 	struct ral_tx_data *data;
 	struct ieee80211_frame *wh;
@@ -1765,6 +1792,13 @@
 	uint32_t flags = 0;
 	int nsegs, rate, error;
 
+	/* NB: force all management frames to highest queue */
+	if (ni->ni_flags & IEEE80211_NODE_QOS) {
+		/* NB: force all management frames to highest queue */
+		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_VO];
+	} else
+		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_BE];
+	/* XXX use different queue's */
 	desc = &sc->prioq.desc[sc->prioq.cur];
 	data = &sc->prioq.data[sc->prioq.cur];
 
@@ -1797,7 +1831,8 @@
 	wh = mtod(m0, struct ieee80211_frame *);
 
 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
-		flags |= RAL_TX_ACK;
+		if (!wmep->wmep_noackPolicy)
+			flags |= RAL_TX_ACK;
 
 		dur = ral_txtime(RAL_ACK_SIZE, rate, ic->ic_flags) + RAL_SIFS;
 		*(uint16_t *)wh->i_dur = htole16(dur);
@@ -1811,6 +1846,7 @@
 	}
 
 	ral_setup_tx_desc(sc, desc, flags, m0->m_pkthdr.len, rate, 0,
+	    wmep->wmep_aifsn, wmep->wmep_logcwmin, wmep->wmep_logcwmax,
 	    segs->ds_addr);
 
 	bus_dmamap_sync(sc->prioq.data_dmat, data->map, BUS_DMASYNC_PREWRITE);
@@ -1862,6 +1898,8 @@
 ral_tx_data(struct ral_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
 {
 	struct ieee80211com *ic = &sc->sc_ic;
+	const struct wmeParams * wmep =
+		&ic->ic_wme.wme_chanParams.cap_wmeParams[M_WME_GETAC(m0)];
 	struct ral_tx_desc *desc;
 	struct ral_tx_data *data;
 	struct ral_node *rn;
@@ -1941,7 +1979,8 @@
 		data->id.id_node = NULL;
 
 		ral_setup_tx_desc(sc, desc, RAL_TX_ACK | RAL_TX_MORE_FRAG,
-		    m->m_pkthdr.len, rtsrate, 1, segs->ds_addr);
+		    m->m_pkthdr.len, rtsrate, 1, wmep->wmep_aifsn,
+		    wmep->wmep_logcwmin, wmep->wmep_logcwmax, segs->ds_addr);
 
 		bus_dmamap_sync(sc->txq.data_dmat, data->map,
 		    BUS_DMASYNC_PREWRITE);
@@ -2017,7 +2056,8 @@
 		data->id.id_node = NULL;
 
 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
-		flags |= RAL_TX_ACK;
+		if (!wmep->wmep_noackPolicy)
+			flags |= RAL_TX_ACK;
 
 		dur = ral_txtime(RAL_ACK_SIZE, ral_ack_rate(ic, rate),
 		    ic->ic_flags) + RAL_SIFS;
@@ -2025,6 +2065,7 @@
 	}
 
 	ral_setup_tx_desc(sc, desc, flags, m0->m_pkthdr.len, rate, 1,
+	    wmep->wmep_aifsn, wmep->wmep_logcwmin, wmep->wmep_logcwmax,
 	    segs->ds_addr);
 
 	bus_dmamap_sync(sc->txq.data_dmat, data->map, BUS_DMASYNC_PREWRITE);
@@ -2113,6 +2154,12 @@
 				ieee80211_free_node(ni);
 				continue;
 			}
+			/* calculate priority so we can find the tx queue */
+			if (ieee80211_classify(ic, m0, ni)) {
+				m_freem(m0);
+				ieee80211_free_node(ni);
+				continue;
+			}
 			BPF_MTAP(ifp, m0);
 
 			m0 = ieee80211_encap(ic, m0, ni);
@@ -2543,6 +2590,16 @@
 	DPRINTF(("setting slottime to %uus\n", slottime));
 }
 
+/*
+ * Callback from the 802.11 layer to update WME parameters.
+ */
+static int
+ral_wme_update(struct ieee80211com *ic)
+{
+	/* NB: nothing to do right now */
+	return 0;
+}
+
 static void
 ral_update_led(struct ral_softc *sc, int led1, int led2)
 {

==== //depot/projects/wifi/sys/dev/ral/if_ralvar.h#5 (text+ko) ====

@@ -17,6 +17,10 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define	RAL_BEACON_AIFS_DEFAULT	 0	/* default aifs for ap beacon q */
+#define	RAL_BEACON_CWMIN_DEFAULT 0	/* default cwmin for ap beacon q */
+#define	RAL_BEACON_CWMAX_DEFAULT 0	/* default cwmax for ap beacon q */
+
 struct ral_rx_radiotap_header {
 	struct ieee80211_radiotap_header wr_ihdr;
 	uint64_t	wr_tsf;



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