xref: /linux/drivers/net/wireless/realtek/rtw88/fw.c (revision 7bb377107c72a40ab7505341f8626c8eb79a0cb7)
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019  Realtek Corporation
3  */
4 
5 #include <linux/iopoll.h>
6 
7 #include "main.h"
8 #include "coex.h"
9 #include "fw.h"
10 #include "tx.h"
11 #include "reg.h"
12 #include "sec.h"
13 #include "debug.h"
14 #include "util.h"
15 #include "wow.h"
16 
17 static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev *rtwdev,
18 				      struct sk_buff *skb)
19 {
20 	struct rtw_c2h_cmd *c2h;
21 	u8 sub_cmd_id;
22 
23 	c2h = get_c2h_from_skb(skb);
24 	sub_cmd_id = c2h->payload[0];
25 
26 	switch (sub_cmd_id) {
27 	case C2H_CCX_RPT:
28 		rtw_tx_report_handle(rtwdev, skb, C2H_CCX_RPT);
29 		break;
30 	default:
31 		break;
32 	}
33 }
34 
35 static u16 get_max_amsdu_len(u32 bit_rate)
36 {
37 	/* lower than ofdm, do not aggregate */
38 	if (bit_rate < 550)
39 		return 1;
40 
41 	/* lower than 20M 2ss mcs8, make it small */
42 	if (bit_rate < 1800)
43 		return 1200;
44 
45 	/* lower than 40M 2ss mcs9, make it medium */
46 	if (bit_rate < 4000)
47 		return 2600;
48 
49 	/* not yet 80M 2ss mcs8/9, make it twice regular packet size */
50 	if (bit_rate < 7000)
51 		return 3500;
52 
53 	/* unlimited */
54 	return 0;
55 }
56 
57 struct rtw_fw_iter_ra_data {
58 	struct rtw_dev *rtwdev;
59 	u8 *payload;
60 };
61 
62 static void rtw_fw_ra_report_iter(void *data, struct ieee80211_sta *sta)
63 {
64 	struct rtw_fw_iter_ra_data *ra_data = data;
65 	struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
66 	u8 mac_id, rate, sgi, bw;
67 	u8 mcs, nss;
68 	u32 bit_rate;
69 
70 	mac_id = GET_RA_REPORT_MACID(ra_data->payload);
71 	if (si->mac_id != mac_id)
72 		return;
73 
74 	si->ra_report.txrate.flags = 0;
75 
76 	rate = GET_RA_REPORT_RATE(ra_data->payload);
77 	sgi = GET_RA_REPORT_SGI(ra_data->payload);
78 	bw = GET_RA_REPORT_BW(ra_data->payload);
79 
80 	if (rate < DESC_RATEMCS0) {
81 		si->ra_report.txrate.legacy = rtw_desc_to_bitrate(rate);
82 		goto legacy;
83 	}
84 
85 	rtw_desc_to_mcsrate(rate, &mcs, &nss);
86 	if (rate >= DESC_RATEVHT1SS_MCS0)
87 		si->ra_report.txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
88 	else if (rate >= DESC_RATEMCS0)
89 		si->ra_report.txrate.flags |= RATE_INFO_FLAGS_MCS;
90 
91 	if (rate >= DESC_RATEMCS0) {
92 		si->ra_report.txrate.mcs = mcs;
93 		si->ra_report.txrate.nss = nss;
94 	}
95 
96 	if (sgi)
97 		si->ra_report.txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
98 
99 	if (bw == RTW_CHANNEL_WIDTH_80)
100 		si->ra_report.txrate.bw = RATE_INFO_BW_80;
101 	else if (bw == RTW_CHANNEL_WIDTH_40)
102 		si->ra_report.txrate.bw = RATE_INFO_BW_40;
103 	else
104 		si->ra_report.txrate.bw = RATE_INFO_BW_20;
105 
106 legacy:
107 	bit_rate = cfg80211_calculate_bitrate(&si->ra_report.txrate);
108 
109 	si->ra_report.desc_rate = rate;
110 	si->ra_report.bit_rate = bit_rate;
111 
112 	sta->max_rc_amsdu_len = get_max_amsdu_len(bit_rate);
113 }
114 
115 static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload,
116 				    u8 length)
117 {
118 	struct rtw_fw_iter_ra_data ra_data;
119 
120 	if (WARN(length < 7, "invalid ra report c2h length\n"))
121 		return;
122 
123 	rtwdev->dm_info.tx_rate = GET_RA_REPORT_RATE(payload);
124 	ra_data.rtwdev = rtwdev;
125 	ra_data.payload = payload;
126 	rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data);
127 }
128 
129 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
130 {
131 	struct rtw_c2h_cmd *c2h;
132 	u32 pkt_offset;
133 	u8 len;
134 
135 	pkt_offset = *((u32 *)skb->cb);
136 	c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset);
137 	len = skb->len - pkt_offset - 2;
138 
139 	mutex_lock(&rtwdev->mutex);
140 
141 	if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags))
142 		goto unlock;
143 
144 	switch (c2h->id) {
145 	case C2H_CCX_TX_RPT:
146 		rtw_tx_report_handle(rtwdev, skb, C2H_CCX_TX_RPT);
147 		break;
148 	case C2H_BT_INFO:
149 		rtw_coex_bt_info_notify(rtwdev, c2h->payload, len);
150 		break;
151 	case C2H_WLAN_INFO:
152 		rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len);
153 		break;
154 	case C2H_HALMAC:
155 		rtw_fw_c2h_cmd_handle_ext(rtwdev, skb);
156 		break;
157 	case C2H_RA_RPT:
158 		rtw_fw_ra_report_handle(rtwdev, c2h->payload, len);
159 		break;
160 	default:
161 		rtw_dbg(rtwdev, RTW_DBG_FW, "C2H 0x%x isn't handled\n", c2h->id);
162 		break;
163 	}
164 
165 unlock:
166 	mutex_unlock(&rtwdev->mutex);
167 }
168 
169 void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
170 			       struct sk_buff *skb)
171 {
172 	struct rtw_c2h_cmd *c2h;
173 	u8 len;
174 
175 	c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset);
176 	len = skb->len - pkt_offset - 2;
177 	*((u32 *)skb->cb) = pkt_offset;
178 
179 	rtw_dbg(rtwdev, RTW_DBG_FW, "recv C2H, id=0x%02x, seq=0x%02x, len=%d\n",
180 		c2h->id, c2h->seq, len);
181 
182 	switch (c2h->id) {
183 	case C2H_BT_MP_INFO:
184 		rtw_coex_info_response(rtwdev, skb);
185 		break;
186 	default:
187 		/* pass offset for further operation */
188 		*((u32 *)skb->cb) = pkt_offset;
189 		skb_queue_tail(&rtwdev->c2h_queue, skb);
190 		ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work);
191 		break;
192 	}
193 }
194 EXPORT_SYMBOL(rtw_fw_c2h_cmd_rx_irqsafe);
195 
196 static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
197 				    u8 *h2c)
198 {
199 	u8 box;
200 	u8 box_state;
201 	u32 box_reg, box_ex_reg;
202 	int idx;
203 	int ret;
204 
205 	rtw_dbg(rtwdev, RTW_DBG_FW,
206 		"send H2C content %02x%02x%02x%02x %02x%02x%02x%02x\n",
207 		h2c[3], h2c[2], h2c[1], h2c[0],
208 		h2c[7], h2c[6], h2c[5], h2c[4]);
209 
210 	spin_lock(&rtwdev->h2c.lock);
211 
212 	box = rtwdev->h2c.last_box_num;
213 	switch (box) {
214 	case 0:
215 		box_reg = REG_HMEBOX0;
216 		box_ex_reg = REG_HMEBOX0_EX;
217 		break;
218 	case 1:
219 		box_reg = REG_HMEBOX1;
220 		box_ex_reg = REG_HMEBOX1_EX;
221 		break;
222 	case 2:
223 		box_reg = REG_HMEBOX2;
224 		box_ex_reg = REG_HMEBOX2_EX;
225 		break;
226 	case 3:
227 		box_reg = REG_HMEBOX3;
228 		box_ex_reg = REG_HMEBOX3_EX;
229 		break;
230 	default:
231 		WARN(1, "invalid h2c mail box number\n");
232 		goto out;
233 	}
234 
235 	ret = read_poll_timeout_atomic(rtw_read8, box_state,
236 				       !((box_state >> box) & 0x1), 100, 3000,
237 				       false, rtwdev, REG_HMETFR);
238 
239 	if (ret) {
240 		rtw_err(rtwdev, "failed to send h2c command\n");
241 		goto out;
242 	}
243 
244 	for (idx = 0; idx < 4; idx++)
245 		rtw_write8(rtwdev, box_reg + idx, h2c[idx]);
246 	for (idx = 0; idx < 4; idx++)
247 		rtw_write8(rtwdev, box_ex_reg + idx, h2c[idx + 4]);
248 
249 	if (++rtwdev->h2c.last_box_num >= 4)
250 		rtwdev->h2c.last_box_num = 0;
251 
252 out:
253 	spin_unlock(&rtwdev->h2c.lock);
254 }
255 
256 static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt)
257 {
258 	int ret;
259 
260 	spin_lock(&rtwdev->h2c.lock);
261 
262 	FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq);
263 	ret = rtw_hci_write_data_h2c(rtwdev, h2c_pkt, H2C_PKT_SIZE);
264 	if (ret)
265 		rtw_err(rtwdev, "failed to send h2c packet\n");
266 	rtwdev->h2c.seq++;
267 
268 	spin_unlock(&rtwdev->h2c.lock);
269 }
270 
271 void
272 rtw_fw_send_general_info(struct rtw_dev *rtwdev)
273 {
274 	struct rtw_fifo_conf *fifo = &rtwdev->fifo;
275 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
276 	u16 total_size = H2C_PKT_HDR_SIZE + 4;
277 
278 	if (rtw_chip_wcpu_11n(rtwdev))
279 		return;
280 
281 	rtw_h2c_pkt_set_header(h2c_pkt, H2C_PKT_GENERAL_INFO);
282 
283 	SET_PKT_H2C_TOTAL_LEN(h2c_pkt, total_size);
284 
285 	GENERAL_INFO_SET_FW_TX_BOUNDARY(h2c_pkt,
286 					fifo->rsvd_fw_txbuf_addr -
287 					fifo->rsvd_boundary);
288 
289 	rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
290 }
291 
292 void
293 rtw_fw_send_phydm_info(struct rtw_dev *rtwdev)
294 {
295 	struct rtw_hal *hal = &rtwdev->hal;
296 	struct rtw_efuse *efuse = &rtwdev->efuse;
297 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
298 	u16 total_size = H2C_PKT_HDR_SIZE + 8;
299 	u8 fw_rf_type = 0;
300 
301 	if (rtw_chip_wcpu_11n(rtwdev))
302 		return;
303 
304 	if (hal->rf_type == RF_1T1R)
305 		fw_rf_type = FW_RF_1T1R;
306 	else if (hal->rf_type == RF_2T2R)
307 		fw_rf_type = FW_RF_2T2R;
308 
309 	rtw_h2c_pkt_set_header(h2c_pkt, H2C_PKT_PHYDM_INFO);
310 
311 	SET_PKT_H2C_TOTAL_LEN(h2c_pkt, total_size);
312 	PHYDM_INFO_SET_REF_TYPE(h2c_pkt, efuse->rfe_option);
313 	PHYDM_INFO_SET_RF_TYPE(h2c_pkt, fw_rf_type);
314 	PHYDM_INFO_SET_CUT_VER(h2c_pkt, hal->cut_version);
315 	PHYDM_INFO_SET_RX_ANT_STATUS(h2c_pkt, hal->antenna_tx);
316 	PHYDM_INFO_SET_TX_ANT_STATUS(h2c_pkt, hal->antenna_rx);
317 
318 	rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
319 }
320 
321 void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para)
322 {
323 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
324 	u16 total_size = H2C_PKT_HDR_SIZE + 1;
325 
326 	rtw_h2c_pkt_set_header(h2c_pkt, H2C_PKT_IQK);
327 	SET_PKT_H2C_TOTAL_LEN(h2c_pkt, total_size);
328 	IQK_SET_CLEAR(h2c_pkt, para->clear);
329 	IQK_SET_SEGMENT_IQK(h2c_pkt, para->segment_iqk);
330 
331 	rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
332 }
333 
334 void rtw_fw_query_bt_info(struct rtw_dev *rtwdev)
335 {
336 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
337 
338 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_QUERY_BT_INFO);
339 
340 	SET_QUERY_BT_INFO(h2c_pkt, true);
341 
342 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
343 }
344 
345 void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw)
346 {
347 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
348 
349 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_WL_CH_INFO);
350 
351 	SET_WL_CH_INFO_LINK(h2c_pkt, link);
352 	SET_WL_CH_INFO_CHNL(h2c_pkt, ch);
353 	SET_WL_CH_INFO_BW(h2c_pkt, bw);
354 
355 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
356 }
357 
358 void rtw_fw_query_bt_mp_info(struct rtw_dev *rtwdev,
359 			     struct rtw_coex_info_req *req)
360 {
361 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
362 
363 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_QUERY_BT_MP_INFO);
364 
365 	SET_BT_MP_INFO_SEQ(h2c_pkt, req->seq);
366 	SET_BT_MP_INFO_OP_CODE(h2c_pkt, req->op_code);
367 	SET_BT_MP_INFO_PARA1(h2c_pkt, req->para1);
368 	SET_BT_MP_INFO_PARA2(h2c_pkt, req->para2);
369 	SET_BT_MP_INFO_PARA3(h2c_pkt, req->para3);
370 
371 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
372 }
373 
374 void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl)
375 {
376 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
377 	u8 index = 0 - bt_pwr_dec_lvl;
378 
379 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_FORCE_BT_TX_POWER);
380 
381 	SET_BT_TX_POWER_INDEX(h2c_pkt, index);
382 
383 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
384 }
385 
386 void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable)
387 {
388 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
389 
390 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_IGNORE_WLAN_ACTION);
391 
392 	SET_IGNORE_WLAN_ACTION_EN(h2c_pkt, enable);
393 
394 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
395 }
396 
397 void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev,
398 			   u8 para1, u8 para2, u8 para3, u8 para4, u8 para5)
399 {
400 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
401 
402 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_COEX_TDMA_TYPE);
403 
404 	SET_COEX_TDMA_TYPE_PARA1(h2c_pkt, para1);
405 	SET_COEX_TDMA_TYPE_PARA2(h2c_pkt, para2);
406 	SET_COEX_TDMA_TYPE_PARA3(h2c_pkt, para3);
407 	SET_COEX_TDMA_TYPE_PARA4(h2c_pkt, para4);
408 	SET_COEX_TDMA_TYPE_PARA5(h2c_pkt, para5);
409 
410 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
411 }
412 
413 void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data)
414 {
415 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
416 
417 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BT_WIFI_CONTROL);
418 
419 	SET_BT_WIFI_CONTROL_OP_CODE(h2c_pkt, op_code);
420 
421 	SET_BT_WIFI_CONTROL_DATA1(h2c_pkt, *data);
422 	SET_BT_WIFI_CONTROL_DATA2(h2c_pkt, *(data + 1));
423 	SET_BT_WIFI_CONTROL_DATA3(h2c_pkt, *(data + 2));
424 	SET_BT_WIFI_CONTROL_DATA4(h2c_pkt, *(data + 3));
425 	SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, *(data + 4));
426 
427 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
428 }
429 
430 void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
431 {
432 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
433 	u8 rssi = ewma_rssi_read(&si->avg_rssi);
434 	bool stbc_en = si->stbc_en ? true : false;
435 
436 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RSSI_MONITOR);
437 
438 	SET_RSSI_INFO_MACID(h2c_pkt, si->mac_id);
439 	SET_RSSI_INFO_RSSI(h2c_pkt, rssi);
440 	SET_RSSI_INFO_STBC(h2c_pkt, stbc_en);
441 
442 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
443 }
444 
445 void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
446 {
447 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
448 	bool no_update = si->updated;
449 	bool disable_pt = true;
450 
451 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO);
452 
453 	SET_RA_INFO_MACID(h2c_pkt, si->mac_id);
454 	SET_RA_INFO_RATE_ID(h2c_pkt, si->rate_id);
455 	SET_RA_INFO_INIT_RA_LVL(h2c_pkt, si->init_ra_lv);
456 	SET_RA_INFO_SGI_EN(h2c_pkt, si->sgi_enable);
457 	SET_RA_INFO_BW_MODE(h2c_pkt, si->bw_mode);
458 	SET_RA_INFO_LDPC(h2c_pkt, si->ldpc_en);
459 	SET_RA_INFO_NO_UPDATE(h2c_pkt, no_update);
460 	SET_RA_INFO_VHT_EN(h2c_pkt, si->vht_enable);
461 	SET_RA_INFO_DIS_PT(h2c_pkt, disable_pt);
462 	SET_RA_INFO_RA_MASK0(h2c_pkt, (si->ra_mask & 0xff));
463 	SET_RA_INFO_RA_MASK1(h2c_pkt, (si->ra_mask & 0xff00) >> 8);
464 	SET_RA_INFO_RA_MASK2(h2c_pkt, (si->ra_mask & 0xff0000) >> 16);
465 	SET_RA_INFO_RA_MASK3(h2c_pkt, (si->ra_mask & 0xff000000) >> 24);
466 
467 	si->init_ra_lv = 0;
468 	si->updated = true;
469 
470 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
471 }
472 
473 void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool connect)
474 {
475 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
476 
477 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_MEDIA_STATUS_RPT);
478 	MEDIA_STATUS_RPT_SET_OP_MODE(h2c_pkt, connect);
479 	MEDIA_STATUS_RPT_SET_MACID(h2c_pkt, mac_id);
480 
481 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
482 }
483 
484 void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev)
485 {
486 	struct rtw_lps_conf *conf = &rtwdev->lps_conf;
487 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
488 
489 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_SET_PWR_MODE);
490 
491 	SET_PWR_MODE_SET_MODE(h2c_pkt, conf->mode);
492 	SET_PWR_MODE_SET_RLBM(h2c_pkt, conf->rlbm);
493 	SET_PWR_MODE_SET_SMART_PS(h2c_pkt, conf->smart_ps);
494 	SET_PWR_MODE_SET_AWAKE_INTERVAL(h2c_pkt, conf->awake_interval);
495 	SET_PWR_MODE_SET_PORT_ID(h2c_pkt, conf->port_id);
496 	SET_PWR_MODE_SET_PWR_STATE(h2c_pkt, conf->state);
497 
498 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
499 }
500 
501 void rtw_fw_set_keep_alive_cmd(struct rtw_dev *rtwdev, bool enable)
502 {
503 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
504 	struct rtw_fw_wow_keep_alive_para mode = {
505 		.adopt = true,
506 		.pkt_type = KEEP_ALIVE_NULL_PKT,
507 		.period = 5,
508 	};
509 
510 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_KEEP_ALIVE);
511 	SET_KEEP_ALIVE_ENABLE(h2c_pkt, enable);
512 	SET_KEEP_ALIVE_ADOPT(h2c_pkt, mode.adopt);
513 	SET_KEEP_ALIVE_PKT_TYPE(h2c_pkt, mode.pkt_type);
514 	SET_KEEP_ALIVE_CHECK_PERIOD(h2c_pkt, mode.period);
515 
516 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
517 }
518 
519 void rtw_fw_set_disconnect_decision_cmd(struct rtw_dev *rtwdev, bool enable)
520 {
521 	struct rtw_wow_param *rtw_wow = &rtwdev->wow;
522 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
523 	struct rtw_fw_wow_disconnect_para mode = {
524 		.adopt = true,
525 		.period = 30,
526 		.retry_count = 5,
527 	};
528 
529 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_DISCONNECT_DECISION);
530 
531 	if (test_bit(RTW_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) {
532 		SET_DISCONNECT_DECISION_ENABLE(h2c_pkt, enable);
533 		SET_DISCONNECT_DECISION_ADOPT(h2c_pkt, mode.adopt);
534 		SET_DISCONNECT_DECISION_CHECK_PERIOD(h2c_pkt, mode.period);
535 		SET_DISCONNECT_DECISION_TRY_PKT_NUM(h2c_pkt, mode.retry_count);
536 	}
537 
538 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
539 }
540 
541 void rtw_fw_set_wowlan_ctrl_cmd(struct rtw_dev *rtwdev, bool enable)
542 {
543 	struct rtw_wow_param *rtw_wow = &rtwdev->wow;
544 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
545 
546 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_WOWLAN);
547 
548 	SET_WOWLAN_FUNC_ENABLE(h2c_pkt, enable);
549 	if (rtw_wow_mgd_linked(rtwdev)) {
550 		if (test_bit(RTW_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags))
551 			SET_WOWLAN_MAGIC_PKT_ENABLE(h2c_pkt, enable);
552 		if (test_bit(RTW_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags))
553 			SET_WOWLAN_DEAUTH_WAKEUP_ENABLE(h2c_pkt, enable);
554 		if (test_bit(RTW_WOW_FLAG_EN_REKEY_PKT, rtw_wow->flags))
555 			SET_WOWLAN_REKEY_WAKEUP_ENABLE(h2c_pkt, enable);
556 		if (rtw_wow->pattern_cnt)
557 			SET_WOWLAN_PATTERN_MATCH_ENABLE(h2c_pkt, enable);
558 	}
559 
560 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
561 }
562 
563 void rtw_fw_set_aoac_global_info_cmd(struct rtw_dev *rtwdev,
564 				     u8 pairwise_key_enc,
565 				     u8 group_key_enc)
566 {
567 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
568 
569 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_AOAC_GLOBAL_INFO);
570 
571 	SET_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(h2c_pkt, pairwise_key_enc);
572 	SET_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(h2c_pkt, group_key_enc);
573 
574 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
575 }
576 
577 void rtw_fw_set_remote_wake_ctrl_cmd(struct rtw_dev *rtwdev, bool enable)
578 {
579 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
580 
581 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_REMOTE_WAKE_CTRL);
582 
583 	SET_REMOTE_WAKECTRL_ENABLE(h2c_pkt, enable);
584 
585 	if (rtw_wow_no_link(rtwdev))
586 		SET_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(h2c_pkt, enable);
587 
588 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
589 }
590 
591 static u8 rtw_get_rsvd_page_location(struct rtw_dev *rtwdev,
592 				     enum rtw_rsvd_packet_type type)
593 {
594 	struct rtw_rsvd_page *rsvd_pkt;
595 	u8 location = 0;
596 
597 	list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) {
598 		if (type == rsvd_pkt->type)
599 			location = rsvd_pkt->page;
600 	}
601 
602 	return location;
603 }
604 
605 void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable)
606 {
607 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
608 	u8 loc_nlo;
609 
610 	loc_nlo = rtw_get_rsvd_page_location(rtwdev, RSVD_NLO_INFO);
611 
612 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_NLO_INFO);
613 
614 	SET_NLO_FUN_EN(h2c_pkt, enable);
615 	if (enable) {
616 		if (rtw_fw_lps_deep_mode)
617 			SET_NLO_PS_32K(h2c_pkt, enable);
618 		SET_NLO_IGNORE_SECURITY(h2c_pkt, enable);
619 		SET_NLO_LOC_NLO_INFO(h2c_pkt, loc_nlo);
620 	}
621 
622 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
623 }
624 
625 void rtw_fw_set_pg_info(struct rtw_dev *rtwdev)
626 {
627 	struct rtw_lps_conf *conf = &rtwdev->lps_conf;
628 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
629 	u8 loc_pg, loc_dpk;
630 
631 	loc_pg = rtw_get_rsvd_page_location(rtwdev, RSVD_LPS_PG_INFO);
632 	loc_dpk = rtw_get_rsvd_page_location(rtwdev, RSVD_LPS_PG_DPK);
633 
634 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_LPS_PG_INFO);
635 
636 	LPS_PG_INFO_LOC(h2c_pkt, loc_pg);
637 	LPS_PG_DPK_LOC(h2c_pkt, loc_dpk);
638 	LPS_PG_SEC_CAM_EN(h2c_pkt, conf->sec_cam_backup);
639 	LPS_PG_PATTERN_CAM_EN(h2c_pkt, conf->pattern_cam_backup);
640 
641 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
642 }
643 
644 static u8 rtw_get_rsvd_page_probe_req_location(struct rtw_dev *rtwdev,
645 					       struct cfg80211_ssid *ssid)
646 {
647 	struct rtw_rsvd_page *rsvd_pkt;
648 	u8 location = 0;
649 
650 	list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) {
651 		if (rsvd_pkt->type != RSVD_PROBE_REQ)
652 			continue;
653 		if ((!ssid && !rsvd_pkt->ssid) ||
654 		    rtw_ssid_equal(rsvd_pkt->ssid, ssid))
655 			location = rsvd_pkt->page;
656 	}
657 
658 	return location;
659 }
660 
661 static u16 rtw_get_rsvd_page_probe_req_size(struct rtw_dev *rtwdev,
662 					    struct cfg80211_ssid *ssid)
663 {
664 	struct rtw_rsvd_page *rsvd_pkt;
665 	u16 size = 0;
666 
667 	list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) {
668 		if (rsvd_pkt->type != RSVD_PROBE_REQ)
669 			continue;
670 		if ((!ssid && !rsvd_pkt->ssid) ||
671 		    rtw_ssid_equal(rsvd_pkt->ssid, ssid))
672 			size = rsvd_pkt->skb->len;
673 	}
674 
675 	return size;
676 }
677 
678 void rtw_send_rsvd_page_h2c(struct rtw_dev *rtwdev)
679 {
680 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
681 	u8 location = 0;
682 
683 	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RSVD_PAGE);
684 
685 	location = rtw_get_rsvd_page_location(rtwdev, RSVD_PROBE_RESP);
686 	*(h2c_pkt + 1) = location;
687 	rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_PROBE_RESP loc: %d\n", location);
688 
689 	location = rtw_get_rsvd_page_location(rtwdev, RSVD_PS_POLL);
690 	*(h2c_pkt + 2) = location;
691 	rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_PS_POLL loc: %d\n", location);
692 
693 	location = rtw_get_rsvd_page_location(rtwdev, RSVD_NULL);
694 	*(h2c_pkt + 3) = location;
695 	rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_NULL loc: %d\n", location);
696 
697 	location = rtw_get_rsvd_page_location(rtwdev, RSVD_QOS_NULL);
698 	*(h2c_pkt + 4) = location;
699 	rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_QOS_NULL loc: %d\n", location);
700 
701 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
702 }
703 
704 static struct sk_buff *rtw_nlo_info_get(struct ieee80211_hw *hw)
705 {
706 	struct rtw_dev *rtwdev = hw->priv;
707 	struct rtw_chip_info *chip = rtwdev->chip;
708 	struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req;
709 	struct rtw_nlo_info_hdr *nlo_hdr;
710 	struct cfg80211_ssid *ssid;
711 	struct sk_buff *skb;
712 	u8 *pos, loc;
713 	u32 size;
714 	int i;
715 
716 	if (!pno_req->inited || !pno_req->match_set_cnt)
717 		return NULL;
718 
719 	size = sizeof(struct rtw_nlo_info_hdr) + pno_req->match_set_cnt *
720 		      IEEE80211_MAX_SSID_LEN + chip->tx_pkt_desc_sz;
721 
722 	skb = alloc_skb(size, GFP_KERNEL);
723 	if (!skb)
724 		return NULL;
725 
726 	skb_reserve(skb, chip->tx_pkt_desc_sz);
727 
728 	nlo_hdr = skb_put_zero(skb, sizeof(struct rtw_nlo_info_hdr));
729 
730 	nlo_hdr->nlo_count = pno_req->match_set_cnt;
731 	nlo_hdr->hidden_ap_count = pno_req->match_set_cnt;
732 
733 	/* pattern check for firmware */
734 	memset(nlo_hdr->pattern_check, 0xA5, FW_NLO_INFO_CHECK_SIZE);
735 
736 	for (i = 0; i < pno_req->match_set_cnt; i++)
737 		nlo_hdr->ssid_len[i] = pno_req->match_sets[i].ssid.ssid_len;
738 
739 	for (i = 0; i < pno_req->match_set_cnt; i++) {
740 		ssid = &pno_req->match_sets[i].ssid;
741 		loc  = rtw_get_rsvd_page_probe_req_location(rtwdev, ssid);
742 		if (!loc) {
743 			rtw_err(rtwdev, "failed to get probe req rsvd loc\n");
744 			kfree_skb(skb);
745 			return NULL;
746 		}
747 		nlo_hdr->location[i] = loc;
748 	}
749 
750 	for (i = 0; i < pno_req->match_set_cnt; i++) {
751 		pos = skb_put_zero(skb, IEEE80211_MAX_SSID_LEN);
752 		memcpy(pos, pno_req->match_sets[i].ssid.ssid,
753 		       pno_req->match_sets[i].ssid.ssid_len);
754 	}
755 
756 	return skb;
757 }
758 
759 static struct sk_buff *rtw_cs_channel_info_get(struct ieee80211_hw *hw)
760 {
761 	struct rtw_dev *rtwdev = hw->priv;
762 	struct rtw_chip_info *chip = rtwdev->chip;
763 	struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req;
764 	struct ieee80211_channel *channels = pno_req->channels;
765 	struct sk_buff *skb;
766 	int count =  pno_req->channel_cnt;
767 	u8 *pos;
768 	int i = 0;
769 
770 	skb = alloc_skb(4 * count + chip->tx_pkt_desc_sz, GFP_KERNEL);
771 	if (!skb)
772 		return NULL;
773 
774 	skb_reserve(skb, chip->tx_pkt_desc_sz);
775 
776 	for (i = 0; i < count; i++) {
777 		pos = skb_put_zero(skb, 4);
778 
779 		CHSW_INFO_SET_CH(pos, channels[i].hw_value);
780 
781 		if (channels[i].flags & IEEE80211_CHAN_RADAR)
782 			CHSW_INFO_SET_ACTION_ID(pos, 0);
783 		else
784 			CHSW_INFO_SET_ACTION_ID(pos, 1);
785 		CHSW_INFO_SET_TIMEOUT(pos, 1);
786 		CHSW_INFO_SET_PRI_CH_IDX(pos, 1);
787 		CHSW_INFO_SET_BW(pos, 0);
788 	}
789 
790 	return skb;
791 }
792 
793 static struct sk_buff *rtw_lps_pg_dpk_get(struct ieee80211_hw *hw)
794 {
795 	struct rtw_dev *rtwdev = hw->priv;
796 	struct rtw_chip_info *chip = rtwdev->chip;
797 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
798 	struct rtw_lps_pg_dpk_hdr *dpk_hdr;
799 	struct sk_buff *skb;
800 	u32 size;
801 
802 	size = chip->tx_pkt_desc_sz + sizeof(*dpk_hdr);
803 	skb = alloc_skb(size, GFP_KERNEL);
804 	if (!skb)
805 		return NULL;
806 
807 	skb_reserve(skb, chip->tx_pkt_desc_sz);
808 	dpk_hdr = skb_put_zero(skb, sizeof(*dpk_hdr));
809 	dpk_hdr->dpk_ch = dpk_info->dpk_ch;
810 	dpk_hdr->dpk_path_ok = dpk_info->dpk_path_ok[0];
811 	memcpy(dpk_hdr->dpk_txagc, dpk_info->dpk_txagc, 2);
812 	memcpy(dpk_hdr->dpk_gs, dpk_info->dpk_gs, 4);
813 	memcpy(dpk_hdr->coef, dpk_info->coef, 160);
814 
815 	return skb;
816 }
817 
818 static struct sk_buff *rtw_lps_pg_info_get(struct ieee80211_hw *hw)
819 {
820 	struct rtw_dev *rtwdev = hw->priv;
821 	struct rtw_chip_info *chip = rtwdev->chip;
822 	struct rtw_lps_conf *conf = &rtwdev->lps_conf;
823 	struct rtw_lps_pg_info_hdr *pg_info_hdr;
824 	struct rtw_wow_param *rtw_wow = &rtwdev->wow;
825 	struct sk_buff *skb;
826 	u32 size;
827 
828 	size = chip->tx_pkt_desc_sz + sizeof(*pg_info_hdr);
829 	skb = alloc_skb(size, GFP_KERNEL);
830 	if (!skb)
831 		return NULL;
832 
833 	skb_reserve(skb, chip->tx_pkt_desc_sz);
834 	pg_info_hdr = skb_put_zero(skb, sizeof(*pg_info_hdr));
835 	pg_info_hdr->tx_bu_page_count = rtwdev->fifo.rsvd_drv_pg_num;
836 	pg_info_hdr->macid = find_first_bit(rtwdev->mac_id_map, RTW_MAX_MAC_ID_NUM);
837 	pg_info_hdr->sec_cam_count =
838 		rtw_sec_cam_pg_backup(rtwdev, pg_info_hdr->sec_cam);
839 	pg_info_hdr->pattern_count = rtw_wow->pattern_cnt;
840 
841 	conf->sec_cam_backup = pg_info_hdr->sec_cam_count != 0;
842 	conf->pattern_cam_backup = rtw_wow->pattern_cnt != 0;
843 
844 	return skb;
845 }
846 
847 static struct sk_buff *rtw_get_rsvd_page_skb(struct ieee80211_hw *hw,
848 					     struct rtw_rsvd_page *rsvd_pkt)
849 {
850 	struct ieee80211_vif *vif;
851 	struct rtw_vif *rtwvif;
852 	struct sk_buff *skb_new;
853 	struct cfg80211_ssid *ssid;
854 
855 	if (rsvd_pkt->type == RSVD_DUMMY) {
856 		skb_new = alloc_skb(1, GFP_KERNEL);
857 		if (!skb_new)
858 			return NULL;
859 
860 		skb_put(skb_new, 1);
861 		return skb_new;
862 	}
863 
864 	rtwvif = rsvd_pkt->rtwvif;
865 	if (!rtwvif)
866 		return NULL;
867 
868 	vif = rtwvif_to_vif(rtwvif);
869 
870 	switch (rsvd_pkt->type) {
871 	case RSVD_BEACON:
872 		skb_new = ieee80211_beacon_get(hw, vif);
873 		break;
874 	case RSVD_PS_POLL:
875 		skb_new = ieee80211_pspoll_get(hw, vif);
876 		break;
877 	case RSVD_PROBE_RESP:
878 		skb_new = ieee80211_proberesp_get(hw, vif);
879 		break;
880 	case RSVD_NULL:
881 		skb_new = ieee80211_nullfunc_get(hw, vif, false);
882 		break;
883 	case RSVD_QOS_NULL:
884 		skb_new = ieee80211_nullfunc_get(hw, vif, true);
885 		break;
886 	case RSVD_LPS_PG_DPK:
887 		skb_new = rtw_lps_pg_dpk_get(hw);
888 		break;
889 	case RSVD_LPS_PG_INFO:
890 		skb_new = rtw_lps_pg_info_get(hw);
891 		break;
892 	case RSVD_PROBE_REQ:
893 		ssid = (struct cfg80211_ssid *)rsvd_pkt->ssid;
894 		if (ssid)
895 			skb_new = ieee80211_probereq_get(hw, vif->addr,
896 							 ssid->ssid,
897 							 ssid->ssid_len, 0);
898 		else
899 			skb_new = ieee80211_probereq_get(hw, vif->addr, NULL, 0, 0);
900 		break;
901 	case RSVD_NLO_INFO:
902 		skb_new = rtw_nlo_info_get(hw);
903 		break;
904 	case RSVD_CH_INFO:
905 		skb_new = rtw_cs_channel_info_get(hw);
906 		break;
907 	default:
908 		return NULL;
909 	}
910 
911 	if (!skb_new)
912 		return NULL;
913 
914 	return skb_new;
915 }
916 
917 static void rtw_fill_rsvd_page_desc(struct rtw_dev *rtwdev, struct sk_buff *skb)
918 {
919 	struct rtw_tx_pkt_info pkt_info;
920 	struct rtw_chip_info *chip = rtwdev->chip;
921 	u8 *pkt_desc;
922 
923 	memset(&pkt_info, 0, sizeof(pkt_info));
924 	rtw_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb);
925 	pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
926 	memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
927 	rtw_tx_fill_tx_desc(&pkt_info, skb);
928 }
929 
930 static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
931 {
932 	return DIV_ROUND_UP(len, page_size);
933 }
934 
935 static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 page_size,
936 				      u8 page_margin, u32 page, u8 *buf,
937 				      struct rtw_rsvd_page *rsvd_pkt)
938 {
939 	struct sk_buff *skb = rsvd_pkt->skb;
940 
941 	if (page >= 1)
942 		memcpy(buf + page_margin + page_size * (page - 1),
943 		       skb->data, skb->len);
944 	else
945 		memcpy(buf, skb->data, skb->len);
946 }
947 
948 static struct rtw_rsvd_page *rtw_alloc_rsvd_page(struct rtw_dev *rtwdev,
949 						 enum rtw_rsvd_packet_type type,
950 						 bool txdesc)
951 {
952 	struct rtw_rsvd_page *rsvd_pkt = NULL;
953 
954 	rsvd_pkt = kzalloc(sizeof(*rsvd_pkt), GFP_KERNEL);
955 
956 	if (!rsvd_pkt)
957 		return NULL;
958 
959 	INIT_LIST_HEAD(&rsvd_pkt->vif_list);
960 	INIT_LIST_HEAD(&rsvd_pkt->build_list);
961 	rsvd_pkt->type = type;
962 	rsvd_pkt->add_txdesc = txdesc;
963 
964 	return rsvd_pkt;
965 }
966 
967 static void rtw_insert_rsvd_page(struct rtw_dev *rtwdev,
968 				 struct rtw_vif *rtwvif,
969 				 struct rtw_rsvd_page *rsvd_pkt)
970 {
971 	lockdep_assert_held(&rtwdev->mutex);
972 
973 	list_add_tail(&rsvd_pkt->vif_list, &rtwvif->rsvd_page_list);
974 }
975 
976 static void rtw_add_rsvd_page(struct rtw_dev *rtwdev,
977 			      struct rtw_vif *rtwvif,
978 			      enum rtw_rsvd_packet_type type,
979 			      bool txdesc)
980 {
981 	struct rtw_rsvd_page *rsvd_pkt;
982 
983 	rsvd_pkt = rtw_alloc_rsvd_page(rtwdev, type, txdesc);
984 	if (!rsvd_pkt) {
985 		rtw_err(rtwdev, "failed to alloc rsvd page %d\n", type);
986 		return;
987 	}
988 
989 	rsvd_pkt->rtwvif = rtwvif;
990 	rtw_insert_rsvd_page(rtwdev, rtwvif, rsvd_pkt);
991 }
992 
993 static void rtw_add_rsvd_page_probe_req(struct rtw_dev *rtwdev,
994 					struct rtw_vif *rtwvif,
995 					struct cfg80211_ssid *ssid)
996 {
997 	struct rtw_rsvd_page *rsvd_pkt;
998 
999 	rsvd_pkt = rtw_alloc_rsvd_page(rtwdev, RSVD_PROBE_REQ, true);
1000 	if (!rsvd_pkt) {
1001 		rtw_err(rtwdev, "failed to alloc probe req rsvd page\n");
1002 		return;
1003 	}
1004 
1005 	rsvd_pkt->rtwvif = rtwvif;
1006 	rsvd_pkt->ssid = ssid;
1007 	rtw_insert_rsvd_page(rtwdev, rtwvif, rsvd_pkt);
1008 }
1009 
1010 void rtw_remove_rsvd_page(struct rtw_dev *rtwdev,
1011 			  struct rtw_vif *rtwvif)
1012 {
1013 	struct rtw_rsvd_page *rsvd_pkt, *tmp;
1014 
1015 	lockdep_assert_held(&rtwdev->mutex);
1016 
1017 	/* remove all of the rsvd pages for vif */
1018 	list_for_each_entry_safe(rsvd_pkt, tmp, &rtwvif->rsvd_page_list,
1019 				 vif_list) {
1020 		list_del(&rsvd_pkt->vif_list);
1021 		if (!list_empty(&rsvd_pkt->build_list))
1022 			list_del(&rsvd_pkt->build_list);
1023 		kfree(rsvd_pkt);
1024 	}
1025 }
1026 
1027 void rtw_add_rsvd_page_bcn(struct rtw_dev *rtwdev,
1028 			   struct rtw_vif *rtwvif)
1029 {
1030 	struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
1031 
1032 	if (vif->type != NL80211_IFTYPE_AP &&
1033 	    vif->type != NL80211_IFTYPE_ADHOC &&
1034 	    vif->type != NL80211_IFTYPE_MESH_POINT) {
1035 		rtw_warn(rtwdev, "Cannot add beacon rsvd page for %d\n",
1036 			 vif->type);
1037 		return;
1038 	}
1039 
1040 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_BEACON, false);
1041 }
1042 
1043 void rtw_add_rsvd_page_pno(struct rtw_dev *rtwdev,
1044 			   struct rtw_vif *rtwvif)
1045 {
1046 	struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
1047 	struct rtw_wow_param *rtw_wow = &rtwdev->wow;
1048 	struct rtw_pno_request *rtw_pno_req = &rtw_wow->pno_req;
1049 	struct cfg80211_ssid *ssid;
1050 	int i;
1051 
1052 	if (vif->type != NL80211_IFTYPE_STATION) {
1053 		rtw_warn(rtwdev, "Cannot add PNO rsvd page for %d\n",
1054 			 vif->type);
1055 		return;
1056 	}
1057 
1058 	for (i = 0 ; i < rtw_pno_req->match_set_cnt; i++) {
1059 		ssid = &rtw_pno_req->match_sets[i].ssid;
1060 		rtw_add_rsvd_page_probe_req(rtwdev, rtwvif, ssid);
1061 	}
1062 
1063 	rtw_add_rsvd_page_probe_req(rtwdev, rtwvif, NULL);
1064 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_NLO_INFO, false);
1065 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_CH_INFO, true);
1066 }
1067 
1068 void rtw_add_rsvd_page_sta(struct rtw_dev *rtwdev,
1069 			   struct rtw_vif *rtwvif)
1070 {
1071 	struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
1072 
1073 	if (vif->type != NL80211_IFTYPE_STATION) {
1074 		rtw_warn(rtwdev, "Cannot add sta rsvd page for %d\n",
1075 			 vif->type);
1076 		return;
1077 	}
1078 
1079 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_PS_POLL, true);
1080 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_QOS_NULL, true);
1081 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_NULL, true);
1082 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_LPS_PG_DPK, true);
1083 	rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_LPS_PG_INFO, true);
1084 }
1085 
1086 int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
1087 				u8 *buf, u32 size)
1088 {
1089 	u8 bckp[2];
1090 	u8 val;
1091 	u16 rsvd_pg_head;
1092 	u32 bcn_valid_addr;
1093 	u32 bcn_valid_mask;
1094 	int ret;
1095 
1096 	lockdep_assert_held(&rtwdev->mutex);
1097 
1098 	if (!size)
1099 		return -EINVAL;
1100 
1101 	if (rtw_chip_wcpu_11n(rtwdev)) {
1102 		rtw_write32_set(rtwdev, REG_DWBCN0_CTRL, BIT_BCN_VALID);
1103 	} else {
1104 		pg_addr &= BIT_MASK_BCN_HEAD_1_V1;
1105 		pg_addr |= BIT_BCN_VALID_V1;
1106 		rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2, pg_addr);
1107 	}
1108 
1109 	val = rtw_read8(rtwdev, REG_CR + 1);
1110 	bckp[0] = val;
1111 	val |= BIT_ENSWBCN >> 8;
1112 	rtw_write8(rtwdev, REG_CR + 1, val);
1113 
1114 	val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2);
1115 	bckp[1] = val;
1116 	val &= ~(BIT_EN_BCNQ_DL >> 16);
1117 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, val);
1118 
1119 	ret = rtw_hci_write_data_rsvd_page(rtwdev, buf, size);
1120 	if (ret) {
1121 		rtw_err(rtwdev, "failed to write data to rsvd page\n");
1122 		goto restore;
1123 	}
1124 
1125 	if (rtw_chip_wcpu_11n(rtwdev)) {
1126 		bcn_valid_addr = REG_DWBCN0_CTRL;
1127 		bcn_valid_mask = BIT_BCN_VALID;
1128 	} else {
1129 		bcn_valid_addr = REG_FIFOPAGE_CTRL_2;
1130 		bcn_valid_mask = BIT_BCN_VALID_V1;
1131 	}
1132 
1133 	if (!check_hw_ready(rtwdev, bcn_valid_addr, bcn_valid_mask, 1)) {
1134 		rtw_err(rtwdev, "error beacon valid\n");
1135 		ret = -EBUSY;
1136 	}
1137 
1138 restore:
1139 	rsvd_pg_head = rtwdev->fifo.rsvd_boundary;
1140 	rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2,
1141 		    rsvd_pg_head | BIT_BCN_VALID_V1);
1142 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]);
1143 	rtw_write8(rtwdev, REG_CR + 1, bckp[0]);
1144 
1145 	return ret;
1146 }
1147 
1148 static int rtw_download_drv_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
1149 {
1150 	u32 pg_size;
1151 	u32 pg_num = 0;
1152 	u16 pg_addr = 0;
1153 
1154 	pg_size = rtwdev->chip->page_size;
1155 	pg_num = size / pg_size + ((size & (pg_size - 1)) ? 1 : 0);
1156 	if (pg_num > rtwdev->fifo.rsvd_drv_pg_num)
1157 		return -ENOMEM;
1158 
1159 	pg_addr = rtwdev->fifo.rsvd_drv_addr;
1160 
1161 	return rtw_fw_write_data_rsvd_page(rtwdev, pg_addr, buf, size);
1162 }
1163 
1164 static void __rtw_build_rsvd_page_reset(struct rtw_dev *rtwdev)
1165 {
1166 	struct rtw_rsvd_page *rsvd_pkt, *tmp;
1167 
1168 	list_for_each_entry_safe(rsvd_pkt, tmp, &rtwdev->rsvd_page_list,
1169 				 build_list) {
1170 		list_del_init(&rsvd_pkt->build_list);
1171 
1172 		/* Don't free except for the dummy rsvd page,
1173 		 * others will be freed when removing vif
1174 		 */
1175 		if (rsvd_pkt->type == RSVD_DUMMY)
1176 			kfree(rsvd_pkt);
1177 	}
1178 }
1179 
1180 static void rtw_build_rsvd_page_iter(void *data, u8 *mac,
1181 				     struct ieee80211_vif *vif)
1182 {
1183 	struct rtw_dev *rtwdev = data;
1184 	struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
1185 	struct rtw_rsvd_page *rsvd_pkt;
1186 
1187 	list_for_each_entry(rsvd_pkt, &rtwvif->rsvd_page_list, vif_list) {
1188 		if (rsvd_pkt->type == RSVD_BEACON)
1189 			list_add(&rsvd_pkt->build_list,
1190 				 &rtwdev->rsvd_page_list);
1191 		else
1192 			list_add_tail(&rsvd_pkt->build_list,
1193 				      &rtwdev->rsvd_page_list);
1194 	}
1195 }
1196 
1197 static int  __rtw_build_rsvd_page_from_vifs(struct rtw_dev *rtwdev)
1198 {
1199 	struct rtw_rsvd_page *rsvd_pkt;
1200 
1201 	__rtw_build_rsvd_page_reset(rtwdev);
1202 
1203 	/* gather rsvd page from vifs */
1204 	rtw_iterate_vifs_atomic(rtwdev, rtw_build_rsvd_page_iter, rtwdev);
1205 
1206 	rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list,
1207 					    struct rtw_rsvd_page, build_list);
1208 	if (!rsvd_pkt) {
1209 		WARN(1, "Should not have an empty reserved page\n");
1210 		return -EINVAL;
1211 	}
1212 
1213 	/* the first rsvd should be beacon, otherwise add a dummy one */
1214 	if (rsvd_pkt->type != RSVD_BEACON) {
1215 		struct rtw_rsvd_page *dummy_pkt;
1216 
1217 		dummy_pkt = rtw_alloc_rsvd_page(rtwdev, RSVD_DUMMY, false);
1218 		if (!dummy_pkt) {
1219 			rtw_err(rtwdev, "failed to alloc dummy rsvd page\n");
1220 			return -ENOMEM;
1221 		}
1222 
1223 		list_add(&dummy_pkt->build_list, &rtwdev->rsvd_page_list);
1224 	}
1225 
1226 	return 0;
1227 }
1228 
1229 static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size)
1230 {
1231 	struct ieee80211_hw *hw = rtwdev->hw;
1232 	struct rtw_chip_info *chip = rtwdev->chip;
1233 	struct sk_buff *iter;
1234 	struct rtw_rsvd_page *rsvd_pkt;
1235 	u32 page = 0;
1236 	u8 total_page = 0;
1237 	u8 page_size, page_margin, tx_desc_sz;
1238 	u8 *buf;
1239 	int ret;
1240 
1241 	page_size = chip->page_size;
1242 	tx_desc_sz = chip->tx_pkt_desc_sz;
1243 	page_margin = page_size - tx_desc_sz;
1244 
1245 	ret = __rtw_build_rsvd_page_from_vifs(rtwdev);
1246 	if (ret) {
1247 		rtw_err(rtwdev,
1248 			"failed to build rsvd page from vifs, ret %d\n", ret);
1249 		return NULL;
1250 	}
1251 
1252 	list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) {
1253 		iter = rtw_get_rsvd_page_skb(hw, rsvd_pkt);
1254 		if (!iter) {
1255 			rtw_err(rtwdev, "failed to build rsvd packet\n");
1256 			goto release_skb;
1257 		}
1258 
1259 		/* Fill the tx_desc for the rsvd pkt that requires one.
1260 		 * And iter->len will be added with size of tx_desc_sz.
1261 		 */
1262 		if (rsvd_pkt->add_txdesc)
1263 			rtw_fill_rsvd_page_desc(rtwdev, iter);
1264 
1265 		rsvd_pkt->skb = iter;
1266 		rsvd_pkt->page = total_page;
1267 
1268 		/* Reserved page is downloaded via TX path, and TX path will
1269 		 * generate a tx_desc at the header to describe length of
1270 		 * the buffer. If we are not counting page numbers with the
1271 		 * size of tx_desc added at the first rsvd_pkt (usually a
1272 		 * beacon, firmware default refer to the first page as the
1273 		 * content of beacon), we could generate a buffer which size
1274 		 * is smaller than the actual size of the whole rsvd_page
1275 		 */
1276 		if (total_page == 0) {
1277 			if (rsvd_pkt->type != RSVD_BEACON &&
1278 			    rsvd_pkt->type != RSVD_DUMMY) {
1279 				rtw_err(rtwdev, "first page should be a beacon\n");
1280 				goto release_skb;
1281 			}
1282 			total_page += rtw_len_to_page(iter->len + tx_desc_sz,
1283 						      page_size);
1284 		} else {
1285 			total_page += rtw_len_to_page(iter->len, page_size);
1286 		}
1287 	}
1288 
1289 	if (total_page > rtwdev->fifo.rsvd_drv_pg_num) {
1290 		rtw_err(rtwdev, "rsvd page over size: %d\n", total_page);
1291 		goto release_skb;
1292 	}
1293 
1294 	*size = (total_page - 1) * page_size + page_margin;
1295 	buf = kzalloc(*size, GFP_KERNEL);
1296 	if (!buf)
1297 		goto release_skb;
1298 
1299 	/* Copy the content of each rsvd_pkt to the buf, and they should
1300 	 * be aligned to the pages.
1301 	 *
1302 	 * Note that the first rsvd_pkt is a beacon no matter what vif->type.
1303 	 * And that rsvd_pkt does not require tx_desc because when it goes
1304 	 * through TX path, the TX path will generate one for it.
1305 	 */
1306 	list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) {
1307 		rtw_rsvd_page_list_to_buf(rtwdev, page_size, page_margin,
1308 					  page, buf, rsvd_pkt);
1309 		if (page == 0)
1310 			page += rtw_len_to_page(rsvd_pkt->skb->len +
1311 						tx_desc_sz, page_size);
1312 		else
1313 			page += rtw_len_to_page(rsvd_pkt->skb->len, page_size);
1314 
1315 		kfree_skb(rsvd_pkt->skb);
1316 		rsvd_pkt->skb = NULL;
1317 	}
1318 
1319 	return buf;
1320 
1321 release_skb:
1322 	list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) {
1323 		kfree_skb(rsvd_pkt->skb);
1324 		rsvd_pkt->skb = NULL;
1325 	}
1326 
1327 	return NULL;
1328 }
1329 
1330 static int rtw_download_beacon(struct rtw_dev *rtwdev)
1331 {
1332 	struct ieee80211_hw *hw = rtwdev->hw;
1333 	struct rtw_rsvd_page *rsvd_pkt;
1334 	struct sk_buff *skb;
1335 	int ret = 0;
1336 
1337 	rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list,
1338 					    struct rtw_rsvd_page, build_list);
1339 	if (!rsvd_pkt) {
1340 		rtw_err(rtwdev, "failed to get rsvd page from build list\n");
1341 		return -ENOENT;
1342 	}
1343 
1344 	if (rsvd_pkt->type != RSVD_BEACON &&
1345 	    rsvd_pkt->type != RSVD_DUMMY) {
1346 		rtw_err(rtwdev, "invalid rsvd page type %d, should be beacon or dummy\n",
1347 			rsvd_pkt->type);
1348 		return -EINVAL;
1349 	}
1350 
1351 	skb = rtw_get_rsvd_page_skb(hw, rsvd_pkt);
1352 	if (!skb) {
1353 		rtw_err(rtwdev, "failed to get beacon skb\n");
1354 		return -ENOMEM;
1355 	}
1356 
1357 	ret = rtw_download_drv_rsvd_page(rtwdev, skb->data, skb->len);
1358 	if (ret)
1359 		rtw_err(rtwdev, "failed to download drv rsvd page\n");
1360 
1361 	dev_kfree_skb(skb);
1362 
1363 	return ret;
1364 }
1365 
1366 int rtw_fw_download_rsvd_page(struct rtw_dev *rtwdev)
1367 {
1368 	u8 *buf;
1369 	u32 size;
1370 	int ret;
1371 
1372 	buf = rtw_build_rsvd_page(rtwdev, &size);
1373 	if (!buf) {
1374 		rtw_err(rtwdev, "failed to build rsvd page pkt\n");
1375 		return -ENOMEM;
1376 	}
1377 
1378 	ret = rtw_download_drv_rsvd_page(rtwdev, buf, size);
1379 	if (ret) {
1380 		rtw_err(rtwdev, "failed to download drv rsvd page\n");
1381 		goto free;
1382 	}
1383 
1384 	/* The last thing is to download the *ONLY* beacon again, because
1385 	 * the previous tx_desc is to describe the total rsvd page. Download
1386 	 * the beacon again to replace the TX desc header, and we will get
1387 	 * a correct tx_desc for the beacon in the rsvd page.
1388 	 */
1389 	ret = rtw_download_beacon(rtwdev);
1390 	if (ret) {
1391 		rtw_err(rtwdev, "failed to download beacon\n");
1392 		goto free;
1393 	}
1394 
1395 free:
1396 	kfree(buf);
1397 
1398 	return ret;
1399 }
1400 
1401 int rtw_dump_drv_rsvd_page(struct rtw_dev *rtwdev,
1402 			   u32 offset, u32 size, u32 *buf)
1403 {
1404 	struct rtw_fifo_conf *fifo = &rtwdev->fifo;
1405 	u32 residue, i;
1406 	u16 start_pg;
1407 	u16 idx = 0;
1408 	u16 ctl;
1409 	u8 rcr;
1410 
1411 	if (size & 0x3) {
1412 		rtw_warn(rtwdev, "should be 4-byte aligned\n");
1413 		return -EINVAL;
1414 	}
1415 
1416 	offset += fifo->rsvd_boundary << TX_PAGE_SIZE_SHIFT;
1417 	residue = offset & (FIFO_PAGE_SIZE - 1);
1418 	start_pg = offset >> FIFO_PAGE_SIZE_SHIFT;
1419 	start_pg += RSVD_PAGE_START_ADDR;
1420 
1421 	rcr = rtw_read8(rtwdev, REG_RCR + 2);
1422 	ctl = rtw_read16(rtwdev, REG_PKTBUF_DBG_CTRL) & 0xf000;
1423 
1424 	/* disable rx clock gate */
1425 	rtw_write8(rtwdev, REG_RCR, rcr | BIT(3));
1426 
1427 	do {
1428 		rtw_write16(rtwdev, REG_PKTBUF_DBG_CTRL, start_pg | ctl);
1429 
1430 		for (i = FIFO_DUMP_ADDR + residue;
1431 		     i < FIFO_DUMP_ADDR + FIFO_PAGE_SIZE; i += 4) {
1432 			buf[idx++] = rtw_read32(rtwdev, i);
1433 			size -= 4;
1434 			if (size == 0)
1435 				goto out;
1436 		}
1437 
1438 		residue = 0;
1439 		start_pg++;
1440 	} while (size);
1441 
1442 out:
1443 	rtw_write16(rtwdev, REG_PKTBUF_DBG_CTRL, ctl);
1444 	rtw_write8(rtwdev, REG_RCR + 2, rcr);
1445 	return 0;
1446 }
1447 
1448 static void __rtw_fw_update_pkt(struct rtw_dev *rtwdev, u8 pkt_id, u16 size,
1449 				u8 location)
1450 {
1451 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
1452 	u16 total_size = H2C_PKT_HDR_SIZE + H2C_PKT_UPDATE_PKT_LEN;
1453 
1454 	rtw_h2c_pkt_set_header(h2c_pkt, H2C_PKT_UPDATE_PKT);
1455 
1456 	SET_PKT_H2C_TOTAL_LEN(h2c_pkt, total_size);
1457 	UPDATE_PKT_SET_PKT_ID(h2c_pkt, pkt_id);
1458 	UPDATE_PKT_SET_LOCATION(h2c_pkt, location);
1459 
1460 	/* include txdesc size */
1461 	UPDATE_PKT_SET_SIZE(h2c_pkt, size);
1462 
1463 	rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
1464 }
1465 
1466 void rtw_fw_update_pkt_probe_req(struct rtw_dev *rtwdev,
1467 				 struct cfg80211_ssid *ssid)
1468 {
1469 	u8 loc;
1470 	u32 size;
1471 
1472 	loc = rtw_get_rsvd_page_probe_req_location(rtwdev, ssid);
1473 	if (!loc) {
1474 		rtw_err(rtwdev, "failed to get probe_req rsvd loc\n");
1475 		return;
1476 	}
1477 
1478 	size = rtw_get_rsvd_page_probe_req_size(rtwdev, ssid);
1479 	if (!size) {
1480 		rtw_err(rtwdev, "failed to get probe_req rsvd size\n");
1481 		return;
1482 	}
1483 
1484 	__rtw_fw_update_pkt(rtwdev, RTW_PACKET_PROBE_REQ, size, loc);
1485 }
1486 
1487 void rtw_fw_channel_switch(struct rtw_dev *rtwdev, bool enable)
1488 {
1489 	struct rtw_pno_request *rtw_pno_req = &rtwdev->wow.pno_req;
1490 	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
1491 	u16 total_size = H2C_PKT_HDR_SIZE + H2C_PKT_CH_SWITCH_LEN;
1492 	u8 loc_ch_info;
1493 	const struct rtw_ch_switch_option cs_option = {
1494 		.dest_ch_en = 1,
1495 		.dest_ch = 1,
1496 		.periodic_option = 2,
1497 		.normal_period = 5,
1498 		.normal_period_sel = 0,
1499 		.normal_cycle = 10,
1500 		.slow_period = 1,
1501 		.slow_period_sel = 1,
1502 	};
1503 
1504 	rtw_h2c_pkt_set_header(h2c_pkt, H2C_PKT_CH_SWITCH);
1505 	SET_PKT_H2C_TOTAL_LEN(h2c_pkt, total_size);
1506 
1507 	CH_SWITCH_SET_START(h2c_pkt, enable);
1508 	CH_SWITCH_SET_DEST_CH_EN(h2c_pkt, cs_option.dest_ch_en);
1509 	CH_SWITCH_SET_DEST_CH(h2c_pkt, cs_option.dest_ch);
1510 	CH_SWITCH_SET_NORMAL_PERIOD(h2c_pkt, cs_option.normal_period);
1511 	CH_SWITCH_SET_NORMAL_PERIOD_SEL(h2c_pkt, cs_option.normal_period_sel);
1512 	CH_SWITCH_SET_SLOW_PERIOD(h2c_pkt, cs_option.slow_period);
1513 	CH_SWITCH_SET_SLOW_PERIOD_SEL(h2c_pkt, cs_option.slow_period_sel);
1514 	CH_SWITCH_SET_NORMAL_CYCLE(h2c_pkt, cs_option.normal_cycle);
1515 	CH_SWITCH_SET_PERIODIC_OPT(h2c_pkt, cs_option.periodic_option);
1516 
1517 	CH_SWITCH_SET_CH_NUM(h2c_pkt, rtw_pno_req->channel_cnt);
1518 	CH_SWITCH_SET_INFO_SIZE(h2c_pkt, rtw_pno_req->channel_cnt * 4);
1519 
1520 	loc_ch_info = rtw_get_rsvd_page_location(rtwdev, RSVD_CH_INFO);
1521 	CH_SWITCH_SET_INFO_LOC(h2c_pkt, loc_ch_info);
1522 
1523 	rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
1524 }
1525