0001
0002
0003
0004
0005 #ifndef __RTW89_CAM_H__
0006 #define __RTW89_CAM_H__
0007
0008 #include "core.h"
0009
0010 #define RTW89_SEC_CAM_LEN 20
0011
0012 #define RTW89_BSSID_MATCH_ALL GENMASK(5, 0)
0013 #define RTW89_BSSID_MATCH_5_BYTES GENMASK(4, 0)
0014
0015 static inline void FWCMD_SET_ADDR_IDX(void *cmd, u32 value)
0016 {
0017 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(7, 0));
0018 }
0019
0020 static inline void FWCMD_SET_ADDR_OFFSET(void *cmd, u32 value)
0021 {
0022 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(15, 8));
0023 }
0024
0025 static inline void FWCMD_SET_ADDR_LEN(void *cmd, u32 value)
0026 {
0027 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(23, 16));
0028 }
0029
0030 static inline void FWCMD_SET_ADDR_VALID(void *cmd, u32 value)
0031 {
0032 le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(0));
0033 }
0034
0035 static inline void FWCMD_SET_ADDR_NET_TYPE(void *cmd, u32 value)
0036 {
0037 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(2, 1));
0038 }
0039
0040 static inline void FWCMD_SET_ADDR_BCN_HIT_COND(void *cmd, u32 value)
0041 {
0042 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(4, 3));
0043 }
0044
0045 static inline void FWCMD_SET_ADDR_HIT_RULE(void *cmd, u32 value)
0046 {
0047 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(6, 5));
0048 }
0049
0050 static inline void FWCMD_SET_ADDR_BB_SEL(void *cmd, u32 value)
0051 {
0052 le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(7));
0053 }
0054
0055 static inline void FWCMD_SET_ADDR_ADDR_MASK(void *cmd, u32 value)
0056 {
0057 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(13, 8));
0058 }
0059
0060 static inline void FWCMD_SET_ADDR_MASK_SEL(void *cmd, u32 value)
0061 {
0062 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(15, 14));
0063 }
0064
0065 static inline void FWCMD_SET_ADDR_SMA_HASH(void *cmd, u32 value)
0066 {
0067 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(23, 16));
0068 }
0069
0070 static inline void FWCMD_SET_ADDR_TMA_HASH(void *cmd, u32 value)
0071 {
0072 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(31, 24));
0073 }
0074
0075 static inline void FWCMD_SET_ADDR_BSSID_CAM_IDX(void *cmd, u32 value)
0076 {
0077 le32p_replace_bits((__le32 *)(cmd) + 3, value, GENMASK(5, 0));
0078 }
0079
0080 static inline void FWCMD_SET_ADDR_SMA0(void *cmd, u32 value)
0081 {
0082 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(7, 0));
0083 }
0084
0085 static inline void FWCMD_SET_ADDR_SMA1(void *cmd, u32 value)
0086 {
0087 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(15, 8));
0088 }
0089
0090 static inline void FWCMD_SET_ADDR_SMA2(void *cmd, u32 value)
0091 {
0092 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(23, 16));
0093 }
0094
0095 static inline void FWCMD_SET_ADDR_SMA3(void *cmd, u32 value)
0096 {
0097 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(31, 24));
0098 }
0099
0100 static inline void FWCMD_SET_ADDR_SMA4(void *cmd, u32 value)
0101 {
0102 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(7, 0));
0103 }
0104
0105 static inline void FWCMD_SET_ADDR_SMA5(void *cmd, u32 value)
0106 {
0107 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(15, 8));
0108 }
0109
0110 static inline void FWCMD_SET_ADDR_TMA0(void *cmd, u32 value)
0111 {
0112 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(23, 16));
0113 }
0114
0115 static inline void FWCMD_SET_ADDR_TMA1(void *cmd, u32 value)
0116 {
0117 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(31, 24));
0118 }
0119
0120 static inline void FWCMD_SET_ADDR_TMA2(void *cmd, u32 value)
0121 {
0122 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(7, 0));
0123 }
0124
0125 static inline void FWCMD_SET_ADDR_TMA3(void *cmd, u32 value)
0126 {
0127 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(15, 8));
0128 }
0129
0130 static inline void FWCMD_SET_ADDR_TMA4(void *cmd, u32 value)
0131 {
0132 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(23, 16));
0133 }
0134
0135 static inline void FWCMD_SET_ADDR_TMA5(void *cmd, u32 value)
0136 {
0137 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(31, 24));
0138 }
0139
0140 static inline void FWCMD_SET_ADDR_MACID(void *cmd, u32 value)
0141 {
0142 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(7, 0));
0143 }
0144
0145 static inline void FWCMD_SET_ADDR_PORT_INT(void *cmd, u32 value)
0146 {
0147 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(10, 8));
0148 }
0149
0150 static inline void FWCMD_SET_ADDR_TSF_SYNC(void *cmd, u32 value)
0151 {
0152 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(13, 11));
0153 }
0154
0155 static inline void FWCMD_SET_ADDR_TF_TRS(void *cmd, u32 value)
0156 {
0157 le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(14));
0158 }
0159
0160 static inline void FWCMD_SET_ADDR_LSIG_TXOP(void *cmd, u32 value)
0161 {
0162 le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(15));
0163 }
0164
0165 static inline void FWCMD_SET_ADDR_TGT_IND(void *cmd, u32 value)
0166 {
0167 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(26, 24));
0168 }
0169
0170 static inline void FWCMD_SET_ADDR_FRM_TGT_IND(void *cmd, u32 value)
0171 {
0172 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(29, 27));
0173 }
0174
0175 static inline void FWCMD_SET_ADDR_AID12(void *cmd, u32 value)
0176 {
0177 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 0));
0178 }
0179
0180 static inline void FWCMD_SET_ADDR_AID12_0(void *cmd, u32 value)
0181 {
0182 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(7, 0));
0183 }
0184
0185 static inline void FWCMD_SET_ADDR_AID12_1(void *cmd, u32 value)
0186 {
0187 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 8));
0188 }
0189
0190 static inline void FWCMD_SET_ADDR_WOL_PATTERN(void *cmd, u32 value)
0191 {
0192 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(12));
0193 }
0194
0195 static inline void FWCMD_SET_ADDR_WOL_UC(void *cmd, u32 value)
0196 {
0197 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(13));
0198 }
0199
0200 static inline void FWCMD_SET_ADDR_WOL_MAGIC(void *cmd, u32 value)
0201 {
0202 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(14));
0203 }
0204
0205 static inline void FWCMD_SET_ADDR_WAPI(void *cmd, u32 value)
0206 {
0207 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(15));
0208 }
0209
0210 static inline void FWCMD_SET_ADDR_SEC_ENT_MODE(void *cmd, u32 value)
0211 {
0212 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(17, 16));
0213 }
0214
0215 static inline void FWCMD_SET_ADDR_SEC_ENT0_KEYID(void *cmd, u32 value)
0216 {
0217 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(19, 18));
0218 }
0219
0220 static inline void FWCMD_SET_ADDR_SEC_ENT1_KEYID(void *cmd, u32 value)
0221 {
0222 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(21, 20));
0223 }
0224
0225 static inline void FWCMD_SET_ADDR_SEC_ENT2_KEYID(void *cmd, u32 value)
0226 {
0227 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(23, 22));
0228 }
0229
0230 static inline void FWCMD_SET_ADDR_SEC_ENT3_KEYID(void *cmd, u32 value)
0231 {
0232 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(25, 24));
0233 }
0234
0235 static inline void FWCMD_SET_ADDR_SEC_ENT4_KEYID(void *cmd, u32 value)
0236 {
0237 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(27, 26));
0238 }
0239
0240 static inline void FWCMD_SET_ADDR_SEC_ENT5_KEYID(void *cmd, u32 value)
0241 {
0242 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(29, 28));
0243 }
0244
0245 static inline void FWCMD_SET_ADDR_SEC_ENT6_KEYID(void *cmd, u32 value)
0246 {
0247 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(31, 30));
0248 }
0249
0250 static inline void FWCMD_SET_ADDR_SEC_ENT_VALID(void *cmd, u32 value)
0251 {
0252 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(7, 0));
0253 }
0254
0255 static inline void FWCMD_SET_ADDR_SEC_ENT0(void *cmd, u32 value)
0256 {
0257 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(15, 8));
0258 }
0259
0260 static inline void FWCMD_SET_ADDR_SEC_ENT1(void *cmd, u32 value)
0261 {
0262 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(23, 16));
0263 }
0264
0265 static inline void FWCMD_SET_ADDR_SEC_ENT2(void *cmd, u32 value)
0266 {
0267 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(31, 24));
0268 }
0269
0270 static inline void FWCMD_SET_ADDR_SEC_ENT3(void *cmd, u32 value)
0271 {
0272 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(7, 0));
0273 }
0274
0275 static inline void FWCMD_SET_ADDR_SEC_ENT4(void *cmd, u32 value)
0276 {
0277 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(15, 8));
0278 }
0279
0280 static inline void FWCMD_SET_ADDR_SEC_ENT5(void *cmd, u32 value)
0281 {
0282 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(23, 16));
0283 }
0284
0285 static inline void FWCMD_SET_ADDR_SEC_ENT6(void *cmd, u32 value)
0286 {
0287 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(31, 24));
0288 }
0289
0290 static inline void FWCMD_SET_ADDR_BSSID_IDX(void *cmd, u32 value)
0291 {
0292 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(7, 0));
0293 }
0294
0295 static inline void FWCMD_SET_ADDR_BSSID_OFFSET(void *cmd, u32 value)
0296 {
0297 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(15, 8));
0298 }
0299
0300 static inline void FWCMD_SET_ADDR_BSSID_LEN(void *cmd, u32 value)
0301 {
0302 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(23, 16));
0303 }
0304
0305 static inline void FWCMD_SET_ADDR_BSSID_VALID(void *cmd, u32 value)
0306 {
0307 le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(0));
0308 }
0309
0310 static inline void FWCMD_SET_ADDR_BSSID_BB_SEL(void *cmd, u32 value)
0311 {
0312 le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(1));
0313 }
0314
0315 static inline void FWCMD_SET_ADDR_BSSID_MASK(void *cmd, u32 value)
0316 {
0317 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(7, 2));
0318 }
0319
0320 static inline void FWCMD_SET_ADDR_BSSID_BSS_COLOR(void *cmd, u32 value)
0321 {
0322 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(13, 8));
0323 }
0324
0325 static inline void FWCMD_SET_ADDR_BSSID_BSSID0(void *cmd, u32 value)
0326 {
0327 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(23, 16));
0328 }
0329
0330 static inline void FWCMD_SET_ADDR_BSSID_BSSID1(void *cmd, u32 value)
0331 {
0332 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(31, 24));
0333 }
0334
0335 static inline void FWCMD_SET_ADDR_BSSID_BSSID2(void *cmd, u32 value)
0336 {
0337 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(7, 0));
0338 }
0339
0340 static inline void FWCMD_SET_ADDR_BSSID_BSSID3(void *cmd, u32 value)
0341 {
0342 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(15, 8));
0343 }
0344
0345 static inline void FWCMD_SET_ADDR_BSSID_BSSID4(void *cmd, u32 value)
0346 {
0347 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(23, 16));
0348 }
0349
0350 static inline void FWCMD_SET_ADDR_BSSID_BSSID5(void *cmd, u32 value)
0351 {
0352 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(31, 24));
0353 }
0354
0355 int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
0356 void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
0357 int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev,
0358 struct rtw89_addr_cam_entry *addr_cam,
0359 const struct rtw89_bssid_cam_entry *bssid_cam);
0360 void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev,
0361 struct rtw89_addr_cam_entry *addr_cam);
0362 int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
0363 struct rtw89_vif *rtwvif,
0364 struct rtw89_bssid_cam_entry *bssid_cam,
0365 const u8 *bssid);
0366 void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev,
0367 struct rtw89_bssid_cam_entry *bssid_cam);
0368 void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
0369 struct rtw89_vif *vif,
0370 struct rtw89_sta *rtwsta,
0371 const u8 *scan_mac_addr, u8 *cmd);
0372 void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
0373 struct rtw89_vif *rtwvif,
0374 struct rtw89_sta *rtwsta,
0375 u8 *cmd);
0376 int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
0377 struct rtw89_vif *rtwvif,
0378 struct rtw89_sta *rtwsta, u8 *cmd);
0379 int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
0380 struct ieee80211_vif *vif,
0381 struct ieee80211_sta *sta,
0382 struct ieee80211_key_conf *key);
0383 int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,
0384 struct ieee80211_vif *vif,
0385 struct ieee80211_sta *sta,
0386 struct ieee80211_key_conf *key,
0387 bool inform_fw);
0388 void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev,
0389 struct rtw89_vif *rtwvif);
0390 void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev);
0391 #endif