Lines Matching refs:rtwdev

17 static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev *rtwdev,  in rtw_fw_c2h_cmd_handle_ext()  argument
28 rtw_tx_report_handle(rtwdev, skb, C2H_CCX_RPT); in rtw_fw_c2h_cmd_handle_ext()
58 struct rtw_dev *rtwdev; member
115 static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload, in rtw_fw_ra_report_handle() argument
123 rtwdev->dm_info.tx_rate = GET_RA_REPORT_RATE(payload); in rtw_fw_ra_report_handle()
124 ra_data.rtwdev = rtwdev; in rtw_fw_ra_report_handle()
126 rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data); in rtw_fw_ra_report_handle()
129 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb) in rtw_fw_c2h_cmd_handle() argument
139 mutex_lock(&rtwdev->mutex); in rtw_fw_c2h_cmd_handle()
141 if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags)) in rtw_fw_c2h_cmd_handle()
146 rtw_tx_report_handle(rtwdev, skb, C2H_CCX_TX_RPT); in rtw_fw_c2h_cmd_handle()
149 rtw_coex_bt_info_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
152 rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
155 rtw_fw_c2h_cmd_handle_ext(rtwdev, skb); in rtw_fw_c2h_cmd_handle()
158 rtw_fw_ra_report_handle(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
161 rtw_dbg(rtwdev, RTW_DBG_FW, "C2H 0x%x isn't handled\n", c2h->id); in rtw_fw_c2h_cmd_handle()
166 mutex_unlock(&rtwdev->mutex); in rtw_fw_c2h_cmd_handle()
169 void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset, in rtw_fw_c2h_cmd_rx_irqsafe() argument
179 rtw_dbg(rtwdev, RTW_DBG_FW, "recv C2H, id=0x%02x, seq=0x%02x, len=%d\n", in rtw_fw_c2h_cmd_rx_irqsafe()
184 rtw_coex_info_response(rtwdev, skb); in rtw_fw_c2h_cmd_rx_irqsafe()
189 skb_queue_tail(&rtwdev->c2h_queue, skb); in rtw_fw_c2h_cmd_rx_irqsafe()
190 ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); in rtw_fw_c2h_cmd_rx_irqsafe()
196 void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev) in rtw_fw_c2h_cmd_isr() argument
198 if (rtw_read8(rtwdev, REG_MCU_TST_CFG) == VAL_FW_TRIGGER) in rtw_fw_c2h_cmd_isr()
199 rtw_fw_recovery(rtwdev); in rtw_fw_c2h_cmd_isr()
201 rtw_warn(rtwdev, "unhandled firmware c2h interrupt\n"); in rtw_fw_c2h_cmd_isr()
205 static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, in rtw_fw_send_h2c_command() argument
214 rtw_dbg(rtwdev, RTW_DBG_FW, in rtw_fw_send_h2c_command()
219 spin_lock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_command()
221 box = rtwdev->h2c.last_box_num; in rtw_fw_send_h2c_command()
246 false, rtwdev, REG_HMETFR); in rtw_fw_send_h2c_command()
249 rtw_err(rtwdev, "failed to send h2c command\n"); in rtw_fw_send_h2c_command()
254 rtw_write8(rtwdev, box_reg + idx, h2c[idx]); in rtw_fw_send_h2c_command()
256 rtw_write8(rtwdev, box_ex_reg + idx, h2c[idx + 4]); in rtw_fw_send_h2c_command()
258 if (++rtwdev->h2c.last_box_num >= 4) in rtw_fw_send_h2c_command()
259 rtwdev->h2c.last_box_num = 0; in rtw_fw_send_h2c_command()
262 spin_unlock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_command()
265 void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c) in rtw_fw_h2c_cmd_dbg() argument
267 rtw_fw_send_h2c_command(rtwdev, h2c); in rtw_fw_h2c_cmd_dbg()
270 static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt) in rtw_fw_send_h2c_packet() argument
274 spin_lock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_packet()
276 FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq); in rtw_fw_send_h2c_packet()
277 ret = rtw_hci_write_data_h2c(rtwdev, h2c_pkt, H2C_PKT_SIZE); in rtw_fw_send_h2c_packet()
279 rtw_err(rtwdev, "failed to send h2c packet\n"); in rtw_fw_send_h2c_packet()
280 rtwdev->h2c.seq++; in rtw_fw_send_h2c_packet()
282 spin_unlock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_packet()
286 rtw_fw_send_general_info(struct rtw_dev *rtwdev) in rtw_fw_send_general_info() argument
288 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in rtw_fw_send_general_info()
292 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_fw_send_general_info()
303 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_send_general_info()
307 rtw_fw_send_phydm_info(struct rtw_dev *rtwdev) in rtw_fw_send_phydm_info() argument
309 struct rtw_hal *hal = &rtwdev->hal; in rtw_fw_send_phydm_info()
310 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_fw_send_phydm_info()
315 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_fw_send_phydm_info()
332 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_send_phydm_info()
335 void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para) in rtw_fw_do_iqk() argument
345 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_do_iqk()
349 void rtw_fw_query_bt_info(struct rtw_dev *rtwdev) in rtw_fw_query_bt_info() argument
357 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_query_bt_info()
360 void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw) in rtw_fw_wl_ch_info() argument
370 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_wl_ch_info()
373 void rtw_fw_query_bt_mp_info(struct rtw_dev *rtwdev, in rtw_fw_query_bt_mp_info() argument
386 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_query_bt_mp_info()
389 void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl) in rtw_fw_force_bt_tx_power() argument
398 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_force_bt_tx_power()
401 void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable) in rtw_fw_bt_ignore_wlan_action() argument
409 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_bt_ignore_wlan_action()
412 void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev, in rtw_fw_coex_tdma_type() argument
425 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_coex_tdma_type()
428 void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data) in rtw_fw_bt_wifi_control() argument
442 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_bt_wifi_control()
445 void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) in rtw_fw_send_rssi_info() argument
457 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_send_rssi_info()
460 void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) in rtw_fw_send_ra_info() argument
485 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_send_ra_info()
488 void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool connect) in rtw_fw_media_status_report() argument
496 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_media_status_report()
499 void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev) in rtw_fw_set_pwr_mode() argument
501 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_fw_set_pwr_mode()
513 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_pwr_mode()
516 void rtw_fw_set_keep_alive_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_keep_alive_cmd() argument
531 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_keep_alive_cmd()
534 void rtw_fw_set_disconnect_decision_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_disconnect_decision_cmd() argument
536 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_fw_set_disconnect_decision_cmd()
553 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_disconnect_decision_cmd()
556 void rtw_fw_set_wowlan_ctrl_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_wowlan_ctrl_cmd() argument
558 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_fw_set_wowlan_ctrl_cmd()
564 if (rtw_wow_mgd_linked(rtwdev)) { in rtw_fw_set_wowlan_ctrl_cmd()
575 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_wowlan_ctrl_cmd()
578 void rtw_fw_set_aoac_global_info_cmd(struct rtw_dev *rtwdev, in rtw_fw_set_aoac_global_info_cmd() argument
589 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_aoac_global_info_cmd()
592 void rtw_fw_set_remote_wake_ctrl_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_remote_wake_ctrl_cmd() argument
600 if (rtw_wow_no_link(rtwdev)) in rtw_fw_set_remote_wake_ctrl_cmd()
603 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_remote_wake_ctrl_cmd()
606 static u8 rtw_get_rsvd_page_location(struct rtw_dev *rtwdev, in rtw_get_rsvd_page_location() argument
612 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_location()
620 void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_nlo_info() argument
625 loc_nlo = rtw_get_rsvd_page_location(rtwdev, RSVD_NLO_INFO); in rtw_fw_set_nlo_info()
637 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_nlo_info()
640 void rtw_fw_set_pg_info(struct rtw_dev *rtwdev) in rtw_fw_set_pg_info() argument
642 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_fw_set_pg_info()
646 loc_pg = rtw_get_rsvd_page_location(rtwdev, RSVD_LPS_PG_INFO); in rtw_fw_set_pg_info()
647 loc_dpk = rtw_get_rsvd_page_location(rtwdev, RSVD_LPS_PG_DPK); in rtw_fw_set_pg_info()
656 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_pg_info()
659 static u8 rtw_get_rsvd_page_probe_req_location(struct rtw_dev *rtwdev, in rtw_get_rsvd_page_probe_req_location() argument
665 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_probe_req_location()
676 static u16 rtw_get_rsvd_page_probe_req_size(struct rtw_dev *rtwdev, in rtw_get_rsvd_page_probe_req_size() argument
682 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_probe_req_size()
693 void rtw_send_rsvd_page_h2c(struct rtw_dev *rtwdev) in rtw_send_rsvd_page_h2c() argument
700 location = rtw_get_rsvd_page_location(rtwdev, RSVD_PROBE_RESP); in rtw_send_rsvd_page_h2c()
702 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_PROBE_RESP loc: %d\n", location); in rtw_send_rsvd_page_h2c()
704 location = rtw_get_rsvd_page_location(rtwdev, RSVD_PS_POLL); in rtw_send_rsvd_page_h2c()
706 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_PS_POLL loc: %d\n", location); in rtw_send_rsvd_page_h2c()
708 location = rtw_get_rsvd_page_location(rtwdev, RSVD_NULL); in rtw_send_rsvd_page_h2c()
710 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_NULL loc: %d\n", location); in rtw_send_rsvd_page_h2c()
712 location = rtw_get_rsvd_page_location(rtwdev, RSVD_QOS_NULL); in rtw_send_rsvd_page_h2c()
714 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_QOS_NULL loc: %d\n", location); in rtw_send_rsvd_page_h2c()
716 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_send_rsvd_page_h2c()
721 struct rtw_dev *rtwdev = hw->priv; in rtw_nlo_info_get() local
722 struct rtw_chip_info *chip = rtwdev->chip; in rtw_nlo_info_get()
723 struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req; in rtw_nlo_info_get()
756 loc = rtw_get_rsvd_page_probe_req_location(rtwdev, ssid); in rtw_nlo_info_get()
758 rtw_err(rtwdev, "failed to get probe req rsvd loc\n"); in rtw_nlo_info_get()
776 struct rtw_dev *rtwdev = hw->priv; in rtw_cs_channel_info_get() local
777 struct rtw_chip_info *chip = rtwdev->chip; in rtw_cs_channel_info_get()
778 struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req; in rtw_cs_channel_info_get()
810 struct rtw_dev *rtwdev = hw->priv; in rtw_lps_pg_dpk_get() local
811 struct rtw_chip_info *chip = rtwdev->chip; in rtw_lps_pg_dpk_get()
812 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw_lps_pg_dpk_get()
835 struct rtw_dev *rtwdev = hw->priv; in rtw_lps_pg_info_get() local
836 struct rtw_chip_info *chip = rtwdev->chip; in rtw_lps_pg_info_get()
837 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_lps_pg_info_get()
839 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_lps_pg_info_get()
850 pg_info_hdr->tx_bu_page_count = rtwdev->fifo.rsvd_drv_pg_num; in rtw_lps_pg_info_get()
851 pg_info_hdr->macid = find_first_bit(rtwdev->mac_id_map, RTW_MAX_MAC_ID_NUM); in rtw_lps_pg_info_get()
853 rtw_sec_cam_pg_backup(rtwdev, pg_info_hdr->sec_cam); in rtw_lps_pg_info_get()
932 static void rtw_fill_rsvd_page_desc(struct rtw_dev *rtwdev, struct sk_buff *skb, in rtw_fill_rsvd_page_desc() argument
936 struct rtw_chip_info *chip = rtwdev->chip; in rtw_fill_rsvd_page_desc()
939 rtw_tx_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb, type); in rtw_fill_rsvd_page_desc()
950 static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 page_size, in rtw_rsvd_page_list_to_buf() argument
963 static struct rtw_rsvd_page *rtw_alloc_rsvd_page(struct rtw_dev *rtwdev, in rtw_alloc_rsvd_page() argument
982 static void rtw_insert_rsvd_page(struct rtw_dev *rtwdev, in rtw_insert_rsvd_page() argument
986 lockdep_assert_held(&rtwdev->mutex); in rtw_insert_rsvd_page()
991 static void rtw_add_rsvd_page(struct rtw_dev *rtwdev, in rtw_add_rsvd_page() argument
998 rsvd_pkt = rtw_alloc_rsvd_page(rtwdev, type, txdesc); in rtw_add_rsvd_page()
1000 rtw_err(rtwdev, "failed to alloc rsvd page %d\n", type); in rtw_add_rsvd_page()
1005 rtw_insert_rsvd_page(rtwdev, rtwvif, rsvd_pkt); in rtw_add_rsvd_page()
1008 static void rtw_add_rsvd_page_probe_req(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_probe_req() argument
1014 rsvd_pkt = rtw_alloc_rsvd_page(rtwdev, RSVD_PROBE_REQ, true); in rtw_add_rsvd_page_probe_req()
1016 rtw_err(rtwdev, "failed to alloc probe req rsvd page\n"); in rtw_add_rsvd_page_probe_req()
1022 rtw_insert_rsvd_page(rtwdev, rtwvif, rsvd_pkt); in rtw_add_rsvd_page_probe_req()
1025 void rtw_remove_rsvd_page(struct rtw_dev *rtwdev, in rtw_remove_rsvd_page() argument
1030 lockdep_assert_held(&rtwdev->mutex); in rtw_remove_rsvd_page()
1042 void rtw_add_rsvd_page_bcn(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_bcn() argument
1050 rtw_warn(rtwdev, "Cannot add beacon rsvd page for %d\n", in rtw_add_rsvd_page_bcn()
1055 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_BEACON, false); in rtw_add_rsvd_page_bcn()
1058 void rtw_add_rsvd_page_pno(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_pno() argument
1062 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_add_rsvd_page_pno()
1068 rtw_warn(rtwdev, "Cannot add PNO rsvd page for %d\n", in rtw_add_rsvd_page_pno()
1075 rtw_add_rsvd_page_probe_req(rtwdev, rtwvif, ssid); in rtw_add_rsvd_page_pno()
1078 rtw_add_rsvd_page_probe_req(rtwdev, rtwvif, NULL); in rtw_add_rsvd_page_pno()
1079 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_NLO_INFO, false); in rtw_add_rsvd_page_pno()
1080 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_CH_INFO, true); in rtw_add_rsvd_page_pno()
1083 void rtw_add_rsvd_page_sta(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_sta() argument
1089 rtw_warn(rtwdev, "Cannot add sta rsvd page for %d\n", in rtw_add_rsvd_page_sta()
1094 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_PS_POLL, true); in rtw_add_rsvd_page_sta()
1095 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_QOS_NULL, true); in rtw_add_rsvd_page_sta()
1096 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_NULL, true); in rtw_add_rsvd_page_sta()
1097 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_LPS_PG_DPK, true); in rtw_add_rsvd_page_sta()
1098 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_LPS_PG_INFO, true); in rtw_add_rsvd_page_sta()
1101 int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr, in rtw_fw_write_data_rsvd_page() argument
1111 lockdep_assert_held(&rtwdev->mutex); in rtw_fw_write_data_rsvd_page()
1116 if (rtw_chip_wcpu_11n(rtwdev)) { in rtw_fw_write_data_rsvd_page()
1117 rtw_write32_set(rtwdev, REG_DWBCN0_CTRL, BIT_BCN_VALID); in rtw_fw_write_data_rsvd_page()
1121 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2, pg_addr); in rtw_fw_write_data_rsvd_page()
1124 val = rtw_read8(rtwdev, REG_CR + 1); in rtw_fw_write_data_rsvd_page()
1127 rtw_write8(rtwdev, REG_CR + 1, val); in rtw_fw_write_data_rsvd_page()
1129 val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2); in rtw_fw_write_data_rsvd_page()
1132 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, val); in rtw_fw_write_data_rsvd_page()
1134 ret = rtw_hci_write_data_rsvd_page(rtwdev, buf, size); in rtw_fw_write_data_rsvd_page()
1136 rtw_err(rtwdev, "failed to write data to rsvd page\n"); in rtw_fw_write_data_rsvd_page()
1140 if (rtw_chip_wcpu_11n(rtwdev)) { in rtw_fw_write_data_rsvd_page()
1148 if (!check_hw_ready(rtwdev, bcn_valid_addr, bcn_valid_mask, 1)) { in rtw_fw_write_data_rsvd_page()
1149 rtw_err(rtwdev, "error beacon valid\n"); in rtw_fw_write_data_rsvd_page()
1154 rsvd_pg_head = rtwdev->fifo.rsvd_boundary; in rtw_fw_write_data_rsvd_page()
1155 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2, in rtw_fw_write_data_rsvd_page()
1157 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]); in rtw_fw_write_data_rsvd_page()
1158 rtw_write8(rtwdev, REG_CR + 1, bckp[0]); in rtw_fw_write_data_rsvd_page()
1163 static int rtw_download_drv_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size) in rtw_download_drv_rsvd_page() argument
1169 pg_size = rtwdev->chip->page_size; in rtw_download_drv_rsvd_page()
1171 if (pg_num > rtwdev->fifo.rsvd_drv_pg_num) in rtw_download_drv_rsvd_page()
1174 pg_addr = rtwdev->fifo.rsvd_drv_addr; in rtw_download_drv_rsvd_page()
1176 return rtw_fw_write_data_rsvd_page(rtwdev, pg_addr, buf, size); in rtw_download_drv_rsvd_page()
1179 static void __rtw_build_rsvd_page_reset(struct rtw_dev *rtwdev) in __rtw_build_rsvd_page_reset() argument
1183 list_for_each_entry_safe(rsvd_pkt, tmp, &rtwdev->rsvd_page_list, in __rtw_build_rsvd_page_reset()
1198 struct rtw_dev *rtwdev = data; in rtw_build_rsvd_page_iter() local
1205 &rtwdev->rsvd_page_list); in rtw_build_rsvd_page_iter()
1208 &rtwdev->rsvd_page_list); in rtw_build_rsvd_page_iter()
1212 static int __rtw_build_rsvd_page_from_vifs(struct rtw_dev *rtwdev) in __rtw_build_rsvd_page_from_vifs() argument
1216 __rtw_build_rsvd_page_reset(rtwdev); in __rtw_build_rsvd_page_from_vifs()
1219 rtw_iterate_vifs_atomic(rtwdev, rtw_build_rsvd_page_iter, rtwdev); in __rtw_build_rsvd_page_from_vifs()
1221 rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list, in __rtw_build_rsvd_page_from_vifs()
1232 dummy_pkt = rtw_alloc_rsvd_page(rtwdev, RSVD_DUMMY, false); in __rtw_build_rsvd_page_from_vifs()
1234 rtw_err(rtwdev, "failed to alloc dummy rsvd page\n"); in __rtw_build_rsvd_page_from_vifs()
1238 list_add(&dummy_pkt->build_list, &rtwdev->rsvd_page_list); in __rtw_build_rsvd_page_from_vifs()
1244 static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size) in rtw_build_rsvd_page() argument
1246 struct ieee80211_hw *hw = rtwdev->hw; in rtw_build_rsvd_page()
1247 struct rtw_chip_info *chip = rtwdev->chip; in rtw_build_rsvd_page()
1260 ret = __rtw_build_rsvd_page_from_vifs(rtwdev); in rtw_build_rsvd_page()
1262 rtw_err(rtwdev, in rtw_build_rsvd_page()
1267 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1270 rtw_err(rtwdev, "failed to build rsvd packet\n"); in rtw_build_rsvd_page()
1278 rtw_fill_rsvd_page_desc(rtwdev, iter, rsvd_pkt->type); in rtw_build_rsvd_page()
1294 rtw_err(rtwdev, "first page should be a beacon\n"); in rtw_build_rsvd_page()
1304 if (total_page > rtwdev->fifo.rsvd_drv_pg_num) { in rtw_build_rsvd_page()
1305 rtw_err(rtwdev, "rsvd page over size: %d\n", total_page); in rtw_build_rsvd_page()
1321 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1322 rtw_rsvd_page_list_to_buf(rtwdev, page_size, page_margin, in rtw_build_rsvd_page()
1337 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1345 static int rtw_download_beacon(struct rtw_dev *rtwdev) in rtw_download_beacon() argument
1347 struct ieee80211_hw *hw = rtwdev->hw; in rtw_download_beacon()
1352 rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list, in rtw_download_beacon()
1355 rtw_err(rtwdev, "failed to get rsvd page from build list\n"); in rtw_download_beacon()
1361 rtw_err(rtwdev, "invalid rsvd page type %d, should be beacon or dummy\n", in rtw_download_beacon()
1368 rtw_err(rtwdev, "failed to get beacon skb\n"); in rtw_download_beacon()
1372 ret = rtw_download_drv_rsvd_page(rtwdev, skb->data, skb->len); in rtw_download_beacon()
1374 rtw_err(rtwdev, "failed to download drv rsvd page\n"); in rtw_download_beacon()
1381 int rtw_fw_download_rsvd_page(struct rtw_dev *rtwdev) in rtw_fw_download_rsvd_page() argument
1387 buf = rtw_build_rsvd_page(rtwdev, &size); in rtw_fw_download_rsvd_page()
1389 rtw_err(rtwdev, "failed to build rsvd page pkt\n"); in rtw_fw_download_rsvd_page()
1393 ret = rtw_download_drv_rsvd_page(rtwdev, buf, size); in rtw_fw_download_rsvd_page()
1395 rtw_err(rtwdev, "failed to download drv rsvd page\n"); in rtw_fw_download_rsvd_page()
1404 ret = rtw_download_beacon(rtwdev); in rtw_fw_download_rsvd_page()
1406 rtw_err(rtwdev, "failed to download beacon\n"); in rtw_fw_download_rsvd_page()
1416 static void rtw_fw_read_fifo_page(struct rtw_dev *rtwdev, u32 offset, u32 size, in rtw_fw_read_fifo_page() argument
1424 rcr = rtw_read8(rtwdev, REG_RCR + 2); in rtw_fw_read_fifo_page()
1425 ctl = rtw_read16(rtwdev, REG_PKTBUF_DBG_CTRL) & 0xf000; in rtw_fw_read_fifo_page()
1427 rtw_write8(rtwdev, REG_RCR, rcr | BIT(3)); in rtw_fw_read_fifo_page()
1430 rtw_write16(rtwdev, REG_PKTBUF_DBG_CTRL, start_pg | ctl); in rtw_fw_read_fifo_page()
1434 buf[idx++] = rtw_read32(rtwdev, i); in rtw_fw_read_fifo_page()
1445 rtw_write16(rtwdev, REG_PKTBUF_DBG_CTRL, ctl); in rtw_fw_read_fifo_page()
1446 rtw_write8(rtwdev, REG_RCR + 2, rcr); in rtw_fw_read_fifo_page()
1449 static void rtw_fw_read_fifo(struct rtw_dev *rtwdev, enum rtw_fw_fifo_sel sel, in rtw_fw_read_fifo() argument
1452 struct rtw_chip_info *chip = rtwdev->chip; in rtw_fw_read_fifo()
1456 rtw_dbg(rtwdev, RTW_DBG_FW, "wrong fw fifo sel\n"); in rtw_fw_read_fifo()
1460 offset += rtwdev->fifo.rsvd_boundary << TX_PAGE_SIZE_SHIFT; in rtw_fw_read_fifo()
1464 rtw_fw_read_fifo_page(rtwdev, offset, size, buf, residue, start_pg); in rtw_fw_read_fifo()
1467 static bool rtw_fw_dump_check_size(struct rtw_dev *rtwdev, in rtw_fw_dump_check_size() argument
1474 if ((start_addr + size) > rtwdev->chip->fw_fifo_addr[sel]) in rtw_fw_dump_check_size()
1482 int rtw_fw_dump_fifo(struct rtw_dev *rtwdev, u8 fifo_sel, u32 addr, u32 size, in rtw_fw_dump_fifo() argument
1485 if (!rtwdev->chip->fw_fifo_addr[0]) { in rtw_fw_dump_fifo()
1486 rtw_dbg(rtwdev, RTW_DBG_FW, "chip not support dump fw fifo\n"); in rtw_fw_dump_fifo()
1494 rtw_dbg(rtwdev, RTW_DBG_FW, "not 4byte alignment\n"); in rtw_fw_dump_fifo()
1498 if (!rtw_fw_dump_check_size(rtwdev, fifo_sel, addr, size)) { in rtw_fw_dump_fifo()
1499 rtw_dbg(rtwdev, RTW_DBG_FW, "fw fifo dump size overflow\n"); in rtw_fw_dump_fifo()
1503 rtw_fw_read_fifo(rtwdev, fifo_sel, addr, size, buffer); in rtw_fw_dump_fifo()
1508 static void __rtw_fw_update_pkt(struct rtw_dev *rtwdev, u8 pkt_id, u16 size, in __rtw_fw_update_pkt() argument
1523 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in __rtw_fw_update_pkt()
1526 void rtw_fw_update_pkt_probe_req(struct rtw_dev *rtwdev, in rtw_fw_update_pkt_probe_req() argument
1532 loc = rtw_get_rsvd_page_probe_req_location(rtwdev, ssid); in rtw_fw_update_pkt_probe_req()
1534 rtw_err(rtwdev, "failed to get probe_req rsvd loc\n"); in rtw_fw_update_pkt_probe_req()
1538 size = rtw_get_rsvd_page_probe_req_size(rtwdev, ssid); in rtw_fw_update_pkt_probe_req()
1540 rtw_err(rtwdev, "failed to get probe_req rsvd size\n"); in rtw_fw_update_pkt_probe_req()
1544 __rtw_fw_update_pkt(rtwdev, RTW_PACKET_PROBE_REQ, size, loc); in rtw_fw_update_pkt_probe_req()
1547 void rtw_fw_channel_switch(struct rtw_dev *rtwdev, bool enable) in rtw_fw_channel_switch() argument
1549 struct rtw_pno_request *rtw_pno_req = &rtwdev->wow.pno_req; in rtw_fw_channel_switch()
1580 loc_ch_info = rtw_get_rsvd_page_location(rtwdev, RSVD_CH_INFO); in rtw_fw_channel_switch()
1583 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_channel_switch()