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 *
rtw89_cam_get_sec_key_cmd(struct rtw89_dev * rtwdev,struct rtw89_sec_cam_entry * sec_cam,bool ext_key)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
rtw89_cam_send_sec_key_cmd(struct rtw89_dev * rtwdev,struct rtw89_sec_cam_entry * sec_cam)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
rtw89_cam_get_avail_sec_cam(struct rtw89_dev * rtwdev,u8 * sec_cam_idx,bool ext_key)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
rtw89_cam_get_addr_cam_key_idx(struct rtw89_addr_cam_entry * addr_cam,struct rtw89_sec_cam_entry * sec_cam,struct ieee80211_key_conf * key,u8 * key_idx)138 static int rtw89_cam_get_addr_cam_key_idx(struct rtw89_addr_cam_entry *addr_cam,
139 struct rtw89_sec_cam_entry *sec_cam,
140 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
__rtw89_cam_detach_sec_cam(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,const struct rtw89_sec_cam_entry * sec_cam,bool inform_fw)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
__rtw89_cam_attach_sec_cam(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,struct ieee80211_key_conf * key,struct rtw89_sec_cam_entry * sec_cam)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 struct ieee80211_key_conf *key,
251 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
rtw89_cam_detach_sec_cam(struct rtw89_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,const struct rtw89_sec_cam_entry * sec_cam,bool inform_fw)290 static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
291 struct ieee80211_vif *vif,
292 struct ieee80211_sta *sta,
293 const struct rtw89_sec_cam_entry *sec_cam,
294 bool inform_fw)
295 {
296 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
297 struct rtw89_sta_link *rtwsta_link;
298 struct rtw89_vif_link *rtwvif_link;
299 struct rtw89_vif *rtwvif;
300 unsigned int link_id;
301 int ret;
302
303 if (!vif) {
304 rtw89_err(rtwdev, "No iface for deleting sec cam\n");
305 return -EINVAL;
306 }
307
308 rtwvif = vif_to_rtwvif(vif);
309
310 rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
311 rtwsta_link = rtwsta ? rtwsta->links[link_id] : NULL;
312 if (rtwsta && !rtwsta_link)
313 continue;
314
315 ret = __rtw89_cam_detach_sec_cam(rtwdev, rtwvif_link, rtwsta_link,
316 sec_cam, inform_fw);
317 if (ret)
318 return ret;
319 }
320
321 return 0;
322 }
323
rtw89_cam_attach_sec_cam(struct rtw89_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key,struct rtw89_sec_cam_entry * sec_cam)324 static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
325 struct ieee80211_vif *vif,
326 struct ieee80211_sta *sta,
327 struct ieee80211_key_conf *key,
328 struct rtw89_sec_cam_entry *sec_cam)
329 {
330 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
331 struct rtw89_sta_link *rtwsta_link;
332 struct rtw89_vif_link *rtwvif_link;
333 struct rtw89_vif *rtwvif;
334 unsigned int link_id;
335 int key_link_id;
336 int ret;
337
338 if (!vif) {
339 rtw89_err(rtwdev, "No iface for adding sec cam\n");
340 return -EINVAL;
341 }
342
343 rtwvif = vif_to_rtwvif(vif);
344
345 key_link_id = ieee80211_vif_is_mld(vif) ? key->link_id : 0;
346 if (key_link_id >= 0) {
347 rtwvif_link = rtwvif->links[key_link_id];
348 rtwsta_link = rtwsta ? rtwsta->links[key_link_id] : NULL;
349
350 if (!rtwvif_link || (rtwsta && !rtwsta_link)) {
351 rtw89_err(rtwdev, "No drv link for adding sec cam\n");
352 return -ENOLINK;
353 }
354
355 return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link,
356 rtwsta_link, key, sec_cam);
357 }
358
359 /* key_link_id < 0: MLD pairwise key */
360 if (!rtwsta) {
361 rtw89_err(rtwdev, "No sta for adding MLD pairwise sec cam\n");
362 return -EINVAL;
363 }
364
365 rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
366 rtwvif_link = rtwsta_link->rtwvif_link;
367 ret = __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link,
368 rtwsta_link, key, sec_cam);
369 if (ret)
370 return ret;
371 }
372
373 return 0;
374 }
375
rtw89_cam_sec_key_install(struct rtw89_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key,u8 hw_key_type,bool ext_key)376 static int rtw89_cam_sec_key_install(struct rtw89_dev *rtwdev,
377 struct ieee80211_vif *vif,
378 struct ieee80211_sta *sta,
379 struct ieee80211_key_conf *key,
380 u8 hw_key_type, bool ext_key)
381 {
382 struct rtw89_sec_cam_entry *sec_cam = NULL;
383 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
384 u8 sec_cam_idx;
385 int ret;
386
387 /* maximum key length 256-bit */
388 if (key->keylen > 32) {
389 rtw89_err(rtwdev, "invalid sec key length %d\n", key->keylen);
390 return -EINVAL;
391 }
392
393 ret = rtw89_cam_get_avail_sec_cam(rtwdev, &sec_cam_idx, ext_key);
394 if (ret) {
395 rtw89_warn(rtwdev, "no available sec cam: %d ext: %d\n",
396 ret, ext_key);
397 return ret;
398 }
399
400 sec_cam = kzalloc(sizeof(*sec_cam), GFP_KERNEL);
401 if (!sec_cam) {
402 ret = -ENOMEM;
403 goto err_release_cam;
404 }
405
406 key->hw_key_idx = sec_cam_idx;
407 cam_info->sec_entries[sec_cam_idx] = sec_cam;
408
409 sec_cam->sec_cam_idx = sec_cam_idx;
410 sec_cam->type = hw_key_type;
411 sec_cam->len = RTW89_SEC_CAM_LEN;
412 sec_cam->ext_key = ext_key;
413 memcpy(sec_cam->key, key->key, key->keylen);
414 ret = rtw89_cam_send_sec_key_cmd(rtwdev, sec_cam);
415 if (ret) {
416 rtw89_err(rtwdev, "failed to send sec key cmd: %d\n", ret);
417 goto err_release_cam;
418 }
419
420 /* associate with addr cam */
421 ret = rtw89_cam_attach_sec_cam(rtwdev, vif, sta, key, sec_cam);
422 if (ret) {
423 rtw89_err(rtwdev, "failed to attach sec cam: %d\n", ret);
424 goto err_release_cam;
425 }
426
427 return 0;
428
429 err_release_cam:
430 cam_info->sec_entries[sec_cam_idx] = NULL;
431 kfree(sec_cam);
432 clear_bit(sec_cam_idx, cam_info->sec_cam_map);
433 if (ext_key)
434 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map);
435
436 return ret;
437 }
438
rtw89_cam_sec_key_add(struct rtw89_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)439 int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
440 struct ieee80211_vif *vif,
441 struct ieee80211_sta *sta,
442 struct ieee80211_key_conf *key)
443 {
444 const struct rtw89_chip_info *chip = rtwdev->chip;
445 u8 hw_key_type;
446 bool ext_key = false;
447 int ret;
448
449 switch (key->cipher) {
450 case WLAN_CIPHER_SUITE_WEP40:
451 rtw89_leave_ips_by_hwflags(rtwdev);
452 hw_key_type = RTW89_SEC_KEY_TYPE_WEP40;
453 break;
454 case WLAN_CIPHER_SUITE_WEP104:
455 rtw89_leave_ips_by_hwflags(rtwdev);
456 hw_key_type = RTW89_SEC_KEY_TYPE_WEP104;
457 break;
458 case WLAN_CIPHER_SUITE_CCMP:
459 hw_key_type = RTW89_SEC_KEY_TYPE_CCMP128;
460 if (!chip->hw_mgmt_tx_encrypt)
461 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
462 break;
463 case WLAN_CIPHER_SUITE_CCMP_256:
464 hw_key_type = RTW89_SEC_KEY_TYPE_CCMP256;
465 if (!chip->hw_mgmt_tx_encrypt)
466 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
467 ext_key = true;
468 break;
469 case WLAN_CIPHER_SUITE_GCMP:
470 hw_key_type = RTW89_SEC_KEY_TYPE_GCMP128;
471 if (!chip->hw_mgmt_tx_encrypt)
472 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
473 break;
474 case WLAN_CIPHER_SUITE_GCMP_256:
475 hw_key_type = RTW89_SEC_KEY_TYPE_GCMP256;
476 if (!chip->hw_mgmt_tx_encrypt)
477 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
478 ext_key = true;
479 break;
480 case WLAN_CIPHER_SUITE_AES_CMAC:
481 hw_key_type = RTW89_SEC_KEY_TYPE_BIP_CCMP128;
482 break;
483 default:
484 return -EOPNOTSUPP;
485 }
486
487 if (!chip->hw_sec_hdr)
488 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
489
490 ret = rtw89_cam_sec_key_install(rtwdev, vif, sta, key, hw_key_type,
491 ext_key);
492 if (ret) {
493 rtw89_err(rtwdev, "failed to install key type %d ext %d: %d\n",
494 hw_key_type, ext_key, ret);
495 return ret;
496 }
497
498 return 0;
499 }
500
rtw89_cam_sec_key_del(struct rtw89_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key,bool inform_fw)501 int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,
502 struct ieee80211_vif *vif,
503 struct ieee80211_sta *sta,
504 struct ieee80211_key_conf *key,
505 bool inform_fw)
506 {
507 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
508 const struct rtw89_sec_cam_entry *sec_cam;
509 u8 sec_cam_idx;
510 int ret;
511
512 sec_cam_idx = key->hw_key_idx;
513 sec_cam = cam_info->sec_entries[sec_cam_idx];
514 if (!sec_cam)
515 return -EINVAL;
516
517 ret = rtw89_cam_detach_sec_cam(rtwdev, vif, sta, sec_cam, inform_fw);
518
519 /* clear valid bit in addr cam will disable sec cam,
520 * so we don't need to send H2C command again
521 */
522 cam_info->sec_entries[sec_cam_idx] = NULL;
523 clear_bit(sec_cam_idx, cam_info->sec_cam_map);
524 if (sec_cam->ext_key)
525 clear_bit(sec_cam_idx + 1, cam_info->sec_cam_map);
526
527 kfree(sec_cam);
528
529 return ret;
530 }
531
rtw89_cam_reset_key_iter(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key,void * data)532 static void rtw89_cam_reset_key_iter(struct ieee80211_hw *hw,
533 struct ieee80211_vif *vif,
534 struct ieee80211_sta *sta,
535 struct ieee80211_key_conf *key,
536 void *data)
537 {
538 struct rtw89_dev *rtwdev = (struct rtw89_dev *)data;
539
540 rtw89_cam_sec_key_del(rtwdev, vif, sta, key, false);
541 }
542
rtw89_cam_deinit_addr_cam(struct rtw89_dev * rtwdev,struct rtw89_addr_cam_entry * addr_cam)543 void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev,
544 struct rtw89_addr_cam_entry *addr_cam)
545 {
546 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
547
548 addr_cam->valid = false;
549 clear_bit(addr_cam->addr_cam_idx, cam_info->addr_cam_map);
550 }
551
rtw89_cam_deinit_bssid_cam(struct rtw89_dev * rtwdev,struct rtw89_bssid_cam_entry * bssid_cam)552 void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev,
553 struct rtw89_bssid_cam_entry *bssid_cam)
554 {
555 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
556
557 bssid_cam->valid = false;
558 clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map);
559 }
560
rtw89_cam_deinit(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link)561 void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
562 {
563 struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam;
564 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
565
566 rtw89_cam_deinit_addr_cam(rtwdev, addr_cam);
567 rtw89_cam_deinit_bssid_cam(rtwdev, bssid_cam);
568 }
569
rtw89_cam_reset_keys(struct rtw89_dev * rtwdev)570 void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev)
571 {
572 rcu_read_lock();
573 ieee80211_iter_keys_rcu(rtwdev->hw, NULL, rtw89_cam_reset_key_iter, rtwdev);
574 rcu_read_unlock();
575 }
576
rtw89_cam_get_avail_addr_cam(struct rtw89_dev * rtwdev,u8 * addr_cam_idx)577 static int rtw89_cam_get_avail_addr_cam(struct rtw89_dev *rtwdev,
578 u8 *addr_cam_idx)
579 {
580 const struct rtw89_chip_info *chip = rtwdev->chip;
581 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
582 u8 addr_cam_num = chip->acam_num;
583 u8 idx;
584
585 idx = find_first_zero_bit(cam_info->addr_cam_map, addr_cam_num);
586 if (idx >= addr_cam_num)
587 return -EBUSY;
588
589 set_bit(idx, cam_info->addr_cam_map);
590 *addr_cam_idx = idx;
591
592 return 0;
593 }
594
rtw89_get_addr_cam_entry_size(struct rtw89_dev * rtwdev)595 static u8 rtw89_get_addr_cam_entry_size(struct rtw89_dev *rtwdev)
596 {
597 const struct rtw89_chip_info *chip = rtwdev->chip;
598
599 switch (chip->chip_id) {
600 case RTL8852A:
601 case RTL8852B:
602 case RTL8851B:
603 case RTL8852BT:
604 return ADDR_CAM_ENT_SIZE;
605 default:
606 return ADDR_CAM_ENT_SHORT_SIZE;
607 }
608 }
609
rtw89_cam_init_addr_cam(struct rtw89_dev * rtwdev,struct rtw89_addr_cam_entry * addr_cam,const struct rtw89_bssid_cam_entry * bssid_cam)610 int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev,
611 struct rtw89_addr_cam_entry *addr_cam,
612 const struct rtw89_bssid_cam_entry *bssid_cam)
613 {
614 u8 addr_cam_idx;
615 int i;
616 int ret;
617
618 if (unlikely(addr_cam->valid)) {
619 rtw89_debug(rtwdev, RTW89_DBG_FW,
620 "addr cam is already valid; skip init\n");
621 return 0;
622 }
623
624 ret = rtw89_cam_get_avail_addr_cam(rtwdev, &addr_cam_idx);
625 if (ret) {
626 rtw89_err(rtwdev, "failed to get available addr cam\n");
627 return ret;
628 }
629
630 addr_cam->addr_cam_idx = addr_cam_idx;
631 addr_cam->len = rtw89_get_addr_cam_entry_size(rtwdev);
632 addr_cam->offset = 0;
633 addr_cam->valid = true;
634 addr_cam->addr_mask = 0;
635 addr_cam->mask_sel = RTW89_NO_MSK;
636 addr_cam->sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL;
637 bitmap_zero(addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM);
638
639 for (i = 0; i < RTW89_SEC_CAM_IN_ADDR_CAM; i++) {
640 addr_cam->sec_ent_keyid[i] = 0;
641 addr_cam->sec_ent[i] = 0;
642 }
643
644 /* associate addr cam with bssid cam */
645 addr_cam->bssid_cam_idx = bssid_cam->bssid_cam_idx;
646
647 return 0;
648 }
649
rtw89_cam_get_avail_bssid_cam(struct rtw89_dev * rtwdev,u8 * bssid_cam_idx)650 static int rtw89_cam_get_avail_bssid_cam(struct rtw89_dev *rtwdev,
651 u8 *bssid_cam_idx)
652 {
653 const struct rtw89_chip_info *chip = rtwdev->chip;
654 struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
655 u8 bssid_cam_num = chip->bcam_num;
656 u8 idx;
657
658 idx = find_first_zero_bit(cam_info->bssid_cam_map, bssid_cam_num);
659 if (idx >= bssid_cam_num)
660 return -EBUSY;
661
662 set_bit(idx, cam_info->bssid_cam_map);
663 *bssid_cam_idx = idx;
664
665 return 0;
666 }
667
rtw89_cam_init_bssid_cam(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_bssid_cam_entry * bssid_cam,const u8 * bssid)668 int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
669 struct rtw89_vif_link *rtwvif_link,
670 struct rtw89_bssid_cam_entry *bssid_cam,
671 const u8 *bssid)
672 {
673 u8 bssid_cam_idx;
674 int ret;
675
676 if (unlikely(bssid_cam->valid)) {
677 rtw89_debug(rtwdev, RTW89_DBG_FW,
678 "bssid cam is already valid; skip init\n");
679 return 0;
680 }
681
682 ret = rtw89_cam_get_avail_bssid_cam(rtwdev, &bssid_cam_idx);
683 if (ret) {
684 rtw89_err(rtwdev, "failed to get available bssid cam\n");
685 return ret;
686 }
687
688 bssid_cam->bssid_cam_idx = bssid_cam_idx;
689 bssid_cam->phy_idx = rtwvif_link->phy_idx;
690 bssid_cam->len = BSSID_CAM_ENT_SIZE;
691 bssid_cam->offset = 0;
692 bssid_cam->valid = true;
693 ether_addr_copy(bssid_cam->bssid, bssid);
694
695 return 0;
696 }
697
rtw89_cam_bssid_changed(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link)698 void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
699 {
700 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
701
702 ether_addr_copy(bssid_cam->bssid, rtwvif_link->bssid);
703 }
704
rtw89_cam_init(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link)705 int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
706 {
707 struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam;
708 struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
709 int ret;
710
711 ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif_link, bssid_cam,
712 rtwvif_link->bssid);
713 if (ret) {
714 rtw89_err(rtwdev, "failed to init bssid cam\n");
715 return ret;
716 }
717
718 ret = rtw89_cam_init_addr_cam(rtwdev, addr_cam, bssid_cam);
719 if (ret) {
720 rtw89_err(rtwdev, "failed to init addr cam\n");
721 return ret;
722 }
723
724 return 0;
725 }
726
rtw89_cam_fill_bssid_cam_info(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,u8 * cmd)727 int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
728 struct rtw89_vif_link *rtwvif_link,
729 struct rtw89_sta_link *rtwsta_link, u8 *cmd)
730 {
731 struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif_link,
732 rtwsta_link);
733 struct ieee80211_bss_conf *bss_conf;
734 u8 bss_color;
735 u8 bss_mask;
736
737 rcu_read_lock();
738
739 bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, false);
740 bss_color = bss_conf->he_bss_color.color;
741
742 if (bss_conf->nontransmitted)
743 bss_mask = RTW89_BSSID_MATCH_5_BYTES;
744 else
745 bss_mask = RTW89_BSSID_MATCH_ALL;
746
747 rcu_read_unlock();
748
749 FWCMD_SET_ADDR_BSSID_IDX(cmd, bssid_cam->bssid_cam_idx);
750 FWCMD_SET_ADDR_BSSID_OFFSET(cmd, bssid_cam->offset);
751 FWCMD_SET_ADDR_BSSID_LEN(cmd, bssid_cam->len);
752 FWCMD_SET_ADDR_BSSID_VALID(cmd, bssid_cam->valid);
753 FWCMD_SET_ADDR_BSSID_MASK(cmd, bss_mask);
754 FWCMD_SET_ADDR_BSSID_BB_SEL(cmd, bssid_cam->phy_idx);
755 FWCMD_SET_ADDR_BSSID_BSS_COLOR(cmd, bss_color);
756
757 FWCMD_SET_ADDR_BSSID_BSSID0(cmd, bssid_cam->bssid[0]);
758 FWCMD_SET_ADDR_BSSID_BSSID1(cmd, bssid_cam->bssid[1]);
759 FWCMD_SET_ADDR_BSSID_BSSID2(cmd, bssid_cam->bssid[2]);
760 FWCMD_SET_ADDR_BSSID_BSSID3(cmd, bssid_cam->bssid[3]);
761 FWCMD_SET_ADDR_BSSID_BSSID4(cmd, bssid_cam->bssid[4]);
762 FWCMD_SET_ADDR_BSSID_BSSID5(cmd, bssid_cam->bssid[5]);
763
764 return 0;
765 }
766
rtw89_cam_addr_hash(u8 start,const u8 * addr)767 static u8 rtw89_cam_addr_hash(u8 start, const u8 *addr)
768 {
769 u8 hash = 0;
770 u8 i;
771
772 for (i = start; i < ETH_ALEN; i++)
773 hash ^= addr[i];
774
775 return hash;
776 }
777
rtw89_cam_fill_addr_cam_info(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,const u8 * scan_mac_addr,u8 * cmd)778 void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
779 struct rtw89_vif_link *rtwvif_link,
780 struct rtw89_sta_link *rtwsta_link,
781 const u8 *scan_mac_addr,
782 u8 *cmd)
783 {
784 struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link);
785 struct rtw89_addr_cam_entry *addr_cam =
786 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
787 struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link);
788 struct ieee80211_link_sta *link_sta;
789 const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif_link->mac_addr;
790 u8 sma_hash, tma_hash, addr_msk_start;
791 u8 sma_start = 0;
792 u8 tma_start = 0;
793 const u8 *tma;
794
795 rcu_read_lock();
796
797 if (sta) {
798 link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
799 tma = link_sta->addr;
800 } else {
801 tma = rtwvif_link->bssid;
802 }
803
804 if (addr_cam->addr_mask != 0) {
805 addr_msk_start = __ffs(addr_cam->addr_mask);
806 if (addr_cam->mask_sel == RTW89_SMA)
807 sma_start = addr_msk_start;
808 else if (addr_cam->mask_sel == RTW89_TMA)
809 tma_start = addr_msk_start;
810 }
811 sma_hash = rtw89_cam_addr_hash(sma_start, sma);
812 tma_hash = rtw89_cam_addr_hash(tma_start, tma);
813
814 FWCMD_SET_ADDR_IDX(cmd, addr_cam->addr_cam_idx);
815 FWCMD_SET_ADDR_OFFSET(cmd, addr_cam->offset);
816 FWCMD_SET_ADDR_LEN(cmd, addr_cam->len);
817
818 FWCMD_SET_ADDR_VALID(cmd, addr_cam->valid);
819 FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif_link->net_type);
820 FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif_link->bcn_hit_cond);
821 FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif_link->hit_rule);
822 FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif_link->phy_idx);
823 FWCMD_SET_ADDR_ADDR_MASK(cmd, addr_cam->addr_mask);
824 FWCMD_SET_ADDR_MASK_SEL(cmd, addr_cam->mask_sel);
825 FWCMD_SET_ADDR_SMA_HASH(cmd, sma_hash);
826 FWCMD_SET_ADDR_TMA_HASH(cmd, tma_hash);
827
828 FWCMD_SET_ADDR_BSSID_CAM_IDX(cmd, addr_cam->bssid_cam_idx);
829
830 FWCMD_SET_ADDR_SMA0(cmd, sma[0]);
831 FWCMD_SET_ADDR_SMA1(cmd, sma[1]);
832 FWCMD_SET_ADDR_SMA2(cmd, sma[2]);
833 FWCMD_SET_ADDR_SMA3(cmd, sma[3]);
834 FWCMD_SET_ADDR_SMA4(cmd, sma[4]);
835 FWCMD_SET_ADDR_SMA5(cmd, sma[5]);
836
837 FWCMD_SET_ADDR_TMA0(cmd, tma[0]);
838 FWCMD_SET_ADDR_TMA1(cmd, tma[1]);
839 FWCMD_SET_ADDR_TMA2(cmd, tma[2]);
840 FWCMD_SET_ADDR_TMA3(cmd, tma[3]);
841 FWCMD_SET_ADDR_TMA4(cmd, tma[4]);
842 FWCMD_SET_ADDR_TMA5(cmd, tma[5]);
843
844 FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif_link->port);
845 FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif_link->port);
846 FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif_link->trigger);
847 FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif_link->lsig_txop);
848 FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif_link->tgt_ind);
849 FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif_link->frm_tgt_ind);
850 FWCMD_SET_ADDR_MACID(cmd, rtwsta_link ? rtwsta_link->mac_id :
851 rtwvif_link->mac_id);
852 if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA)
853 FWCMD_SET_ADDR_AID12(cmd, vif->cfg.aid & 0xfff);
854 else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE)
855 FWCMD_SET_ADDR_AID12(cmd, sta ? sta->aid & 0xfff : 0);
856 FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif_link->wowlan_pattern);
857 FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif_link->wowlan_uc);
858 FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif_link->wowlan_magic);
859 FWCMD_SET_ADDR_WAPI(cmd, addr_cam->wapi);
860 FWCMD_SET_ADDR_SEC_ENT_MODE(cmd, addr_cam->sec_ent_mode);
861 FWCMD_SET_ADDR_SEC_ENT0_KEYID(cmd, addr_cam->sec_ent_keyid[0]);
862 FWCMD_SET_ADDR_SEC_ENT1_KEYID(cmd, addr_cam->sec_ent_keyid[1]);
863 FWCMD_SET_ADDR_SEC_ENT2_KEYID(cmd, addr_cam->sec_ent_keyid[2]);
864 FWCMD_SET_ADDR_SEC_ENT3_KEYID(cmd, addr_cam->sec_ent_keyid[3]);
865 FWCMD_SET_ADDR_SEC_ENT4_KEYID(cmd, addr_cam->sec_ent_keyid[4]);
866 FWCMD_SET_ADDR_SEC_ENT5_KEYID(cmd, addr_cam->sec_ent_keyid[5]);
867 FWCMD_SET_ADDR_SEC_ENT6_KEYID(cmd, addr_cam->sec_ent_keyid[6]);
868
869 FWCMD_SET_ADDR_SEC_ENT_VALID(cmd, addr_cam->sec_cam_map[0] & 0xff);
870 FWCMD_SET_ADDR_SEC_ENT0(cmd, addr_cam->sec_ent[0]);
871 FWCMD_SET_ADDR_SEC_ENT1(cmd, addr_cam->sec_ent[1]);
872 FWCMD_SET_ADDR_SEC_ENT2(cmd, addr_cam->sec_ent[2]);
873 FWCMD_SET_ADDR_SEC_ENT3(cmd, addr_cam->sec_ent[3]);
874 FWCMD_SET_ADDR_SEC_ENT4(cmd, addr_cam->sec_ent[4]);
875 FWCMD_SET_ADDR_SEC_ENT5(cmd, addr_cam->sec_ent[5]);
876 FWCMD_SET_ADDR_SEC_ENT6(cmd, addr_cam->sec_ent[6]);
877
878 rcu_read_unlock();
879 }
880
rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,struct rtw89_h2c_dctlinfo_ud_v1 * h2c)881 void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
882 struct rtw89_vif_link *rtwvif_link,
883 struct rtw89_sta_link *rtwsta_link,
884 struct rtw89_h2c_dctlinfo_ud_v1 *h2c)
885 {
886 struct rtw89_addr_cam_entry *addr_cam =
887 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
888 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
889 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
890
891 h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id :
892 rtwvif_link->mac_id,
893 DCTLINFO_V1_C0_MACID) |
894 le32_encode_bits(1, DCTLINFO_V1_C0_OP);
895
896 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
897 DCTLINFO_V1_W4_SEC_ENT0_KEYID) |
898 le32_encode_bits(addr_cam->sec_ent_keyid[1],
899 DCTLINFO_V1_W4_SEC_ENT1_KEYID) |
900 le32_encode_bits(addr_cam->sec_ent_keyid[2],
901 DCTLINFO_V1_W4_SEC_ENT2_KEYID) |
902 le32_encode_bits(addr_cam->sec_ent_keyid[3],
903 DCTLINFO_V1_W4_SEC_ENT3_KEYID) |
904 le32_encode_bits(addr_cam->sec_ent_keyid[4],
905 DCTLINFO_V1_W4_SEC_ENT4_KEYID) |
906 le32_encode_bits(addr_cam->sec_ent_keyid[5],
907 DCTLINFO_V1_W4_SEC_ENT5_KEYID) |
908 le32_encode_bits(addr_cam->sec_ent_keyid[6],
909 DCTLINFO_V1_W4_SEC_ENT6_KEYID);
910 h2c->m4 = cpu_to_le32(DCTLINFO_V1_W4_SEC_ENT0_KEYID |
911 DCTLINFO_V1_W4_SEC_ENT1_KEYID |
912 DCTLINFO_V1_W4_SEC_ENT2_KEYID |
913 DCTLINFO_V1_W4_SEC_ENT3_KEYID |
914 DCTLINFO_V1_W4_SEC_ENT4_KEYID |
915 DCTLINFO_V1_W4_SEC_ENT5_KEYID |
916 DCTLINFO_V1_W4_SEC_ENT6_KEYID);
917
918 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0] & 0xff,
919 DCTLINFO_V1_W5_SEC_ENT_VALID) |
920 le32_encode_bits(addr_cam->sec_ent[0],
921 DCTLINFO_V1_W5_SEC_ENT0) |
922 le32_encode_bits(addr_cam->sec_ent[1],
923 DCTLINFO_V1_W5_SEC_ENT1) |
924 le32_encode_bits(addr_cam->sec_ent[2],
925 DCTLINFO_V1_W5_SEC_ENT2);
926 h2c->m5 = cpu_to_le32(DCTLINFO_V1_W5_SEC_ENT_VALID |
927 DCTLINFO_V1_W5_SEC_ENT0 |
928 DCTLINFO_V1_W5_SEC_ENT1 |
929 DCTLINFO_V1_W5_SEC_ENT2);
930
931 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[3],
932 DCTLINFO_V1_W6_SEC_ENT3) |
933 le32_encode_bits(addr_cam->sec_ent[4],
934 DCTLINFO_V1_W6_SEC_ENT4) |
935 le32_encode_bits(addr_cam->sec_ent[5],
936 DCTLINFO_V1_W6_SEC_ENT5) |
937 le32_encode_bits(addr_cam->sec_ent[6],
938 DCTLINFO_V1_W6_SEC_ENT6);
939 h2c->m6 = cpu_to_le32(DCTLINFO_V1_W6_SEC_ENT3 |
940 DCTLINFO_V1_W6_SEC_ENT4 |
941 DCTLINFO_V1_W6_SEC_ENT5 |
942 DCTLINFO_V1_W6_SEC_ENT6);
943
944 if (rtw_wow->ptk_alg) {
945 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8,
946 DCTLINFO_V1_W0_AES_IV_L);
947 h2c->m0 = cpu_to_le32(DCTLINFO_V1_W0_AES_IV_L);
948
949 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] |
950 ptk_tx_iv[5] << 8 |
951 ptk_tx_iv[6] << 16 |
952 ptk_tx_iv[7] << 24,
953 DCTLINFO_V1_W1_AES_IV_H);
954 h2c->m1 = cpu_to_le32(DCTLINFO_V1_W1_AES_IV_H);
955
956 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx,
957 DCTLINFO_V1_W4_SEC_KEY_ID);
958 h2c->m4 |= cpu_to_le32(DCTLINFO_V1_W4_SEC_KEY_ID);
959 }
960 }
961
rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,struct rtw89_h2c_dctlinfo_ud_v2 * h2c)962 void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
963 struct rtw89_vif_link *rtwvif_link,
964 struct rtw89_sta_link *rtwsta_link,
965 struct rtw89_h2c_dctlinfo_ud_v2 *h2c)
966 {
967 struct rtw89_addr_cam_entry *addr_cam =
968 rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
969 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
970 u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
971
972 h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id :
973 rtwvif_link->mac_id,
974 DCTLINFO_V2_C0_MACID) |
975 le32_encode_bits(1, DCTLINFO_V2_C0_OP);
976
977 h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
978 DCTLINFO_V2_W4_SEC_ENT0_KEYID) |
979 le32_encode_bits(addr_cam->sec_ent_keyid[1],
980 DCTLINFO_V2_W4_SEC_ENT1_KEYID) |
981 le32_encode_bits(addr_cam->sec_ent_keyid[2],
982 DCTLINFO_V2_W4_SEC_ENT2_KEYID) |
983 le32_encode_bits(addr_cam->sec_ent_keyid[3],
984 DCTLINFO_V2_W4_SEC_ENT3_KEYID) |
985 le32_encode_bits(addr_cam->sec_ent_keyid[4],
986 DCTLINFO_V2_W4_SEC_ENT4_KEYID) |
987 le32_encode_bits(addr_cam->sec_ent_keyid[5],
988 DCTLINFO_V2_W4_SEC_ENT5_KEYID) |
989 le32_encode_bits(addr_cam->sec_ent_keyid[6],
990 DCTLINFO_V2_W4_SEC_ENT6_KEYID);
991 h2c->m4 = cpu_to_le32(DCTLINFO_V2_W4_SEC_ENT0_KEYID |
992 DCTLINFO_V2_W4_SEC_ENT1_KEYID |
993 DCTLINFO_V2_W4_SEC_ENT2_KEYID |
994 DCTLINFO_V2_W4_SEC_ENT3_KEYID |
995 DCTLINFO_V2_W4_SEC_ENT4_KEYID |
996 DCTLINFO_V2_W4_SEC_ENT5_KEYID |
997 DCTLINFO_V2_W4_SEC_ENT6_KEYID);
998
999 h2c->w5 = le32_encode_bits(addr_cam->sec_cam_map[0],
1000 DCTLINFO_V2_W5_SEC_ENT_VALID_V1) |
1001 le32_encode_bits(addr_cam->sec_ent[0],
1002 DCTLINFO_V2_W5_SEC_ENT0_V1);
1003 h2c->m5 = cpu_to_le32(DCTLINFO_V2_W5_SEC_ENT_VALID_V1 |
1004 DCTLINFO_V2_W5_SEC_ENT0_V1);
1005
1006 h2c->w6 = le32_encode_bits(addr_cam->sec_ent[1],
1007 DCTLINFO_V2_W6_SEC_ENT1_V1) |
1008 le32_encode_bits(addr_cam->sec_ent[2],
1009 DCTLINFO_V2_W6_SEC_ENT2_V1) |
1010 le32_encode_bits(addr_cam->sec_ent[3],
1011 DCTLINFO_V2_W6_SEC_ENT3_V1) |
1012 le32_encode_bits(addr_cam->sec_ent[4],
1013 DCTLINFO_V2_W6_SEC_ENT4_V1);
1014 h2c->m6 = cpu_to_le32(DCTLINFO_V2_W6_SEC_ENT1_V1 |
1015 DCTLINFO_V2_W6_SEC_ENT2_V1 |
1016 DCTLINFO_V2_W6_SEC_ENT3_V1 |
1017 DCTLINFO_V2_W6_SEC_ENT4_V1);
1018
1019 h2c->w7 = le32_encode_bits(addr_cam->sec_ent[5],
1020 DCTLINFO_V2_W7_SEC_ENT5_V1) |
1021 le32_encode_bits(addr_cam->sec_ent[6],
1022 DCTLINFO_V2_W7_SEC_ENT6_V1);
1023 h2c->m7 = cpu_to_le32(DCTLINFO_V2_W7_SEC_ENT5_V1 |
1024 DCTLINFO_V2_W7_SEC_ENT6_V1);
1025
1026 if (rtw_wow->ptk_alg) {
1027 h2c->w0 = le32_encode_bits(ptk_tx_iv[0] | ptk_tx_iv[1] << 8,
1028 DCTLINFO_V2_W0_AES_IV_L);
1029 h2c->m0 = cpu_to_le32(DCTLINFO_V2_W0_AES_IV_L);
1030
1031 h2c->w1 = le32_encode_bits(ptk_tx_iv[4] |
1032 ptk_tx_iv[5] << 8 |
1033 ptk_tx_iv[6] << 16 |
1034 ptk_tx_iv[7] << 24,
1035 DCTLINFO_V2_W1_AES_IV_H);
1036 h2c->m1 = cpu_to_le32(DCTLINFO_V2_W1_AES_IV_H);
1037
1038 h2c->w4 |= le32_encode_bits(rtw_wow->ptk_keyidx,
1039 DCTLINFO_V2_W4_SEC_KEY_ID);
1040 h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID);
1041 }
1042 }
1043