Message ID | 20200326020408.25218-1-yhchuang@realtek.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 2542469d1258b2b2f2849ce1f4df88e86a761f7c |
Delegated to: | Kalle Valo |
Headers | show |
Series | rtw88: fix non-increase management packet sequence number | expand |
On Wed, Mar 25, 2020 at 7:04 PM <yhchuang@realtek.com> wrote: > In previous setting, management packets' sequence numbers will > not increase and always stay at 0. Add hw sequence number support > for mgmt packets. I see that you're differentiating frames by mgmt/null-func/data in your own TX handler, but shouldn't you be basing your sequence number decisions based on IEEE80211_TX_CTL_ASSIGN_SEQ and IEEE80211_TX_CTL_FIRST_FRAGMENT? Anyway, this patch seems to work as expected: Reviewed-by: Brian Norris <briannorris@chromium.org> Tested-by: Brian Norris <briannorris@chromium.org>
<yhchuang@realtek.com> wrote: > From: Tzu-En Huang <tehuang@realtek.com> > > In previous setting, management packets' sequence numbers will > not increase and always stay at 0. Add hw sequence number support > for mgmt packets. > The table below shows different sequence number setting in the > tx descriptor. > > seq num ctrl | EN_HWSEQ | DISQSELSEL | HW_SSN_SEL > ------------------------------------------------------ > sw ctrl | 0 | N/A | N/A > hw ctrl per MACID | 1 | 0 | N/A > hw ctrl per HWREG | 1 | 1 |HWREG(0/1/2/3) > > Signed-off-by: Tzu-En Huang <tehuang@realtek.com> > Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com> > Reviewed-by: Brian Norris <briannorris@chromium.org> > Tested-by: Brian Norris <briannorris@chromium.org> Patch applied to wireless-drivers-next.git, thanks. 2542469d1258 rtw88: fix non-increase management packet sequence number
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index 279410a87141..138851a10051 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -562,6 +562,9 @@ struct rtw_tx_pkt_info { bool short_gi; bool report; bool rts; + bool dis_qselseq; + bool en_hwseq; + u8 hw_ssn_sel; }; struct rtw_rx_pkt_stat { diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c index b31eb4d9664b..60989987f67b 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.c +++ b/drivers/net/wireless/realtek/rtw88/tx.c @@ -58,6 +58,9 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); + SET_TX_DESC_DISQSELSEQ(txdesc, pkt_info->dis_qselseq); + SET_TX_DESC_EN_HWSEQ(txdesc, pkt_info->en_hwseq); + SET_TX_DESC_HW_SSN_SEL(txdesc, pkt_info->hw_ssn_sel); } EXPORT_SYMBOL(rtw_tx_fill_tx_desc); @@ -227,6 +230,9 @@ static void rtw_tx_mgmt_pkt_info_update(struct rtw_dev *rtwdev, pkt_info->use_rate = true; pkt_info->rate_id = 6; pkt_info->dis_rate_fallback = true; + pkt_info->dis_qselseq = true; + pkt_info->en_hwseq = true; + pkt_info->hw_ssn_sel = 0; } static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev, diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h index e488a2643eb3..b973de0f4dc0 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.h +++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -53,6 +53,12 @@ le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(19)) #define SET_TX_DESC_SW_DEFINE(tx_desc, value) \ le32p_replace_bits((__le32 *)(txdesc) + 0x06, value, GENMASK(11, 0)) +#define SET_TX_DESC_DISQSELSEQ(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, BIT(31)) +#define SET_TX_DESC_EN_HWSEQ(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x08, value, BIT(15)) +#define SET_TX_DESC_HW_SSN_SEL(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, GENMASK(7, 6)) enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0,