rtw89: set mac_id and port ID to TXWD
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 7 Jan 2022 03:42:31 +0000 (11:42 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 28 Jan 2022 15:56:39 +0000 (17:56 +0200)
One mac_id is corresponding to one connected station, and port ID is a
ID of virtual interfaces. With proper mac_id and port ID, firmware and
hardware can handle a packet with correct context.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220107034239.22002-12-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/txrx.h

index 1b15a3f..e9f1733 100644 (file)
@@ -377,6 +377,8 @@ static void
 rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
                               struct rtw89_core_tx_request *tx_req)
 {
+       struct ieee80211_vif *vif = tx_req->vif;
+       struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
        struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
        u8 qsel, ch_dma;
 
@@ -385,6 +387,7 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
 
        desc_info->qsel = qsel;
        desc_info->ch_dma = ch_dma;
+       desc_info->port = desc_info->hiq ? rtwvif->port : 0;
        desc_info->hw_ssn_sel = RTW89_MGMT_HW_SSN_SEL;
        desc_info->hw_seq_mode = RTW89_MGMT_HW_SEQ_MODE;
 
@@ -522,6 +525,21 @@ desc_bk:
        desc_info->bk = true;
 }
 
+static u8 rtw89_core_tx_get_mac_id(struct rtw89_dev *rtwdev,
+                                  struct rtw89_core_tx_request *tx_req)
+{
+       struct ieee80211_vif *vif = tx_req->vif;
+       struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
+       struct ieee80211_sta *sta = tx_req->sta;
+       struct rtw89_sta *rtwsta;
+
+       if (!sta)
+               return rtwvif->mac_id;
+
+       rtwsta = (struct rtw89_sta *)sta->drv_priv;
+       return rtwsta->mac_id;
+}
+
 static void
 rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
                               struct rtw89_core_tx_request *tx_req)
@@ -543,6 +561,8 @@ rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
        desc_info->ch_dma = ch_dma;
        desc_info->tid_indicate = tid_indicate;
        desc_info->qsel = qsel;
+       desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req);
+       desc_info->port = desc_info->hiq ? rtwvif->port : 0;
 
        /* enable wd_info for AMPDU */
        desc_info->en_wd_info = true;
@@ -725,7 +745,8 @@ static __le32 rtw89_build_txwd_body2(struct rtw89_tx_desc_info *desc_info)
 {
        u32 dword = FIELD_PREP(RTW89_TXWD_BODY2_TID_INDICATE, desc_info->tid_indicate) |
                    FIELD_PREP(RTW89_TXWD_BODY2_QSEL, desc_info->qsel) |
-                   FIELD_PREP(RTW89_TXWD_BODY2_TXPKT_SIZE, desc_info->pkt_size);
+                   FIELD_PREP(RTW89_TXWD_BODY2_TXPKT_SIZE, desc_info->pkt_size) |
+                   FIELD_PREP(RTW89_TXWD_BODY2_MACID, desc_info->mac_id);
 
        return cpu_to_le32(dword);
 }
@@ -743,7 +764,8 @@ static __le32 rtw89_build_txwd_info0(struct rtw89_tx_desc_info *desc_info)
 {
        u32 dword = FIELD_PREP(RTW89_TXWD_INFO0_USE_RATE, desc_info->use_rate) |
                    FIELD_PREP(RTW89_TXWD_INFO0_DATA_RATE, desc_info->data_rate) |
-                   FIELD_PREP(RTW89_TXWD_INFO0_DISDATAFB, desc_info->dis_data_fb);
+                   FIELD_PREP(RTW89_TXWD_INFO0_DISDATAFB, desc_info->dis_data_fb) |
+                   FIELD_PREP(RTW89_TXWD_INFO0_MULTIPORT_ID, desc_info->port);
 
        return cpu_to_le32(dword);
 }
index 179dbee..622f699 100644 (file)
@@ -665,6 +665,7 @@ struct rtw89_rxdesc_long {
 struct rtw89_tx_desc_info {
        u16 pkt_size;
        u8 wp_offset;
+       u8 mac_id;
        u8 qsel;
        u8 ch_dma;
        u8 hdr_llc_len;
@@ -691,6 +692,7 @@ struct rtw89_tx_desc_info {
        u8 hw_seq_mode;
 #define RTW89_MGMT_HW_SEQ_MODE 1
        bool hiq;
+       u8 port;
 };
 
 struct rtw89_core_tx_request {
index fb92973..86e3d8b 100644 (file)
@@ -58,6 +58,7 @@
 #define RTW89_TXWD_INFO0_GI_LTF GENMASK(27, 25)
 #define RTW89_TXWD_INFO0_DATA_RATE GENMASK(24, 16)
 #define RTW89_TXWD_INFO0_DISDATAFB BIT(10)
+#define RTW89_TXWD_INFO0_MULTIPORT_ID GENMASK(6, 4)
 
 /* TX WD INFO DWORD 1 */
 #define RTW89_TXWD_INFO1_DATA_RTY_LOWEST_RATE GENMASK(24, 16)