git: d0d291103519 - main - LinuxKPI: 802.11: rework handling of the special IEEE80211_NUM_TIDS queue
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 10 Jun 2022 14:38:09 UTC
The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=d0d2911035192473e8bd3f6b99ed5ca9b1b29e47 commit d0d2911035192473e8bd3f6b99ed5ca9b1b29e47 Author: Bjoern A. Zeeb <bz@FreeBSD.org> AuthorDate: 2022-06-10 14:18:57 +0000 Commit: Bjoern A. Zeeb <bz@FreeBSD.org> CommitDate: 2022-06-10 14:18:57 +0000 LinuxKPI: 802.11: rework handling of the special IEEE80211_NUM_TIDS queue Rework the way we are dealing with the last queue. If the driver opts in to STA_MMPDU_TXQ then preferably send all non-data frames via the last (IEEE80211_NUM_TIDS) queue which otherwise is not used in station mode. If we do not have that queue we do individual tx() calls for non-data frames now. Everything else goes via the selected queue if possible for as long as we have a ni (sta) and otherwise resorts to direct tx. Tested on: Intel AX200 and AX210 Sponsored by: The FreeBSD Foundation MFC after: 3 days --- sys/compat/linuxkpi/common/src/linux_80211.c | 54 ++++++++++++++++++---------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c index fd17aba19d96..a0cb20cf9032 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.c +++ b/sys/compat/linuxkpi/common/src/linux_80211.c @@ -219,27 +219,27 @@ lkpi_lsta_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN], for (tid = 0; tid < nitems(sta->txq); tid++) { struct lkpi_txq *ltxq; - /* - * We are neither limiting ourselves to hw.queues here, - * nor do we check if driver wants IEEE80211_NUM_TIDS queue. - */ - + /* We are not limiting ourselves to hw.queues here. */ ltxq = malloc(sizeof(*ltxq) + hw->txq_data_size, M_LKPI80211, M_NOWAIT | M_ZERO); if (ltxq == NULL) goto cleanup; - ltxq->seen_dequeue = false; - skb_queue_head_init(<xq->skbq); /* iwlwifi//mvm/sta.c::tid_to_mac80211_ac[] */ if (tid == IEEE80211_NUM_TIDS) { - IMPROVE(); + if (!ieee80211_hw_check(hw, STA_MMPDU_TXQ)) { + free(ltxq, M_LKPI80211); + continue; + } + IMPROVE("AP/if we support non-STA here too"); ltxq->txq.ac = IEEE80211_AC_VO; } else { ltxq->txq.ac = tid_to_mac80211_ac[tid & 7]; } + ltxq->seen_dequeue = false; + ltxq->txq.vif = vif; ltxq->txq.tid = tid; ltxq->txq.sta = sta; - ltxq->txq.vif = vif; + skb_queue_head_init(<xq->skbq); sta->txq[tid] = <xq->txq; } @@ -3043,8 +3043,22 @@ lkpi_80211_txq_tx_one(struct lkpi_sta *lsta, struct mbuf *m) if (sta != NULL) { struct lkpi_txq *ltxq; + struct ieee80211_hdr *hdr; + + hdr = (void *)skb->data; + if (lsta->added_to_drv && + !ieee80211_is_data_present(hdr->frame_control)) { + if (sta->txq[IEEE80211_NUM_TIDS] != NULL) + ltxq = TXQ_TO_LTXQ(sta->txq[IEEE80211_NUM_TIDS]); + else + goto ops_tx; + } else if (lsta->added_to_drv) { + ltxq = TXQ_TO_LTXQ(sta->txq[ac]); /* XXX-BZ re-check */ + } else + goto ops_tx; + KASSERT(ltxq != NULL, ("%s: lsta %p sta %p m %p skb %p " + "ltxq %p != NULL\n", __func__, lsta, sta, m, skb, ltxq)); - ltxq = TXQ_TO_LTXQ(sta->txq[ac]); /* XXX-BZ re-check */ /* * We currently do not use queues but do direct TX. * The exception to the rule is initial packets, as we cannot @@ -3053,6 +3067,7 @@ lkpi_80211_txq_tx_one(struct lkpi_sta *lsta, struct mbuf *m) * calls. In the time until then we queue packets and * let the driver deal with them. */ +#if 0 if (!ltxq->seen_dequeue) { /* Prevent an ordering problem, likely other issues. */ @@ -3070,25 +3085,28 @@ lkpi_80211_txq_tx_one(struct lkpi_sta *lsta, struct mbuf *m) } if (0 && ltxq->seen_dequeue && skb_queue_empty(<xq->skbq)) goto ops_tx; +#endif skb_queue_tail(<xq->skbq, skb); #ifdef LINUXKPI_DEBUG_80211 if (linuxkpi_debug_80211 & D80211_TRACE_TX) - printf("%s:%d lsta %p sta %p ni %p %6D skb %p lxtq %p " - "qlen %u WAKE_TX_Q ac %d prio %u qmap %u\n", - __func__, __LINE__, lsta, sta, ni, - ni->ni_macaddr, ":", skb, ltxq, - skb_queue_len(<xq->skbq), ac, - skb->priority, skb->qmap); + printf("%s:%d mo_wake_tx_queue :: %d %u lsta %p sta %p " + "ni %p %6D skb %p lxtq %p { qlen %u, ac %d tid %u } " + "WAKE_TX_Q ac %d prio %u qmap %u\n", + curthread->td_tid, (unsigned int)ticks, + lsta, sta, ni, ni->ni_macaddr, ":", skb, ltxq, + skb_queue_len(<xq->skbq), ltxq->txq.ac, + ltxq->txq.tid, ac, skb->priority, skb->qmap); #endif - lkpi_80211_mo_wake_tx_queue(hw, sta->txq[ac]); /* XXX-BZ */ + lkpi_80211_mo_wake_tx_queue(hw, <xq->txq); return; } ops_tx: #ifdef LINUXKPI_DEBUG_80211 if (linuxkpi_debug_80211 & D80211_TRACE_TX) - printf("%s:%d lsta %p sta %p ni %p %6D skb %p TX ac %d prio %u qmap %u\n", + printf("%s:%d mo_tx :: lsta %p sta %p ni %p %6D skb %p " + "TX ac %d prio %u qmap %u\n", __func__, __LINE__, lsta, sta, ni, ni->ni_macaddr, ":", skb, ac, skb->priority, skb->qmap); #endif