rtw88: fix non-increase management packet sequence number
authorTzu-En Huang <tehuang@realtek.com>
Thu, 26 Mar 2020 02:04:08 +0000 (10:04 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 26 Mar 2020 19:21:43 +0000 (21:21 +0200)
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>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200326020408.25218-1-yhchuang@realtek.com
drivers/net/wireless/realtek/rtw88/main.h
drivers/net/wireless/realtek/rtw88/tx.c
drivers/net/wireless/realtek/rtw88/tx.h

index bcc07cf9f481aa9d49b8b36392bcdc16165db60c..c6b590fdb573b459d013fb85380ae028fb55ca5e 100644 (file)
@@ -574,6 +574,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 {
index b31eb4d9664b971556957dced64066f364842c4d..60989987f67b02e4f6991ee19e156493bb2425e4 100644 (file)
@@ -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,
index e488a2643eb33178149fea21ea751cd2dc902774..b973de0f4dc04931c74f8a5b1a8a9f59f0c33115 100644 (file)
        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,