]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: extend join_info H2C command for MLO fields
authorPo-Hao Huang <phhuang@realtek.com>
Mon, 28 Apr 2025 11:24:52 +0000 (19:24 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 5 May 2025 01:47:39 +0000 (09:47 +0800)
The join_info H2C command is used to indicate a station is connected and
tell FW to create/maintain an instance for it. Extend to fill MLO fields.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250428112456.13165-7-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h

index 6a398355d2e48ab231eec1e77cafb5691b531681..4a6455555daed45abee385654efbfd66eff75f72 100644 (file)
@@ -4007,8 +4007,9 @@ out:
 int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
                           struct rtw89_sta_link *rtwsta_link, bool dis_conn)
 {
-       struct sk_buff *skb;
        u8 mac_id = rtwsta_link ? rtwsta_link->mac_id : rtwvif_link->mac_id;
+       struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link);
+       bool is_mld = ieee80211_vif_is_mld(vif);
        u8 self_role = rtwvif_link->self_role;
        enum rtw89_fw_sta_type sta_type;
        u8 net_type = rtwvif_link->net_type;
@@ -4016,6 +4017,8 @@ int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwv
        struct rtw89_h2c_join *h2c;
        u32 len = sizeof(*h2c);
        bool format_v1 = false;
+       struct sk_buff *skb;
+       u8 main_mac_id;
        int ret;
 
        if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) {
@@ -4058,7 +4061,26 @@ int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwv
 
        sta_type = rtw89_fw_get_sta_type(rtwdev, rtwvif_link, rtwsta_link);
 
-       h2c_v1->w1 = le32_encode_bits(sta_type, RTW89_H2C_JOININFO_W1_STA_TYPE);
+       if (rtwsta_link)
+               main_mac_id = rtw89_sta_get_main_macid(rtwsta_link->rtwsta);
+       else
+               main_mac_id = rtw89_vif_get_main_macid(rtwvif_link->rtwvif);
+
+       h2c_v1->w1 = le32_encode_bits(sta_type, RTW89_H2C_JOININFO_W1_STA_TYPE) |
+                    le32_encode_bits(is_mld, RTW89_H2C_JOININFO_W1_IS_MLD) |
+                    le32_encode_bits(main_mac_id, RTW89_H2C_JOININFO_W1_MAIN_MACID) |
+                    le32_encode_bits(RTW89_H2C_JOININFO_MLO_MODE_MLSR,
+                                     RTW89_H2C_JOININFO_W1_MLO_MODE) |
+                    le32_encode_bits(0, RTW89_H2C_JOININFO_W1_EMLSR_CAB) |
+                    le32_encode_bits(0, RTW89_H2C_JOININFO_W1_NSTR_EN) |
+                    le32_encode_bits(0, RTW89_H2C_JOININFO_W1_INIT_PWR_STATE) |
+                    le32_encode_bits(IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_256US,
+                                     RTW89_H2C_JOININFO_W1_EMLSR_PADDING) |
+                    le32_encode_bits(IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_256US,
+                                     RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY) |
+                    le32_encode_bits(0, RTW89_H2C_JOININFO_W2_MACID_EXT) |
+                    le32_encode_bits(0, RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT);
+
        h2c_v1->w2 = 0;
 
 done:
index dd085a46b9e37c6e9c397f915fd8c1c4eb580801..c7337bf46686fbb544b053f4491d056090ad7226 100644 (file)
@@ -1636,6 +1636,8 @@ struct rtw89_h2c_join_v1 {
 #define RTW89_H2C_JOININFO_W1_IS_MLD BIT(3)
 #define RTW89_H2C_JOININFO_W1_MAIN_MACID GENMASK(11, 4)
 #define RTW89_H2C_JOININFO_W1_MLO_MODE BIT(12)
+#define RTW89_H2C_JOININFO_MLO_MODE_MLMR 0
+#define RTW89_H2C_JOININFO_MLO_MODE_MLSR 1
 #define RTW89_H2C_JOININFO_W1_EMLSR_CAB BIT(13)
 #define RTW89_H2C_JOININFO_W1_NSTR_EN BIT(14)
 #define RTW89_H2C_JOININFO_W1_INIT_PWR_STATE BIT(15)