This diff enables the short guard interval (SGI) feature of 802.11n.
In theory this should raise the max data rate from 65Mbit/s to 72Mbit/s.
To check if your AP supports SGI, associate to your AP and then run:
tcpdump -n -i iwn0 -s 1500 -y IEEE802_11_RADIO -v type mgt subtype beacon
and look for the SGI@20MHz HT capability: "htcaps=<...,SGI@20MHz,...>"
Performance tests welcome.
Index: if_iwn.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.170
diff -u -p -r1.170 if_iwn.c
--- if_iwn.c 17 Aug 2016 09:43:27 -0000 1.170
+++ if_iwn.c 1 Sep 2016 13:56:20 -0000
@@ -463,15 +463,15 @@ iwn_attach(struct device *parent, struct
ic->ic_txbfcaps = 0;
ic->ic_aselcaps = 0;
ic->ic_ampdu_params = (IEEE80211_AMPDU_PARAM_SS_4 | 0x3 /* 64k */);
-#ifdef notyet
if (sc->sc_flags & IWN_FLAG_HAS_11N) {
/* Set HT capabilities. */
- ic->ic_htcaps =
+ ic->ic_htcaps = IEEE80211_HTCAP_SGI20;
+#ifdef notyet
+ ic->ic_htcaps |=
#if IWN_RBUF_SIZE == 8192
IEEE80211_HTCAP_AMSDU7935 |
#endif
IEEE80211_HTCAP_CBW20_40 |
- IEEE80211_HTCAP_SGI20 |
IEEE80211_HTCAP_SGI40;
if (sc->hw_type != IWN_HW_REV_TYPE_4965)
ic->ic_htcaps |= IEEE80211_HTCAP_GF;
@@ -479,8 +479,8 @@ iwn_attach(struct device *parent, struct
ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYN;
else
ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DIS;
- }
#endif /* notyet */
+ }
/* Set supported legacy rates. */
ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
@@ -3007,8 +3007,11 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
tx->plcp = rinfo->plcp;
if ((ni->ni_flags & IEEE80211_NODE_HT) &&
- tx->id != sc->broadcast_id)
+ tx->id != sc->broadcast_id) {
tx->rflags = rinfo->ht_flags;
+ if (ni->ni_htcaps & IEEE80211_HTCAP_SGI20)
+ tx->rflags |= IWN_RFLAG_SGI;
+ }
else
tx->rflags = rinfo->flags;
if (tx->id == sc->broadcast_id) {
@@ -3416,6 +3419,9 @@ iwn_set_link_quality(struct iwn_softc *s
rinfo = &iwn_rates[iwn_mcs2ridx[txrate]];
linkq.retry[i].plcp = rinfo->ht_plcp;
linkq.retry[i].rflags = rinfo->ht_flags;
+
+ if (ni->ni_htcaps & IEEE80211_HTCAP_SGI20)
+ linkq.retry[i].rflags |= IWN_RFLAG_SGI;
/* XXX set correct ant mask for MIMO rates here */
linkq.retry[i].rflags |= IWN_RFLAG_ANT(txant);