1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2/* Copyright(c) 2019-2020 Realtek Corporation 3 */ 4 5#ifndef __RTW89_CAM_H__ 6#define __RTW89_CAM_H__ 7 8#include "core.h" 9 10#define RTW89_SEC_CAM_LEN 20 11 12#define RTW89_BSSID_MATCH_ALL GENMASK(5, 0) 13#define RTW89_BSSID_MATCH_5_BYTES GENMASK(4, 0) 14 15static inline void FWCMD_SET_ADDR_IDX(void *cmd, u32 value) 16{ 17 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(7, 0)); 18} 19 20static inline void FWCMD_SET_ADDR_OFFSET(void *cmd, u32 value) 21{ 22 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(15, 8)); 23} 24 25static inline void FWCMD_SET_ADDR_LEN(void *cmd, u32 value) 26{ 27 le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(23, 16)); 28} 29 30static inline void FWCMD_SET_ADDR_VALID(void *cmd, u32 value) 31{ 32 le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(0)); 33} 34 35static inline void FWCMD_SET_ADDR_NET_TYPE(void *cmd, u32 value) 36{ 37 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(2, 1)); 38} 39 40static inline void FWCMD_SET_ADDR_BCN_HIT_COND(void *cmd, u32 value) 41{ 42 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(4, 3)); 43} 44 45static inline void FWCMD_SET_ADDR_HIT_RULE(void *cmd, u32 value) 46{ 47 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(6, 5)); 48} 49 50static inline void FWCMD_SET_ADDR_BB_SEL(void *cmd, u32 value) 51{ 52 le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(7)); 53} 54 55static inline void FWCMD_SET_ADDR_ADDR_MASK(void *cmd, u32 value) 56{ 57 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(13, 8)); 58} 59 60static inline void FWCMD_SET_ADDR_MASK_SEL(void *cmd, u32 value) 61{ 62 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(15, 14)); 63} 64 65static inline void FWCMD_SET_ADDR_SMA_HASH(void *cmd, u32 value) 66{ 67 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(23, 16)); 68} 69 70static inline void FWCMD_SET_ADDR_TMA_HASH(void *cmd, u32 value) 71{ 72 le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(31, 24)); 73} 74 75static inline void FWCMD_SET_ADDR_BSSID_CAM_IDX(void *cmd, u32 value) 76{ 77 le32p_replace_bits((__le32 *)(cmd) + 3, value, GENMASK(5, 0)); 78} 79 80static inline void FWCMD_SET_ADDR_SMA0(void *cmd, u32 value) 81{ 82 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(7, 0)); 83} 84 85static inline void FWCMD_SET_ADDR_SMA1(void *cmd, u32 value) 86{ 87 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(15, 8)); 88} 89 90static inline void FWCMD_SET_ADDR_SMA2(void *cmd, u32 value) 91{ 92 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(23, 16)); 93} 94 95static inline void FWCMD_SET_ADDR_SMA3(void *cmd, u32 value) 96{ 97 le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(31, 24)); 98} 99 100static inline void FWCMD_SET_ADDR_SMA4(void *cmd, u32 value) 101{ 102 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(7, 0)); 103} 104 105static inline void FWCMD_SET_ADDR_SMA5(void *cmd, u32 value) 106{ 107 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(15, 8)); 108} 109 110static inline void FWCMD_SET_ADDR_TMA0(void *cmd, u32 value) 111{ 112 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(23, 16)); 113} 114 115static inline void FWCMD_SET_ADDR_TMA1(void *cmd, u32 value) 116{ 117 le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(31, 24)); 118} 119 120static inline void FWCMD_SET_ADDR_TMA2(void *cmd, u32 value) 121{ 122 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(7, 0)); 123} 124 125static inline void FWCMD_SET_ADDR_TMA3(void *cmd, u32 value) 126{ 127 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(15, 8)); 128} 129 130static inline void FWCMD_SET_ADDR_TMA4(void *cmd, u32 value) 131{ 132 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(23, 16)); 133} 134 135static inline void FWCMD_SET_ADDR_TMA5(void *cmd, u32 value) 136{ 137 le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(31, 24)); 138} 139 140static inline void FWCMD_SET_ADDR_MACID(void *cmd, u32 value) 141{ 142 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(7, 0)); 143} 144 145static inline void FWCMD_SET_ADDR_PORT_INT(void *cmd, u32 value) 146{ 147 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(10, 8)); 148} 149 150static inline void FWCMD_SET_ADDR_TSF_SYNC(void *cmd, u32 value) 151{ 152 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(13, 11)); 153} 154 155static inline void FWCMD_SET_ADDR_TF_TRS(void *cmd, u32 value) 156{ 157 le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(14)); 158} 159 160static inline void FWCMD_SET_ADDR_LSIG_TXOP(void *cmd, u32 value) 161{ 162 le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(15)); 163} 164 165static inline void FWCMD_SET_ADDR_TGT_IND(void *cmd, u32 value) 166{ 167 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(26, 24)); 168} 169 170static inline void FWCMD_SET_ADDR_FRM_TGT_IND(void *cmd, u32 value) 171{ 172 le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(29, 27)); 173} 174 175static inline void FWCMD_SET_ADDR_AID12(void *cmd, u32 value) 176{ 177 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 0)); 178} 179 180static inline void FWCMD_SET_ADDR_AID12_0(void *cmd, u32 value) 181{ 182 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(7, 0)); 183} 184 185static inline void FWCMD_SET_ADDR_AID12_1(void *cmd, u32 value) 186{ 187 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 8)); 188} 189 190static inline void FWCMD_SET_ADDR_WOL_PATTERN(void *cmd, u32 value) 191{ 192 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(12)); 193} 194 195static inline void FWCMD_SET_ADDR_WOL_UC(void *cmd, u32 value) 196{ 197 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(13)); 198} 199 200static inline void FWCMD_SET_ADDR_WOL_MAGIC(void *cmd, u32 value) 201{ 202 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(14)); 203} 204 205static inline void FWCMD_SET_ADDR_WAPI(void *cmd, u32 value) 206{ 207 le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(15)); 208} 209 210static inline void FWCMD_SET_ADDR_SEC_ENT_MODE(void *cmd, u32 value) 211{ 212 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(17, 16)); 213} 214 215static inline void FWCMD_SET_ADDR_SEC_ENT0_KEYID(void *cmd, u32 value) 216{ 217 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(19, 18)); 218} 219 220static inline void FWCMD_SET_ADDR_SEC_ENT1_KEYID(void *cmd, u32 value) 221{ 222 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(21, 20)); 223} 224 225static inline void FWCMD_SET_ADDR_SEC_ENT2_KEYID(void *cmd, u32 value) 226{ 227 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(23, 22)); 228} 229 230static inline void FWCMD_SET_ADDR_SEC_ENT3_KEYID(void *cmd, u32 value) 231{ 232 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(25, 24)); 233} 234 235static inline void FWCMD_SET_ADDR_SEC_ENT4_KEYID(void *cmd, u32 value) 236{ 237 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(27, 26)); 238} 239 240static inline void FWCMD_SET_ADDR_SEC_ENT5_KEYID(void *cmd, u32 value) 241{ 242 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(29, 28)); 243} 244 245static inline void FWCMD_SET_ADDR_SEC_ENT6_KEYID(void *cmd, u32 value) 246{ 247 le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(31, 30)); 248} 249 250static inline void FWCMD_SET_ADDR_SEC_ENT_VALID(void *cmd, u32 value) 251{ 252 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(7, 0)); 253} 254 255static inline void FWCMD_SET_ADDR_SEC_ENT0(void *cmd, u32 value) 256{ 257 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(15, 8)); 258} 259 260static inline void FWCMD_SET_ADDR_SEC_ENT1(void *cmd, u32 value) 261{ 262 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(23, 16)); 263} 264 265static inline void FWCMD_SET_ADDR_SEC_ENT2(void *cmd, u32 value) 266{ 267 le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(31, 24)); 268} 269 270static inline void FWCMD_SET_ADDR_SEC_ENT3(void *cmd, u32 value) 271{ 272 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(7, 0)); 273} 274 275static inline void FWCMD_SET_ADDR_SEC_ENT4(void *cmd, u32 value) 276{ 277 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(15, 8)); 278} 279 280static inline void FWCMD_SET_ADDR_SEC_ENT5(void *cmd, u32 value) 281{ 282 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(23, 16)); 283} 284 285static inline void FWCMD_SET_ADDR_SEC_ENT6(void *cmd, u32 value) 286{ 287 le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(31, 24)); 288} 289 290static inline void FWCMD_SET_ADDR_BSSID_IDX(void *cmd, u32 value) 291{ 292 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(7, 0)); 293} 294 295static inline void FWCMD_SET_ADDR_BSSID_OFFSET(void *cmd, u32 value) 296{ 297 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(15, 8)); 298} 299 300static inline void FWCMD_SET_ADDR_BSSID_LEN(void *cmd, u32 value) 301{ 302 le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(23, 16)); 303} 304 305static inline void FWCMD_SET_ADDR_BSSID_VALID(void *cmd, u32 value) 306{ 307 le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(0)); 308} 309 310static inline void FWCMD_SET_ADDR_BSSID_BB_SEL(void *cmd, u32 value) 311{ 312 le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(1)); 313} 314 315static inline void FWCMD_SET_ADDR_BSSID_MASK(void *cmd, u32 value) 316{ 317 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(7, 2)); 318} 319 320static inline void FWCMD_SET_ADDR_BSSID_BSS_COLOR(void *cmd, u32 value) 321{ 322 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(13, 8)); 323} 324 325static inline void FWCMD_SET_ADDR_BSSID_BSSID0(void *cmd, u32 value) 326{ 327 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(23, 16)); 328} 329 330static inline void FWCMD_SET_ADDR_BSSID_BSSID1(void *cmd, u32 value) 331{ 332 le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(31, 24)); 333} 334 335static inline void FWCMD_SET_ADDR_BSSID_BSSID2(void *cmd, u32 value) 336{ 337 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(7, 0)); 338} 339 340static inline void FWCMD_SET_ADDR_BSSID_BSSID3(void *cmd, u32 value) 341{ 342 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(15, 8)); 343} 344 345static inline void FWCMD_SET_ADDR_BSSID_BSSID4(void *cmd, u32 value) 346{ 347 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(23, 16)); 348} 349 350static inline void FWCMD_SET_ADDR_BSSID_BSSID5(void *cmd, u32 value) 351{ 352 le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(31, 24)); 353} 354 355int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *vif); 356void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *vif); 357int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev, 358 struct rtw89_addr_cam_entry *addr_cam, 359 const struct rtw89_bssid_cam_entry *bssid_cam); 360void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev, 361 struct rtw89_addr_cam_entry *addr_cam); 362int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, 363 struct rtw89_vif *rtwvif, 364 struct rtw89_bssid_cam_entry *bssid_cam, 365 const u8 *bssid); 366void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev, 367 struct rtw89_bssid_cam_entry *bssid_cam); 368void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev, 369 struct rtw89_vif *vif, 370 struct rtw89_sta *rtwsta, 371 const u8 *scan_mac_addr, u8 *cmd); 372void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev, 373 struct rtw89_vif *rtwvif, 374 struct rtw89_sta *rtwsta, 375 u8 *cmd); 376int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev, 377 struct rtw89_vif *rtwvif, 378 struct rtw89_sta *rtwsta, u8 *cmd); 379int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev, 380 struct ieee80211_vif *vif, 381 struct ieee80211_sta *sta, 382 struct ieee80211_key_conf *key); 383int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev, 384 struct ieee80211_vif *vif, 385 struct ieee80211_sta *sta, 386 struct ieee80211_key_conf *key, 387 bool inform_fw); 388void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, 389 struct rtw89_vif *rtwvif); 390void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev); 391#endif 392