1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* Copyright(c) 2019-2020 Realtek Corporation 3 */ 4 5 #include "cam.h" 6 #include "debug.h" 7 #include "fw.h" 8 #include "mac.h" 9 #include "ps.h" 10 11 static struct sk_buff * 12 rtw89_cam_get_sec_key_cmd(struct rtw89_dev *rtwdev, 13 struct rtw89_sec_cam_entry *sec_cam, 14 bool ext_key) 15 { 16 struct sk_buff *skb; 17 u32 cmd_len = H2C_SEC_CAM_LEN; 18 u32 key32[4]; 19 u8 *cmd; 20 int i, j; 21 22 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, cmd_len); 23 if (!skb) 24 return NULL; 25 26 skb_put_zero(skb, cmd_len); 27 28 for (i = 0; i < 4; i++) { 29 j = i * 4; 30 j += ext_key ? 16 : 0; 31 key32[i] = FIELD_PREP(GENMASK(7, 0), sec_cam->key[j + 0]) | 32 FIELD_PREP(GENMASK(15, 8), sec_cam->key[j + 1]) | 33 FIELD_PREP(GENMASK(23, 16), sec_cam->key[j + 2]) | 34 FIELD_PREP(GENMASK(31, 24), sec_cam->key[j + 3]); 35 } 36 37 cmd = skb->data; 38 RTW89_SET_FWCMD_SEC_IDX(cmd, sec_cam->sec_cam_idx + (ext_key ? 1 : 0)); 39 RTW89_SET_FWCMD_SEC_OFFSET(cmd, sec_cam->offset); 40 RTW89_SET_FWCMD_SEC_LEN(cmd, sec_cam->len); 41 RTW89_SET_FWCMD_SEC_TYPE(cmd, sec_cam->type); 42 RTW89_SET_FWCMD_SEC_EXT_KEY(cmd, ext_key); 43 RTW89_SET_FWCMD_SEC_SPP_MODE(cmd, sec_cam->spp_mode); 44 RTW89_SET_FWCMD_SEC_KEY0(cmd, key32[0]); 45 RTW89_SET_FWCMD_SEC_KEY1(cmd, key32[1]); 46 RTW89_SET_FWCMD_SEC_KEY2(cmd, key32[2]); 47 RTW89_SET_FWCMD_SEC_KEY3(cmd, key32[3]); 48 49 return skb; 50 } 51 52 static int rtw89_cam_send_sec_key_cmd(struct rtw89_dev *rtwdev, 53 struct rtw89_sec_cam_entry *sec_cam) 54 { 55 struct sk_buff *skb, *ext_skb; 56 int ret; 57 58 skb = rtw89_cam_get_sec_key_cmd(rtwdev, sec_cam, false); 59 if (!skb) { 60 rtw89_err(rtwdev, "failed to get sec key command\n"); 61 return -ENOMEM; 62 } 63 64 rtw89_h2c_pkt_set_hdr(rtwdev, skb, 65 FWCMD_TYPE_H2C, 66 H2C_CAT_MAC, 67 H2C_CL_MAC_SEC_CAM, 68 H2C_FUNC_MAC_SEC_UPD, 1, 0, 69 H2C_SEC_CAM_LEN); 70 ret = rtw89_h2c_tx(rtwdev, skb, false); 71 if (ret) { 72 rtw89_err(rtwdev, "failed to send sec key h2c: %d\n", ret); 73 dev_kfree_skb(skb); 74 return ret; 75 } 76 77 if (!sec_cam->ext_key) 78 return 0; 79 80 ext_skb = rtw89_cam_get_sec_key_cmd(rtwdev, sec_cam, true); 81 if (!ext_skb) { 82 rtw89_err(rtwdev, "failed to get ext sec key command\n"); 83 return -ENOMEM; 84 } 85 86 rtw89_h2c_pkt_set_hdr(rtwdev, ext_skb, 87 FWCMD_TYPE_H2C, 88 H2C_CAT_MAC, 89 H2C_CL_MAC_SEC_CAM, 90 H2C_FUNC_MAC_SEC_UPD, 91 1, 0, H2C_SEC_CAM_LEN); 92 ret = rtw89_h2c_tx(rtwdev, ext_skb, false); 93 if (ret) { 94 rtw89_err(rtwdev, "failed to send ext sec key h2c: %d\n", ret); 95 dev_kfree_skb(ext_skb); 96 return ret; 97 } 98 99 return 0; 100 } 101 102 static int rtw89_cam_get_avail_sec_cam(struct rtw89_dev *rtwdev, 103 u8 *sec_cam_idx, bool ext_key) 104 { 105 const struct rtw89_chip_info *chip = rtwdev->chip; 106 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 107 u8 sec_cam_num = chip->scam_num; 108 u8 idx = 0; 109 110 if (!ext_key) { 111 idx = find_first_zero_bit(cam_info->sec_cam_map, sec_cam_num); 112 if (idx >= sec_cam_num) 113 return -EBUSY; 114 115 set_bit(idx, cam_info->sec_cam_map); 116 *sec_cam_idx = idx; 117 118 return 0; 119 } 120 121 again: 122 idx = find_next_zero_bit(cam_info->sec_cam_map, sec_cam_num, idx); 123 if (idx >= sec_cam_num - 1) 124 return -EBUSY; 125 /* ext keys need two cam entries for 256-bit key */ 126 if (test_bit(idx + 1, cam_info->sec_cam_map)) { 127 idx++; 128 goto again; 129 } 130 131 set_bit(idx, cam_info->sec_cam_map); 132 set_bit(idx + 1, cam_info->sec_cam_map); 133 *sec_cam_idx = idx; 134 135 return 0; 136 } 137 138 static int rtw89_cam_get_addr_cam_key_idx(struct rtw89_addr_cam_entry *addr_cam, 139 const struct rtw89_sec_cam_entry *sec_cam, 140 const struct ieee80211_key_conf *key, 141 u8 *key_idx) 142 { 143 u8 idx; 144 145 /* RTW89_ADDR_CAM_SEC_NONE : not enabled 146 * RTW89_ADDR_CAM_SEC_ALL_UNI : 0 - 6 unicast 147 * RTW89_ADDR_CAM_SEC_NORMAL : 0 - 1 unicast, 2 - 4 group, 5 - 6 BIP 148 * RTW89_ADDR_CAM_SEC_4GROUP : 0 - 1 unicast, 2 - 5 group, 6 BIP 149 */ 150 switch (addr_cam->sec_ent_mode) { 151 case RTW89_ADDR_CAM_SEC_NONE: 152 return -EINVAL; 153 case RTW89_ADDR_CAM_SEC_ALL_UNI: 154 idx = find_first_zero_bit(addr_cam->sec_cam_map, 155 RTW89_SEC_CAM_IN_ADDR_CAM); 156 if (idx >= RTW89_SEC_CAM_IN_ADDR_CAM) 157 return -EBUSY; 158 *key_idx = idx; 159 break; 160 case RTW89_ADDR_CAM_SEC_NORMAL: 161 if (sec_cam->type == RTW89_SEC_KEY_TYPE_BIP_CCMP128) { 162 idx = find_next_zero_bit(addr_cam->sec_cam_map, 163 RTW89_SEC_CAM_IN_ADDR_CAM, 5); 164 if (idx > 6) 165 return -EBUSY; 166 *key_idx = idx; 167 break; 168 } 169 170 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 171 idx = find_next_zero_bit(addr_cam->sec_cam_map, 172 RTW89_SEC_CAM_IN_ADDR_CAM, 0); 173 if (idx > 1) 174 return -EBUSY; 175 *key_idx = idx; 176 break; 177 } 178 179 /* Group keys */ 180 idx = find_next_zero_bit(addr_cam->sec_cam_map, 181 RTW89_SEC_CAM_IN_ADDR_CAM, 2); 182 if (idx > 4) 183 return -EBUSY; 184 *key_idx = idx; 185 break; 186 case RTW89_ADDR_CAM_SEC_4GROUP: 187 if (sec_cam->type == RTW89_SEC_KEY_TYPE_BIP_CCMP128) { 188 if (test_bit(6, addr_cam->sec_cam_map)) 189 return -EINVAL; 190 *key_idx = 6; 191 break; 192 } 193 194 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 195 idx = find_next_zero_bit(addr_cam->sec_cam_map, 196 RTW89_SEC_CAM_IN_ADDR_CAM, 0); 197 if (idx > 1) 198 return -EBUSY; 199 *key_idx = idx; 200 break; 201 } 202 203 /* Group keys */ 204 idx = find_next_zero_bit(addr_cam->sec_cam_map, 205 RTW89_SEC_CAM_IN_ADDR_CAM, 2); 206 if (idx > 5) 207 return -EBUSY; 208 *key_idx = idx; 209 break; 210 } 211 212 return 0; 213 } 214 215 static int __rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev, 216 struct rtw89_vif_link *rtwvif_link, 217 struct rtw89_sta_link *rtwsta_link, 218 const struct rtw89_sec_cam_entry *sec_cam, 219 bool inform_fw) 220 { 221 struct rtw89_addr_cam_entry *addr_cam; 222 unsigned int i; 223 int ret = 0; 224 225 addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 226 227 for_each_set_bit(i, addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM) { 228 if (addr_cam->sec_ent[i] != sec_cam->sec_cam_idx) 229 continue; 230 231 clear_bit(i, addr_cam->sec_cam_map); 232 } 233 234 if (inform_fw) { 235 ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta_link); 236 if (ret) 237 rtw89_err(rtwdev, 238 "failed to update dctl cam del key: %d\n", ret); 239 ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL); 240 if (ret) 241 rtw89_err(rtwdev, "failed to update cam del key: %d\n", ret); 242 } 243 244 return ret; 245 } 246 247 static int __rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev, 248 struct rtw89_vif_link *rtwvif_link, 249 struct rtw89_sta_link *rtwsta_link, 250 const struct ieee80211_key_conf *key, 251 const struct rtw89_sec_cam_entry *sec_cam) 252 { 253 struct rtw89_addr_cam_entry *addr_cam; 254 u8 key_idx = 0; 255 int ret; 256 257 addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 258 259 if (key->cipher == WLAN_CIPHER_SUITE_WEP40 || 260 key->cipher == WLAN_CIPHER_SUITE_WEP104) 261 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_ALL_UNI; 262 263 ret = rtw89_cam_get_addr_cam_key_idx(addr_cam, sec_cam, key, &key_idx); 264 if (ret) { 265 rtw89_err(rtwdev, "failed to get addr cam key idx %d, %d\n", 266 addr_cam->sec_ent_mode, sec_cam->type); 267 return ret; 268 } 269 270 addr_cam->sec_ent_keyid[key_idx] = key->keyidx; 271 addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx; 272 set_bit(key_idx, addr_cam->sec_cam_map); 273 ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta_link); 274 if (ret) { 275 rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n", 276 ret); 277 return ret; 278 } 279 ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL); 280 if (ret) { 281 rtw89_err(rtwdev, "failed to update addr cam sec entry: %d\n", 282 ret); 283 clear_bit(key_idx, addr_cam->sec_cam_map); 284 return ret; 285 } 286 287 return 0; 288 } 289 290 int rtw89_cam_attach_link_sec_cam(struct rtw89_dev *rtwdev, 291 struct rtw89_vif_link *rtwvif_link, 292 struct rtw89_sta_link *rtwsta_link, 293 u8 sec_cam_idx) 294 { 295 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 296 const struct rtw89_sec_cam_entry *sec_cam; 297 298 sec_cam = cam_info->sec_entries[sec_cam_idx]; 299 if (!sec_cam) 300 return -ENOENT; 301 302 return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, rtwsta_link, 303 sec_cam->key_conf, sec_cam); 304 } 305 306 static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev, 307 struct ieee80211_vif *vif, 308 struct ieee80211_sta *sta, 309 const struct rtw89_sec_cam_entry *sec_cam, 310 bool inform_fw) 311 { 312 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); 313 struct rtw89_sta_link *rtwsta_link; 314 struct rtw89_vif_link *rtwvif_link; 315 struct rtw89_vif *rtwvif; 316 unsigned int link_id; 317 int ret; 318 319 if (!vif) { 320 rtw89_err(rtwdev, "No iface for deleting sec cam\n"); 321 return -EINVAL; 322 } 323 324 rtwvif = vif_to_rtwvif(vif); 325 326 if (rtwsta) 327 clear_bit(sec_cam->sec_cam_idx, rtwsta->pairwise_sec_cam_map); 328 329 rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) { 330 rtwsta_link = rtwsta ? rtwsta->links[link_id] : NULL; 331 if (rtwsta && !rtwsta_link) 332 continue; 333 334 ret = __rtw89_cam_detach_sec_cam(rtwdev, rtwvif_link, rtwsta_link, 335 sec_cam, inform_fw); 336 if (ret) 337 return ret; 338 } 339 340 return 0; 341 } 342 343 static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev, 344 struct ieee80211_vif *vif, 345 struct ieee80211_sta *sta, 346 struct ieee80211_key_conf *key, 347 struct rtw89_sec_cam_entry *sec_cam) 348 { 349 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); 350 struct rtw89_sta_link *rtwsta_link; 351 struct rtw89_vif_link *rtwvif_link; 352 struct rtw89_vif *rtwvif; 353 unsigned int link_id; 354 int key_link_id; 355 int ret; 356 357 if (!vif) { 358 rtw89_err(rtwdev, "No iface for adding sec cam\n"); 359 return -EINVAL; 360 } 361 362 rtwvif = vif_to_rtwvif(vif); 363 364 key_link_id = ieee80211_vif_is_mld(vif) ? key->link_id : 0; 365 if (key_link_id >= 0) { 366 rtwvif_link = rtwvif->links[key_link_id]; 367 rtwsta_link = rtwsta ? rtwsta->links[key_link_id] : NULL; 368 369 if (!rtwvif_link || (rtwsta && !rtwsta_link)) { 370 rtw89_err(rtwdev, "No drv link for adding sec cam\n"); 371 return -ENOLINK; 372 } 373 374 return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, 375 rtwsta_link, key, sec_cam); 376 } 377 378 /* key_link_id < 0: MLD pairwise key */ 379 if (!rtwsta) { 380 rtw89_err(rtwdev, "No sta for adding MLD pairwise sec cam\n"); 381 return -EINVAL; 382 } 383 384 rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) { 385 rtwvif_link = rtwsta_link->rtwvif_link; 386 ret = __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, 387 rtwsta_link, key, sec_cam); 388 if (ret) 389 return ret; 390 } 391 392 set_bit(sec_cam->sec_cam_idx, rtwsta->pairwise_sec_cam_map); 393 394 return 0; 395 } 396 397 static int rtw89_cam_sec_key_install(struct rtw89_dev *rtwdev, 398 struct ieee80211_vif *vif, 399 struct ieee80211_sta *sta, 400 struct ieee80211_key_conf *key, 401 u8 hw_key_type, bool ext_key) 402 { 403 struct rtw89_sec_cam_entry *sec_cam = NULL; 404 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 405 u8 sec_cam_idx; 406 int ret; 407 408 /* maximum key length 256-bit */ 409 if (key->keylen > 32) { 410 rtw89_err(rtwdev, "invalid sec key length %d\n", key->keylen); 411 return -EINVAL; 412 } 413 414 ret = rtw89_cam_get_avail_sec_cam(rtwdev, &sec_cam_idx, ext_key); 415 if (ret) { 416 rtw89_warn(rtwdev, "no available sec cam: %d ext: %d\n", 417 ret, ext_key); 418 return ret; 419 } 420 421 sec_cam = kzalloc(sizeof(*sec_cam), GFP_KERNEL); 422 if (!sec_cam) { 423 ret = -ENOMEM; 424 goto err_release_cam; 425 } 426 427 key->hw_key_idx = sec_cam_idx; 428 cam_info->sec_entries[sec_cam_idx] = sec_cam; 429 430 sec_cam->sec_cam_idx = sec_cam_idx; 431 sec_cam->type = hw_key_type; 432 sec_cam->len = RTW89_SEC_CAM_LEN; 433 sec_cam->ext_key = ext_key; 434 memcpy(sec_cam->key, key->key, key->keylen); 435 436 sec_cam->key_conf = key; 437 438 ret = rtw89_cam_send_sec_key_cmd(rtwdev, sec_cam); 439 if (ret) { 440 rtw89_err(rtwdev, "failed to send sec key cmd: %d\n", ret); 441 goto err_release_cam; 442 } 443 444 /* associate with addr cam */ 445 ret = rtw89_cam_attach_sec_cam(rtwdev, vif, sta, key, sec_cam); 446 if (ret) { 447 rtw89_err(rtwdev, "failed to attach sec cam: %d\n", ret); 448 goto err_release_cam; 449 } 450 451 return 0; 452 453 err_release_cam: 454 cam_info->sec_entries[sec_cam_idx] = NULL; 455 kfree(sec_cam); 456 clear_bit(sec_cam_idx, cam_info->sec_cam_map); 457 if (ext_key) 458 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map); 459 460 return ret; 461 } 462 463 int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev, 464 struct ieee80211_vif *vif, 465 struct ieee80211_sta *sta, 466 struct ieee80211_key_conf *key) 467 { 468 const struct rtw89_chip_info *chip = rtwdev->chip; 469 u8 hw_key_type; 470 bool ext_key = false; 471 int ret; 472 473 if (ieee80211_vif_is_mld(vif) && !chip->hw_mlo_bmc_crypto && 474 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) 475 return -EOPNOTSUPP; 476 477 switch (key->cipher) { 478 case WLAN_CIPHER_SUITE_WEP40: 479 rtw89_leave_ips_by_hwflags(rtwdev); 480 hw_key_type = RTW89_SEC_KEY_TYPE_WEP40; 481 break; 482 case WLAN_CIPHER_SUITE_WEP104: 483 rtw89_leave_ips_by_hwflags(rtwdev); 484 hw_key_type = RTW89_SEC_KEY_TYPE_WEP104; 485 break; 486 case WLAN_CIPHER_SUITE_TKIP: 487 if (!chip->hw_tkip_crypto) 488 return -EOPNOTSUPP; 489 hw_key_type = RTW89_SEC_KEY_TYPE_TKIP; 490 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; 491 break; 492 case WLAN_CIPHER_SUITE_CCMP: 493 hw_key_type = RTW89_SEC_KEY_TYPE_CCMP128; 494 if (!chip->hw_mgmt_tx_encrypt) 495 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 496 break; 497 case WLAN_CIPHER_SUITE_CCMP_256: 498 hw_key_type = RTW89_SEC_KEY_TYPE_CCMP256; 499 if (!chip->hw_mgmt_tx_encrypt) 500 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 501 ext_key = true; 502 break; 503 case WLAN_CIPHER_SUITE_GCMP: 504 hw_key_type = RTW89_SEC_KEY_TYPE_GCMP128; 505 if (!chip->hw_mgmt_tx_encrypt) 506 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 507 break; 508 case WLAN_CIPHER_SUITE_GCMP_256: 509 hw_key_type = RTW89_SEC_KEY_TYPE_GCMP256; 510 if (!chip->hw_mgmt_tx_encrypt) 511 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 512 ext_key = true; 513 break; 514 case WLAN_CIPHER_SUITE_AES_CMAC: 515 hw_key_type = RTW89_SEC_KEY_TYPE_BIP_CCMP128; 516 break; 517 default: 518 return -EOPNOTSUPP; 519 } 520 521 if (!chip->hw_sec_hdr) 522 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 523 524 ret = rtw89_cam_sec_key_install(rtwdev, vif, sta, key, hw_key_type, 525 ext_key); 526 if (ret) { 527 rtw89_err(rtwdev, "failed to install key type %d ext %d: %d\n", 528 hw_key_type, ext_key, ret); 529 return ret; 530 } 531 532 return 0; 533 } 534 535 int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev, 536 struct ieee80211_vif *vif, 537 struct ieee80211_sta *sta, 538 struct ieee80211_key_conf *key, 539 bool inform_fw) 540 { 541 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 542 const struct rtw89_sec_cam_entry *sec_cam; 543 u8 sec_cam_idx; 544 int ret; 545 546 sec_cam_idx = key->hw_key_idx; 547 sec_cam = cam_info->sec_entries[sec_cam_idx]; 548 if (!sec_cam) 549 return -EINVAL; 550 551 ret = rtw89_cam_detach_sec_cam(rtwdev, vif, sta, sec_cam, inform_fw); 552 553 /* clear valid bit in addr cam will disable sec cam, 554 * so we don't need to send H2C command again 555 */ 556 cam_info->sec_entries[sec_cam_idx] = NULL; 557 clear_bit(sec_cam_idx, cam_info->sec_cam_map); 558 if (sec_cam->ext_key) 559 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map); 560 561 kfree(sec_cam); 562 563 return ret; 564 } 565 566 static void rtw89_cam_reset_key_iter(struct ieee80211_hw *hw, 567 struct ieee80211_vif *vif, 568 struct ieee80211_sta *sta, 569 struct ieee80211_key_conf *key, 570 void *data) 571 { 572 struct rtw89_dev *rtwdev = (struct rtw89_dev *)data; 573 574 rtw89_cam_sec_key_del(rtwdev, vif, sta, key, false); 575 } 576 577 void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev, 578 struct rtw89_addr_cam_entry *addr_cam) 579 { 580 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 581 582 addr_cam->valid = false; 583 clear_bit(addr_cam->addr_cam_idx, cam_info->addr_cam_map); 584 } 585 586 void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev, 587 struct rtw89_bssid_cam_entry *bssid_cam) 588 { 589 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 590 591 bssid_cam->valid = false; 592 clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map); 593 } 594 595 void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) 596 { 597 struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam; 598 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam; 599 600 rtw89_cam_deinit_addr_cam(rtwdev, addr_cam); 601 rtw89_cam_deinit_bssid_cam(rtwdev, bssid_cam); 602 } 603 604 void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev) 605 { 606 rcu_read_lock(); 607 ieee80211_iter_keys_rcu(rtwdev->hw, NULL, rtw89_cam_reset_key_iter, rtwdev); 608 rcu_read_unlock(); 609 } 610 611 static int rtw89_cam_get_avail_addr_cam(struct rtw89_dev *rtwdev, 612 u8 *addr_cam_idx) 613 { 614 const struct rtw89_chip_info *chip = rtwdev->chip; 615 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 616 u8 addr_cam_num = chip->acam_num; 617 u8 idx; 618 619 idx = find_first_zero_bit(cam_info->addr_cam_map, addr_cam_num); 620 if (idx >= addr_cam_num) 621 return -EBUSY; 622 623 set_bit(idx, cam_info->addr_cam_map); 624 *addr_cam_idx = idx; 625 626 return 0; 627 } 628 629 static u8 rtw89_get_addr_cam_entry_size(struct rtw89_dev *rtwdev) 630 { 631 const struct rtw89_chip_info *chip = rtwdev->chip; 632 633 switch (chip->chip_id) { 634 case RTL8852A: 635 case RTL8852B: 636 case RTL8851B: 637 case RTL8852BT: 638 return ADDR_CAM_ENT_SIZE; 639 default: 640 return ADDR_CAM_ENT_SHORT_SIZE; 641 } 642 } 643 644 int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev, 645 struct rtw89_addr_cam_entry *addr_cam, 646 const struct rtw89_bssid_cam_entry *bssid_cam) 647 { 648 u8 addr_cam_idx; 649 int i; 650 int ret; 651 652 if (unlikely(addr_cam->valid)) { 653 rtw89_debug(rtwdev, RTW89_DBG_FW, 654 "addr cam is already valid; skip init\n"); 655 return 0; 656 } 657 658 ret = rtw89_cam_get_avail_addr_cam(rtwdev, &addr_cam_idx); 659 if (ret) { 660 rtw89_err(rtwdev, "failed to get available addr cam\n"); 661 return ret; 662 } 663 664 addr_cam->addr_cam_idx = addr_cam_idx; 665 addr_cam->len = rtw89_get_addr_cam_entry_size(rtwdev); 666 addr_cam->offset = 0; 667 addr_cam->valid = true; 668 addr_cam->addr_mask = 0; 669 addr_cam->mask_sel = RTW89_NO_MSK; 670 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL; 671 bitmap_zero(addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM); 672 673 for (i = 0; i < RTW89_SEC_CAM_IN_ADDR_CAM; i++) { 674 addr_cam->sec_ent_keyid[i] = 0; 675 addr_cam->sec_ent[i] = 0; 676 } 677 678 /* associate addr cam with bssid cam */ 679 addr_cam->bssid_cam_idx = bssid_cam->bssid_cam_idx; 680 681 return 0; 682 } 683 684 static int rtw89_cam_get_avail_bssid_cam(struct rtw89_dev *rtwdev, 685 u8 *bssid_cam_idx) 686 { 687 const struct rtw89_chip_info *chip = rtwdev->chip; 688 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 689 u8 bssid_cam_num = chip->bcam_num; 690 u8 idx; 691 692 idx = find_first_zero_bit(cam_info->bssid_cam_map, bssid_cam_num); 693 if (idx >= bssid_cam_num) 694 return -EBUSY; 695 696 set_bit(idx, cam_info->bssid_cam_map); 697 *bssid_cam_idx = idx; 698 699 return 0; 700 } 701 702 int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, 703 struct rtw89_vif_link *rtwvif_link, 704 struct rtw89_bssid_cam_entry *bssid_cam, 705 const u8 *bssid) 706 { 707 u8 bssid_cam_idx; 708 int ret; 709 710 if (unlikely(bssid_cam->valid)) { 711 rtw89_debug(rtwdev, RTW89_DBG_FW, 712 "bssid cam is already valid; skip init\n"); 713 return 0; 714 } 715 716 ret = rtw89_cam_get_avail_bssid_cam(rtwdev, &bssid_cam_idx); 717 if (ret) { 718 rtw89_err(rtwdev, "failed to get available bssid cam\n"); 719 return ret; 720 } 721 722 bssid_cam->bssid_cam_idx = bssid_cam_idx; 723 bssid_cam->phy_idx = rtwvif_link->phy_idx; 724 bssid_cam->len = BSSID_CAM_ENT_SIZE; 725 bssid_cam->offset = 0; 726 bssid_cam->valid = true; 727 ether_addr_copy(bssid_cam->bssid, bssid); 728 729 return 0; 730 } 731 732 void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) 733 { 734 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam; 735 736 ether_addr_copy(bssid_cam->bssid, rtwvif_link->bssid); 737 } 738 739 int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) 740 { 741 struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam; 742 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam; 743 int ret; 744 745 ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif_link, bssid_cam, 746 rtwvif_link->bssid); 747 if (ret) { 748 rtw89_err(rtwdev, "failed to init bssid cam\n"); 749 return ret; 750 } 751 752 ret = rtw89_cam_init_addr_cam(rtwdev, addr_cam, bssid_cam); 753 if (ret) { 754 rtw89_err(rtwdev, "failed to init addr cam\n"); 755 return ret; 756 } 757 758 return 0; 759 } 760 761 int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev, 762 struct rtw89_vif_link *rtwvif_link, 763 struct rtw89_sta_link *rtwsta_link, u8 *cmd) 764 { 765 struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif_link, 766 rtwsta_link); 767 struct ieee80211_bss_conf *bss_conf; 768 u8 bss_color; 769 u8 bss_mask; 770 771 rcu_read_lock(); 772 773 bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, false); 774 bss_color = bss_conf->he_bss_color.color; 775 776 if (bss_conf->nontransmitted) 777 bss_mask = RTW89_BSSID_MATCH_5_BYTES; 778 else 779 bss_mask = RTW89_BSSID_MATCH_ALL; 780 781 rcu_read_unlock(); 782 783 FWCMD_SET_ADDR_BSSID_IDX(cmd, bssid_cam->bssid_cam_idx); 784 FWCMD_SET_ADDR_BSSID_OFFSET(cmd, bssid_cam->offset); 785 FWCMD_SET_ADDR_BSSID_LEN(cmd, bssid_cam->len); 786 FWCMD_SET_ADDR_BSSID_VALID(cmd, bssid_cam->valid); 787 FWCMD_SET_ADDR_BSSID_MASK(cmd, bss_mask); 788 FWCMD_SET_ADDR_BSSID_BB_SEL(cmd, bssid_cam->phy_idx); 789 FWCMD_SET_ADDR_BSSID_BSS_COLOR(cmd, bss_color); 790 791 FWCMD_SET_ADDR_BSSID_BSSID0(cmd, bssid_cam->bssid[0]); 792 FWCMD_SET_ADDR_BSSID_BSSID1(cmd, bssid_cam->bssid[1]); 793 FWCMD_SET_ADDR_BSSID_BSSID2(cmd, bssid_cam->bssid[2]); 794 FWCMD_SET_ADDR_BSSID_BSSID3(cmd, bssid_cam->bssid[3]); 795 FWCMD_SET_ADDR_BSSID_BSSID4(cmd, bssid_cam->bssid[4]); 796 FWCMD_SET_ADDR_BSSID_BSSID5(cmd, bssid_cam->bssid[5]); 797 798 return 0; 799 } 800 801 static u8 rtw89_cam_addr_hash(u8 start, const u8 *addr) 802 { 803 u8 hash = 0; 804 u8 i; 805 806 for (i = start; i < ETH_ALEN; i++) 807 hash ^= addr[i]; 808 809 return hash; 810 } 811 812 void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev, 813 struct rtw89_vif_link *rtwvif_link, 814 struct rtw89_sta_link *rtwsta_link, 815 const u8 *scan_mac_addr, 816 u8 *cmd) 817 { 818 struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link); 819 struct rtw89_addr_cam_entry *addr_cam = 820 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 821 struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link); 822 struct ieee80211_link_sta *link_sta; 823 const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif_link->mac_addr; 824 u8 sma_hash, tma_hash, addr_msk_start; 825 u8 sma_start = 0; 826 u8 tma_start = 0; 827 const u8 *tma; 828 829 rcu_read_lock(); 830 831 if (sta) { 832 link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true); 833 tma = link_sta->addr; 834 } else { 835 tma = rtwvif_link->bssid; 836 } 837 838 if (addr_cam->addr_mask != 0) { 839 addr_msk_start = __ffs(addr_cam->addr_mask); 840 if (addr_cam->mask_sel == RTW89_SMA) 841 sma_start = addr_msk_start; 842 else if (addr_cam->mask_sel == RTW89_TMA) 843 tma_start = addr_msk_start; 844 } 845 sma_hash = rtw89_cam_addr_hash(sma_start, sma); 846 tma_hash = rtw89_cam_addr_hash(tma_start, tma); 847 848 FWCMD_SET_ADDR_IDX(cmd, addr_cam->addr_cam_idx); 849 FWCMD_SET_ADDR_OFFSET(cmd, addr_cam->offset); 850 FWCMD_SET_ADDR_LEN(cmd, addr_cam->len); 851 852 FWCMD_SET_ADDR_VALID(cmd, addr_cam->valid); 853 FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif_link->net_type); 854 FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif_link->bcn_hit_cond); 855 FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif_link->hit_rule); 856 FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif_link->phy_idx); 857 FWCMD_SET_ADDR_ADDR_MASK(cmd, addr_cam->addr_mask); 858 FWCMD_SET_ADDR_MASK_SEL(cmd, addr_cam->mask_sel); 859 FWCMD_SET_ADDR_SMA_HASH(cmd, sma_hash); 860 FWCMD_SET_ADDR_TMA_HASH(cmd, tma_hash); 861 862 FWCMD_SET_ADDR_BSSID_CAM_IDX(cmd, addr_cam->bssid_cam_idx); 863 864 FWCMD_SET_ADDR_SMA0(cmd, sma[0]); 865 FWCMD_SET_ADDR_SMA1(cmd, sma[1]); 866 FWCMD_SET_ADDR_SMA2(cmd, sma[2]); 867 FWCMD_SET_ADDR_SMA3(cmd, sma[3]); 868 FWCMD_SET_ADDR_SMA4(cmd, sma[4]); 869 FWCMD_SET_ADDR_SMA5(cmd, sma[5]); 870 871 FWCMD_SET_ADDR_TMA0(cmd, tma[0]); 872 FWCMD_SET_ADDR_TMA1(cmd, tma[1]); 873 FWCMD_SET_ADDR_TMA2(cmd, tma[2]); 874 FWCMD_SET_ADDR_TMA3(cmd, tma[3]); 875 FWCMD_SET_ADDR_TMA4(cmd, tma[4]); 876 FWCMD_SET_ADDR_TMA5(cmd, tma[5]); 877 878 FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif_link->port); 879 FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif_link->port); 880 FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif_link->trigger); 881 FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif_link->lsig_txop); 882 FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif_link->tgt_ind); 883 FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif_link->frm_tgt_ind); 884 FWCMD_SET_ADDR_MACID(cmd, rtwsta_link ? rtwsta_link->mac_id : 885 rtwvif_link->mac_id); 886 if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) 887 FWCMD_SET_ADDR_AID12(cmd, vif->cfg.aid & 0xfff); 888 else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE) 889 FWCMD_SET_ADDR_AID12(cmd, sta ? sta->aid & 0xfff : 0); 890 FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif_link->wowlan_pattern); 891 FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif_link->wowlan_uc); 892 FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif_link->wowlan_magic); 893 FWCMD_SET_ADDR_WAPI(cmd, addr_cam->wapi); 894 FWCMD_SET_ADDR_SEC_ENT_MODE(cmd, addr_cam->sec_ent_mode); 895 FWCMD_SET_ADDR_SEC_ENT0_KEYID(cmd, addr_cam->sec_ent_keyid[0]); 896 FWCMD_SET_ADDR_SEC_ENT1_KEYID(cmd, addr_cam->sec_ent_keyid[1]); 897 FWCMD_SET_ADDR_SEC_ENT2_KEYID(cmd, addr_cam->sec_ent_keyid[2]); 898 FWCMD_SET_ADDR_SEC_ENT3_KEYID(cmd, addr_cam->sec_ent_keyid[3]); 899 FWCMD_SET_ADDR_SEC_ENT4_KEYID(cmd, addr_cam->sec_ent_keyid[4]); 900 FWCMD_SET_ADDR_SEC_ENT5_KEYID(cmd, addr_cam->sec_ent_keyid[5]); 901 FWCMD_SET_ADDR_SEC_ENT6_KEYID(cmd, addr_cam->sec_ent_keyid[6]); 902 903 FWCMD_SET_ADDR_SEC_ENT_VALID(cmd, addr_cam->sec_cam_map[0] & 0xff); 904 FWCMD_SET_ADDR_SEC_ENT0(cmd, addr_cam->sec_ent[0]); 905 FWCMD_SET_ADDR_SEC_ENT1(cmd, addr_cam->sec_ent[1]); 906 FWCMD_SET_ADDR_SEC_ENT2(cmd, addr_cam->sec_ent[2]); 907 FWCMD_SET_ADDR_SEC_ENT3(cmd, addr_cam->sec_ent[3]); 908 FWCMD_SET_ADDR_SEC_ENT4(cmd, addr_cam->sec_ent[4]); 909 FWCMD_SET_ADDR_SEC_ENT5(cmd, addr_cam->sec_ent[5]); 910 FWCMD_SET_ADDR_SEC_ENT6(cmd, addr_cam->sec_ent[6]); 911 912 rcu_read_unlock(); 913 } 914 915 void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev, 916 struct rtw89_vif_link *rtwvif_link, 917 struct rtw89_sta_link *rtwsta_link, 918 struct rtw89_h2c_dctlinfo_ud_v1 *h2c) 919 { 920 struct rtw89_addr_cam_entry *addr_cam = 921 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 922 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; 923 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv; 924 925 h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id : 926 rtwvif_link->mac_id, 927 DCTLINFO_V1_C0_MACID) | 928 le32_encode_bits(1, DCTLINFO_V1_C0_OP); 929 930 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0], 931 DCTLINFO_V1_W4_SEC_ENT0_KEYID) | 932 le32_encode_bits(addr_cam->sec_ent_keyid[1], 933 DCTLINFO_V1_W4_SEC_ENT1_KEYID) | 934 le32_encode_bits(addr_cam->sec_ent_keyid[2], 935 DCTLINFO_V1_W4_SEC_ENT2_KEYID) | 936 le32_encode_bits(addr_cam->sec_ent_keyid[3], 937 DCTLINFO_V1_W4_SEC_ENT3_KEYID) | 938 le32_encode_bits(addr_cam->sec_ent_keyid[4], 939 DCTLINFO_V1_W4_SEC_ENT4_KEYID) | 940 le32_encode_bits(addr_cam->sec_ent_keyid[5], 941 DCTLINFO_V1_W4_SEC_ENT5_KEYID) | 942 le32_encode_bits(addr_cam->sec_ent_keyid[6], 943 DCTLINFO_V1_W4_SEC_ENT6_KEYID); 944 h2c->m4 = cpu_to_le32(DCTLINFO_V1_W4_SEC_ENT0_KEYID | 945 DCTLINFO_V1_W4_SEC_ENT1_KEYID | 946 DCTLINFO_V1_W4_SEC_ENT2_KEYID | 947 DCTLINFO_V1_W4_SEC_ENT3_KEYID | 948 DCTLINFO_V1_W4_SEC_ENT4_KEYID | 949 DCTLINFO_V1_W4_SEC_ENT5_KEYID | 950 DCTLINFO_V1_W4_SEC_ENT6_KEYID); 951 952 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0] & 0xff, 953 DCTLINFO_V1_W5_SEC_ENT_VALID) | 954 le32_encode_bits(addr_cam->sec_ent[0], 955 DCTLINFO_V1_W5_SEC_ENT0) | 956 le32_encode_bits(addr_cam->sec_ent[1], 957 DCTLINFO_V1_W5_SEC_ENT1) | 958 le32_encode_bits(addr_cam->sec_ent[2], 959 DCTLINFO_V1_W5_SEC_ENT2); 960 h2c->m5 = cpu_to_le32(DCTLINFO_V1_W5_SEC_ENT_VALID | 961 DCTLINFO_V1_W5_SEC_ENT0 | 962 DCTLINFO_V1_W5_SEC_ENT1 | 963 DCTLINFO_V1_W5_SEC_ENT2); 964 965 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[3], 966 DCTLINFO_V1_W6_SEC_ENT3) | 967 le32_encode_bits(addr_cam->sec_ent[4], 968 DCTLINFO_V1_W6_SEC_ENT4) | 969 le32_encode_bits(addr_cam->sec_ent[5], 970 DCTLINFO_V1_W6_SEC_ENT5) | 971 le32_encode_bits(addr_cam->sec_ent[6], 972 DCTLINFO_V1_W6_SEC_ENT6); 973 h2c->m6 = cpu_to_le32(DCTLINFO_V1_W6_SEC_ENT3 | 974 DCTLINFO_V1_W6_SEC_ENT4 | 975 DCTLINFO_V1_W6_SEC_ENT5 | 976 DCTLINFO_V1_W6_SEC_ENT6); 977 978 if (rtw_wow->ptk_alg) { 979 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8, 980 DCTLINFO_V1_W0_AES_IV_L); 981 h2c->m0 = cpu_to_le32(DCTLINFO_V1_W0_AES_IV_L); 982 983 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] | 984 ptk_tx_iv[5] << 8 | 985 ptk_tx_iv[6] << 16 | 986 ptk_tx_iv[7] << 24, 987 DCTLINFO_V1_W1_AES_IV_H); 988 h2c->m1 = cpu_to_le32(DCTLINFO_V1_W1_AES_IV_H); 989 990 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx, 991 DCTLINFO_V1_W4_SEC_KEY_ID); 992 h2c->m4 |= cpu_to_le32(DCTLINFO_V1_W4_SEC_KEY_ID); 993 } 994 } 995 996 void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev, 997 struct rtw89_vif_link *rtwvif_link, 998 struct rtw89_sta_link *rtwsta_link, 999 struct rtw89_h2c_dctlinfo_ud_v2 *h2c) 1000 { 1001 struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link); 1002 struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link->rtwvif); 1003 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; 1004 struct rtw89_addr_cam_entry *addr_cam = 1005 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 1006 bool is_mld = sta ? sta->mlo : ieee80211_vif_is_mld(vif); 1007 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; 1008 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv; 1009 u8 *mld_sma, *mld_tma, *mld_bssid; 1010 1011 h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id : 1012 rtwvif_link->mac_id, 1013 DCTLINFO_V2_C0_MACID) | 1014 le32_encode_bits(1, DCTLINFO_V2_C0_OP); 1015 1016 h2c->w2 = le32_encode_bits(is_mld, DCTLINFO_V2_W2_IS_MLD); 1017 h2c->m2 = cpu_to_le32(DCTLINFO_V2_W2_IS_MLD); 1018 1019 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0], 1020 DCTLINFO_V2_W4_SEC_ENT0_KEYID) | 1021 le32_encode_bits(addr_cam->sec_ent_keyid[1], 1022 DCTLINFO_V2_W4_SEC_ENT1_KEYID) | 1023 le32_encode_bits(addr_cam->sec_ent_keyid[2], 1024 DCTLINFO_V2_W4_SEC_ENT2_KEYID) | 1025 le32_encode_bits(addr_cam->sec_ent_keyid[3], 1026 DCTLINFO_V2_W4_SEC_ENT3_KEYID) | 1027 le32_encode_bits(addr_cam->sec_ent_keyid[4], 1028 DCTLINFO_V2_W4_SEC_ENT4_KEYID) | 1029 le32_encode_bits(addr_cam->sec_ent_keyid[5], 1030 DCTLINFO_V2_W4_SEC_ENT5_KEYID) | 1031 le32_encode_bits(addr_cam->sec_ent_keyid[6], 1032 DCTLINFO_V2_W4_SEC_ENT6_KEYID); 1033 h2c->m4 = cpu_to_le32(DCTLINFO_V2_W4_SEC_ENT0_KEYID | 1034 DCTLINFO_V2_W4_SEC_ENT1_KEYID | 1035 DCTLINFO_V2_W4_SEC_ENT2_KEYID | 1036 DCTLINFO_V2_W4_SEC_ENT3_KEYID | 1037 DCTLINFO_V2_W4_SEC_ENT4_KEYID | 1038 DCTLINFO_V2_W4_SEC_ENT5_KEYID | 1039 DCTLINFO_V2_W4_SEC_ENT6_KEYID); 1040 1041 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0], 1042 DCTLINFO_V2_W5_SEC_ENT_VALID_V1) | 1043 le32_encode_bits(addr_cam->sec_ent[0], 1044 DCTLINFO_V2_W5_SEC_ENT0_V1); 1045 h2c->m5 = cpu_to_le32(DCTLINFO_V2_W5_SEC_ENT_VALID_V1 | 1046 DCTLINFO_V2_W5_SEC_ENT0_V1); 1047 1048 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[1], 1049 DCTLINFO_V2_W6_SEC_ENT1_V1) | 1050 le32_encode_bits(addr_cam->sec_ent[2], 1051 DCTLINFO_V2_W6_SEC_ENT2_V1) | 1052 le32_encode_bits(addr_cam->sec_ent[3], 1053 DCTLINFO_V2_W6_SEC_ENT3_V1) | 1054 le32_encode_bits(addr_cam->sec_ent[4], 1055 DCTLINFO_V2_W6_SEC_ENT4_V1); 1056 h2c->m6 = cpu_to_le32(DCTLINFO_V2_W6_SEC_ENT1_V1 | 1057 DCTLINFO_V2_W6_SEC_ENT2_V1 | 1058 DCTLINFO_V2_W6_SEC_ENT3_V1 | 1059 DCTLINFO_V2_W6_SEC_ENT4_V1); 1060 1061 h2c->w7 = le32_encode_bits(addr_cam->sec_ent[5], 1062 DCTLINFO_V2_W7_SEC_ENT5_V1) | 1063 le32_encode_bits(addr_cam->sec_ent[6], 1064 DCTLINFO_V2_W7_SEC_ENT6_V1); 1065 h2c->m7 = cpu_to_le32(DCTLINFO_V2_W7_SEC_ENT5_V1 | 1066 DCTLINFO_V2_W7_SEC_ENT6_V1); 1067 1068 if (rtw_wow->ptk_alg) { 1069 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8, 1070 DCTLINFO_V2_W0_AES_IV_L); 1071 h2c->m0 = cpu_to_le32(DCTLINFO_V2_W0_AES_IV_L); 1072 1073 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] | 1074 ptk_tx_iv[5] << 8 | 1075 ptk_tx_iv[6] << 16 | 1076 ptk_tx_iv[7] << 24, 1077 DCTLINFO_V2_W1_AES_IV_H); 1078 h2c->m1 = cpu_to_le32(DCTLINFO_V2_W1_AES_IV_H); 1079 1080 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx, 1081 DCTLINFO_V2_W4_SEC_KEY_ID); 1082 h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID); 1083 } 1084 1085 if (!is_mld) 1086 return; 1087 1088 if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) { 1089 mld_sma = rtwvif->mac_addr; 1090 mld_tma = vif->cfg.ap_addr; 1091 mld_bssid = vif->cfg.ap_addr; 1092 } else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE && sta) { 1093 mld_sma = rtwvif->mac_addr; 1094 mld_tma = sta->addr; 1095 mld_bssid = rtwvif->mac_addr; 1096 } else { 1097 return; 1098 } 1099 1100 h2c->w8 = le32_encode_bits(mld_sma[0], DCTLINFO_V2_W8_MLD_SMA_0) | 1101 le32_encode_bits(mld_sma[1], DCTLINFO_V2_W8_MLD_SMA_1) | 1102 le32_encode_bits(mld_sma[2], DCTLINFO_V2_W8_MLD_SMA_2) | 1103 le32_encode_bits(mld_sma[3], DCTLINFO_V2_W8_MLD_SMA_3); 1104 h2c->m8 = cpu_to_le32(DCTLINFO_V2_W8_ALL); 1105 1106 h2c->w9 = le32_encode_bits(mld_sma[4], DCTLINFO_V2_W9_MLD_SMA_4) | 1107 le32_encode_bits(mld_sma[5], DCTLINFO_V2_W9_MLD_SMA_5) | 1108 le32_encode_bits(mld_tma[0], DCTLINFO_V2_W9_MLD_TMA_0) | 1109 le32_encode_bits(mld_tma[1], DCTLINFO_V2_W9_MLD_TMA_1); 1110 h2c->m9 = cpu_to_le32(DCTLINFO_V2_W9_ALL); 1111 1112 h2c->w10 = le32_encode_bits(mld_tma[2], DCTLINFO_V2_W10_MLD_TMA_2) | 1113 le32_encode_bits(mld_tma[3], DCTLINFO_V2_W10_MLD_TMA_3) | 1114 le32_encode_bits(mld_tma[4], DCTLINFO_V2_W10_MLD_TMA_4) | 1115 le32_encode_bits(mld_tma[5], DCTLINFO_V2_W10_MLD_TMA_5); 1116 h2c->m10 = cpu_to_le32(DCTLINFO_V2_W10_ALL); 1117 1118 h2c->w11 = le32_encode_bits(mld_bssid[0], DCTLINFO_V2_W11_MLD_BSSID_0) | 1119 le32_encode_bits(mld_bssid[1], DCTLINFO_V2_W11_MLD_BSSID_1) | 1120 le32_encode_bits(mld_bssid[2], DCTLINFO_V2_W11_MLD_BSSID_2) | 1121 le32_encode_bits(mld_bssid[3], DCTLINFO_V2_W11_MLD_BSSID_3); 1122 h2c->m11 = cpu_to_le32(DCTLINFO_V2_W11_ALL); 1123 1124 h2c->w12 = le32_encode_bits(mld_bssid[4], DCTLINFO_V2_W12_MLD_BSSID_4) | 1125 le32_encode_bits(mld_bssid[5], DCTLINFO_V2_W12_MLD_BSSID_5); 1126 h2c->m12 = cpu_to_le32(DCTLINFO_V2_W12_ALL); 1127 } 1128