1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /* Copyright(c) 2019-2020 Realtek Corporation
5 #ifndef __RTW89_CAM_H__
6 #define __RTW89_CAM_H__
10 #define RTW89_SEC_CAM_LEN 20
12 static inline void FWCMD_SET_ADDR_IDX(void *cmd, u32 value)
14 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(7, 0));
17 static inline void FWCMD_SET_ADDR_OFFSET(void *cmd, u32 value)
19 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(15, 8));
22 static inline void FWCMD_SET_ADDR_LEN(void *cmd, u32 value)
24 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(23, 16));
27 static inline void FWCMD_SET_ADDR_VALID(void *cmd, u32 value)
29 le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(0));
32 static inline void FWCMD_SET_ADDR_NET_TYPE(void *cmd, u32 value)
34 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(2, 1));
37 static inline void FWCMD_SET_ADDR_BCN_HIT_COND(void *cmd, u32 value)
39 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(4, 3));
42 static inline void FWCMD_SET_ADDR_HIT_RULE(void *cmd, u32 value)
44 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(6, 5));
47 static inline void FWCMD_SET_ADDR_BB_SEL(void *cmd, u32 value)
49 le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(7));
52 static inline void FWCMD_SET_ADDR_ADDR_MASK(void *cmd, u32 value)
54 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(13, 8));
57 static inline void FWCMD_SET_ADDR_MASK_SEL(void *cmd, u32 value)
59 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(15, 14));
62 static inline void FWCMD_SET_ADDR_SMA_HASH(void *cmd, u32 value)
64 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(23, 16));
67 static inline void FWCMD_SET_ADDR_TMA_HASH(void *cmd, u32 value)
69 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(31, 24));
72 static inline void FWCMD_SET_ADDR_BSSID_CAM_IDX(void *cmd, u32 value)
74 le32p_replace_bits((__le32 *)(cmd) + 3, value, GENMASK(5, 0));
77 static inline void FWCMD_SET_ADDR_SMA0(void *cmd, u32 value)
79 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(7, 0));
82 static inline void FWCMD_SET_ADDR_SMA1(void *cmd, u32 value)
84 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(15, 8));
87 static inline void FWCMD_SET_ADDR_SMA2(void *cmd, u32 value)
89 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(23, 16));
92 static inline void FWCMD_SET_ADDR_SMA3(void *cmd, u32 value)
94 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(31, 24));
97 static inline void FWCMD_SET_ADDR_SMA4(void *cmd, u32 value)
99 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(7, 0));
102 static inline void FWCMD_SET_ADDR_SMA5(void *cmd, u32 value)
104 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(15, 8));
107 static inline void FWCMD_SET_ADDR_TMA0(void *cmd, u32 value)
109 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(23, 16));
112 static inline void FWCMD_SET_ADDR_TMA1(void *cmd, u32 value)
114 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(31, 24));
117 static inline void FWCMD_SET_ADDR_TMA2(void *cmd, u32 value)
119 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(7, 0));
122 static inline void FWCMD_SET_ADDR_TMA3(void *cmd, u32 value)
124 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(15, 8));
127 static inline void FWCMD_SET_ADDR_TMA4(void *cmd, u32 value)
129 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(23, 16));
132 static inline void FWCMD_SET_ADDR_TMA5(void *cmd, u32 value)
134 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(31, 24));
137 static inline void FWCMD_SET_ADDR_MACID(void *cmd, u32 value)
139 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(7, 0));
142 static inline void FWCMD_SET_ADDR_PORT_INT(void *cmd, u32 value)
144 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(10, 8));
147 static inline void FWCMD_SET_ADDR_TSF_SYNC(void *cmd, u32 value)
149 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(13, 11));
152 static inline void FWCMD_SET_ADDR_TF_TRS(void *cmd, u32 value)
154 le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(14));
157 static inline void FWCMD_SET_ADDR_LSIG_TXOP(void *cmd, u32 value)
159 le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(15));
162 static inline void FWCMD_SET_ADDR_TGT_IND(void *cmd, u32 value)
164 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(26, 24));
167 static inline void FWCMD_SET_ADDR_FRM_TGT_IND(void *cmd, u32 value)
169 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(29, 27));
172 static inline void FWCMD_SET_ADDR_AID12(void *cmd, u32 value)
174 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 0));
177 static inline void FWCMD_SET_ADDR_AID12_0(void *cmd, u32 value)
179 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(7, 0));
182 static inline void FWCMD_SET_ADDR_AID12_1(void *cmd, u32 value)
184 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 8));
187 static inline void FWCMD_SET_ADDR_WOL_PATTERN(void *cmd, u32 value)
189 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(12));
192 static inline void FWCMD_SET_ADDR_WOL_UC(void *cmd, u32 value)
194 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(13));
197 static inline void FWCMD_SET_ADDR_WOL_MAGIC(void *cmd, u32 value)
199 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(14));
202 static inline void FWCMD_SET_ADDR_WAPI(void *cmd, u32 value)
204 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(15));
207 static inline void FWCMD_SET_ADDR_SEC_ENT_MODE(void *cmd, u32 value)
209 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(17, 16));
212 static inline void FWCMD_SET_ADDR_SEC_ENT0_KEYID(void *cmd, u32 value)
214 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(19, 18));
217 static inline void FWCMD_SET_ADDR_SEC_ENT1_KEYID(void *cmd, u32 value)
219 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(21, 20));
222 static inline void FWCMD_SET_ADDR_SEC_ENT2_KEYID(void *cmd, u32 value)
224 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(23, 22));
227 static inline void FWCMD_SET_ADDR_SEC_ENT3_KEYID(void *cmd, u32 value)
229 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(25, 24));
232 static inline void FWCMD_SET_ADDR_SEC_ENT4_KEYID(void *cmd, u32 value)
234 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(27, 26));
237 static inline void FWCMD_SET_ADDR_SEC_ENT5_KEYID(void *cmd, u32 value)
239 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(29, 28));
242 static inline void FWCMD_SET_ADDR_SEC_ENT6_KEYID(void *cmd, u32 value)
244 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(31, 30));
247 static inline void FWCMD_SET_ADDR_SEC_ENT_VALID(void *cmd, u32 value)
249 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(7, 0));
252 static inline void FWCMD_SET_ADDR_SEC_ENT0(void *cmd, u32 value)
254 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(15, 8));
257 static inline void FWCMD_SET_ADDR_SEC_ENT1(void *cmd, u32 value)
259 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(23, 16));
262 static inline void FWCMD_SET_ADDR_SEC_ENT2(void *cmd, u32 value)
264 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(31, 24));
267 static inline void FWCMD_SET_ADDR_SEC_ENT3(void *cmd, u32 value)
269 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(7, 0));
272 static inline void FWCMD_SET_ADDR_SEC_ENT4(void *cmd, u32 value)
274 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(15, 8));
277 static inline void FWCMD_SET_ADDR_SEC_ENT5(void *cmd, u32 value)
279 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(23, 16));
282 static inline void FWCMD_SET_ADDR_SEC_ENT6(void *cmd, u32 value)
284 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(31, 24));
287 static inline void FWCMD_SET_ADDR_BSSID_IDX(void *cmd, u32 value)
289 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(7, 0));
292 static inline void FWCMD_SET_ADDR_BSSID_OFFSET(void *cmd, u32 value)
294 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(15, 8));
297 static inline void FWCMD_SET_ADDR_BSSID_LEN(void *cmd, u32 value)
299 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(23, 16));
302 static inline void FWCMD_SET_ADDR_BSSID_VALID(void *cmd, u32 value)
304 le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(0));
307 static inline void FWCMD_SET_ADDR_BSSID_BB_SEL(void *cmd, u32 value)
309 le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(1));
312 static inline void FWCMD_SET_ADDR_BSSID_BSS_COLOR(void *cmd, u32 value)
314 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(13, 8));
317 static inline void FWCMD_SET_ADDR_BSSID_BSSID0(void *cmd, u32 value)
319 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(23, 16));
322 static inline void FWCMD_SET_ADDR_BSSID_BSSID1(void *cmd, u32 value)
324 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(31, 24));
327 static inline void FWCMD_SET_ADDR_BSSID_BSSID2(void *cmd, u32 value)
329 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(7, 0));
332 static inline void FWCMD_SET_ADDR_BSSID_BSSID3(void *cmd, u32 value)
334 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(15, 8));
337 static inline void FWCMD_SET_ADDR_BSSID_BSSID4(void *cmd, u32 value)
339 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(23, 16));
342 static inline void FWCMD_SET_ADDR_BSSID_BSSID5(void *cmd, u32 value)
344 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(31, 24));
347 int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
348 void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
349 int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev,
350 struct rtw89_addr_cam_entry *addr_cam,
351 const struct rtw89_bssid_cam_entry *bssid_cam);
352 void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev,
353 struct rtw89_addr_cam_entry *addr_cam);
354 void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
355 struct rtw89_vif *vif,
356 struct rtw89_sta *rtwsta,
357 const u8 *scan_mac_addr, u8 *cmd);
358 void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
359 struct rtw89_vif *rtwvif,
360 struct rtw89_sta *rtwsta,
362 int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
363 struct rtw89_vif *vif, u8 *cmd);
364 int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
365 struct ieee80211_vif *vif,
366 struct ieee80211_sta *sta,
367 struct ieee80211_key_conf *key);
368 int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,
369 struct ieee80211_vif *vif,
370 struct ieee80211_sta *sta,
371 struct ieee80211_key_conf *key,
373 void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev,
374 struct rtw89_vif *rtwvif);
375 void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev);