Lines Matching defs:rtwdev
18 static bool rtw89_is_any_vif_connected_or_connecting(struct rtw89_dev *rtwdev);
60 int (*fn)(struct rtw89_dev *rtwdev,
67 static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
69 static int rtw89_h2c_tx_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb,
71 static int __parse_security_section(struct rtw89_dev *rtwdev,
77 static struct sk_buff *rtw89_fw_h2c_alloc_skb(struct rtw89_dev *rtwdev, u32 len,
82 u32 h2c_desc_size = rtwdev->chip->h2c_desc_size;
96 struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len)
98 return rtw89_fw_h2c_alloc_skb(rtwdev, len, true);
101 struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len)
103 return rtw89_fw_h2c_alloc_skb(rtwdev, len, false);
106 int rtw89_fw_check_rdy(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type)
108 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
114 1, FWDL_WAIT_CNT, false, rtwdev, type);
118 rtw89_err(rtwdev, "fw checksum fail\n");
122 rtw89_err(rtwdev, "fw security fail\n");
126 rtw89_err(rtwdev, "fw cv not match\n");
130 rtw89_err(rtwdev, "fw unexpected status %d\n", val);
135 set_bit(RTW89_FLAG_FW_RDY, rtwdev->flags);
140 static int rtw89_fw_hdr_parser_v0(struct rtw89_dev *rtwdev, const u8 *fw, u32 len,
144 const struct rtw89_chip_info *chip = rtwdev->chip;
146 struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
174 rtw89_err(rtwdev, "[ERR]invalid fw dynamic header len\n");
203 ret = __parse_security_section(rtwdev, info, section_info,
215 rtw89_debug(rtwdev, RTW89_DBG_FW,
219 rtw89_debug(rtwdev, RTW89_DBG_FW,
231 rtw89_err(rtwdev, "[ERR]fw bin size\n");
238 static int __get_mssc_key_idx(struct rtw89_dev *rtwdev,
242 struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
282 static int __parse_formatted_mssc(struct rtw89_dev *rtwdev,
290 struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
298 rtw89_err(rtwdev, "[ERR] wrong MSS signature\n");
309 rtw89_err(rtwdev, "[ERR] MSS Key Pool Remap Table Format Unsupport:%X\n",
315 rtw89_err(rtwdev, "[ERR] MSS Key Pool Format Error:0x%X + 0x%X != 0x%X\n",
338 ret = __get_mssc_key_idx(rtwdev, mss_hdr, rmp_tbl_size, &real_key_idx);
364 static int __check_secure_blacklist(struct rtw89_dev *rtwdev,
369 const struct rtw89_fw_blacklist *chip_blacklist = rtwdev->chip->fw_blacklist;
371 struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
382 rtw89_warn(rtwdev, "chip no blacklist for secure firmware\n");
390 rtw89_warn(rtwdev, "chip blacklist out of date (%u, %u)\n",
396 rtw89_warn(rtwdev, "firmware %u in chip blacklist\n",
404 static int __parse_security_section(struct rtw89_dev *rtwdev,
410 struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
414 ret = __parse_formatted_mssc(rtwdev, info, section_info,
425 rtw89_err(rtwdev, "unexpected MSS %d >= %d\n",
437 ret = __check_secure_blacklist(rtwdev, info, section_info, content);
443 static int rtw89_fw_hdr_parser_v1(struct rtw89_dev *rtwdev, const u8 *fw, u32 len,
447 const struct rtw89_chip_info *chip = rtwdev->chip;
474 rtw89_err(rtwdev, "[ERR]invalid fw dynamic header len\n");
504 ret = __parse_security_section(rtwdev, info, section_info,
513 rtw89_debug(rtwdev, RTW89_DBG_FW,
517 rtw89_debug(rtwdev, RTW89_DBG_FW,
529 rtw89_err(rtwdev, "[ERR]fw bin size\n");
534 rtw89_warn(rtwdev, "no firmware secure section\n");
539 static int rtw89_fw_hdr_parser(struct rtw89_dev *rtwdev,
547 rtw89_err(rtwdev, "fw type %d isn't recognized\n", fw_suit->type);
553 return rtw89_fw_hdr_parser_v0(rtwdev, fw, len, info);
555 return rtw89_fw_hdr_parser_v1(rtwdev, fw, len, info);
562 const struct rtw89_mfw_hdr *rtw89_mfw_get_hdr_ptr(struct rtw89_dev *rtwdev,
578 static int rtw89_mfw_validate_hdr(struct rtw89_dev *rtwdev,
588 rtw89_err(rtwdev, "mfw header has no fw entry\n");
595 rtw89_err(rtwdev, "mfw header out of address\n");
603 int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
606 struct rtw89_fw_info *fw_info = &rtwdev->fw;
615 mfw_hdr = rtw89_mfw_get_hdr_ptr(rtwdev, firmware);
617 rtw89_debug(rtwdev, RTW89_DBG_FW, "use legacy firmware\n");
626 ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
643 if (tmp->cv <= rtwdev->hal.cv && !tmp->mp) {
653 rtw89_err(rtwdev, "no suitable firmware found\n");
661 rtw89_err(rtwdev, "fw_suit %d out of address\n", type);
668 static u32 rtw89_mfw_get_size(struct rtw89_dev *rtwdev)
670 struct rtw89_fw_info *fw_info = &rtwdev->fw;
677 mfw_hdr = rtw89_mfw_get_hdr_ptr(rtwdev, firmware);
679 rtw89_warn(rtwdev, "not mfw format\n");
683 ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
693 static void rtw89_fw_update_ver_v0(struct rtw89_dev *rtwdev,
710 static void rtw89_fw_update_ver_v1(struct rtw89_dev *rtwdev,
727 static int rtw89_fw_update_ver(struct rtw89_dev *rtwdev,
742 rtw89_fw_update_ver_v0(rtwdev, fw_suit, v0);
745 rtw89_fw_update_ver_v1(rtwdev, fw_suit, v1);
748 rtw89_err(rtwdev, "Unknown firmware header version %u\n",
753 rtw89_info(rtwdev,
762 int __rtw89_fw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
765 struct rtw89_fw_suit *fw_suit = rtw89_fw_suit_get(rtwdev, type);
768 ret = rtw89_mfw_recognize(rtwdev, type, fw_suit, nowarn);
772 return rtw89_fw_update_ver(rtwdev, type, fw_suit);
776 int __rtw89_fw_recognize_from_elm(struct rtw89_dev *rtwdev,
781 struct rtw89_hal *hal = &rtwdev->hal;
790 fw_suit = rtw89_fw_suit_get(rtwdev, type);
797 return rtw89_fw_update_ver(rtwdev, type, fw_suit);
904 static void rtw89_fw_recognize_features(struct rtw89_dev *rtwdev)
906 const struct rtw89_chip_info *chip = rtwdev->chip;
910 fw_suit = rtw89_fw_suit_get(rtwdev, RTW89_FW_NORMAL);
913 rtw89_fw_iterate_feature_cfg(&rtwdev->fw, chip, suit_ver_code);
956 static int rtw89_fw_validate_ver_required(struct rtw89_dev *rtwdev)
958 const struct rtw89_chip_variant *variant = rtwdev->variant;
965 fw_suit = rtw89_fw_suit_get(rtwdev, RTW89_FW_NORMAL);
969 rtw89_err(rtwdev, "minimum required firmware version is 0x%x\n",
977 int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
979 const struct rtw89_chip_info *chip = rtwdev->chip;
983 ret = __rtw89_fw_recognize(rtwdev, RTW89_FW_NORMAL_CE, true);
988 ret = __rtw89_fw_recognize(rtwdev, RTW89_FW_NORMAL, false);
993 ret = rtw89_fw_validate_ver_required(rtwdev);
998 __rtw89_fw_recognize(rtwdev, RTW89_FW_WOWLAN, false);
1001 __rtw89_fw_recognize(rtwdev, RTW89_FW_LOGFMT, true);
1003 rtw89_fw_recognize_features(rtwdev);
1005 rtw89_coex_recognize_ver(rtwdev);
1011 int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
1015 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1073 int rtw89_fw_recognize_txpwr_from_elm(struct rtw89_dev *rtwdev,
1079 struct rtw89_efuse *efuse = &rtwdev->efuse;
1082 if (!rtwdev->rfe_data) {
1083 rtwdev->rfe_data = kzalloc(sizeof(*rtwdev->rfe_data), GFP_KERNEL);
1084 if (!rtwdev->rfe_data)
1088 conf = (void *)rtwdev->rfe_data + offset;
1100 rtw89_debug(rtwdev, RTW89_DBG_FW, "skip txpwr element ID %u RFE %u\n",
1105 rtw89_debug(rtwdev, RTW89_DBG_FW, "take txpwr element ID %u RFE %u\n",
1116 int rtw89_build_txpwr_trk_tbl_from_elm(struct rtw89_dev *rtwdev,
1120 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1121 const struct rtw89_chip_info *chip = rtwdev->chip;
1138 rtw89_warn(rtwdev, "needed txpwr trk bitmap %08x but %08x\n",
1173 rtw89_warn(rtwdev, "unexpected txpwr trk offset %d over size %d\n",
1182 int rtw89_build_rfk_log_fmt_from_elm(struct rtw89_dev *rtwdev,
1186 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1255 int rtw89_recognize_regd_from_elm(struct rtw89_dev *rtwdev,
1260 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1267 rtw89_warn(rtwdev,
1270 rtw89_warn(rtwdev,
1276 rtw89_debug(rtwdev, RTW89_DBG_REGD,
1278 devm_kfree(rtwdev->dev, elm_info->regd);
1282 p = devm_kzalloc(rtwdev->dev, struct_size(p, map, num_ents), GFP_KERNEL);
1291 rtw89_err(rtwdev, "regd element has %d invalid ents\n",
1293 devm_kfree(rtwdev->dev, p);
1302 int rtw89_build_afe_pwr_seq_from_elm(struct rtw89_dev *rtwdev,
1306 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1314 int rtw89_recognize_diag_mac_from_elm(struct rtw89_dev *rtwdev,
1318 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1418 int rtw89_fw_recognize_elements(struct rtw89_dev *rtwdev)
1420 struct rtw89_fw_info *fw_info = &rtwdev->fw;
1422 const struct rtw89_chip_info *chip = rtwdev->chip;
1433 offset = rtw89_mfw_get_size(rtwdev);
1443 rtw89_warn(rtwdev, "firmware element size exceeds\n");
1455 ret = handler->fn(rtwdev, hdr, handler->arg);
1462 rtw89_info(rtwdev, "Firmware element %s version: %4ph\n",
1472 rtw89_err(rtwdev, "Firmware elements 0x%08x are unrecognized\n",
1480 void rtw89_h2c_pkt_set_hdr(struct rtw89_dev *rtwdev, struct sk_buff *skb,
1488 if (!(rtwdev->fw.h2c_seq % 4))
1494 FIELD_PREP(H2C_HDR_H2C_SEQ, rtwdev->fw.h2c_seq));
1501 rtwdev->fw.h2c_seq++;
1504 static void rtw89_h2c_pkt_set_hdr_fwdl(struct rtw89_dev *rtwdev,
1517 FIELD_PREP(H2C_HDR_H2C_SEQ, rtwdev->fw.h2c_seq));
1523 static u32 __rtw89_fw_download_tweak_hdr_v0(struct rtw89_dev *rtwdev,
1547 static u32 __rtw89_fw_download_tweak_hdr_v1(struct rtw89_dev *rtwdev,
1576 static int __rtw89_fw_download_hdr(struct rtw89_dev *rtwdev,
1588 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
1590 rtw89_err(rtwdev, "failed to alloc skb for fw hdr dl\n");
1599 truncated = __rtw89_fw_download_tweak_hdr_v0(rtwdev, info, fw_hdr);
1603 truncated = __rtw89_fw_download_tweak_hdr_v1(rtwdev, info, fw_hdr_v1);
1615 rtw89_h2c_pkt_set_hdr_fwdl(rtwdev, skb, FWCMD_TYPE_H2C,
1619 ret = rtw89_h2c_tx(rtwdev, skb, false);
1621 rtw89_err(rtwdev, "failed to send h2c\n");
1632 static int rtw89_fw_download_hdr(struct rtw89_dev *rtwdev,
1636 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
1639 ret = __rtw89_fw_download_hdr(rtwdev, fw_suit, info);
1641 rtw89_err(rtwdev, "[ERR]FW header download\n");
1645 ret = mac->fwdl_check_path_ready(rtwdev, false);
1647 rtw89_err(rtwdev, "[ERR]FWDL path ready\n");
1651 rtw89_write32(rtwdev, R_AX_HALT_H2C_CTRL, 0);
1652 rtw89_write32(rtwdev, R_AX_HALT_C2H_CTRL, 0);
1657 static int __rtw89_fw_download_main(struct rtw89_dev *rtwdev,
1673 rtw89_warn(rtwdev, "override length %u larger than original %u\n",
1681 rtw89_warn(rtwdev,
1692 skb = rtw89_fw_h2c_alloc_skb_no_hdr(rtwdev, pkt_len);
1694 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
1703 ret = rtw89_h2c_tx(rtwdev, skb, true);
1705 rtw89_err(rtwdev, "failed to send h2c\n");
1721 rtw89_fw_get_fwdl_chk_type_from_suit(struct rtw89_dev *rtwdev,
1734 static int rtw89_fw_download_main(struct rtw89_dev *rtwdev,
1739 const struct rtw89_chip_info *chip = rtwdev->chip;
1745 ret = __rtw89_fw_download_main(rtwdev, section_info, info->part_size);
1754 chk_type = rtw89_fw_get_fwdl_chk_type_from_suit(rtwdev, fw_suit);
1755 ret = rtw89_fw_check_rdy(rtwdev, chk_type);
1757 rtw89_warn(rtwdev, "failed to download firmware type %u\n",
1765 static void rtw89_fw_prog_cnt_dump(struct rtw89_dev *rtwdev)
1767 enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen;
1777 rtw89_write32(rtwdev, R_AX_DBG_CTRL,
1780 rtw89_write32_mask(rtwdev, R_AX_SYS_STATUS1, B_AX_SEL_0XC0_MASK, MAC_DBG_SEL);
1784 val32 = rtw89_read32(rtwdev, addr);
1785 rtw89_err(rtwdev, "[ERR]fw PC = 0x%x\n", val32);
1790 static void rtw89_fw_dl_fail_dump(struct rtw89_dev *rtwdev)
1794 val32 = rtw89_read32(rtwdev, R_AX_WCPU_FW_CTRL);
1795 rtw89_err(rtwdev, "[ERR]fwdl 0x1E0 = 0x%x\n", val32);
1797 val32 = rtw89_read32(rtwdev, R_AX_BOOT_DBG);
1798 rtw89_err(rtwdev, "[ERR]fwdl 0x83F0 = 0x%x\n", val32);
1800 rtw89_fw_prog_cnt_dump(rtwdev);
1803 static int rtw89_fw_download_suit(struct rtw89_dev *rtwdev,
1806 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
1810 ret = rtw89_fw_hdr_parser(rtwdev, fw_suit, &info);
1812 rtw89_err(rtwdev, "parse fw header fail\n");
1816 rtw89_fwdl_secure_idmem_share_mode(rtwdev, info.idmem_share_mode);
1818 if (rtwdev->chip->chip_id == RTL8922A &&
1820 rtw89_write32(rtwdev, R_BE_SECURE_BOOT_MALLOC_INFO, 0x20248000);
1822 ret = mac->fwdl_check_path_ready(rtwdev, true);
1824 rtw89_err(rtwdev, "[ERR]H2C path ready\n");
1828 ret = rtw89_fw_download_hdr(rtwdev, fw_suit, &info);
1832 ret = rtw89_fw_download_main(rtwdev, fw_suit, &info);
1840 int __rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
1843 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
1844 struct rtw89_fw_info *fw_info = &rtwdev->fw;
1845 struct rtw89_fw_suit *fw_suit = rtw89_fw_suit_get(rtwdev, type);
1846 u8 bbmcu_nr = rtwdev->chip->bbmcu_nr;
1850 mac->disable_cpu(rtwdev);
1851 ret = mac->fwdl_enable_wcpu(rtwdev, 0, true, include_bb);
1855 ret = rtw89_fw_download_suit(rtwdev, fw_suit);
1860 fw_suit = rtw89_fw_suit_get(rtwdev, RTW89_FW_BBMCU0 + i);
1862 ret = rtw89_fw_download_suit(rtwdev, fw_suit);
1871 rtwdev->mac.rpwm_seq_num = RPWM_SEQ_NUM_MAX;
1872 rtwdev->mac.cpwm_seq_num = CPWM_SEQ_NUM_MAX;
1876 ret = rtw89_fw_check_rdy(rtwdev, RTW89_FWDL_CHECK_FREERTOS_DONE);
1878 rtw89_warn(rtwdev, "download firmware fail\n");
1885 rtw89_fw_dl_fail_dump(rtwdev);
1889 int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
1896 ret = __rtw89_fw_download(rtwdev, type, include_bb);
1904 int rtw89_wait_firmware_completion(struct rtw89_dev *rtwdev)
1906 struct rtw89_fw_info *fw = &rtwdev->fw;
1915 static int rtw89_load_firmware_req(struct rtw89_dev *rtwdev,
1922 rtw89_debug(rtwdev, RTW89_DBG_FW,
1929 ret = firmware_request_nowarn(&req->firmware, fw_name, rtwdev->dev);
1931 ret = request_firmware(&req->firmware, fw_name, rtwdev->dev);
1940 struct rtw89_dev *rtwdev =
1942 const struct rtw89_chip_info *chip = rtwdev->chip;
1946 chip->fw_basename, rtwdev->fw.fw_format);
1948 rtw89_load_firmware_req(rtwdev, &rtwdev->fw.req, fw_name, false);
1960 static void rtw89_unload_firmware_elements(struct rtw89_dev *rtwdev)
1962 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
1975 void rtw89_unload_firmware(struct rtw89_dev *rtwdev)
1977 struct rtw89_fw_info *fw = &rtwdev->fw;
1979 cancel_work_sync(&rtwdev->load_firmware_work);
1991 rtw89_unload_firmware_elements(rtwdev);
1994 static u32 rtw89_fw_log_get_fmt_idx(struct rtw89_dev *rtwdev, u32 fmt_id)
1996 struct rtw89_fw_log *fw_log = &rtwdev->fw.log;
2009 static int rtw89_fw_log_create_fmts_dict(struct rtw89_dev *rtwdev)
2011 struct rtw89_fw_log *log = &rtwdev->fw.log;
2041 int rtw89_fw_log_prepare(struct rtw89_dev *rtwdev)
2043 struct rtw89_fw_log *log = &rtwdev->fw.log;
2047 rtw89_debug(rtwdev, RTW89_DBG_FW, "no log format file\n");
2053 return rtw89_fw_log_create_fmts_dict(rtwdev);
2056 static void rtw89_fw_log_dump_data(struct rtw89_dev *rtwdev,
2060 const char *(*fmts)[] = rtwdev->fw.log.fmts;
2066 rtw89_warn(rtwdev, "C2H log: Arg count is unexpected %d\n",
2092 rtw89_info(rtwdev, "C2H log: %s", str_buf);
2095 void rtw89_fw_log_dump(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
2102 rtw89_err(rtwdev, "c2h log length is wrong!\n");
2116 if (!rtwdev->fw.log.fmts)
2120 fmt_idx = rtw89_fw_log_get_fmt_idx(rtwdev, le32_to_cpu(log_fmt->fmt_id));
2123 rtw89_info(rtwdev, "C2H log: %s%s",
2124 (*rtwdev->fw.log.fmts)[fmt_idx], log_fmt->u.raw);
2126 rtw89_fw_log_dump_data(rtwdev, log_fmt, fmt_idx, para_int, false);
2128 rtw89_fw_log_dump_data(rtwdev, log_fmt, fmt_idx, para_int, true);
2132 rtw89_info(rtwdev, "C2H log: %.*s", len, buf);
2136 int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
2140 const struct rtw89_chip_info *chip = rtwdev->chip;
2148 if (RTW89_CHK_FW_FEATURE(ADDR_CAM_V0, &rtwdev->fw) ||
2154 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2156 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
2162 rtw89_cam_fill_addr_cam_info(rtwdev, rtwvif_link, rtwsta_link,
2164 rtw89_cam_fill_bssid_cam_info(rtwdev, rtwvif_link, rtwsta_link, h2c_v0);
2173 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2179 ret = rtw89_h2c_tx(rtwdev, skb, false);
2181 rtw89_err(rtwdev, "failed to send h2c\n");
2192 int rtw89_fw_h2c_dctl_sec_cam_v1(struct rtw89_dev *rtwdev,
2201 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2203 rtw89_err(rtwdev, "failed to alloc skb for dctl sec cam\n");
2209 rtw89_cam_fill_dctl_sec_cam_info_v1(rtwdev, rtwvif_link, rtwsta_link, h2c);
2211 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2217 ret = rtw89_h2c_tx(rtwdev, skb, false);
2219 rtw89_err(rtwdev, "failed to send h2c\n");
2231 int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev,
2240 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2242 rtw89_err(rtwdev, "failed to alloc skb for dctl sec cam\n");
2248 rtw89_cam_fill_dctl_sec_cam_info_v2(rtwdev, rtwvif_link, rtwsta_link, h2c);
2250 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2256 ret = rtw89_h2c_tx(rtwdev, skb, false);
2258 rtw89_err(rtwdev, "failed to send h2c\n");
2270 int rtw89_fw_h2c_default_dmac_tbl_v2(struct rtw89_dev *rtwdev,
2280 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2282 rtw89_err(rtwdev, "failed to alloc skb for dctl v2\n");
2305 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2311 ret = rtw89_h2c_tx(rtwdev, skb, false);
2313 rtw89_err(rtwdev, "failed to send h2c\n");
2325 int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev,
2330 const struct rtw89_chip_info *chip = rtwdev->chip;
2339 rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
2341 rtw89_core_release_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
2347 rtw89_debug(rtwdev, RTW89_DBG_TXRX,
2353 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2355 rtw89_err(rtwdev, "failed to alloc skb for h2c ba cam\n");
2385 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2391 ret = rtw89_h2c_tx(rtwdev, skb, false);
2393 rtw89_err(rtwdev, "failed to send h2c\n");
2405 static int rtw89_fw_h2c_init_ba_cam_v0_ext(struct rtw89_dev *rtwdev,
2413 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2415 rtw89_err(rtwdev, "failed to alloc skb for dynamic h2c ba cam\n");
2427 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2433 ret = rtw89_h2c_tx(rtwdev, skb, false);
2435 rtw89_err(rtwdev, "failed to send h2c\n");
2446 void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev)
2448 const struct rtw89_chip_info *chip = rtwdev->chip;
2454 rtw89_fw_h2c_init_ba_cam_v0_ext(rtwdev, entry_idx, uid);
2460 int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
2465 const struct rtw89_chip_info *chip = rtwdev->chip;
2475 rtw89_core_acquire_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
2477 rtw89_core_release_sta_ba_entry(rtwdev, rtwsta_link, params->tid,
2483 rtw89_debug(rtwdev, RTW89_DBG_TXRX,
2489 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2491 rtw89_err(rtwdev, "failed to alloc skb for h2c ba cam\n");
2519 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2525 ret = rtw89_h2c_tx(rtwdev, skb, false);
2527 rtw89_err(rtwdev, "failed to send h2c\n");
2539 int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
2547 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2549 rtw89_err(rtwdev, "failed to alloc skb for h2c ba cam init\n");
2559 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2565 ret = rtw89_h2c_tx(rtwdev, skb, false);
2567 rtw89_err(rtwdev, "failed to send h2c\n");
2579 int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable)
2590 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LOG_CFG_LEN);
2592 rtw89_err(rtwdev, "failed to alloc skb for fw log cfg\n");
2602 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2608 ret = rtw89_h2c_tx(rtwdev, skb, false);
2610 rtw89_err(rtwdev, "failed to send h2c\n");
2621 static struct sk_buff *rtw89_eapol_get(struct rtw89_dev *rtwdev,
2626 u8 sec_hdr_len = rtw89_wow_get_sec_hdr_len(rtwdev);
2627 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
2671 static struct sk_buff *rtw89_sa_query_get(struct rtw89_dev *rtwdev,
2674 u8 sec_hdr_len = rtw89_wow_get_sec_hdr_len(rtwdev);
2708 static struct sk_buff *rtw89_arp_response_get(struct rtw89_dev *rtwdev,
2712 u8 sec_hdr_len = rtw89_wow_get_sec_hdr_len(rtwdev);
2713 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
2756 static int rtw89_fw_h2c_add_general_pkt(struct rtw89_dev *rtwdev,
2773 skb = ieee80211_pspoll_get(rtwdev->hw, vif);
2776 skb = ieee80211_proberesp_get(rtwdev->hw, vif);
2779 skb = ieee80211_nullfunc_get(rtwdev->hw, vif, link_id, false);
2782 skb = ieee80211_nullfunc_get(rtwdev->hw, vif, link_id, true);
2785 skb = rtw89_eapol_get(rtwdev, rtwvif_link);
2788 skb = rtw89_sa_query_get(rtwdev, rtwvif_link);
2791 skb = rtw89_arp_response_get(rtwdev, rtwvif_link);
2800 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb);
2815 void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
2824 rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id);
2826 rtw89_core_release_bit_map(rtwdev->pkt_offload, info->id);
2832 void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw)
2838 rtw89_for_each_rtwvif(rtwdev, rtwvif)
2840 rtw89_fw_release_general_pkt_list_vif(rtwdev, rtwvif_link,
2846 int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev,
2855 rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
2857 rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
2859 rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
2862 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_GENERAL_PKT_LEN);
2864 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
2875 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2881 ret = rtw89_h2c_tx(rtwdev, skb, false);
2883 rtw89_err(rtwdev, "failed to send h2c\n");
2895 int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
2902 if (RTW89_CHK_FW_FEATURE(LPS_DACK_BY_C2H_REG, &rtwdev->fw))
2907 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LPS_PARM_LEN);
2909 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
2925 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2931 ret = rtw89_h2c_tx(rtwdev, skb, false);
2933 rtw89_err(rtwdev, "failed to send h2c\n");
2944 int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
2946 const struct rtw89_chip_info *chip = rtwdev->chip;
2961 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
2963 rtw89_err(rtwdev, "failed to alloc skb for h2c lps_ch_info\n");
2974 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
2984 rtw89_err(rtwdev, "no chan for h2c lps_ch_info\n");
2989 h2c->mlo_dbcc_mode_lps = cpu_to_le32(rtwdev->mlo_dbcc_mode);
2991 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
2995 rtw89_phy_write32_mask(rtwdev, R_CHK_LPS_STAT, B_CHK_LPS_STAT, 0);
2996 ret = rtw89_h2c_tx(rtwdev, skb, false);
2998 rtw89_err(rtwdev, "failed to send h2c\n");
3003 true, rtwdev, R_CHK_LPS_STAT, B_CHK_LPS_STAT);
3005 rtw89_warn(rtwdev, "h2c_lps_ch_info done polling timeout\n");
3014 int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
3017 const struct rtw89_phy_bb_gain_info_be *gain = &rtwdev->bb_gain.be;
3018 struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.cur_pkt_stat;
3020 const struct rtw89_chip_info *chip = rtwdev->chip;
3021 struct rtw89_efuse *efuse = &rtwdev->efuse;
3039 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
3041 rtw89_err(rtwdev, "failed to alloc skb for h2c lps_ml_cmn_info\n");
3049 h2c->mlo_dbcc_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
3054 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
3088 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3092 rtw89_phy_write32_mask(rtwdev, R_CHK_LPS_STAT, B_CHK_LPS_STAT, 0);
3093 ret = rtw89_h2c_tx(rtwdev, skb, false);
3095 rtw89_err(rtwdev, "failed to send h2c\n");
3100 true, rtwdev, R_CHK_LPS_STAT, B_CHK_LPS_STAT);
3102 rtw89_warn(rtwdev, "h2c_lps_ml_cmn_info done polling timeout\n");
3112 int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev,
3122 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_P2P_ACT_LEN);
3124 rtw89_err(rtwdev, "failed to alloc skb for h2c p2p act\n");
3144 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3149 ret = rtw89_h2c_tx(rtwdev, skb, false);
3151 rtw89_err(rtwdev, "failed to send h2c\n");
3162 static void __rtw89_fw_h2c_set_tx_path(struct rtw89_dev *rtwdev,
3165 const struct rtw89_chip_info *chip = rtwdev->chip;
3166 struct rtw89_hal *hal = &rtwdev->hal;
3186 int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
3190 const struct rtw89_chip_info *chip = rtwdev->chip;
3195 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
3197 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
3205 __rtw89_fw_h2c_set_tx_path(rtwdev, skb);
3211 SET_CMC_TBL_MGQ_RPT_EN(skb->data, rtwdev->hci.tx_rpt_enabled);
3217 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3222 ret = rtw89_h2c_tx(rtwdev, skb, false);
3224 rtw89_err(rtwdev, "failed to send h2c\n");
3236 int rtw89_fw_h2c_default_cmac_tbl_g7(struct rtw89_dev *rtwdev,
3246 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
3248 rtw89_err(rtwdev, "failed to alloc skb for cmac g7\n");
3258 le32_encode_bits(rtwdev->hci.tx_rpt_enabled, CCTLINFO_G7_W0_MGQ_RPT_EN);
3302 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3307 ret = rtw89_h2c_tx(rtwdev, skb, false);
3309 rtw89_err(rtwdev, "failed to send h2c\n");
3321 static void __get_sta_he_pkt_padding(struct rtw89_dev *rtwdev,
3327 u8 nss = min(link_sta->rx_nss, rtwdev->hal.tx_nss) - 1;
3376 int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
3381 const struct rtw89_chip_info *chip = rtwdev->chip;
3382 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
3393 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
3395 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
3405 __get_sta_he_pkt_padding(rtwdev, link_sta, pads);
3446 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3451 ret = rtw89_h2c_tx(rtwdev, skb, false);
3453 rtw89_err(rtwdev, "failed to send h2c\n");
3465 static void __get_sta_eht_pkt_padding(struct rtw89_dev *rtwdev,
3469 u8 nss = min(link_sta->rx_nss, rtwdev->hal.tx_nss) - 1;
3523 int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
3528 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
3541 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
3543 rtw89_err(rtwdev, "failed to alloc skb for cmac g7\n");
3555 __get_sta_eht_pkt_padding(rtwdev, link_sta, pads);
3557 __get_sta_he_pkt_padding(rtwdev, link_sta, pads);
3632 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3637 ret = rtw89_h2c_tx(rtwdev, skb, false);
3639 rtw89_err(rtwdev, "failed to send h2c\n");
3651 int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
3664 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
3666 rtw89_err(rtwdev, "failed to alloc skb for ampdu cmac g7\n");
3698 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3703 ret = rtw89_h2c_tx(rtwdev, skb, false);
3705 rtw89_err(rtwdev, "failed to send h2c\n");
3717 int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
3720 const struct rtw89_chip_info *chip = rtwdev->chip;
3724 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
3726 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
3741 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3746 ret = rtw89_h2c_tx(rtwdev, skb, false);
3748 rtw89_err(rtwdev, "failed to send h2c\n");
3760 int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
3768 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
3770 rtw89_err(rtwdev, "failed to alloc skb for txtime_cmac_g7\n");
3795 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3800 ret = rtw89_h2c_tx(rtwdev, skb, false);
3802 rtw89_err(rtwdev, "failed to send h2c\n");
3814 int rtw89_fw_h2c_punctured_cmac_tbl_g7(struct rtw89_dev *rtwdev,
3823 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
3825 rtw89_err(rtwdev, "failed to alloc skb for punctured cmac g7\n");
3838 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3843 ret = rtw89_h2c_tx(rtwdev, skb, false);
3845 rtw89_err(rtwdev, "failed to send h2c\n");
3857 int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
3860 const struct rtw89_chip_info *chip = rtwdev->chip;
3867 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
3869 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
3876 __rtw89_fw_h2c_set_tx_path(rtwdev, skb);
3878 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3883 ret = rtw89_h2c_tx(rtwdev, skb, false);
3885 rtw89_err(rtwdev, "failed to send h2c\n");
3896 int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
3899 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
3921 skb_beacon = ieee80211_beacon_get_tim(rtwdev->hw, vif, &tim_offset,
3924 rtw89_err(rtwdev, "failed to get beacon skb\n");
3939 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, bcn_total_len);
3941 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
3960 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
3965 ret = rtw89_h2c_tx(rtwdev, skb, false);
3967 rtw89_err(rtwdev, "failed to send h2c\n");
3976 int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev,
3979 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
4000 skb_beacon = ieee80211_beacon_get_tim(rtwdev->hw, vif, &tim_offset,
4003 rtw89_err(rtwdev, "failed to get beacon skb\n");
4018 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, bcn_total_len);
4020 rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
4039 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4044 ret = rtw89_h2c_tx(rtwdev, skb, false);
4046 rtw89_err(rtwdev, "failed to send h2c\n");
4059 int rtw89_fw_h2c_tbtt_tuning(struct rtw89_dev *rtwdev,
4067 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4069 rtw89_err(rtwdev, "failed to alloc skb for h2c tbtt tuning\n");
4079 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4084 ret = rtw89_h2c_tx(rtwdev, skb, false);
4086 rtw89_err(rtwdev, "failed to send h2c\n");
4097 int rtw89_fw_h2c_pwr_lvl(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
4103 struct rtw89_beacon_track_info *bcn_track = &rtwdev->bcn_track;
4110 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4112 rtw89_err(rtwdev, "failed to alloc skb for h2c pwr lvl\n");
4128 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4133 ret = rtw89_h2c_tx(rtwdev, skb, false);
4135 rtw89_err(rtwdev, "failed to send h2c\n");
4146 int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
4167 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4169 rtw89_err(rtwdev, "failed to alloc skb for h2c join\n");
4184 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4189 ret = rtw89_h2c_tx(rtwdev, skb, false);
4191 rtw89_err(rtwdev, "failed to send h2c\n");
4203 rtw89_fw_get_sta_type(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4242 int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4260 if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) {
4270 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4272 rtw89_err(rtwdev, "failed to alloc skb for h2c join\n");
4298 sta_type = rtw89_fw_get_sta_type(rtwdev, rtwvif_link, rtwsta_link);
4324 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4329 ret = rtw89_h2c_tx(rtwdev, skb, false);
4331 rtw89_err(rtwdev, "failed to send h2c\n");
4342 int rtw89_fw_h2c_notify_dbcc(struct rtw89_dev *rtwdev, bool en)
4349 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4351 rtw89_err(rtwdev, "failed to alloc skb for h2c notify dbcc\n");
4359 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4364 ret = rtw89_h2c_tx(rtwdev, skb, false);
4366 rtw89_err(rtwdev, "failed to send h2c\n");
4377 int rtw89_fw_h2c_macid_pause(struct rtw89_dev *rtwdev, u8 sh, u8 grp,
4388 if (RTW89_CHK_FW_FEATURE(MACID_PAUSE_SLEEP, &rtwdev->fw)) {
4396 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4398 rtw89_err(rtwdev, "failed to alloc skb for h2c macid pause\n");
4420 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4425 ret = rtw89_h2c_tx(rtwdev, skb, false);
4427 rtw89_err(rtwdev, "failed to send h2c\n");
4439 int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4445 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_EDCA_LEN);
4447 rtw89_err(rtwdev, "failed to alloc skb for h2c edca\n");
4457 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4462 ret = rtw89_h2c_tx(rtwdev, skb, false);
4464 rtw89_err(rtwdev, "failed to send h2c\n");
4476 int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev,
4485 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_TSF32_TOGL_LEN);
4487 rtw89_err(rtwdev, "failed to alloc skb for h2c p2p act\n");
4498 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4503 ret = rtw89_h2c_tx(rtwdev, skb, false);
4505 rtw89_err(rtwdev, "failed to send h2c\n");
4517 int rtw89_fw_h2c_set_ofld_cfg(struct rtw89_dev *rtwdev)
4523 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_OFLD_CFG_LEN);
4525 rtw89_err(rtwdev, "failed to alloc skb for h2c ofld\n");
4530 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4535 ret = rtw89_h2c_tx(rtwdev, skb, false);
4537 rtw89_err(rtwdev, "failed to send h2c\n");
4548 int rtw89_fw_h2c_tx_duty(struct rtw89_dev *rtwdev, u8 lv)
4556 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4558 rtw89_err(rtwdev, "failed to alloc skb for h2c tx duty\n");
4577 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4581 ret = rtw89_h2c_tx(rtwdev, skb, false);
4583 rtw89_err(rtwdev, "failed to send h2c\n");
4594 int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev,
4607 if (!RTW89_CHK_FW_FEATURE(BEACON_FILTER, &rtwdev->fw))
4624 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4626 rtw89_err(rtwdev, "failed to alloc skb for h2c bcn filter\n");
4633 if (RTW89_CHK_FW_FEATURE(BEACON_LOSS_COUNT_V1, &rtwdev->fw))
4652 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4656 ret = rtw89_h2c_tx(rtwdev, skb, false);
4658 rtw89_err(rtwdev, "failed to send h2c\n");
4669 int rtw89_fw_h2c_rssi_offload(struct rtw89_dev *rtwdev,
4678 if (!RTW89_CHK_FW_FEATURE(BEACON_FILTER, &rtwdev->fw))
4684 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4686 rtw89_err(rtwdev, "failed to alloc skb for h2c rssi\n");
4698 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4702 ret = rtw89_h2c_tx(rtwdev, skb, false);
4704 rtw89_err(rtwdev, "failed to send h2c\n");
4715 int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
4727 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4729 rtw89_err(rtwdev, "failed to alloc skb for h2c tp\n");
4740 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4744 ret = rtw89_h2c_tx(rtwdev, skb, false);
4746 rtw89_err(rtwdev, "failed to send h2c\n");
4757 int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi)
4759 const struct rtw89_chip_info *chip = rtwdev->chip;
4775 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4777 rtw89_err(rtwdev, "failed to alloc skb for h2c join\n");
4782 rtw89_debug(rtwdev, RTW89_DBG_RA,
4830 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4835 ret = rtw89_h2c_tx(rtwdev, skb, false);
4837 rtw89_err(rtwdev, "failed to send h2c\n");
4848 int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type)
4850 struct rtw89_btc *btc = &rtwdev->btc;
4860 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4862 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_init\n");
4897 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4902 ret = rtw89_h2c_tx(rtwdev, skb, false);
4904 rtw89_err(rtwdev, "failed to send h2c\n");
4915 int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type)
4917 struct rtw89_btc *btc = &rtwdev->btc;
4925 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4927 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_init_v7\n");
4938 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
4943 ret = rtw89_h2c_tx(rtwdev, skb, false);
4945 rtw89_err(rtwdev, "failed to send h2c\n");
4961 int rtw89_fw_h2c_cxdrv_role(struct rtw89_dev *rtwdev, u8 type)
4963 struct rtw89_btc *btc = &rtwdev->btc;
4978 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
4980 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_role\n");
5021 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5026 ret = rtw89_h2c_tx(rtwdev, skb, false);
5028 rtw89_err(rtwdev, "failed to send h2c\n");
5042 int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev, u8 type)
5044 struct rtw89_btc *btc = &rtwdev->btc;
5058 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5060 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_role\n");
5111 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5116 ret = rtw89_h2c_tx(rtwdev, skb, false);
5118 rtw89_err(rtwdev, "failed to send h2c\n");
5132 int rtw89_fw_h2c_cxdrv_role_v2(struct rtw89_dev *rtwdev, u8 type)
5134 struct rtw89_btc *btc = &rtwdev->btc;
5148 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5150 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_role\n");
5197 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5202 ret = rtw89_h2c_tx(rtwdev, skb, false);
5204 rtw89_err(rtwdev, "failed to send h2c\n");
5215 int rtw89_fw_h2c_cxdrv_role_v7(struct rtw89_dev *rtwdev, u8 type)
5217 struct rtw89_btc *btc = &rtwdev->btc;
5224 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5226 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
5243 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5248 ret = rtw89_h2c_tx(rtwdev, skb, false);
5250 rtw89_err(rtwdev, "failed to send h2c\n");
5261 int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type)
5263 struct rtw89_btc *btc = &rtwdev->btc;
5270 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5272 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
5286 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5291 ret = rtw89_h2c_tx(rtwdev, skb, false);
5293 rtw89_err(rtwdev, "failed to send h2c\n");
5304 int rtw89_fw_h2c_cxdrv_osi_info(struct rtw89_dev *rtwdev, u8 type)
5306 struct rtw89_btc *btc = &rtwdev->btc;
5313 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5315 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_osi\n");
5326 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5331 ret = rtw89_h2c_tx(rtwdev, skb, false);
5333 rtw89_err(rtwdev, "failed to send h2c\n");
5345 int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type)
5347 struct rtw89_btc *btc = &rtwdev->btc;
5354 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_CXDRVINFO_CTRL);
5356 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
5371 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5376 ret = rtw89_h2c_tx(rtwdev, skb, false);
5378 rtw89_err(rtwdev, "failed to send h2c\n");
5389 int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type)
5391 struct rtw89_btc *btc = &rtwdev->btc;
5398 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5400 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl_v7\n");
5411 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5415 ret = rtw89_h2c_tx(rtwdev, skb, false);
5417 rtw89_err(rtwdev, "failed to send h2c\n");
5429 int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type)
5431 struct rtw89_btc *btc = &rtwdev->btc;
5437 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_CXDRVINFO_TRX);
5439 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_trx\n");
5466 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5471 ret = rtw89_h2c_tx(rtwdev, skb, false);
5473 rtw89_err(rtwdev, "failed to send h2c\n");
5485 int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type)
5487 struct rtw89_btc *btc = &rtwdev->btc;
5494 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_CXDRVINFO_RFK);
5496 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
5511 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5516 ret = rtw89_h2c_tx(rtwdev, skb, false);
5518 rtw89_err(rtwdev, "failed to send h2c\n");
5530 int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id)
5532 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
5538 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_PKT_OFLD);
5540 rtw89_err(rtwdev, "failed to alloc skb for h2c pkt offload\n");
5549 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5556 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
5558 rtw89_debug(rtwdev, RTW89_DBG_FW,
5564 rtw89_core_release_bit_map(rtwdev->pkt_offload, id);
5568 int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id,
5571 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
5578 alloc_id = rtw89_core_acquire_bit_map(rtwdev->pkt_offload,
5585 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_PKT_OFLD + skb_ofld->len);
5587 rtw89_err(rtwdev, "failed to alloc skb for h2c pkt offload\n");
5588 rtw89_core_release_bit_map(rtwdev->pkt_offload, alloc_id);
5599 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5606 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
5608 rtw89_debug(rtwdev, RTW89_DBG_FW,
5611 rtw89_core_release_bit_map(rtwdev->pkt_offload, alloc_id);
5619 int rtw89_fw_h2c_scan_list_offload_ax(struct rtw89_dev *rtwdev, int ch_num,
5622 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
5623 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
5635 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, skb_len);
5637 rtw89_err(rtwdev, "failed to alloc skb for h2c scan list\n");
5680 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5686 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
5688 rtw89_debug(rtwdev, RTW89_DBG_FW, "failed to add scan ofld ch\n");
5696 int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
5700 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
5713 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, skb_len);
5715 rtw89_err(rtwdev, "failed to alloc skb for h2c scan list\n");
5719 if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V0, &rtwdev->fw))
5788 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5794 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
5796 rtw89_debug(rtwdev, RTW89_DBG_FW, "failed to add scan ofld ch\n");
5803 int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
5808 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
5809 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
5810 struct rtw89_chan *op = &rtwdev->scan_info.op_chan;
5819 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5821 rtw89_err(rtwdev, "failed to alloc skb for h2c scan offload\n");
5828 ret = rtw89_mac_port_get_tsf(rtwdev, rtwvif_link, &tsf);
5830 rtw89_warn(rtwdev, "NLO failed to get port tsf: %d\n", ret);
5872 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
5882 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
5884 rtw89_debug(rtwdev, RTW89_DBG_FW, "failed to scan ofld\n");
5891 static void rtw89_scan_get_6g_disabled_chan(struct rtw89_dev *rtwdev,
5898 sband = rtwdev->hw->wiphy->bands[NL80211_BAND_6GHZ];
5913 int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
5919 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
5921 struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
5961 rtw89_scan_get_6g_disabled_chan(rtwdev, option);
5963 if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw)) {
5969 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
5971 rtw89_err(rtwdev, "failed to alloc skb for h2c scan offload\n");
5981 if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V0, &rtwdev->fw))
6098 le32_encode_bits(rtw89_is_mlo_1_1(rtwdev) ? 1 : 2,
6121 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6131 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
6133 rtw89_debug(rtwdev, RTW89_DBG_FW, "failed to scan be ofld\n");
6140 int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
6149 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6151 rtw89_err(rtwdev, "failed to alloc skb for h2c rf reg\n");
6156 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6160 ret = rtw89_h2c_tx(rtwdev, skb, false);
6162 rtw89_err(rtwdev, "failed to send h2c\n");
6173 int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev)
6175 struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;
6184 if (RTW89_CHK_FW_FEATURE(RFK_NTFY_MCC_V0, &rtwdev->fw)) {
6189 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6191 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_ctrl\n");
6214 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6219 ret = rtw89_h2c_tx(rtwdev, skb, false);
6221 rtw89_err(rtwdev, "failed to send h2c\n");
6233 int rtw89_fw_h2c_mcc_dig(struct rtw89_dev *rtwdev,
6237 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
6238 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
6244 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6246 rtw89_err(rtwdev, "failed to alloc skb for h2c mcc_dig\n");
6269 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6273 ret = rtw89_h2c_tx(rtwdev, skb, false);
6275 rtw89_err(rtwdev, "failed to send h2c\n");
6286 int rtw89_fw_h2c_rf_ps_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
6288 const struct rtw89_chip_info *chip = rtwdev->chip;
6302 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6304 rtw89_err(rtwdev, "failed to alloc skb for h2c rf ps info\n");
6309 h2c->mlo_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
6312 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
6313 path = rtw89_phy_get_syn_sel(rtwdev, rtwvif_link->phy_idx);
6314 val = rtw89_chip_chan_to_rf18_val(rtwdev, chan);
6317 rtw89_err(rtwdev, "unsupported rf path (%d)\n", path);
6326 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6331 ret = rtw89_h2c_tx(rtwdev, skb, false);
6333 rtw89_err(rtwdev, "failed to send h2c\n");
6345 int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
6348 struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
6361 if (RTW89_CHK_FW_FEATURE(RFK_PRE_NOTIFY_V1, &rtwdev->fw)) {
6364 } else if (RTW89_CHK_FW_FEATURE(RFK_PRE_NOTIFY_V0, &rtwdev->fw)) {
6369 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6371 rtw89_err(rtwdev, "failed to alloc skb for h2c rfk_pre_ntfy\n");
6378 common->mlo_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
6416 val32 = rtw89_phy_read32_mask(rtwdev, R_COEF_SEL, B_COEF_SEL_IQC_V1);
6418 val32 = rtw89_phy_read32_mask(rtwdev, R_COEF_SEL_C1, B_COEF_SEL_IQC_V1);
6420 val32 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
6422 val32 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CFGCH, RFREG_MASK);
6425 if (rtw89_is_mlo_1_1(rtwdev))
6428 h2c_v0->rfe_type = cpu_to_le32(rtwdev->efuse.rfe_type);
6433 if (rtw89_is_mlo_1_1(rtwdev)) {
6438 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6443 ret = rtw89_h2c_tx(rtwdev, skb, false);
6445 rtw89_err(rtwdev, "failed to send h2c\n");
6456 int rtw89_fw_h2c_rf_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
6459 struct rtw89_efuse *efuse = &rtwdev->efuse;
6460 struct rtw89_hal *hal = &rtwdev->hal;
6466 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6468 rtw89_err(rtwdev, "failed to alloc skb for h2c RF TSSI\n");
6484 rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de(rtwdev, phy_idx, chan, h2c);
6485 rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl(rtwdev, phy_idx, chan, h2c);
6487 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6491 ret = rtw89_h2c_tx(rtwdev, skb, false);
6493 rtw89_err(rtwdev, "failed to send h2c\n");
6504 int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
6507 struct rtw89_hal *hal = &rtwdev->hal;
6515 if (RTW89_CHK_FW_FEATURE(RFK_IQK_V0, &rtwdev->fw)) {
6520 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6522 rtw89_err(rtwdev, "failed to alloc skb for h2c RF IQK\n");
6531 h2c_v0->dbcc = cpu_to_le32(rtwdev->dbcc_en);
6541 h2c->kpath = rtw89_phy_get_kpath(rtwdev, phy_idx);
6548 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6552 ret = rtw89_h2c_tx(rtwdev, skb, false);
6554 rtw89_err(rtwdev, "failed to send h2c\n");
6565 int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
6573 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6575 rtw89_err(rtwdev, "failed to alloc skb for h2c RF DPK\n");
6588 h2c->dpk_dbg_en = rtw89_debug_is_enabled(rtwdev, RTW89_DBG_RFK);
6590 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6594 ret = rtw89_h2c_tx(rtwdev, skb, false);
6596 rtw89_err(rtwdev, "failed to send h2c\n");
6607 int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
6610 struct rtw89_hal *hal = &rtwdev->hal;
6616 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6618 rtw89_err(rtwdev, "failed to alloc skb for h2c RF TXGAPK\n");
6633 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6637 ret = rtw89_h2c_tx(rtwdev, skb, false);
6639 rtw89_err(rtwdev, "failed to send h2c\n");
6650 int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
6658 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6660 rtw89_err(rtwdev, "failed to alloc skb for h2c RF DACK\n");
6670 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6674 ret = rtw89_h2c_tx(rtwdev, skb, false);
6676 rtw89_err(rtwdev, "failed to send h2c\n");
6687 int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
6697 if (RTW89_CHK_FW_FEATURE(RFK_RXDCK_V0, &rtwdev->fw)) {
6702 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6704 rtw89_err(rtwdev, "failed to alloc skb for h2c RF RXDCK\n");
6717 v0->rxdck_dbg_en = rtw89_debug_is_enabled(rtwdev, RTW89_DBG_RFK);
6726 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6730 ret = rtw89_h2c_tx(rtwdev, skb, false);
6732 rtw89_err(rtwdev, "failed to send h2c\n");
6743 int rtw89_fw_h2c_rf_tas_trigger(struct rtw89_dev *rtwdev, bool enable)
6750 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6752 rtw89_err(rtwdev, "failed to alloc skb for h2c RF TAS\n");
6760 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6764 ret = rtw89_h2c_tx(rtwdev, skb, false);
6766 rtw89_err(rtwdev, "failed to send h2c\n");
6777 int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
6784 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
6786 rtw89_err(rtwdev, "failed to alloc skb for raw with hdr\n");
6791 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
6795 ret = rtw89_h2c_tx(rtwdev, skb, false);
6797 rtw89_err(rtwdev, "failed to send h2c\n");
6808 int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len)
6813 skb = rtw89_fw_h2c_alloc_skb_no_hdr(rtwdev, len);
6815 rtw89_err(rtwdev, "failed to alloc skb for h2c raw\n");
6820 ret = rtw89_h2c_tx(rtwdev, skb, false);
6822 rtw89_err(rtwdev, "failed to send h2c\n");
6833 void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev)
6837 lockdep_assert_wiphy(rtwdev->hw->wiphy);
6839 list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list) {
6840 rtw89_fw_h2c_raw(rtwdev, early_h2c->h2c, early_h2c->h2c_len);
6844 void __rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev)
6848 list_for_each_entry_safe(early_h2c, tmp, &rtwdev->early_h2c_list, list) {
6855 void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev)
6857 lockdep_assert_wiphy(rtwdev->hw->wiphy);
6859 __rtw89_fw_free_all_early_h2c(rtwdev);
6873 static bool rtw89_fw_c2h_chk_atomic(struct rtw89_dev *rtwdev,
6885 return rtw89_mac_c2h_chk_atomic(rtwdev, c2h, class, func);
6887 return rtw89_phy_c2h_chk_atomic(rtwdev, class, func);
6891 void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h)
6894 if (!rtw89_fw_c2h_chk_atomic(rtwdev, c2h))
6897 rtw89_fw_c2h_cmd_handle(rtwdev, c2h);
6902 skb_queue_tail(&rtwdev->c2h_queue, c2h);
6903 wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->c2h_work);
6906 static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
6916 if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags))
6923 rtw89_mac_c2h_handle(rtwdev, skb, len, class, func);
6931 rtw89_btc_c2h_handle(rtwdev, skb, len, class, func);
6933 rtw89_phy_c2h_handle(rtwdev, skb, len, class, func);
6938 rtw89_hex_dump(rtwdev, RTW89_DBG_FW, "C2H: ", skb->data, skb->len);
6943 struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
6949 lockdep_assert_wiphy(rtwdev->hw->wiphy);
6953 spin_lock_irqsave(&rtwdev->c2h_queue.lock, flags);
6954 skb_queue_splice_init(&rtwdev->c2h_queue, &c2hq);
6955 spin_unlock_irqrestore(&rtwdev->c2h_queue.lock, flags);
6958 rtw89_fw_c2h_cmd_handle(rtwdev, skb);
6963 void rtw89_fw_c2h_purge_obsoleted_scan_events(struct rtw89_dev *rtwdev)
6965 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
6970 lockdep_assert_wiphy(rtwdev->hw->wiphy);
6974 spin_lock_irqsave(&rtwdev->c2h_queue.lock, flags);
6975 skb_queue_splice_init(&rtwdev->c2h_queue, &c2hq);
6976 spin_unlock_irqrestore(&rtwdev->c2h_queue.lock, flags);
6984 rtw89_debug(rtwdev, RTW89_DBG_HW_SCAN,
6992 spin_lock_irqsave(&rtwdev->c2h_queue.lock, flags);
6993 skb_queue_splice(&c2hq, &rtwdev->c2h_queue);
6994 spin_unlock_irqrestore(&rtwdev->c2h_queue.lock, flags);
6997 static int rtw89_fw_write_h2c_reg(struct rtw89_dev *rtwdev,
7000 const struct rtw89_chip_info *chip = rtwdev->chip;
7001 struct rtw89_fw_info *fw_info = &rtwdev->fw;
7007 rtwdev, chip->h2c_ctrl_reg);
7009 rtw89_warn(rtwdev, "FW does not process h2c registers\n");
7020 rtw89_write32(rtwdev, h2c_reg[i], info->u.h2creg[i]);
7023 rtw89_write8_mask(rtwdev, chip->h2c_counter_reg.addr,
7025 rtw89_write8(rtwdev, chip->h2c_ctrl_reg, B_AX_H2CREG_TRIGGER);
7030 static int rtw89_fw_read_c2h_reg(struct rtw89_dev *rtwdev,
7033 const struct rtw89_chip_info *chip = rtwdev->chip;
7034 struct rtw89_fw_info *fw_info = &rtwdev->fw;
7042 if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
7048 timeout, false, rtwdev,
7051 rtw89_warn(rtwdev, "c2h reg timeout\n");
7056 info->u.c2hreg[i] = rtw89_read32(rtwdev, c2h_reg[i]);
7058 rtw89_write8(rtwdev, chip->c2h_ctrl_reg, 0);
7066 rtw89_write8_mask(rtwdev, chip->c2h_counter_reg.addr,
7072 int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
7079 lockdep_assert_wiphy(rtwdev->hw->wiphy);
7087 ret = rtw89_fw_write_h2c_reg(rtwdev, h2c_info);
7095 ret = rtw89_fw_read_c2h_reg(rtwdev, c2h_info);
7102 void rtw89_fw_st_dbg_dump(struct rtw89_dev *rtwdev)
7104 if (!test_bit(RTW89_FLAG_POWERON, rtwdev->flags)) {
7105 rtw89_err(rtwdev, "[ERR]pwr is off\n");
7109 rtw89_info(rtwdev, "FW status = 0x%x\n", rtw89_read32(rtwdev, R_AX_UDM0));
7110 rtw89_info(rtwdev, "FW BADADDR = 0x%x\n", rtw89_read32(rtwdev, R_AX_UDM1));
7111 rtw89_info(rtwdev, "FW EPC/RA = 0x%x\n", rtw89_read32(rtwdev, R_AX_UDM2));
7112 rtw89_info(rtwdev, "FW MISC = 0x%x\n", rtw89_read32(rtwdev, R_AX_UDM3));
7113 rtw89_info(rtwdev, "R_AX_HALT_C2H = 0x%x\n",
7114 rtw89_read32(rtwdev, R_AX_HALT_C2H));
7115 rtw89_info(rtwdev, "R_AX_SER_DBG_INFO = 0x%x\n",
7116 rtw89_read32(rtwdev, R_AX_SER_DBG_INFO));
7118 rtw89_fw_prog_cnt_dump(rtwdev);
7121 static void rtw89_hw_scan_release_pkt_list(struct rtw89_dev *rtwdev)
7123 struct list_head *pkt_list = rtwdev->scan_info.pkt_list;
7128 if (!(rtwdev->chip->support_bands & BIT(idx)))
7132 if (test_bit(info->id, rtwdev->pkt_offload))
7133 rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id);
7140 static void rtw89_hw_scan_cleanup(struct rtw89_dev *rtwdev,
7143 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
7144 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7147 mac->free_chan_list(rtwdev);
7148 rtw89_hw_scan_release_pkt_list(rtwdev);
7158 static bool rtw89_is_6ghz_wildcard_probe_req(struct rtw89_dev *rtwdev,
7177 static int rtw89_append_probe_req_ie(struct rtw89_dev *rtwdev,
7181 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7191 if (!(rtwdev->chip->support_bands & BIT(band)))
7209 rtw89_is_6ghz_wildcard_probe_req(rtwdev, req, info, band, ssid_idx);
7211 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, new);
7225 static int rtw89_hw_scan_update_probe_req(struct rtw89_dev *rtwdev,
7236 skb = ieee80211_probereq_get(rtwdev->hw, mac_addr,
7243 ret = rtw89_append_probe_req_ie(rtwdev, rtwvif_link, skb, i);
7253 static int rtw89_update_6ghz_rnr_chan_ax(struct rtw89_dev *rtwdev,
7258 struct rtw89_vif_link *rtwvif_link = rtwdev->scan_info.scanning_vif;
7259 struct list_head *pkt_list = rtwdev->scan_info.pkt_list;
7288 skb = ieee80211_probereq_get(rtwdev->hw, rtwvif_link->mac_addr,
7305 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb);
7314 list_add_tail(&info->list, &rtwdev->scan_info.pkt_list[NL80211_BAND_6GHZ]);
7326 static void rtw89_pno_scan_add_chan_ax(struct rtw89_dev *rtwdev,
7330 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
7371 rtw89_err(rtwdev, "Channel type out of bound\n");
7375 static void rtw89_hw_scan_add_chan_ax(struct rtw89_dev *rtwdev, int chan_type,
7379 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7380 struct rtw89_vif_link *rtwvif_link = rtwdev->scan_info.scanning_vif;
7385 struct rtw89_chan *op = &rtwdev->scan_info.op_chan;
7409 ret = rtw89_update_6ghz_rnr_chan_ax(rtwdev, ies, req, ch_info);
7411 rtw89_warn(rtwdev, "RNR fails: %d\n", ret);
7462 rtw89_err(rtwdev, "Channel type out of bound\n");
7466 static void rtw89_pno_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,
7470 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
7499 rtw89_warn(rtwdev, "Channel type out of bound\n");
7504 static void rtw89_hw_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,
7508 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7509 struct rtw89_vif_link *rtwvif_link = rtwdev->scan_info.scanning_vif;
7563 rtw89_warn(rtwdev, "Channel type out of bound\n");
7568 int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
7571 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
7604 rtw89_pno_scan_add_chan_ax(rtwdev, type, nd_config->n_match_sets, ch_info);
7607 ret = rtw89_fw_h2c_scan_list_offload_ax(rtwdev, list_len, &chan_list);
7618 static int rtw89_hw_scan_add_op_types_ax(struct rtw89_dev *rtwdev,
7646 rtw89_hw_scan_add_chan_ax(rtwdev, type, 0, tmp);
7652 int rtw89_hw_scan_prep_chan_list_ax(struct rtw89_dev *rtwdev,
7655 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7699 rtw89_hw_scan_add_chan_ax(rtwdev, type, req->n_ssids, ch_info);
7705 ret = rtw89_hw_scan_add_op_types_ax(rtwdev, RTW89_CHAN_OPERATE,
7715 ret = rtw89_hw_scan_add_op_types_ax(rtwdev, RTW89_CHAN_EXTRA_OP,
7739 void rtw89_hw_scan_free_chan_list_ax(struct rtw89_dev *rtwdev)
7741 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7750 int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
7753 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7776 ret = rtw89_fw_h2c_scan_list_offload_ax(rtwdev, list_len, &list);
7786 int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
7789 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
7822 rtw89_pno_scan_add_chan_be(rtwdev, type,
7827 ret = rtw89_fw_h2c_scan_list_offload_be(rtwdev, list_len, &chan_list,
7839 int rtw89_hw_scan_prep_chan_list_be(struct rtw89_dev *rtwdev,
7842 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7855 chan_by_rnr = rtwdev->chip->support_rnr &&
7891 rtw89_hw_scan_add_chan_be(rtwdev, type, req->n_ssids, ch_info);
7908 void rtw89_hw_scan_free_chan_list_be(struct rtw89_dev *rtwdev)
7910 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7919 int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
7922 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
7938 ret = rtw89_fw_h2c_scan_list_offload_be(rtwdev, list_len, &list,
7949 static int rtw89_hw_scan_prehandle(struct rtw89_dev *rtwdev,
7953 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
7956 ret = rtw89_hw_scan_update_probe_req(rtwdev, rtwvif_link, mac_addr);
7958 rtw89_err(rtwdev, "Update probe request failed\n");
7961 ret = mac->prep_chan_list(rtwdev, rtwvif_link);
7966 static void rtw89_hw_scan_update_link_beacon_noa(struct rtw89_dev *rtwdev,
7984 if (rtwdev->chip->chip_gen == RTW89_CHIP_AX)
7985 rtwdev->scan_info.delay = ieee80211_tu_to_usec(beacon_int * 3) / 1000;
7987 ret = rtw89_mac_port_get_tsf(rtwdev, rtwvif_link, &tsf);
7989 rtw89_warn(rtwdev, "%s: failed to get tsf\n", __func__);
7994 if (rtwdev->chip->chip_gen == RTW89_CHIP_AX) {
8008 rtw89_chip_h2c_update_beacon(rtwdev, rtwvif_link);
8011 static void rtw89_hw_scan_update_beacon_noa(struct rtw89_dev *rtwdev, bool scan)
8013 const struct rtw89_entity_mgnt *mgnt = &rtwdev->hal.entity_mgnt;
8014 const struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
8015 const struct rtw89_chip_info *chip = rtwdev->chip;
8024 lockdep_assert_wiphy(rtwdev->hw->wiphy);
8040 rtw89_warn(rtwdev, "%s: invalid chip gen %d\n",
8047 rtw89_debug(rtwdev, RTW89_DBG_HW_SCAN,
8061 rtw89_hw_scan_update_link_beacon_noa(rtwdev, rtwvif_link,
8066 static void rtw89_hw_scan_set_extra_op_info(struct rtw89_dev *rtwdev,
8070 struct rtw89_entity_mgnt *mgnt = &rtwdev->hal.entity_mgnt;
8071 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
8076 if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_EXTRA_OP, &rtwdev->fw))
8088 rtw89_debug(rtwdev, RTW89_DBG_HW_SCAN,
8093 tmp_chan = rtw89_chan_get(rtwdev, tmp_link->chanctx_idx);
8102 rtw89_debug(rtwdev, RTW89_DBG_HW_SCAN,
8109 int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
8113 enum rtw89_entity_mode mode = rtw89_get_entity_mode(rtwdev);
8115 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
8122 u32 rx_fltr = rtwdev->hal.rx_fltr;
8127 rtwdev->scan_info.op_chan = *chan;
8129 rtw89_debug(rtwdev, RTW89_DBG_HW_SCAN,
8133 rtw89_hw_scan_set_extra_op_info(rtwdev, rtwvif, chan);
8135 rtwdev->scan_info.connected = rtw89_is_any_vif_connected_or_connecting(rtwdev);
8136 rtwdev->scan_info.scanning_vif = rtwvif_link;
8137 rtwdev->scan_info.abort = false;
8138 rtwdev->scan_info.delay = 0;
8148 ret = rtw89_hw_scan_prehandle(rtwdev, rtwvif_link, mac_addr);
8150 rtw89_hw_scan_cleanup(rtwdev, rtwvif_link);
8154 ieee80211_stop_queues(rtwdev->hw);
8155 rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif_link, false);
8157 rtw89_core_scan_start(rtwdev, rtwvif_link, mac_addr, true);
8163 rtw89_mac_set_rx_fltr(rtwdev, rtwvif_link->mac_idx, rx_fltr);
8165 rtw89_chanctx_pause(rtwdev, &pause_parm);
8166 rtw89_phy_dig_suspend(rtwdev);
8169 rtw89_hw_scan_update_beacon_noa(rtwdev, true);
8179 static int rtw89_hw_scan_complete_cb(struct rtw89_dev *rtwdev, void *data)
8181 enum rtw89_entity_mode mode = rtw89_get_entity_mode(rtwdev);
8191 rtw89_mac_set_rx_fltr(rtwdev, rtwvif_link->mac_idx, rtwdev->hal.rx_fltr);
8193 rtw89_core_scan_complete(rtwdev, rtwvif_link, true);
8194 ieee80211_scan_completed(rtwdev->hw, &info);
8195 ieee80211_wake_queues(rtwdev->hw);
8196 rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif_link, true);
8197 rtw89_mac_enable_beacon_for_ap_vifs(rtwdev, true);
8198 rtw89_phy_dig_resume(rtwdev, true);
8200 rtw89_hw_scan_cleanup(rtwdev, rtwvif_link);
8203 rtw89_hw_scan_update_beacon_noa(rtwdev, false);
8208 void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev,
8226 rtw89_chanctx_proceed(rtwdev, &cb_parm);
8229 void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev,
8232 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
8237 ret = rtw89_hw_scan_offload(rtwdev, rtwvif_link, false);
8239 rtw89_warn(rtwdev, "rtw89_hw_scan_offload failed ret %d\n", ret);
8246 rtw89_hw_scan_complete(rtwdev, rtwvif_link, true);
8249 static bool rtw89_is_any_vif_connected_or_connecting(struct rtw89_dev *rtwdev)
8255 rtw89_for_each_rtwvif(rtwdev, rtwvif) {
8266 int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev,
8270 const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
8271 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
8280 connected = rtwdev->scan_info.connected;
8283 opt.delay = rtwdev->scan_info.delay;
8285 ret = mac->add_chan_list(rtwdev, rtwvif_link);
8290 if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) {
8295 opt.mlo_mode = rtwdev->mlo_dbcc_mode;
8303 ret = rtw89_mac_scan_offload(rtwdev, &opt, rtwvif_link, false);
8311 int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev)
8319 if (RTW89_CHK_FW_FEATURE(CRASH_TRIGGER_TYPE_1, &rtwdev->fw))
8321 else if (RTW89_CHK_FW_FEATURE(CRASH_TRIGGER_TYPE_0, &rtwdev->fw))
8326 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8328 rtw89_err(rtwdev,
8339 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8345 ret = rtw89_h2c_tx(rtwdev, skb, false);
8347 rtw89_err(rtwdev, "failed to send h2c\n");
8356 int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
8362 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_PKT_DROP_LEN);
8364 rtw89_err(rtwdev,
8377 rtw89_debug(rtwdev, RTW89_DBG_FW,
8399 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8405 ret = rtw89_h2c_tx(rtwdev, skb, false);
8407 rtw89_err(rtwdev, "failed to send h2c\n");
8419 int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
8427 ret = rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
8434 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_KEEP_ALIVE_LEN);
8436 rtw89_err(rtwdev, "failed to alloc skb for keep alive\n");
8447 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8453 ret = rtw89_h2c_tx(rtwdev, skb, false);
8455 rtw89_err(rtwdev, "failed to send h2c\n");
8467 int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
8477 ret = rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
8484 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8486 rtw89_err(rtwdev, "failed to alloc skb for arp offload\n");
8498 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8504 ret = rtw89_h2c_tx(rtwdev, skb, false);
8506 rtw89_err(rtwdev, "failed to send h2c\n");
8519 int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev,
8522 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
8527 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_DISCONNECT_DETECT_LEN);
8529 rtw89_err(rtwdev, "failed to alloc skb for keep alive\n");
8543 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8549 ret = rtw89_h2c_tx(rtwdev, skb, false);
8551 rtw89_err(rtwdev, "failed to send h2c\n");
8563 int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
8566 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
8573 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8575 rtw89_err(rtwdev, "failed to alloc skb for nlo\n");
8595 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8601 ret = rtw89_h2c_tx(rtwdev, skb, false);
8603 rtw89_err(rtwdev, "failed to send h2c\n");
8614 int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
8617 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
8624 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8626 rtw89_err(rtwdev, "failed to alloc skb for wow global\n");
8641 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8647 ret = rtw89_h2c_tx(rtwdev, skb, false);
8649 rtw89_err(rtwdev, "failed to send h2c\n");
8662 int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
8666 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
8671 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_WAKEUP_CTRL_LEN);
8673 rtw89_err(rtwdev, "failed to alloc skb for wakeup ctrl\n");
8688 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8694 ret = rtw89_h2c_tx(rtwdev, skb, false);
8696 rtw89_err(rtwdev, "failed to send h2c\n");
8709 int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
8715 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_WOW_CAM_UPD_LEN);
8717 rtw89_err(rtwdev, "failed to alloc skb for keep alive\n");
8741 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8747 ret = rtw89_h2c_tx(rtwdev, skb, false);
8749 rtw89_err(rtwdev, "failed to send h2c\n");
8760 int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
8764 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
8777 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8779 rtw89_err(rtwdev, "failed to alloc skb for gtk ofld\n");
8789 ret = rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
8796 ret = rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif_link,
8817 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8823 ret = rtw89_h2c_tx(rtwdev, skb, false);
8825 rtw89_err(rtwdev, "failed to send h2c\n");
8835 int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
8838 struct rtw89_wait_info *wait = &rtwdev->mac.ps_wait;
8843 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8845 rtw89_err(rtwdev, "failed to alloc skb for fw ips\n");
8854 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8860 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, RTW89_PS_WAIT_COND_IPS_CFG);
8863 int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev)
8865 struct rtw89_wait_info *wait = &rtwdev->wow.wait;
8870 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
8872 rtw89_err(rtwdev, "failed to alloc skb for aoac\n");
8881 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8887 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, RTW89_WOW_WAIT_COND_AOAC);
8895 static int rtw89_h2c_tx_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb,
8901 lockdep_assert_wiphy(rtwdev->hw->wiphy);
8907 ret = rtw89_h2c_tx(rtwdev, skb, false);
8909 rtw89_err(rtwdev, "failed to send h2c\n");
8915 if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags)) {
8925 int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev,
8928 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
8932 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_ADD_MCC_LEN);
8934 rtw89_err(rtwdev,
8961 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
8968 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
8972 int rtw89_fw_h2c_start_mcc(struct rtw89_dev *rtwdev,
8975 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
8979 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_START_MCC_LEN);
8981 rtw89_err(rtwdev,
8997 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9004 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9008 int rtw89_fw_h2c_stop_mcc(struct rtw89_dev *rtwdev, u8 group, u8 macid,
9011 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9015 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_STOP_MCC_LEN);
9017 rtw89_err(rtwdev,
9027 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9034 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9038 int rtw89_fw_h2c_del_mcc_group(struct rtw89_dev *rtwdev, u8 group,
9041 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9045 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_DEL_MCC_GROUP_LEN);
9047 rtw89_err(rtwdev,
9056 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9063 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9067 int rtw89_fw_h2c_reset_mcc_group(struct rtw89_dev *rtwdev, u8 group)
9069 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9073 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_RESET_MCC_GROUP_LEN);
9075 rtw89_err(rtwdev,
9083 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9090 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9094 int rtw89_fw_h2c_mcc_req_tsf(struct rtw89_dev *rtwdev,
9098 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9104 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_MCC_REQ_TSF_LEN);
9106 rtw89_err(rtwdev,
9116 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9123 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9134 int rtw89_fw_h2c_mcc_macid_bitmap(struct rtw89_dev *rtwdev, u8 group, u8 macid,
9137 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9146 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, h2c_len);
9148 rtw89_err(rtwdev,
9159 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9166 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9170 int rtw89_fw_h2c_mcc_sync(struct rtw89_dev *rtwdev, u8 group, u8 source,
9173 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9177 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_MCC_SYNC_LEN);
9179 rtw89_err(rtwdev,
9190 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9197 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9201 int rtw89_fw_h2c_mcc_set_duration(struct rtw89_dev *rtwdev,
9204 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9208 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_MCC_SET_DURATION_LEN);
9210 rtw89_err(rtwdev,
9228 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9235 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9239 u32 rtw89_fw_h2c_mrc_add_slot(struct rtw89_dev *rtwdev,
9299 int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev,
9311 len += rtw89_fw_h2c_mrc_add_slot(rtwdev, &arg->slots[i], NULL);
9313 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9315 rtw89_err(rtwdev, "failed to alloc skb for mrc add\n");
9334 tmp += rtw89_fw_h2c_mrc_add_slot(rtwdev, &arg->slots[i], tmp);
9336 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9342 ret = rtw89_h2c_tx(rtwdev, skb, false);
9344 rtw89_err(rtwdev, "failed to send h2c\n");
9352 int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
9355 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9361 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9363 rtw89_err(rtwdev, "failed to alloc skb for mrc start\n");
9380 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9387 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9390 int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx)
9392 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9398 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9400 rtw89_err(rtwdev, "failed to alloc skb for mrc del\n");
9410 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9417 return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9420 int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev,
9424 struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
9433 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9435 rtw89_err(rtwdev, "failed to alloc skb for mrc req tsf\n");
9450 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9456 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, RTW89_MRC_WAIT_COND_REQ_TSF);
9466 int rtw89_fw_h2c_mrc_upd_bitmap(struct rtw89_dev *rtwdev,
9474 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9476 rtw89_err(rtwdev, "failed to alloc skb for mrc upd bitmap\n");
9492 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9498 ret = rtw89_h2c_tx(rtwdev, skb, false);
9500 rtw89_err(rtwdev, "failed to send h2c\n");
9508 int rtw89_fw_h2c_mrc_sync(struct rtw89_dev *rtwdev,
9516 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9518 rtw89_err(rtwdev, "failed to alloc skb for mrc sync\n");
9536 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9542 ret = rtw89_h2c_tx(rtwdev, skb, false);
9544 rtw89_err(rtwdev, "failed to send h2c\n");
9552 int rtw89_fw_h2c_mrc_upd_duration(struct rtw89_dev *rtwdev,
9562 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9564 rtw89_err(rtwdev, "failed to alloc skb for mrc upd duration\n");
9589 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9595 ret = rtw89_h2c_tx(rtwdev, skb, false);
9597 rtw89_err(rtwdev, "failed to send h2c\n");
9605 static int rtw89_fw_h2c_ap_info(struct rtw89_dev *rtwdev, bool en)
9612 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9614 rtw89_err(rtwdev, "failed to alloc skb for ap info\n");
9623 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9629 ret = rtw89_h2c_tx(rtwdev, skb, false);
9631 rtw89_err(rtwdev, "failed to send h2c\n");
9639 int rtw89_fw_h2c_ap_info_refcount(struct rtw89_dev *rtwdev, bool en)
9644 if (refcount_inc_not_zero(&rtwdev->refcount_ap_info))
9647 if (!refcount_dec_and_test(&rtwdev->refcount_ap_info))
9651 ret = rtw89_fw_h2c_ap_info(rtwdev, en);
9653 if (!test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags))
9661 rtw89_warn(rtwdev, "h2c ap_info failed during SER\n");
9665 refcount_set(&rtwdev->refcount_ap_info, 1);
9670 int rtw89_fw_h2c_mlo_link_cfg(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
9673 struct rtw89_wait_info *wait = &rtwdev->mlo.wait;
9681 skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
9683 rtw89_err(rtwdev, "failed to alloc skb for mlo link cfg\n");
9693 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
9701 ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
9703 rtw89_err(rtwdev, "mlo link cfg (%s link id %u) failed: %d\n",
9774 void rtw89_fw_load_txpwr_byrate(struct rtw89_dev *rtwdev,
9790 byr_head = &rtwdev->byr[entry.band][entry.bw];
9798 byr = rtw89_phy_raw_byr_seek(rtwdev, byr_head, &desc);
10098 static bool rtw89_fw_has_da_txpwr_table(struct rtw89_dev *rtwdev,
10101 const struct rtw89_chip_info *chip = rtwdev->chip;
10119 rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev,
10122 struct rtw89_rfe_data *rfe_data = rtwdev->rfe_data;
10209 parms->has_da = rtw89_fw_has_da_txpwr_table(rtwdev, parms);