Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148620342
D22840.id72388.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
19 KB
Referenced Files
None
Subscribers
None
D22840.id72388.diff
View Options
Index: sys/dev/usb/wlan/if_run.c
===================================================================
--- sys/dev/usb/wlan/if_run.c
+++ sys/dev/usb/wlan/if_run.c
@@ -80,7 +80,15 @@
#define RUN_DEBUG
#endif
+#define IF_RUN_11N
+#define IF_RUN_11N_AMPDU
+/* #undef IF_RUN_11N */
+/* #undef IF_RUN_11N_AMPDU */
+#undef IF_RUN_11N_5GHZ
+#define RUN_DEBUG
+
#ifdef RUN_DEBUG
+/* int run_debug = 0x00000020; */
int run_debug = 0;
static SYSCTL_NODE(_hw_usb, OID_AUTO, run, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
"USB run");
@@ -368,6 +376,7 @@
static usb_callback_t run_bulk_tx_callback4;
static usb_callback_t run_bulk_tx_callback5;
+
static void run_autoinst(void *, struct usb_device *,
struct usb_attach_arg *);
static int run_driver_loaded(struct module *, int, void *);
@@ -495,6 +504,10 @@
static void run_init_locked(struct run_softc *);
static void run_stop(void *);
static void run_delay(struct run_softc *, u_int);
+#ifdef IF_RUN_11N
+static int run_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap);
+static void print_run_txwi(struct rt2860_txwi *txwi);
+#endif
static eventhandler_tag run_etag;
@@ -517,7 +530,34 @@
{ 48, 4, IEEE80211_T_OFDM, 8, 44, 44 },
{ 72, 5, IEEE80211_T_OFDM, 8, 40, 40 },
{ 96, 6, IEEE80211_T_OFDM, 8, 40, 40 },
- { 108, 7, IEEE80211_T_OFDM, 8, 40, 40 }
+ { 108, 7, IEEE80211_T_OFDM, 8, 40, 40 },
+#ifdef IF_RUN_11N
+/* These rate values have been taken from the RT5350 datasheet.
+ Missing MCS indices in the following list are reserved according
+ to the datasheet. SGI/BW supported for MCS 0-15, but only SGI
+ supported for MCS 32.
+*/
+ /* single stream */
+ {6, 0, IEEE80211_T_HT, 4, 60, 60},
+ {13, 1, IEEE80211_T_HT, 4, 60, 60},
+ {19, 2, IEEE80211_T_HT, 4, 60, 60},
+ {26, 3, IEEE80211_T_HT, 4, 60, 60},
+ {39, 4, IEEE80211_T_HT, 4, 60, 60},
+ {52, 5, IEEE80211_T_HT, 4, 60, 60},
+ {58, 6, IEEE80211_T_HT, 4, 60, 60},
+ {65, 7, IEEE80211_T_HT, 4, 60, 60},
+ /* 2 streams */
+ {13, 8, IEEE80211_T_HT, 4, 60, 60},
+ {26, 9, IEEE80211_T_HT, 4, 60, 60},
+ {39, 10, IEEE80211_T_HT, 4, 60, 60},
+ {52, 11, IEEE80211_T_HT, 4, 60, 60},
+ {78, 12, IEEE80211_T_HT, 4, 60, 60},
+ {104, 13, IEEE80211_T_HT, 4, 60, 60},
+ {117, 14, IEEE80211_T_HT, 4, 60, 60},
+ {130, 15, IEEE80211_T_HT, 4, 60, 60},
+ /* BW = 1 => PHY_RATE *= 2, HT duplicate 6 Mbps */
+ {6, 32, IEEE80211_T_HT, 4, 60, 60},
+#endif
};
static const struct {
@@ -810,6 +850,22 @@
IEEE80211_C_WME | /* WME */
IEEE80211_C_WPA; /* WPA1|WPA2(RSN) */
+#ifdef IF_RUN_11N
+ /* set device HT capabilities */
+ /* HT Capabilities strictly for 11ng (we dont support 11ac yet..) */
+ /* XXX: Turn on TX/RX STBC and multiple STBC streams later when
+ everything else works. Set MCS32 RX/TX bits later after AMPDU RX
+ is fast enough */
+ ic->ic_htcaps = IEEE80211_HTCAP_SMPS_OFF |
+ IEEE80211_HTCAP_SHORTGI20 |
+ IEEE80211_HTCAP_GREENFIELD |
+ IEEE80211_HTC_HT;
+
+ int numstreams = 2;
+ ic->ic_rxstream = ic->ic_txstream = numstreams;
+
+ printf("run htcaps 0x%x\n", ic->ic_htcaps);
+#endif
ic->ic_cryptocaps =
IEEE80211_CRYPTO_WEP |
IEEE80211_CRYPTO_AES_CCM |
@@ -839,6 +895,9 @@
ic->ic_vap_delete = run_vap_delete;
ic->ic_transmit = run_transmit;
ic->ic_parent = run_parent;
+#ifdef IF_RUN_11N
+ ic->ic_ampdu_enable = run_ampdu_enable;
+#endif
ieee80211_radiotap_attach(ic,
&sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
@@ -974,6 +1033,14 @@
vap->iv_update_beacon = run_update_beacon;
vap->iv_max_aid = RT2870_WCID_MAX;
+#ifdef IF_RUN_11N
+ vap->iv_debug |= IEEE80211_MSG_11N;
+#endif
+#ifdef IF_RUN_11N_AMPDU
+ vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_64K;
+ vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_2; /* = 4 */
+ /* For density, reference driver just sets it to 4 at hw probe time */
+#endif
/*
* To delete the right key from h/w, we need wcid.
* Luckily, there is unused space in ieee80211_key{}, wk_pad,
@@ -2067,8 +2134,8 @@
ni = ieee80211_ref_node(vap->iv_bss);
rn = RUN_NODE(ni);
rn->fix_ridx = ridx;
- RUN_DPRINTF(sc, RUN_DEBUG_RATE, "rate=%d, fix_ridx=%d\n",
- rate, rn->fix_ridx);
+ RUN_DPRINTF(sc, RUN_DEBUG_RATE, " %s: rate=%d, fix_ridx=%d\n",
+ __func__, rate, rn->fix_ridx);
ieee80211_free_node(ni);
}
@@ -2636,7 +2703,7 @@
le16toh(sta[0].error.fail);
RUN_DPRINTF(sc, RUN_DEBUG_RATE,
- "retrycnt=%d success=%d failcnt=%d\n",
+ "amrr retrycnt=%d success=%d failcnt=%d\n",
txs->nretries, txs->nsuccess, le16toh(sta[0].error.fail));
} else {
wstat = &(sc->wcid_stats[RUN_AID2WCID(ni->ni_associd)]);
@@ -2649,7 +2716,7 @@
txs->nsuccess = (*wstat)[RUN_SUCCESS];
txs->nframes = (*wstat)[RUN_TXCNT];
RUN_DPRINTF(sc, RUN_DEBUG_RATE,
- "retrycnt=%d txcnt=%d success=%d\n",
+ "amrr retrycnt=%d txcnt=%d success=%d\n",
txs->nretries, txs->nframes, txs->nsuccess);
memset(wstat, 0, sizeof(*wstat));
@@ -2657,11 +2724,13 @@
ieee80211_ratectl_tx_update(vap, txs);
rn->amrr_ridx = ieee80211_ratectl_rate(ni, NULL, 0);
+ RUN_DPRINTF(sc, RUN_DEBUG_RATE,
+ "amrr ridx set to %d\n", rn->amrr_ridx);
fail:
RUN_UNLOCK(sc);
+ /* RUN_DPRINTF(sc, RUN_DEBUG_RATE, "amrr_ridx=%d\n", rn->amrr_ridx); */
- RUN_DPRINTF(sc, RUN_DEBUG_RATE, "ridx=%d\n", rn->amrr_ridx);
}
static void
@@ -2703,7 +2772,6 @@
/* only interested in true associations */
if (isnew && ni->ni_associd != 0) {
-
/*
* This function could is called though timeout function.
* Need to defer.
@@ -2745,6 +2813,7 @@
"rate=0x%02x ridx=%d ctl_ridx=%d\n",
rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]);
}
+
rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate;
for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
if (rt2860_rates[ridx].rate == rate)
@@ -2786,6 +2855,8 @@
struct run_vap *rvp = RUN_VAP(vap);
uint64_t ni_tstamp, rx_tstamp;
+ printf("Got a mgmt frame!\n");
+
rvp->recv_mgmt(ni, m, subtype, rxs, rssi, nf);
if (vap->iv_state == IEEE80211_S_RUN &&
@@ -2876,6 +2947,18 @@
} else
ni = NULL;
+#ifdef IF_RUN_11N_AMPDU
+ /* XXX predict_true? */
+ /* XXX Should we check whether the RXD has the AMPDU flag set
+ before we mark this mbuf instead of relying on the fact that
+ HT operation always implies AMPDU?
+ */
+
+ if(ni && ni->ni_flags & IEEE80211_NODE_HT) {
+ m->m_flags |= M_AMPDU;
+ }
+#endif
+
if (__predict_false(flags & RT2860_RX_MICERR)) {
/* report MIC failures to net80211 for TKIP */
if (ni != NULL)
@@ -2969,7 +3052,7 @@
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
- RUN_DPRINTF(sc, RUN_DEBUG_RECV,
+ RUN_DPRINTF(sc, RUN_DEBUG_RECV,
"rx done, actlen=%d\n", xferlen);
if (xferlen < (int)(sizeof(uint32_t) + rxwisize +
@@ -3029,6 +3112,9 @@
/* inputting all the frames must be last */
+ uint32_t cnt;
+ run_read(sc, RT2860_RX_MAX_CNT, &cnt);
+ printf("rx_max_cnt = 0x%x\n", cnt);
RUN_UNLOCK(sc);
m->m_pkthdr.len = m->m_len = xferlen;
@@ -3285,10 +3371,9 @@
uint16_t mcs;
uint8_t ridx = data->ridx;
uint8_t pad;
-
- /* get MCS code from rate index */
- mcs = rt2860_rates[ridx].mcs;
-
+#ifdef IF_RUN_11N
+ struct ieee80211_node *ni = data->ni;
+#endif
txwisize = (sc->mac_ver == 0x5592) ?
sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
xferlen = txwisize + m->m_pkthdr.len;
@@ -3313,13 +3398,36 @@
/* setup TX Wireless Information */
txwi = (struct rt2860_txwi *)(txd + 1);
txwi->len = htole16(m->m_pkthdr.len - pad);
+
+ /* get MCS code from rate index */
+ /* XXX: This needs to be a net80211_to_run_ridx() */
+ mcs = rt2860_rates[ridx].mcs;
+
+#ifdef IF_RUN_11N
+ /* if (IEEE80211_IS_CHAN_HT20(ic->ic_curchan)) { */
+ /* XXX Can we decide solely based on ridx whether this was
+ an MCS rate or not? It seems unlikely as amrr would consult
+ two different tables rates and htrates and its hard (impossible?)
+ to disambiguate.
+ */
+ if(ni->ni_txrate & IEEE80211_RATE_MCS) {
+ ridx += (RT2860_RIDX_MAX);
+ mcs = rt2860_rates[ridx].mcs;
+ }
+
+ if (rt2860_rates[ridx].phy == IEEE80211_T_HT) {
+ mcs |= RT2860_PHY_HT_MIX;
+ }
+ else
+#endif
if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
- mcs |= RT2860_PHY_CCK;
- if (ridx != RT2860_RIDX_CCK1 &&
- (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
- mcs |= RT2860_PHY_SHPRE;
+ mcs |= RT2860_PHY_CCK;
+ if (ridx != RT2860_RIDX_CCK1 &&
+ (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
+ mcs |= RT2860_PHY_SHPRE;
} else
- mcs |= RT2860_PHY_OFDM;
+ mcs |= RT2860_PHY_OFDM;
+
txwi->phy = htole16(mcs);
/* check if RTS/CTS or CTS-to-self protection is required */
@@ -3333,6 +3441,8 @@
if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh))
txwi->xflags |= RT2860_TX_NSEQ;
+
+ /* print_run_txwi(txwi); */
}
/* This function must be called locked */
@@ -3394,10 +3504,20 @@
RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
ctl_ridx = rt2860_rates[ridx].ctl_ridx;
} else {
- if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
+ if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
+ RUN_DPRINTF(sc, RUN_DEBUG_RATE, "set to fix_ridx ridx=%d\n",
+ rn->fix_ridx);
+
ridx = rn->fix_ridx;
- else
+ }
+ else {
ridx = rn->amrr_ridx;
+ RUN_DPRINTF(sc, RUN_DEBUG_RATE, "set to amrr_ridx ridx=%d\n",
+ rn->amrr_ridx);
+ if(ridx == 0)
+ ridx = 2;
+ }
+
ctl_ridx = rt2860_rates[ridx].ctl_ridx;
}
@@ -3616,7 +3736,7 @@
run_set_tx_desc(sc, data);
- RUN_DPRINTF(sc, RUN_DEBUG_XMIT, "sending prot len=%u rate=%u\n",
+ RUN_DPRINTF(sc, RUN_DEBUG_RATE, "sending prot len=%u rate=%u\n",
m->m_pkthdr.len, rate);
STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
@@ -4850,21 +4970,34 @@
run_getradiocaps(struct ieee80211com *ic,
int maxchans, int *nchans, struct ieee80211_channel chans[])
{
+
+#ifdef IF_RUN_11N_5GHZ // disable 5ghz for now
struct run_softc *sc = ic->ic_softc;
+#endif
uint8_t bands[IEEE80211_MODE_BYTES];
+ int ht40 = 0;
memset(bands, 0, sizeof(bands));
+
+#ifdef IF_RUN_11N
+ setbit(bands, IEEE80211_MODE_11NG);
+ setbit(bands, IEEE80211_MODE_11G);
+ ht40 = 0;
+#else
setbit(bands, IEEE80211_MODE_11B);
setbit(bands, IEEE80211_MODE_11G);
- ieee80211_add_channels_default_2ghz(chans, maxchans, nchans, bands, 0);
+#endif
+ ieee80211_add_channels_default_2ghz(chans, maxchans, nchans, bands, ht40);
+#ifdef IF_RUN_11N_5GHZ //disable 5ghz for now
if (sc->rf_rev == RT2860_RF_2750 || sc->rf_rev == RT2860_RF_2850 ||
sc->rf_rev == RT3070_RF_3052 || sc->rf_rev == RT3593_RF_3053 ||
sc->rf_rev == RT5592_RF_5592) {
setbit(bands, IEEE80211_MODE_11A);
ieee80211_add_channel_list_5ghz(chans, maxchans, nchans,
- run_chan_5ghz, nitems(run_chan_5ghz), bands, 0);
+ run_chan_5ghz, nitems(run_chan_5ghz), bands, ht40);
}
+#endif
}
static void
@@ -5223,6 +5356,9 @@
{
struct ieee80211com *ic = &sc->sc_ic;
+ RUN_DPRINTF(sc, RUN_DEBUG_ANY,
+ "Mode in %s is 0x%x\n", __func__, ic->ic_curmode);
+
/* set basic rates mask */
if (ic->ic_curmode == IEEE80211_MODE_11B)
run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
@@ -6205,6 +6341,11 @@
/* turn radio LED on */
run_set_leds(sc, RT2860_LED_RADIO);
+#ifdef IF_RUN_11N
+ /* Set up AUTO_RSP_CFG register for auto response */
+ run_write(sc, RT2860_AUTO_RSP_CFG, RT2860_AUTO_RSP_EN | RT2860_BAC_ACKPOLICY_EN | RT2860_CTS_40M_MODE_EN);
+#endif
+
sc->sc_flags |= RUN_RUNNING;
sc->cmdq_run = RUN_CMDQ_GO;
@@ -6311,6 +6452,24 @@
&sc->sc_mtx : NULL, USB_MS_TO_TICKS(ms));
}
+#ifdef IF_RUN_11N
+static int
+run_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
+{
+ /* For now, no A-MPDU TX support in the driver */
+ return 0;
+}
+
+void print_run_txwi(struct rt2860_txwi *txwi) {
+ printf("word0: flags 0x%08x txop 0x%08x phy 0x%016x\n", txwi->flags, txwi->txop, txwi->phy);
+ printf("word1: xflags 0x%08x wcid 0x%08x len 0x%016x\n", txwi->xflags, txwi->wcid, txwi->len);
+ printf("word1 ba winsize 0x%x\n", (txwi->xflags & 0xfc) >> 2);
+ printf("iv: 0x%x\n", txwi->iv);
+ printf("eiv: 0x%x\n", txwi->eiv);
+ printf("-------------\n");
+}
+#endif
+
static device_method_t run_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, run_match),
@@ -6329,6 +6488,12 @@
DRIVER_MODULE(run, uhub, run_driver, run_devclass, run_driver_loaded, NULL);
MODULE_DEPEND(run, wlan, 1, 1, 1);
+#ifdef IF_RUN_11N
+MODULE_DEPEND(run, wlan_amrr, 1, 1, 1);
+MODULE_DEPEND(run, wlan_tkip, 1, 1, 1);
+MODULE_DEPEND(run, wlan_ccmp, 1, 1, 1);
+MODULE_DEPEND(run, wlan_wep, 1, 1, 1);
+#endif
MODULE_DEPEND(run, usb, 1, 1, 1);
MODULE_DEPEND(run, firmware, 1, 1, 1);
MODULE_VERSION(run, 1);
Index: sys/dev/usb/wlan/if_runreg.h
===================================================================
--- sys/dev/usb/wlan/if_runreg.h
+++ sys/dev/usb/wlan/if_runreg.h
@@ -761,6 +761,13 @@
uint8_t flags;
} __packed;
+/* The TXWI and TXD have stayed exactly the same for several chips by the same
+manufacturer, see a datasheet for more details, for example pg. 209 in this
+datasheet: https://cdn.sparkfun.com/datasheets/Wireless/WiFi/RT5350.pdf
+The meaning of most hardware registers is also intact, and the datasheet
+can be consulted when developing this for better understanding.
+*/
+
/* TX Wireless Information */
struct rt2860_txwi {
uint8_t flags;
@@ -781,7 +788,7 @@
#define RT2860_PHY_MODE 0xc000
#define RT2860_PHY_CCK (0 << 14)
#define RT2860_PHY_OFDM (1 << 14)
-#define RT2860_PHY_HT (2 << 14)
+#define RT2860_PHY_HT_MIX (2 << 14)
#define RT2860_PHY_HT_GF (3 << 14)
#define RT2860_PHY_SGI (1 << 8)
#define RT2860_PHY_BW40 (1 << 7)
Index: sys/kern/kern_linker.c
===================================================================
--- sys/kern/kern_linker.c
+++ sys/kern/kern_linker.c
@@ -1870,7 +1870,7 @@
* XXX: we need to limit this number to some reasonable value
*/
if (vattr.va_size > LINKER_HINTS_MAX) {
- printf("hints file too large %ld\n", (long)vattr.va_size);
+ printf("linker.hints file too large %ld\n", (long)vattr.va_size);
goto bad;
}
hints = malloc(vattr.va_size, M_TEMP, M_WAITOK);
@@ -1888,7 +1888,7 @@
intp = (int *)hints;
ival = *intp++;
if (ival != LINKER_HINTS_VERSION) {
- printf("hints file version mismatch %d\n", ival);
+ printf("linker.hints file version mismatch %d\n", ival);
goto bad;
}
bufend = hints + vattr.va_size;
Index: sys/net80211/ieee80211.h
===================================================================
--- sys/net80211/ieee80211.h
+++ sys/net80211/ieee80211.h
@@ -649,6 +649,9 @@
"\13DELBA\14AMSDU(7935)\15DSSSCCK40\16PSMP\1740INTOLERANT" \
"\20LSIGTXOPPROT"
+/* XXX: These should really be renamed to HTPARAMs instead of HTCAPs as
+ they do not correspond to actual HTCAPs in HT IEs
+*/
/* HT parameters (hc_param) */
#define IEEE80211_HTCAP_MAXRXAMPDU 0x03 /* max rx A-MPDU factor */
#define IEEE80211_HTCAP_MAXRXAMPDU_S 0
@@ -656,6 +659,9 @@
#define IEEE80211_HTCAP_MAXRXAMPDU_16K 1
#define IEEE80211_HTCAP_MAXRXAMPDU_32K 2
#define IEEE80211_HTCAP_MAXRXAMPDU_64K 3
+
+/* XXX: These should really have the unit at the end, like IEEE80211_HTCAP_MPDUDENSITY_2
+ should be renamed to IEEE80211_HTCAP_MPDUDENSITY_2US */
#define IEEE80211_HTCAP_MPDUDENSITY 0x1c /* min MPDU start spacing */
#define IEEE80211_HTCAP_MPDUDENSITY_S 2
#define IEEE80211_HTCAP_MPDUDENSITY_NA 0 /* no time restriction */
Index: sys/net80211/ieee80211.c
===================================================================
--- sys/net80211/ieee80211.c
+++ sys/net80211/ieee80211.c
@@ -120,6 +120,7 @@
/* NB: OFDM rates are handled specially based on mode */
static const struct ieee80211_rateset ieee80211_rateset_11g =
{ 12, { B(2), B(4), B(11), B(22), 12, 18, 24, 36, 48, 72, 96, 108 } };
+ /* { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } }; */
#undef B
static int set_vht_extchan(struct ieee80211_channel *c);
@@ -206,6 +207,7 @@
if (IEEE80211_IS_CHAN_VHTG(c))
setbit(ic->ic_modecaps, IEEE80211_MODE_VHT_2GHZ);
}
+
/* initialize candidate channels to all available */
memcpy(ic->ic_chan_active, ic->ic_chan_avail,
sizeof(ic->ic_chan_avail));
@@ -1238,7 +1240,7 @@
if (*nchans >= maxchans)
return (ENOBUFS);
-#if 0
+#if 1
printf("%s: %d: ieee=%d, freq=%d, flags=0x%08x\n",
__func__,
*nchans,
@@ -1272,7 +1274,7 @@
if (*nchans >= maxchans)
return (ENOBUFS);
-#if 0
+#if 1
printf("%s: %d: flags=0x%08x\n",
__func__,
*nchans,
@@ -1630,6 +1632,14 @@
getflags_2ghz(bands, flags, ht40);
KASSERT(flags[0] != 0, ("%s: no correct mode provided\n", __func__));
+#if 1
+ for(int i = 0; flags[i] != 0; i++)
+ printf("%s: flags[%d] = 0x%x\n",
+ __func__,
+ i,
+ flags[i]);
+#endif
+
return (add_chanlist(chans, maxchans, nchans, ieee, nieee, flags));
}
Index: sys/net80211/ieee80211_ht.c
===================================================================
--- sys/net80211/ieee80211_ht.c
+++ sys/net80211/ieee80211_ht.c
@@ -258,7 +258,6 @@
void
ieee80211_ht_vattach(struct ieee80211vap *vap)
{
-
/* driver can override defaults */
vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_8K;
vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_NA;
@@ -2706,7 +2705,6 @@
uint8_t *frm;
int tid, ret;
-
IEEE80211_NOTE(tap->txa_ni->ni_vap, IEEE80211_MSG_11N,
tap->txa_ni,
"%s: called",
@@ -2997,8 +2995,14 @@
txparams |= (ic->ic_txstream - 1) << 2; /* num TX streams */
if (ic->ic_htcaps & IEEE80211_HTC_TXUNEQUAL)
txparams |= 0x16; /* TX unequal modulation sup */
- } else
- txparams = 0;
+ } else {
+ /* lrx337 XXX: This was 0, but changed to 1 in order to mimic rt2x00 behavior.
+ Shouldn't this if else block take into consideration other htcaps like
+ IEEE80211_HTC_TXMCS32 for setting txparams = 0x1 and then check if the
+ num streams are equal for TX RX MCS not equal (is it enough to check the
+ num rx / tx streams to conclude that MCS sets are unequal?). */
+ txparams = 0x0;
+ }
frm[12] = txparams;
}
Index: sys/net80211/ieee80211_node.c
===================================================================
--- sys/net80211/ieee80211_node.c
+++ sys/net80211/ieee80211_node.c
@@ -761,6 +761,11 @@
ieee80211_sync_curchan(struct ieee80211com *ic)
{
struct ieee80211_channel *c;
+ printf("%s: curchan freq %d flags 0x%x\nhtadjflags 0x%x\n",
+ __func__,
+ ic->ic_curchan->ic_freq,
+ ic->ic_curchan->ic_flags,
+ gethtadjustflags(ic));
c = ieee80211_ht_adjust_channel(ic, ic->ic_curchan, gethtadjustflags(ic));
c = ieee80211_vht_adjust_channel(ic, c, getvhtadjustflags(ic));
@@ -773,6 +778,8 @@
ic->ic_set_channel(ic);
ieee80211_radiotap_chan_change(ic);
IEEE80211_LOCK(ic);
+ } else {
+ printf("%s: did not change channel\n", __func__);
}
}
Index: sys/net80211/ieee80211_output.c
===================================================================
--- sys/net80211/ieee80211_output.c
+++ sys/net80211/ieee80211_output.c
@@ -2434,6 +2434,12 @@
frm = ieee80211_add_htcap_ch(frm, vap, c);
}
+ /* If we are in STA mode and have HT caps, advertise them. Don't upgrade to an
+ HT channel just yet. */
+ if ((vap->iv_opmode == IEEE80211_M_STA) && (vap->iv_flags_ht & IEEE80211_FHT_HT)) {
+ frm = ieee80211_add_htcap_ch(frm, vap, ic->ic_curchan);
+ }
+
/*
* XXX TODO: need to figure out what/how to update the
* VHT channel.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 20, 4:46 AM (6 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29999253
Default Alt Text
D22840.id72388.diff (19 KB)
Attached To
Mode
D22840: Add HTCAPS for run(4)
Attached
Detach File
Event Timeline
Log In to Comment