@@ -961,16 +961,24 @@ void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
961
961
struct rtw89_sta_link * rtwsta_link ,
962
962
struct rtw89_h2c_dctlinfo_ud_v2 * h2c )
963
963
{
964
+ struct ieee80211_sta * sta = rtwsta_link_to_sta_safe (rtwsta_link );
965
+ struct ieee80211_vif * vif = rtwvif_to_vif (rtwvif_link -> rtwvif );
966
+ struct rtw89_vif * rtwvif = rtwvif_link -> rtwvif ;
964
967
struct rtw89_addr_cam_entry * addr_cam =
965
968
rtw89_get_addr_cam_of (rtwvif_link , rtwsta_link );
969
+ bool is_mld = sta ? sta -> mlo : ieee80211_vif_is_mld (vif );
966
970
struct rtw89_wow_param * rtw_wow = & rtwdev -> wow ;
967
971
u8 * ptk_tx_iv = rtw_wow -> key_info .ptk_tx_iv ;
972
+ u8 * mld_sma , * mld_tma , * mld_bssid ;
968
973
969
974
h2c -> c0 = le32_encode_bits (rtwsta_link ? rtwsta_link -> mac_id :
970
975
rtwvif_link -> mac_id ,
971
976
DCTLINFO_V2_C0_MACID ) |
972
977
le32_encode_bits (1 , DCTLINFO_V2_C0_OP );
973
978
979
+ h2c -> w2 = le32_encode_bits (is_mld , DCTLINFO_V2_W2_IS_MLD );
980
+ h2c -> m2 = cpu_to_le32 (DCTLINFO_V2_W2_IS_MLD );
981
+
974
982
h2c -> w4 = le32_encode_bits (addr_cam -> sec_ent_keyid [0 ],
975
983
DCTLINFO_V2_W4_SEC_ENT0_KEYID ) |
976
984
le32_encode_bits (addr_cam -> sec_ent_keyid [1 ],
@@ -1036,4 +1044,47 @@ void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
1036
1044
DCTLINFO_V2_W4_SEC_KEY_ID );
1037
1045
h2c -> m4 |= cpu_to_le32 (DCTLINFO_V2_W4_SEC_KEY_ID );
1038
1046
}
1047
+
1048
+ if (!is_mld )
1049
+ return ;
1050
+
1051
+ if (rtwvif_link -> net_type == RTW89_NET_TYPE_INFRA ) {
1052
+ mld_sma = rtwvif -> mac_addr ;
1053
+ mld_tma = vif -> cfg .ap_addr ;
1054
+ mld_bssid = vif -> cfg .ap_addr ;
1055
+ } else if (rtwvif_link -> net_type == RTW89_NET_TYPE_AP_MODE && sta ) {
1056
+ mld_sma = rtwvif -> mac_addr ;
1057
+ mld_tma = sta -> addr ;
1058
+ mld_bssid = rtwvif -> mac_addr ;
1059
+ } else {
1060
+ return ;
1061
+ }
1062
+
1063
+ h2c -> w8 = le32_encode_bits (mld_sma [0 ], DCTLINFO_V2_W8_MLD_SMA_0 ) |
1064
+ le32_encode_bits (mld_sma [1 ], DCTLINFO_V2_W8_MLD_SMA_1 ) |
1065
+ le32_encode_bits (mld_sma [2 ], DCTLINFO_V2_W8_MLD_SMA_2 ) |
1066
+ le32_encode_bits (mld_sma [3 ], DCTLINFO_V2_W8_MLD_SMA_3 );
1067
+ h2c -> m8 = cpu_to_le32 (DCTLINFO_V2_W8_ALL );
1068
+
1069
+ h2c -> w9 = le32_encode_bits (mld_sma [4 ], DCTLINFO_V2_W9_MLD_SMA_4 ) |
1070
+ le32_encode_bits (mld_sma [5 ], DCTLINFO_V2_W9_MLD_SMA_5 ) |
1071
+ le32_encode_bits (mld_tma [0 ], DCTLINFO_V2_W9_MLD_TMA_0 ) |
1072
+ le32_encode_bits (mld_tma [1 ], DCTLINFO_V2_W9_MLD_TMA_1 );
1073
+ h2c -> m9 = cpu_to_le32 (DCTLINFO_V2_W9_ALL );
1074
+
1075
+ h2c -> w10 = le32_encode_bits (mld_tma [2 ], DCTLINFO_V2_W10_MLD_TMA_2 ) |
1076
+ le32_encode_bits (mld_tma [3 ], DCTLINFO_V2_W10_MLD_TMA_3 ) |
1077
+ le32_encode_bits (mld_tma [4 ], DCTLINFO_V2_W10_MLD_TMA_4 ) |
1078
+ le32_encode_bits (mld_tma [5 ], DCTLINFO_V2_W10_MLD_TMA_5 );
1079
+ h2c -> m10 = cpu_to_le32 (DCTLINFO_V2_W10_ALL );
1080
+
1081
+ h2c -> w11 = le32_encode_bits (mld_bssid [0 ], DCTLINFO_V2_W11_MLD_BSSID_0 ) |
1082
+ le32_encode_bits (mld_bssid [1 ], DCTLINFO_V2_W11_MLD_BSSID_1 ) |
1083
+ le32_encode_bits (mld_bssid [2 ], DCTLINFO_V2_W11_MLD_BSSID_2 ) |
1084
+ le32_encode_bits (mld_bssid [3 ], DCTLINFO_V2_W11_MLD_BSSID_3 );
1085
+ h2c -> m11 = cpu_to_le32 (DCTLINFO_V2_W11_ALL );
1086
+
1087
+ h2c -> w12 = le32_encode_bits (mld_bssid [4 ], DCTLINFO_V2_W12_MLD_BSSID_4 ) |
1088
+ le32_encode_bits (mld_bssid [5 ], DCTLINFO_V2_W12_MLD_BSSID_5 );
1089
+ h2c -> m12 = cpu_to_le32 (DCTLINFO_V2_W12_ALL );
1039
1090
}
0 commit comments