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