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,const struct rtw89_sec_cam_entry * sec_cam,const 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 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
__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 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
__rtw89_cam_attach_sec_cam(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,const struct ieee80211_key_conf * key,const struct rtw89_sec_cam_entry * sec_cam)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
rtw89_cam_attach_link_sec_cam(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,u8 sec_cam_idx)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
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)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
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)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
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)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
rtw89_cam_sec_key_add(struct rtw89_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)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
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)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
rtw89_cam_reset_key_iter(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key,void * data)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
rtw89_cam_deinit_addr_cam(struct rtw89_dev * rtwdev,struct rtw89_addr_cam_entry * addr_cam)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
rtw89_cam_deinit_bssid_cam(struct rtw89_dev * rtwdev,struct rtw89_bssid_cam_entry * bssid_cam)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
rtw89_cam_deinit(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link)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
rtw89_cam_reset_keys(struct rtw89_dev * rtwdev)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
rtw89_cam_get_avail_addr_cam(struct rtw89_dev * rtwdev,u8 * addr_cam_idx)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
rtw89_get_addr_cam_entry_size(struct rtw89_dev * rtwdev)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
rtw89_cam_init_addr_cam(struct rtw89_dev * rtwdev,struct rtw89_addr_cam_entry * addr_cam,const struct rtw89_bssid_cam_entry * bssid_cam)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
rtw89_cam_get_avail_bssid_cam(struct rtw89_dev * rtwdev,u8 * bssid_cam_idx)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
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)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
rtw89_cam_bssid_changed(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link)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
rtw89_cam_init(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link)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
rtw89_cam_fill_bssid_cam_info(struct rtw89_dev * rtwdev,struct rtw89_vif_link * rtwvif_link,struct rtw89_sta_link * rtwsta_link,struct rtw89_h2c_addr_cam_v0 * h2c)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
rtw89_cam_addr_hash(u8 start,const u8 * addr)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
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,struct rtw89_h2c_addr_cam_v0 * h2c)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
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)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
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)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