Date: Fri, 18 Sep 2015 05:03:02 +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: r287949 - head/sys/dev/usb/wlan Message-ID: <201509180503.t8I532qj039807@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: adrian Date: Fri Sep 18 05:03:01 2015 New Revision: 287949 URL: https://svnweb.freebsd.org/changeset/base/287949 Log: Add a very hacked up station only A-MPDU negotiation path. This is enough to set things up; there are still lots of retransmits seen but it's enough to get things working. Modified: head/sys/dev/usb/wlan/if_rsu.c head/sys/dev/usb/wlan/if_rsureg.h Modified: head/sys/dev/usb/wlan/if_rsu.c ============================================================================== --- head/sys/dev/usb/wlan/if_rsu.c Fri Sep 18 05:01:05 2015 (r287948) +++ head/sys/dev/usb/wlan/if_rsu.c Fri Sep 18 05:03:01 2015 (r287949) @@ -1319,6 +1319,35 @@ rsu_event_join_bss(struct rsu_softc *sc, } static void +rsu_event_addba_req_report(struct rsu_softc *sc, uint8_t *buf, int len) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + struct r92s_add_ba_event *ba = (void *) buf; + struct ieee80211_node *ni; + + if (len < sizeof(*ba)) { + device_printf(sc->sc_dev, "%s: short read (%d)\n", __func__, len); + return; + } + + if (vap == NULL) + return; + + device_printf(sc->sc_dev, "%s: mac=%s, tid=%d, ssn=%d\n", + __func__, + ether_sprintf(ba->mac_addr), + (int) ba->tid, + (int) le16toh(ba->ssn)); + + /* XXX do node lookup; this is STA specific */ + + ni = ieee80211_ref_node(vap->iv_bss); + ieee80211_ampdu_rx_start_ext(ni, ba->tid, le16toh(ba->ssn) >> 4, 32); + ieee80211_free_node(ni); +} + +static void rsu_rx_event(struct rsu_softc *sc, uint8_t code, uint8_t *buf, int len) { struct ieee80211com *ic = &sc->sc_ic; @@ -1370,6 +1399,10 @@ rsu_rx_event(struct rsu_softc *sc, uint8 buf[60] = '\0'; RSU_DPRINTF(sc, RSU_DEBUG_FWDBG, "FWDBG: %s\n", (char *)buf); break; + + case R92S_EVT_ADDBA_REQ_REPORT: + rsu_event_addba_req_report(sc, buf, len); + break; default: RSU_DPRINTF(sc, RSU_DEBUG_ANY, "%s: unhandled code (%d)\n", __func__, code); @@ -1640,6 +1673,8 @@ tr_setup: ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); if (ni != NULL) { + if (ni->ni_flags & IEEE80211_NODE_HT) + m->m_flags |= M_AMPDU; (void)ieee80211_input(ni, m, rssi, 0); ieee80211_free_node(ni); } else Modified: head/sys/dev/usb/wlan/if_rsureg.h ============================================================================== --- head/sys/dev/usb/wlan/if_rsureg.h Fri Sep 18 05:01:05 2015 (r287948) +++ head/sys/dev/usb/wlan/if_rsureg.h Fri Sep 18 05:03:01 2015 (r287949) @@ -593,6 +593,11 @@ struct r92s_tx_desc { uint16_t reserved1; } __packed __aligned(4); +struct r92s_add_ba_event { + uint8_t mac_addr[IEEE80211_ADDR_LEN]; + uint16_t ssn; + uint8_t tid; +}; /* * Driver definitions.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201509180503.t8I532qj039807>