Lines Matching refs:rtwdev
18 static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev *rtwdev, in rtw_fw_c2h_cmd_handle_ext() argument
29 rtw_tx_report_handle(rtwdev, skb, C2H_CCX_RPT); in rtw_fw_c2h_cmd_handle_ext()
59 struct rtw_dev *rtwdev; member
116 static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload, in rtw_fw_ra_report_handle() argument
124 rtwdev->dm_info.tx_rate = GET_RA_REPORT_RATE(payload); in rtw_fw_ra_report_handle()
125 ra_data.rtwdev = rtwdev; in rtw_fw_ra_report_handle()
127 rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data); in rtw_fw_ra_report_handle()
131 struct rtw_dev *rtwdev; member
139 struct rtw_dev *rtwdev = iter_data->rtwdev; in rtw_fw_bcn_filter_notify_vif_iter() local
155 rtwdev->beacon_loss = false; in rtw_fw_bcn_filter_notify_vif_iter()
158 rtwdev->beacon_loss = true; in rtw_fw_bcn_filter_notify_vif_iter()
159 rtw_leave_lps(rtwdev); in rtw_fw_bcn_filter_notify_vif_iter()
164 static void rtw_fw_bcn_filter_notify(struct rtw_dev *rtwdev, u8 *payload, in rtw_fw_bcn_filter_notify() argument
169 dev_iter_data.rtwdev = rtwdev; in rtw_fw_bcn_filter_notify()
171 rtw_iterate_vifs(rtwdev, rtw_fw_bcn_filter_notify_vif_iter, in rtw_fw_bcn_filter_notify()
175 static void rtw_fw_scan_result(struct rtw_dev *rtwdev, u8 *payload, in rtw_fw_scan_result() argument
178 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_fw_scan_result()
182 rtw_dbg(rtwdev, RTW_DBG_FW, "scan.density = %x\n", in rtw_fw_scan_result()
186 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb) in rtw_fw_c2h_cmd_handle() argument
196 mutex_lock(&rtwdev->mutex); in rtw_fw_c2h_cmd_handle()
198 if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags)) in rtw_fw_c2h_cmd_handle()
203 rtw_tx_report_handle(rtwdev, skb, C2H_CCX_TX_RPT); in rtw_fw_c2h_cmd_handle()
206 rtw_coex_bt_info_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
209 rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
212 rtw_fw_bcn_filter_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
215 rtw_fw_c2h_cmd_handle_ext(rtwdev, skb); in rtw_fw_c2h_cmd_handle()
218 rtw_fw_ra_report_handle(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
221 rtw_dbg(rtwdev, RTW_DBG_FW, "C2H 0x%x isn't handled\n", c2h->id); in rtw_fw_c2h_cmd_handle()
226 mutex_unlock(&rtwdev->mutex); in rtw_fw_c2h_cmd_handle()
229 void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset, in rtw_fw_c2h_cmd_rx_irqsafe() argument
239 rtw_dbg(rtwdev, RTW_DBG_FW, "recv C2H, id=0x%02x, seq=0x%02x, len=%d\n", in rtw_fw_c2h_cmd_rx_irqsafe()
244 rtw_coex_info_response(rtwdev, skb); in rtw_fw_c2h_cmd_rx_irqsafe()
247 complete(&rtwdev->lps_leave_check); in rtw_fw_c2h_cmd_rx_irqsafe()
251 complete(&rtwdev->fw_scan_density); in rtw_fw_c2h_cmd_rx_irqsafe()
252 rtw_fw_scan_result(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_rx_irqsafe()
258 skb_queue_tail(&rtwdev->c2h_queue, skb); in rtw_fw_c2h_cmd_rx_irqsafe()
259 ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); in rtw_fw_c2h_cmd_rx_irqsafe()
265 void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev) in rtw_fw_c2h_cmd_isr() argument
267 if (rtw_read8(rtwdev, REG_MCU_TST_CFG) == VAL_FW_TRIGGER) in rtw_fw_c2h_cmd_isr()
268 rtw_fw_recovery(rtwdev); in rtw_fw_c2h_cmd_isr()
270 rtw_warn(rtwdev, "unhandled firmware c2h interrupt\n"); in rtw_fw_c2h_cmd_isr()
274 static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, in rtw_fw_send_h2c_command() argument
283 rtw_dbg(rtwdev, RTW_DBG_FW, in rtw_fw_send_h2c_command()
288 spin_lock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_command()
290 box = rtwdev->h2c.last_box_num; in rtw_fw_send_h2c_command()
315 false, rtwdev, REG_HMETFR); in rtw_fw_send_h2c_command()
318 rtw_err(rtwdev, "failed to send h2c command\n"); in rtw_fw_send_h2c_command()
323 rtw_write8(rtwdev, box_reg + idx, h2c[idx]); in rtw_fw_send_h2c_command()
325 rtw_write8(rtwdev, box_ex_reg + idx, h2c[idx + 4]); in rtw_fw_send_h2c_command()
327 if (++rtwdev->h2c.last_box_num >= 4) in rtw_fw_send_h2c_command()
328 rtwdev->h2c.last_box_num = 0; in rtw_fw_send_h2c_command()
331 spin_unlock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_command()
334 void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c) in rtw_fw_h2c_cmd_dbg() argument
336 rtw_fw_send_h2c_command(rtwdev, h2c); in rtw_fw_h2c_cmd_dbg()
339 static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt) in rtw_fw_send_h2c_packet() argument
343 spin_lock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_packet()
345 FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq); in rtw_fw_send_h2c_packet()
346 ret = rtw_hci_write_data_h2c(rtwdev, h2c_pkt, H2C_PKT_SIZE); in rtw_fw_send_h2c_packet()
348 rtw_err(rtwdev, "failed to send h2c packet\n"); in rtw_fw_send_h2c_packet()
349 rtwdev->h2c.seq++; in rtw_fw_send_h2c_packet()
351 spin_unlock(&rtwdev->h2c.lock); in rtw_fw_send_h2c_packet()
355 rtw_fw_send_general_info(struct rtw_dev *rtwdev) in rtw_fw_send_general_info() argument
357 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in rtw_fw_send_general_info()
361 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_fw_send_general_info()
372 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_send_general_info()
376 rtw_fw_send_phydm_info(struct rtw_dev *rtwdev) in rtw_fw_send_phydm_info() argument
378 struct rtw_hal *hal = &rtwdev->hal; in rtw_fw_send_phydm_info()
379 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_fw_send_phydm_info()
384 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_fw_send_phydm_info()
401 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_send_phydm_info()
404 void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para) in rtw_fw_do_iqk() argument
414 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_do_iqk()
418 void rtw_fw_inform_rfk_status(struct rtw_dev *rtwdev, bool start) in rtw_fw_inform_rfk_status() argument
426 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_inform_rfk_status()
430 void rtw_fw_query_bt_info(struct rtw_dev *rtwdev) in rtw_fw_query_bt_info() argument
438 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_query_bt_info()
441 void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw) in rtw_fw_wl_ch_info() argument
451 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_wl_ch_info()
454 void rtw_fw_query_bt_mp_info(struct rtw_dev *rtwdev, in rtw_fw_query_bt_mp_info() argument
467 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_query_bt_mp_info()
470 void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl) in rtw_fw_force_bt_tx_power() argument
479 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_force_bt_tx_power()
482 void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable) in rtw_fw_bt_ignore_wlan_action() argument
490 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_bt_ignore_wlan_action()
493 void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev, in rtw_fw_coex_tdma_type() argument
506 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_coex_tdma_type()
509 void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data) in rtw_fw_bt_wifi_control() argument
523 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_bt_wifi_control()
526 void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) in rtw_fw_send_rssi_info() argument
538 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_send_rssi_info()
541 void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) in rtw_fw_send_ra_info() argument
566 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_send_ra_info()
569 void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool connect) in rtw_fw_media_status_report() argument
577 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_media_status_report()
580 void rtw_fw_update_wl_phy_info(struct rtw_dev *rtwdev) in rtw_fw_update_wl_phy_info() argument
582 struct rtw_traffic_stats *stats = &rtwdev->stats; in rtw_fw_update_wl_phy_info()
583 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_fw_update_wl_phy_info()
592 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_update_wl_phy_info()
595 void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, bool connect, in rtw_fw_beacon_filter_config() argument
606 if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER) || !si) in rtw_fw_beacon_filter_config()
612 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_beacon_filter_config()
618 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_beacon_filter_config()
631 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_beacon_filter_config()
634 void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev) in rtw_fw_set_pwr_mode() argument
636 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_fw_set_pwr_mode()
648 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_pwr_mode()
651 void rtw_fw_set_keep_alive_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_keep_alive_cmd() argument
666 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_keep_alive_cmd()
669 void rtw_fw_set_disconnect_decision_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_disconnect_decision_cmd() argument
671 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_fw_set_disconnect_decision_cmd()
688 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_disconnect_decision_cmd()
691 void rtw_fw_set_wowlan_ctrl_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_wowlan_ctrl_cmd() argument
693 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_fw_set_wowlan_ctrl_cmd()
699 if (rtw_wow_mgd_linked(rtwdev)) { in rtw_fw_set_wowlan_ctrl_cmd()
710 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_wowlan_ctrl_cmd()
713 void rtw_fw_set_aoac_global_info_cmd(struct rtw_dev *rtwdev, in rtw_fw_set_aoac_global_info_cmd() argument
724 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_aoac_global_info_cmd()
727 void rtw_fw_set_remote_wake_ctrl_cmd(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_remote_wake_ctrl_cmd() argument
735 if (rtw_wow_no_link(rtwdev)) in rtw_fw_set_remote_wake_ctrl_cmd()
738 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_remote_wake_ctrl_cmd()
741 static u8 rtw_get_rsvd_page_location(struct rtw_dev *rtwdev, in rtw_get_rsvd_page_location() argument
747 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_location()
755 void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable) in rtw_fw_set_nlo_info() argument
760 loc_nlo = rtw_get_rsvd_page_location(rtwdev, RSVD_NLO_INFO); in rtw_fw_set_nlo_info()
766 if (rtw_get_lps_deep_mode(rtwdev) != LPS_DEEP_MODE_NONE) in rtw_fw_set_nlo_info()
772 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_nlo_info()
775 void rtw_fw_set_pg_info(struct rtw_dev *rtwdev) in rtw_fw_set_pg_info() argument
777 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_fw_set_pg_info()
781 loc_pg = rtw_get_rsvd_page_location(rtwdev, RSVD_LPS_PG_INFO); in rtw_fw_set_pg_info()
782 loc_dpk = rtw_get_rsvd_page_location(rtwdev, RSVD_LPS_PG_DPK); in rtw_fw_set_pg_info()
791 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_set_pg_info()
794 static u8 rtw_get_rsvd_page_probe_req_location(struct rtw_dev *rtwdev, in rtw_get_rsvd_page_probe_req_location() argument
800 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_probe_req_location()
811 static u16 rtw_get_rsvd_page_probe_req_size(struct rtw_dev *rtwdev, in rtw_get_rsvd_page_probe_req_size() argument
817 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_probe_req_size()
828 void rtw_send_rsvd_page_h2c(struct rtw_dev *rtwdev) in rtw_send_rsvd_page_h2c() argument
835 location = rtw_get_rsvd_page_location(rtwdev, RSVD_PROBE_RESP); in rtw_send_rsvd_page_h2c()
837 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_PROBE_RESP loc: %d\n", location); in rtw_send_rsvd_page_h2c()
839 location = rtw_get_rsvd_page_location(rtwdev, RSVD_PS_POLL); in rtw_send_rsvd_page_h2c()
841 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_PS_POLL loc: %d\n", location); in rtw_send_rsvd_page_h2c()
843 location = rtw_get_rsvd_page_location(rtwdev, RSVD_NULL); in rtw_send_rsvd_page_h2c()
845 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_NULL loc: %d\n", location); in rtw_send_rsvd_page_h2c()
847 location = rtw_get_rsvd_page_location(rtwdev, RSVD_QOS_NULL); in rtw_send_rsvd_page_h2c()
849 rtw_dbg(rtwdev, RTW_DBG_FW, "RSVD_QOS_NULL loc: %d\n", location); in rtw_send_rsvd_page_h2c()
851 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_send_rsvd_page_h2c()
856 struct rtw_dev *rtwdev = hw->priv; in rtw_nlo_info_get() local
857 struct rtw_chip_info *chip = rtwdev->chip; in rtw_nlo_info_get()
858 struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req; in rtw_nlo_info_get()
891 loc = rtw_get_rsvd_page_probe_req_location(rtwdev, ssid); in rtw_nlo_info_get()
893 rtw_err(rtwdev, "failed to get probe req rsvd loc\n"); in rtw_nlo_info_get()
911 struct rtw_dev *rtwdev = hw->priv; in rtw_cs_channel_info_get() local
912 struct rtw_chip_info *chip = rtwdev->chip; in rtw_cs_channel_info_get()
913 struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req; in rtw_cs_channel_info_get()
945 struct rtw_dev *rtwdev = hw->priv; in rtw_lps_pg_dpk_get() local
946 struct rtw_chip_info *chip = rtwdev->chip; in rtw_lps_pg_dpk_get()
947 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw_lps_pg_dpk_get()
970 struct rtw_dev *rtwdev = hw->priv; in rtw_lps_pg_info_get() local
971 struct rtw_chip_info *chip = rtwdev->chip; in rtw_lps_pg_info_get()
972 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_lps_pg_info_get()
974 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_lps_pg_info_get()
985 pg_info_hdr->tx_bu_page_count = rtwdev->fifo.rsvd_drv_pg_num; in rtw_lps_pg_info_get()
986 pg_info_hdr->macid = find_first_bit(rtwdev->mac_id_map, RTW_MAX_MAC_ID_NUM); in rtw_lps_pg_info_get()
988 rtw_sec_cam_pg_backup(rtwdev, pg_info_hdr->sec_cam); in rtw_lps_pg_info_get()
1069 static void rtw_fill_rsvd_page_desc(struct rtw_dev *rtwdev, struct sk_buff *skb, in rtw_fill_rsvd_page_desc() argument
1073 struct rtw_chip_info *chip = rtwdev->chip; in rtw_fill_rsvd_page_desc()
1076 rtw_tx_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb, type); in rtw_fill_rsvd_page_desc()
1087 static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 page_size, in rtw_rsvd_page_list_to_buf() argument
1100 static struct rtw_rsvd_page *rtw_alloc_rsvd_page(struct rtw_dev *rtwdev, in rtw_alloc_rsvd_page() argument
1119 static void rtw_insert_rsvd_page(struct rtw_dev *rtwdev, in rtw_insert_rsvd_page() argument
1123 lockdep_assert_held(&rtwdev->mutex); in rtw_insert_rsvd_page()
1128 static void rtw_add_rsvd_page(struct rtw_dev *rtwdev, in rtw_add_rsvd_page() argument
1135 rsvd_pkt = rtw_alloc_rsvd_page(rtwdev, type, txdesc); in rtw_add_rsvd_page()
1137 rtw_err(rtwdev, "failed to alloc rsvd page %d\n", type); in rtw_add_rsvd_page()
1142 rtw_insert_rsvd_page(rtwdev, rtwvif, rsvd_pkt); in rtw_add_rsvd_page()
1145 static void rtw_add_rsvd_page_probe_req(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_probe_req() argument
1151 rsvd_pkt = rtw_alloc_rsvd_page(rtwdev, RSVD_PROBE_REQ, true); in rtw_add_rsvd_page_probe_req()
1153 rtw_err(rtwdev, "failed to alloc probe req rsvd page\n"); in rtw_add_rsvd_page_probe_req()
1159 rtw_insert_rsvd_page(rtwdev, rtwvif, rsvd_pkt); in rtw_add_rsvd_page_probe_req()
1162 void rtw_remove_rsvd_page(struct rtw_dev *rtwdev, in rtw_remove_rsvd_page() argument
1167 lockdep_assert_held(&rtwdev->mutex); in rtw_remove_rsvd_page()
1179 void rtw_add_rsvd_page_bcn(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_bcn() argument
1187 rtw_warn(rtwdev, "Cannot add beacon rsvd page for %d\n", in rtw_add_rsvd_page_bcn()
1192 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_BEACON, false); in rtw_add_rsvd_page_bcn()
1195 void rtw_add_rsvd_page_pno(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_pno() argument
1199 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_add_rsvd_page_pno()
1205 rtw_warn(rtwdev, "Cannot add PNO rsvd page for %d\n", in rtw_add_rsvd_page_pno()
1212 rtw_add_rsvd_page_probe_req(rtwdev, rtwvif, ssid); in rtw_add_rsvd_page_pno()
1215 rtw_add_rsvd_page_probe_req(rtwdev, rtwvif, NULL); in rtw_add_rsvd_page_pno()
1216 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_NLO_INFO, false); in rtw_add_rsvd_page_pno()
1217 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_CH_INFO, true); in rtw_add_rsvd_page_pno()
1220 void rtw_add_rsvd_page_sta(struct rtw_dev *rtwdev, in rtw_add_rsvd_page_sta() argument
1226 rtw_warn(rtwdev, "Cannot add sta rsvd page for %d\n", in rtw_add_rsvd_page_sta()
1231 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_PS_POLL, true); in rtw_add_rsvd_page_sta()
1232 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_QOS_NULL, true); in rtw_add_rsvd_page_sta()
1233 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_NULL, true); in rtw_add_rsvd_page_sta()
1234 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_LPS_PG_DPK, true); in rtw_add_rsvd_page_sta()
1235 rtw_add_rsvd_page(rtwdev, rtwvif, RSVD_LPS_PG_INFO, true); in rtw_add_rsvd_page_sta()
1238 int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr, in rtw_fw_write_data_rsvd_page() argument
1248 lockdep_assert_held(&rtwdev->mutex); in rtw_fw_write_data_rsvd_page()
1253 if (rtw_chip_wcpu_11n(rtwdev)) { in rtw_fw_write_data_rsvd_page()
1254 rtw_write32_set(rtwdev, REG_DWBCN0_CTRL, BIT_BCN_VALID); in rtw_fw_write_data_rsvd_page()
1258 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2, pg_addr); in rtw_fw_write_data_rsvd_page()
1261 val = rtw_read8(rtwdev, REG_CR + 1); in rtw_fw_write_data_rsvd_page()
1264 rtw_write8(rtwdev, REG_CR + 1, val); in rtw_fw_write_data_rsvd_page()
1266 val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2); in rtw_fw_write_data_rsvd_page()
1269 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, val); in rtw_fw_write_data_rsvd_page()
1271 ret = rtw_hci_write_data_rsvd_page(rtwdev, buf, size); in rtw_fw_write_data_rsvd_page()
1273 rtw_err(rtwdev, "failed to write data to rsvd page\n"); in rtw_fw_write_data_rsvd_page()
1277 if (rtw_chip_wcpu_11n(rtwdev)) { in rtw_fw_write_data_rsvd_page()
1285 if (!check_hw_ready(rtwdev, bcn_valid_addr, bcn_valid_mask, 1)) { in rtw_fw_write_data_rsvd_page()
1286 rtw_err(rtwdev, "error beacon valid\n"); in rtw_fw_write_data_rsvd_page()
1291 rsvd_pg_head = rtwdev->fifo.rsvd_boundary; in rtw_fw_write_data_rsvd_page()
1292 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2, in rtw_fw_write_data_rsvd_page()
1294 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]); in rtw_fw_write_data_rsvd_page()
1295 rtw_write8(rtwdev, REG_CR + 1, bckp[0]); in rtw_fw_write_data_rsvd_page()
1300 static int rtw_download_drv_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size) in rtw_download_drv_rsvd_page() argument
1306 pg_size = rtwdev->chip->page_size; in rtw_download_drv_rsvd_page()
1308 if (pg_num > rtwdev->fifo.rsvd_drv_pg_num) in rtw_download_drv_rsvd_page()
1311 pg_addr = rtwdev->fifo.rsvd_drv_addr; in rtw_download_drv_rsvd_page()
1313 return rtw_fw_write_data_rsvd_page(rtwdev, pg_addr, buf, size); in rtw_download_drv_rsvd_page()
1316 static void __rtw_build_rsvd_page_reset(struct rtw_dev *rtwdev) in __rtw_build_rsvd_page_reset() argument
1320 list_for_each_entry_safe(rsvd_pkt, tmp, &rtwdev->rsvd_page_list, in __rtw_build_rsvd_page_reset()
1335 struct rtw_dev *rtwdev = data; in rtw_build_rsvd_page_iter() local
1342 &rtwdev->rsvd_page_list); in rtw_build_rsvd_page_iter()
1345 &rtwdev->rsvd_page_list); in rtw_build_rsvd_page_iter()
1349 static int __rtw_build_rsvd_page_from_vifs(struct rtw_dev *rtwdev) in __rtw_build_rsvd_page_from_vifs() argument
1353 __rtw_build_rsvd_page_reset(rtwdev); in __rtw_build_rsvd_page_from_vifs()
1356 rtw_iterate_vifs_atomic(rtwdev, rtw_build_rsvd_page_iter, rtwdev); in __rtw_build_rsvd_page_from_vifs()
1358 rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list, in __rtw_build_rsvd_page_from_vifs()
1369 dummy_pkt = rtw_alloc_rsvd_page(rtwdev, RSVD_DUMMY, false); in __rtw_build_rsvd_page_from_vifs()
1371 rtw_err(rtwdev, "failed to alloc dummy rsvd page\n"); in __rtw_build_rsvd_page_from_vifs()
1375 list_add(&dummy_pkt->build_list, &rtwdev->rsvd_page_list); in __rtw_build_rsvd_page_from_vifs()
1381 static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size) in rtw_build_rsvd_page() argument
1383 struct ieee80211_hw *hw = rtwdev->hw; in rtw_build_rsvd_page()
1384 struct rtw_chip_info *chip = rtwdev->chip; in rtw_build_rsvd_page()
1397 ret = __rtw_build_rsvd_page_from_vifs(rtwdev); in rtw_build_rsvd_page()
1399 rtw_err(rtwdev, in rtw_build_rsvd_page()
1404 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1407 rtw_err(rtwdev, "failed to build rsvd packet\n"); in rtw_build_rsvd_page()
1415 rtw_fill_rsvd_page_desc(rtwdev, iter, rsvd_pkt->type); in rtw_build_rsvd_page()
1431 rtw_err(rtwdev, "first page should be a beacon\n"); in rtw_build_rsvd_page()
1441 if (total_page > rtwdev->fifo.rsvd_drv_pg_num) { in rtw_build_rsvd_page()
1442 rtw_err(rtwdev, "rsvd page over size: %d\n", total_page); in rtw_build_rsvd_page()
1458 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1459 rtw_rsvd_page_list_to_buf(rtwdev, page_size, page_margin, in rtw_build_rsvd_page()
1474 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1482 static int rtw_download_beacon(struct rtw_dev *rtwdev) in rtw_download_beacon() argument
1484 struct ieee80211_hw *hw = rtwdev->hw; in rtw_download_beacon()
1489 rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list, in rtw_download_beacon()
1492 rtw_err(rtwdev, "failed to get rsvd page from build list\n"); in rtw_download_beacon()
1498 rtw_err(rtwdev, "invalid rsvd page type %d, should be beacon or dummy\n", in rtw_download_beacon()
1505 rtw_err(rtwdev, "failed to get beacon skb\n"); in rtw_download_beacon()
1509 ret = rtw_download_drv_rsvd_page(rtwdev, skb->data, skb->len); in rtw_download_beacon()
1511 rtw_err(rtwdev, "failed to download drv rsvd page\n"); in rtw_download_beacon()
1518 int rtw_fw_download_rsvd_page(struct rtw_dev *rtwdev) in rtw_fw_download_rsvd_page() argument
1524 buf = rtw_build_rsvd_page(rtwdev, &size); in rtw_fw_download_rsvd_page()
1526 rtw_err(rtwdev, "failed to build rsvd page pkt\n"); in rtw_fw_download_rsvd_page()
1530 ret = rtw_download_drv_rsvd_page(rtwdev, buf, size); in rtw_fw_download_rsvd_page()
1532 rtw_err(rtwdev, "failed to download drv rsvd page\n"); in rtw_fw_download_rsvd_page()
1541 ret = rtw_download_beacon(rtwdev); in rtw_fw_download_rsvd_page()
1543 rtw_err(rtwdev, "failed to download beacon\n"); in rtw_fw_download_rsvd_page()
1553 static void rtw_fw_read_fifo_page(struct rtw_dev *rtwdev, u32 offset, u32 size, in rtw_fw_read_fifo_page() argument
1561 rcr = rtw_read8(rtwdev, REG_RCR + 2); in rtw_fw_read_fifo_page()
1562 ctl = rtw_read16(rtwdev, REG_PKTBUF_DBG_CTRL) & 0xf000; in rtw_fw_read_fifo_page()
1564 rtw_write8(rtwdev, REG_RCR, rcr | BIT(3)); in rtw_fw_read_fifo_page()
1567 rtw_write16(rtwdev, REG_PKTBUF_DBG_CTRL, start_pg | ctl); in rtw_fw_read_fifo_page()
1571 buf[idx++] = rtw_read32(rtwdev, i); in rtw_fw_read_fifo_page()
1582 rtw_write16(rtwdev, REG_PKTBUF_DBG_CTRL, ctl); in rtw_fw_read_fifo_page()
1583 rtw_write8(rtwdev, REG_RCR + 2, rcr); in rtw_fw_read_fifo_page()
1586 static void rtw_fw_read_fifo(struct rtw_dev *rtwdev, enum rtw_fw_fifo_sel sel, in rtw_fw_read_fifo() argument
1589 struct rtw_chip_info *chip = rtwdev->chip; in rtw_fw_read_fifo()
1593 rtw_dbg(rtwdev, RTW_DBG_FW, "wrong fw fifo sel\n"); in rtw_fw_read_fifo()
1597 offset += rtwdev->fifo.rsvd_boundary << TX_PAGE_SIZE_SHIFT; in rtw_fw_read_fifo()
1601 rtw_fw_read_fifo_page(rtwdev, offset, size, buf, residue, start_pg); in rtw_fw_read_fifo()
1604 static bool rtw_fw_dump_check_size(struct rtw_dev *rtwdev, in rtw_fw_dump_check_size() argument
1611 if ((start_addr + size) > rtwdev->chip->fw_fifo_addr[sel]) in rtw_fw_dump_check_size()
1619 int rtw_fw_dump_fifo(struct rtw_dev *rtwdev, u8 fifo_sel, u32 addr, u32 size, in rtw_fw_dump_fifo() argument
1622 if (!rtwdev->chip->fw_fifo_addr[0]) { in rtw_fw_dump_fifo()
1623 rtw_dbg(rtwdev, RTW_DBG_FW, "chip not support dump fw fifo\n"); in rtw_fw_dump_fifo()
1631 rtw_dbg(rtwdev, RTW_DBG_FW, "not 4byte alignment\n"); in rtw_fw_dump_fifo()
1635 if (!rtw_fw_dump_check_size(rtwdev, fifo_sel, addr, size)) { in rtw_fw_dump_fifo()
1636 rtw_dbg(rtwdev, RTW_DBG_FW, "fw fifo dump size overflow\n"); in rtw_fw_dump_fifo()
1640 rtw_fw_read_fifo(rtwdev, fifo_sel, addr, size, buffer); in rtw_fw_dump_fifo()
1645 static void __rtw_fw_update_pkt(struct rtw_dev *rtwdev, u8 pkt_id, u16 size, in __rtw_fw_update_pkt() argument
1648 struct rtw_chip_info *chip = rtwdev->chip; in __rtw_fw_update_pkt()
1662 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in __rtw_fw_update_pkt()
1665 void rtw_fw_update_pkt_probe_req(struct rtw_dev *rtwdev, in rtw_fw_update_pkt_probe_req() argument
1671 loc = rtw_get_rsvd_page_probe_req_location(rtwdev, ssid); in rtw_fw_update_pkt_probe_req()
1673 rtw_err(rtwdev, "failed to get probe_req rsvd loc\n"); in rtw_fw_update_pkt_probe_req()
1677 size = rtw_get_rsvd_page_probe_req_size(rtwdev, ssid); in rtw_fw_update_pkt_probe_req()
1679 rtw_err(rtwdev, "failed to get probe_req rsvd size\n"); in rtw_fw_update_pkt_probe_req()
1683 __rtw_fw_update_pkt(rtwdev, RTW_PACKET_PROBE_REQ, size, loc); in rtw_fw_update_pkt_probe_req()
1686 void rtw_fw_channel_switch(struct rtw_dev *rtwdev, bool enable) in rtw_fw_channel_switch() argument
1688 struct rtw_pno_request *rtw_pno_req = &rtwdev->wow.pno_req; in rtw_fw_channel_switch()
1719 loc_ch_info = rtw_get_rsvd_page_location(rtwdev, RSVD_CH_INFO); in rtw_fw_channel_switch()
1722 rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); in rtw_fw_channel_switch()
1725 void rtw_fw_scan_notify(struct rtw_dev *rtwdev, bool start) in rtw_fw_scan_notify() argument
1732 rtw_fw_send_h2c_command(rtwdev, h2c_pkt); in rtw_fw_scan_notify()