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 RTW89_ROLE_INFO_CHANGE); 241 if (ret) 242 rtw89_err(rtwdev, "failed to update cam del key: %d\n", ret); 243 } 244 245 return ret; 246 } 247 248 static int __rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev, 249 struct rtw89_vif_link *rtwvif_link, 250 struct rtw89_sta_link *rtwsta_link, 251 const struct ieee80211_key_conf *key, 252 const struct rtw89_sec_cam_entry *sec_cam) 253 { 254 struct rtw89_addr_cam_entry *addr_cam; 255 u8 key_idx = 0; 256 int ret; 257 258 addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 259 260 if (key->cipher == WLAN_CIPHER_SUITE_WEP40 || 261 key->cipher == WLAN_CIPHER_SUITE_WEP104) 262 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_ALL_UNI; 263 264 ret = rtw89_cam_get_addr_cam_key_idx(addr_cam, sec_cam, key, &key_idx); 265 if (ret) { 266 rtw89_err(rtwdev, "failed to get addr cam key idx %d, %d\n", 267 addr_cam->sec_ent_mode, sec_cam->type); 268 return ret; 269 } 270 271 addr_cam->sec_ent_keyid[key_idx] = key->keyidx; 272 addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx; 273 set_bit(key_idx, addr_cam->sec_cam_map); 274 ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta_link); 275 if (ret) { 276 rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n", 277 ret); 278 return ret; 279 } 280 ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL, 281 RTW89_ROLE_INFO_CHANGE); 282 if (ret) { 283 rtw89_err(rtwdev, "failed to update addr cam sec entry: %d\n", 284 ret); 285 clear_bit(key_idx, addr_cam->sec_cam_map); 286 return ret; 287 } 288 289 return 0; 290 } 291 292 int rtw89_cam_attach_link_sec_cam(struct rtw89_dev *rtwdev, 293 struct rtw89_vif_link *rtwvif_link, 294 struct rtw89_sta_link *rtwsta_link, 295 u8 sec_cam_idx) 296 { 297 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 298 const struct rtw89_sec_cam_entry *sec_cam; 299 300 sec_cam = cam_info->sec_entries[sec_cam_idx]; 301 if (!sec_cam) 302 return -ENOENT; 303 304 return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, rtwsta_link, 305 sec_cam->key_conf, sec_cam); 306 } 307 308 static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev, 309 struct ieee80211_vif *vif, 310 struct ieee80211_sta *sta, 311 const struct rtw89_sec_cam_entry *sec_cam, 312 bool inform_fw) 313 { 314 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); 315 struct rtw89_sta_link *rtwsta_link; 316 struct rtw89_vif_link *rtwvif_link; 317 struct rtw89_vif *rtwvif; 318 unsigned int link_id; 319 int ret; 320 321 if (!vif) { 322 rtw89_err(rtwdev, "No iface for deleting sec cam\n"); 323 return -EINVAL; 324 } 325 326 rtwvif = vif_to_rtwvif(vif); 327 328 if (rtwsta) 329 clear_bit(sec_cam->sec_cam_idx, rtwsta->pairwise_sec_cam_map); 330 331 rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) { 332 rtwsta_link = rtwsta ? rtwsta->links[link_id] : NULL; 333 if (rtwsta && !rtwsta_link) 334 continue; 335 336 ret = __rtw89_cam_detach_sec_cam(rtwdev, rtwvif_link, rtwsta_link, 337 sec_cam, inform_fw); 338 if (ret) 339 return ret; 340 } 341 342 return 0; 343 } 344 345 static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev, 346 struct ieee80211_vif *vif, 347 struct ieee80211_sta *sta, 348 struct ieee80211_key_conf *key, 349 struct rtw89_sec_cam_entry *sec_cam) 350 { 351 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); 352 struct rtw89_sta_link *rtwsta_link; 353 struct rtw89_vif_link *rtwvif_link; 354 struct rtw89_vif *rtwvif; 355 unsigned int link_id; 356 int key_link_id; 357 int ret; 358 359 if (!vif) { 360 rtw89_err(rtwdev, "No iface for adding sec cam\n"); 361 return -EINVAL; 362 } 363 364 rtwvif = vif_to_rtwvif(vif); 365 366 key_link_id = ieee80211_vif_is_mld(vif) ? key->link_id : 0; 367 if (key_link_id >= 0) { 368 rtwvif_link = rtwvif->links[key_link_id]; 369 rtwsta_link = rtwsta ? rtwsta->links[key_link_id] : NULL; 370 371 if (!rtwvif_link || (rtwsta && !rtwsta_link)) { 372 rtw89_err(rtwdev, "No drv link for adding sec cam\n"); 373 return -ENOLINK; 374 } 375 376 return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, 377 rtwsta_link, key, sec_cam); 378 } 379 380 /* key_link_id < 0: MLD pairwise key */ 381 if (!rtwsta) { 382 rtw89_err(rtwdev, "No sta for adding MLD pairwise sec cam\n"); 383 return -EINVAL; 384 } 385 386 rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) { 387 rtwvif_link = rtwsta_link->rtwvif_link; 388 ret = __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, 389 rtwsta_link, key, sec_cam); 390 if (ret) 391 return ret; 392 } 393 394 set_bit(sec_cam->sec_cam_idx, rtwsta->pairwise_sec_cam_map); 395 396 return 0; 397 } 398 399 static int rtw89_cam_sec_key_install(struct rtw89_dev *rtwdev, 400 struct ieee80211_vif *vif, 401 struct ieee80211_sta *sta, 402 struct ieee80211_key_conf *key, 403 u8 hw_key_type, bool ext_key) 404 { 405 struct rtw89_sec_cam_entry *sec_cam = NULL; 406 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 407 u8 sec_cam_idx; 408 int ret; 409 410 /* maximum key length 256-bit */ 411 if (key->keylen > 32) { 412 rtw89_err(rtwdev, "invalid sec key length %d\n", key->keylen); 413 return -EINVAL; 414 } 415 416 ret = rtw89_cam_get_avail_sec_cam(rtwdev, &sec_cam_idx, ext_key); 417 if (ret) { 418 rtw89_warn(rtwdev, "no available sec cam: %d ext: %d\n", 419 ret, ext_key); 420 return ret; 421 } 422 423 sec_cam = kzalloc(sizeof(*sec_cam), GFP_KERNEL); 424 if (!sec_cam) { 425 ret = -ENOMEM; 426 goto err_release_cam; 427 } 428 429 key->hw_key_idx = sec_cam_idx; 430 cam_info->sec_entries[sec_cam_idx] = sec_cam; 431 432 sec_cam->sec_cam_idx = sec_cam_idx; 433 sec_cam->type = hw_key_type; 434 sec_cam->len = RTW89_SEC_CAM_LEN; 435 sec_cam->ext_key = ext_key; 436 memcpy(sec_cam->key, key->key, key->keylen); 437 438 sec_cam->key_conf = key; 439 440 ret = rtw89_cam_send_sec_key_cmd(rtwdev, sec_cam); 441 if (ret) { 442 rtw89_err(rtwdev, "failed to send sec key cmd: %d\n", ret); 443 goto err_release_cam; 444 } 445 446 /* associate with addr cam */ 447 ret = rtw89_cam_attach_sec_cam(rtwdev, vif, sta, key, sec_cam); 448 if (ret) { 449 rtw89_err(rtwdev, "failed to attach sec cam: %d\n", ret); 450 goto err_release_cam; 451 } 452 453 return 0; 454 455 err_release_cam: 456 cam_info->sec_entries[sec_cam_idx] = NULL; 457 kfree(sec_cam); 458 clear_bit(sec_cam_idx, cam_info->sec_cam_map); 459 if (ext_key) 460 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map); 461 462 return ret; 463 } 464 465 int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev, 466 struct ieee80211_vif *vif, 467 struct ieee80211_sta *sta, 468 struct ieee80211_key_conf *key) 469 { 470 const struct rtw89_chip_info *chip = rtwdev->chip; 471 u8 hw_key_type; 472 bool ext_key = false; 473 int ret; 474 475 if (ieee80211_vif_is_mld(vif) && !chip->hw_mlo_bmc_crypto && 476 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) 477 return -EOPNOTSUPP; 478 479 switch (key->cipher) { 480 case WLAN_CIPHER_SUITE_WEP40: 481 rtw89_leave_ips_by_hwflags(rtwdev); 482 hw_key_type = RTW89_SEC_KEY_TYPE_WEP40; 483 break; 484 case WLAN_CIPHER_SUITE_WEP104: 485 rtw89_leave_ips_by_hwflags(rtwdev); 486 hw_key_type = RTW89_SEC_KEY_TYPE_WEP104; 487 break; 488 case WLAN_CIPHER_SUITE_TKIP: 489 if (!chip->hw_tkip_crypto) 490 return -EOPNOTSUPP; 491 hw_key_type = RTW89_SEC_KEY_TYPE_TKIP; 492 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; 493 break; 494 case WLAN_CIPHER_SUITE_CCMP: 495 hw_key_type = RTW89_SEC_KEY_TYPE_CCMP128; 496 if (!chip->hw_mgmt_tx_encrypt) 497 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 498 break; 499 case WLAN_CIPHER_SUITE_CCMP_256: 500 hw_key_type = RTW89_SEC_KEY_TYPE_CCMP256; 501 if (!chip->hw_mgmt_tx_encrypt) 502 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 503 ext_key = true; 504 break; 505 case WLAN_CIPHER_SUITE_GCMP: 506 hw_key_type = RTW89_SEC_KEY_TYPE_GCMP128; 507 if (!chip->hw_mgmt_tx_encrypt) 508 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 509 break; 510 case WLAN_CIPHER_SUITE_GCMP_256: 511 hw_key_type = RTW89_SEC_KEY_TYPE_GCMP256; 512 if (!chip->hw_mgmt_tx_encrypt) 513 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX; 514 ext_key = true; 515 break; 516 case WLAN_CIPHER_SUITE_AES_CMAC: 517 hw_key_type = RTW89_SEC_KEY_TYPE_BIP_CCMP128; 518 break; 519 default: 520 return -EOPNOTSUPP; 521 } 522 523 if (!chip->hw_sec_hdr) 524 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 525 526 ret = rtw89_cam_sec_key_install(rtwdev, vif, sta, key, hw_key_type, 527 ext_key); 528 if (ret) { 529 rtw89_err(rtwdev, "failed to install key type %d ext %d: %d\n", 530 hw_key_type, ext_key, ret); 531 return ret; 532 } 533 534 return 0; 535 } 536 537 int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev, 538 struct ieee80211_vif *vif, 539 struct ieee80211_sta *sta, 540 struct ieee80211_key_conf *key, 541 bool inform_fw) 542 { 543 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 544 const struct rtw89_sec_cam_entry *sec_cam; 545 u8 sec_cam_idx; 546 int ret; 547 548 sec_cam_idx = key->hw_key_idx; 549 sec_cam = cam_info->sec_entries[sec_cam_idx]; 550 if (!sec_cam) 551 return -EINVAL; 552 553 ret = rtw89_cam_detach_sec_cam(rtwdev, vif, sta, sec_cam, inform_fw); 554 555 /* clear valid bit in addr cam will disable sec cam, 556 * so we don't need to send H2C command again 557 */ 558 cam_info->sec_entries[sec_cam_idx] = NULL; 559 clear_bit(sec_cam_idx, cam_info->sec_cam_map); 560 if (sec_cam->ext_key) 561 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map); 562 563 kfree(sec_cam); 564 565 return ret; 566 } 567 568 static void rtw89_cam_reset_key_iter(struct ieee80211_hw *hw, 569 struct ieee80211_vif *vif, 570 struct ieee80211_sta *sta, 571 struct ieee80211_key_conf *key, 572 void *data) 573 { 574 struct rtw89_dev *rtwdev = (struct rtw89_dev *)data; 575 576 rtw89_cam_sec_key_del(rtwdev, vif, sta, key, false); 577 } 578 579 void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev, 580 struct rtw89_addr_cam_entry *addr_cam) 581 { 582 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 583 584 addr_cam->valid = false; 585 clear_bit(addr_cam->addr_cam_idx, cam_info->addr_cam_map); 586 } 587 588 void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev, 589 struct rtw89_bssid_cam_entry *bssid_cam) 590 { 591 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 592 593 bssid_cam->valid = false; 594 clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map); 595 } 596 597 void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) 598 { 599 struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam; 600 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam; 601 602 rtw89_cam_deinit_addr_cam(rtwdev, addr_cam); 603 rtw89_cam_deinit_bssid_cam(rtwdev, bssid_cam); 604 } 605 606 void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev) 607 { 608 rcu_read_lock(); 609 ieee80211_iter_keys_rcu(rtwdev->hw, NULL, rtw89_cam_reset_key_iter, rtwdev); 610 rcu_read_unlock(); 611 } 612 613 static int rtw89_cam_get_avail_addr_cam(struct rtw89_dev *rtwdev, 614 u8 *addr_cam_idx) 615 { 616 const struct rtw89_chip_info *chip = rtwdev->chip; 617 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 618 u8 addr_cam_num = chip->acam_num; 619 u8 idx; 620 621 idx = find_first_zero_bit(cam_info->addr_cam_map, addr_cam_num); 622 if (idx >= addr_cam_num) 623 return -EBUSY; 624 625 set_bit(idx, cam_info->addr_cam_map); 626 *addr_cam_idx = idx; 627 628 return 0; 629 } 630 631 static u8 rtw89_get_addr_cam_entry_size(struct rtw89_dev *rtwdev) 632 { 633 const struct rtw89_chip_info *chip = rtwdev->chip; 634 635 switch (chip->chip_id) { 636 case RTL8852A: 637 case RTL8852B: 638 case RTL8851B: 639 case RTL8852BT: 640 return ADDR_CAM_ENT_SIZE; 641 default: 642 return ADDR_CAM_ENT_SHORT_SIZE; 643 } 644 } 645 646 int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev, 647 struct rtw89_addr_cam_entry *addr_cam, 648 const struct rtw89_bssid_cam_entry *bssid_cam) 649 { 650 u8 addr_cam_idx; 651 int i; 652 int ret; 653 654 if (unlikely(addr_cam->valid)) { 655 rtw89_debug(rtwdev, RTW89_DBG_FW, 656 "addr cam is already valid; skip init\n"); 657 return 0; 658 } 659 660 ret = rtw89_cam_get_avail_addr_cam(rtwdev, &addr_cam_idx); 661 if (ret) { 662 rtw89_err(rtwdev, "failed to get available addr cam\n"); 663 return ret; 664 } 665 666 addr_cam->addr_cam_idx = addr_cam_idx; 667 addr_cam->len = rtw89_get_addr_cam_entry_size(rtwdev); 668 addr_cam->offset = 0; 669 addr_cam->valid = true; 670 addr_cam->addr_mask = 0; 671 addr_cam->mask_sel = RTW89_NO_MSK; 672 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL; 673 bitmap_zero(addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM); 674 675 for (i = 0; i < RTW89_SEC_CAM_IN_ADDR_CAM; i++) { 676 addr_cam->sec_ent_keyid[i] = 0; 677 addr_cam->sec_ent[i] = 0; 678 } 679 680 /* associate addr cam with bssid cam */ 681 addr_cam->bssid_cam_idx = bssid_cam->bssid_cam_idx; 682 683 return 0; 684 } 685 686 static int rtw89_cam_get_avail_bssid_cam(struct rtw89_dev *rtwdev, 687 u8 *bssid_cam_idx) 688 { 689 const struct rtw89_chip_info *chip = rtwdev->chip; 690 struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 691 u8 bssid_cam_num = chip->bcam_num; 692 u8 idx; 693 694 idx = find_first_zero_bit(cam_info->bssid_cam_map, bssid_cam_num); 695 if (idx >= bssid_cam_num) 696 return -EBUSY; 697 698 set_bit(idx, cam_info->bssid_cam_map); 699 *bssid_cam_idx = idx; 700 701 return 0; 702 } 703 704 int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, 705 struct rtw89_vif_link *rtwvif_link, 706 struct rtw89_bssid_cam_entry *bssid_cam, 707 const u8 *bssid) 708 { 709 u8 bssid_cam_idx; 710 int ret; 711 712 if (unlikely(bssid_cam->valid)) { 713 rtw89_debug(rtwdev, RTW89_DBG_FW, 714 "bssid cam is already valid; skip init\n"); 715 return 0; 716 } 717 718 ret = rtw89_cam_get_avail_bssid_cam(rtwdev, &bssid_cam_idx); 719 if (ret) { 720 rtw89_err(rtwdev, "failed to get available bssid cam\n"); 721 return ret; 722 } 723 724 bssid_cam->bssid_cam_idx = bssid_cam_idx; 725 bssid_cam->phy_idx = rtwvif_link->phy_idx; 726 bssid_cam->len = BSSID_CAM_ENT_SIZE; 727 bssid_cam->offset = 0; 728 bssid_cam->valid = true; 729 ether_addr_copy(bssid_cam->bssid, bssid); 730 731 return 0; 732 } 733 734 void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) 735 { 736 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam; 737 738 ether_addr_copy(bssid_cam->bssid, rtwvif_link->bssid); 739 } 740 741 int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) 742 { 743 struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam; 744 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam; 745 int ret; 746 747 ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif_link, bssid_cam, 748 rtwvif_link->bssid); 749 if (ret) { 750 rtw89_err(rtwdev, "failed to init bssid cam\n"); 751 return ret; 752 } 753 754 ret = rtw89_cam_init_addr_cam(rtwdev, addr_cam, bssid_cam); 755 if (ret) { 756 rtw89_err(rtwdev, "failed to init addr cam\n"); 757 return ret; 758 } 759 760 return 0; 761 } 762 763 int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev, 764 struct rtw89_vif_link *rtwvif_link, 765 struct rtw89_sta_link *rtwsta_link, 766 struct rtw89_h2c_addr_cam_v0 *h2c) 767 { 768 struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif_link, 769 rtwsta_link); 770 struct ieee80211_bss_conf *bss_conf; 771 u8 bss_color; 772 u8 bss_mask; 773 774 rcu_read_lock(); 775 776 bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, false); 777 bss_color = bss_conf->he_bss_color.color; 778 779 if (bss_conf->nontransmitted) 780 bss_mask = RTW89_BSSID_MATCH_5_BYTES; 781 else 782 bss_mask = RTW89_BSSID_MATCH_ALL; 783 784 rcu_read_unlock(); 785 786 h2c->w12 = le32_encode_bits(bssid_cam->bssid_cam_idx, ADDR_CAM_W12_BSSID_IDX) | 787 le32_encode_bits(bssid_cam->offset, ADDR_CAM_W12_BSSID_OFFSET) | 788 le32_encode_bits(bssid_cam->len, ADDR_CAM_W12_BSSID_LEN); 789 h2c->w13 = le32_encode_bits(bssid_cam->valid, ADDR_CAM_W13_BSSID_VALID) | 790 le32_encode_bits(bss_mask, ADDR_CAM_W13_BSSID_MASK) | 791 le32_encode_bits(bssid_cam->phy_idx, ADDR_CAM_W13_BSSID_BB_SEL) | 792 le32_encode_bits(bss_color, ADDR_CAM_W13_BSSID_BSS_COLOR) | 793 le32_encode_bits(bssid_cam->bssid[0], ADDR_CAM_W13_BSSID_BSSID0) | 794 le32_encode_bits(bssid_cam->bssid[1], ADDR_CAM_W13_BSSID_BSSID1); 795 h2c->w14 = le32_encode_bits(bssid_cam->bssid[2], ADDR_CAM_W14_BSSID_BSSID2) | 796 le32_encode_bits(bssid_cam->bssid[3], ADDR_CAM_W14_BSSID_BSSID3) | 797 le32_encode_bits(bssid_cam->bssid[4], ADDR_CAM_W14_BSSID_BSSID4) | 798 le32_encode_bits(bssid_cam->bssid[5], ADDR_CAM_W14_BSSID_BSSID5); 799 800 return 0; 801 } 802 803 static u8 rtw89_cam_addr_hash(u8 start, const u8 *addr) 804 { 805 u8 hash = 0; 806 u8 i; 807 808 for (i = start; i < ETH_ALEN; i++) 809 hash ^= addr[i]; 810 811 return hash; 812 } 813 814 void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev, 815 struct rtw89_vif_link *rtwvif_link, 816 struct rtw89_sta_link *rtwsta_link, 817 const u8 *scan_mac_addr, 818 struct rtw89_h2c_addr_cam_v0 *h2c) 819 { 820 struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link); 821 struct rtw89_addr_cam_entry *addr_cam = 822 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 823 struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link); 824 const struct rtw89_chip_info *chip = rtwdev->chip; 825 struct ieee80211_link_sta *link_sta; 826 const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif_link->mac_addr; 827 u8 sma_hash, tma_hash, addr_msk_start; 828 u8 ver = chip->addrcam_ver; 829 u8 sma_start = 0; 830 u8 tma_start = 0; 831 const u8 *tma; 832 u8 mac_id; 833 834 rcu_read_lock(); 835 836 if (sta) { 837 link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true); 838 tma = link_sta->addr; 839 } else { 840 tma = rtwvif_link->bssid; 841 } 842 843 if (addr_cam->addr_mask != 0) { 844 addr_msk_start = __ffs(addr_cam->addr_mask); 845 if (addr_cam->mask_sel == RTW89_SMA) 846 sma_start = addr_msk_start; 847 else if (addr_cam->mask_sel == RTW89_TMA) 848 tma_start = addr_msk_start; 849 } 850 sma_hash = rtw89_cam_addr_hash(sma_start, sma); 851 tma_hash = rtw89_cam_addr_hash(tma_start, tma); 852 853 mac_id = rtwsta_link ? rtwsta_link->mac_id : rtwvif_link->mac_id; 854 855 if (ver == 0) 856 h2c->w1 = le32_encode_bits(addr_cam->addr_cam_idx, ADDR_CAM_W1_IDX) | 857 le32_encode_bits(addr_cam->offset, ADDR_CAM_W1_OFFSET) | 858 le32_encode_bits(addr_cam->len, ADDR_CAM_W1_LEN); 859 else 860 h2c->w1 = le32_encode_bits(addr_cam->addr_cam_idx, ADDR_CAM_W1_V1_IDX) | 861 le32_encode_bits(addr_cam->offset, ADDR_CAM_W1_V1_OFFSET) | 862 le32_encode_bits(addr_cam->len, ADDR_CAM_W1_V1_LEN); 863 864 h2c->w2 = le32_encode_bits(addr_cam->valid, ADDR_CAM_W2_VALID) | 865 le32_encode_bits(rtwvif_link->net_type, ADDR_CAM_W2_NET_TYPE) | 866 le32_encode_bits(rtwvif_link->bcn_hit_cond, ADDR_CAM_W2_BCN_HIT_COND) | 867 le32_encode_bits(rtwvif_link->hit_rule, ADDR_CAM_W2_HIT_RULE) | 868 le32_encode_bits(rtwvif_link->phy_idx, ADDR_CAM_W2_BB_SEL) | 869 le32_encode_bits(addr_cam->addr_mask, ADDR_CAM_W2_ADDR_MASK) | 870 le32_encode_bits(addr_cam->mask_sel, ADDR_CAM_W2_MASK_SEL) | 871 le32_encode_bits(sma_hash, ADDR_CAM_W2_SMA_HASH) | 872 le32_encode_bits(tma_hash, ADDR_CAM_W2_TMA_HASH); 873 h2c->w3 = le32_encode_bits(addr_cam->bssid_cam_idx, ADDR_CAM_W3_BSSID_CAM_IDX); 874 h2c->w4 = le32_encode_bits(sma[0], ADDR_CAM_W4_SMA0) | 875 le32_encode_bits(sma[1], ADDR_CAM_W4_SMA1) | 876 le32_encode_bits(sma[2], ADDR_CAM_W4_SMA2) | 877 le32_encode_bits(sma[3], ADDR_CAM_W4_SMA3); 878 h2c->w5 = le32_encode_bits(sma[4], ADDR_CAM_W5_SMA4) | 879 le32_encode_bits(sma[5], ADDR_CAM_W5_SMA5) | 880 le32_encode_bits(tma[0], ADDR_CAM_W5_TMA0) | 881 le32_encode_bits(tma[1], ADDR_CAM_W5_TMA1); 882 h2c->w6 = le32_encode_bits(tma[2], ADDR_CAM_W6_TMA2) | 883 le32_encode_bits(tma[3], ADDR_CAM_W6_TMA3) | 884 le32_encode_bits(tma[4], ADDR_CAM_W6_TMA4) | 885 le32_encode_bits(tma[5], ADDR_CAM_W6_TMA5); 886 if (ver == 0) 887 h2c->w8 = le32_encode_bits(rtwvif_link->port, ADDR_CAM_W8_PORT_INT) | 888 le32_encode_bits(rtwvif_link->port, ADDR_CAM_W8_TSF_SYNC) | 889 le32_encode_bits(rtwvif_link->trigger, ADDR_CAM_W8_TF_TRS) | 890 le32_encode_bits(rtwvif_link->lsig_txop, ADDR_CAM_W8_LSIG_TXOP) | 891 le32_encode_bits(rtwvif_link->tgt_ind, ADDR_CAM_W8_TGT_IND) | 892 le32_encode_bits(rtwvif_link->frm_tgt_ind, ADDR_CAM_W8_FRM_TGT_IND) | 893 le32_encode_bits(mac_id, ADDR_CAM_W8_MACID); 894 else 895 h2c->w8 = le32_encode_bits(rtwvif_link->port, ADDR_CAM_W8_V1_PORT_INT) | 896 le32_encode_bits(rtwvif_link->port, ADDR_CAM_W8_V1_TSF_SYNC) | 897 le32_encode_bits(rtwvif_link->trigger, ADDR_CAM_W8_V1_TF_TRS) | 898 le32_encode_bits(rtwvif_link->lsig_txop, ADDR_CAM_W8_V1_LSIG_TXOP) | 899 le32_encode_bits(mac_id, ADDR_CAM_W8_V1_MACID); 900 901 if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) 902 h2c->w9 = le32_encode_bits(vif->cfg.aid & 0xfff, ADDR_CAM_W9_AID12); 903 else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE) 904 h2c->w9 = le32_encode_bits(sta ? sta->aid & 0xfff : 0, ADDR_CAM_W9_AID12); 905 906 h2c->w9 |= le32_encode_bits(rtwvif_link->wowlan_pattern, ADDR_CAM_W9_WOL_PATTERN) | 907 le32_encode_bits(rtwvif_link->wowlan_uc, ADDR_CAM_W9_WOL_UC) | 908 le32_encode_bits(rtwvif_link->wowlan_magic, ADDR_CAM_W9_WOL_MAGIC) | 909 le32_encode_bits(addr_cam->wapi, ADDR_CAM_W9_WAPI) | 910 le32_encode_bits(addr_cam->sec_ent_mode, ADDR_CAM_W9_SEC_ENT_MODE) | 911 le32_encode_bits(addr_cam->sec_ent_keyid[0], ADDR_CAM_W9_SEC_ENT0_KEYID) | 912 le32_encode_bits(addr_cam->sec_ent_keyid[1], ADDR_CAM_W9_SEC_ENT1_KEYID) | 913 le32_encode_bits(addr_cam->sec_ent_keyid[2], ADDR_CAM_W9_SEC_ENT2_KEYID) | 914 le32_encode_bits(addr_cam->sec_ent_keyid[3], ADDR_CAM_W9_SEC_ENT3_KEYID) | 915 le32_encode_bits(addr_cam->sec_ent_keyid[4], ADDR_CAM_W9_SEC_ENT4_KEYID) | 916 le32_encode_bits(addr_cam->sec_ent_keyid[5], ADDR_CAM_W9_SEC_ENT5_KEYID) | 917 le32_encode_bits(addr_cam->sec_ent_keyid[6], ADDR_CAM_W9_SEC_ENT6_KEYID); 918 h2c->w10 = le32_encode_bits(addr_cam->sec_cam_map[0] & 0xff, ADDR_CAM_W10_SEC_ENT_VALID) | 919 le32_encode_bits(addr_cam->sec_ent[0], ADDR_CAM_W10_SEC_ENT0) | 920 le32_encode_bits(addr_cam->sec_ent[1], ADDR_CAM_W10_SEC_ENT1) | 921 le32_encode_bits(addr_cam->sec_ent[2], ADDR_CAM_W10_SEC_ENT2); 922 h2c->w11 = le32_encode_bits(addr_cam->sec_ent[3], ADDR_CAM_W11_SEC_ENT3) | 923 le32_encode_bits(addr_cam->sec_ent[4], ADDR_CAM_W11_SEC_ENT4) | 924 le32_encode_bits(addr_cam->sec_ent[5], ADDR_CAM_W11_SEC_ENT5) | 925 le32_encode_bits(addr_cam->sec_ent[6], ADDR_CAM_W11_SEC_ENT6); 926 927 rcu_read_unlock(); 928 } 929 930 void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev, 931 struct rtw89_vif_link *rtwvif_link, 932 struct rtw89_sta_link *rtwsta_link, 933 struct rtw89_h2c_dctlinfo_ud_v1 *h2c) 934 { 935 struct rtw89_addr_cam_entry *addr_cam = 936 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 937 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; 938 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv; 939 940 h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id : 941 rtwvif_link->mac_id, 942 DCTLINFO_V1_C0_MACID) | 943 le32_encode_bits(1, DCTLINFO_V1_C0_OP); 944 945 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0], 946 DCTLINFO_V1_W4_SEC_ENT0_KEYID) | 947 le32_encode_bits(addr_cam->sec_ent_keyid[1], 948 DCTLINFO_V1_W4_SEC_ENT1_KEYID) | 949 le32_encode_bits(addr_cam->sec_ent_keyid[2], 950 DCTLINFO_V1_W4_SEC_ENT2_KEYID) | 951 le32_encode_bits(addr_cam->sec_ent_keyid[3], 952 DCTLINFO_V1_W4_SEC_ENT3_KEYID) | 953 le32_encode_bits(addr_cam->sec_ent_keyid[4], 954 DCTLINFO_V1_W4_SEC_ENT4_KEYID) | 955 le32_encode_bits(addr_cam->sec_ent_keyid[5], 956 DCTLINFO_V1_W4_SEC_ENT5_KEYID) | 957 le32_encode_bits(addr_cam->sec_ent_keyid[6], 958 DCTLINFO_V1_W4_SEC_ENT6_KEYID); 959 h2c->m4 = cpu_to_le32(DCTLINFO_V1_W4_SEC_ENT0_KEYID | 960 DCTLINFO_V1_W4_SEC_ENT1_KEYID | 961 DCTLINFO_V1_W4_SEC_ENT2_KEYID | 962 DCTLINFO_V1_W4_SEC_ENT3_KEYID | 963 DCTLINFO_V1_W4_SEC_ENT4_KEYID | 964 DCTLINFO_V1_W4_SEC_ENT5_KEYID | 965 DCTLINFO_V1_W4_SEC_ENT6_KEYID); 966 967 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0] & 0xff, 968 DCTLINFO_V1_W5_SEC_ENT_VALID) | 969 le32_encode_bits(addr_cam->sec_ent[0], 970 DCTLINFO_V1_W5_SEC_ENT0) | 971 le32_encode_bits(addr_cam->sec_ent[1], 972 DCTLINFO_V1_W5_SEC_ENT1) | 973 le32_encode_bits(addr_cam->sec_ent[2], 974 DCTLINFO_V1_W5_SEC_ENT2); 975 h2c->m5 = cpu_to_le32(DCTLINFO_V1_W5_SEC_ENT_VALID | 976 DCTLINFO_V1_W5_SEC_ENT0 | 977 DCTLINFO_V1_W5_SEC_ENT1 | 978 DCTLINFO_V1_W5_SEC_ENT2); 979 980 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[3], 981 DCTLINFO_V1_W6_SEC_ENT3) | 982 le32_encode_bits(addr_cam->sec_ent[4], 983 DCTLINFO_V1_W6_SEC_ENT4) | 984 le32_encode_bits(addr_cam->sec_ent[5], 985 DCTLINFO_V1_W6_SEC_ENT5) | 986 le32_encode_bits(addr_cam->sec_ent[6], 987 DCTLINFO_V1_W6_SEC_ENT6); 988 h2c->m6 = cpu_to_le32(DCTLINFO_V1_W6_SEC_ENT3 | 989 DCTLINFO_V1_W6_SEC_ENT4 | 990 DCTLINFO_V1_W6_SEC_ENT5 | 991 DCTLINFO_V1_W6_SEC_ENT6); 992 993 if (rtw_wow->ptk_alg) { 994 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8, 995 DCTLINFO_V1_W0_AES_IV_L); 996 h2c->m0 = cpu_to_le32(DCTLINFO_V1_W0_AES_IV_L); 997 998 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] | 999 ptk_tx_iv[5] << 8 | 1000 ptk_tx_iv[6] << 16 | 1001 ptk_tx_iv[7] << 24, 1002 DCTLINFO_V1_W1_AES_IV_H); 1003 h2c->m1 = cpu_to_le32(DCTLINFO_V1_W1_AES_IV_H); 1004 1005 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx, 1006 DCTLINFO_V1_W4_SEC_KEY_ID); 1007 h2c->m4 |= cpu_to_le32(DCTLINFO_V1_W4_SEC_KEY_ID); 1008 } 1009 } 1010 1011 void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev, 1012 struct rtw89_vif_link *rtwvif_link, 1013 struct rtw89_sta_link *rtwsta_link, 1014 struct rtw89_h2c_dctlinfo_ud_v2 *h2c) 1015 { 1016 struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link); 1017 struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link->rtwvif); 1018 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; 1019 struct rtw89_addr_cam_entry *addr_cam = 1020 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link); 1021 bool is_mld = sta ? sta->mlo : ieee80211_vif_is_mld(vif); 1022 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; 1023 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv; 1024 u8 *mld_sma, *mld_tma, *mld_bssid; 1025 1026 h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id : 1027 rtwvif_link->mac_id, 1028 DCTLINFO_V2_C0_MACID) | 1029 le32_encode_bits(1, DCTLINFO_V2_C0_OP); 1030 1031 h2c->w2 = le32_encode_bits(is_mld, DCTLINFO_V2_W2_IS_MLD); 1032 h2c->m2 = cpu_to_le32(DCTLINFO_V2_W2_IS_MLD); 1033 1034 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0], 1035 DCTLINFO_V2_W4_SEC_ENT0_KEYID) | 1036 le32_encode_bits(addr_cam->sec_ent_keyid[1], 1037 DCTLINFO_V2_W4_SEC_ENT1_KEYID) | 1038 le32_encode_bits(addr_cam->sec_ent_keyid[2], 1039 DCTLINFO_V2_W4_SEC_ENT2_KEYID) | 1040 le32_encode_bits(addr_cam->sec_ent_keyid[3], 1041 DCTLINFO_V2_W4_SEC_ENT3_KEYID) | 1042 le32_encode_bits(addr_cam->sec_ent_keyid[4], 1043 DCTLINFO_V2_W4_SEC_ENT4_KEYID) | 1044 le32_encode_bits(addr_cam->sec_ent_keyid[5], 1045 DCTLINFO_V2_W4_SEC_ENT5_KEYID) | 1046 le32_encode_bits(addr_cam->sec_ent_keyid[6], 1047 DCTLINFO_V2_W4_SEC_ENT6_KEYID); 1048 h2c->m4 = cpu_to_le32(DCTLINFO_V2_W4_SEC_ENT0_KEYID | 1049 DCTLINFO_V2_W4_SEC_ENT1_KEYID | 1050 DCTLINFO_V2_W4_SEC_ENT2_KEYID | 1051 DCTLINFO_V2_W4_SEC_ENT3_KEYID | 1052 DCTLINFO_V2_W4_SEC_ENT4_KEYID | 1053 DCTLINFO_V2_W4_SEC_ENT5_KEYID | 1054 DCTLINFO_V2_W4_SEC_ENT6_KEYID); 1055 1056 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0], 1057 DCTLINFO_V2_W5_SEC_ENT_VALID_V1) | 1058 le32_encode_bits(addr_cam->sec_ent[0], 1059 DCTLINFO_V2_W5_SEC_ENT0_V1); 1060 h2c->m5 = cpu_to_le32(DCTLINFO_V2_W5_SEC_ENT_VALID_V1 | 1061 DCTLINFO_V2_W5_SEC_ENT0_V1); 1062 1063 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[1], 1064 DCTLINFO_V2_W6_SEC_ENT1_V1) | 1065 le32_encode_bits(addr_cam->sec_ent[2], 1066 DCTLINFO_V2_W6_SEC_ENT2_V1) | 1067 le32_encode_bits(addr_cam->sec_ent[3], 1068 DCTLINFO_V2_W6_SEC_ENT3_V1) | 1069 le32_encode_bits(addr_cam->sec_ent[4], 1070 DCTLINFO_V2_W6_SEC_ENT4_V1); 1071 h2c->m6 = cpu_to_le32(DCTLINFO_V2_W6_SEC_ENT1_V1 | 1072 DCTLINFO_V2_W6_SEC_ENT2_V1 | 1073 DCTLINFO_V2_W6_SEC_ENT3_V1 | 1074 DCTLINFO_V2_W6_SEC_ENT4_V1); 1075 1076 h2c->w7 = le32_encode_bits(addr_cam->sec_ent[5], 1077 DCTLINFO_V2_W7_SEC_ENT5_V1) | 1078 le32_encode_bits(addr_cam->sec_ent[6], 1079 DCTLINFO_V2_W7_SEC_ENT6_V1); 1080 h2c->m7 = cpu_to_le32(DCTLINFO_V2_W7_SEC_ENT5_V1 | 1081 DCTLINFO_V2_W7_SEC_ENT6_V1); 1082 1083 if (rtw_wow->ptk_alg) { 1084 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8, 1085 DCTLINFO_V2_W0_AES_IV_L); 1086 h2c->m0 = cpu_to_le32(DCTLINFO_V2_W0_AES_IV_L); 1087 1088 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] | 1089 ptk_tx_iv[5] << 8 | 1090 ptk_tx_iv[6] << 16 | 1091 ptk_tx_iv[7] << 24, 1092 DCTLINFO_V2_W1_AES_IV_H); 1093 h2c->m1 = cpu_to_le32(DCTLINFO_V2_W1_AES_IV_H); 1094 1095 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx, 1096 DCTLINFO_V2_W4_SEC_KEY_ID); 1097 h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID); 1098 } 1099 1100 if (!is_mld) 1101 return; 1102 1103 if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) { 1104 mld_sma = rtwvif->mac_addr; 1105 mld_tma = vif->cfg.ap_addr; 1106 mld_bssid = vif->cfg.ap_addr; 1107 } else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE && sta) { 1108 mld_sma = rtwvif->mac_addr; 1109 mld_tma = sta->addr; 1110 mld_bssid = rtwvif->mac_addr; 1111 } else { 1112 return; 1113 } 1114 1115 h2c->w8 = le32_encode_bits(mld_sma[0], DCTLINFO_V2_W8_MLD_SMA_0) | 1116 le32_encode_bits(mld_sma[1], DCTLINFO_V2_W8_MLD_SMA_1) | 1117 le32_encode_bits(mld_sma[2], DCTLINFO_V2_W8_MLD_SMA_2) | 1118 le32_encode_bits(mld_sma[3], DCTLINFO_V2_W8_MLD_SMA_3); 1119 h2c->m8 = cpu_to_le32(DCTLINFO_V2_W8_ALL); 1120 1121 h2c->w9 = le32_encode_bits(mld_sma[4], DCTLINFO_V2_W9_MLD_SMA_4) | 1122 le32_encode_bits(mld_sma[5], DCTLINFO_V2_W9_MLD_SMA_5) | 1123 le32_encode_bits(mld_tma[0], DCTLINFO_V2_W9_MLD_TMA_0) | 1124 le32_encode_bits(mld_tma[1], DCTLINFO_V2_W9_MLD_TMA_1); 1125 h2c->m9 = cpu_to_le32(DCTLINFO_V2_W9_ALL); 1126 1127 h2c->w10 = le32_encode_bits(mld_tma[2], DCTLINFO_V2_W10_MLD_TMA_2) | 1128 le32_encode_bits(mld_tma[3], DCTLINFO_V2_W10_MLD_TMA_3) | 1129 le32_encode_bits(mld_tma[4], DCTLINFO_V2_W10_MLD_TMA_4) | 1130 le32_encode_bits(mld_tma[5], DCTLINFO_V2_W10_MLD_TMA_5); 1131 h2c->m10 = cpu_to_le32(DCTLINFO_V2_W10_ALL); 1132 1133 h2c->w11 = le32_encode_bits(mld_bssid[0], DCTLINFO_V2_W11_MLD_BSSID_0) | 1134 le32_encode_bits(mld_bssid[1], DCTLINFO_V2_W11_MLD_BSSID_1) | 1135 le32_encode_bits(mld_bssid[2], DCTLINFO_V2_W11_MLD_BSSID_2) | 1136 le32_encode_bits(mld_bssid[3], DCTLINFO_V2_W11_MLD_BSSID_3); 1137 h2c->m11 = cpu_to_le32(DCTLINFO_V2_W11_ALL); 1138 1139 h2c->w12 = le32_encode_bits(mld_bssid[4], DCTLINFO_V2_W12_MLD_BSSID_4) | 1140 le32_encode_bits(mld_bssid[5], DCTLINFO_V2_W12_MLD_BSSID_5); 1141 h2c->m12 = cpu_to_le32(DCTLINFO_V2_W12_ALL); 1142 } 1143