Lines Matching +full:- +full:1200 +full:ps

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019 Realtek Corporation
16 #include "ps.h"
71 val = rtw_read32_mask(rtwdev, reg->addr, reg->mask); in _rtw_fw_dump_dbg_info()
74 reg->desc, reg->addr, reg->mask, val); in _rtw_fw_dump_dbg_info()
100 sub_cmd_id = c2h->payload[0]; in rtw_fw_c2h_cmd_handle_ext()
125 return 1200; in get_max_amsdu_len()
148 struct rtw_c2h_ra_rpt *ra_rpt = (struct rtw_c2h_ra_rpt *)ra_data->payload; in rtw_fw_ra_report_iter()
149 struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; in rtw_fw_ra_report_iter()
154 mac_id = ra_rpt->mac_id; in rtw_fw_ra_report_iter()
155 if (si->mac_id != mac_id) in rtw_fw_ra_report_iter()
158 si->ra_report.txrate.flags = 0; in rtw_fw_ra_report_iter()
160 rate = u8_get_bits(ra_rpt->rate_sgi, RTW_C2H_RA_RPT_RATE); in rtw_fw_ra_report_iter()
161 sgi = u8_get_bits(ra_rpt->rate_sgi, RTW_C2H_RA_RPT_SGI); in rtw_fw_ra_report_iter()
162 if (ra_data->length >= offsetofend(typeof(*ra_rpt), bw)) in rtw_fw_ra_report_iter()
163 bw = ra_rpt->bw; in rtw_fw_ra_report_iter()
165 bw = si->bw_mode; in rtw_fw_ra_report_iter()
168 si->ra_report.txrate.legacy = rtw_desc_to_bitrate(rate); in rtw_fw_ra_report_iter()
174 si->ra_report.txrate.flags |= RATE_INFO_FLAGS_VHT_MCS; in rtw_fw_ra_report_iter()
176 si->ra_report.txrate.flags |= RATE_INFO_FLAGS_MCS; in rtw_fw_ra_report_iter()
179 si->ra_report.txrate.mcs = mcs; in rtw_fw_ra_report_iter()
180 si->ra_report.txrate.nss = nss; in rtw_fw_ra_report_iter()
184 si->ra_report.txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; in rtw_fw_ra_report_iter()
187 si->ra_report.txrate.bw = RATE_INFO_BW_80; in rtw_fw_ra_report_iter()
189 si->ra_report.txrate.bw = RATE_INFO_BW_40; in rtw_fw_ra_report_iter()
191 si->ra_report.txrate.bw = RATE_INFO_BW_20; in rtw_fw_ra_report_iter()
194 bit_rate = cfg80211_calculate_bitrate(&si->ra_report.txrate); in rtw_fw_ra_report_iter()
196 si->ra_report.desc_rate = rate; in rtw_fw_ra_report_iter()
197 si->ra_report.bit_rate = bit_rate; in rtw_fw_ra_report_iter()
199 sta->deflink.agg.max_rc_amsdu_len = get_max_amsdu_len(bit_rate); in rtw_fw_ra_report_iter()
208 if (WARN(length < rtwdev->chip->c2h_ra_report_size, in rtw_fw_ra_report_handle()
212 rtwdev->dm_info.tx_rate = u8_get_bits(ra_rpt->rate_sgi, in rtw_fw_ra_report_handle()
229 struct rtw_dev *rtwdev = iter_data->rtwdev; in rtw_fw_bcn_filter_notify_vif_iter()
230 u8 *payload = iter_data->payload; in rtw_fw_bcn_filter_notify_vif_iter()
245 rtwdev->beacon_loss = false; in rtw_fw_bcn_filter_notify_vif_iter()
248 rtwdev->beacon_loss = true; in rtw_fw_bcn_filter_notify_vif_iter()
268 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_fw_scan_result()
270 dm_info->scan_density = payload[0]; in rtw_fw_scan_result()
273 dm_info->scan_density); in rtw_fw_scan_result()
279 const struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th; in rtw_fw_adaptivity_result()
284 result->density, result->igi, result->l2h_th_init, result->l2h, in rtw_fw_adaptivity_result()
285 result->h2l, result->option); in rtw_fw_adaptivity_result()
304 pkt_offset = *((u32 *)skb->cb); in rtw_fw_c2h_cmd_handle()
305 c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset); in rtw_fw_c2h_cmd_handle()
306 len = skb->len - pkt_offset - 2; in rtw_fw_c2h_cmd_handle()
308 mutex_lock(&rtwdev->mutex); in rtw_fw_c2h_cmd_handle()
310 if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags)) in rtw_fw_c2h_cmd_handle()
313 switch (c2h->id) { in rtw_fw_c2h_cmd_handle()
318 rtw_coex_bt_info_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
321 rtw_coex_bt_hid_info_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
324 rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
327 rtw_fw_bcn_filter_notify(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
333 rtw_fw_ra_report_handle(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
336 rtw_fw_adaptivity_result(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_handle()
339 rtw_dbg(rtwdev, RTW_DBG_FW, "C2H 0x%x isn't handled\n", c2h->id); in rtw_fw_c2h_cmd_handle()
344 mutex_unlock(&rtwdev->mutex); in rtw_fw_c2h_cmd_handle()
353 c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset); in rtw_fw_c2h_cmd_rx_irqsafe()
354 len = skb->len - pkt_offset - 2; in rtw_fw_c2h_cmd_rx_irqsafe()
355 *((u32 *)skb->cb) = pkt_offset; in rtw_fw_c2h_cmd_rx_irqsafe()
358 c2h->id, c2h->seq, len); in rtw_fw_c2h_cmd_rx_irqsafe()
360 switch (c2h->id) { in rtw_fw_c2h_cmd_rx_irqsafe()
365 complete(&rtwdev->lps_leave_check); in rtw_fw_c2h_cmd_rx_irqsafe()
369 complete(&rtwdev->fw_scan_density); in rtw_fw_c2h_cmd_rx_irqsafe()
370 rtw_fw_scan_result(rtwdev, c2h->payload, len); in rtw_fw_c2h_cmd_rx_irqsafe()
375 *((u32 *)skb->cb) = pkt_offset; in rtw_fw_c2h_cmd_rx_irqsafe()
376 skb_queue_tail(&rtwdev->c2h_queue, skb); in rtw_fw_c2h_cmd_rx_irqsafe()
377 ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); in rtw_fw_c2h_cmd_rx_irqsafe()
399 rtw_dbg(rtwdev, RTW_DBG_FW, "send H2C content %08x %08x\n", h2c->w0, in rtw_fw_send_h2c_command_register()
400 h2c->w1); in rtw_fw_send_h2c_command_register()
402 lockdep_assert_held(&rtwdev->mutex); in rtw_fw_send_h2c_command_register()
404 box = rtwdev->h2c.last_box_num; in rtw_fw_send_h2c_command_register()
437 rtw_write32(rtwdev, box_ex_reg, h2c->w1); in rtw_fw_send_h2c_command_register()
438 rtw_write32(rtwdev, box_reg, h2c->w0); in rtw_fw_send_h2c_command_register()
440 if (++rtwdev->h2c.last_box_num >= 4) in rtw_fw_send_h2c_command_register()
441 rtwdev->h2c.last_box_num = 0; in rtw_fw_send_h2c_command_register()
458 lockdep_assert_held(&rtwdev->mutex); in rtw_fw_send_h2c_command()
460 box = rtwdev->h2c.last_box_num; in rtw_fw_send_h2c_command()
492 rtw_write32(rtwdev, box_ex_reg, le32_to_cpu(h2c_cmd->msg_ext)); in rtw_fw_send_h2c_command()
493 rtw_write32(rtwdev, box_reg, le32_to_cpu(h2c_cmd->msg)); in rtw_fw_send_h2c_command()
495 if (++rtwdev->h2c.last_box_num >= 4) in rtw_fw_send_h2c_command()
496 rtwdev->h2c.last_box_num = 0; in rtw_fw_send_h2c_command()
508 lockdep_assert_held(&rtwdev->mutex); in rtw_fw_send_h2c_packet()
510 FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq); in rtw_fw_send_h2c_packet()
514 rtwdev->h2c.seq++; in rtw_fw_send_h2c_packet()
520 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in rtw_fw_send_general_info()
532 fifo->rsvd_fw_txbuf_addr - in rtw_fw_send_general_info()
533 fifo->rsvd_boundary); in rtw_fw_send_general_info()
541 struct rtw_hal *hal = &rtwdev->hal; in rtw_fw_send_phydm_info()
542 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_fw_send_phydm_info()
550 if (hal->rf_type == RF_1T1R) in rtw_fw_send_phydm_info()
552 else if (hal->rf_type == RF_2T2R) in rtw_fw_send_phydm_info()
558 PHYDM_INFO_SET_REF_TYPE(h2c_pkt, efuse->rfe_option); in rtw_fw_send_phydm_info()
560 PHYDM_INFO_SET_CUT_VER(h2c_pkt, hal->cut_version); in rtw_fw_send_phydm_info()
561 PHYDM_INFO_SET_RX_ANT_STATUS(h2c_pkt, hal->antenna_tx); in rtw_fw_send_phydm_info()
562 PHYDM_INFO_SET_TX_ANT_STATUS(h2c_pkt, hal->antenna_rx); in rtw_fw_send_phydm_info()
574 IQK_SET_CLEAR(h2c_pkt, para->clear); in rtw_fw_do_iqk()
575 IQK_SET_SEGMENT_IQK(h2c_pkt, para->segment_iqk); in rtw_fw_do_iqk()
608 if (rtwvif->net_type != RTW_NET_MGD_LINKED) in rtw_fw_default_port()
615 u32_encode_bits(rtwvif->port, RTW_H2C_DEFAULT_PORT_W0_PORTID) | in rtw_fw_default_port()
616 u32_encode_bits(rtwvif->mac_id, RTW_H2C_DEFAULT_PORT_W0_MACID); in rtw_fw_default_port()
641 SET_BT_MP_INFO_SEQ(h2c_pkt, req->seq); in rtw_fw_query_bt_mp_info()
642 SET_BT_MP_INFO_OP_CODE(h2c_pkt, req->op_code); in rtw_fw_query_bt_mp_info()
643 SET_BT_MP_INFO_PARA1(h2c_pkt, req->para1); in rtw_fw_query_bt_mp_info()
644 SET_BT_MP_INFO_PARA2(h2c_pkt, req->para2); in rtw_fw_query_bt_mp_info()
645 SET_BT_MP_INFO_PARA3(h2c_pkt, req->para3); in rtw_fw_query_bt_mp_info()
653 u8 index = 0 - bt_pwr_dec_lvl; in rtw_fw_force_bt_tx_power()
721 u8 rssi = ewma_rssi_read(&si->avg_rssi); in rtw_fw_send_rssi_info()
722 bool stbc_en = si->stbc_en ? true : false; in rtw_fw_send_rssi_info()
726 SET_RSSI_INFO_MACID(h2c_pkt, si->mac_id); in rtw_fw_send_rssi_info()
742 SET_RA_INFO_MACID(h2c_pkt, si->mac_id); in rtw_fw_send_ra_info()
743 SET_RA_INFO_RATE_ID(h2c_pkt, si->rate_id); in rtw_fw_send_ra_info()
744 SET_RA_INFO_INIT_RA_LVL(h2c_pkt, si->init_ra_lv); in rtw_fw_send_ra_info()
745 SET_RA_INFO_SGI_EN(h2c_pkt, si->sgi_enable); in rtw_fw_send_ra_info()
746 SET_RA_INFO_BW_MODE(h2c_pkt, si->bw_mode); in rtw_fw_send_ra_info()
747 SET_RA_INFO_LDPC(h2c_pkt, !!si->ldpc_en); in rtw_fw_send_ra_info()
749 SET_RA_INFO_VHT_EN(h2c_pkt, si->vht_enable); in rtw_fw_send_ra_info()
751 SET_RA_INFO_RA_MASK0(h2c_pkt, (si->ra_mask & 0xff)); in rtw_fw_send_ra_info()
752 SET_RA_INFO_RA_MASK1(h2c_pkt, (si->ra_mask & 0xff00) >> 8); in rtw_fw_send_ra_info()
753 SET_RA_INFO_RA_MASK2(h2c_pkt, (si->ra_mask & 0xff0000) >> 16); in rtw_fw_send_ra_info()
754 SET_RA_INFO_RA_MASK3(h2c_pkt, (si->ra_mask & 0xff000000) >> 24); in rtw_fw_send_ra_info()
756 si->init_ra_lv = 0; in rtw_fw_send_ra_info()
760 if (rtwdev->chip->id != RTW_CHIP_TYPE_8814A) in rtw_fw_send_ra_info()
765 mask_hi = si->ra_mask >> 32; in rtw_fw_send_ra_info()
788 struct rtw_traffic_stats *stats = &rtwdev->stats; in rtw_fw_update_wl_phy_info()
789 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_fw_update_wl_phy_info()
793 SET_WL_PHY_INFO_TX_TP(h2c_pkt, stats->tx_throughput); in rtw_fw_update_wl_phy_info()
794 SET_WL_PHY_INFO_RX_TP(h2c_pkt, stats->rx_throughput); in rtw_fw_update_wl_phy_info()
795 SET_WL_PHY_INFO_TX_RATE_DESC(h2c_pkt, dm_info->tx_rate); in rtw_fw_update_wl_phy_info()
796 SET_WL_PHY_INFO_RX_RATE_DESC(h2c_pkt, dm_info->curr_rx_rate); in rtw_fw_update_wl_phy_info()
797 SET_WL_PHY_INFO_RX_EVM(h2c_pkt, dm_info->rx_evm_dbm[RF_PATH_A]); in rtw_fw_update_wl_phy_info()
804 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in rtw_fw_beacon_filter_config()
805 struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid); in rtw_fw_beacon_filter_config()
808 sta ? (struct rtw_sta_info *)sta->drv_priv : NULL; in rtw_fw_beacon_filter_config()
813 if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER)) in rtw_fw_beacon_filter_config()
816 if (bss_conf->cqm_rssi_thold) in rtw_fw_beacon_filter_config()
817 thold = bss_conf->cqm_rssi_thold; in rtw_fw_beacon_filter_config()
818 if (bss_conf->cqm_rssi_hyst) in rtw_fw_beacon_filter_config()
819 hyst = bss_conf->cqm_rssi_hyst; in rtw_fw_beacon_filter_config()
833 ether_addr_copy(&h2c_pkt[1], bss_conf->bssid); in rtw_fw_beacon_filter_config()
844 SET_BCN_FILTER_OFFLOAD_P1_MACID(h2c_pkt, si->mac_id); in rtw_fw_beacon_filter_config()
846 SET_BCN_FILTER_OFFLOAD_P1_BCN_INTERVAL(h2c_pkt, bss_conf->beacon_int); in rtw_fw_beacon_filter_config()
852 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_fw_set_pwr_mode()
857 SET_PWR_MODE_SET_MODE(h2c_pkt, conf->mode); in rtw_fw_set_pwr_mode()
858 SET_PWR_MODE_SET_RLBM(h2c_pkt, conf->rlbm); in rtw_fw_set_pwr_mode()
859 SET_PWR_MODE_SET_SMART_PS(h2c_pkt, conf->smart_ps); in rtw_fw_set_pwr_mode()
860 SET_PWR_MODE_SET_AWAKE_INTERVAL(h2c_pkt, conf->awake_interval); in rtw_fw_set_pwr_mode()
861 SET_PWR_MODE_SET_PORT_ID(h2c_pkt, conf->port_id); in rtw_fw_set_pwr_mode()
862 SET_PWR_MODE_SET_PWR_STATE(h2c_pkt, conf->state); in rtw_fw_set_pwr_mode()
887 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_fw_set_disconnect_decision_cmd()
897 if (test_bit(RTW_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) { in rtw_fw_set_disconnect_decision_cmd()
909 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_fw_set_wowlan_ctrl_cmd()
916 if (test_bit(RTW_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) in rtw_fw_set_wowlan_ctrl_cmd()
918 if (test_bit(RTW_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) in rtw_fw_set_wowlan_ctrl_cmd()
920 if (test_bit(RTW_WOW_FLAG_EN_REKEY_PKT, rtw_wow->flags)) in rtw_fw_set_wowlan_ctrl_cmd()
922 if (rtw_wow->pattern_cnt) in rtw_fw_set_wowlan_ctrl_cmd()
963 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_location()
964 if (type == rsvd_pkt->type) in rtw_get_rsvd_page_location()
965 location = rsvd_pkt->page; in rtw_get_rsvd_page_location()
1003 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_fw_set_pg_info()
1014 LPS_PG_SEC_CAM_EN(h2c_pkt, conf->sec_cam_backup); in rtw_fw_set_pg_info()
1015 LPS_PG_PATTERN_CAM_EN(h2c_pkt, conf->pattern_cam_backup); in rtw_fw_set_pg_info()
1026 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_probe_req_location()
1027 if (rsvd_pkt->type != RSVD_PROBE_REQ) in rtw_get_rsvd_page_probe_req_location()
1029 if ((!ssid && !rsvd_pkt->ssid) || in rtw_get_rsvd_page_probe_req_location()
1030 cfg80211_ssid_eq(rsvd_pkt->ssid, ssid)) in rtw_get_rsvd_page_probe_req_location()
1031 location = rsvd_pkt->page; in rtw_get_rsvd_page_probe_req_location()
1043 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_get_rsvd_page_probe_req_size()
1044 if (rsvd_pkt->type != RSVD_PROBE_REQ) in rtw_get_rsvd_page_probe_req_size()
1046 if ((!ssid && !rsvd_pkt->ssid) || in rtw_get_rsvd_page_probe_req_size()
1047 cfg80211_ssid_eq(rsvd_pkt->ssid, ssid)) in rtw_get_rsvd_page_probe_req_size()
1048 size = rsvd_pkt->probe_req_size; in rtw_get_rsvd_page_probe_req_size()
1082 struct rtw_dev *rtwdev = hw->priv; in rtw_nlo_info_get()
1083 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_nlo_info_get()
1084 struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req; in rtw_nlo_info_get()
1092 if (!pno_req->inited || !pno_req->match_set_cnt) in rtw_nlo_info_get()
1095 size = sizeof(struct rtw_nlo_info_hdr) + pno_req->match_set_cnt * in rtw_nlo_info_get()
1096 IEEE80211_MAX_SSID_LEN + chip->tx_pkt_desc_sz; in rtw_nlo_info_get()
1102 skb_reserve(skb, chip->tx_pkt_desc_sz); in rtw_nlo_info_get()
1106 nlo_hdr->nlo_count = pno_req->match_set_cnt; in rtw_nlo_info_get()
1107 nlo_hdr->hidden_ap_count = pno_req->match_set_cnt; in rtw_nlo_info_get()
1110 memset(nlo_hdr->pattern_check, 0xA5, FW_NLO_INFO_CHECK_SIZE); in rtw_nlo_info_get()
1112 for (i = 0; i < pno_req->match_set_cnt; i++) in rtw_nlo_info_get()
1113 nlo_hdr->ssid_len[i] = pno_req->match_sets[i].ssid.ssid_len; in rtw_nlo_info_get()
1115 for (i = 0; i < pno_req->match_set_cnt; i++) { in rtw_nlo_info_get()
1116 ssid = &pno_req->match_sets[i].ssid; in rtw_nlo_info_get()
1123 nlo_hdr->location[i] = loc; in rtw_nlo_info_get()
1126 for (i = 0; i < pno_req->match_set_cnt; i++) { in rtw_nlo_info_get()
1128 memcpy(pos, pno_req->match_sets[i].ssid.ssid, in rtw_nlo_info_get()
1129 pno_req->match_sets[i].ssid.ssid_len); in rtw_nlo_info_get()
1137 struct rtw_dev *rtwdev = hw->priv; in rtw_cs_channel_info_get()
1138 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_cs_channel_info_get()
1139 struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req; in rtw_cs_channel_info_get()
1140 struct ieee80211_channel *channels = pno_req->channels; in rtw_cs_channel_info_get()
1142 int count = pno_req->channel_cnt; in rtw_cs_channel_info_get()
1146 skb = alloc_skb(4 * count + chip->tx_pkt_desc_sz, GFP_KERNEL); in rtw_cs_channel_info_get()
1150 skb_reserve(skb, chip->tx_pkt_desc_sz); in rtw_cs_channel_info_get()
1171 struct rtw_dev *rtwdev = hw->priv; in rtw_lps_pg_dpk_get()
1172 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_lps_pg_dpk_get()
1173 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw_lps_pg_dpk_get()
1178 size = chip->tx_pkt_desc_sz + sizeof(*dpk_hdr); in rtw_lps_pg_dpk_get()
1183 skb_reserve(skb, chip->tx_pkt_desc_sz); in rtw_lps_pg_dpk_get()
1185 dpk_hdr->dpk_ch = dpk_info->dpk_ch; in rtw_lps_pg_dpk_get()
1186 dpk_hdr->dpk_path_ok = dpk_info->dpk_path_ok[0]; in rtw_lps_pg_dpk_get()
1187 memcpy(dpk_hdr->dpk_txagc, dpk_info->dpk_txagc, 2); in rtw_lps_pg_dpk_get()
1188 memcpy(dpk_hdr->dpk_gs, dpk_info->dpk_gs, 4); in rtw_lps_pg_dpk_get()
1189 memcpy(dpk_hdr->coef, dpk_info->coef, 160); in rtw_lps_pg_dpk_get()
1196 struct rtw_dev *rtwdev = hw->priv; in rtw_lps_pg_info_get()
1197 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_lps_pg_info_get()
1198 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_lps_pg_info_get()
1200 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_lps_pg_info_get()
1204 size = chip->tx_pkt_desc_sz + sizeof(*pg_info_hdr); in rtw_lps_pg_info_get()
1209 skb_reserve(skb, chip->tx_pkt_desc_sz); in rtw_lps_pg_info_get()
1211 pg_info_hdr->tx_bu_page_count = rtwdev->fifo.rsvd_drv_pg_num; in rtw_lps_pg_info_get()
1212 pg_info_hdr->macid = find_first_bit(rtwdev->mac_id_map, RTW_MAX_MAC_ID_NUM); in rtw_lps_pg_info_get()
1213 pg_info_hdr->sec_cam_count = in rtw_lps_pg_info_get()
1214 rtw_sec_cam_pg_backup(rtwdev, pg_info_hdr->sec_cam); in rtw_lps_pg_info_get()
1215 pg_info_hdr->pattern_count = rtw_wow->pattern_cnt; in rtw_lps_pg_info_get()
1217 conf->sec_cam_backup = pg_info_hdr->sec_cam_count != 0; in rtw_lps_pg_info_get()
1218 conf->pattern_cam_backup = rtw_wow->pattern_cnt != 0; in rtw_lps_pg_info_get()
1232 if (rsvd_pkt->type == RSVD_DUMMY) { in rtw_get_rsvd_page_skb()
1241 rtwvif = rsvd_pkt->rtwvif; in rtw_get_rsvd_page_skb()
1247 switch (rsvd_pkt->type) { in rtw_get_rsvd_page_skb()
1250 rsvd_pkt->tim_offset = tim_offset; in rtw_get_rsvd_page_skb()
1259 skb_new = ieee80211_nullfunc_get(hw, vif, -1, false); in rtw_get_rsvd_page_skb()
1262 skb_new = ieee80211_nullfunc_get(hw, vif, -1, true); in rtw_get_rsvd_page_skb()
1271 ssid = (struct cfg80211_ssid *)rsvd_pkt->ssid; in rtw_get_rsvd_page_skb()
1273 skb_new = ieee80211_probereq_get(hw, vif->addr, in rtw_get_rsvd_page_skb()
1274 ssid->ssid, in rtw_get_rsvd_page_skb()
1275 ssid->ssid_len, 0); in rtw_get_rsvd_page_skb()
1277 skb_new = ieee80211_probereq_get(hw, vif->addr, NULL, 0, 0); in rtw_get_rsvd_page_skb()
1279 rsvd_pkt->probe_req_size = (u16)skb_new->len; in rtw_get_rsvd_page_skb()
1301 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_fill_rsvd_page_desc()
1305 pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz); in rtw_fill_rsvd_page_desc()
1306 memset(pkt_desc, 0, chip->tx_pkt_desc_sz); in rtw_fill_rsvd_page_desc()
1319 struct sk_buff *skb = rsvd_pkt->skb; in rtw_rsvd_page_list_to_buf()
1322 memcpy(buf + page_margin + page_size * (page - 1), in rtw_rsvd_page_list_to_buf()
1323 skb->data, skb->len); in rtw_rsvd_page_list_to_buf()
1325 memcpy(buf, skb->data, skb->len); in rtw_rsvd_page_list_to_buf()
1339 INIT_LIST_HEAD(&rsvd_pkt->vif_list); in rtw_alloc_rsvd_page()
1340 INIT_LIST_HEAD(&rsvd_pkt->build_list); in rtw_alloc_rsvd_page()
1341 rsvd_pkt->type = type; in rtw_alloc_rsvd_page()
1342 rsvd_pkt->add_txdesc = txdesc; in rtw_alloc_rsvd_page()
1351 lockdep_assert_held(&rtwdev->mutex); in rtw_insert_rsvd_page()
1353 list_add_tail(&rsvd_pkt->vif_list, &rtwvif->rsvd_page_list); in rtw_insert_rsvd_page()
1369 rsvd_pkt->rtwvif = rtwvif; in rtw_add_rsvd_page()
1385 rsvd_pkt->rtwvif = rtwvif; in rtw_add_rsvd_page_probe_req()
1386 rsvd_pkt->ssid = ssid; in rtw_add_rsvd_page_probe_req()
1395 lockdep_assert_held(&rtwdev->mutex); in rtw_remove_rsvd_page()
1398 list_for_each_entry_safe(rsvd_pkt, tmp, &rtwvif->rsvd_page_list, in rtw_remove_rsvd_page()
1400 list_del(&rsvd_pkt->vif_list); in rtw_remove_rsvd_page()
1401 if (!list_empty(&rsvd_pkt->build_list)) in rtw_remove_rsvd_page()
1402 list_del(&rsvd_pkt->build_list); in rtw_remove_rsvd_page()
1412 if (vif->type != NL80211_IFTYPE_AP && in rtw_add_rsvd_page_bcn()
1413 vif->type != NL80211_IFTYPE_ADHOC && in rtw_add_rsvd_page_bcn()
1414 vif->type != NL80211_IFTYPE_MESH_POINT) { in rtw_add_rsvd_page_bcn()
1416 vif->type); in rtw_add_rsvd_page_bcn()
1427 struct rtw_wow_param *rtw_wow = &rtwdev->wow; in rtw_add_rsvd_page_pno()
1428 struct rtw_pno_request *rtw_pno_req = &rtw_wow->pno_req; in rtw_add_rsvd_page_pno()
1432 if (vif->type != NL80211_IFTYPE_STATION) { in rtw_add_rsvd_page_pno()
1434 vif->type); in rtw_add_rsvd_page_pno()
1438 for (i = 0 ; i < rtw_pno_req->match_set_cnt; i++) { in rtw_add_rsvd_page_pno()
1439 ssid = &rtw_pno_req->match_sets[i].ssid; in rtw_add_rsvd_page_pno()
1453 if (vif->type != NL80211_IFTYPE_STATION) { in rtw_add_rsvd_page_sta()
1455 vif->type); in rtw_add_rsvd_page_sta()
1476 lockdep_assert_held(&rtwdev->mutex); in rtw_fw_write_data_rsvd_page()
1479 return -EINVAL; in rtw_fw_write_data_rsvd_page()
1522 ret = -EBUSY; in rtw_fw_write_data_rsvd_page()
1526 rsvd_pg_head = rtwdev->fifo.rsvd_boundary; in rtw_fw_write_data_rsvd_page()
1543 pg_size = rtwdev->chip->page_size; in rtw_download_drv_rsvd_page()
1544 pg_num = size / pg_size + ((size & (pg_size - 1)) ? 1 : 0); in rtw_download_drv_rsvd_page()
1545 if (pg_num > rtwdev->fifo.rsvd_drv_pg_num) in rtw_download_drv_rsvd_page()
1546 return -ENOMEM; in rtw_download_drv_rsvd_page()
1548 pg_addr = rtwdev->fifo.rsvd_drv_addr; in rtw_download_drv_rsvd_page()
1557 list_for_each_entry_safe(rsvd_pkt, tmp, &rtwdev->rsvd_page_list, in __rtw_build_rsvd_page_reset()
1559 list_del_init(&rsvd_pkt->build_list); in __rtw_build_rsvd_page_reset()
1564 if (rsvd_pkt->type == RSVD_DUMMY) in __rtw_build_rsvd_page_reset()
1573 struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; in rtw_build_rsvd_page_iter()
1577 if (vif->type == NL80211_IFTYPE_AP && !rtwdev->ap_active) in rtw_build_rsvd_page_iter()
1580 list_for_each_entry(rsvd_pkt, &rtwvif->rsvd_page_list, vif_list) { in rtw_build_rsvd_page_iter()
1581 if (rsvd_pkt->type == RSVD_BEACON) in rtw_build_rsvd_page_iter()
1582 list_add(&rsvd_pkt->build_list, in rtw_build_rsvd_page_iter()
1583 &rtwdev->rsvd_page_list); in rtw_build_rsvd_page_iter()
1585 list_add_tail(&rsvd_pkt->build_list, in rtw_build_rsvd_page_iter()
1586 &rtwdev->rsvd_page_list); in rtw_build_rsvd_page_iter()
1599 rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list, in __rtw_build_rsvd_page_from_vifs()
1603 return -EINVAL; in __rtw_build_rsvd_page_from_vifs()
1607 if (rsvd_pkt->type != RSVD_BEACON) { in __rtw_build_rsvd_page_from_vifs()
1613 return -ENOMEM; in __rtw_build_rsvd_page_from_vifs()
1616 list_add(&dummy_pkt->build_list, &rtwdev->rsvd_page_list); in __rtw_build_rsvd_page_from_vifs()
1624 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_build_rsvd_page()
1625 struct ieee80211_hw *hw = rtwdev->hw; in rtw_build_rsvd_page()
1634 page_size = chip->page_size; in rtw_build_rsvd_page()
1635 tx_desc_sz = chip->tx_pkt_desc_sz; in rtw_build_rsvd_page()
1636 page_margin = page_size - tx_desc_sz; in rtw_build_rsvd_page()
1645 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1653 * And iter->len will be added with size of tx_desc_sz. in rtw_build_rsvd_page()
1655 if (rsvd_pkt->add_txdesc) in rtw_build_rsvd_page()
1656 rtw_fill_rsvd_page_desc(rtwdev, iter, rsvd_pkt->type); in rtw_build_rsvd_page()
1658 rsvd_pkt->skb = iter; in rtw_build_rsvd_page()
1659 rsvd_pkt->page = total_page; in rtw_build_rsvd_page()
1670 if (rsvd_pkt->type != RSVD_BEACON && in rtw_build_rsvd_page()
1671 rsvd_pkt->type != RSVD_DUMMY) { in rtw_build_rsvd_page()
1675 total_page += rtw_len_to_page(iter->len + tx_desc_sz, in rtw_build_rsvd_page()
1678 total_page += rtw_len_to_page(iter->len, page_size); in rtw_build_rsvd_page()
1682 if (total_page > rtwdev->fifo.rsvd_drv_pg_num) { in rtw_build_rsvd_page()
1687 *size = (total_page - 1) * page_size + page_margin; in rtw_build_rsvd_page()
1695 * Note that the first rsvd_pkt is a beacon no matter what vif->type. in rtw_build_rsvd_page()
1699 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1703 page += rtw_len_to_page(rsvd_pkt->skb->len + in rtw_build_rsvd_page()
1706 page += rtw_len_to_page(rsvd_pkt->skb->len, page_size); in rtw_build_rsvd_page()
1708 kfree_skb(rsvd_pkt->skb); in rtw_build_rsvd_page()
1709 rsvd_pkt->skb = NULL; in rtw_build_rsvd_page()
1715 list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, build_list) { in rtw_build_rsvd_page()
1716 kfree_skb(rsvd_pkt->skb); in rtw_build_rsvd_page()
1717 rsvd_pkt->skb = NULL; in rtw_build_rsvd_page()
1725 struct ieee80211_hw *hw = rtwdev->hw; in rtw_download_beacon()
1730 rsvd_pkt = list_first_entry_or_null(&rtwdev->rsvd_page_list, in rtw_download_beacon()
1734 return -ENOENT; in rtw_download_beacon()
1737 if (rsvd_pkt->type != RSVD_BEACON && in rtw_download_beacon()
1738 rsvd_pkt->type != RSVD_DUMMY) { in rtw_download_beacon()
1740 rsvd_pkt->type); in rtw_download_beacon()
1741 return -EINVAL; in rtw_download_beacon()
1747 return -ENOMEM; in rtw_download_beacon()
1750 ret = rtw_download_drv_rsvd_page(rtwdev, skb->data, skb->len); in rtw_download_beacon()
1768 return -ENOMEM; in rtw_fw_download_rsvd_page()
1799 mutex_lock(&rtwdev->mutex); in rtw_fw_update_beacon_work()
1802 mutex_unlock(&rtwdev->mutex); in rtw_fw_update_beacon_work()
1822 size -= 4; in rtw_fw_read_fifo_page()
1840 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_fw_read_fifo()
1848 offset += rtwdev->fifo.rsvd_boundary << TX_PAGE_SIZE_SHIFT; in rtw_fw_read_fifo()
1849 residue = offset & (FIFO_PAGE_SIZE - 1); in rtw_fw_read_fifo()
1850 start_pg = (offset >> FIFO_PAGE_SIZE_SHIFT) + chip->fw_fifo_addr[sel]; in rtw_fw_read_fifo()
1862 if ((start_addr + size) > rtwdev->chip->fw_fifo_addr[sel]) in rtw_fw_dump_check_size()
1873 if (!rtwdev->chip->fw_fifo_addr[0]) { in rtw_fw_dump_fifo()
1875 return -ENOTSUPP; in rtw_fw_dump_fifo()
1879 return -EINVAL; in rtw_fw_dump_fifo()
1883 return -EINVAL; in rtw_fw_dump_fifo()
1888 return -EINVAL; in rtw_fw_dump_fifo()
1899 const struct rtw_chip_info *chip = rtwdev->chip; in __rtw_fw_update_pkt()
1910 size += chip->tx_pkt_desc_sz; in __rtw_fw_update_pkt()
1939 struct rtw_pno_request *rtw_pno_req = &rtwdev->wow.pno_req; in rtw_fw_channel_switch()
1967 CH_SWITCH_SET_CH_NUM(h2c_pkt, rtw_pno_req->channel_cnt); in rtw_fw_channel_switch()
1968 CH_SWITCH_SET_INFO_SIZE(h2c_pkt, rtw_pno_req->channel_cnt * 4); in rtw_fw_channel_switch()
1978 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_fw_adaptivity()
1982 dm_info->edcca_mode = RTW_EDCCA_NORMAL; in rtw_fw_adaptivity()
1988 SET_ADAPTIVITY_MODE(h2c_pkt, dm_info->edcca_mode); in rtw_fw_adaptivity()
1990 SET_ADAPTIVITY_IGI(h2c_pkt, dm_info->igi_history[0]); in rtw_fw_adaptivity()
1991 SET_ADAPTIVITY_L2H(h2c_pkt, dm_info->l2h_th_ini); in rtw_fw_adaptivity()
1992 SET_ADAPTIVITY_DENSITY(h2c_pkt, dm_info->scan_density); in rtw_fw_adaptivity()
2011 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_append_probe_req_ie()
2012 struct ieee80211_scan_ies *ies = rtwvif->scan_ies; in rtw_append_probe_req_ie()
2017 if (!(BIT(idx) & chip->band)) in rtw_append_probe_req_ie()
2021 return -ENOMEM; in rtw_append_probe_req_ie()
2022 skb_put_data(new, ies->ies[idx], ies->len[idx]); in rtw_append_probe_req_ie()
2023 skb_put_data(new, ies->common_ies, ies->common_ie_len); in rtw_append_probe_req_ie()
2034 const struct rtw_chip_info *chip = rtwdev->chip; in _rtw_hw_scan_update_probe_req()
2036 u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc; in _rtw_hw_scan_update_probe_req()
2037 u8 tx_desc_sz = chip->tx_pkt_desc_sz; in _rtw_hw_scan_update_probe_req()
2038 u16 page_size = chip->page_size; in _rtw_hw_scan_update_probe_req()
2045 if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM)) in _rtw_hw_scan_update_probe_req()
2054 return -ENOMEM; in _rtw_hw_scan_update_probe_req()
2056 buf_offset -= tx_desc_sz; in _rtw_hw_scan_update_probe_req()
2060 if (skb->len > page_size * page_cnt) { in _rtw_hw_scan_update_probe_req()
2061 ret = -EINVAL; in _rtw_hw_scan_update_probe_req()
2065 memcpy(buf + buf_offset, skb->data, skb->len); in _rtw_hw_scan_update_probe_req()
2066 pkt_len = skb->len - tx_desc_sz; in _rtw_hw_scan_update_probe_req()
2067 loc = pg_addr - rtwdev->fifo.rsvd_boundary + page_offset; in _rtw_hw_scan_update_probe_req()
2081 rtwdev->scan_info.probe_pg_size = page_offset; in _rtw_hw_scan_update_probe_req()
2093 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw_hw_scan_update_probe_req()
2096 u8 num = req->n_ssids, i, bands = 0; in rtw_hw_scan_update_probe_req()
2101 skb = ieee80211_probereq_get(rtwdev->hw, rtwvif->mac_addr, in rtw_hw_scan_update_probe_req()
2102 req->ssids[i].ssid, in rtw_hw_scan_update_probe_req()
2103 req->ssids[i].ssid_len, in rtw_hw_scan_update_probe_req()
2104 req->ie_len); in rtw_hw_scan_update_probe_req()
2106 ret = -ENOMEM; in rtw_hw_scan_update_probe_req()
2129 u8 *chan = &buf[list->size]; in rtw_add_chan_info()
2132 if (list->size > list->buf_size) in rtw_add_chan_info()
2133 return -ENOMEM; in rtw_add_chan_info()
2135 CH_INFO_SET_CH(chan, info->channel); in rtw_add_chan_info()
2136 CH_INFO_SET_PRI_CH_IDX(chan, info->pri_ch_idx); in rtw_add_chan_info()
2137 CH_INFO_SET_BW(chan, info->bw); in rtw_add_chan_info()
2138 CH_INFO_SET_TIMEOUT(chan, info->timeout); in rtw_add_chan_info()
2139 CH_INFO_SET_ACTION_ID(chan, info->action_id); in rtw_add_chan_info()
2140 CH_INFO_SET_EXTRA_INFO(chan, info->extra_info); in rtw_add_chan_info()
2141 if (info->extra_info) { in rtw_add_chan_info()
2144 EXTRA_CH_INFO_SET_SIZE(chan, RTW_EX_CH_INFO_SIZE - in rtw_add_chan_info()
2149 list->size += info_size; in rtw_add_chan_info()
2150 list->ch_num++; in rtw_add_chan_info()
2158 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw_add_chan_list()
2159 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in rtw_add_chan_list()
2163 for (i = 0; i < req->n_channels; i++) { in rtw_add_chan_list()
2166 channel = req->channels[i]; in rtw_add_chan_list()
2167 ch_info.channel = channel->hw_value; in rtw_add_chan_list()
2170 ch_info.timeout = req->duration_mandatory ? in rtw_add_chan_list()
2171 req->duration : RTW_CHANNEL_TIME; in rtw_add_chan_list()
2173 if (channel->flags & (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR)) { in rtw_add_chan_list()
2188 if (list->size > fifo->rsvd_pg_num << TX_PAGE_SIZE_SHIFT) { in rtw_add_chan_list()
2190 return -EINVAL; in rtw_add_chan_list()
2193 list->addr = fifo->rsvd_h2c_info_addr + rtwdev->scan_info.probe_pg_size; in rtw_add_chan_list()
2194 ret = rtw_fw_write_data_rsvd_page(rtwdev, list->addr, buf, list->size); in rtw_add_chan_list()
2206 struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw_fw_set_scan_offload()
2207 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw_fw_set_scan_offload()
2208 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in rtw_fw_set_scan_offload()
2210 u8 pkt_loc = fifo->rsvd_h2c_info_addr - fifo->rsvd_boundary + 1; in rtw_fw_set_scan_offload()
2211 bool random_seq = req->flags & NL80211_SCAN_FLAG_RANDOM_SN; in rtw_fw_set_scan_offload()
2217 SCAN_OFFLOAD_SET_START(h2c_pkt, opt->switch_en); in rtw_fw_set_scan_offload()
2218 SCAN_OFFLOAD_SET_BACK_OP_EN(h2c_pkt, opt->back_op_en); in rtw_fw_set_scan_offload()
2220 SCAN_OFFLOAD_SET_NO_CCK_EN(h2c_pkt, req->no_cck); in rtw_fw_set_scan_offload()
2221 SCAN_OFFLOAD_SET_CH_NUM(h2c_pkt, list->ch_num); in rtw_fw_set_scan_offload()
2222 SCAN_OFFLOAD_SET_CH_INFO_SIZE(h2c_pkt, list->size); in rtw_fw_set_scan_offload()
2223 SCAN_OFFLOAD_SET_CH_INFO_LOC(h2c_pkt, list->addr - fifo->rsvd_boundary); in rtw_fw_set_scan_offload()
2224 SCAN_OFFLOAD_SET_OP_CH(h2c_pkt, scan_info->op_chan); in rtw_fw_set_scan_offload()
2225 SCAN_OFFLOAD_SET_OP_PRI_CH_IDX(h2c_pkt, scan_info->op_pri_ch_idx); in rtw_fw_set_scan_offload()
2226 SCAN_OFFLOAD_SET_OP_BW(h2c_pkt, scan_info->op_bw); in rtw_fw_set_scan_offload()
2227 SCAN_OFFLOAD_SET_OP_PORT_ID(h2c_pkt, rtwvif->port); in rtw_fw_set_scan_offload()
2228 SCAN_OFFLOAD_SET_OP_DWELL_TIME(h2c_pkt, req->duration_mandatory ? in rtw_fw_set_scan_offload()
2229 req->duration : RTW_CHANNEL_TIME); in rtw_fw_set_scan_offload()
2231 SCAN_OFFLOAD_SET_SSID_NUM(h2c_pkt, req->n_ssids); in rtw_fw_set_scan_offload()
2240 struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; in rtw_hw_scan_start()
2241 struct cfg80211_scan_request *req = &scan_req->req; in rtw_hw_scan_start()
2244 rtwdev->scan_info.scanning_vif = vif; in rtw_hw_scan_start()
2245 rtwvif->scan_ies = &scan_req->ies; in rtw_hw_scan_start()
2246 rtwvif->scan_req = req; in rtw_hw_scan_start()
2248 ieee80211_stop_queues(rtwdev->hw); in rtw_hw_scan_start()
2252 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) in rtw_hw_scan_start()
2253 get_random_mask_addr(mac_addr, req->mac_addr, in rtw_hw_scan_start()
2254 req->mac_addr_mask); in rtw_hw_scan_start()
2256 ether_addr_copy(mac_addr, vif->addr); in rtw_hw_scan_start()
2260 rtwdev->hal.rcr &= ~BIT_CBSSID_BCN; in rtw_hw_scan_start()
2261 rtw_write32(rtwdev, REG_RCR, rtwdev->hal.rcr); in rtw_hw_scan_start()
2270 struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw_hw_scan_complete()
2271 struct rtw_hal *hal = &rtwdev->hal; in rtw_hw_scan_complete()
2273 u8 chan = scan_info->op_chan; in rtw_hw_scan_complete()
2278 rtwdev->hal.rcr |= BIT_CBSSID_BCN; in rtw_hw_scan_complete()
2279 rtw_write32(rtwdev, REG_RCR, rtwdev->hal.rcr); in rtw_hw_scan_complete()
2283 rtwvif = (struct rtw_vif *)vif->drv_priv; in rtw_hw_scan_complete()
2286 rtw_phy_set_tx_power_level(rtwdev, hal->current_channel); in rtw_hw_scan_complete()
2287 ieee80211_wake_queues(rtwdev->hw); in rtw_hw_scan_complete()
2288 ieee80211_scan_completed(rtwdev->hw, &info); in rtw_hw_scan_complete()
2290 rtwvif->scan_req = NULL; in rtw_hw_scan_complete()
2291 rtwvif->scan_ies = NULL; in rtw_hw_scan_complete()
2292 rtwdev->scan_info.scanning_vif = NULL; in rtw_hw_scan_complete()
2298 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw_hw_scan_prehandle()
2299 int size = req->n_channels * (RTW_CH_INFO_SIZE + RTW_EX_CH_INFO_SIZE); in rtw_hw_scan_prehandle()
2305 return -ENOMEM; in rtw_hw_scan_prehandle()
2313 list->buf_size = size; in rtw_hw_scan_prehandle()
2314 list->size = 0; in rtw_hw_scan_prehandle()
2315 list->ch_num = 0; in rtw_hw_scan_prehandle()
2326 struct rtw_vif *rtwvif = vif ? (struct rtw_vif *)vif->drv_priv : NULL; in rtw_hw_scan_offload()
2327 struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw_hw_scan_offload()
2333 return -EINVAL; in rtw_hw_scan_offload()
2336 cs_option.back_op_en = scan_info->op_chan != 0; in rtw_hw_scan_offload()
2344 if (rtwdev->ap_active) { in rtw_hw_scan_offload()
2355 struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif; in rtw_hw_scan_abort()
2357 if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD)) in rtw_hw_scan_abort()
2366 struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif; in rtw_hw_scan_status_report()
2371 if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) in rtw_hw_scan_status_report()
2375 rc = GET_SCAN_REPORT_RETURN_CODE(c2h->payload); in rtw_hw_scan_status_report()
2385 struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw_store_op_chan()
2386 struct rtw_hal *hal = &rtwdev->hal; in rtw_store_op_chan()
2390 scan_info->op_chan = hal->current_channel; in rtw_store_op_chan()
2391 scan_info->op_bw = hal->current_band_width; in rtw_store_op_chan()
2392 scan_info->op_pri_ch_idx = hal->current_primary_channel_index; in rtw_store_op_chan()
2393 scan_info->op_pri_ch = hal->primary_channel; in rtw_store_op_chan()
2395 band = scan_info->op_chan > 14 ? RTW_BAND_5G : RTW_BAND_2G; in rtw_store_op_chan()
2396 rtw_update_channel(rtwdev, scan_info->op_chan, in rtw_store_op_chan()
2397 scan_info->op_pri_ch, in rtw_store_op_chan()
2398 band, scan_info->op_bw); in rtw_store_op_chan()
2404 struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw_clear_op_chan()
2406 scan_info->op_chan = 0; in rtw_clear_op_chan()
2407 scan_info->op_bw = 0; in rtw_clear_op_chan()
2408 scan_info->op_pri_ch_idx = 0; in rtw_clear_op_chan()
2409 scan_info->op_pri_ch = 0; in rtw_clear_op_chan()
2414 struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw_is_op_chan()
2416 return channel == scan_info->op_chan; in rtw_is_op_chan()
2421 struct rtw_hal *hal = &rtwdev->hal; in rtw_hw_scan_chan_switch()
2426 if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) in rtw_hw_scan_chan_switch()
2430 chan = GET_CHAN_SWITCH_CENTRAL_CH(c2h->payload); in rtw_hw_scan_chan_switch()
2431 id = GET_CHAN_SWITCH_ID(c2h->payload); in rtw_hw_scan_chan_switch()
2432 status = GET_CHAN_SWITCH_STATUS(c2h->payload); in rtw_hw_scan_chan_switch()
2440 ieee80211_wake_queues(rtwdev->hw); in rtw_hw_scan_chan_switch()
2449 if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) in rtw_hw_scan_chan_switch()
2457 * if next channel is non-op channel. in rtw_hw_scan_chan_switch()
2460 rtw_is_op_chan(rtwdev, hal->current_channel)) { in rtw_hw_scan_chan_switch()
2462 ieee80211_stop_queues(rtwdev->hw); in rtw_hw_scan_chan_switch()