Lines Matching +full:elm +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
24 const struct rtw89_fw_element_hdr *elm,
40 u32 h2c_desc_size = rtwdev->chip->h2c_desc_size; in rtw89_fw_h2c_alloc_skb()
49 memset(skb->data, 0, len); in rtw89_fw_h2c_alloc_skb()
66 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_fw_check_rdy()
70 ret = read_poll_timeout_atomic(mac->fwdl_get_status, val, in rtw89_fw_check_rdy()
77 return -EINVAL; in rtw89_fw_check_rdy()
81 return -EINVAL; in rtw89_fw_check_rdy()
85 return -EINVAL; in rtw89_fw_check_rdy()
89 return -EBUSY; in rtw89_fw_check_rdy()
93 set_bit(RTW89_FLAG_FW_RDY, rtwdev->flags); in rtw89_fw_check_rdy()
112 return -EINVAL; in rtw89_fw_hdr_parser_v0()
114 info->section_num = le32_get_bits(fw_hdr->w6, FW_HDR_W6_SEC_NUM); in rtw89_fw_hdr_parser_v0()
115 base_hdr_len = struct_size(fw_hdr, sections, info->section_num); in rtw89_fw_hdr_parser_v0()
116 info->dynamic_hdr_en = le32_get_bits(fw_hdr->w7, FW_HDR_W7_DYN_HDR); in rtw89_fw_hdr_parser_v0()
118 if (info->dynamic_hdr_en) { in rtw89_fw_hdr_parser_v0()
119 info->hdr_len = le32_get_bits(fw_hdr->w3, FW_HDR_W3_LEN); in rtw89_fw_hdr_parser_v0()
120 info->dynamic_hdr_len = info->hdr_len - base_hdr_len; in rtw89_fw_hdr_parser_v0()
122 if (le32_to_cpu(fwdynhdr->hdr_len) != info->dynamic_hdr_len) { in rtw89_fw_hdr_parser_v0()
124 return -EINVAL; in rtw89_fw_hdr_parser_v0()
127 info->hdr_len = base_hdr_len; in rtw89_fw_hdr_parser_v0()
128 info->dynamic_hdr_len = 0; in rtw89_fw_hdr_parser_v0()
131 bin = fw + info->hdr_len; in rtw89_fw_hdr_parser_v0()
134 section_info = info->section_info; in rtw89_fw_hdr_parser_v0()
135 for (i = 0; i < info->section_num; i++) { in rtw89_fw_hdr_parser_v0()
136 section = &fw_hdr->sections[i]; in rtw89_fw_hdr_parser_v0()
137 section_info->type = in rtw89_fw_hdr_parser_v0()
138 le32_get_bits(section->w1, FWSECTION_HDR_W1_SECTIONTYPE); in rtw89_fw_hdr_parser_v0()
139 if (section_info->type == FWDL_SECURITY_SECTION_TYPE) { in rtw89_fw_hdr_parser_v0()
140 section_info->mssc = in rtw89_fw_hdr_parser_v0()
141 le32_get_bits(section->w2, FWSECTION_HDR_W2_MSSC); in rtw89_fw_hdr_parser_v0()
142 mssc_len += section_info->mssc * FWDL_SECURITY_SIGLEN; in rtw89_fw_hdr_parser_v0()
144 section_info->mssc = 0; in rtw89_fw_hdr_parser_v0()
147 section_info->len = le32_get_bits(section->w1, FWSECTION_HDR_W1_SEC_SIZE); in rtw89_fw_hdr_parser_v0()
148 if (le32_get_bits(section->w1, FWSECTION_HDR_W1_CHECKSUM)) in rtw89_fw_hdr_parser_v0()
149 section_info->len += FWDL_SECTION_CHKSUM_LEN; in rtw89_fw_hdr_parser_v0()
150 section_info->redl = le32_get_bits(section->w1, FWSECTION_HDR_W1_REDL); in rtw89_fw_hdr_parser_v0()
151 section_info->dladdr = in rtw89_fw_hdr_parser_v0()
152 le32_get_bits(section->w0, FWSECTION_HDR_W0_DL_ADDR) & 0x1fffffff; in rtw89_fw_hdr_parser_v0()
153 section_info->addr = bin; in rtw89_fw_hdr_parser_v0()
154 bin += section_info->len; in rtw89_fw_hdr_parser_v0()
160 return -EINVAL; in rtw89_fw_hdr_parser_v0()
179 info->section_num = le32_get_bits(fw_hdr->w6, FW_HDR_V1_W6_SEC_NUM); in rtw89_fw_hdr_parser_v1()
180 base_hdr_len = struct_size(fw_hdr, sections, info->section_num); in rtw89_fw_hdr_parser_v1()
181 info->dynamic_hdr_en = le32_get_bits(fw_hdr->w7, FW_HDR_V1_W7_DYN_HDR); in rtw89_fw_hdr_parser_v1()
183 if (info->dynamic_hdr_en) { in rtw89_fw_hdr_parser_v1()
184 info->hdr_len = le32_get_bits(fw_hdr->w5, FW_HDR_V1_W5_HDR_SIZE); in rtw89_fw_hdr_parser_v1()
185 info->dynamic_hdr_len = info->hdr_len - base_hdr_len; in rtw89_fw_hdr_parser_v1()
187 if (le32_to_cpu(fwdynhdr->hdr_len) != info->dynamic_hdr_len) { in rtw89_fw_hdr_parser_v1()
189 return -EINVAL; in rtw89_fw_hdr_parser_v1()
192 info->hdr_len = base_hdr_len; in rtw89_fw_hdr_parser_v1()
193 info->dynamic_hdr_len = 0; in rtw89_fw_hdr_parser_v1()
196 bin = fw + info->hdr_len; in rtw89_fw_hdr_parser_v1()
199 section_info = info->section_info; in rtw89_fw_hdr_parser_v1()
200 for (i = 0; i < info->section_num; i++) { in rtw89_fw_hdr_parser_v1()
201 section = &fw_hdr->sections[i]; in rtw89_fw_hdr_parser_v1()
202 section_info->type = in rtw89_fw_hdr_parser_v1()
203 le32_get_bits(section->w1, FWSECTION_HDR_V1_W1_SECTIONTYPE); in rtw89_fw_hdr_parser_v1()
204 if (section_info->type == FWDL_SECURITY_SECTION_TYPE) { in rtw89_fw_hdr_parser_v1()
205 section_info->mssc = in rtw89_fw_hdr_parser_v1()
206 le32_get_bits(section->w2, FWSECTION_HDR_V1_W2_MSSC); in rtw89_fw_hdr_parser_v1()
207 mssc_len += section_info->mssc * FWDL_SECURITY_SIGLEN; in rtw89_fw_hdr_parser_v1()
209 section_info->mssc = 0; in rtw89_fw_hdr_parser_v1()
212 section_info->len = in rtw89_fw_hdr_parser_v1()
213 le32_get_bits(section->w1, FWSECTION_HDR_V1_W1_SEC_SIZE); in rtw89_fw_hdr_parser_v1()
214 if (le32_get_bits(section->w1, FWSECTION_HDR_V1_W1_CHECKSUM)) in rtw89_fw_hdr_parser_v1()
215 section_info->len += FWDL_SECTION_CHKSUM_LEN; in rtw89_fw_hdr_parser_v1()
216 section_info->redl = le32_get_bits(section->w1, FWSECTION_HDR_V1_W1_REDL); in rtw89_fw_hdr_parser_v1()
217 section_info->dladdr = in rtw89_fw_hdr_parser_v1()
218 le32_get_bits(section->w0, FWSECTION_HDR_V1_W0_DL_ADDR); in rtw89_fw_hdr_parser_v1()
219 section_info->addr = bin; in rtw89_fw_hdr_parser_v1()
220 bin += section_info->len; in rtw89_fw_hdr_parser_v1()
226 return -EINVAL; in rtw89_fw_hdr_parser_v1()
236 const u8 *fw = fw_suit->data; in rtw89_fw_hdr_parser()
237 u32 len = fw_suit->size; in rtw89_fw_hdr_parser()
240 rtw89_err(rtwdev, "fw type %d isn't recognized\n", fw_suit->type); in rtw89_fw_hdr_parser()
241 return -ENOENT; in rtw89_fw_hdr_parser()
244 switch (fw_suit->hdr_ver) { in rtw89_fw_hdr_parser()
250 return -ENOENT; in rtw89_fw_hdr_parser()
258 struct rtw89_fw_info *fw_info = &rtwdev->fw; in rtw89_mfw_recognize()
259 const struct firmware *firmware = fw_info->req.firmware; in rtw89_mfw_recognize()
260 const u8 *mfw = firmware->data; in rtw89_mfw_recognize()
261 u32 mfw_len = firmware->size; in rtw89_mfw_recognize()
266 if (mfw_hdr->sig != RTW89_MFW_SIG) { in rtw89_mfw_recognize()
270 return -EINVAL; in rtw89_mfw_recognize()
271 fw_suit->data = mfw; in rtw89_mfw_recognize()
272 fw_suit->size = mfw_len; in rtw89_mfw_recognize()
276 for (i = 0; i < mfw_hdr->fw_nr; i++) { in rtw89_mfw_recognize()
277 mfw_info = &mfw_hdr->info[i]; in rtw89_mfw_recognize()
278 if (mfw_info->type == type) { in rtw89_mfw_recognize()
279 if (mfw_info->cv == rtwdev->hal.cv && !mfw_info->mp) in rtw89_mfw_recognize()
288 return -ENOENT; in rtw89_mfw_recognize()
291 fw_suit->data = mfw + le32_to_cpu(mfw_info->shift); in rtw89_mfw_recognize()
292 fw_suit->size = le32_to_cpu(mfw_info->size); in rtw89_mfw_recognize()
298 struct rtw89_fw_info *fw_info = &rtwdev->fw; in rtw89_mfw_get_size()
299 const struct firmware *firmware = fw_info->req.firmware; in rtw89_mfw_get_size()
301 (const struct rtw89_mfw_hdr *)firmware->data; in rtw89_mfw_get_size()
305 if (mfw_hdr->sig != RTW89_MFW_SIG) { in rtw89_mfw_get_size()
310 mfw_info = &mfw_hdr->info[mfw_hdr->fw_nr - 1]; in rtw89_mfw_get_size()
311 size = le32_to_cpu(mfw_info->shift) + le32_to_cpu(mfw_info->size); in rtw89_mfw_get_size()
320 fw_suit->major_ver = le32_get_bits(hdr->w1, FW_HDR_W1_MAJOR_VERSION); in rtw89_fw_update_ver_v0()
321 fw_suit->minor_ver = le32_get_bits(hdr->w1, FW_HDR_W1_MINOR_VERSION); in rtw89_fw_update_ver_v0()
322 fw_suit->sub_ver = le32_get_bits(hdr->w1, FW_HDR_W1_SUBVERSION); in rtw89_fw_update_ver_v0()
323 fw_suit->sub_idex = le32_get_bits(hdr->w1, FW_HDR_W1_SUBINDEX); in rtw89_fw_update_ver_v0()
324 fw_suit->commitid = le32_get_bits(hdr->w2, FW_HDR_W2_COMMITID); in rtw89_fw_update_ver_v0()
325 fw_suit->build_year = le32_get_bits(hdr->w5, FW_HDR_W5_YEAR); in rtw89_fw_update_ver_v0()
326 fw_suit->build_mon = le32_get_bits(hdr->w4, FW_HDR_W4_MONTH); in rtw89_fw_update_ver_v0()
327 fw_suit->build_date = le32_get_bits(hdr->w4, FW_HDR_W4_DATE); in rtw89_fw_update_ver_v0()
328 fw_suit->build_hour = le32_get_bits(hdr->w4, FW_HDR_W4_HOUR); in rtw89_fw_update_ver_v0()
329 fw_suit->build_min = le32_get_bits(hdr->w4, FW_HDR_W4_MIN); in rtw89_fw_update_ver_v0()
330 fw_suit->cmd_ver = le32_get_bits(hdr->w7, FW_HDR_W7_CMD_VERSERION); in rtw89_fw_update_ver_v0()
337 fw_suit->major_ver = le32_get_bits(hdr->w1, FW_HDR_V1_W1_MAJOR_VERSION); in rtw89_fw_update_ver_v1()
338 fw_suit->minor_ver = le32_get_bits(hdr->w1, FW_HDR_V1_W1_MINOR_VERSION); in rtw89_fw_update_ver_v1()
339 fw_suit->sub_ver = le32_get_bits(hdr->w1, FW_HDR_V1_W1_SUBVERSION); in rtw89_fw_update_ver_v1()
340 fw_suit->sub_idex = le32_get_bits(hdr->w1, FW_HDR_V1_W1_SUBINDEX); in rtw89_fw_update_ver_v1()
341 fw_suit->commitid = le32_get_bits(hdr->w2, FW_HDR_V1_W2_COMMITID); in rtw89_fw_update_ver_v1()
342 fw_suit->build_year = le32_get_bits(hdr->w5, FW_HDR_V1_W5_YEAR); in rtw89_fw_update_ver_v1()
343 fw_suit->build_mon = le32_get_bits(hdr->w4, FW_HDR_V1_W4_MONTH); in rtw89_fw_update_ver_v1()
344 fw_suit->build_date = le32_get_bits(hdr->w4, FW_HDR_V1_W4_DATE); in rtw89_fw_update_ver_v1()
345 fw_suit->build_hour = le32_get_bits(hdr->w4, FW_HDR_V1_W4_HOUR); in rtw89_fw_update_ver_v1()
346 fw_suit->build_min = le32_get_bits(hdr->w4, FW_HDR_V1_W4_MIN); in rtw89_fw_update_ver_v1()
347 fw_suit->cmd_ver = le32_get_bits(hdr->w7, FW_HDR_V1_W3_CMD_VERSERION); in rtw89_fw_update_ver_v1()
354 const struct rtw89_fw_hdr *v0 = (const struct rtw89_fw_hdr *)fw_suit->data; in rtw89_fw_update_ver()
355 const struct rtw89_fw_hdr_v1 *v1 = (const struct rtw89_fw_hdr_v1 *)fw_suit->data; in rtw89_fw_update_ver()
360 fw_suit->type = type; in rtw89_fw_update_ver()
361 fw_suit->hdr_ver = le32_get_bits(v0->w3, FW_HDR_W3_HDR_VER); in rtw89_fw_update_ver()
363 switch (fw_suit->hdr_ver) { in rtw89_fw_update_ver()
372 fw_suit->hdr_ver); in rtw89_fw_update_ver()
373 return -ENOENT; in rtw89_fw_update_ver()
378 fw_suit->major_ver, fw_suit->minor_ver, fw_suit->sub_ver, in rtw89_fw_update_ver()
379 fw_suit->sub_idex, fw_suit->commitid, fw_suit->cmd_ver, type); in rtw89_fw_update_ver()
400 const struct rtw89_fw_element_hdr *elm, in __rtw89_fw_recognize_from_elm() argument
404 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_fw_recognize_from_elm()
407 if (hal->cv != elm->u.bbmcu.cv) in __rtw89_fw_recognize_from_elm()
411 fw_suit->data = elm->u.bbmcu.contents; in __rtw89_fw_recognize_from_elm()
412 fw_suit->size = le32_to_cpu(elm->size); in __rtw89_fw_recognize_from_elm()
472 if (chip->chip_id != ent->chip_id) in rtw89_fw_iterate_feature_cfg()
475 if (ent->cond(ver_code, ent->ver_code)) in rtw89_fw_iterate_feature_cfg()
476 RTW89_SET_FW_FEATURE(ent->feature, fw); in rtw89_fw_iterate_feature_cfg()
482 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_recognize_features()
489 rtw89_fw_iterate_feature_cfg(&rtwdev->fw, chip, suit_ver_code); in rtw89_fw_recognize_features()
504 for (fw_format = chip->fw_format_max; fw_format >= 0; fw_format--) { in rtw89_early_fw_feature_recognize()
506 chip->fw_basename, fw_format); in rtw89_early_fw_feature_recognize()
521 ver_code = rtw89_compat_fw_hdr_ver_code(firmware->data); in rtw89_early_fw_feature_recognize()
534 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_recognize()
537 if (chip->try_ce_fw) { in rtw89_fw_recognize()
563 const struct rtw89_fw_element_hdr *elm, in rtw89_build_phy_tbl_from_elm() argument
566 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_build_phy_tbl_from_elm()
575 return -ENOMEM; in rtw89_build_phy_tbl_from_elm()
577 switch (le32_to_cpu(elm->id)) { in rtw89_build_phy_tbl_from_elm()
579 elm_info->bb_tbl = tbl; in rtw89_build_phy_tbl_from_elm()
582 elm_info->bb_gain = tbl; in rtw89_build_phy_tbl_from_elm()
589 idx = elm->u.reg2.idx; in rtw89_build_phy_tbl_from_elm()
591 elm_info->rf_radio[idx] = tbl; in rtw89_build_phy_tbl_from_elm()
592 tbl->rf_path = rf_path; in rtw89_build_phy_tbl_from_elm()
593 tbl->config = rtw89_phy_config_rf_reg_v1; in rtw89_build_phy_tbl_from_elm()
596 elm_info->rf_nctl = tbl; in rtw89_build_phy_tbl_from_elm()
600 return -ENOENT; in rtw89_build_phy_tbl_from_elm()
603 n_regs = le32_to_cpu(elm->size) / sizeof(tbl->regs[0]); in rtw89_build_phy_tbl_from_elm()
604 regs = kcalloc(n_regs, sizeof(tbl->regs[0]), GFP_KERNEL); in rtw89_build_phy_tbl_from_elm()
609 regs[i].addr = le32_to_cpu(elm->u.reg2.regs[i].addr); in rtw89_build_phy_tbl_from_elm()
610 regs[i].data = le32_to_cpu(elm->u.reg2.regs[i].data); in rtw89_build_phy_tbl_from_elm()
613 tbl->n_regs = n_regs; in rtw89_build_phy_tbl_from_elm()
614 tbl->regs = regs; in rtw89_build_phy_tbl_from_elm()
620 return -ENOMEM; in rtw89_build_phy_tbl_from_elm()
625 const struct rtw89_fw_element_hdr *elm, in rtw89_fw_recognize_txpwr_from_elm() argument
628 const struct __rtw89_fw_txpwr_element *txpwr_elm = &elm->u.txpwr; in rtw89_fw_recognize_txpwr_from_elm()
630 struct rtw89_efuse *efuse = &rtwdev->efuse; in rtw89_fw_recognize_txpwr_from_elm()
633 if (!rtwdev->rfe_data) { in rtw89_fw_recognize_txpwr_from_elm()
634 rtwdev->rfe_data = kzalloc(sizeof(*rtwdev->rfe_data), GFP_KERNEL); in rtw89_fw_recognize_txpwr_from_elm()
635 if (!rtwdev->rfe_data) in rtw89_fw_recognize_txpwr_from_elm()
636 return -ENOMEM; in rtw89_fw_recognize_txpwr_from_elm()
639 conf = (void *)rtwdev->rfe_data + offset; in rtw89_fw_recognize_txpwr_from_elm()
642 if (txpwr_elm->rfe_type == efuse->rfe_type) in rtw89_fw_recognize_txpwr_from_elm()
646 if (txpwr_elm->rfe_type == RTW89_TXPWR_CONF_DFLT_RFE_TYPE && in rtw89_fw_recognize_txpwr_from_elm()
648 conf->rfe_type == RTW89_TXPWR_CONF_DFLT_RFE_TYPE)) in rtw89_fw_recognize_txpwr_from_elm()
651 rtw89_debug(rtwdev, RTW89_DBG_FW, "skip txpwr element ID %u RFE %u\n", in rtw89_fw_recognize_txpwr_from_elm()
652 elm->id, txpwr_elm->rfe_type); in rtw89_fw_recognize_txpwr_from_elm()
656 rtw89_debug(rtwdev, RTW89_DBG_FW, "take txpwr element ID %u RFE %u\n", in rtw89_fw_recognize_txpwr_from_elm()
657 elm->id, txpwr_elm->rfe_type); in rtw89_fw_recognize_txpwr_from_elm()
659 conf->rfe_type = txpwr_elm->rfe_type; in rtw89_fw_recognize_txpwr_from_elm()
660 conf->ent_sz = txpwr_elm->ent_sz; in rtw89_fw_recognize_txpwr_from_elm()
661 conf->num_ents = le32_to_cpu(txpwr_elm->num_ents); in rtw89_fw_recognize_txpwr_from_elm()
662 conf->data = txpwr_elm->content; in rtw89_fw_recognize_txpwr_from_elm()
668 const struct rtw89_fw_element_hdr *elm, in rtw89_build_txpwr_trk_tbl_from_elm() argument
671 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_build_txpwr_trk_tbl_from_elm()
672 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_build_txpwr_trk_tbl_from_elm()
679 if (chip->support_bands & BIT(NL80211_BAND_6GHZ)) in rtw89_build_txpwr_trk_tbl_from_elm()
681 if (chip->support_bands & BIT(NL80211_BAND_5GHZ)) in rtw89_build_txpwr_trk_tbl_from_elm()
683 if (chip->support_bands & BIT(NL80211_BAND_2GHZ)) in rtw89_build_txpwr_trk_tbl_from_elm()
686 bitmap = le32_to_cpu(elm->u.txpwr_trk.bitmap); in rtw89_build_txpwr_trk_tbl_from_elm()
691 return -ENOENT; in rtw89_build_txpwr_trk_tbl_from_elm()
694 elm_info->txpwr_trk = kzalloc(sizeof(*elm_info->txpwr_trk), GFP_KERNEL); in rtw89_build_txpwr_trk_tbl_from_elm()
695 if (!elm_info->txpwr_trk) in rtw89_build_txpwr_trk_tbl_from_elm()
696 return -ENOMEM; in rtw89_build_txpwr_trk_tbl_from_elm()
714 elm_info->txpwr_trk->delta[type] = &elm->u.txpwr_trk.contents[offset]; in rtw89_build_txpwr_trk_tbl_from_elm()
717 if (offset * DELTA_SWINGIDX_SIZE > le32_to_cpu(elm->size)) in rtw89_build_txpwr_trk_tbl_from_elm()
725 offset, le32_to_cpu(elm->size)); in rtw89_build_txpwr_trk_tbl_from_elm()
726 kfree(elm_info->txpwr_trk); in rtw89_build_txpwr_trk_tbl_from_elm()
727 elm_info->txpwr_trk = NULL; in rtw89_build_txpwr_trk_tbl_from_elm()
729 return -EFAULT; in rtw89_build_txpwr_trk_tbl_from_elm()
734 const struct rtw89_fw_element_hdr *elm, in rtw89_build_rfk_log_fmt_from_elm() argument
737 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_build_rfk_log_fmt_from_elm()
740 if (elm_info->rfk_log_fmt) in rtw89_build_rfk_log_fmt_from_elm()
743 elm_info->rfk_log_fmt = kzalloc(sizeof(*elm_info->rfk_log_fmt), GFP_KERNEL); in rtw89_build_rfk_log_fmt_from_elm()
744 if (!elm_info->rfk_log_fmt) in rtw89_build_rfk_log_fmt_from_elm()
748 rfk_id = elm->u.rfk_log_fmt.rfk_id; in rtw89_build_rfk_log_fmt_from_elm()
752 elm_info->rfk_log_fmt->elm[rfk_id] = elm; in rtw89_build_rfk_log_fmt_from_elm()
819 struct rtw89_fw_info *fw_info = &rtwdev->fw; in rtw89_fw_recognize_elements()
820 const struct firmware *firmware = fw_info->req.firmware; in rtw89_fw_recognize_elements()
821 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_recognize_elements()
822 u32 unrecognized_elements = chip->needed_fw_elms; in rtw89_fw_recognize_elements()
830 BUILD_BUG_ON(sizeof(chip->needed_fw_elms) * 8 < RTW89_FW_ELEMENT_ID_NUM); in rtw89_fw_recognize_elements()
835 return -EINVAL; in rtw89_fw_recognize_elements()
837 while (offset + sizeof(*hdr) < firmware->size) { in rtw89_fw_recognize_elements()
838 hdr = (const struct rtw89_fw_element_hdr *)(firmware->data + offset); in rtw89_fw_recognize_elements()
840 elm_size = le32_to_cpu(hdr->size); in rtw89_fw_recognize_elements()
841 if (offset + elm_size >= firmware->size) { in rtw89_fw_recognize_elements()
846 elem_id = le32_to_cpu(hdr->id); in rtw89_fw_recognize_elements()
851 if (!handler->fn) in rtw89_fw_recognize_elements()
854 ret = handler->fn(rtwdev, hdr, handler->arg); in rtw89_fw_recognize_elements()
860 if (handler->name) in rtw89_fw_recognize_elements()
862 handler->name, hdr->ver); in rtw89_fw_recognize_elements()
873 return -ENOENT; in rtw89_fw_recognize_elements()
887 if (!(rtwdev->fw.h2c_seq % 4)) in rtw89_h2c_pkt_set_hdr()
889 hdr->hdr0 = cpu_to_le32(FIELD_PREP(H2C_HDR_DEL_TYPE, type) | in rtw89_h2c_pkt_set_hdr()
893 FIELD_PREP(H2C_HDR_H2C_SEQ, rtwdev->fw.h2c_seq)); in rtw89_h2c_pkt_set_hdr()
895 hdr->hdr1 = cpu_to_le32(FIELD_PREP(H2C_HDR_TOTAL_LEN, in rtw89_h2c_pkt_set_hdr()
900 rtwdev->fw.h2c_seq++; in rtw89_h2c_pkt_set_hdr()
912 hdr->hdr0 = cpu_to_le32(FIELD_PREP(H2C_HDR_DEL_TYPE, type) | in rtw89_h2c_pkt_set_hdr_fwdl()
916 FIELD_PREP(H2C_HDR_H2C_SEQ, rtwdev->fw.h2c_seq)); in rtw89_h2c_pkt_set_hdr_fwdl()
918 hdr->hdr1 = cpu_to_le32(FIELD_PREP(H2C_HDR_TOTAL_LEN, in rtw89_h2c_pkt_set_hdr_fwdl()
930 return -ENOMEM; in __rtw89_fw_download_hdr()
934 SET_FW_HDR_PART_SIZE(skb->data, FWDL_SECTION_PER_PKT_LEN); in __rtw89_fw_download_hdr()
942 ret = -1; in __rtw89_fw_download_hdr()
955 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_fw_download_hdr()
964 ret = mac->fwdl_check_path_ready(rtwdev, false); in rtw89_fw_download_hdr()
980 const u8 *section = info->addr; in __rtw89_fw_download_main()
981 u32 residue_len = info->len; in __rtw89_fw_download_main()
994 return -ENOMEM; in __rtw89_fw_download_main()
1001 ret = -1; in __rtw89_fw_download_main()
1006 residue_len -= pkt_len; in __rtw89_fw_download_main()
1020 switch (fw_suit->type) { in rtw89_fw_get_fwdl_chk_type_from_suit()
1034 struct rtw89_fw_hdr_section_info *section_info = info->section_info; in rtw89_fw_download_main()
1035 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_download_main()
1037 u8 section_num = info->section_num; in rtw89_fw_download_main()
1040 while (section_num--) { in rtw89_fw_download_main()
1047 if (chip->chip_gen == RTW89_CHIP_AX) in rtw89_fw_download_main()
1054 fw_suit->type); in rtw89_fw_download_main()
1063 enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen; in rtw89_fw_prog_cnt_dump()
1103 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_fw_download_suit()
1113 if (rtwdev->chip->chip_id == RTL8922A && in rtw89_fw_download_suit()
1114 (fw_suit->type == RTW89_FW_NORMAL || fw_suit->type == RTW89_FW_WOWLAN)) in rtw89_fw_download_suit()
1117 ret = mac->fwdl_check_path_ready(rtwdev, true); in rtw89_fw_download_suit()
1123 ret = rtw89_fw_download_hdr(rtwdev, fw_suit->data, info.hdr_len - in rtw89_fw_download_suit()
1138 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_fw_download()
1139 struct rtw89_fw_info *fw_info = &rtwdev->fw; in rtw89_fw_download()
1141 u8 bbmcu_nr = rtwdev->chip->bbmcu_nr; in rtw89_fw_download()
1145 mac->disable_cpu(rtwdev); in rtw89_fw_download()
1146 ret = mac->fwdl_enable_wcpu(rtwdev, 0, true, include_bb); in rtw89_fw_download()
1162 fw_info->h2c_seq = 0; in rtw89_fw_download()
1163 fw_info->rec_seq = 0; in rtw89_fw_download()
1164 fw_info->h2c_counter = 0; in rtw89_fw_download()
1165 fw_info->c2h_counter = 0; in rtw89_fw_download()
1166 rtwdev->mac.rpwm_seq_num = RPWM_SEQ_NUM_MAX; in rtw89_fw_download()
1167 rtwdev->mac.cpwm_seq_num = CPWM_SEQ_NUM_MAX; in rtw89_fw_download()
1186 struct rtw89_fw_info *fw = &rtwdev->fw; in rtw89_wait_firmware_completion()
1188 wait_for_completion(&fw->req.completion); in rtw89_wait_firmware_completion()
1189 if (!fw->req.firmware) in rtw89_wait_firmware_completion()
1190 return -EINVAL; in rtw89_wait_firmware_completion()
1201 if (req->firmware) { in rtw89_load_firmware_req()
1204 complete_all(&req->completion); in rtw89_load_firmware_req()
1209 ret = firmware_request_nowarn(&req->firmware, fw_name, rtwdev->dev); in rtw89_load_firmware_req()
1211 ret = request_firmware(&req->firmware, fw_name, rtwdev->dev); in rtw89_load_firmware_req()
1213 complete_all(&req->completion); in rtw89_load_firmware_req()
1222 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_load_firmware_work()
1226 chip->fw_basename, rtwdev->fw.fw_format); in rtw89_load_firmware_work()
1228 rtw89_load_firmware_req(rtwdev, &rtwdev->fw.req, fw_name, false); in rtw89_load_firmware_work()
1236 kfree(tbl->regs); in rtw89_free_phy_tbl_from_elm()
1242 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_unload_firmware_elements()
1245 rtw89_free_phy_tbl_from_elm(elm_info->bb_tbl); in rtw89_unload_firmware_elements()
1246 rtw89_free_phy_tbl_from_elm(elm_info->bb_gain); in rtw89_unload_firmware_elements()
1247 for (i = 0; i < ARRAY_SIZE(elm_info->rf_radio); i++) in rtw89_unload_firmware_elements()
1248 rtw89_free_phy_tbl_from_elm(elm_info->rf_radio[i]); in rtw89_unload_firmware_elements()
1249 rtw89_free_phy_tbl_from_elm(elm_info->rf_nctl); in rtw89_unload_firmware_elements()
1251 kfree(elm_info->txpwr_trk); in rtw89_unload_firmware_elements()
1252 kfree(elm_info->rfk_log_fmt); in rtw89_unload_firmware_elements()
1257 struct rtw89_fw_info *fw = &rtwdev->fw; in rtw89_unload_firmware()
1259 cancel_work_sync(&rtwdev->load_firmware_work); in rtw89_unload_firmware()
1261 if (fw->req.firmware) { in rtw89_unload_firmware()
1262 release_firmware(fw->req.firmware); in rtw89_unload_firmware()
1267 fw->req.firmware = NULL; in rtw89_unload_firmware()
1270 kfree(fw->log.fmts); in rtw89_unload_firmware()
1276 struct rtw89_fw_log *fw_log = &rtwdev->fw.log; in rtw89_fw_log_get_fmt_idx()
1279 if (fmt_id > fw_log->last_fmt_id) in rtw89_fw_log_get_fmt_idx()
1282 for (i = 0; i < fw_log->fmt_count; i++) { in rtw89_fw_log_get_fmt_idx()
1283 if (le32_to_cpu(fw_log->fmt_ids[i]) == fmt_id) in rtw89_fw_log_get_fmt_idx()
1291 struct rtw89_fw_log *log = &rtwdev->fw.log; in rtw89_fw_log_create_fmts_dict()
1293 struct rtw89_fw_suit *suit = &log->suit; in rtw89_fw_log_create_fmts_dict()
1298 suit_hdr = (const struct rtw89_fw_logsuit_hdr *)suit->data; in rtw89_fw_log_create_fmts_dict()
1299 fmt_count = le32_to_cpu(suit_hdr->count); in rtw89_fw_log_create_fmts_dict()
1300 log->fmt_ids = suit_hdr->ids; in rtw89_fw_log_create_fmts_dict()
1301 fmts_ptr = &suit_hdr->ids[fmt_count]; in rtw89_fw_log_create_fmts_dict()
1302 fmts_end_ptr = suit->data + suit->size; in rtw89_fw_log_create_fmts_dict()
1303 log->fmts = kcalloc(fmt_count, sizeof(char *), GFP_KERNEL); in rtw89_fw_log_create_fmts_dict()
1304 if (!log->fmts) in rtw89_fw_log_create_fmts_dict()
1305 return -ENOMEM; in rtw89_fw_log_create_fmts_dict()
1308 fmts_ptr = memchr_inv(fmts_ptr, 0, fmts_end_ptr - fmts_ptr); in rtw89_fw_log_create_fmts_dict()
1312 (*log->fmts)[i] = fmts_ptr; in rtw89_fw_log_create_fmts_dict()
1313 log->last_fmt_id = le32_to_cpu(log->fmt_ids[i]); in rtw89_fw_log_create_fmts_dict()
1314 log->fmt_count++; in rtw89_fw_log_create_fmts_dict()
1323 struct rtw89_fw_log *log = &rtwdev->fw.log; in rtw89_fw_log_prepare()
1324 struct rtw89_fw_suit *suit = &log->suit; in rtw89_fw_log_prepare()
1326 if (!suit || !suit->data) { in rtw89_fw_log_prepare()
1328 return -EINVAL; in rtw89_fw_log_prepare()
1330 if (log->fmts) in rtw89_fw_log_prepare()
1340 const char *(*fmts)[] = rtwdev->fw.log.fmts; in rtw89_fw_log_dump_data()
1345 if (log_fmt->argc > RTW89_C2H_FW_LOG_MAX_PARA_NUM) { in rtw89_fw_log_dump_data()
1347 log_fmt->argc); in rtw89_fw_log_dump_data()
1352 for (i = 0 ; i < log_fmt->argc; i++) in rtw89_fw_log_dump_data()
1353 args[i] = le32_to_cpu(log_fmt->u.argv[i]); in rtw89_fw_log_dump_data()
1358 "fw_enc(%d, %d, %d) %*ph", le32_to_cpu(log_fmt->fmt_id), in rtw89_fw_log_dump_data()
1359 para_int, log_fmt->argc, (int)sizeof(args), args); in rtw89_fw_log_dump_data()
1362 "fw_enc(%d, %d, %d, %s)", le32_to_cpu(log_fmt->fmt_id), in rtw89_fw_log_dump_data()
1363 para_int, log_fmt->argc, log_fmt->u.raw); in rtw89_fw_log_dump_data()
1387 len -= RTW89_C2H_HEADER_LEN; in rtw89_fw_log_dump()
1393 if (log_fmt->signature != cpu_to_le16(RTW89_C2H_FW_LOG_SIGNATURE)) in rtw89_fw_log_dump()
1396 if (!rtwdev->fw.log.fmts) in rtw89_fw_log_dump()
1399 para_int = u8_get_bits(log_fmt->feature, RTW89_C2H_FW_LOG_FEATURE_PARA_INT); in rtw89_fw_log_dump()
1400 fmt_idx = rtw89_fw_log_get_fmt_idx(rtwdev, le32_to_cpu(log_fmt->fmt_id)); in rtw89_fw_log_dump()
1402 if (!para_int && log_fmt->argc != 0 && fmt_idx != 0) in rtw89_fw_log_dump()
1404 (*rtwdev->fw.log.fmts)[fmt_idx], log_fmt->u.raw); in rtw89_fw_log_dump()
1426 return -ENOMEM; in rtw89_fw_h2c_cam()
1429 rtw89_cam_fill_addr_cam_info(rtwdev, rtwvif, rtwsta, scan_mac_addr, skb->data); in rtw89_fw_h2c_cam()
1430 rtw89_cam_fill_bssid_cam_info(rtwdev, rtwvif, rtwsta, skb->data); in rtw89_fw_h2c_cam()
1462 return -ENOMEM; in rtw89_fw_h2c_dctl_sec_cam_v1()
1466 rtw89_cam_fill_dctl_sec_cam_info_v1(rtwdev, rtwvif, rtwsta, skb->data); in rtw89_fw_h2c_dctl_sec_cam_v1()
1492 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_ba_cam()
1493 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_fw_h2c_ba_cam()
1494 u8 macid = rtwsta->mac_id; in rtw89_fw_h2c_ba_cam()
1500 rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta, params->tid, &entry_idx) : in rtw89_fw_h2c_ba_cam()
1501 rtw89_core_release_sta_ba_entry(rtwdev, rtwsta, params->tid, &entry_idx); in rtw89_fw_h2c_ba_cam()
1508 valid ? "alloc" : "free", params->tid); in rtw89_fw_h2c_ba_cam()
1515 return -ENOMEM; in rtw89_fw_h2c_ba_cam()
1518 SET_BA_CAM_MACID(skb->data, macid); in rtw89_fw_h2c_ba_cam()
1519 if (chip->bacam_ver == RTW89_BACAM_V0_EXT) in rtw89_fw_h2c_ba_cam()
1520 SET_BA_CAM_ENTRY_IDX_V1(skb->data, entry_idx); in rtw89_fw_h2c_ba_cam()
1522 SET_BA_CAM_ENTRY_IDX(skb->data, entry_idx); in rtw89_fw_h2c_ba_cam()
1525 SET_BA_CAM_VALID(skb->data, valid); in rtw89_fw_h2c_ba_cam()
1526 SET_BA_CAM_TID(skb->data, params->tid); in rtw89_fw_h2c_ba_cam()
1527 if (params->buf_size > 64) in rtw89_fw_h2c_ba_cam()
1528 SET_BA_CAM_BMAP_SIZE(skb->data, 4); in rtw89_fw_h2c_ba_cam()
1530 SET_BA_CAM_BMAP_SIZE(skb->data, 0); in rtw89_fw_h2c_ba_cam()
1532 SET_BA_CAM_INIT_REQ(skb->data, 1); in rtw89_fw_h2c_ba_cam()
1533 SET_BA_CAM_SSN(skb->data, params->ssn); in rtw89_fw_h2c_ba_cam()
1535 if (chip->bacam_ver == RTW89_BACAM_V0_EXT) { in rtw89_fw_h2c_ba_cam()
1536 SET_BA_CAM_STD_EN(skb->data, 1); in rtw89_fw_h2c_ba_cam()
1537 SET_BA_CAM_BAND(skb->data, rtwvif->mac_idx); in rtw89_fw_h2c_ba_cam()
1569 return -ENOMEM; in rtw89_fw_h2c_init_ba_cam_v0_ext()
1573 SET_BA_CAM_VALID(skb->data, 1); in rtw89_fw_h2c_init_ba_cam_v0_ext()
1574 SET_BA_CAM_ENTRY_IDX_V1(skb->data, entry_idx); in rtw89_fw_h2c_init_ba_cam_v0_ext()
1575 SET_BA_CAM_UID(skb->data, uid); in rtw89_fw_h2c_init_ba_cam_v0_ext()
1576 SET_BA_CAM_BAND(skb->data, 0); in rtw89_fw_h2c_init_ba_cam_v0_ext()
1577 SET_BA_CAM_STD_EN(skb->data, 0); in rtw89_fw_h2c_init_ba_cam_v0_ext()
1600 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext()
1601 u8 entry_idx = chip->bacam_num; in rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext()
1605 for (i = 0; i < chip->bacam_dynamic_num; i++) { in rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext()
1623 return -ENOMEM; in rtw89_fw_h2c_fw_log()
1627 SET_LOG_CFG_LEVEL(skb->data, RTW89_FW_LOG_LEVEL_LOUD); in rtw89_fw_h2c_fw_log()
1628 SET_LOG_CFG_PATH(skb->data, BIT(RTW89_FW_LOG_LEVEL_C2H)); in rtw89_fw_h2c_fw_log()
1629 SET_LOG_CFG_COMP(skb->data, comp); in rtw89_fw_h2c_fw_log()
1630 SET_LOG_CFG_COMP_EXT(skb->data, 0); in rtw89_fw_h2c_fw_log()
1654 u8 *id) in rtw89_fw_h2c_add_general_pkt() argument
1663 return -ENOMEM; in rtw89_fw_h2c_add_general_pkt()
1667 skb = ieee80211_pspoll_get(rtwdev->hw, vif); in rtw89_fw_h2c_add_general_pkt()
1670 skb = ieee80211_proberesp_get(rtwdev->hw, vif); in rtw89_fw_h2c_add_general_pkt()
1673 skb = ieee80211_nullfunc_get(rtwdev->hw, vif, -1, false); in rtw89_fw_h2c_add_general_pkt()
1676 skb = ieee80211_nullfunc_get(rtwdev->hw, vif, -1, true); in rtw89_fw_h2c_add_general_pkt()
1685 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb); in rtw89_fw_h2c_add_general_pkt()
1691 list_add_tail(&info->list, &rtwvif->general_pkt_list); in rtw89_fw_h2c_add_general_pkt()
1692 *id = info->id; in rtw89_fw_h2c_add_general_pkt()
1697 return -ENOMEM; in rtw89_fw_h2c_add_general_pkt()
1703 struct list_head *pkt_list = &rtwvif->general_pkt_list; in rtw89_fw_release_general_pkt_list_vif()
1708 rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id); in rtw89_fw_release_general_pkt_list_vif()
1710 rtw89_core_release_bit_map(rtwdev->pkt_offload, info->id); in rtw89_fw_release_general_pkt_list_vif()
1711 list_del(&info->list); in rtw89_fw_release_general_pkt_list_vif()
1745 return -ENOMEM; in rtw89_fw_h2c_general_pkt()
1748 SET_GENERAL_PKT_MACID(skb->data, macid); in rtw89_fw_h2c_general_pkt()
1749 SET_GENERAL_PKT_PROBRSP_ID(skb->data, H2C_GENERAL_PKT_ID_UND); in rtw89_fw_h2c_general_pkt()
1750 SET_GENERAL_PKT_PSPOLL_ID(skb->data, pkt_id_ps_poll); in rtw89_fw_h2c_general_pkt()
1751 SET_GENERAL_PKT_NULL_ID(skb->data, pkt_id_null); in rtw89_fw_h2c_general_pkt()
1752 SET_GENERAL_PKT_QOS_NULL_ID(skb->data, pkt_id_qos_null); in rtw89_fw_h2c_general_pkt()
1753 SET_GENERAL_PKT_CTS2SELF_ID(skb->data, H2C_GENERAL_PKT_ID_UND); in rtw89_fw_h2c_general_pkt()
1784 return -ENOMEM; in rtw89_fw_h2c_lps_parm()
1788 SET_LPS_PARM_MACID(skb->data, lps_param->macid); in rtw89_fw_h2c_lps_parm()
1789 SET_LPS_PARM_PSMODE(skb->data, lps_param->psmode); in rtw89_fw_h2c_lps_parm()
1790 SET_LPS_PARM_LASTRPWM(skb->data, lps_param->lastrpwm); in rtw89_fw_h2c_lps_parm()
1791 SET_LPS_PARM_RLBM(skb->data, 1); in rtw89_fw_h2c_lps_parm()
1792 SET_LPS_PARM_SMARTPS(skb->data, 1); in rtw89_fw_h2c_lps_parm()
1793 SET_LPS_PARM_AWAKEINTERVAL(skb->data, 1); in rtw89_fw_h2c_lps_parm()
1794 SET_LPS_PARM_VOUAPSD(skb->data, 0); in rtw89_fw_h2c_lps_parm()
1795 SET_LPS_PARM_VIUAPSD(skb->data, 0); in rtw89_fw_h2c_lps_parm()
1796 SET_LPS_PARM_BEUAPSD(skb->data, 0); in rtw89_fw_h2c_lps_parm()
1797 SET_LPS_PARM_BKUAPSD(skb->data, 0); in rtw89_fw_h2c_lps_parm()
1823 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; in rtw89_fw_h2c_p2p_act()
1824 bool p2p_type_gc = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT; in rtw89_fw_h2c_p2p_act()
1825 u8 ctwindow_oppps = vif->bss_conf.p2p_noa_attr.oppps_ctwindow; in rtw89_fw_h2c_p2p_act()
1833 return -ENOMEM; in rtw89_fw_h2c_p2p_act()
1836 cmd = skb->data; in rtw89_fw_h2c_p2p_act()
1838 RTW89_SET_FWCMD_P2P_MACID(cmd, rtwvif->mac_id); in rtw89_fw_h2c_p2p_act()
1845 RTW89_SET_FWCMD_NOA_START_TIME(cmd, desc->start_time); in rtw89_fw_h2c_p2p_act()
1846 RTW89_SET_FWCMD_NOA_INTERVAL(cmd, desc->interval); in rtw89_fw_h2c_p2p_act()
1847 RTW89_SET_FWCMD_NOA_DURATION(cmd, desc->duration); in rtw89_fw_h2c_p2p_act()
1848 RTW89_SET_FWCMD_NOA_COUNT(cmd, desc->count); in rtw89_fw_h2c_p2p_act()
1873 const struct rtw89_chip_info *chip = rtwdev->chip; in __rtw89_fw_h2c_set_tx_path()
1874 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_fw_h2c_set_tx_path()
1878 if (chip->rf_path_num == 1) { in __rtw89_fw_h2c_set_tx_path()
1882 ntx_path = hal->antenna_tx ? hal->antenna_tx : RF_B; in __rtw89_fw_h2c_set_tx_path()
1883 map_b = hal->antenna_tx == RF_AB ? 1 : 0; in __rtw89_fw_h2c_set_tx_path()
1886 SET_CMC_TBL_NTX_PATH_EN(skb->data, ntx_path); in __rtw89_fw_h2c_set_tx_path()
1887 SET_CMC_TBL_PATH_MAP_A(skb->data, 0); in __rtw89_fw_h2c_set_tx_path()
1888 SET_CMC_TBL_PATH_MAP_B(skb->data, map_b); in __rtw89_fw_h2c_set_tx_path()
1889 SET_CMC_TBL_PATH_MAP_C(skb->data, 0); in __rtw89_fw_h2c_set_tx_path()
1890 SET_CMC_TBL_PATH_MAP_D(skb->data, 0); in __rtw89_fw_h2c_set_tx_path()
1897 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_default_cmac_tbl()
1899 u8 macid = rtwvif->mac_id; in rtw89_fw_h2c_default_cmac_tbl()
1905 return -ENOMEM; in rtw89_fw_h2c_default_cmac_tbl()
1908 SET_CTRL_INFO_MACID(skb->data, macid); in rtw89_fw_h2c_default_cmac_tbl()
1909 SET_CTRL_INFO_OPERATION(skb->data, 1); in rtw89_fw_h2c_default_cmac_tbl()
1910 if (chip->h2c_cctl_func_id == H2C_FUNC_MAC_CCTLINFO_UD) { in rtw89_fw_h2c_default_cmac_tbl()
1911 SET_CMC_TBL_TXPWR_MODE(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1913 SET_CMC_TBL_ANTSEL_A(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1914 SET_CMC_TBL_ANTSEL_B(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1915 SET_CMC_TBL_ANTSEL_C(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1916 SET_CMC_TBL_ANTSEL_D(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1918 SET_CMC_TBL_DOPPLER_CTRL(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1919 SET_CMC_TBL_TXPWR_TOLERENCE(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1920 if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE) in rtw89_fw_h2c_default_cmac_tbl()
1921 SET_CMC_TBL_DATA_DCM(skb->data, 0); in rtw89_fw_h2c_default_cmac_tbl()
1925 chip->h2c_cctl_func_id, 0, 1, in rtw89_fw_h2c_default_cmac_tbl()
1946 u8 nss = min(sta->deflink.rx_nss, rtwdev->hal.tx_nss) - 1; in __get_sta_he_pkt_padding()
1947 u8 ppe_thres_hdr = sta->deflink.he_cap.ppe_thres[0]; in __get_sta_he_pkt_padding()
1953 if (!sta->deflink.he_cap.has_he) in __get_sta_he_pkt_padding()
1957 sta->deflink.he_cap.he_cap_elem.phy_cap_info[6]); in __get_sta_he_pkt_padding()
1962 sta->deflink.he_cap.he_cap_elem.phy_cap_info[9]); in __get_sta_he_pkt_padding()
1984 ppe = le16_to_cpu(*((__le16 *)&sta->deflink.he_cap.ppe_thres[idx])); in __get_sta_he_pkt_padding()
2002 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_assoc_cmac_tbl()
2004 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; in rtw89_fw_h2c_assoc_cmac_tbl()
2006 rtwvif->sub_entity_idx); in rtw89_fw_h2c_assoc_cmac_tbl()
2009 u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id; in rtw89_fw_h2c_assoc_cmac_tbl()
2017 if (vif->p2p) in rtw89_fw_h2c_assoc_cmac_tbl()
2019 else if (chan->band_type == RTW89_BAND_2G) in rtw89_fw_h2c_assoc_cmac_tbl()
2027 return -ENOMEM; in rtw89_fw_h2c_assoc_cmac_tbl()
2030 SET_CTRL_INFO_MACID(skb->data, mac_id); in rtw89_fw_h2c_assoc_cmac_tbl()
2031 SET_CTRL_INFO_OPERATION(skb->data, 1); in rtw89_fw_h2c_assoc_cmac_tbl()
2032 SET_CMC_TBL_DISRTSFB(skb->data, 1); in rtw89_fw_h2c_assoc_cmac_tbl()
2033 SET_CMC_TBL_DISDATAFB(skb->data, 1); in rtw89_fw_h2c_assoc_cmac_tbl()
2034 SET_CMC_TBL_RTS_RTY_LOWEST_RATE(skb->data, lowest_rate); in rtw89_fw_h2c_assoc_cmac_tbl()
2035 SET_CMC_TBL_RTS_TXCNT_LMT_SEL(skb->data, 0); in rtw89_fw_h2c_assoc_cmac_tbl()
2036 SET_CMC_TBL_DATA_TXCNT_LMT_SEL(skb->data, 0); in rtw89_fw_h2c_assoc_cmac_tbl()
2037 if (vif->type == NL80211_IFTYPE_STATION) in rtw89_fw_h2c_assoc_cmac_tbl()
2038 SET_CMC_TBL_ULDL(skb->data, 1); in rtw89_fw_h2c_assoc_cmac_tbl()
2040 SET_CMC_TBL_ULDL(skb->data, 0); in rtw89_fw_h2c_assoc_cmac_tbl()
2041 SET_CMC_TBL_MULTI_PORT_ID(skb->data, rtwvif->port); in rtw89_fw_h2c_assoc_cmac_tbl()
2042 if (chip->h2c_cctl_func_id == H2C_FUNC_MAC_CCTLINFO_UD_V1) { in rtw89_fw_h2c_assoc_cmac_tbl()
2043 SET_CMC_TBL_NOMINAL_PKT_PADDING_V1(skb->data, pads[RTW89_CHANNEL_WIDTH_20]); in rtw89_fw_h2c_assoc_cmac_tbl()
2044 SET_CMC_TBL_NOMINAL_PKT_PADDING40_V1(skb->data, pads[RTW89_CHANNEL_WIDTH_40]); in rtw89_fw_h2c_assoc_cmac_tbl()
2045 SET_CMC_TBL_NOMINAL_PKT_PADDING80_V1(skb->data, pads[RTW89_CHANNEL_WIDTH_80]); in rtw89_fw_h2c_assoc_cmac_tbl()
2046 SET_CMC_TBL_NOMINAL_PKT_PADDING160_V1(skb->data, pads[RTW89_CHANNEL_WIDTH_160]); in rtw89_fw_h2c_assoc_cmac_tbl()
2047 } else if (chip->h2c_cctl_func_id == H2C_FUNC_MAC_CCTLINFO_UD) { in rtw89_fw_h2c_assoc_cmac_tbl()
2048 SET_CMC_TBL_NOMINAL_PKT_PADDING(skb->data, pads[RTW89_CHANNEL_WIDTH_20]); in rtw89_fw_h2c_assoc_cmac_tbl()
2049 SET_CMC_TBL_NOMINAL_PKT_PADDING40(skb->data, pads[RTW89_CHANNEL_WIDTH_40]); in rtw89_fw_h2c_assoc_cmac_tbl()
2050 SET_CMC_TBL_NOMINAL_PKT_PADDING80(skb->data, pads[RTW89_CHANNEL_WIDTH_80]); in rtw89_fw_h2c_assoc_cmac_tbl()
2051 SET_CMC_TBL_NOMINAL_PKT_PADDING160(skb->data, pads[RTW89_CHANNEL_WIDTH_160]); in rtw89_fw_h2c_assoc_cmac_tbl()
2054 SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(skb->data, in rtw89_fw_h2c_assoc_cmac_tbl()
2055 sta->deflink.he_cap.has_he); in rtw89_fw_h2c_assoc_cmac_tbl()
2056 if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE) in rtw89_fw_h2c_assoc_cmac_tbl()
2057 SET_CMC_TBL_DATA_DCM(skb->data, 0); in rtw89_fw_h2c_assoc_cmac_tbl()
2061 chip->h2c_cctl_func_id, 0, 1, in rtw89_fw_h2c_assoc_cmac_tbl()
2080 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_txtime_cmac_tbl()
2087 return -ENOMEM; in rtw89_fw_h2c_txtime_cmac_tbl()
2090 SET_CTRL_INFO_MACID(skb->data, rtwsta->mac_id); in rtw89_fw_h2c_txtime_cmac_tbl()
2091 SET_CTRL_INFO_OPERATION(skb->data, 1); in rtw89_fw_h2c_txtime_cmac_tbl()
2092 if (rtwsta->cctl_tx_time) { in rtw89_fw_h2c_txtime_cmac_tbl()
2093 SET_CMC_TBL_AMPDU_TIME_SEL(skb->data, 1); in rtw89_fw_h2c_txtime_cmac_tbl()
2094 SET_CMC_TBL_AMPDU_MAX_TIME(skb->data, rtwsta->ampdu_max_time); in rtw89_fw_h2c_txtime_cmac_tbl()
2096 if (rtwsta->cctl_tx_retry_limit) { in rtw89_fw_h2c_txtime_cmac_tbl()
2097 SET_CMC_TBL_DATA_TXCNT_LMT_SEL(skb->data, 1); in rtw89_fw_h2c_txtime_cmac_tbl()
2098 SET_CMC_TBL_DATA_TX_CNT_LMT(skb->data, rtwsta->data_tx_cnt_lmt); in rtw89_fw_h2c_txtime_cmac_tbl()
2103 chip->h2c_cctl_func_id, 0, 1, in rtw89_fw_h2c_txtime_cmac_tbl()
2122 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_txpath_cmac_tbl()
2126 if (chip->h2c_cctl_func_id != H2C_FUNC_MAC_CCTLINFO_UD) in rtw89_fw_h2c_txpath_cmac_tbl()
2132 return -ENOMEM; in rtw89_fw_h2c_txpath_cmac_tbl()
2135 SET_CTRL_INFO_MACID(skb->data, rtwsta->mac_id); in rtw89_fw_h2c_txpath_cmac_tbl()
2136 SET_CTRL_INFO_OPERATION(skb->data, 1); in rtw89_fw_h2c_txpath_cmac_tbl()
2164 rtwvif->sub_entity_idx); in rtw89_fw_h2c_update_beacon()
2174 if (vif->p2p) in rtw89_fw_h2c_update_beacon()
2176 else if (chan->band_type == RTW89_BAND_2G) in rtw89_fw_h2c_update_beacon()
2181 skb_beacon = ieee80211_beacon_get_tim(rtwdev->hw, vif, &tim_offset, in rtw89_fw_h2c_update_beacon()
2185 return -ENOMEM; in rtw89_fw_h2c_update_beacon()
2195 bcn_total_len = H2C_BCN_BASE_LEN + skb_beacon->len; in rtw89_fw_h2c_update_beacon()
2200 return -ENOMEM; in rtw89_fw_h2c_update_beacon()
2204 SET_BCN_UPD_PORT(skb->data, rtwvif->port); in rtw89_fw_h2c_update_beacon()
2205 SET_BCN_UPD_MBSSID(skb->data, 0); in rtw89_fw_h2c_update_beacon()
2206 SET_BCN_UPD_BAND(skb->data, rtwvif->mac_idx); in rtw89_fw_h2c_update_beacon()
2207 SET_BCN_UPD_GRP_IE_OFST(skb->data, tim_offset); in rtw89_fw_h2c_update_beacon()
2208 SET_BCN_UPD_MACID(skb->data, rtwvif->mac_id); in rtw89_fw_h2c_update_beacon()
2209 SET_BCN_UPD_SSN_SEL(skb->data, RTW89_MGMT_HW_SSN_SEL); in rtw89_fw_h2c_update_beacon()
2210 SET_BCN_UPD_SSN_MODE(skb->data, RTW89_MGMT_HW_SEQ_MODE); in rtw89_fw_h2c_update_beacon()
2211 SET_BCN_UPD_RATE(skb->data, beacon_rate); in rtw89_fw_h2c_update_beacon()
2213 skb_put_data(skb, skb_beacon->data, skb_beacon->len); in rtw89_fw_h2c_update_beacon()
2238 u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id; in rtw89_fw_h2c_role_maintain()
2242 if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE) { in rtw89_fw_h2c_role_maintain()
2246 self_role = rtwvif->self_role; in rtw89_fw_h2c_role_maintain()
2248 self_role = rtwvif->self_role; in rtw89_fw_h2c_role_maintain()
2254 return -ENOMEM; in rtw89_fw_h2c_role_maintain()
2257 SET_FWROLE_MAINTAIN_MACID(skb->data, mac_id); in rtw89_fw_h2c_role_maintain()
2258 SET_FWROLE_MAINTAIN_SELF_ROLE(skb->data, self_role); in rtw89_fw_h2c_role_maintain()
2259 SET_FWROLE_MAINTAIN_UPD_MODE(skb->data, upd_mode); in rtw89_fw_h2c_role_maintain()
2260 SET_FWROLE_MAINTAIN_WIFI_ROLE(skb->data, rtwvif->wifi_role); in rtw89_fw_h2c_role_maintain()
2285 u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id; in rtw89_fw_h2c_join_info()
2286 u8 self_role = rtwvif->self_role; in rtw89_fw_h2c_join_info()
2287 u8 net_type = rtwvif->net_type; in rtw89_fw_h2c_join_info()
2298 return -ENOMEM; in rtw89_fw_h2c_join_info()
2301 SET_JOININFO_MACID(skb->data, mac_id); in rtw89_fw_h2c_join_info()
2302 SET_JOININFO_OP(skb->data, dis_conn); in rtw89_fw_h2c_join_info()
2303 SET_JOININFO_BAND(skb->data, rtwvif->mac_idx); in rtw89_fw_h2c_join_info()
2304 SET_JOININFO_WMM(skb->data, rtwvif->wmm); in rtw89_fw_h2c_join_info()
2305 SET_JOININFO_TGR(skb->data, rtwvif->trigger); in rtw89_fw_h2c_join_info()
2306 SET_JOININFO_ISHESTA(skb->data, 0); in rtw89_fw_h2c_join_info()
2307 SET_JOININFO_DLBW(skb->data, 0); in rtw89_fw_h2c_join_info()
2308 SET_JOININFO_TF_MAC_PAD(skb->data, 0); in rtw89_fw_h2c_join_info()
2309 SET_JOININFO_DL_T_PE(skb->data, 0); in rtw89_fw_h2c_join_info()
2310 SET_JOININFO_PORT_ID(skb->data, rtwvif->port); in rtw89_fw_h2c_join_info()
2311 SET_JOININFO_NET_TYPE(skb->data, net_type); in rtw89_fw_h2c_join_info()
2312 SET_JOININFO_WIFI_ROLE(skb->data, rtwvif->wifi_role); in rtw89_fw_h2c_join_info()
2313 SET_JOININFO_SELF_ROLE(skb->data, self_role); in rtw89_fw_h2c_join_info()
2343 return -ENOMEM; in rtw89_fw_h2c_notify_dbcc()
2346 h2c = (struct rtw89_h2c_notify_dbcc *)skb->data; in rtw89_fw_h2c_notify_dbcc()
2348 h2c->w0 = le32_encode_bits(en, RTW89_H2C_NOTIFY_DBCC_EN); in rtw89_fw_h2c_notify_dbcc()
2379 return -ENOMEM; in rtw89_fw_h2c_macid_pause()
2414 return -ENOMEM; in rtw89_fw_h2c_set_edca()
2417 RTW89_SET_EDCA_SEL(skb->data, 0); in rtw89_fw_h2c_set_edca()
2418 RTW89_SET_EDCA_BAND(skb->data, rtwvif->mac_idx); in rtw89_fw_h2c_set_edca()
2419 RTW89_SET_EDCA_WMM(skb->data, 0); in rtw89_fw_h2c_set_edca()
2420 RTW89_SET_EDCA_AC(skb->data, ac); in rtw89_fw_h2c_set_edca()
2421 RTW89_SET_EDCA_PARAM(skb->data, val); in rtw89_fw_h2c_set_edca()
2453 return -ENOMEM; in rtw89_fw_h2c_tsf32_toggle()
2456 cmd = skb->data; in rtw89_fw_h2c_tsf32_toggle()
2458 RTW89_SET_FWCMD_TSF32_TOGL_BAND(cmd, rtwvif->mac_idx); in rtw89_fw_h2c_tsf32_toggle()
2460 RTW89_SET_FWCMD_TSF32_TOGL_PORT(cmd, rtwvif->port); in rtw89_fw_h2c_tsf32_toggle()
2491 return -ENOMEM; in rtw89_fw_h2c_set_ofld_cfg()
2518 struct ieee80211_bss_conf *bss_conf = vif ? &vif->bss_conf : NULL; in rtw89_fw_h2c_set_bcn_fltr_cfg()
2524 if (!RTW89_CHK_FW_FEATURE(BEACON_FILTER, &rtwdev->fw)) in rtw89_fw_h2c_set_bcn_fltr_cfg()
2525 return -EINVAL; in rtw89_fw_h2c_set_bcn_fltr_cfg()
2527 if (!rtwvif || !bss_conf || rtwvif->net_type != RTW89_NET_TYPE_INFRA) in rtw89_fw_h2c_set_bcn_fltr_cfg()
2528 return -EINVAL; in rtw89_fw_h2c_set_bcn_fltr_cfg()
2533 return -ENOMEM; in rtw89_fw_h2c_set_bcn_fltr_cfg()
2537 h2c = (struct rtw89_h2c_bcnfltr *)skb->data; in rtw89_fw_h2c_set_bcn_fltr_cfg()
2539 h2c->w0 = le32_encode_bits(connect, RTW89_H2C_BCNFLTR_W0_MON_RSSI) | in rtw89_fw_h2c_set_bcn_fltr_cfg()
2545 le32_encode_bits(bss_conf->cqm_rssi_hyst, RTW89_H2C_BCNFLTR_W0_RSSI_HYST) | in rtw89_fw_h2c_set_bcn_fltr_cfg()
2546 le32_encode_bits(bss_conf->cqm_rssi_thold + MAX_RSSI, in rtw89_fw_h2c_set_bcn_fltr_cfg()
2548 le32_encode_bits(rtwvif->mac_id, RTW89_H2C_BCNFLTR_W0_MAC_ID); in rtw89_fw_h2c_set_bcn_fltr_cfg()
2576 if (!RTW89_CHK_FW_FEATURE(BEACON_FILTER, &rtwdev->fw)) in rtw89_fw_h2c_rssi_offload()
2577 return -EINVAL; in rtw89_fw_h2c_rssi_offload()
2580 return -EINVAL; in rtw89_fw_h2c_rssi_offload()
2585 return -ENOMEM; in rtw89_fw_h2c_rssi_offload()
2588 rssi = phy_ppdu->rssi_avg >> RSSI_FACTOR; in rtw89_fw_h2c_rssi_offload()
2590 h2c = (struct rtw89_h2c_ofld_rssi *)skb->data; in rtw89_fw_h2c_rssi_offload()
2592 h2c->w0 = le32_encode_bits(phy_ppdu->mac_id, RTW89_H2C_OFLD_RSSI_W0_MACID) | in rtw89_fw_h2c_rssi_offload()
2594 h2c->w1 = le32_encode_bits(rssi, RTW89_H2C_OFLD_RSSI_W1_VAL); in rtw89_fw_h2c_rssi_offload()
2615 struct rtw89_traffic_stats *stats = &rtwvif->stats; in rtw89_fw_h2c_tp_offload()
2621 if (rtwvif->net_type != RTW89_NET_TYPE_INFRA) in rtw89_fw_h2c_tp_offload()
2622 return -EINVAL; in rtw89_fw_h2c_tp_offload()
2627 return -ENOMEM; in rtw89_fw_h2c_tp_offload()
2631 h2c = (struct rtw89_h2c_ofld *)skb->data; in rtw89_fw_h2c_tp_offload()
2633 h2c->w0 = le32_encode_bits(rtwvif->mac_id, RTW89_H2C_OFLD_W0_MAC_ID) | in rtw89_fw_h2c_tp_offload()
2634 le32_encode_bits(stats->tx_throughput, RTW89_H2C_OFLD_W0_TX_TP) | in rtw89_fw_h2c_tp_offload()
2635 le32_encode_bits(stats->rx_throughput, RTW89_H2C_OFLD_W0_RX_TP); in rtw89_fw_h2c_tp_offload()
2656 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_h2c_ra()
2664 if (chip->chip_gen == RTW89_CHIP_BE) { in rtw89_fw_h2c_ra()
2672 return -ENOMEM; in rtw89_fw_h2c_ra()
2675 h2c = (struct rtw89_h2c_ra *)skb->data; in rtw89_fw_h2c_ra()
2677 "ra cmd msk: %llx ", ra->ra_mask); in rtw89_fw_h2c_ra()
2679 h2c->w0 = le32_encode_bits(ra->mode_ctrl, RTW89_H2C_RA_W0_MODE) | in rtw89_fw_h2c_ra()
2680 le32_encode_bits(ra->bw_cap, RTW89_H2C_RA_W0_BW_CAP) | in rtw89_fw_h2c_ra()
2681 le32_encode_bits(ra->macid, RTW89_H2C_RA_W0_MACID) | in rtw89_fw_h2c_ra()
2682 le32_encode_bits(ra->dcm_cap, RTW89_H2C_RA_W0_DCM) | in rtw89_fw_h2c_ra()
2683 le32_encode_bits(ra->er_cap, RTW89_H2C_RA_W0_ER) | in rtw89_fw_h2c_ra()
2684 le32_encode_bits(ra->init_rate_lv, RTW89_H2C_RA_W0_INIT_RATE_LV) | in rtw89_fw_h2c_ra()
2685 le32_encode_bits(ra->upd_all, RTW89_H2C_RA_W0_UPD_ALL) | in rtw89_fw_h2c_ra()
2686 le32_encode_bits(ra->en_sgi, RTW89_H2C_RA_W0_SGI) | in rtw89_fw_h2c_ra()
2687 le32_encode_bits(ra->ldpc_cap, RTW89_H2C_RA_W0_LDPC) | in rtw89_fw_h2c_ra()
2688 le32_encode_bits(ra->stbc_cap, RTW89_H2C_RA_W0_STBC) | in rtw89_fw_h2c_ra()
2689 le32_encode_bits(ra->ss_num, RTW89_H2C_RA_W0_SS_NUM) | in rtw89_fw_h2c_ra()
2690 le32_encode_bits(ra->giltf, RTW89_H2C_RA_W0_GILTF) | in rtw89_fw_h2c_ra()
2691 le32_encode_bits(ra->upd_bw_nss_mask, RTW89_H2C_RA_W0_UPD_BW_NSS_MASK) | in rtw89_fw_h2c_ra()
2692 le32_encode_bits(ra->upd_mask, RTW89_H2C_RA_W0_UPD_MASK); in rtw89_fw_h2c_ra()
2693 h2c->w1 = le32_encode_bits(ra->ra_mask, RTW89_H2C_RA_W1_RAMASK_LO32); in rtw89_fw_h2c_ra()
2694 h2c->w2 = le32_encode_bits(ra->ra_mask >> 32, RTW89_H2C_RA_W2_RAMASK_HI32); in rtw89_fw_h2c_ra()
2695 h2c->w3 = le32_encode_bits(ra->fix_giltf_en, RTW89_H2C_RA_W3_FIX_GILTF_EN) | in rtw89_fw_h2c_ra()
2696 le32_encode_bits(ra->fix_giltf, RTW89_H2C_RA_W3_FIX_GILTF); in rtw89_fw_h2c_ra()
2702 h2c_v1->w4 = le32_encode_bits(ra->mode_ctrl, RTW89_H2C_RA_V1_W4_MODE_EHT) | in rtw89_fw_h2c_ra()
2703 le32_encode_bits(ra->bw_cap, RTW89_H2C_RA_V1_W4_BW_EHT); in rtw89_fw_h2c_ra()
2709 h2c->w2 |= le32_encode_bits(1, RTW89_H2C_RA_W2_BFEE_CSI_CTL); in rtw89_fw_h2c_ra()
2710 h2c->w3 |= le32_encode_bits(ra->band_num, RTW89_H2C_RA_W3_BAND_NUM) | in rtw89_fw_h2c_ra()
2711 le32_encode_bits(ra->cr_tbl_sel, RTW89_H2C_RA_W3_CR_TBL_SEL) | in rtw89_fw_h2c_ra()
2712 le32_encode_bits(ra->fixed_csi_rate_en, RTW89_H2C_RA_W3_FIXED_CSI_RATE_EN) | in rtw89_fw_h2c_ra()
2713 le32_encode_bits(ra->ra_csi_rate_en, RTW89_H2C_RA_W3_RA_CSI_RATE_EN) | in rtw89_fw_h2c_ra()
2714 le32_encode_bits(ra->csi_mcs_ss_idx, RTW89_H2C_RA_W3_FIXED_CSI_MCS_SS_IDX) | in rtw89_fw_h2c_ra()
2715 le32_encode_bits(ra->csi_mode, RTW89_H2C_RA_W3_FIXED_CSI_MODE) | in rtw89_fw_h2c_ra()
2716 le32_encode_bits(ra->csi_gi_ltf, RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF) | in rtw89_fw_h2c_ra()
2717 le32_encode_bits(ra->csi_bw, RTW89_H2C_RA_W3_FIXED_CSI_BW); in rtw89_fw_h2c_ra()
2740 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_init()
2741 struct rtw89_btc_dm *dm = &btc->dm; in rtw89_fw_h2c_cxdrv_init()
2742 struct rtw89_btc_init_info *init_info = &dm->init_info; in rtw89_fw_h2c_cxdrv_init()
2743 struct rtw89_btc_module *module = &init_info->module; in rtw89_fw_h2c_cxdrv_init()
2744 struct rtw89_btc_ant_info *ant = &module->ant; in rtw89_fw_h2c_cxdrv_init()
2753 return -ENOMEM; in rtw89_fw_h2c_cxdrv_init()
2756 h2c = (struct rtw89_h2c_cxinit *)skb->data; in rtw89_fw_h2c_cxdrv_init()
2758 h2c->hdr.type = CXDRVINFO_INIT; in rtw89_fw_h2c_cxdrv_init()
2759 h2c->hdr.len = len - H2C_LEN_CXDRVHDR; in rtw89_fw_h2c_cxdrv_init()
2761 h2c->ant_type = ant->type; in rtw89_fw_h2c_cxdrv_init()
2762 h2c->ant_num = ant->num; in rtw89_fw_h2c_cxdrv_init()
2763 h2c->ant_iso = ant->isolation; in rtw89_fw_h2c_cxdrv_init()
2764 h2c->ant_info = in rtw89_fw_h2c_cxdrv_init()
2765 u8_encode_bits(ant->single_pos, RTW89_H2C_CXINIT_ANT_INFO_POS) | in rtw89_fw_h2c_cxdrv_init()
2766 u8_encode_bits(ant->diversity, RTW89_H2C_CXINIT_ANT_INFO_DIVERSITY) | in rtw89_fw_h2c_cxdrv_init()
2767 u8_encode_bits(ant->btg_pos, RTW89_H2C_CXINIT_ANT_INFO_BTG_POS) | in rtw89_fw_h2c_cxdrv_init()
2768 u8_encode_bits(ant->stream_cnt, RTW89_H2C_CXINIT_ANT_INFO_STREAM_CNT); in rtw89_fw_h2c_cxdrv_init()
2770 h2c->mod_rfe = module->rfe_type; in rtw89_fw_h2c_cxdrv_init()
2771 h2c->mod_cv = module->cv; in rtw89_fw_h2c_cxdrv_init()
2772 h2c->mod_info = in rtw89_fw_h2c_cxdrv_init()
2773 u8_encode_bits(module->bt_solo, RTW89_H2C_CXINIT_MOD_INFO_BT_SOLO) | in rtw89_fw_h2c_cxdrv_init()
2774 u8_encode_bits(module->bt_pos, RTW89_H2C_CXINIT_MOD_INFO_BT_POS) | in rtw89_fw_h2c_cxdrv_init()
2775 u8_encode_bits(module->switch_type, RTW89_H2C_CXINIT_MOD_INFO_SW_TYPE) | in rtw89_fw_h2c_cxdrv_init()
2776 u8_encode_bits(module->wa_type, RTW89_H2C_CXINIT_MOD_INFO_WA_TYPE); in rtw89_fw_h2c_cxdrv_init()
2777 h2c->mod_adie_kt = module->kt_ver_adie; in rtw89_fw_h2c_cxdrv_init()
2778 h2c->wl_gch = init_info->wl_guard_ch; in rtw89_fw_h2c_cxdrv_init()
2780 h2c->info = in rtw89_fw_h2c_cxdrv_init()
2781 u8_encode_bits(init_info->wl_only, RTW89_H2C_CXINIT_INFO_WL_ONLY) | in rtw89_fw_h2c_cxdrv_init()
2782 u8_encode_bits(init_info->wl_init_ok, RTW89_H2C_CXINIT_INFO_WL_INITOK) | in rtw89_fw_h2c_cxdrv_init()
2783 u8_encode_bits(init_info->dbcc_en, RTW89_H2C_CXINIT_INFO_DBCC_EN) | in rtw89_fw_h2c_cxdrv_init()
2784 u8_encode_bits(init_info->cx_other, RTW89_H2C_CXINIT_INFO_CX_OTHER) | in rtw89_fw_h2c_cxdrv_init()
2785 u8_encode_bits(init_info->bt_only, RTW89_H2C_CXINIT_INFO_BT_ONLY); in rtw89_fw_h2c_cxdrv_init()
2812 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_role()
2813 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_fw_h2c_cxdrv_role()
2814 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_fw_h2c_cxdrv_role()
2815 struct rtw89_btc_wl_role_info *role_info = &wl->role_info; in rtw89_fw_h2c_cxdrv_role()
2816 struct rtw89_btc_wl_role_info_bpos *bpos = &role_info->role_map.role; in rtw89_fw_h2c_cxdrv_role()
2817 struct rtw89_btc_wl_active_role *active = role_info->active_role; in rtw89_fw_h2c_cxdrv_role()
2825 len = H2C_LEN_CXDRVINFO_ROLE_SIZE(ver->max_role_num); in rtw89_fw_h2c_cxdrv_role()
2830 return -ENOMEM; in rtw89_fw_h2c_cxdrv_role()
2833 cmd = skb->data; in rtw89_fw_h2c_cxdrv_role()
2836 RTW89_SET_FWCMD_CXHDR_LEN(cmd, len - H2C_LEN_CXDRVHDR); in rtw89_fw_h2c_cxdrv_role()
2838 RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(cmd, role_info->connect_cnt); in rtw89_fw_h2c_cxdrv_role()
2839 RTW89_SET_FWCMD_CXROLE_LINK_MODE(cmd, role_info->link_mode); in rtw89_fw_h2c_cxdrv_role()
2841 RTW89_SET_FWCMD_CXROLE_ROLE_NONE(cmd, bpos->none); in rtw89_fw_h2c_cxdrv_role()
2842 RTW89_SET_FWCMD_CXROLE_ROLE_STA(cmd, bpos->station); in rtw89_fw_h2c_cxdrv_role()
2843 RTW89_SET_FWCMD_CXROLE_ROLE_AP(cmd, bpos->ap); in rtw89_fw_h2c_cxdrv_role()
2844 RTW89_SET_FWCMD_CXROLE_ROLE_VAP(cmd, bpos->vap); in rtw89_fw_h2c_cxdrv_role()
2845 RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC(cmd, bpos->adhoc); in rtw89_fw_h2c_cxdrv_role()
2846 RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC_MASTER(cmd, bpos->adhoc_master); in rtw89_fw_h2c_cxdrv_role()
2847 RTW89_SET_FWCMD_CXROLE_ROLE_MESH(cmd, bpos->mesh); in rtw89_fw_h2c_cxdrv_role()
2848 RTW89_SET_FWCMD_CXROLE_ROLE_MONITOR(cmd, bpos->moniter); in rtw89_fw_h2c_cxdrv_role()
2849 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_DEV(cmd, bpos->p2p_device); in rtw89_fw_h2c_cxdrv_role()
2850 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GC(cmd, bpos->p2p_gc); in rtw89_fw_h2c_cxdrv_role()
2851 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GO(cmd, bpos->p2p_go); in rtw89_fw_h2c_cxdrv_role()
2852 RTW89_SET_FWCMD_CXROLE_ROLE_NAN(cmd, bpos->nan); in rtw89_fw_h2c_cxdrv_role()
2855 RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED(cmd, active->connected, i, offset); in rtw89_fw_h2c_cxdrv_role()
2856 RTW89_SET_FWCMD_CXROLE_ACT_PID(cmd, active->pid, i, offset); in rtw89_fw_h2c_cxdrv_role()
2857 RTW89_SET_FWCMD_CXROLE_ACT_PHY(cmd, active->phy, i, offset); in rtw89_fw_h2c_cxdrv_role()
2858 RTW89_SET_FWCMD_CXROLE_ACT_NOA(cmd, active->noa, i, offset); in rtw89_fw_h2c_cxdrv_role()
2859 RTW89_SET_FWCMD_CXROLE_ACT_BAND(cmd, active->band, i, offset); in rtw89_fw_h2c_cxdrv_role()
2860 RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS(cmd, active->client_ps, i, offset); in rtw89_fw_h2c_cxdrv_role()
2861 RTW89_SET_FWCMD_CXROLE_ACT_BW(cmd, active->bw, i, offset); in rtw89_fw_h2c_cxdrv_role()
2862 RTW89_SET_FWCMD_CXROLE_ACT_ROLE(cmd, active->role, i, offset); in rtw89_fw_h2c_cxdrv_role()
2863 RTW89_SET_FWCMD_CXROLE_ACT_CH(cmd, active->ch, i, offset); in rtw89_fw_h2c_cxdrv_role()
2864 RTW89_SET_FWCMD_CXROLE_ACT_TX_LVL(cmd, active->tx_lvl, i, offset); in rtw89_fw_h2c_cxdrv_role()
2865 RTW89_SET_FWCMD_CXROLE_ACT_RX_LVL(cmd, active->rx_lvl, i, offset); in rtw89_fw_h2c_cxdrv_role()
2866 RTW89_SET_FWCMD_CXROLE_ACT_TX_RATE(cmd, active->tx_rate, i, offset); in rtw89_fw_h2c_cxdrv_role()
2867 RTW89_SET_FWCMD_CXROLE_ACT_RX_RATE(cmd, active->rx_rate, i, offset); in rtw89_fw_h2c_cxdrv_role()
2893 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_role_v1()
2894 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_fw_h2c_cxdrv_role_v1()
2895 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_fw_h2c_cxdrv_role_v1()
2896 struct rtw89_btc_wl_role_info_v1 *role_info = &wl->role_info_v1; in rtw89_fw_h2c_cxdrv_role_v1()
2897 struct rtw89_btc_wl_role_info_bpos *bpos = &role_info->role_map.role; in rtw89_fw_h2c_cxdrv_role_v1()
2898 struct rtw89_btc_wl_active_role_v1 *active = role_info->active_role_v1; in rtw89_fw_h2c_cxdrv_role_v1()
2905 len = H2C_LEN_CXDRVINFO_ROLE_SIZE_V1(ver->max_role_num); in rtw89_fw_h2c_cxdrv_role_v1()
2910 return -ENOMEM; in rtw89_fw_h2c_cxdrv_role_v1()
2913 cmd = skb->data; in rtw89_fw_h2c_cxdrv_role_v1()
2916 RTW89_SET_FWCMD_CXHDR_LEN(cmd, len - H2C_LEN_CXDRVHDR); in rtw89_fw_h2c_cxdrv_role_v1()
2918 RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(cmd, role_info->connect_cnt); in rtw89_fw_h2c_cxdrv_role_v1()
2919 RTW89_SET_FWCMD_CXROLE_LINK_MODE(cmd, role_info->link_mode); in rtw89_fw_h2c_cxdrv_role_v1()
2921 RTW89_SET_FWCMD_CXROLE_ROLE_NONE(cmd, bpos->none); in rtw89_fw_h2c_cxdrv_role_v1()
2922 RTW89_SET_FWCMD_CXROLE_ROLE_STA(cmd, bpos->station); in rtw89_fw_h2c_cxdrv_role_v1()
2923 RTW89_SET_FWCMD_CXROLE_ROLE_AP(cmd, bpos->ap); in rtw89_fw_h2c_cxdrv_role_v1()
2924 RTW89_SET_FWCMD_CXROLE_ROLE_VAP(cmd, bpos->vap); in rtw89_fw_h2c_cxdrv_role_v1()
2925 RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC(cmd, bpos->adhoc); in rtw89_fw_h2c_cxdrv_role_v1()
2926 RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC_MASTER(cmd, bpos->adhoc_master); in rtw89_fw_h2c_cxdrv_role_v1()
2927 RTW89_SET_FWCMD_CXROLE_ROLE_MESH(cmd, bpos->mesh); in rtw89_fw_h2c_cxdrv_role_v1()
2928 RTW89_SET_FWCMD_CXROLE_ROLE_MONITOR(cmd, bpos->moniter); in rtw89_fw_h2c_cxdrv_role_v1()
2929 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_DEV(cmd, bpos->p2p_device); in rtw89_fw_h2c_cxdrv_role_v1()
2930 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GC(cmd, bpos->p2p_gc); in rtw89_fw_h2c_cxdrv_role_v1()
2931 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GO(cmd, bpos->p2p_go); in rtw89_fw_h2c_cxdrv_role_v1()
2932 RTW89_SET_FWCMD_CXROLE_ROLE_NAN(cmd, bpos->nan); in rtw89_fw_h2c_cxdrv_role_v1()
2936 RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED(cmd, active->connected, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2937 RTW89_SET_FWCMD_CXROLE_ACT_PID(cmd, active->pid, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2938 RTW89_SET_FWCMD_CXROLE_ACT_PHY(cmd, active->phy, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2939 RTW89_SET_FWCMD_CXROLE_ACT_NOA(cmd, active->noa, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2940 RTW89_SET_FWCMD_CXROLE_ACT_BAND(cmd, active->band, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2941 RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS(cmd, active->client_ps, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2942 RTW89_SET_FWCMD_CXROLE_ACT_BW(cmd, active->bw, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2943 RTW89_SET_FWCMD_CXROLE_ACT_ROLE(cmd, active->role, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2944 RTW89_SET_FWCMD_CXROLE_ACT_CH(cmd, active->ch, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2945 RTW89_SET_FWCMD_CXROLE_ACT_TX_LVL(cmd, active->tx_lvl, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2946 RTW89_SET_FWCMD_CXROLE_ACT_RX_LVL(cmd, active->rx_lvl, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2947 RTW89_SET_FWCMD_CXROLE_ACT_TX_RATE(cmd, active->tx_rate, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2948 RTW89_SET_FWCMD_CXROLE_ACT_RX_RATE(cmd, active->rx_rate, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2949 RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR(cmd, active->noa_duration, i, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2952 offset = len - H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN; in rtw89_fw_h2c_cxdrv_role_v1()
2953 RTW89_SET_FWCMD_CXROLE_MROLE_TYPE(cmd, role_info->mrole_type, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2954 RTW89_SET_FWCMD_CXROLE_MROLE_NOA(cmd, role_info->mrole_noa_duration, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2955 RTW89_SET_FWCMD_CXROLE_DBCC_EN(cmd, role_info->dbcc_en, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2956 RTW89_SET_FWCMD_CXROLE_DBCC_CHG(cmd, role_info->dbcc_chg, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2957 RTW89_SET_FWCMD_CXROLE_DBCC_2G_PHY(cmd, role_info->dbcc_2g_phy, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2958 RTW89_SET_FWCMD_CXROLE_LINK_MODE_CHG(cmd, role_info->link_mode_chg, offset); in rtw89_fw_h2c_cxdrv_role_v1()
2983 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_role_v2()
2984 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_fw_h2c_cxdrv_role_v2()
2985 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_fw_h2c_cxdrv_role_v2()
2986 struct rtw89_btc_wl_role_info_v2 *role_info = &wl->role_info_v2; in rtw89_fw_h2c_cxdrv_role_v2()
2987 struct rtw89_btc_wl_role_info_bpos *bpos = &role_info->role_map.role; in rtw89_fw_h2c_cxdrv_role_v2()
2988 struct rtw89_btc_wl_active_role_v2 *active = role_info->active_role_v2; in rtw89_fw_h2c_cxdrv_role_v2()
2995 len = H2C_LEN_CXDRVINFO_ROLE_SIZE_V2(ver->max_role_num); in rtw89_fw_h2c_cxdrv_role_v2()
3000 return -ENOMEM; in rtw89_fw_h2c_cxdrv_role_v2()
3003 cmd = skb->data; in rtw89_fw_h2c_cxdrv_role_v2()
3006 RTW89_SET_FWCMD_CXHDR_LEN(cmd, len - H2C_LEN_CXDRVHDR); in rtw89_fw_h2c_cxdrv_role_v2()
3008 RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(cmd, role_info->connect_cnt); in rtw89_fw_h2c_cxdrv_role_v2()
3009 RTW89_SET_FWCMD_CXROLE_LINK_MODE(cmd, role_info->link_mode); in rtw89_fw_h2c_cxdrv_role_v2()
3011 RTW89_SET_FWCMD_CXROLE_ROLE_NONE(cmd, bpos->none); in rtw89_fw_h2c_cxdrv_role_v2()
3012 RTW89_SET_FWCMD_CXROLE_ROLE_STA(cmd, bpos->station); in rtw89_fw_h2c_cxdrv_role_v2()
3013 RTW89_SET_FWCMD_CXROLE_ROLE_AP(cmd, bpos->ap); in rtw89_fw_h2c_cxdrv_role_v2()
3014 RTW89_SET_FWCMD_CXROLE_ROLE_VAP(cmd, bpos->vap); in rtw89_fw_h2c_cxdrv_role_v2()
3015 RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC(cmd, bpos->adhoc); in rtw89_fw_h2c_cxdrv_role_v2()
3016 RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC_MASTER(cmd, bpos->adhoc_master); in rtw89_fw_h2c_cxdrv_role_v2()
3017 RTW89_SET_FWCMD_CXROLE_ROLE_MESH(cmd, bpos->mesh); in rtw89_fw_h2c_cxdrv_role_v2()
3018 RTW89_SET_FWCMD_CXROLE_ROLE_MONITOR(cmd, bpos->moniter); in rtw89_fw_h2c_cxdrv_role_v2()
3019 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_DEV(cmd, bpos->p2p_device); in rtw89_fw_h2c_cxdrv_role_v2()
3020 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GC(cmd, bpos->p2p_gc); in rtw89_fw_h2c_cxdrv_role_v2()
3021 RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GO(cmd, bpos->p2p_go); in rtw89_fw_h2c_cxdrv_role_v2()
3022 RTW89_SET_FWCMD_CXROLE_ROLE_NAN(cmd, bpos->nan); in rtw89_fw_h2c_cxdrv_role_v2()
3026 RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED_V2(cmd, active->connected, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3027 RTW89_SET_FWCMD_CXROLE_ACT_PID_V2(cmd, active->pid, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3028 RTW89_SET_FWCMD_CXROLE_ACT_PHY_V2(cmd, active->phy, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3029 RTW89_SET_FWCMD_CXROLE_ACT_NOA_V2(cmd, active->noa, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3030 RTW89_SET_FWCMD_CXROLE_ACT_BAND_V2(cmd, active->band, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3031 RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS_V2(cmd, active->client_ps, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3032 RTW89_SET_FWCMD_CXROLE_ACT_BW_V2(cmd, active->bw, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3033 RTW89_SET_FWCMD_CXROLE_ACT_ROLE_V2(cmd, active->role, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3034 RTW89_SET_FWCMD_CXROLE_ACT_CH_V2(cmd, active->ch, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3035 RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR_V2(cmd, active->noa_duration, i, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3038 offset = len - H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN; in rtw89_fw_h2c_cxdrv_role_v2()
3039 RTW89_SET_FWCMD_CXROLE_MROLE_TYPE(cmd, role_info->mrole_type, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3040 RTW89_SET_FWCMD_CXROLE_MROLE_NOA(cmd, role_info->mrole_noa_duration, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3041 RTW89_SET_FWCMD_CXROLE_DBCC_EN(cmd, role_info->dbcc_en, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3042 RTW89_SET_FWCMD_CXROLE_DBCC_CHG(cmd, role_info->dbcc_chg, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3043 RTW89_SET_FWCMD_CXROLE_DBCC_2G_PHY(cmd, role_info->dbcc_2g_phy, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3044 RTW89_SET_FWCMD_CXROLE_LINK_MODE_CHG(cmd, role_info->link_mode_chg, offset); in rtw89_fw_h2c_cxdrv_role_v2()
3067 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_ctrl()
3068 const struct rtw89_btc_ver *ver = btc->ver; in rtw89_fw_h2c_cxdrv_ctrl()
3069 struct rtw89_btc_ctrl *ctrl = &btc->ctrl; in rtw89_fw_h2c_cxdrv_ctrl()
3077 return -ENOMEM; in rtw89_fw_h2c_cxdrv_ctrl()
3080 cmd = skb->data; in rtw89_fw_h2c_cxdrv_ctrl()
3083 RTW89_SET_FWCMD_CXHDR_LEN(cmd, H2C_LEN_CXDRVINFO_CTRL - H2C_LEN_CXDRVHDR); in rtw89_fw_h2c_cxdrv_ctrl()
3085 RTW89_SET_FWCMD_CXCTRL_MANUAL(cmd, ctrl->manual); in rtw89_fw_h2c_cxdrv_ctrl()
3086 RTW89_SET_FWCMD_CXCTRL_IGNORE_BT(cmd, ctrl->igno_bt); in rtw89_fw_h2c_cxdrv_ctrl()
3087 RTW89_SET_FWCMD_CXCTRL_ALWAYS_FREERUN(cmd, ctrl->always_freerun); in rtw89_fw_h2c_cxdrv_ctrl()
3088 if (ver->fcxctrl == 0) in rtw89_fw_h2c_cxdrv_ctrl()
3089 RTW89_SET_FWCMD_CXCTRL_TRACE_STEP(cmd, ctrl->trace_step); in rtw89_fw_h2c_cxdrv_ctrl()
3112 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_trx()
3113 struct rtw89_btc_trx_info *trx = &btc->dm.trx_info; in rtw89_fw_h2c_cxdrv_trx()
3121 return -ENOMEM; in rtw89_fw_h2c_cxdrv_trx()
3124 cmd = skb->data; in rtw89_fw_h2c_cxdrv_trx()
3127 RTW89_SET_FWCMD_CXHDR_LEN(cmd, H2C_LEN_CXDRVINFO_TRX - H2C_LEN_CXDRVHDR); in rtw89_fw_h2c_cxdrv_trx()
3129 RTW89_SET_FWCMD_CXTRX_TXLV(cmd, trx->tx_lvl); in rtw89_fw_h2c_cxdrv_trx()
3130 RTW89_SET_FWCMD_CXTRX_RXLV(cmd, trx->rx_lvl); in rtw89_fw_h2c_cxdrv_trx()
3131 RTW89_SET_FWCMD_CXTRX_WLRSSI(cmd, trx->wl_rssi); in rtw89_fw_h2c_cxdrv_trx()
3132 RTW89_SET_FWCMD_CXTRX_BTRSSI(cmd, trx->bt_rssi); in rtw89_fw_h2c_cxdrv_trx()
3133 RTW89_SET_FWCMD_CXTRX_TXPWR(cmd, trx->tx_power); in rtw89_fw_h2c_cxdrv_trx()
3134 RTW89_SET_FWCMD_CXTRX_RXGAIN(cmd, trx->rx_gain); in rtw89_fw_h2c_cxdrv_trx()
3135 RTW89_SET_FWCMD_CXTRX_BTTXPWR(cmd, trx->bt_tx_power); in rtw89_fw_h2c_cxdrv_trx()
3136 RTW89_SET_FWCMD_CXTRX_BTRXGAIN(cmd, trx->bt_rx_gain); in rtw89_fw_h2c_cxdrv_trx()
3137 RTW89_SET_FWCMD_CXTRX_CN(cmd, trx->cn); in rtw89_fw_h2c_cxdrv_trx()
3138 RTW89_SET_FWCMD_CXTRX_NHM(cmd, trx->nhm); in rtw89_fw_h2c_cxdrv_trx()
3139 RTW89_SET_FWCMD_CXTRX_BTPROFILE(cmd, trx->bt_profile); in rtw89_fw_h2c_cxdrv_trx()
3140 RTW89_SET_FWCMD_CXTRX_RSVD2(cmd, trx->rsvd2); in rtw89_fw_h2c_cxdrv_trx()
3141 RTW89_SET_FWCMD_CXTRX_TXRATE(cmd, trx->tx_rate); in rtw89_fw_h2c_cxdrv_trx()
3142 RTW89_SET_FWCMD_CXTRX_RXRATE(cmd, trx->rx_rate); in rtw89_fw_h2c_cxdrv_trx()
3143 RTW89_SET_FWCMD_CXTRX_TXTP(cmd, trx->tx_tp); in rtw89_fw_h2c_cxdrv_trx()
3144 RTW89_SET_FWCMD_CXTRX_RXTP(cmd, trx->rx_tp); in rtw89_fw_h2c_cxdrv_trx()
3145 RTW89_SET_FWCMD_CXTRX_RXERRRA(cmd, trx->rx_err_ratio); in rtw89_fw_h2c_cxdrv_trx()
3168 struct rtw89_btc *btc = &rtwdev->btc; in rtw89_fw_h2c_cxdrv_rfk()
3169 struct rtw89_btc_wl_info *wl = &btc->cx.wl; in rtw89_fw_h2c_cxdrv_rfk()
3170 struct rtw89_btc_wl_rfk_info *rfk_info = &wl->rfk_info; in rtw89_fw_h2c_cxdrv_rfk()
3178 return -ENOMEM; in rtw89_fw_h2c_cxdrv_rfk()
3181 cmd = skb->data; in rtw89_fw_h2c_cxdrv_rfk()
3184 RTW89_SET_FWCMD_CXHDR_LEN(cmd, H2C_LEN_CXDRVINFO_RFK - H2C_LEN_CXDRVHDR); in rtw89_fw_h2c_cxdrv_rfk()
3186 RTW89_SET_FWCMD_CXRFK_STATE(cmd, rfk_info->state); in rtw89_fw_h2c_cxdrv_rfk()
3187 RTW89_SET_FWCMD_CXRFK_PATH_MAP(cmd, rfk_info->path_map); in rtw89_fw_h2c_cxdrv_rfk()
3188 RTW89_SET_FWCMD_CXRFK_PHY_MAP(cmd, rfk_info->phy_map); in rtw89_fw_h2c_cxdrv_rfk()
3189 RTW89_SET_FWCMD_CXRFK_BAND(cmd, rfk_info->band); in rtw89_fw_h2c_cxdrv_rfk()
3190 RTW89_SET_FWCMD_CXRFK_TYPE(cmd, rfk_info->type); in rtw89_fw_h2c_cxdrv_rfk()
3211 int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id) in rtw89_fw_h2c_del_pkt_offload() argument
3213 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait; in rtw89_fw_h2c_del_pkt_offload()
3222 return -ENOMEM; in rtw89_fw_h2c_del_pkt_offload()
3225 cmd = skb->data; in rtw89_fw_h2c_del_pkt_offload()
3227 RTW89_SET_FWCMD_PACKET_OFLD_PKT_IDX(cmd, id); in rtw89_fw_h2c_del_pkt_offload()
3235 cond = RTW89_FW_OFLD_WAIT_COND_PKT_OFLD(id, RTW89_PKT_OFLD_OP_DEL); in rtw89_fw_h2c_del_pkt_offload()
3240 "failed to del pkt ofld: id %d, ret %d\n", in rtw89_fw_h2c_del_pkt_offload()
3241 id, ret); in rtw89_fw_h2c_del_pkt_offload()
3245 rtw89_core_release_bit_map(rtwdev->pkt_offload, id); in rtw89_fw_h2c_del_pkt_offload()
3249 int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id, in rtw89_fw_h2c_add_pkt_offload() argument
3252 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait; in rtw89_fw_h2c_add_pkt_offload()
3259 alloc_id = rtw89_core_acquire_bit_map(rtwdev->pkt_offload, in rtw89_fw_h2c_add_pkt_offload()
3262 return -ENOSPC; in rtw89_fw_h2c_add_pkt_offload()
3264 *id = alloc_id; in rtw89_fw_h2c_add_pkt_offload()
3266 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_PKT_OFLD + skb_ofld->len); in rtw89_fw_h2c_add_pkt_offload()
3269 rtw89_core_release_bit_map(rtwdev->pkt_offload, alloc_id); in rtw89_fw_h2c_add_pkt_offload()
3270 return -ENOMEM; in rtw89_fw_h2c_add_pkt_offload()
3273 cmd = skb->data; in rtw89_fw_h2c_add_pkt_offload()
3277 RTW89_SET_FWCMD_PACKET_OFLD_PKT_LENGTH(cmd, skb_ofld->len); in rtw89_fw_h2c_add_pkt_offload()
3278 skb_put_data(skb, skb_ofld->data, skb_ofld->len); in rtw89_fw_h2c_add_pkt_offload()
3283 H2C_LEN_PKT_OFLD + skb_ofld->len); in rtw89_fw_h2c_add_pkt_offload()
3290 "failed to add pkt ofld: id %d, ret %d\n", in rtw89_fw_h2c_add_pkt_offload()
3292 rtw89_core_release_bit_map(rtwdev->pkt_offload, alloc_id); in rtw89_fw_h2c_add_pkt_offload()
3303 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait; in rtw89_fw_h2c_scan_list_offload()
3314 return -ENOMEM; in rtw89_fw_h2c_scan_list_offload()
3317 cmd = skb->data; in rtw89_fw_h2c_scan_list_offload()
3326 RTW89_SET_FWCMD_CHINFO_PERIOD(cmd, ch_info->period); in rtw89_fw_h2c_scan_list_offload()
3327 RTW89_SET_FWCMD_CHINFO_DWELL(cmd, ch_info->dwell_time); in rtw89_fw_h2c_scan_list_offload()
3328 RTW89_SET_FWCMD_CHINFO_CENTER_CH(cmd, ch_info->central_ch); in rtw89_fw_h2c_scan_list_offload()
3329 RTW89_SET_FWCMD_CHINFO_PRI_CH(cmd, ch_info->pri_ch); in rtw89_fw_h2c_scan_list_offload()
3330 RTW89_SET_FWCMD_CHINFO_BW(cmd, ch_info->bw); in rtw89_fw_h2c_scan_list_offload()
3331 RTW89_SET_FWCMD_CHINFO_ACTION(cmd, ch_info->notify_action); in rtw89_fw_h2c_scan_list_offload()
3332 RTW89_SET_FWCMD_CHINFO_NUM_PKT(cmd, ch_info->num_pkt); in rtw89_fw_h2c_scan_list_offload()
3333 RTW89_SET_FWCMD_CHINFO_TX(cmd, ch_info->tx_pkt); in rtw89_fw_h2c_scan_list_offload()
3334 RTW89_SET_FWCMD_CHINFO_PAUSE_DATA(cmd, ch_info->pause_data); in rtw89_fw_h2c_scan_list_offload()
3335 RTW89_SET_FWCMD_CHINFO_BAND(cmd, ch_info->ch_band); in rtw89_fw_h2c_scan_list_offload()
3336 RTW89_SET_FWCMD_CHINFO_PKT_ID(cmd, ch_info->probe_id); in rtw89_fw_h2c_scan_list_offload()
3337 RTW89_SET_FWCMD_CHINFO_DFS(cmd, ch_info->dfs_ch); in rtw89_fw_h2c_scan_list_offload()
3338 RTW89_SET_FWCMD_CHINFO_TX_NULL(cmd, ch_info->tx_null); in rtw89_fw_h2c_scan_list_offload()
3339 RTW89_SET_FWCMD_CHINFO_RANDOM(cmd, ch_info->rand_seq_num); in rtw89_fw_h2c_scan_list_offload()
3340 RTW89_SET_FWCMD_CHINFO_PKT0(cmd, ch_info->pkt_id[0]); in rtw89_fw_h2c_scan_list_offload()
3341 RTW89_SET_FWCMD_CHINFO_PKT1(cmd, ch_info->pkt_id[1]); in rtw89_fw_h2c_scan_list_offload()
3342 RTW89_SET_FWCMD_CHINFO_PKT2(cmd, ch_info->pkt_id[2]); in rtw89_fw_h2c_scan_list_offload()
3343 RTW89_SET_FWCMD_CHINFO_PKT3(cmd, ch_info->pkt_id[3]); in rtw89_fw_h2c_scan_list_offload()
3344 RTW89_SET_FWCMD_CHINFO_PKT4(cmd, ch_info->pkt_id[4]); in rtw89_fw_h2c_scan_list_offload()
3345 RTW89_SET_FWCMD_CHINFO_PKT5(cmd, ch_info->pkt_id[5]); in rtw89_fw_h2c_scan_list_offload()
3346 RTW89_SET_FWCMD_CHINFO_PKT6(cmd, ch_info->pkt_id[6]); in rtw89_fw_h2c_scan_list_offload()
3347 RTW89_SET_FWCMD_CHINFO_PKT7(cmd, ch_info->pkt_id[7]); in rtw89_fw_h2c_scan_list_offload()
3369 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait; in rtw89_fw_h2c_scan_offload()
3370 struct rtw89_chan *op = &rtwdev->scan_info.op_chan; in rtw89_fw_h2c_scan_offload()
3380 return -ENOMEM; in rtw89_fw_h2c_scan_offload()
3383 h2c = (struct rtw89_h2c_scanofld *)skb->data; in rtw89_fw_h2c_scan_offload()
3385 h2c->w0 = le32_encode_bits(rtwvif->mac_id, RTW89_H2C_SCANOFLD_W0_MACID) | in rtw89_fw_h2c_scan_offload()
3386 le32_encode_bits(rtwvif->port, RTW89_H2C_SCANOFLD_W0_PORT_ID) | in rtw89_fw_h2c_scan_offload()
3388 le32_encode_bits(option->enable, RTW89_H2C_SCANOFLD_W0_OPERATION); in rtw89_fw_h2c_scan_offload()
3390 h2c->w1 = le32_encode_bits(true, RTW89_H2C_SCANOFLD_W1_NOTIFY_END) | in rtw89_fw_h2c_scan_offload()
3391 le32_encode_bits(option->target_ch_mode, in rtw89_fw_h2c_scan_offload()
3397 if (option->target_ch_mode) { in rtw89_fw_h2c_scan_offload()
3398 h2c->w1 |= le32_encode_bits(op->band_width, in rtw89_fw_h2c_scan_offload()
3400 le32_encode_bits(op->primary_channel, in rtw89_fw_h2c_scan_offload()
3402 le32_encode_bits(op->channel, in rtw89_fw_h2c_scan_offload()
3404 h2c->w0 |= le32_encode_bits(op->band_type, in rtw89_fw_h2c_scan_offload()
3429 u8 class = info->rf_path == RF_PATH_A ? in rtw89_fw_h2c_rf_reg()
3436 return -ENOMEM; in rtw89_fw_h2c_rf_reg()
3438 skb_put_data(skb, info->rtw89_phy_config_rf_h2c[page], len); in rtw89_fw_h2c_rf_reg()
3459 struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; in rtw89_fw_h2c_rf_ntfy_mcc()
3468 return -ENOMEM; in rtw89_fw_h2c_rf_ntfy_mcc()
3471 mccch = (struct rtw89_fw_h2c_rf_get_mccch *)skb->data; in rtw89_fw_h2c_rf_ntfy_mcc()
3473 idx = rfk_mcc->table_idx; in rtw89_fw_h2c_rf_ntfy_mcc()
3474 mccch->ch_0 = cpu_to_le32(rfk_mcc->ch[0]); in rtw89_fw_h2c_rf_ntfy_mcc()
3475 mccch->ch_1 = cpu_to_le32(rfk_mcc->ch[1]); in rtw89_fw_h2c_rf_ntfy_mcc()
3476 mccch->band_0 = cpu_to_le32(rfk_mcc->band[0]); in rtw89_fw_h2c_rf_ntfy_mcc()
3477 mccch->band_1 = cpu_to_le32(rfk_mcc->band[1]); in rtw89_fw_h2c_rf_ntfy_mcc()
3478 mccch->current_channel = cpu_to_le32(rfk_mcc->ch[idx]); in rtw89_fw_h2c_rf_ntfy_mcc()
3479 mccch->current_band_type = cpu_to_le32(rfk_mcc->band[idx]); in rtw89_fw_h2c_rf_ntfy_mcc()
3510 return -ENOMEM; in rtw89_fw_h2c_raw_with_hdr()
3539 return -ENOMEM; in rtw89_fw_h2c_raw()
3560 lockdep_assert_held(&rtwdev->mutex); in rtw89_fw_send_all_early_h2c()
3562 list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list) { in rtw89_fw_send_all_early_h2c()
3563 rtw89_fw_h2c_raw(rtwdev, early_h2c->h2c, early_h2c->h2c_len); in rtw89_fw_send_all_early_h2c()
3571 mutex_lock(&rtwdev->mutex); in rtw89_fw_free_all_early_h2c()
3572 list_for_each_entry_safe(early_h2c, tmp, &rtwdev->early_h2c_list, list) { in rtw89_fw_free_all_early_h2c()
3573 list_del(&early_h2c->list); in rtw89_fw_free_all_early_h2c()
3574 kfree(early_h2c->h2c); in rtw89_fw_free_all_early_h2c()
3577 mutex_unlock(&rtwdev->mutex); in rtw89_fw_free_all_early_h2c()
3582 const struct rtw89_c2h_hdr *hdr = (const struct rtw89_c2h_hdr *)c2h->data; in rtw89_fw_c2h_parse_attr()
3585 attr->category = le32_get_bits(hdr->w0, RTW89_C2H_HDR_W0_CATEGORY); in rtw89_fw_c2h_parse_attr()
3586 attr->class = le32_get_bits(hdr->w0, RTW89_C2H_HDR_W0_CLASS); in rtw89_fw_c2h_parse_attr()
3587 attr->func = le32_get_bits(hdr->w0, RTW89_C2H_HDR_W0_FUNC); in rtw89_fw_c2h_parse_attr()
3588 attr->len = le32_get_bits(hdr->w1, RTW89_C2H_HDR_W1_LEN); in rtw89_fw_c2h_parse_attr()
3595 u8 category = attr->category; in rtw89_fw_c2h_chk_atomic()
3596 u8 class = attr->class; in rtw89_fw_c2h_chk_atomic()
3597 u8 func = attr->func; in rtw89_fw_c2h_chk_atomic()
3620 skb_queue_tail(&rtwdev->c2h_queue, c2h); in rtw89_fw_c2h_irqsafe()
3621 ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); in rtw89_fw_c2h_irqsafe()
3628 u8 category = attr->category; in rtw89_fw_c2h_cmd_handle()
3629 u8 class = attr->class; in rtw89_fw_c2h_cmd_handle()
3630 u8 func = attr->func; in rtw89_fw_c2h_cmd_handle()
3631 u16 len = attr->len; in rtw89_fw_c2h_cmd_handle()
3634 if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags)) in rtw89_fw_c2h_cmd_handle()
3656 rtw89_hex_dump(rtwdev, RTW89_DBG_FW, "C2H: ", skb->data, skb->len); in rtw89_fw_c2h_cmd_handle()
3665 skb_queue_walk_safe(&rtwdev->c2h_queue, skb, tmp) { in rtw89_fw_c2h_work()
3666 skb_unlink(skb, &rtwdev->c2h_queue); in rtw89_fw_c2h_work()
3667 mutex_lock(&rtwdev->mutex); in rtw89_fw_c2h_work()
3669 mutex_unlock(&rtwdev->mutex); in rtw89_fw_c2h_work()
3677 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_write_h2c_reg()
3678 struct rtw89_fw_info *fw_info = &rtwdev->fw; in rtw89_fw_write_h2c_reg()
3679 const u32 *h2c_reg = chip->h2c_regs; in rtw89_fw_write_h2c_reg()
3684 rtwdev, chip->h2c_ctrl_reg); in rtw89_fw_write_h2c_reg()
3690 len = DIV_ROUND_UP(info->content_len + RTW89_H2CREG_HDR_LEN, in rtw89_fw_write_h2c_reg()
3691 sizeof(info->u.h2creg[0])); in rtw89_fw_write_h2c_reg()
3693 u32p_replace_bits(&info->u.hdr.w0, info->id, RTW89_H2CREG_HDR_FUNC_MASK); in rtw89_fw_write_h2c_reg()
3694 u32p_replace_bits(&info->u.hdr.w0, len, RTW89_H2CREG_HDR_LEN_MASK); in rtw89_fw_write_h2c_reg()
3697 rtw89_write32(rtwdev, h2c_reg[i], info->u.h2creg[i]); in rtw89_fw_write_h2c_reg()
3699 fw_info->h2c_counter++; in rtw89_fw_write_h2c_reg()
3700 rtw89_write8_mask(rtwdev, chip->h2c_counter_reg.addr, in rtw89_fw_write_h2c_reg()
3701 chip->h2c_counter_reg.mask, fw_info->h2c_counter); in rtw89_fw_write_h2c_reg()
3702 rtw89_write8(rtwdev, chip->h2c_ctrl_reg, B_AX_H2CREG_TRIGGER); in rtw89_fw_write_h2c_reg()
3710 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_fw_read_c2h_reg()
3711 struct rtw89_fw_info *fw_info = &rtwdev->fw; in rtw89_fw_read_c2h_reg()
3712 const u32 *c2h_reg = chip->c2h_regs; in rtw89_fw_read_c2h_reg()
3716 info->id = RTW89_FWCMD_C2HREG_FUNC_NULL; in rtw89_fw_read_c2h_reg()
3720 chip->c2h_ctrl_reg); in rtw89_fw_read_c2h_reg()
3727 info->u.c2hreg[i] = rtw89_read32(rtwdev, c2h_reg[i]); in rtw89_fw_read_c2h_reg()
3729 rtw89_write8(rtwdev, chip->c2h_ctrl_reg, 0); in rtw89_fw_read_c2h_reg()
3731 info->id = u32_get_bits(info->u.hdr.w0, RTW89_C2HREG_HDR_FUNC_MASK); in rtw89_fw_read_c2h_reg()
3732 info->content_len = in rtw89_fw_read_c2h_reg()
3733 (u32_get_bits(info->u.hdr.w0, RTW89_C2HREG_HDR_LEN_MASK) << 2) - in rtw89_fw_read_c2h_reg()
3736 fw_info->c2h_counter++; in rtw89_fw_read_c2h_reg()
3737 rtw89_write8_mask(rtwdev, chip->c2h_counter_reg.addr, in rtw89_fw_read_c2h_reg()
3738 chip->c2h_counter_reg.mask, fw_info->c2h_counter); in rtw89_fw_read_c2h_reg()
3749 if (h2c_info && h2c_info->id != RTW89_FWCMD_H2CREG_FUNC_GET_FEATURE) in rtw89_fw_msg_reg()
3750 lockdep_assert_held(&rtwdev->mutex); in rtw89_fw_msg_reg()
3753 return -EINVAL; in rtw89_fw_msg_reg()
3775 if (!test_bit(RTW89_FLAG_POWERON, rtwdev->flags)) { in rtw89_fw_st_dbg_dump()
3794 struct list_head *pkt_list = rtwdev->scan_info.pkt_list; in rtw89_release_pkt_list()
3799 if (!(rtwdev->chip->support_bands & BIT(idx))) in rtw89_release_pkt_list()
3803 if (test_bit(info->id, rtwdev->pkt_offload)) in rtw89_release_pkt_list()
3804 rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id); in rtw89_release_pkt_list()
3805 list_del(&info->list); in rtw89_release_pkt_list()
3816 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw89_is_6ghz_wildcard_probe_req()
3821 if (req->ssids[ssid_idx].ssid_len) { in rtw89_is_6ghz_wildcard_probe_req()
3822 memcpy(info->ssid, req->ssids[ssid_idx].ssid, in rtw89_is_6ghz_wildcard_probe_req()
3823 req->ssids[ssid_idx].ssid_len); in rtw89_is_6ghz_wildcard_probe_req()
3824 info->ssid_len = req->ssids[ssid_idx].ssid_len; in rtw89_is_6ghz_wildcard_probe_req()
3835 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw89_append_probe_req_ie()
3836 struct ieee80211_scan_ies *ies = rtwvif->scan_ies; in rtw89_append_probe_req_ie()
3843 if (!(rtwdev->chip->support_bands & BIT(band))) in rtw89_append_probe_req_ie()
3848 ret = -ENOMEM; in rtw89_append_probe_req_ie()
3851 skb_put_data(new, ies->ies[band], ies->len[band]); in rtw89_append_probe_req_ie()
3852 skb_put_data(new, ies->common_ies, ies->common_ie_len); in rtw89_append_probe_req_ie()
3856 ret = -ENOMEM; in rtw89_append_probe_req_ie()
3868 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, new); in rtw89_append_probe_req_ie()
3875 list_add_tail(&info->list, &scan_info->pkt_list[band]); in rtw89_append_probe_req_ie()
3885 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw89_hw_scan_update_probe_req()
3887 u8 num = req->n_ssids, i; in rtw89_hw_scan_update_probe_req()
3891 skb = ieee80211_probereq_get(rtwdev->hw, rtwvif->mac_addr, in rtw89_hw_scan_update_probe_req()
3892 req->ssids[i].ssid, in rtw89_hw_scan_update_probe_req()
3893 req->ssids[i].ssid_len, in rtw89_hw_scan_update_probe_req()
3894 req->ie_len); in rtw89_hw_scan_update_probe_req()
3896 return -ENOMEM; in rtw89_hw_scan_update_probe_req()
3912 struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif; in rtw89_update_6ghz_rnr_chan()
3913 struct list_head *pkt_list = rtwdev->scan_info.pkt_list; in rtw89_update_6ghz_rnr_chan()
3915 struct ieee80211_scan_ies *ies = rtwvif->scan_ies; in rtw89_update_6ghz_rnr_chan()
3924 if (!req->n_6ghz_params) in rtw89_update_6ghz_rnr_chan()
3927 for (i = 0; i < req->n_6ghz_params; i++) { in rtw89_update_6ghz_rnr_chan()
3928 params = &req->scan_6ghz_params[i]; in rtw89_update_6ghz_rnr_chan()
3930 if (req->channels[params->channel_idx]->hw_value != in rtw89_update_6ghz_rnr_chan()
3931 ch_info->pri_ch) in rtw89_update_6ghz_rnr_chan()
3936 if (ether_addr_equal(tmp->bssid, params->bssid)) { in rtw89_update_6ghz_rnr_chan()
3944 skb = ieee80211_probereq_get(rtwdev->hw, rtwvif->mac_addr, in rtw89_update_6ghz_rnr_chan()
3945 NULL, 0, req->ie_len); in rtw89_update_6ghz_rnr_chan()
3946 skb_put_data(skb, ies->ies[NL80211_BAND_6GHZ], ies->len[NL80211_BAND_6GHZ]); in rtw89_update_6ghz_rnr_chan()
3947 skb_put_data(skb, ies->common_ies, ies->common_ie_len); in rtw89_update_6ghz_rnr_chan()
3948 hdr = (struct ieee80211_hdr *)skb->data; in rtw89_update_6ghz_rnr_chan()
3949 ether_addr_copy(hdr->addr3, params->bssid); in rtw89_update_6ghz_rnr_chan()
3953 ret = -ENOMEM; in rtw89_update_6ghz_rnr_chan()
3958 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb); in rtw89_update_6ghz_rnr_chan()
3965 ether_addr_copy(info->bssid, params->bssid); in rtw89_update_6ghz_rnr_chan()
3966 info->channel_6ghz = req->channels[params->channel_idx]->hw_value; in rtw89_update_6ghz_rnr_chan()
3967 list_add_tail(&info->list, &rtwdev->scan_info.pkt_list[NL80211_BAND_6GHZ]); in rtw89_update_6ghz_rnr_chan()
3969 ch_info->tx_pkt = true; in rtw89_update_6ghz_rnr_chan()
3970 ch_info->period = RTW89_CHANNEL_TIME_6G + RTW89_DWELL_TIME_6G; in rtw89_update_6ghz_rnr_chan()
3983 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw89_hw_scan_add_chan()
3984 struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif; in rtw89_hw_scan_add_chan()
3985 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; in rtw89_hw_scan_add_chan()
3986 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw89_hw_scan_add_chan()
3987 struct rtw89_chan *op = &rtwdev->scan_info.op_chan; in rtw89_hw_scan_add_chan()
3992 ch_info->notify_action = RTW89_SCANOFLD_DEBUG_MASK; in rtw89_hw_scan_add_chan()
3993 ch_info->dfs_ch = chan_type == RTW89_CHAN_DFS; in rtw89_hw_scan_add_chan()
3994 ch_info->bw = RTW89_SCAN_WIDTH; in rtw89_hw_scan_add_chan()
3995 ch_info->tx_pkt = true; in rtw89_hw_scan_add_chan()
3996 ch_info->cfg_tx_pwr = false; in rtw89_hw_scan_add_chan()
3997 ch_info->tx_pwr_idx = 0; in rtw89_hw_scan_add_chan()
3998 ch_info->tx_null = false; in rtw89_hw_scan_add_chan()
3999 ch_info->pause_data = false; in rtw89_hw_scan_add_chan()
4000 ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE; in rtw89_hw_scan_add_chan()
4002 if (ch_info->ch_band == RTW89_BAND_6G) { in rtw89_hw_scan_add_chan()
4003 if ((ssid_num == 1 && req->ssids[0].ssid_len == 0) || in rtw89_hw_scan_add_chan()
4004 !ch_info->is_psc) { in rtw89_hw_scan_add_chan()
4005 ch_info->tx_pkt = false; in rtw89_hw_scan_add_chan()
4006 if (!req->duration_mandatory) in rtw89_hw_scan_add_chan()
4007 ch_info->period -= RTW89_DWELL_TIME_6G; in rtw89_hw_scan_add_chan()
4016 band = rtw89_hw_to_nl80211_band(ch_info->ch_band); in rtw89_hw_scan_add_chan()
4018 list_for_each_entry(info, &scan_info->pkt_list[band], list) { in rtw89_hw_scan_add_chan()
4019 if (info->channel_6ghz && in rtw89_hw_scan_add_chan()
4020 ch_info->pri_ch != info->channel_6ghz) in rtw89_hw_scan_add_chan()
4022 else if (info->channel_6ghz && probe_count != 0) in rtw89_hw_scan_add_chan()
4023 ch_info->period += RTW89_CHANNEL_TIME_6G; in rtw89_hw_scan_add_chan()
4024 ch_info->pkt_id[probe_count++] = info->id; in rtw89_hw_scan_add_chan()
4028 ch_info->num_pkt = probe_count; in rtw89_hw_scan_add_chan()
4033 ch_info->central_ch = op->channel; in rtw89_hw_scan_add_chan()
4034 ch_info->pri_ch = op->primary_channel; in rtw89_hw_scan_add_chan()
4035 ch_info->ch_band = op->band_type; in rtw89_hw_scan_add_chan()
4036 ch_info->bw = op->band_width; in rtw89_hw_scan_add_chan()
4037 ch_info->tx_null = true; in rtw89_hw_scan_add_chan()
4038 ch_info->num_pkt = 0; in rtw89_hw_scan_add_chan()
4041 if (ch_info->ch_band != RTW89_BAND_6G) in rtw89_hw_scan_add_chan()
4042 ch_info->period = max_t(u8, ch_info->period, in rtw89_hw_scan_add_chan()
4044 ch_info->dwell_time = RTW89_DWELL_TIME; in rtw89_hw_scan_add_chan()
4056 struct cfg80211_scan_request *req = rtwvif->scan_req; in rtw89_hw_scan_add_chan_list()
4060 bool random_seq = req->flags & NL80211_SCAN_FLAG_RANDOM_SN; in rtw89_hw_scan_add_chan_list()
4067 for (idx = rtwdev->scan_info.last_chan_idx, list_len = 0; in rtw89_hw_scan_add_chan_list()
4068 idx < req->n_channels && list_len < RTW89_SCAN_LIST_LIMIT; in rtw89_hw_scan_add_chan_list()
4070 channel = req->channels[idx]; in rtw89_hw_scan_add_chan_list()
4073 ret = -ENOMEM; in rtw89_hw_scan_add_chan_list()
4077 if (req->duration_mandatory) in rtw89_hw_scan_add_chan_list()
4078 ch_info->period = req->duration; in rtw89_hw_scan_add_chan_list()
4079 else if (channel->band == NL80211_BAND_6GHZ) in rtw89_hw_scan_add_chan_list()
4080 ch_info->period = RTW89_CHANNEL_TIME_6G + in rtw89_hw_scan_add_chan_list()
4083 ch_info->period = RTW89_CHANNEL_TIME; in rtw89_hw_scan_add_chan_list()
4085 ch_info->ch_band = rtw89_nl80211_to_hw_band(channel->band); in rtw89_hw_scan_add_chan_list()
4086 ch_info->central_ch = channel->hw_value; in rtw89_hw_scan_add_chan_list()
4087 ch_info->pri_ch = channel->hw_value; in rtw89_hw_scan_add_chan_list()
4088 ch_info->rand_seq_num = random_seq; in rtw89_hw_scan_add_chan_list()
4089 ch_info->is_psc = cfg80211_channel_is_psc(channel); in rtw89_hw_scan_add_chan_list()
4091 if (channel->flags & in rtw89_hw_scan_add_chan_list()
4096 rtw89_hw_scan_add_chan(rtwdev, type, req->n_ssids, ch_info); in rtw89_hw_scan_add_chan_list()
4099 off_chan_time + ch_info->period > RTW89_OFF_CHAN_TIME) { in rtw89_hw_scan_add_chan_list()
4102 ret = -ENOMEM; in rtw89_hw_scan_add_chan_list()
4108 tmp->period = req->duration_mandatory ? in rtw89_hw_scan_add_chan_list()
4109 req->duration : RTW89_CHANNEL_TIME; in rtw89_hw_scan_add_chan_list()
4111 list_add_tail(&tmp->list, &chan_list); in rtw89_hw_scan_add_chan_list()
4115 list_add_tail(&ch_info->list, &chan_list); in rtw89_hw_scan_add_chan_list()
4116 off_chan_time += ch_info->period; in rtw89_hw_scan_add_chan_list()
4118 rtwdev->scan_info.last_chan_idx = idx; in rtw89_hw_scan_add_chan_list()
4123 list_del(&ch_info->list); in rtw89_hw_scan_add_chan_list()
4148 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; in rtw89_hw_scan_start()
4149 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_hw_scan_start()
4150 struct cfg80211_scan_request *req = &scan_req->req; in rtw89_hw_scan_start()
4151 u32 rx_fltr = rtwdev->hal.rx_fltr; in rtw89_hw_scan_start()
4154 rtw89_get_channel(rtwdev, rtwvif, &rtwdev->scan_info.op_chan); in rtw89_hw_scan_start()
4155 rtwdev->scan_info.scanning_vif = vif; in rtw89_hw_scan_start()
4156 rtwdev->scan_info.last_chan_idx = 0; in rtw89_hw_scan_start()
4157 rtwvif->scan_ies = &scan_req->ies; in rtw89_hw_scan_start()
4158 rtwvif->scan_req = req; in rtw89_hw_scan_start()
4159 ieee80211_stop_queues(rtwdev->hw); in rtw89_hw_scan_start()
4161 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) in rtw89_hw_scan_start()
4162 get_random_mask_addr(mac_addr, req->mac_addr, in rtw89_hw_scan_start()
4163 req->mac_addr_mask); in rtw89_hw_scan_start()
4165 ether_addr_copy(mac_addr, vif->addr); in rtw89_hw_scan_start()
4172 rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), in rtw89_hw_scan_start()
4182 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; in rtw89_hw_scan_complete()
4183 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info; in rtw89_hw_scan_complete()
4193 rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), in rtw89_hw_scan_complete()
4195 rtwdev->hal.rx_fltr); in rtw89_hw_scan_complete()
4198 ieee80211_scan_completed(rtwdev->hw, &info); in rtw89_hw_scan_complete()
4199 ieee80211_wake_queues(rtwdev->hw); in rtw89_hw_scan_complete()
4203 rtwvif = (struct rtw89_vif *)vif->drv_priv; in rtw89_hw_scan_complete()
4204 rtwvif->scan_req = NULL; in rtw89_hw_scan_complete()
4205 rtwvif->scan_ies = NULL; in rtw89_hw_scan_complete()
4206 scan_info->last_chan_idx = 0; in rtw89_hw_scan_complete()
4207 scan_info->scanning_vif = NULL; in rtw89_hw_scan_complete()
4224 if (!is_zero_ether_addr(rtwvif->bssid)) in rtw89_is_any_vif_connected_or_connecting()
4239 rtwvif = vif ? (struct rtw89_vif *)vif->drv_priv : NULL; in rtw89_hw_scan_offload()
4241 return -EINVAL; in rtw89_hw_scan_offload()
4267 return -ENOMEM; in rtw89_fw_h2c_trigger_cpu_exception()
4271 RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(skb->data, in rtw89_fw_h2c_trigger_cpu_exception()
4304 return -ENOMEM; in rtw89_fw_h2c_pkt_drop()
4307 switch (params->sel) { in rtw89_fw_h2c_pkt_drop()
4317 params->sel); in rtw89_fw_h2c_pkt_drop()
4322 RTW89_SET_FWCMD_PKT_DROP_SEL(skb->data, params->sel); in rtw89_fw_h2c_pkt_drop()
4323 RTW89_SET_FWCMD_PKT_DROP_MACID(skb->data, params->macid); in rtw89_fw_h2c_pkt_drop()
4324 RTW89_SET_FWCMD_PKT_DROP_BAND(skb->data, params->mac_band); in rtw89_fw_h2c_pkt_drop()
4325 RTW89_SET_FWCMD_PKT_DROP_PORT(skb->data, params->port); in rtw89_fw_h2c_pkt_drop()
4326 RTW89_SET_FWCMD_PKT_DROP_MBSSID(skb->data, params->mbssid); in rtw89_fw_h2c_pkt_drop()
4327 RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(skb->data, params->tf_trs); in rtw89_fw_h2c_pkt_drop()
4328 RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(skb->data, in rtw89_fw_h2c_pkt_drop()
4329 params->macid_band_sel[0]); in rtw89_fw_h2c_pkt_drop()
4330 RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(skb->data, in rtw89_fw_h2c_pkt_drop()
4331 params->macid_band_sel[1]); in rtw89_fw_h2c_pkt_drop()
4332 RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(skb->data, in rtw89_fw_h2c_pkt_drop()
4333 params->macid_band_sel[2]); in rtw89_fw_h2c_pkt_drop()
4334 RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(skb->data, in rtw89_fw_h2c_pkt_drop()
4335 params->macid_band_sel[3]); in rtw89_fw_h2c_pkt_drop()
4369 return -EPERM; in rtw89_fw_h2c_keep_alive()
4375 return -ENOMEM; in rtw89_fw_h2c_keep_alive()
4380 RTW89_SET_KEEP_ALIVE_ENABLE(skb->data, enable); in rtw89_fw_h2c_keep_alive()
4381 RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(skb->data, pkt_id); in rtw89_fw_h2c_keep_alive()
4382 RTW89_SET_KEEP_ALIVE_PERIOD(skb->data, 5); in rtw89_fw_h2c_keep_alive()
4383 RTW89_SET_KEEP_ALIVE_MACID(skb->data, rtwvif->mac_id); in rtw89_fw_h2c_keep_alive()
4409 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_fw_h2c_disconnect_detect()
4411 u8 macid = rtwvif->mac_id; in rtw89_fw_h2c_disconnect_detect()
4417 return -ENOMEM; in rtw89_fw_h2c_disconnect_detect()
4422 if (test_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) { in rtw89_fw_h2c_disconnect_detect()
4423 RTW89_SET_DISCONNECT_DETECT_ENABLE(skb->data, enable); in rtw89_fw_h2c_disconnect_detect()
4424 RTW89_SET_DISCONNECT_DETECT_DISCONNECT(skb->data, !enable); in rtw89_fw_h2c_disconnect_detect()
4425 RTW89_SET_DISCONNECT_DETECT_MAC_ID(skb->data, macid); in rtw89_fw_h2c_disconnect_detect()
4426 RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(skb->data, 100); in rtw89_fw_h2c_disconnect_detect()
4427 RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(skb->data, 5); in rtw89_fw_h2c_disconnect_detect()
4455 u8 macid = rtwvif->mac_id; in rtw89_fw_h2c_wow_global()
4461 return -ENOMEM; in rtw89_fw_h2c_wow_global()
4466 RTW89_SET_WOW_GLOBAL_ENABLE(skb->data, enable); in rtw89_fw_h2c_wow_global()
4467 RTW89_SET_WOW_GLOBAL_MAC_ID(skb->data, macid); in rtw89_fw_h2c_wow_global()
4494 struct rtw89_wow_param *rtw_wow = &rtwdev->wow; in rtw89_fw_h2c_wow_wakeup_ctrl()
4496 u8 macid = rtwvif->mac_id; in rtw89_fw_h2c_wow_wakeup_ctrl()
4502 return -ENOMEM; in rtw89_fw_h2c_wow_wakeup_ctrl()
4507 if (rtw_wow->pattern_cnt) in rtw89_fw_h2c_wow_wakeup_ctrl()
4508 RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(skb->data, enable); in rtw89_fw_h2c_wow_wakeup_ctrl()
4509 if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) in rtw89_fw_h2c_wow_wakeup_ctrl()
4510 RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(skb->data, enable); in rtw89_fw_h2c_wow_wakeup_ctrl()
4511 if (test_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) in rtw89_fw_h2c_wow_wakeup_ctrl()
4512 RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(skb->data, enable); in rtw89_fw_h2c_wow_wakeup_ctrl()
4514 RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(skb->data, macid); in rtw89_fw_h2c_wow_wakeup_ctrl()
4546 return -ENOMEM; in rtw89_fw_wow_cam_update()
4551 RTW89_SET_WOW_CAM_UPD_R_W(skb->data, cam_info->r_w); in rtw89_fw_wow_cam_update()
4552 RTW89_SET_WOW_CAM_UPD_IDX(skb->data, cam_info->idx); in rtw89_fw_wow_cam_update()
4553 if (cam_info->valid) { in rtw89_fw_wow_cam_update()
4554 RTW89_SET_WOW_CAM_UPD_WKFM1(skb->data, cam_info->mask[0]); in rtw89_fw_wow_cam_update()
4555 RTW89_SET_WOW_CAM_UPD_WKFM2(skb->data, cam_info->mask[1]); in rtw89_fw_wow_cam_update()
4556 RTW89_SET_WOW_CAM_UPD_WKFM3(skb->data, cam_info->mask[2]); in rtw89_fw_wow_cam_update()
4557 RTW89_SET_WOW_CAM_UPD_WKFM4(skb->data, cam_info->mask[3]); in rtw89_fw_wow_cam_update()
4558 RTW89_SET_WOW_CAM_UPD_CRC(skb->data, cam_info->crc); in rtw89_fw_wow_cam_update()
4559 RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(skb->data, in rtw89_fw_wow_cam_update()
4560 cam_info->negative_pattern_match); in rtw89_fw_wow_cam_update()
4561 RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(skb->data, in rtw89_fw_wow_cam_update()
4562 cam_info->skip_mac_hdr); in rtw89_fw_wow_cam_update()
4563 RTW89_SET_WOW_CAM_UPD_UC(skb->data, cam_info->uc); in rtw89_fw_wow_cam_update()
4564 RTW89_SET_WOW_CAM_UPD_MC(skb->data, cam_info->mc); in rtw89_fw_wow_cam_update()
4565 RTW89_SET_WOW_CAM_UPD_BC(skb->data, cam_info->bc); in rtw89_fw_wow_cam_update()
4567 RTW89_SET_WOW_CAM_UPD_VALID(skb->data, cam_info->valid); in rtw89_fw_wow_cam_update()
4602 return -EBUSY; in rtw89_h2c_tx_and_wait()
4605 if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags)) in rtw89_h2c_tx_and_wait()
4615 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_add_mcc()
4623 return -ENOMEM; in rtw89_fw_h2c_add_mcc()
4627 RTW89_SET_FWCMD_ADD_MCC_MACID(skb->data, p->macid); in rtw89_fw_h2c_add_mcc()
4628 RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG0(skb->data, p->central_ch_seg0); in rtw89_fw_h2c_add_mcc()
4629 RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG1(skb->data, p->central_ch_seg1); in rtw89_fw_h2c_add_mcc()
4630 RTW89_SET_FWCMD_ADD_MCC_PRIMARY_CH(skb->data, p->primary_ch); in rtw89_fw_h2c_add_mcc()
4631 RTW89_SET_FWCMD_ADD_MCC_BANDWIDTH(skb->data, p->bandwidth); in rtw89_fw_h2c_add_mcc()
4632 RTW89_SET_FWCMD_ADD_MCC_GROUP(skb->data, p->group); in rtw89_fw_h2c_add_mcc()
4633 RTW89_SET_FWCMD_ADD_MCC_C2H_RPT(skb->data, p->c2h_rpt); in rtw89_fw_h2c_add_mcc()
4634 RTW89_SET_FWCMD_ADD_MCC_DIS_TX_NULL(skb->data, p->dis_tx_null); in rtw89_fw_h2c_add_mcc()
4635 RTW89_SET_FWCMD_ADD_MCC_DIS_SW_RETRY(skb->data, p->dis_sw_retry); in rtw89_fw_h2c_add_mcc()
4636 RTW89_SET_FWCMD_ADD_MCC_IN_CURR_CH(skb->data, p->in_curr_ch); in rtw89_fw_h2c_add_mcc()
4637 RTW89_SET_FWCMD_ADD_MCC_SW_RETRY_COUNT(skb->data, p->sw_retry_count); in rtw89_fw_h2c_add_mcc()
4638 RTW89_SET_FWCMD_ADD_MCC_TX_NULL_EARLY(skb->data, p->tx_null_early); in rtw89_fw_h2c_add_mcc()
4639 RTW89_SET_FWCMD_ADD_MCC_BTC_IN_2G(skb->data, p->btc_in_2g); in rtw89_fw_h2c_add_mcc()
4640 RTW89_SET_FWCMD_ADD_MCC_PTA_EN(skb->data, p->pta_en); in rtw89_fw_h2c_add_mcc()
4641 RTW89_SET_FWCMD_ADD_MCC_RFK_BY_PASS(skb->data, p->rfk_by_pass); in rtw89_fw_h2c_add_mcc()
4642 RTW89_SET_FWCMD_ADD_MCC_CH_BAND_TYPE(skb->data, p->ch_band_type); in rtw89_fw_h2c_add_mcc()
4643 RTW89_SET_FWCMD_ADD_MCC_DURATION(skb->data, p->duration); in rtw89_fw_h2c_add_mcc()
4644 RTW89_SET_FWCMD_ADD_MCC_COURTESY_EN(skb->data, p->courtesy_en); in rtw89_fw_h2c_add_mcc()
4645 RTW89_SET_FWCMD_ADD_MCC_COURTESY_NUM(skb->data, p->courtesy_num); in rtw89_fw_h2c_add_mcc()
4646 RTW89_SET_FWCMD_ADD_MCC_COURTESY_TARGET(skb->data, p->courtesy_target); in rtw89_fw_h2c_add_mcc()
4654 cond = RTW89_MCC_WAIT_COND(p->group, H2C_FUNC_ADD_MCC); in rtw89_fw_h2c_add_mcc()
4662 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_start_mcc()
4670 return -ENOMEM; in rtw89_fw_h2c_start_mcc()
4674 RTW89_SET_FWCMD_START_MCC_GROUP(skb->data, p->group); in rtw89_fw_h2c_start_mcc()
4675 RTW89_SET_FWCMD_START_MCC_BTC_IN_GROUP(skb->data, p->btc_in_group); in rtw89_fw_h2c_start_mcc()
4676 RTW89_SET_FWCMD_START_MCC_OLD_GROUP_ACTION(skb->data, p->old_group_action); in rtw89_fw_h2c_start_mcc()
4677 RTW89_SET_FWCMD_START_MCC_OLD_GROUP(skb->data, p->old_group); in rtw89_fw_h2c_start_mcc()
4678 RTW89_SET_FWCMD_START_MCC_NOTIFY_CNT(skb->data, p->notify_cnt); in rtw89_fw_h2c_start_mcc()
4679 RTW89_SET_FWCMD_START_MCC_NOTIFY_RXDBG_EN(skb->data, p->notify_rxdbg_en); in rtw89_fw_h2c_start_mcc()
4680 RTW89_SET_FWCMD_START_MCC_MACID(skb->data, p->macid); in rtw89_fw_h2c_start_mcc()
4681 RTW89_SET_FWCMD_START_MCC_TSF_LOW(skb->data, p->tsf_low); in rtw89_fw_h2c_start_mcc()
4682 RTW89_SET_FWCMD_START_MCC_TSF_HIGH(skb->data, p->tsf_high); in rtw89_fw_h2c_start_mcc()
4690 cond = RTW89_MCC_WAIT_COND(p->group, H2C_FUNC_START_MCC); in rtw89_fw_h2c_start_mcc()
4698 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_stop_mcc()
4706 return -ENOMEM; in rtw89_fw_h2c_stop_mcc()
4710 RTW89_SET_FWCMD_STOP_MCC_MACID(skb->data, macid); in rtw89_fw_h2c_stop_mcc()
4711 RTW89_SET_FWCMD_STOP_MCC_GROUP(skb->data, group); in rtw89_fw_h2c_stop_mcc()
4712 RTW89_SET_FWCMD_STOP_MCC_PREV_GROUPS(skb->data, prev_groups); in rtw89_fw_h2c_stop_mcc()
4728 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_del_mcc_group()
4736 return -ENOMEM; in rtw89_fw_h2c_del_mcc_group()
4740 RTW89_SET_FWCMD_DEL_MCC_GROUP_GROUP(skb->data, group); in rtw89_fw_h2c_del_mcc_group()
4741 RTW89_SET_FWCMD_DEL_MCC_GROUP_PREV_GROUPS(skb->data, prev_groups); in rtw89_fw_h2c_del_mcc_group()
4756 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_reset_mcc_group()
4764 return -ENOMEM; in rtw89_fw_h2c_reset_mcc_group()
4768 RTW89_SET_FWCMD_RESET_MCC_GROUP_GROUP(skb->data, group); in rtw89_fw_h2c_reset_mcc_group()
4785 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_mcc_req_tsf()
4795 return -ENOMEM; in rtw89_fw_h2c_mcc_req_tsf()
4799 RTW89_SET_FWCMD_MCC_REQ_TSF_GROUP(skb->data, req->group); in rtw89_fw_h2c_mcc_req_tsf()
4800 RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_X(skb->data, req->macid_x); in rtw89_fw_h2c_mcc_req_tsf()
4801 RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_Y(skb->data, req->macid_y); in rtw89_fw_h2c_mcc_req_tsf()
4809 cond = RTW89_MCC_WAIT_COND(req->group, H2C_FUNC_MCC_REQ_TSF); in rtw89_fw_h2c_mcc_req_tsf()
4814 tmp = (struct rtw89_mac_mcc_tsf_rpt *)wait->data.buf; in rtw89_fw_h2c_mcc_req_tsf()
4824 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_mcc_macid_bitmap()
4837 return -ENOMEM; in rtw89_fw_h2c_mcc_macid_bitmap()
4841 RTW89_SET_FWCMD_MCC_MACID_BITMAP_GROUP(skb->data, group); in rtw89_fw_h2c_mcc_macid_bitmap()
4842 RTW89_SET_FWCMD_MCC_MACID_BITMAP_MACID(skb->data, macid); in rtw89_fw_h2c_mcc_macid_bitmap()
4843 RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP_LENGTH(skb->data, map_len); in rtw89_fw_h2c_mcc_macid_bitmap()
4844 RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP(skb->data, bitmap, map_len); in rtw89_fw_h2c_mcc_macid_bitmap()
4860 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_mcc_sync()
4868 return -ENOMEM; in rtw89_fw_h2c_mcc_sync()
4872 RTW89_SET_FWCMD_MCC_SYNC_GROUP(skb->data, group); in rtw89_fw_h2c_mcc_sync()
4873 RTW89_SET_FWCMD_MCC_SYNC_MACID_SOURCE(skb->data, source); in rtw89_fw_h2c_mcc_sync()
4874 RTW89_SET_FWCMD_MCC_SYNC_MACID_TARGET(skb->data, target); in rtw89_fw_h2c_mcc_sync()
4875 RTW89_SET_FWCMD_MCC_SYNC_SYNC_OFFSET(skb->data, offset); in rtw89_fw_h2c_mcc_sync()
4891 struct rtw89_wait_info *wait = &rtwdev->mcc.wait; in rtw89_fw_h2c_mcc_set_duration()
4899 return -ENOMEM; in rtw89_fw_h2c_mcc_set_duration()
4903 RTW89_SET_FWCMD_MCC_SET_DURATION_GROUP(skb->data, p->group); in rtw89_fw_h2c_mcc_set_duration()
4904 RTW89_SET_FWCMD_MCC_SET_DURATION_BTC_IN_GROUP(skb->data, p->btc_in_group); in rtw89_fw_h2c_mcc_set_duration()
4905 RTW89_SET_FWCMD_MCC_SET_DURATION_START_MACID(skb->data, p->start_macid); in rtw89_fw_h2c_mcc_set_duration()
4906 RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_X(skb->data, p->macid_x); in rtw89_fw_h2c_mcc_set_duration()
4907 RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_Y(skb->data, p->macid_y); in rtw89_fw_h2c_mcc_set_duration()
4908 RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_LOW(skb->data, in rtw89_fw_h2c_mcc_set_duration()
4909 p->start_tsf_low); in rtw89_fw_h2c_mcc_set_duration()
4910 RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_HIGH(skb->data, in rtw89_fw_h2c_mcc_set_duration()
4911 p->start_tsf_high); in rtw89_fw_h2c_mcc_set_duration()
4912 RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_X(skb->data, p->duration_x); in rtw89_fw_h2c_mcc_set_duration()
4913 RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_Y(skb->data, p->duration_y); in rtw89_fw_h2c_mcc_set_duration()
4921 cond = RTW89_MCC_WAIT_COND(p->group, H2C_FUNC_MCC_SET_DURATION); in rtw89_fw_h2c_mcc_set_duration()
4940 (ent_sz) - __var_sz);\
4949 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_byrate_entry_valid()
4952 if (e->band >= RTW89_BAND_NUM || e->bw >= RTW89_BYR_BW_NUM) in fw_txpwr_byrate_entry_valid()
4955 switch (e->rs) { in fw_txpwr_byrate_entry_valid()
4957 if (e->shf + e->len > RTW89_RATE_CCK_NUM) in fw_txpwr_byrate_entry_valid()
4961 if (e->shf + e->len > RTW89_RATE_OFDM_NUM) in fw_txpwr_byrate_entry_valid()
4965 if (e->shf + e->len > __RTW89_RATE_MCS_NUM || in fw_txpwr_byrate_entry_valid()
4966 e->nss >= RTW89_NSS_NUM || in fw_txpwr_byrate_entry_valid()
4967 e->ofdma >= RTW89_OFDMA_NUM) in fw_txpwr_byrate_entry_valid()
4971 if (e->shf + e->len > RTW89_RATE_HEDCM_NUM || in fw_txpwr_byrate_entry_valid()
4972 e->nss >= RTW89_NSS_HEDCM_NUM || in fw_txpwr_byrate_entry_valid()
4973 e->ofdma >= RTW89_OFDMA_NUM) in fw_txpwr_byrate_entry_valid()
4977 if (e->shf + e->len > __RTW89_RATE_OFFSET_NUM) in fw_txpwr_byrate_entry_valid()
4991 const struct rtw89_txpwr_conf *conf = tbl->data; in rtw89_fw_load_txpwr_byrate()
5004 byr_head = &rtwdev->byr[entry.band][entry.bw]; in rtw89_fw_load_txpwr_byrate()
5023 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_lmt_2ghz_entry_valid()
5026 if (e->bw >= RTW89_2G_BW_NUM) in fw_txpwr_lmt_2ghz_entry_valid()
5028 if (e->nt >= RTW89_NTX_NUM) in fw_txpwr_lmt_2ghz_entry_valid()
5030 if (e->rs >= RTW89_RS_LMT_NUM) in fw_txpwr_lmt_2ghz_entry_valid()
5032 if (e->bf >= RTW89_BF_NUM) in fw_txpwr_lmt_2ghz_entry_valid()
5034 if (e->regd >= RTW89_REGD_NUM) in fw_txpwr_lmt_2ghz_entry_valid()
5036 if (e->ch_idx >= RTW89_2G_CH_NUM) in fw_txpwr_lmt_2ghz_entry_valid()
5045 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_txpwr_lmt_2ghz()
5053 data->v[entry.bw][entry.nt][entry.rs][entry.bf][entry.regd] in rtw89_fw_load_txpwr_lmt_2ghz()
5063 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_lmt_5ghz_entry_valid()
5066 if (e->bw >= RTW89_5G_BW_NUM) in fw_txpwr_lmt_5ghz_entry_valid()
5068 if (e->nt >= RTW89_NTX_NUM) in fw_txpwr_lmt_5ghz_entry_valid()
5070 if (e->rs >= RTW89_RS_LMT_NUM) in fw_txpwr_lmt_5ghz_entry_valid()
5072 if (e->bf >= RTW89_BF_NUM) in fw_txpwr_lmt_5ghz_entry_valid()
5074 if (e->regd >= RTW89_REGD_NUM) in fw_txpwr_lmt_5ghz_entry_valid()
5076 if (e->ch_idx >= RTW89_5G_CH_NUM) in fw_txpwr_lmt_5ghz_entry_valid()
5085 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_txpwr_lmt_5ghz()
5093 data->v[entry.bw][entry.nt][entry.rs][entry.bf][entry.regd] in rtw89_fw_load_txpwr_lmt_5ghz()
5103 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_lmt_6ghz_entry_valid()
5106 if (e->bw >= RTW89_6G_BW_NUM) in fw_txpwr_lmt_6ghz_entry_valid()
5108 if (e->nt >= RTW89_NTX_NUM) in fw_txpwr_lmt_6ghz_entry_valid()
5110 if (e->rs >= RTW89_RS_LMT_NUM) in fw_txpwr_lmt_6ghz_entry_valid()
5112 if (e->bf >= RTW89_BF_NUM) in fw_txpwr_lmt_6ghz_entry_valid()
5114 if (e->regd >= RTW89_REGD_NUM) in fw_txpwr_lmt_6ghz_entry_valid()
5116 if (e->reg_6ghz_power >= NUM_OF_RTW89_REG_6GHZ_POWER) in fw_txpwr_lmt_6ghz_entry_valid()
5118 if (e->ch_idx >= RTW89_6G_CH_NUM) in fw_txpwr_lmt_6ghz_entry_valid()
5127 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_txpwr_lmt_6ghz()
5135 data->v[entry.bw][entry.nt][entry.rs][entry.bf][entry.regd] in rtw89_fw_load_txpwr_lmt_6ghz()
5145 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_lmt_ru_2ghz_entry_valid()
5148 if (e->ru >= RTW89_RU_NUM) in fw_txpwr_lmt_ru_2ghz_entry_valid()
5150 if (e->nt >= RTW89_NTX_NUM) in fw_txpwr_lmt_ru_2ghz_entry_valid()
5152 if (e->regd >= RTW89_REGD_NUM) in fw_txpwr_lmt_ru_2ghz_entry_valid()
5154 if (e->ch_idx >= RTW89_2G_CH_NUM) in fw_txpwr_lmt_ru_2ghz_entry_valid()
5163 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_txpwr_lmt_ru_2ghz()
5171 data->v[entry.ru][entry.nt][entry.regd][entry.ch_idx] = entry.v; in rtw89_fw_load_txpwr_lmt_ru_2ghz()
5180 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_lmt_ru_5ghz_entry_valid()
5183 if (e->ru >= RTW89_RU_NUM) in fw_txpwr_lmt_ru_5ghz_entry_valid()
5185 if (e->nt >= RTW89_NTX_NUM) in fw_txpwr_lmt_ru_5ghz_entry_valid()
5187 if (e->regd >= RTW89_REGD_NUM) in fw_txpwr_lmt_ru_5ghz_entry_valid()
5189 if (e->ch_idx >= RTW89_5G_CH_NUM) in fw_txpwr_lmt_ru_5ghz_entry_valid()
5198 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_txpwr_lmt_ru_5ghz()
5206 data->v[entry.ru][entry.nt][entry.regd][entry.ch_idx] = entry.v; in rtw89_fw_load_txpwr_lmt_ru_5ghz()
5215 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_txpwr_lmt_ru_6ghz_entry_valid()
5218 if (e->ru >= RTW89_RU_NUM) in fw_txpwr_lmt_ru_6ghz_entry_valid()
5220 if (e->nt >= RTW89_NTX_NUM) in fw_txpwr_lmt_ru_6ghz_entry_valid()
5222 if (e->regd >= RTW89_REGD_NUM) in fw_txpwr_lmt_ru_6ghz_entry_valid()
5224 if (e->reg_6ghz_power >= NUM_OF_RTW89_REG_6GHZ_POWER) in fw_txpwr_lmt_ru_6ghz_entry_valid()
5226 if (e->ch_idx >= RTW89_6G_CH_NUM) in fw_txpwr_lmt_ru_6ghz_entry_valid()
5235 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_txpwr_lmt_ru_6ghz()
5243 data->v[entry.ru][entry.nt][entry.regd][entry.reg_6ghz_power] in rtw89_fw_load_txpwr_lmt_ru_6ghz()
5253 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_tx_shape_lmt_entry_valid()
5256 if (e->band >= RTW89_BAND_NUM) in fw_tx_shape_lmt_entry_valid()
5258 if (e->tx_shape_rs >= RTW89_RS_TX_SHAPE_NUM) in fw_tx_shape_lmt_entry_valid()
5260 if (e->regd >= RTW89_REGD_NUM) in fw_tx_shape_lmt_entry_valid()
5269 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_tx_shape_lmt()
5277 data->v[entry.band][entry.tx_shape_rs][entry.regd] = entry.v; in rtw89_fw_load_tx_shape_lmt()
5286 if (!__fw_txpwr_entry_acceptable(e, cursor, conf->ent_sz)) in fw_tx_shape_lmt_ru_entry_valid()
5289 if (e->band >= RTW89_BAND_NUM) in fw_tx_shape_lmt_ru_entry_valid()
5291 if (e->regd >= RTW89_REGD_NUM) in fw_tx_shape_lmt_ru_entry_valid()
5300 const struct rtw89_txpwr_conf *conf = &data->conf; in rtw89_fw_load_tx_shape_lmt_ru()
5308 data->v[entry.band][entry.regd] = entry.v; in rtw89_fw_load_tx_shape_lmt_ru()
5316 struct rtw89_rfe_data *rfe_data = rtwdev->rfe_data; in rtw89_load_rfe_data_from_fw()
5322 parms = &rfe_data->rfe_parms; in rtw89_load_rfe_data_from_fw()
5326 if (rtw89_txpwr_conf_valid(&rfe_data->byrate.conf)) { in rtw89_load_rfe_data_from_fw()
5327 rfe_data->byrate.tbl.data = &rfe_data->byrate.conf; in rtw89_load_rfe_data_from_fw()
5328 rfe_data->byrate.tbl.size = 0; /* don't care here */ in rtw89_load_rfe_data_from_fw()
5329 rfe_data->byrate.tbl.load = rtw89_fw_load_txpwr_byrate; in rtw89_load_rfe_data_from_fw()
5330 parms->byr_tbl = &rfe_data->byrate.tbl; in rtw89_load_rfe_data_from_fw()
5333 if (rtw89_txpwr_conf_valid(&rfe_data->lmt_2ghz.conf)) { in rtw89_load_rfe_data_from_fw()
5334 rtw89_fw_load_txpwr_lmt_2ghz(&rfe_data->lmt_2ghz); in rtw89_load_rfe_data_from_fw()
5335 parms->rule_2ghz.lmt = &rfe_data->lmt_2ghz.v; in rtw89_load_rfe_data_from_fw()
5338 if (rtw89_txpwr_conf_valid(&rfe_data->lmt_5ghz.conf)) { in rtw89_load_rfe_data_from_fw()
5339 rtw89_fw_load_txpwr_lmt_5ghz(&rfe_data->lmt_5ghz); in rtw89_load_rfe_data_from_fw()
5340 parms->rule_5ghz.lmt = &rfe_data->lmt_5ghz.v; in rtw89_load_rfe_data_from_fw()
5343 if (rtw89_txpwr_conf_valid(&rfe_data->lmt_6ghz.conf)) { in rtw89_load_rfe_data_from_fw()
5344 rtw89_fw_load_txpwr_lmt_6ghz(&rfe_data->lmt_6ghz); in rtw89_load_rfe_data_from_fw()
5345 parms->rule_6ghz.lmt = &rfe_data->lmt_6ghz.v; in rtw89_load_rfe_data_from_fw()
5348 if (rtw89_txpwr_conf_valid(&rfe_data->lmt_ru_2ghz.conf)) { in rtw89_load_rfe_data_from_fw()
5349 rtw89_fw_load_txpwr_lmt_ru_2ghz(&rfe_data->lmt_ru_2ghz); in rtw89_load_rfe_data_from_fw()
5350 parms->rule_2ghz.lmt_ru = &rfe_data->lmt_ru_2ghz.v; in rtw89_load_rfe_data_from_fw()
5353 if (rtw89_txpwr_conf_valid(&rfe_data->lmt_ru_5ghz.conf)) { in rtw89_load_rfe_data_from_fw()
5354 rtw89_fw_load_txpwr_lmt_ru_5ghz(&rfe_data->lmt_ru_5ghz); in rtw89_load_rfe_data_from_fw()
5355 parms->rule_5ghz.lmt_ru = &rfe_data->lmt_ru_5ghz.v; in rtw89_load_rfe_data_from_fw()
5358 if (rtw89_txpwr_conf_valid(&rfe_data->lmt_ru_6ghz.conf)) { in rtw89_load_rfe_data_from_fw()
5359 rtw89_fw_load_txpwr_lmt_ru_6ghz(&rfe_data->lmt_ru_6ghz); in rtw89_load_rfe_data_from_fw()
5360 parms->rule_6ghz.lmt_ru = &rfe_data->lmt_ru_6ghz.v; in rtw89_load_rfe_data_from_fw()
5363 if (rtw89_txpwr_conf_valid(&rfe_data->tx_shape_lmt.conf)) { in rtw89_load_rfe_data_from_fw()
5364 rtw89_fw_load_tx_shape_lmt(&rfe_data->tx_shape_lmt); in rtw89_load_rfe_data_from_fw()
5365 parms->tx_shape.lmt = &rfe_data->tx_shape_lmt.v; in rtw89_load_rfe_data_from_fw()
5368 if (rtw89_txpwr_conf_valid(&rfe_data->tx_shape_lmt_ru.conf)) { in rtw89_load_rfe_data_from_fw()
5369 rtw89_fw_load_tx_shape_lmt_ru(&rfe_data->tx_shape_lmt_ru); in rtw89_load_rfe_data_from_fw()
5370 parms->tx_shape.lmt_ru = &rfe_data->tx_shape_lmt_ru.v; in rtw89_load_rfe_data_from_fw()