1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019 Realtek Corporation
15 static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev
*rtwdev
,
18 struct rtw_c2h_cmd
*c2h
;
21 c2h
= get_c2h_from_skb(skb
);
22 sub_cmd_id
= c2h
->payload
[0];
26 rtw_tx_report_handle(rtwdev
, skb
);
33 static u16
get_max_amsdu_len(u32 bit_rate
)
35 /* lower than ofdm, do not aggregate */
39 /* lower than 20M 2ss mcs8, make it small */
43 /* lower than 40M 2ss mcs9, make it medium */
47 /* not yet 80M 2ss mcs8/9, make it twice regular packet size */
55 struct rtw_fw_iter_ra_data
{
56 struct rtw_dev
*rtwdev
;
60 static void rtw_fw_ra_report_iter(void *data
, struct ieee80211_sta
*sta
)
62 struct rtw_fw_iter_ra_data
*ra_data
= data
;
63 struct rtw_sta_info
*si
= (struct rtw_sta_info
*)sta
->drv_priv
;
64 u8 mac_id
, rate
, sgi
, bw
;
68 mac_id
= GET_RA_REPORT_MACID(ra_data
->payload
);
69 if (si
->mac_id
!= mac_id
)
72 si
->ra_report
.txrate
.flags
= 0;
74 rate
= GET_RA_REPORT_RATE(ra_data
->payload
);
75 sgi
= GET_RA_REPORT_SGI(ra_data
->payload
);
76 bw
= GET_RA_REPORT_BW(ra_data
->payload
);
78 if (rate
< DESC_RATEMCS0
) {
79 si
->ra_report
.txrate
.legacy
= rtw_desc_to_bitrate(rate
);
83 rtw_desc_to_mcsrate(rate
, &mcs
, &nss
);
84 if (rate
>= DESC_RATEVHT1SS_MCS0
)
85 si
->ra_report
.txrate
.flags
|= RATE_INFO_FLAGS_VHT_MCS
;
86 else if (rate
>= DESC_RATEMCS0
)
87 si
->ra_report
.txrate
.flags
|= RATE_INFO_FLAGS_MCS
;
89 if (rate
>= DESC_RATEMCS0
) {
90 si
->ra_report
.txrate
.mcs
= mcs
;
91 si
->ra_report
.txrate
.nss
= nss
;
95 si
->ra_report
.txrate
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
97 if (bw
== RTW_CHANNEL_WIDTH_80
)
98 si
->ra_report
.txrate
.bw
= RATE_INFO_BW_80
;
99 else if (bw
== RTW_CHANNEL_WIDTH_40
)
100 si
->ra_report
.txrate
.bw
= RATE_INFO_BW_40
;
102 si
->ra_report
.txrate
.bw
= RATE_INFO_BW_20
;
105 bit_rate
= cfg80211_calculate_bitrate(&si
->ra_report
.txrate
);
107 si
->ra_report
.desc_rate
= rate
;
108 si
->ra_report
.bit_rate
= bit_rate
;
110 sta
->max_rc_amsdu_len
= get_max_amsdu_len(bit_rate
);
113 static void rtw_fw_ra_report_handle(struct rtw_dev
*rtwdev
, u8
*payload
,
116 struct rtw_fw_iter_ra_data ra_data
;
118 if (WARN(length
< 7, "invalid ra report c2h length\n"))
121 rtwdev
->dm_info
.tx_rate
= GET_RA_REPORT_RATE(payload
);
122 ra_data
.rtwdev
= rtwdev
;
123 ra_data
.payload
= payload
;
124 rtw_iterate_stas_atomic(rtwdev
, rtw_fw_ra_report_iter
, &ra_data
);
127 void rtw_fw_c2h_cmd_handle(struct rtw_dev
*rtwdev
, struct sk_buff
*skb
)
129 struct rtw_c2h_cmd
*c2h
;
133 pkt_offset
= *((u32
*)skb
->cb
);
134 c2h
= (struct rtw_c2h_cmd
*)(skb
->data
+ pkt_offset
);
135 len
= skb
->len
- pkt_offset
- 2;
137 mutex_lock(&rtwdev
->mutex
);
139 if (!test_bit(RTW_FLAG_RUNNING
, rtwdev
->flags
))
144 rtw_coex_bt_info_notify(rtwdev
, c2h
->payload
, len
);
147 rtw_coex_wl_fwdbginfo_notify(rtwdev
, c2h
->payload
, len
);
150 rtw_fw_c2h_cmd_handle_ext(rtwdev
, skb
);
153 rtw_fw_ra_report_handle(rtwdev
, c2h
->payload
, len
);
160 mutex_unlock(&rtwdev
->mutex
);
163 void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev
*rtwdev
, u32 pkt_offset
,
166 struct rtw_c2h_cmd
*c2h
;
169 c2h
= (struct rtw_c2h_cmd
*)(skb
->data
+ pkt_offset
);
170 len
= skb
->len
- pkt_offset
- 2;
171 *((u32
*)skb
->cb
) = pkt_offset
;
173 rtw_dbg(rtwdev
, RTW_DBG_FW
, "recv C2H, id=0x%02x, seq=0x%02x, len=%d\n",
174 c2h
->id
, c2h
->seq
, len
);
178 rtw_coex_info_response(rtwdev
, skb
);
181 /* pass offset for further operation */
182 *((u32
*)skb
->cb
) = pkt_offset
;
183 skb_queue_tail(&rtwdev
->c2h_queue
, skb
);
184 ieee80211_queue_work(rtwdev
->hw
, &rtwdev
->c2h_work
);
188 EXPORT_SYMBOL(rtw_fw_c2h_cmd_rx_irqsafe
);
190 static void rtw_fw_send_h2c_command(struct rtw_dev
*rtwdev
,
195 u32 box_reg
, box_ex_reg
;
199 rtw_dbg(rtwdev
, RTW_DBG_FW
,
200 "send H2C content %02x%02x%02x%02x %02x%02x%02x%02x\n",
201 h2c
[3], h2c
[2], h2c
[1], h2c
[0],
202 h2c
[7], h2c
[6], h2c
[5], h2c
[4]);
204 spin_lock(&rtwdev
->h2c
.lock
);
206 box
= rtwdev
->h2c
.last_box_num
;
209 box_reg
= REG_HMEBOX0
;
210 box_ex_reg
= REG_HMEBOX0_EX
;
213 box_reg
= REG_HMEBOX1
;
214 box_ex_reg
= REG_HMEBOX1_EX
;
217 box_reg
= REG_HMEBOX2
;
218 box_ex_reg
= REG_HMEBOX2_EX
;
221 box_reg
= REG_HMEBOX3
;
222 box_ex_reg
= REG_HMEBOX3_EX
;
225 WARN(1, "invalid h2c mail box number\n");
231 box_state
= rtw_read8(rtwdev
, REG_HMETFR
);
232 } while ((box_state
>> box
) & 0x1 && --h2c_wait
> 0);
235 rtw_err(rtwdev
, "failed to send h2c command\n");
239 for (idx
= 0; idx
< 4; idx
++)
240 rtw_write8(rtwdev
, box_reg
+ idx
, h2c
[idx
]);
241 for (idx
= 0; idx
< 4; idx
++)
242 rtw_write8(rtwdev
, box_ex_reg
+ idx
, h2c
[idx
+ 4]);
244 if (++rtwdev
->h2c
.last_box_num
>= 4)
245 rtwdev
->h2c
.last_box_num
= 0;
248 spin_unlock(&rtwdev
->h2c
.lock
);
251 static void rtw_fw_send_h2c_packet(struct rtw_dev
*rtwdev
, u8
*h2c_pkt
)
255 spin_lock(&rtwdev
->h2c
.lock
);
257 FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt
, rtwdev
->h2c
.seq
);
258 ret
= rtw_hci_write_data_h2c(rtwdev
, h2c_pkt
, H2C_PKT_SIZE
);
260 rtw_err(rtwdev
, "failed to send h2c packet\n");
263 spin_unlock(&rtwdev
->h2c
.lock
);
267 rtw_fw_send_general_info(struct rtw_dev
*rtwdev
)
269 struct rtw_fifo_conf
*fifo
= &rtwdev
->fifo
;
270 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
271 u16 total_size
= H2C_PKT_HDR_SIZE
+ 4;
273 rtw_h2c_pkt_set_header(h2c_pkt
, H2C_PKT_GENERAL_INFO
);
275 SET_PKT_H2C_TOTAL_LEN(h2c_pkt
, total_size
);
277 GENERAL_INFO_SET_FW_TX_BOUNDARY(h2c_pkt
,
278 fifo
->rsvd_fw_txbuf_addr
-
279 fifo
->rsvd_boundary
);
281 rtw_fw_send_h2c_packet(rtwdev
, h2c_pkt
);
285 rtw_fw_send_phydm_info(struct rtw_dev
*rtwdev
)
287 struct rtw_hal
*hal
= &rtwdev
->hal
;
288 struct rtw_efuse
*efuse
= &rtwdev
->efuse
;
289 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
290 u16 total_size
= H2C_PKT_HDR_SIZE
+ 8;
293 if (hal
->rf_type
== RF_1T1R
)
294 fw_rf_type
= FW_RF_1T1R
;
295 else if (hal
->rf_type
== RF_2T2R
)
296 fw_rf_type
= FW_RF_2T2R
;
298 rtw_h2c_pkt_set_header(h2c_pkt
, H2C_PKT_PHYDM_INFO
);
300 SET_PKT_H2C_TOTAL_LEN(h2c_pkt
, total_size
);
301 PHYDM_INFO_SET_REF_TYPE(h2c_pkt
, efuse
->rfe_option
);
302 PHYDM_INFO_SET_RF_TYPE(h2c_pkt
, fw_rf_type
);
303 PHYDM_INFO_SET_CUT_VER(h2c_pkt
, hal
->cut_version
);
304 PHYDM_INFO_SET_RX_ANT_STATUS(h2c_pkt
, hal
->antenna_tx
);
305 PHYDM_INFO_SET_TX_ANT_STATUS(h2c_pkt
, hal
->antenna_rx
);
307 rtw_fw_send_h2c_packet(rtwdev
, h2c_pkt
);
310 void rtw_fw_do_iqk(struct rtw_dev
*rtwdev
, struct rtw_iqk_para
*para
)
312 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
313 u16 total_size
= H2C_PKT_HDR_SIZE
+ 1;
315 rtw_h2c_pkt_set_header(h2c_pkt
, H2C_PKT_IQK
);
316 SET_PKT_H2C_TOTAL_LEN(h2c_pkt
, total_size
);
317 IQK_SET_CLEAR(h2c_pkt
, para
->clear
);
318 IQK_SET_SEGMENT_IQK(h2c_pkt
, para
->segment_iqk
);
320 rtw_fw_send_h2c_packet(rtwdev
, h2c_pkt
);
323 void rtw_fw_query_bt_info(struct rtw_dev
*rtwdev
)
325 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
327 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_QUERY_BT_INFO
);
329 SET_QUERY_BT_INFO(h2c_pkt
, true);
331 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
334 void rtw_fw_wl_ch_info(struct rtw_dev
*rtwdev
, u8 link
, u8 ch
, u8 bw
)
336 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
338 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_WL_CH_INFO
);
340 SET_WL_CH_INFO_LINK(h2c_pkt
, link
);
341 SET_WL_CH_INFO_CHNL(h2c_pkt
, ch
);
342 SET_WL_CH_INFO_BW(h2c_pkt
, bw
);
344 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
347 void rtw_fw_query_bt_mp_info(struct rtw_dev
*rtwdev
,
348 struct rtw_coex_info_req
*req
)
350 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
352 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_QUERY_BT_MP_INFO
);
354 SET_BT_MP_INFO_SEQ(h2c_pkt
, req
->seq
);
355 SET_BT_MP_INFO_OP_CODE(h2c_pkt
, req
->op_code
);
356 SET_BT_MP_INFO_PARA1(h2c_pkt
, req
->para1
);
357 SET_BT_MP_INFO_PARA2(h2c_pkt
, req
->para2
);
358 SET_BT_MP_INFO_PARA3(h2c_pkt
, req
->para3
);
360 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
363 void rtw_fw_force_bt_tx_power(struct rtw_dev
*rtwdev
, u8 bt_pwr_dec_lvl
)
365 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
366 u8 index
= 0 - bt_pwr_dec_lvl
;
368 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_FORCE_BT_TX_POWER
);
370 SET_BT_TX_POWER_INDEX(h2c_pkt
, index
);
372 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
375 void rtw_fw_bt_ignore_wlan_action(struct rtw_dev
*rtwdev
, bool enable
)
377 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
379 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_IGNORE_WLAN_ACTION
);
381 SET_IGNORE_WLAN_ACTION_EN(h2c_pkt
, enable
);
383 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
386 void rtw_fw_coex_tdma_type(struct rtw_dev
*rtwdev
,
387 u8 para1
, u8 para2
, u8 para3
, u8 para4
, u8 para5
)
389 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
391 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_COEX_TDMA_TYPE
);
393 SET_COEX_TDMA_TYPE_PARA1(h2c_pkt
, para1
);
394 SET_COEX_TDMA_TYPE_PARA2(h2c_pkt
, para2
);
395 SET_COEX_TDMA_TYPE_PARA3(h2c_pkt
, para3
);
396 SET_COEX_TDMA_TYPE_PARA4(h2c_pkt
, para4
);
397 SET_COEX_TDMA_TYPE_PARA5(h2c_pkt
, para5
);
399 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
402 void rtw_fw_bt_wifi_control(struct rtw_dev
*rtwdev
, u8 op_code
, u8
*data
)
404 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
406 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_BT_WIFI_CONTROL
);
408 SET_BT_WIFI_CONTROL_OP_CODE(h2c_pkt
, op_code
);
410 SET_BT_WIFI_CONTROL_DATA1(h2c_pkt
, *data
);
411 SET_BT_WIFI_CONTROL_DATA2(h2c_pkt
, *(data
+ 1));
412 SET_BT_WIFI_CONTROL_DATA3(h2c_pkt
, *(data
+ 2));
413 SET_BT_WIFI_CONTROL_DATA4(h2c_pkt
, *(data
+ 3));
414 SET_BT_WIFI_CONTROL_DATA5(h2c_pkt
, *(data
+ 4));
416 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
419 void rtw_fw_send_rssi_info(struct rtw_dev
*rtwdev
, struct rtw_sta_info
*si
)
421 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
422 u8 rssi
= ewma_rssi_read(&si
->avg_rssi
);
423 bool stbc_en
= si
->stbc_en
? true : false;
425 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_RSSI_MONITOR
);
427 SET_RSSI_INFO_MACID(h2c_pkt
, si
->mac_id
);
428 SET_RSSI_INFO_RSSI(h2c_pkt
, rssi
);
429 SET_RSSI_INFO_STBC(h2c_pkt
, stbc_en
);
431 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
434 void rtw_fw_send_ra_info(struct rtw_dev
*rtwdev
, struct rtw_sta_info
*si
)
436 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
437 bool no_update
= si
->updated
;
438 bool disable_pt
= true;
440 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_RA_INFO
);
442 SET_RA_INFO_MACID(h2c_pkt
, si
->mac_id
);
443 SET_RA_INFO_RATE_ID(h2c_pkt
, si
->rate_id
);
444 SET_RA_INFO_INIT_RA_LVL(h2c_pkt
, si
->init_ra_lv
);
445 SET_RA_INFO_SGI_EN(h2c_pkt
, si
->sgi_enable
);
446 SET_RA_INFO_BW_MODE(h2c_pkt
, si
->bw_mode
);
447 SET_RA_INFO_LDPC(h2c_pkt
, si
->ldpc_en
);
448 SET_RA_INFO_NO_UPDATE(h2c_pkt
, no_update
);
449 SET_RA_INFO_VHT_EN(h2c_pkt
, si
->vht_enable
);
450 SET_RA_INFO_DIS_PT(h2c_pkt
, disable_pt
);
451 SET_RA_INFO_RA_MASK0(h2c_pkt
, (si
->ra_mask
& 0xff));
452 SET_RA_INFO_RA_MASK1(h2c_pkt
, (si
->ra_mask
& 0xff00) >> 8);
453 SET_RA_INFO_RA_MASK2(h2c_pkt
, (si
->ra_mask
& 0xff0000) >> 16);
454 SET_RA_INFO_RA_MASK3(h2c_pkt
, (si
->ra_mask
& 0xff000000) >> 24);
459 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
462 void rtw_fw_media_status_report(struct rtw_dev
*rtwdev
, u8 mac_id
, bool connect
)
464 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
466 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_MEDIA_STATUS_RPT
);
467 MEDIA_STATUS_RPT_SET_OP_MODE(h2c_pkt
, connect
);
468 MEDIA_STATUS_RPT_SET_MACID(h2c_pkt
, mac_id
);
470 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
473 void rtw_fw_set_pwr_mode(struct rtw_dev
*rtwdev
)
475 struct rtw_lps_conf
*conf
= &rtwdev
->lps_conf
;
476 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
478 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_SET_PWR_MODE
);
480 SET_PWR_MODE_SET_MODE(h2c_pkt
, conf
->mode
);
481 SET_PWR_MODE_SET_RLBM(h2c_pkt
, conf
->rlbm
);
482 SET_PWR_MODE_SET_SMART_PS(h2c_pkt
, conf
->smart_ps
);
483 SET_PWR_MODE_SET_AWAKE_INTERVAL(h2c_pkt
, conf
->awake_interval
);
484 SET_PWR_MODE_SET_PORT_ID(h2c_pkt
, conf
->port_id
);
485 SET_PWR_MODE_SET_PWR_STATE(h2c_pkt
, conf
->state
);
487 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
490 void rtw_fw_set_keep_alive_cmd(struct rtw_dev
*rtwdev
, bool enable
)
492 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
493 struct rtw_fw_wow_keep_alive_para mode
= {
495 .pkt_type
= KEEP_ALIVE_NULL_PKT
,
499 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_KEEP_ALIVE
);
500 SET_KEEP_ALIVE_ENABLE(h2c_pkt
, enable
);
501 SET_KEEP_ALIVE_ADOPT(h2c_pkt
, mode
.adopt
);
502 SET_KEEP_ALIVE_PKT_TYPE(h2c_pkt
, mode
.pkt_type
);
503 SET_KEEP_ALIVE_CHECK_PERIOD(h2c_pkt
, mode
.period
);
505 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
508 void rtw_fw_set_disconnect_decision_cmd(struct rtw_dev
*rtwdev
, bool enable
)
510 struct rtw_wow_param
*rtw_wow
= &rtwdev
->wow
;
511 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
512 struct rtw_fw_wow_disconnect_para mode
= {
518 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_DISCONNECT_DECISION
);
520 if (test_bit(RTW_WOW_FLAG_EN_DISCONNECT
, rtw_wow
->flags
)) {
521 SET_DISCONNECT_DECISION_ENABLE(h2c_pkt
, enable
);
522 SET_DISCONNECT_DECISION_ADOPT(h2c_pkt
, mode
.adopt
);
523 SET_DISCONNECT_DECISION_CHECK_PERIOD(h2c_pkt
, mode
.period
);
524 SET_DISCONNECT_DECISION_TRY_PKT_NUM(h2c_pkt
, mode
.retry_count
);
527 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
530 void rtw_fw_set_wowlan_ctrl_cmd(struct rtw_dev
*rtwdev
, bool enable
)
532 struct rtw_wow_param
*rtw_wow
= &rtwdev
->wow
;
533 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
535 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_WOWLAN
);
537 SET_WOWLAN_FUNC_ENABLE(h2c_pkt
, enable
);
538 if (rtw_wow_mgd_linked(rtwdev
)) {
539 if (test_bit(RTW_WOW_FLAG_EN_MAGIC_PKT
, rtw_wow
->flags
))
540 SET_WOWLAN_MAGIC_PKT_ENABLE(h2c_pkt
, enable
);
541 if (test_bit(RTW_WOW_FLAG_EN_DISCONNECT
, rtw_wow
->flags
))
542 SET_WOWLAN_DEAUTH_WAKEUP_ENABLE(h2c_pkt
, enable
);
543 if (test_bit(RTW_WOW_FLAG_EN_REKEY_PKT
, rtw_wow
->flags
))
544 SET_WOWLAN_REKEY_WAKEUP_ENABLE(h2c_pkt
, enable
);
545 if (rtw_wow
->pattern_cnt
)
546 SET_WOWLAN_PATTERN_MATCH_ENABLE(h2c_pkt
, enable
);
549 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
552 void rtw_fw_set_aoac_global_info_cmd(struct rtw_dev
*rtwdev
,
556 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
558 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_AOAC_GLOBAL_INFO
);
560 SET_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(h2c_pkt
, pairwise_key_enc
);
561 SET_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(h2c_pkt
, group_key_enc
);
563 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
566 void rtw_fw_set_remote_wake_ctrl_cmd(struct rtw_dev
*rtwdev
, bool enable
)
568 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
570 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_REMOTE_WAKE_CTRL
);
572 SET_REMOTE_WAKECTRL_ENABLE(h2c_pkt
, enable
);
574 if (rtw_wow_no_link(rtwdev
))
575 SET_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(h2c_pkt
, enable
);
577 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
580 static u8
rtw_get_rsvd_page_location(struct rtw_dev
*rtwdev
,
581 enum rtw_rsvd_packet_type type
)
583 struct rtw_rsvd_page
*rsvd_pkt
;
586 list_for_each_entry(rsvd_pkt
, &rtwdev
->rsvd_page_list
, build_list
) {
587 if (type
== rsvd_pkt
->type
)
588 location
= rsvd_pkt
->page
;
594 void rtw_fw_set_nlo_info(struct rtw_dev
*rtwdev
, bool enable
)
596 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
599 loc_nlo
= rtw_get_rsvd_page_location(rtwdev
, RSVD_NLO_INFO
);
601 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_NLO_INFO
);
603 SET_NLO_FUN_EN(h2c_pkt
, enable
);
605 if (rtw_fw_lps_deep_mode
)
606 SET_NLO_PS_32K(h2c_pkt
, enable
);
607 SET_NLO_IGNORE_SECURITY(h2c_pkt
, enable
);
608 SET_NLO_LOC_NLO_INFO(h2c_pkt
, loc_nlo
);
611 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
614 void rtw_fw_set_pg_info(struct rtw_dev
*rtwdev
)
616 struct rtw_lps_conf
*conf
= &rtwdev
->lps_conf
;
617 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
620 loc_pg
= rtw_get_rsvd_page_location(rtwdev
, RSVD_LPS_PG_INFO
);
621 loc_dpk
= rtw_get_rsvd_page_location(rtwdev
, RSVD_LPS_PG_DPK
);
623 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_LPS_PG_INFO
);
625 LPS_PG_INFO_LOC(h2c_pkt
, loc_pg
);
626 LPS_PG_DPK_LOC(h2c_pkt
, loc_dpk
);
627 LPS_PG_SEC_CAM_EN(h2c_pkt
, conf
->sec_cam_backup
);
628 LPS_PG_PATTERN_CAM_EN(h2c_pkt
, conf
->pattern_cam_backup
);
630 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
633 u8
rtw_get_rsvd_page_probe_req_location(struct rtw_dev
*rtwdev
,
634 struct cfg80211_ssid
*ssid
)
636 struct rtw_rsvd_page
*rsvd_pkt
;
639 list_for_each_entry(rsvd_pkt
, &rtwdev
->rsvd_page_list
, build_list
) {
640 if (rsvd_pkt
->type
!= RSVD_PROBE_REQ
)
642 if ((!ssid
&& !rsvd_pkt
->ssid
) ||
643 rtw_ssid_equal(rsvd_pkt
->ssid
, ssid
))
644 location
= rsvd_pkt
->page
;
650 u16
rtw_get_rsvd_page_probe_req_size(struct rtw_dev
*rtwdev
,
651 struct cfg80211_ssid
*ssid
)
653 struct rtw_rsvd_page
*rsvd_pkt
;
656 list_for_each_entry(rsvd_pkt
, &rtwdev
->rsvd_page_list
, build_list
) {
657 if (rsvd_pkt
->type
!= RSVD_PROBE_REQ
)
659 if ((!ssid
&& !rsvd_pkt
->ssid
) ||
660 rtw_ssid_equal(rsvd_pkt
->ssid
, ssid
))
661 size
= rsvd_pkt
->skb
->len
;
667 void rtw_send_rsvd_page_h2c(struct rtw_dev
*rtwdev
)
669 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
672 SET_H2C_CMD_ID_CLASS(h2c_pkt
, H2C_CMD_RSVD_PAGE
);
674 location
= rtw_get_rsvd_page_location(rtwdev
, RSVD_PROBE_RESP
);
675 *(h2c_pkt
+ 1) = location
;
676 rtw_dbg(rtwdev
, RTW_DBG_FW
, "RSVD_PROBE_RESP loc: %d\n", location
);
678 location
= rtw_get_rsvd_page_location(rtwdev
, RSVD_PS_POLL
);
679 *(h2c_pkt
+ 2) = location
;
680 rtw_dbg(rtwdev
, RTW_DBG_FW
, "RSVD_PS_POLL loc: %d\n", location
);
682 location
= rtw_get_rsvd_page_location(rtwdev
, RSVD_NULL
);
683 *(h2c_pkt
+ 3) = location
;
684 rtw_dbg(rtwdev
, RTW_DBG_FW
, "RSVD_NULL loc: %d\n", location
);
686 location
= rtw_get_rsvd_page_location(rtwdev
, RSVD_QOS_NULL
);
687 *(h2c_pkt
+ 4) = location
;
688 rtw_dbg(rtwdev
, RTW_DBG_FW
, "RSVD_QOS_NULL loc: %d\n", location
);
690 rtw_fw_send_h2c_command(rtwdev
, h2c_pkt
);
693 static struct sk_buff
*rtw_nlo_info_get(struct ieee80211_hw
*hw
)
695 struct rtw_dev
*rtwdev
= hw
->priv
;
696 struct rtw_chip_info
*chip
= rtwdev
->chip
;
697 struct rtw_pno_request
*pno_req
= &rtwdev
->wow
.pno_req
;
698 struct rtw_nlo_info_hdr
*nlo_hdr
;
699 struct cfg80211_ssid
*ssid
;
705 if (!pno_req
->inited
|| !pno_req
->match_set_cnt
)
708 size
= sizeof(struct rtw_nlo_info_hdr
) + pno_req
->match_set_cnt
*
709 IEEE80211_MAX_SSID_LEN
+ chip
->tx_pkt_desc_sz
;
711 skb
= alloc_skb(size
, GFP_KERNEL
);
715 skb_reserve(skb
, chip
->tx_pkt_desc_sz
);
717 nlo_hdr
= skb_put_zero(skb
, sizeof(struct rtw_nlo_info_hdr
));
719 nlo_hdr
->nlo_count
= pno_req
->match_set_cnt
;
720 nlo_hdr
->hidden_ap_count
= pno_req
->match_set_cnt
;
722 /* pattern check for firmware */
723 memset(nlo_hdr
->pattern_check
, 0xA5, FW_NLO_INFO_CHECK_SIZE
);
725 for (i
= 0; i
< pno_req
->match_set_cnt
; i
++)
726 nlo_hdr
->ssid_len
[i
] = pno_req
->match_sets
[i
].ssid
.ssid_len
;
728 for (i
= 0; i
< pno_req
->match_set_cnt
; i
++) {
729 ssid
= &pno_req
->match_sets
[i
].ssid
;
730 loc
= rtw_get_rsvd_page_probe_req_location(rtwdev
, ssid
);
732 rtw_err(rtwdev
, "failed to get probe req rsvd loc\n");
736 nlo_hdr
->location
[i
] = loc
;
739 for (i
= 0; i
< pno_req
->match_set_cnt
; i
++) {
740 pos
= skb_put_zero(skb
, IEEE80211_MAX_SSID_LEN
);
741 memcpy(pos
, pno_req
->match_sets
[i
].ssid
.ssid
,
742 pno_req
->match_sets
[i
].ssid
.ssid_len
);
748 static struct sk_buff
*rtw_cs_channel_info_get(struct ieee80211_hw
*hw
)
750 struct rtw_dev
*rtwdev
= hw
->priv
;
751 struct rtw_chip_info
*chip
= rtwdev
->chip
;
752 struct rtw_pno_request
*pno_req
= &rtwdev
->wow
.pno_req
;
753 struct ieee80211_channel
*channels
= pno_req
->channels
;
755 int count
= pno_req
->channel_cnt
;
759 skb
= alloc_skb(4 * count
+ chip
->tx_pkt_desc_sz
, GFP_KERNEL
);
763 skb_reserve(skb
, chip
->tx_pkt_desc_sz
);
765 for (i
= 0; i
< count
; i
++) {
766 pos
= skb_put_zero(skb
, 4);
768 CHSW_INFO_SET_CH(pos
, channels
[i
].hw_value
);
770 if (channels
[i
].flags
& IEEE80211_CHAN_RADAR
)
771 CHSW_INFO_SET_ACTION_ID(pos
, 0);
773 CHSW_INFO_SET_ACTION_ID(pos
, 1);
774 CHSW_INFO_SET_TIMEOUT(pos
, 1);
775 CHSW_INFO_SET_PRI_CH_IDX(pos
, 1);
776 CHSW_INFO_SET_BW(pos
, 0);
782 static struct sk_buff
*rtw_lps_pg_dpk_get(struct ieee80211_hw
*hw
)
784 struct rtw_dev
*rtwdev
= hw
->priv
;
785 struct rtw_chip_info
*chip
= rtwdev
->chip
;
786 struct rtw_dpk_info
*dpk_info
= &rtwdev
->dm_info
.dpk_info
;
787 struct rtw_lps_pg_dpk_hdr
*dpk_hdr
;
791 size
= chip
->tx_pkt_desc_sz
+ sizeof(*dpk_hdr
);
792 skb
= alloc_skb(size
, GFP_KERNEL
);
796 skb_reserve(skb
, chip
->tx_pkt_desc_sz
);
797 dpk_hdr
= skb_put_zero(skb
, sizeof(*dpk_hdr
));
798 dpk_hdr
->dpk_ch
= dpk_info
->dpk_ch
;
799 dpk_hdr
->dpk_path_ok
= dpk_info
->dpk_path_ok
[0];
800 memcpy(dpk_hdr
->dpk_txagc
, dpk_info
->dpk_txagc
, 2);
801 memcpy(dpk_hdr
->dpk_gs
, dpk_info
->dpk_gs
, 4);
802 memcpy(dpk_hdr
->coef
, dpk_info
->coef
, 160);
807 static struct sk_buff
*rtw_lps_pg_info_get(struct ieee80211_hw
*hw
)
809 struct rtw_dev
*rtwdev
= hw
->priv
;
810 struct rtw_chip_info
*chip
= rtwdev
->chip
;
811 struct rtw_lps_conf
*conf
= &rtwdev
->lps_conf
;
812 struct rtw_lps_pg_info_hdr
*pg_info_hdr
;
813 struct rtw_wow_param
*rtw_wow
= &rtwdev
->wow
;
817 size
= chip
->tx_pkt_desc_sz
+ sizeof(*pg_info_hdr
);
818 skb
= alloc_skb(size
, GFP_KERNEL
);
822 skb_reserve(skb
, chip
->tx_pkt_desc_sz
);
823 pg_info_hdr
= skb_put_zero(skb
, sizeof(*pg_info_hdr
));
824 pg_info_hdr
->tx_bu_page_count
= rtwdev
->fifo
.rsvd_drv_pg_num
;
825 pg_info_hdr
->macid
= find_first_bit(rtwdev
->mac_id_map
, RTW_MAX_MAC_ID_NUM
);
826 pg_info_hdr
->sec_cam_count
=
827 rtw_sec_cam_pg_backup(rtwdev
, pg_info_hdr
->sec_cam
);
828 pg_info_hdr
->pattern_count
= rtw_wow
->pattern_cnt
;
830 conf
->sec_cam_backup
= pg_info_hdr
->sec_cam_count
!= 0;
831 conf
->pattern_cam_backup
= rtw_wow
->pattern_cnt
!= 0;
836 static struct sk_buff
*rtw_get_rsvd_page_skb(struct ieee80211_hw
*hw
,
837 struct rtw_rsvd_page
*rsvd_pkt
)
839 struct ieee80211_vif
*vif
;
840 struct rtw_vif
*rtwvif
;
841 struct sk_buff
*skb_new
;
842 struct cfg80211_ssid
*ssid
;
844 if (rsvd_pkt
->type
== RSVD_DUMMY
) {
845 skb_new
= alloc_skb(1, GFP_KERNEL
);
853 rtwvif
= rsvd_pkt
->rtwvif
;
857 vif
= rtwvif_to_vif(rtwvif
);
859 switch (rsvd_pkt
->type
) {
861 skb_new
= ieee80211_beacon_get(hw
, vif
);
864 skb_new
= ieee80211_pspoll_get(hw
, vif
);
866 case RSVD_PROBE_RESP
:
867 skb_new
= ieee80211_proberesp_get(hw
, vif
);
870 skb_new
= ieee80211_nullfunc_get(hw
, vif
, false);
873 skb_new
= ieee80211_nullfunc_get(hw
, vif
, true);
875 case RSVD_LPS_PG_DPK
:
876 skb_new
= rtw_lps_pg_dpk_get(hw
);
878 case RSVD_LPS_PG_INFO
:
879 skb_new
= rtw_lps_pg_info_get(hw
);
882 ssid
= (struct cfg80211_ssid
*)rsvd_pkt
->ssid
;
884 skb_new
= ieee80211_probereq_get(hw
, vif
->addr
,
888 skb_new
= ieee80211_probereq_get(hw
, vif
->addr
, NULL
, 0, 0);
891 skb_new
= rtw_nlo_info_get(hw
);
894 skb_new
= rtw_cs_channel_info_get(hw
);
906 static void rtw_fill_rsvd_page_desc(struct rtw_dev
*rtwdev
, struct sk_buff
*skb
)
908 struct rtw_tx_pkt_info pkt_info
;
909 struct rtw_chip_info
*chip
= rtwdev
->chip
;
912 memset(&pkt_info
, 0, sizeof(pkt_info
));
913 rtw_rsvd_page_pkt_info_update(rtwdev
, &pkt_info
, skb
);
914 pkt_desc
= skb_push(skb
, chip
->tx_pkt_desc_sz
);
915 memset(pkt_desc
, 0, chip
->tx_pkt_desc_sz
);
916 rtw_tx_fill_tx_desc(&pkt_info
, skb
);
919 static inline u8
rtw_len_to_page(unsigned int len
, u8 page_size
)
921 return DIV_ROUND_UP(len
, page_size
);
924 static void rtw_rsvd_page_list_to_buf(struct rtw_dev
*rtwdev
, u8 page_size
,
925 u8 page_margin
, u32 page
, u8
*buf
,
926 struct rtw_rsvd_page
*rsvd_pkt
)
928 struct sk_buff
*skb
= rsvd_pkt
->skb
;
931 memcpy(buf
+ page_margin
+ page_size
* (page
- 1),
932 skb
->data
, skb
->len
);
934 memcpy(buf
, skb
->data
, skb
->len
);
937 static struct rtw_rsvd_page
*rtw_alloc_rsvd_page(struct rtw_dev
*rtwdev
,
938 enum rtw_rsvd_packet_type type
,
941 struct rtw_rsvd_page
*rsvd_pkt
= NULL
;
943 rsvd_pkt
= kzalloc(sizeof(*rsvd_pkt
), GFP_KERNEL
);
948 INIT_LIST_HEAD(&rsvd_pkt
->vif_list
);
949 INIT_LIST_HEAD(&rsvd_pkt
->build_list
);
950 rsvd_pkt
->type
= type
;
951 rsvd_pkt
->add_txdesc
= txdesc
;
956 static void rtw_insert_rsvd_page(struct rtw_dev
*rtwdev
,
957 struct rtw_vif
*rtwvif
,
958 struct rtw_rsvd_page
*rsvd_pkt
)
960 lockdep_assert_held(&rtwdev
->mutex
);
962 list_add_tail(&rsvd_pkt
->vif_list
, &rtwvif
->rsvd_page_list
);
965 static void rtw_add_rsvd_page(struct rtw_dev
*rtwdev
,
966 struct rtw_vif
*rtwvif
,
967 enum rtw_rsvd_packet_type type
,
970 struct rtw_rsvd_page
*rsvd_pkt
;
972 rsvd_pkt
= rtw_alloc_rsvd_page(rtwdev
, type
, txdesc
);
974 rtw_err(rtwdev
, "failed to alloc rsvd page %d\n", type
);
978 rsvd_pkt
->rtwvif
= rtwvif
;
979 rtw_insert_rsvd_page(rtwdev
, rtwvif
, rsvd_pkt
);
982 static void rtw_add_rsvd_page_probe_req(struct rtw_dev
*rtwdev
,
983 struct rtw_vif
*rtwvif
,
984 struct cfg80211_ssid
*ssid
)
986 struct rtw_rsvd_page
*rsvd_pkt
;
988 rsvd_pkt
= rtw_alloc_rsvd_page(rtwdev
, RSVD_PROBE_REQ
, true);
990 rtw_err(rtwdev
, "failed to alloc probe req rsvd page\n");
994 rsvd_pkt
->rtwvif
= rtwvif
;
995 rsvd_pkt
->ssid
= ssid
;
996 rtw_insert_rsvd_page(rtwdev
, rtwvif
, rsvd_pkt
);
999 void rtw_remove_rsvd_page(struct rtw_dev
*rtwdev
,
1000 struct rtw_vif
*rtwvif
)
1002 struct rtw_rsvd_page
*rsvd_pkt
, *tmp
;
1004 lockdep_assert_held(&rtwdev
->mutex
);
1006 /* remove all of the rsvd pages for vif */
1007 list_for_each_entry_safe(rsvd_pkt
, tmp
, &rtwvif
->rsvd_page_list
,
1009 list_del(&rsvd_pkt
->vif_list
);
1010 if (!list_empty(&rsvd_pkt
->build_list
))
1011 list_del(&rsvd_pkt
->build_list
);
1016 void rtw_add_rsvd_page_bcn(struct rtw_dev
*rtwdev
,
1017 struct rtw_vif
*rtwvif
)
1019 struct ieee80211_vif
*vif
= rtwvif_to_vif(rtwvif
);
1021 if (vif
->type
!= NL80211_IFTYPE_AP
&&
1022 vif
->type
!= NL80211_IFTYPE_ADHOC
&&
1023 vif
->type
!= NL80211_IFTYPE_MESH_POINT
) {
1024 rtw_warn(rtwdev
, "Cannot add beacon rsvd page for %d\n",
1029 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_BEACON
, false);
1032 void rtw_add_rsvd_page_pno(struct rtw_dev
*rtwdev
,
1033 struct rtw_vif
*rtwvif
)
1035 struct ieee80211_vif
*vif
= rtwvif_to_vif(rtwvif
);
1036 struct rtw_wow_param
*rtw_wow
= &rtwdev
->wow
;
1037 struct rtw_pno_request
*rtw_pno_req
= &rtw_wow
->pno_req
;
1038 struct cfg80211_ssid
*ssid
;
1041 if (vif
->type
!= NL80211_IFTYPE_STATION
) {
1042 rtw_warn(rtwdev
, "Cannot add PNO rsvd page for %d\n",
1047 for (i
= 0 ; i
< rtw_pno_req
->match_set_cnt
; i
++) {
1048 ssid
= &rtw_pno_req
->match_sets
[i
].ssid
;
1049 rtw_add_rsvd_page_probe_req(rtwdev
, rtwvif
, ssid
);
1052 rtw_add_rsvd_page_probe_req(rtwdev
, rtwvif
, NULL
);
1053 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_NLO_INFO
, false);
1054 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_CH_INFO
, true);
1057 void rtw_add_rsvd_page_sta(struct rtw_dev
*rtwdev
,
1058 struct rtw_vif
*rtwvif
)
1060 struct ieee80211_vif
*vif
= rtwvif_to_vif(rtwvif
);
1062 if (vif
->type
!= NL80211_IFTYPE_STATION
) {
1063 rtw_warn(rtwdev
, "Cannot add sta rsvd page for %d\n",
1068 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_PS_POLL
, true);
1069 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_QOS_NULL
, true);
1070 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_NULL
, true);
1071 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_LPS_PG_DPK
, true);
1072 rtw_add_rsvd_page(rtwdev
, rtwvif
, RSVD_LPS_PG_INFO
, true);
1075 int rtw_fw_write_data_rsvd_page(struct rtw_dev
*rtwdev
, u16 pg_addr
,
1083 lockdep_assert_held(&rtwdev
->mutex
);
1088 pg_addr
&= BIT_MASK_BCN_HEAD_1_V1
;
1089 rtw_write16(rtwdev
, REG_FIFOPAGE_CTRL_2
, pg_addr
| BIT_BCN_VALID_V1
);
1091 val
= rtw_read8(rtwdev
, REG_CR
+ 1);
1093 val
|= BIT_ENSWBCN
>> 8;
1094 rtw_write8(rtwdev
, REG_CR
+ 1, val
);
1096 val
= rtw_read8(rtwdev
, REG_FWHW_TXQ_CTRL
+ 2);
1098 val
&= ~(BIT_EN_BCNQ_DL
>> 16);
1099 rtw_write8(rtwdev
, REG_FWHW_TXQ_CTRL
+ 2, val
);
1101 ret
= rtw_hci_write_data_rsvd_page(rtwdev
, buf
, size
);
1103 rtw_err(rtwdev
, "failed to write data to rsvd page\n");
1107 if (!check_hw_ready(rtwdev
, REG_FIFOPAGE_CTRL_2
, BIT_BCN_VALID_V1
, 1)) {
1108 rtw_err(rtwdev
, "error beacon valid\n");
1113 rsvd_pg_head
= rtwdev
->fifo
.rsvd_boundary
;
1114 rtw_write16(rtwdev
, REG_FIFOPAGE_CTRL_2
,
1115 rsvd_pg_head
| BIT_BCN_VALID_V1
);
1116 rtw_write8(rtwdev
, REG_FWHW_TXQ_CTRL
+ 2, bckp
[1]);
1117 rtw_write8(rtwdev
, REG_CR
+ 1, bckp
[0]);
1122 static int rtw_download_drv_rsvd_page(struct rtw_dev
*rtwdev
, u8
*buf
, u32 size
)
1128 pg_size
= rtwdev
->chip
->page_size
;
1129 pg_num
= size
/ pg_size
+ ((size
& (pg_size
- 1)) ? 1 : 0);
1130 if (pg_num
> rtwdev
->fifo
.rsvd_drv_pg_num
)
1133 pg_addr
= rtwdev
->fifo
.rsvd_drv_addr
;
1135 return rtw_fw_write_data_rsvd_page(rtwdev
, pg_addr
, buf
, size
);
1138 static void __rtw_build_rsvd_page_reset(struct rtw_dev
*rtwdev
)
1140 struct rtw_rsvd_page
*rsvd_pkt
, *tmp
;
1142 list_for_each_entry_safe(rsvd_pkt
, tmp
, &rtwdev
->rsvd_page_list
,
1144 list_del_init(&rsvd_pkt
->build_list
);
1146 /* Don't free except for the dummy rsvd page,
1147 * others will be freed when removing vif
1149 if (rsvd_pkt
->type
== RSVD_DUMMY
)
1154 static void rtw_build_rsvd_page_iter(void *data
, u8
*mac
,
1155 struct ieee80211_vif
*vif
)
1157 struct rtw_dev
*rtwdev
= data
;
1158 struct rtw_vif
*rtwvif
= (struct rtw_vif
*)vif
->drv_priv
;
1159 struct rtw_rsvd_page
*rsvd_pkt
;
1161 list_for_each_entry(rsvd_pkt
, &rtwvif
->rsvd_page_list
, vif_list
) {
1162 if (rsvd_pkt
->type
== RSVD_BEACON
)
1163 list_add(&rsvd_pkt
->build_list
,
1164 &rtwdev
->rsvd_page_list
);
1166 list_add_tail(&rsvd_pkt
->build_list
,
1167 &rtwdev
->rsvd_page_list
);
1171 static int __rtw_build_rsvd_page_from_vifs(struct rtw_dev
*rtwdev
)
1173 struct rtw_rsvd_page
*rsvd_pkt
;
1175 __rtw_build_rsvd_page_reset(rtwdev
);
1177 /* gather rsvd page from vifs */
1178 rtw_iterate_vifs_atomic(rtwdev
, rtw_build_rsvd_page_iter
, rtwdev
);
1180 rsvd_pkt
= list_first_entry_or_null(&rtwdev
->rsvd_page_list
,
1181 struct rtw_rsvd_page
, build_list
);
1183 WARN(1, "Should not have an empty reserved page\n");
1187 /* the first rsvd should be beacon, otherwise add a dummy one */
1188 if (rsvd_pkt
->type
!= RSVD_BEACON
) {
1189 struct rtw_rsvd_page
*dummy_pkt
;
1191 dummy_pkt
= rtw_alloc_rsvd_page(rtwdev
, RSVD_DUMMY
, false);
1193 rtw_err(rtwdev
, "failed to alloc dummy rsvd page\n");
1197 list_add(&dummy_pkt
->build_list
, &rtwdev
->rsvd_page_list
);
1203 static u8
*rtw_build_rsvd_page(struct rtw_dev
*rtwdev
, u32
*size
)
1205 struct ieee80211_hw
*hw
= rtwdev
->hw
;
1206 struct rtw_chip_info
*chip
= rtwdev
->chip
;
1207 struct sk_buff
*iter
;
1208 struct rtw_rsvd_page
*rsvd_pkt
;
1211 u8 page_size
, page_margin
, tx_desc_sz
;
1215 page_size
= chip
->page_size
;
1216 tx_desc_sz
= chip
->tx_pkt_desc_sz
;
1217 page_margin
= page_size
- tx_desc_sz
;
1219 ret
= __rtw_build_rsvd_page_from_vifs(rtwdev
);
1222 "failed to build rsvd page from vifs, ret %d\n", ret
);
1226 list_for_each_entry(rsvd_pkt
, &rtwdev
->rsvd_page_list
, build_list
) {
1227 iter
= rtw_get_rsvd_page_skb(hw
, rsvd_pkt
);
1229 rtw_err(rtwdev
, "failed to build rsvd packet\n");
1233 /* Fill the tx_desc for the rsvd pkt that requires one.
1234 * And iter->len will be added with size of tx_desc_sz.
1236 if (rsvd_pkt
->add_txdesc
)
1237 rtw_fill_rsvd_page_desc(rtwdev
, iter
);
1239 rsvd_pkt
->skb
= iter
;
1240 rsvd_pkt
->page
= total_page
;
1242 /* Reserved page is downloaded via TX path, and TX path will
1243 * generate a tx_desc at the header to describe length of
1244 * the buffer. If we are not counting page numbers with the
1245 * size of tx_desc added at the first rsvd_pkt (usually a
1246 * beacon, firmware default refer to the first page as the
1247 * content of beacon), we could generate a buffer which size
1248 * is smaller than the actual size of the whole rsvd_page
1250 if (total_page
== 0) {
1251 if (rsvd_pkt
->type
!= RSVD_BEACON
&&
1252 rsvd_pkt
->type
!= RSVD_DUMMY
) {
1253 rtw_err(rtwdev
, "first page should be a beacon\n");
1256 total_page
+= rtw_len_to_page(iter
->len
+ tx_desc_sz
,
1259 total_page
+= rtw_len_to_page(iter
->len
, page_size
);
1263 if (total_page
> rtwdev
->fifo
.rsvd_drv_pg_num
) {
1264 rtw_err(rtwdev
, "rsvd page over size: %d\n", total_page
);
1268 *size
= (total_page
- 1) * page_size
+ page_margin
;
1269 buf
= kzalloc(*size
, GFP_KERNEL
);
1273 /* Copy the content of each rsvd_pkt to the buf, and they should
1274 * be aligned to the pages.
1276 * Note that the first rsvd_pkt is a beacon no matter what vif->type.
1277 * And that rsvd_pkt does not require tx_desc because when it goes
1278 * through TX path, the TX path will generate one for it.
1280 list_for_each_entry(rsvd_pkt
, &rtwdev
->rsvd_page_list
, build_list
) {
1281 rtw_rsvd_page_list_to_buf(rtwdev
, page_size
, page_margin
,
1282 page
, buf
, rsvd_pkt
);
1284 page
+= rtw_len_to_page(rsvd_pkt
->skb
->len
+
1285 tx_desc_sz
, page_size
);
1287 page
+= rtw_len_to_page(rsvd_pkt
->skb
->len
, page_size
);
1289 kfree_skb(rsvd_pkt
->skb
);
1290 rsvd_pkt
->skb
= NULL
;
1296 list_for_each_entry(rsvd_pkt
, &rtwdev
->rsvd_page_list
, build_list
) {
1297 kfree_skb(rsvd_pkt
->skb
);
1298 rsvd_pkt
->skb
= NULL
;
1304 static int rtw_download_beacon(struct rtw_dev
*rtwdev
)
1306 struct ieee80211_hw
*hw
= rtwdev
->hw
;
1307 struct rtw_rsvd_page
*rsvd_pkt
;
1308 struct sk_buff
*skb
;
1311 rsvd_pkt
= list_first_entry_or_null(&rtwdev
->rsvd_page_list
,
1312 struct rtw_rsvd_page
, build_list
);
1314 rtw_err(rtwdev
, "failed to get rsvd page from build list\n");
1318 if (rsvd_pkt
->type
!= RSVD_BEACON
&&
1319 rsvd_pkt
->type
!= RSVD_DUMMY
) {
1320 rtw_err(rtwdev
, "invalid rsvd page type %d, should be beacon or dummy\n",
1325 skb
= rtw_get_rsvd_page_skb(hw
, rsvd_pkt
);
1327 rtw_err(rtwdev
, "failed to get beacon skb\n");
1331 ret
= rtw_download_drv_rsvd_page(rtwdev
, skb
->data
, skb
->len
);
1333 rtw_err(rtwdev
, "failed to download drv rsvd page\n");
1340 int rtw_fw_download_rsvd_page(struct rtw_dev
*rtwdev
)
1346 buf
= rtw_build_rsvd_page(rtwdev
, &size
);
1348 rtw_err(rtwdev
, "failed to build rsvd page pkt\n");
1352 ret
= rtw_download_drv_rsvd_page(rtwdev
, buf
, size
);
1354 rtw_err(rtwdev
, "failed to download drv rsvd page\n");
1358 /* The last thing is to download the *ONLY* beacon again, because
1359 * the previous tx_desc is to describe the total rsvd page. Download
1360 * the beacon again to replace the TX desc header, and we will get
1361 * a correct tx_desc for the beacon in the rsvd page.
1363 ret
= rtw_download_beacon(rtwdev
);
1365 rtw_err(rtwdev
, "failed to download beacon\n");
1375 int rtw_dump_drv_rsvd_page(struct rtw_dev
*rtwdev
,
1376 u32 offset
, u32 size
, u32
*buf
)
1378 struct rtw_fifo_conf
*fifo
= &rtwdev
->fifo
;
1386 rtw_warn(rtwdev
, "should be 4-byte aligned\n");
1390 offset
+= fifo
->rsvd_boundary
<< TX_PAGE_SIZE_SHIFT
;
1391 residue
= offset
& (FIFO_PAGE_SIZE
- 1);
1392 start_pg
= offset
>> FIFO_PAGE_SIZE_SHIFT
;
1393 start_pg
+= RSVD_PAGE_START_ADDR
;
1395 rcr
= rtw_read8(rtwdev
, REG_RCR
+ 2);
1396 ctl
= rtw_read16(rtwdev
, REG_PKTBUF_DBG_CTRL
) & 0xf000;
1398 /* disable rx clock gate */
1399 rtw_write8(rtwdev
, REG_RCR
, rcr
| BIT(3));
1402 rtw_write16(rtwdev
, REG_PKTBUF_DBG_CTRL
, start_pg
| ctl
);
1404 for (i
= FIFO_DUMP_ADDR
+ residue
;
1405 i
< FIFO_DUMP_ADDR
+ FIFO_PAGE_SIZE
; i
+= 4) {
1406 buf
[idx
++] = rtw_read32(rtwdev
, i
);
1417 rtw_write16(rtwdev
, REG_PKTBUF_DBG_CTRL
, ctl
);
1418 rtw_write8(rtwdev
, REG_RCR
+ 2, rcr
);
1422 static void __rtw_fw_update_pkt(struct rtw_dev
*rtwdev
, u8 pkt_id
, u16 size
,
1425 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
1426 u16 total_size
= H2C_PKT_HDR_SIZE
+ H2C_PKT_UPDATE_PKT_LEN
;
1428 rtw_h2c_pkt_set_header(h2c_pkt
, H2C_PKT_UPDATE_PKT
);
1430 SET_PKT_H2C_TOTAL_LEN(h2c_pkt
, total_size
);
1431 UPDATE_PKT_SET_PKT_ID(h2c_pkt
, pkt_id
);
1432 UPDATE_PKT_SET_LOCATION(h2c_pkt
, location
);
1434 /* include txdesc size */
1435 UPDATE_PKT_SET_SIZE(h2c_pkt
, size
);
1437 rtw_fw_send_h2c_packet(rtwdev
, h2c_pkt
);
1440 void rtw_fw_update_pkt_probe_req(struct rtw_dev
*rtwdev
,
1441 struct cfg80211_ssid
*ssid
)
1446 loc
= rtw_get_rsvd_page_probe_req_location(rtwdev
, ssid
);
1448 rtw_err(rtwdev
, "failed to get probe_req rsvd loc\n");
1452 size
= rtw_get_rsvd_page_probe_req_size(rtwdev
, ssid
);
1454 rtw_err(rtwdev
, "failed to get probe_req rsvd size\n");
1458 __rtw_fw_update_pkt(rtwdev
, RTW_PACKET_PROBE_REQ
, size
, loc
);
1461 void rtw_fw_channel_switch(struct rtw_dev
*rtwdev
, bool enable
)
1463 struct rtw_pno_request
*rtw_pno_req
= &rtwdev
->wow
.pno_req
;
1464 u8 h2c_pkt
[H2C_PKT_SIZE
] = {0};
1465 u16 total_size
= H2C_PKT_HDR_SIZE
+ H2C_PKT_CH_SWITCH_LEN
;
1467 const struct rtw_ch_switch_option cs_option
= {
1470 .periodic_option
= 2,
1472 .normal_period_sel
= 0,
1475 .slow_period_sel
= 1,
1478 rtw_h2c_pkt_set_header(h2c_pkt
, H2C_PKT_CH_SWITCH
);
1479 SET_PKT_H2C_TOTAL_LEN(h2c_pkt
, total_size
);
1481 CH_SWITCH_SET_START(h2c_pkt
, enable
);
1482 CH_SWITCH_SET_DEST_CH_EN(h2c_pkt
, cs_option
.dest_ch_en
);
1483 CH_SWITCH_SET_DEST_CH(h2c_pkt
, cs_option
.dest_ch
);
1484 CH_SWITCH_SET_NORMAL_PERIOD(h2c_pkt
, cs_option
.normal_period
);
1485 CH_SWITCH_SET_NORMAL_PERIOD_SEL(h2c_pkt
, cs_option
.normal_period_sel
);
1486 CH_SWITCH_SET_SLOW_PERIOD(h2c_pkt
, cs_option
.slow_period
);
1487 CH_SWITCH_SET_SLOW_PERIOD_SEL(h2c_pkt
, cs_option
.slow_period_sel
);
1488 CH_SWITCH_SET_NORMAL_CYCLE(h2c_pkt
, cs_option
.normal_cycle
);
1489 CH_SWITCH_SET_PERIODIC_OPT(h2c_pkt
, cs_option
.periodic_option
);
1491 CH_SWITCH_SET_CH_NUM(h2c_pkt
, rtw_pno_req
->channel_cnt
);
1492 CH_SWITCH_SET_INFO_SIZE(h2c_pkt
, rtw_pno_req
->channel_cnt
* 4);
1494 loc_ch_info
= rtw_get_rsvd_page_location(rtwdev
, RSVD_CH_INFO
);
1495 CH_SWITCH_SET_INFO_LOC(h2c_pkt
, loc_ch_info
);
1497 rtw_fw_send_h2c_packet(rtwdev
, h2c_pkt
);