Lines Matching +full:cam +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
5 #include "cam.h"
22 if (!skb)
30 key32[i] = FIELD_PREP(GENMASK(7, 0), sec_cam->key[j + 0]) |
31 FIELD_PREP(GENMASK(15, 8), sec_cam->key[j + 1]) |
32 FIELD_PREP(GENMASK(23, 16), sec_cam->key[j + 2]) |
33 FIELD_PREP(GENMASK(31, 24), sec_cam->key[j + 3]);
36 cmd = skb->data;
37 RTW89_SET_FWCMD_SEC_IDX(cmd, sec_cam->sec_cam_idx + (ext_key ? 1 : 0));
38 RTW89_SET_FWCMD_SEC_OFFSET(cmd, sec_cam->offset);
39 RTW89_SET_FWCMD_SEC_LEN(cmd, sec_cam->len);
40 RTW89_SET_FWCMD_SEC_TYPE(cmd, sec_cam->type);
42 RTW89_SET_FWCMD_SEC_SPP_MODE(cmd, sec_cam->spp_mode);
58 if (!skb) {
60 return -ENOMEM;
70 if (ret) {
76 if (!sec_cam->ext_key)
80 if (!ext_skb) {
82 return -ENOMEM;
92 if (ret) {
104 const struct rtw89_chip_info *chip = rtwdev->chip;
105 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
106 u8 sec_cam_num = chip->scam_num;
109 if (!ext_key) {
110 idx = find_first_zero_bit(cam_info->sec_cam_map, sec_cam_num);
111 if (idx >= sec_cam_num)
112 return -EBUSY;
114 set_bit(idx, cam_info->sec_cam_map);
121 idx = find_next_zero_bit(cam_info->sec_cam_map, sec_cam_num, idx);
122 if (idx >= sec_cam_num - 1)
123 return -EBUSY;
124 /* ext keys need two cam entries for 256-bit key */
125 if (test_bit(idx + 1, cam_info->sec_cam_map)) {
130 set_bit(idx, cam_info->sec_cam_map);
131 set_bit(idx + 1, cam_info->sec_cam_map);
145 * RTW89_ADDR_CAM_SEC_ALL_UNI : 0 - 6 unicast
146 * RTW89_ADDR_CAM_SEC_NORMAL : 0 - 1 unicast, 2 - 4 group, 5 - 6 BIP
147 * RTW89_ADDR_CAM_SEC_4GROUP : 0 - 1 unicast, 2 - 5 group, 6 BIP
149 switch (addr_cam->sec_ent_mode) {
151 return -EINVAL;
153 idx = find_first_zero_bit(addr_cam->sec_cam_map,
155 if (idx >= RTW89_SEC_CAM_IN_ADDR_CAM)
156 return -EBUSY;
160 if (sec_cam->type == RTW89_SEC_KEY_TYPE_BIP_CCMP128) {
161 idx = find_next_zero_bit(addr_cam->sec_cam_map,
163 if (idx > 6)
164 return -EBUSY;
169 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
170 idx = find_next_zero_bit(addr_cam->sec_cam_map,
172 if (idx > 1)
173 return -EBUSY;
179 idx = find_next_zero_bit(addr_cam->sec_cam_map,
181 if (idx > 4)
182 return -EBUSY;
186 if (sec_cam->type == RTW89_SEC_KEY_TYPE_BIP_CCMP128) {
187 if (test_bit(6, addr_cam->sec_cam_map))
188 return -EINVAL;
193 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
194 idx = find_next_zero_bit(addr_cam->sec_cam_map,
196 if (idx > 1)
197 return -EBUSY;
203 idx = find_next_zero_bit(addr_cam->sec_cam_map,
205 if (idx > 5)
206 return -EBUSY;
226 if (!vif) {
227 rtw89_err(rtwdev, "No iface for deleting sec cam\n");
228 return -EINVAL;
231 rtwvif = (struct rtw89_vif *)vif->drv_priv;
234 for_each_set_bit(i, addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM) {
235 if (addr_cam->sec_ent[i] != sec_cam->sec_cam_idx)
238 clear_bit(i, addr_cam->sec_cam_map);
241 if (inform_fw) {
243 if (ret)
245 "failed to update dctl cam del key: %d\n", ret);
247 if (ret)
248 rtw89_err(rtwdev, "failed to update cam del key: %d\n", ret);
266 if (!vif) {
267 rtw89_err(rtwdev, "No iface for adding sec cam\n");
268 return -EINVAL;
271 rtwvif = (struct rtw89_vif *)vif->drv_priv;
274 if (key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
275 key->cipher == WLAN_CIPHER_SUITE_WEP104)
276 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_ALL_UNI;
279 if (ret) {
280 rtw89_err(rtwdev, "failed to get addr cam key idx %d, %d\n",
281 addr_cam->sec_ent_mode, sec_cam->type);
285 addr_cam->sec_ent_keyid[key_idx] = key->keyidx;
286 addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx;
287 set_bit(key_idx, addr_cam->sec_cam_map);
289 if (ret) {
290 rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
295 if (ret) {
296 rtw89_err(rtwdev, "failed to update addr cam sec entry: %d\n",
298 clear_bit(key_idx, addr_cam->sec_cam_map);
312 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
316 /* maximum key length 256-bit */
317 if (key->keylen > 32) {
318 rtw89_err(rtwdev, "invalid sec key length %d\n", key->keylen);
319 return -EINVAL;
323 if (ret) {
324 rtw89_warn(rtwdev, "no available sec cam: %d ext: %d\n",
330 if (!sec_cam) {
331 ret = -ENOMEM;
335 key->hw_key_idx = sec_cam_idx;
336 cam_info->sec_entries[sec_cam_idx] = sec_cam;
338 sec_cam->sec_cam_idx = sec_cam_idx;
339 sec_cam->type = hw_key_type;
340 sec_cam->len = RTW89_SEC_CAM_LEN;
341 sec_cam->ext_key = ext_key;
342 memcpy(sec_cam->key, key->key, key->keylen);
344 if (ret) {
349 /* associate with addr cam */
351 if (ret) {
352 rtw89_err(rtwdev, "failed to attach sec cam: %d\n", ret);
359 cam_info->sec_entries[sec_cam_idx] = NULL;
361 clear_bit(sec_cam_idx, cam_info->sec_cam_map);
362 if (ext_key)
363 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map);
373 const struct rtw89_chip_info *chip = rtwdev->chip;
378 switch (key->cipher) {
387 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
391 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
396 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
400 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
407 return -EOPNOTSUPP;
410 if (!chip->hw_sec_hdr)
411 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
415 if (ret) {
430 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
435 sec_cam_idx = key->hw_key_idx;
436 sec_cam = cam_info->sec_entries[sec_cam_idx];
437 if (!sec_cam)
438 return -EINVAL;
442 /* clear valid bit in addr cam will disable sec cam,
445 cam_info->sec_entries[sec_cam_idx] = NULL;
446 clear_bit(sec_cam_idx, cam_info->sec_cam_map);
447 if (sec_cam->ext_key)
448 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map);
469 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
471 addr_cam->valid = false;
472 clear_bit(addr_cam->addr_cam_idx, cam_info->addr_cam_map);
478 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
480 bssid_cam->valid = false;
481 clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map);
486 struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam;
487 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
496 ieee80211_iter_keys_rcu(rtwdev->hw, NULL, rtw89_cam_reset_key_iter, rtwdev);
503 const struct rtw89_chip_info *chip = rtwdev->chip;
504 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
505 u8 addr_cam_num = chip->acam_num;
508 idx = find_first_zero_bit(cam_info->addr_cam_map, addr_cam_num);
509 if (idx >= addr_cam_num)
510 return -EBUSY;
512 set_bit(idx, cam_info->addr_cam_map);
520 const struct rtw89_chip_info *chip = rtwdev->chip;
522 switch (chip->chip_id) {
541 if (unlikely(addr_cam->valid)) {
543 "addr cam is already valid; skip init\n");
548 if (ret) {
549 rtw89_err(rtwdev, "failed to get available addr cam\n");
553 addr_cam->addr_cam_idx = addr_cam_idx;
554 addr_cam->len = rtw89_get_addr_cam_entry_size(rtwdev);
555 addr_cam->offset = 0;
556 addr_cam->valid = true;
557 addr_cam->addr_mask = 0;
558 addr_cam->mask_sel = RTW89_NO_MSK;
559 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL;
560 bitmap_zero(addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM);
563 addr_cam->sec_ent_keyid[i] = 0;
564 addr_cam->sec_ent[i] = 0;
567 /* associate addr cam with bssid cam */
568 addr_cam->bssid_cam_idx = bssid_cam->bssid_cam_idx;
576 const struct rtw89_chip_info *chip = rtwdev->chip;
577 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
578 u8 bssid_cam_num = chip->bcam_num;
581 idx = find_first_zero_bit(cam_info->bssid_cam_map, bssid_cam_num);
582 if (idx >= bssid_cam_num)
583 return -EBUSY;
585 set_bit(idx, cam_info->bssid_cam_map);
599 if (unlikely(bssid_cam->valid)) {
601 "bssid cam is already valid; skip init\n");
606 if (ret) {
607 rtw89_err(rtwdev, "failed to get available bssid cam\n");
611 bssid_cam->bssid_cam_idx = bssid_cam_idx;
612 bssid_cam->phy_idx = rtwvif->phy_idx;
613 bssid_cam->len = BSSID_CAM_ENT_SIZE;
614 bssid_cam->offset = 0;
615 bssid_cam->valid = true;
616 ether_addr_copy(bssid_cam->bssid, bssid);
623 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
625 ether_addr_copy(bssid_cam->bssid, rtwvif->bssid);
630 struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam;
631 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
634 ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif, bssid_cam, rtwvif->bssid);
635 if (ret) {
636 rtw89_err(rtwdev, "failed to init bssid cam\n");
641 if (ret) {
642 rtw89_err(rtwdev, "failed to init addr cam\n");
655 u8 bss_color = vif->bss_conf.he_bss_color.color;
658 if (vif->bss_conf.nontransmitted)
663 FWCMD_SET_ADDR_BSSID_IDX(cmd, bssid_cam->bssid_cam_idx);
664 FWCMD_SET_ADDR_BSSID_OFFSET(cmd, bssid_cam->offset);
665 FWCMD_SET_ADDR_BSSID_LEN(cmd, bssid_cam->len);
666 FWCMD_SET_ADDR_BSSID_VALID(cmd, bssid_cam->valid);
668 FWCMD_SET_ADDR_BSSID_BB_SEL(cmd, bssid_cam->phy_idx);
671 FWCMD_SET_ADDR_BSSID_BSSID0(cmd, bssid_cam->bssid[0]);
672 FWCMD_SET_ADDR_BSSID_BSSID1(cmd, bssid_cam->bssid[1]);
673 FWCMD_SET_ADDR_BSSID_BSSID2(cmd, bssid_cam->bssid[2]);
674 FWCMD_SET_ADDR_BSSID_BSSID3(cmd, bssid_cam->bssid[3]);
675 FWCMD_SET_ADDR_BSSID_BSSID4(cmd, bssid_cam->bssid[4]);
676 FWCMD_SET_ADDR_BSSID_BSSID5(cmd, bssid_cam->bssid[5]);
701 const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif->mac_addr;
705 u8 *tma = sta ? sta->addr : rtwvif->bssid;
707 if (addr_cam->addr_mask != 0) {
708 addr_msk_start = __ffs(addr_cam->addr_mask);
709 if (addr_cam->mask_sel == RTW89_SMA)
711 else if (addr_cam->mask_sel == RTW89_TMA)
717 FWCMD_SET_ADDR_IDX(cmd, addr_cam->addr_cam_idx);
718 FWCMD_SET_ADDR_OFFSET(cmd, addr_cam->offset);
719 FWCMD_SET_ADDR_LEN(cmd, addr_cam->len);
721 FWCMD_SET_ADDR_VALID(cmd, addr_cam->valid);
722 FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif->net_type);
723 FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif->bcn_hit_cond);
724 FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif->hit_rule);
725 FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif->phy_idx);
726 FWCMD_SET_ADDR_ADDR_MASK(cmd, addr_cam->addr_mask);
727 FWCMD_SET_ADDR_MASK_SEL(cmd, addr_cam->mask_sel);
731 FWCMD_SET_ADDR_BSSID_CAM_IDX(cmd, addr_cam->bssid_cam_idx);
747 FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif->port);
748 FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif->port);
749 FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif->trigger);
750 FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif->lsig_txop);
751 FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif->tgt_ind);
752 FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif->frm_tgt_ind);
753 FWCMD_SET_ADDR_MACID(cmd, rtwsta ? rtwsta->mac_id : rtwvif->mac_id);
754 if (rtwvif->net_type == RTW89_NET_TYPE_INFRA)
755 FWCMD_SET_ADDR_AID12(cmd, vif->cfg.aid & 0xfff);
756 else if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE)
757 FWCMD_SET_ADDR_AID12(cmd, sta ? sta->aid & 0xfff : 0);
758 FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif->wowlan_pattern);
759 FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif->wowlan_uc);
760 FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif->wowlan_magic);
761 FWCMD_SET_ADDR_WAPI(cmd, addr_cam->wapi);
762 FWCMD_SET_ADDR_SEC_ENT_MODE(cmd, addr_cam->sec_ent_mode);
763 FWCMD_SET_ADDR_SEC_ENT0_KEYID(cmd, addr_cam->sec_ent_keyid[0]);
764 FWCMD_SET_ADDR_SEC_ENT1_KEYID(cmd, addr_cam->sec_ent_keyid[1]);
765 FWCMD_SET_ADDR_SEC_ENT2_KEYID(cmd, addr_cam->sec_ent_keyid[2]);
766 FWCMD_SET_ADDR_SEC_ENT3_KEYID(cmd, addr_cam->sec_ent_keyid[3]);
767 FWCMD_SET_ADDR_SEC_ENT4_KEYID(cmd, addr_cam->sec_ent_keyid[4]);
768 FWCMD_SET_ADDR_SEC_ENT5_KEYID(cmd, addr_cam->sec_ent_keyid[5]);
769 FWCMD_SET_ADDR_SEC_ENT6_KEYID(cmd, addr_cam->sec_ent_keyid[6]);
771 FWCMD_SET_ADDR_SEC_ENT_VALID(cmd, addr_cam->sec_cam_map[0] & 0xff);
772 FWCMD_SET_ADDR_SEC_ENT0(cmd, addr_cam->sec_ent[0]);
773 FWCMD_SET_ADDR_SEC_ENT1(cmd, addr_cam->sec_ent[1]);
774 FWCMD_SET_ADDR_SEC_ENT2(cmd, addr_cam->sec_ent[2]);
775 FWCMD_SET_ADDR_SEC_ENT3(cmd, addr_cam->sec_ent[3]);
776 FWCMD_SET_ADDR_SEC_ENT4(cmd, addr_cam->sec_ent[4]);
777 FWCMD_SET_ADDR_SEC_ENT5(cmd, addr_cam->sec_ent[5]);
778 FWCMD_SET_ADDR_SEC_ENT6(cmd, addr_cam->sec_ent[6]);
787 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
788 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
790 h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif->mac_id,
794 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
796 le32_encode_bits(addr_cam->sec_ent_keyid[1],
798 le32_encode_bits(addr_cam->sec_ent_keyid[2],
800 le32_encode_bits(addr_cam->sec_ent_keyid[3],
802 le32_encode_bits(addr_cam->sec_ent_keyid[4],
804 le32_encode_bits(addr_cam->sec_ent_keyid[5],
806 le32_encode_bits(addr_cam->sec_ent_keyid[6],
808 h2c->m4 = cpu_to_le32(DCTLINFO_V1_W4_SEC_ENT0_KEYID |
816 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0] & 0xff,
818 le32_encode_bits(addr_cam->sec_ent[0],
820 le32_encode_bits(addr_cam->sec_ent[1],
822 le32_encode_bits(addr_cam->sec_ent[2],
824 h2c->m5 = cpu_to_le32(DCTLINFO_V1_W5_SEC_ENT_VALID |
829 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[3],
831 le32_encode_bits(addr_cam->sec_ent[4],
833 le32_encode_bits(addr_cam->sec_ent[5],
835 le32_encode_bits(addr_cam->sec_ent[6],
837 h2c->m6 = cpu_to_le32(DCTLINFO_V1_W6_SEC_ENT3 |
842 if (rtw_wow->ptk_alg) {
843 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8,
845 h2c->m0 = cpu_to_le32(DCTLINFO_V1_W0_AES_IV_L);
847 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] |
852 h2c->m1 = cpu_to_le32(DCTLINFO_V1_W1_AES_IV_H);
854 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx,
856 h2c->m4 |= cpu_to_le32(DCTLINFO_V1_W4_SEC_KEY_ID);
866 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
867 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
869 h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif->mac_id,
873 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
875 le32_encode_bits(addr_cam->sec_ent_keyid[1],
877 le32_encode_bits(addr_cam->sec_ent_keyid[2],
879 le32_encode_bits(addr_cam->sec_ent_keyid[3],
881 le32_encode_bits(addr_cam->sec_ent_keyid[4],
883 le32_encode_bits(addr_cam->sec_ent_keyid[5],
885 le32_encode_bits(addr_cam->sec_ent_keyid[6],
887 h2c->m4 = cpu_to_le32(DCTLINFO_V2_W4_SEC_ENT0_KEYID |
895 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0],
897 le32_encode_bits(addr_cam->sec_ent[0],
899 h2c->m5 = cpu_to_le32(DCTLINFO_V2_W5_SEC_ENT_VALID_V1 |
902 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[1],
904 le32_encode_bits(addr_cam->sec_ent[2],
906 le32_encode_bits(addr_cam->sec_ent[3],
908 le32_encode_bits(addr_cam->sec_ent[4],
910 h2c->m6 = cpu_to_le32(DCTLINFO_V2_W6_SEC_ENT1_V1 |
915 h2c->w7 = le32_encode_bits(addr_cam->sec_ent[5],
917 le32_encode_bits(addr_cam->sec_ent[6],
919 h2c->m7 = cpu_to_le32(DCTLINFO_V2_W7_SEC_ENT5_V1 |
922 if (rtw_wow->ptk_alg) {
923 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8,
925 h2c->m0 = cpu_to_le32(DCTLINFO_V2_W0_AES_IV_L);
927 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] |
932 h2c->m1 = cpu_to_le32(DCTLINFO_V2_W1_AES_IV_H);
934 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx,
936 h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID);