Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Dec 2015 15:08:01 +0000 (UTC)
From:      Andriy Voskoboinyk <avos@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r291858 - head/sys/dev/usb/wlan
Message-ID:  <201512051508.tB5F81CZ001333@repo.freebsd.org>

Next in thread | Raw E-Mail | Index | Archive | Help
Author: avos
Date: Sat Dec  5 15:08:01 2015
New Revision: 291858
URL: https://svnweb.freebsd.org/changeset/base/291858

Log:
  urtwn: fix some regressions after r290630
  
  - Restore R92C_TXDW4_HWSEQ_EN bit - it is used by non-8188EU chips.
  - Fix DRVRATE bit usage.
  
  Tested with:
   - RTL8188EU, STA mode.
   - RTL8188CUS, STA mode.
  
  Reviewed by:	kevlo
  Approved by:	adrian (mentor)
  Differential Revision:	https://reviews.freebsd.org/D4352

Modified:
  head/sys/dev/usb/wlan/if_urtwn.c
  head/sys/dev/usb/wlan/if_urtwnreg.h

Modified: head/sys/dev/usb/wlan/if_urtwn.c
==============================================================================
--- head/sys/dev/usb/wlan/if_urtwn.c	Sat Dec  5 12:55:34 2015	(r291857)
+++ head/sys/dev/usb/wlan/if_urtwn.c	Sat Dec  5 15:08:01 2015	(r291858)
@@ -1601,14 +1601,16 @@ urtwn_init_beacon(struct urtwn_softc *sc
 	    SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_BEACON) |
 	    SM(R92C_TXDW1_RAID, R92C_RAID_11B));
 
-	if (sc->chip & URTWN_CHIP_88E)
+	if (sc->chip & URTWN_CHIP_88E) {
 		txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC));
-	else
+		txd->txdseq |= htole16(R88E_TXDSEQ_HWSEQ_EN);
+	} else {
 		txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC));
+		txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
+	}
 
 	txd->txdw4 = htole32(R92C_TXDW4_DRVRATE);
 	txd->txdw5 = htole32(SM(R92C_TXDW5_DATARATE, URTWN_RIDX_CCK1));
-	txd->txdseq = htole16(R92C_TXDSEQ_HWSEQ_EN);
 }
 
 static int
@@ -2249,13 +2251,17 @@ urtwn_tx_data(struct urtwn_softc *sc, st
 		txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, macid));
 
 	txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx));
-	/* not sure here */
-	if (ridx <= URTWN_RIDX_CCK11)
+	/* Force this rate if needed. */
+	if (ismcast || type != IEEE80211_FC0_TYPE_DATA ||
+	    (m->m_flags & M_EAPOL))
 		txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
 
 	if (!IEEE80211_QOS_HAS_SEQ(wh)) {
 		/* Use HW sequence numbering for non-QoS frames. */
-		txd->txdseq = htole16(R92C_TXDSEQ_HWSEQ_EN);
+		if (sc->chip & URTWN_CHIP_88E)
+			txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN);
+		else
+			txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
 	} else {
 		/* Set sequence number. */
 		txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE);

Modified: head/sys/dev/usb/wlan/if_urtwnreg.h
==============================================================================
--- head/sys/dev/usb/wlan/if_urtwnreg.h	Sat Dec  5 12:55:34 2015	(r291857)
+++ head/sys/dev/usb/wlan/if_urtwnreg.h	Sat Dec  5 15:08:01 2015	(r291858)
@@ -1055,12 +1055,13 @@ struct r92c_tx_desc {
 
 	uint16_t	txdw3;
 	uint16_t	txdseq;
-#define R92C_TXDSEQ_HWSEQ_EN	0x8000
+#define R88E_TXDSEQ_HWSEQ_EN	0x8000
 
 	uint32_t	txdw4;
 #define R92C_TXDW4_RTSRATE_M	0x0000003f
 #define R92C_TXDW4_RTSRATE_S	0
 #define R92C_TXDW4_HWSEQ_QOS	0x00000040
+#define R92C_TXDW4_HWSEQ_EN	0x00000080
 #define R92C_TXDW4_DRVRATE	0x00000100
 #define R92C_TXDW4_CTS2SELF	0x00000800
 #define R92C_TXDW4_RTSEN	0x00001000



Want to link to this message? Use this URL: <http://docs.FreeBSD.org/cgi/mid.cgi?201512051508.tB5F81CZ001333>