Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Sep 2015 07:25:54 +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: r288257 - head/sys/dev/usb/wlan
Message-ID:  <201509260725.t8Q7PsSF016107@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sat Sep 26 07:25:53 2015
New Revision: 288257
URL: https://svnweb.freebsd.org/changeset/base/288257

Log:
  * Add 11n HT40 support - i needed to send both HTINFO and HTCAP fields
    in the join message so the firmware would pick it up.
  
  * Strip out the direct hardware fiddling for 40MHz mode - the firmware
    we're using doesn't require it (the rtl8712su firmware does; it
    is less 'fullmac' than what we're using.)
  
  * Fix the mbuf handling during errors - rsu_tx shouldn't free mbufs;
    it's up to the caller to do so.  This brings it in line with
    what other drivers do or should be doing.
  
  Tested:
  
  * RTL8712, HT40 channel, STA mode (during this commit)

Modified:
  head/sys/dev/usb/wlan/if_rsu.c

Modified: head/sys/dev/usb/wlan/if_rsu.c
==============================================================================
--- head/sys/dev/usb/wlan/if_rsu.c	Sat Sep 26 07:18:05 2015	(r288256)
+++ head/sys/dev/usb/wlan/if_rsu.c	Sat Sep 26 07:25:53 2015	(r288257)
@@ -22,7 +22,6 @@ __FBSDID("$FreeBSD$");
  * Driver for Realtek RTL8188SU/RTL8191SU/RTL8192SU.
  *
  * TODO:
- *   o 11n HT40 support
  *   o h/w crypto
  *   o hostap / ibss / mesh
  *   o sensible RSSI levels
@@ -490,14 +489,7 @@ rsu_attach(device_t self)
 		    IEEE80211_HTC_AMSDU |
 		    IEEE80211_HTCAP_MAXAMSDU_3839 |
 		    IEEE80211_HTCAP_SMPS_OFF;
-
-		/*
-		 * XXX HT40 isn't working in this driver yet - there's
-		 * something missing.  Disable it for now.
-		 */
-#if 0
 		ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40;
-#endif
 
 		/* set number of spatial streams */
 		ic->ic_txstream = 1;
@@ -1378,8 +1370,10 @@ rsu_join_bss(struct rsu_softc *sc, struc
 	if ((ic->ic_flags & IEEE80211_F_WME) &&
 	    (ni->ni_ies.wme_ie != NULL))
 		frm = ieee80211_add_wme_info(frm, &ic->ic_wme);
-	if (ni->ni_flags & IEEE80211_NODE_HT)
+	if (ni->ni_flags & IEEE80211_NODE_HT) {
 		frm = ieee80211_add_htcap(frm, ni);
+		frm = ieee80211_add_htinfo(frm, ni);
+	}
 	bss->ieslen = htole32(frm - (uint8_t *)fixed);
 	bss->len = htole32(((frm - buf) + 3) & ~3);
 	RSU_DPRINTF(sc, RSU_DEBUG_RESET | RSU_DEBUG_FWCMD,
@@ -1844,6 +1838,10 @@ rsu_bulk_rx_callback(struct usb_xfer *xf
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
+		/*
+		 * XXX TODO: if we have an mbuf list, but then
+		 * we hit data == NULL, what now?
+		 */
 		data = STAILQ_FIRST(&sc->sc_rx_inactive);
 		if (data == NULL) {
 			KASSERT(m == NULL, ("mbuf isn't NULL"));
@@ -2001,6 +1999,11 @@ rsu_bulk_tx_callback_h2c(struct usb_xfer
 	rsu_start(sc);
 }
 
+/*
+ * Transmit the given frame.
+ *
+ * This doesn't free the node or mbuf upon failure.
+ */
 static int
 rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 
     struct mbuf *m0, struct rsu_data *data)
@@ -2031,7 +2034,6 @@ rsu_tx_start(struct rsu_softc *sc, struc
 			device_printf(sc->sc_dev,
 			    "ieee80211_crypto_encap returns NULL.\n");
 			/* XXX we don't expect the fragmented frames */
-			m_freem(m0);
 			return (ENOBUFS);
 		}
 		wh = mtod(m0, struct ieee80211_frame *);
@@ -2147,6 +2149,11 @@ rsu_transmit(struct ieee80211com *ic, st
 		RSU_UNLOCK(sc);
 		return (ENXIO);
 	}
+
+	/*
+	 * XXX TODO: ensure that we treat 'm' as a list of frames
+	 * to transmit!
+	 */
 	error = mbufq_enqueue(&sc->sc_snd, m);
 	if (error) {
 		RSU_DPRINTF(sc, RSU_DEBUG_TX,
@@ -2207,6 +2214,7 @@ _rsu_start(struct rsu_softc *sc)
 			    IFCOUNTER_OERRORS, 1);
 			rsu_freebuf(sc, bf);
 			ieee80211_free_node(ni);
+			m_freem(m);
 			break;
 		}
 	}
@@ -2720,6 +2728,7 @@ rsu_raw_xmit(struct ieee80211_node *ni, 
 	}
 	if (rsu_tx_start(sc, ni, m, bf) != 0) {
 		ieee80211_free_node(ni);
+		m_freem(m);
 		rsu_freebuf(sc, bf);
 		RSU_UNLOCK(sc);
 		return (EIO);
@@ -2809,19 +2818,6 @@ rsu_init(struct rsu_softc *sc)
 		goto fail;
 	}
 
-	if (ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40) {
-		/* Enable 40MHz mode. */
-		error = rsu_fw_iocmd(sc,
-		    SM(R92S_IOCMD_CLASS, 0xf4) |
-		    SM(R92S_IOCMD_INDEX, 0x00) |
-		    SM(R92S_IOCMD_VALUE, 0x0007));
-		if (error != 0) {
-			device_printf(sc->sc_dev,
-			    "could not enable 40MHz mode\n");
-			goto fail;
-		}
-	}
-
 	sc->sc_scan_pass = 0;
 	usbd_transfer_start(sc->sc_xfer[RSU_BULK_RX]);
 



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