The branch stable/14 has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=3de0d1929d19d519d8c14b4b15186ad3f9e0d2b7

commit 3de0d1929d19d519d8c14b4b15186ad3f9e0d2b7
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2024-09-24 23:50:22 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2025-02-10 14:52:07 +0000

    rtw88: update Realtek's rtw88 driver.
    
    This version is based on
    git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
    98f7e32f20d28ec452afb208f9cffc08448a2652 ( tag: v6.11 ).
    
    Sponsored by:   The FreeBSD Foundation
    
    (cherry picked from commit 11c53278a8a3e86e14377f09bbaa7bad193d3713)
---
 sys/contrib/dev/rtw88/Makefile          |    9 +
 sys/contrib/dev/rtw88/coex.c            |    4 +-
 sys/contrib/dev/rtw88/debug.c           |   54 +-
 sys/contrib/dev/rtw88/debug.h           |   23 +-
 sys/contrib/dev/rtw88/fw.c              |   92 +-
 sys/contrib/dev/rtw88/fw.h              |    5 +
 sys/contrib/dev/rtw88/mac.c             |   27 +-
 sys/contrib/dev/rtw88/mac80211.c        |   12 +-
 sys/contrib/dev/rtw88/main.c            |   25 +-
 sys/contrib/dev/rtw88/main.h            |   27 +-
 sys/contrib/dev/rtw88/pci.c             |   28 +-
 sys/contrib/dev/rtw88/pci.h             |    2 +-
 sys/contrib/dev/rtw88/phy.c             |    3 +
 sys/contrib/dev/rtw88/ps.c              |    2 +
 sys/contrib/dev/rtw88/reg.h             |   27 +
 sys/contrib/dev/rtw88/regd.c            |   24 +-
 sys/contrib/dev/rtw88/regd.h            |    2 +
 sys/contrib/dev/rtw88/rtw8703b.c        | 2122 +++++++++++++++++++++++++++++++
 sys/contrib/dev/rtw88/rtw8703b.h        |  102 ++
 sys/contrib/dev/rtw88/rtw8703b_tables.c |  902 +++++++++++++
 sys/contrib/dev/rtw88/rtw8703b_tables.h |   14 +
 sys/contrib/dev/rtw88/rtw8723cs.c       |   34 +
 sys/contrib/dev/rtw88/rtw8723d.c        |  674 +---------
 sys/contrib/dev/rtw88/rtw8723d.h        |  268 +---
 sys/contrib/dev/rtw88/rtw8723x.c        |  724 +++++++++++
 sys/contrib/dev/rtw88/rtw8723x.h        |  518 ++++++++
 sys/contrib/dev/rtw88/rtw8821c.c        |   70 +-
 sys/contrib/dev/rtw88/rtw8821c.h        |    1 +
 sys/contrib/dev/rtw88/rtw8821c_table.c  | 1154 ++++++++++++-----
 sys/contrib/dev/rtw88/rtw8821cu.c       |   40 +-
 sys/contrib/dev/rtw88/rtw8822b.c        |    1 +
 sys/contrib/dev/rtw88/rtw8822c.c        |    1 +
 sys/contrib/dev/rtw88/rtw8822c_table.c  | 1239 ++++++++----------
 sys/contrib/dev/rtw88/rtw8822cu.c       |    4 +-
 sys/contrib/dev/rtw88/rx.h              |    2 +
 sys/contrib/dev/rtw88/sar.c             |    4 +
 sys/contrib/dev/rtw88/sdio.c            |   35 +-
 sys/contrib/dev/rtw88/tx.c              |    3 +-
 sys/contrib/dev/rtw88/usb.c             |   87 +-
 sys/modules/rtw88/Makefile              |    2 +
 40 files changed, 6278 insertions(+), 2089 deletions(-)

diff --git a/sys/contrib/dev/rtw88/Makefile b/sys/contrib/dev/rtw88/Makefile
index fd212c09d88a..8f47359b4380 100644
--- a/sys/contrib/dev/rtw88/Makefile
+++ b/sys/contrib/dev/rtw88/Makefile
@@ -44,6 +44,15 @@ rtw88_8822cs-objs            := rtw8822cs.o
 obj-$(CONFIG_RTW88_8822CU)     += rtw88_8822cu.o
 rtw88_8822cu-objs              := rtw8822cu.o
 
+obj-$(CONFIG_RTW88_8723X)      += rtw88_8723x.o
+rtw88_8723x-objs               := rtw8723x.o
+
+obj-$(CONFIG_RTW88_8703B)      += rtw88_8703b.o
+rtw88_8703b-objs               := rtw8703b.o rtw8703b_tables.o
+
+obj-$(CONFIG_RTW88_8723CS)     += rtw88_8723cs.o
+rtw88_8723cs-objs              := rtw8723cs.o
+
 obj-$(CONFIG_RTW88_8723D)      += rtw88_8723d.o
 rtw88_8723d-objs               := rtw8723d.o rtw8723d_table.o
 
diff --git a/sys/contrib/dev/rtw88/coex.c b/sys/contrib/dev/rtw88/coex.c
index 86467d2f8888..de3332eb7a22 100644
--- a/sys/contrib/dev/rtw88/coex.c
+++ b/sys/contrib/dev/rtw88/coex.c
@@ -3937,7 +3937,9 @@ void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, 
struct seq_file *m)
        lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
        bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
 
-       if (!coex_stat->bt_disabled && !coex_stat->bt_mailbox_reply) {
+       if (!coex_stat->wl_under_ips &&
+           (!coex_stat->wl_under_lps || coex_stat->wl_force_lps_ctrl) &&
+           !coex_stat->bt_disabled && !coex_stat->bt_mailbox_reply) {
                rtw_coex_get_bt_supported_version(rtwdev,
                                &coex_stat->bt_supported_version);
                rtw_coex_get_bt_patch_version(rtwdev, &coex_stat->patch_ver);
diff --git a/sys/contrib/dev/rtw88/debug.c b/sys/contrib/dev/rtw88/debug.c
index d745c774aa6f..e84f25b34c46 100644
--- a/sys/contrib/dev/rtw88/debug.c
+++ b/sys/contrib/dev/rtw88/debug.c
@@ -316,23 +316,13 @@ static ssize_t rtw_debugfs_set_single_input(struct file 
*filp,
 {
        struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
        struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
-       struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
-       char tmp[32 + 1];
        u32 input;
-       int num;
        int ret;
 
-       ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
+       ret = kstrtou32_from_user(buffer, count, 0, &input);
        if (ret)
                return ret;
 
-       num = kstrtoint(tmp, 0, &input);
-
-       if (num) {
-               rtw_warn(rtwdev, "kstrtoint failed\n");
-               return num;
-       }
-
        debugfs_priv->cb_data = input;
 
        return count;
@@ -485,19 +475,12 @@ static ssize_t rtw_debugfs_set_fix_rate(struct file *filp,
        struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
        u8 fix_rate;
-       char tmp[32 + 1];
        int ret;
 
-       ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
+       ret = kstrtou8_from_user(buffer, count, 0, &fix_rate);
        if (ret)
                return ret;
 
-       ret = kstrtou8(tmp, 0, &fix_rate);
-       if (ret) {
-               rtw_warn(rtwdev, "invalid args, [rate]\n");
-               return ret;
-       }
-
        dm_info->fix_rate = fix_rate;
 
        return count;
@@ -879,20 +862,13 @@ static ssize_t rtw_debugfs_set_coex_enable(struct file 
*filp,
        struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
        struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
        struct rtw_coex *coex = &rtwdev->coex;
-       char tmp[32 + 1];
        bool enable;
        int ret;
 
-       ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
+       ret = kstrtobool_from_user(buffer, count, &enable);
        if (ret)
                return ret;
 
-       ret = kstrtobool(tmp, &enable);
-       if (ret) {
-               rtw_warn(rtwdev, "invalid arguments\n");
-               return ret;
-       }
-
        mutex_lock(&rtwdev->mutex);
        coex->manual_control = !enable;
        mutex_unlock(&rtwdev->mutex);
@@ -951,18 +927,13 @@ static ssize_t rtw_debugfs_set_fw_crash(struct file *filp,
        struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
        struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
        struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
-       char tmp[32 + 1];
        bool input;
        int ret;
 
-       ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
+       ret = kstrtobool_from_user(buffer, count, &input);
        if (ret)
                return ret;
 
-       ret = kstrtobool(tmp, &input);
-       if (ret)
-               return -EINVAL;
-
        if (!input)
                return -EINVAL;
 
@@ -1030,11 +1001,12 @@ static ssize_t rtw_debugfs_set_dm_cap(struct file *filp,
        struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
        struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-       int bit;
+       int ret, bit;
        bool en;
 
-       if (kstrtoint_from_user(buffer, count, 10, &bit))
-               return -EINVAL;
+       ret = kstrtoint_from_user(buffer, count, 10, &bit);
+       if (ret)
+               return ret;
 
        en = bit > 0;
        bit = abs(bit);
@@ -1233,9 +1205,9 @@ static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {
 #define rtw_debugfs_add_core(name, mode, fopname, parent)              \
        do {                                                            \
                rtw_debug_priv_ ##name.rtwdev = rtwdev;                 \
-               if (!debugfs_create_file(#name, mode,                   \
+               if (IS_ERR(debugfs_create_file(#name, mode,             \
                                         parent, &rtw_debug_priv_ ##name,\
-                                        &file_ops_ ##fopname))         \
+                                        &file_ops_ ##fopname)))        \
                        pr_debug("Unable to initialize debugfs:%s\n",   \
                               #name);                                  \
        } while (0)
@@ -1314,8 +1286,8 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)
 
 #ifdef CONFIG_RTW88_DEBUG
 
-void __rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
-              const char *fmt, ...)
+void rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
+            const char *fmt, ...)
 {
        struct va_format vaf = {
                .fmt = fmt,
@@ -1334,6 +1306,6 @@ void __rtw_dbg(struct rtw_dev *rtwdev, enum 
rtw_debug_mask mask,
 
        va_end(args);
 }
-EXPORT_SYMBOL(__rtw_dbg);
+EXPORT_SYMBOL(rtw_dbg);
 
 #endif /* CONFIG_RTW88_DEBUG */
diff --git a/sys/contrib/dev/rtw88/debug.h b/sys/contrib/dev/rtw88/debug.h
index e826102083cf..0e48c56451a4 100644
--- a/sys/contrib/dev/rtw88/debug.h
+++ b/sys/contrib/dev/rtw88/debug.h
@@ -27,8 +27,9 @@ enum rtw_debug_mask {
        RTW_DBG_SDIO            = 0x00040000,
 
 #if defined(__FreeBSD__)
-       RTW_DBG_IO_RW           = 0x80000000,
+       RTW_DBG_IO_RW           = 0x10000000,
 #endif
+       RTW_DBG_UNEXP           = 0x80000000,
        RTW_DBG_ALL             = 0xffffffff
 };
 
@@ -46,20 +47,26 @@ static inline void rtw_debugfs_init(struct rtw_dev *rtwdev) 
{}
 #ifdef CONFIG_RTW88_DEBUG
 
 __printf(3, 4)
-void __rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
-              const char *fmt, ...);
+void rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
+            const char *fmt, ...);
 
-#if defined(__linux__)
-#define rtw_dbg(rtwdev, a...) __rtw_dbg(rtwdev, ##a)
-#elif defined(__FreeBSD__)
-#define        rtw_dbg(rtwdev, ...)    __rtw_dbg(rtwdev, __VA_ARGS__)
-#endif
+static inline bool rtw_dbg_is_enabled(struct rtw_dev *rtwdev,
+                                     enum rtw_debug_mask mask)
+{
+       return !!(rtw_debug_mask & mask);
+}
 
 #else
 
 static inline void rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
                           const char *fmt, ...) {}
 
+static inline bool rtw_dbg_is_enabled(struct rtw_dev *rtwdev,
+                                     enum rtw_debug_mask mask)
+{
+       return false;
+}
+
 #endif /* CONFIG_RTW88_DEBUG */
 
 #define rtw_info(rtwdev, a...) dev_info(rtwdev->dev, ##a)
diff --git a/sys/contrib/dev/rtw88/fw.c b/sys/contrib/dev/rtw88/fw.c
index f7fecc48fd39..745e37ea0093 100644
--- a/sys/contrib/dev/rtw88/fw.c
+++ b/sys/contrib/dev/rtw88/fw.c
@@ -17,6 +17,79 @@
 #include "phy.h"
 #include "mac.h"
 
+static const struct rtw_hw_reg_desc fw_h2c_regs[] = {
+       {REG_FWIMR, MASKDWORD, "FWIMR"},
+       {REG_FWIMR, BIT_FS_H2CCMD_INT_EN, "FWIMR enable"},
+       {REG_FWISR, MASKDWORD, "FWISR"},
+       {REG_FWISR, BIT_FS_H2CCMD_INT, "FWISR enable"},
+       {REG_HMETFR, BIT_INT_BOX_ALL, "BoxBitMap"},
+       {REG_HMEBOX0, MASKDWORD, "MSG 0"},
+       {REG_HMEBOX0_EX, MASKDWORD, "MSG_EX 0"},
+       {REG_HMEBOX1, MASKDWORD, "MSG 1"},
+       {REG_HMEBOX1_EX, MASKDWORD, "MSG_EX 1"},
+       {REG_HMEBOX2, MASKDWORD, "MSG 2"},
+       {REG_HMEBOX2_EX, MASKDWORD, "MSG_EX 2"},
+       {REG_HMEBOX3, MASKDWORD, "MSG 3"},
+       {REG_HMEBOX3_EX, MASKDWORD, "MSG_EX 3"},
+       {REG_FT1IMR, MASKDWORD, "FT1IMR"},
+       {REG_FT1IMR, BIT_FS_H2C_CMD_OK_INT_EN, "FT1IMR enable"},
+       {REG_FT1ISR, MASKDWORD, "FT1ISR"},
+       {REG_FT1ISR, BIT_FS_H2C_CMD_OK_INT, "FT1ISR enable "},
+};
+
+static const struct rtw_hw_reg_desc fw_c2h_regs[] = {
+       {REG_FWIMR, MASKDWORD, "FWIMR"},
+       {REG_FWIMR, BIT_FS_H2CCMD_INT_EN, "CPWM"},
+       {REG_FWIMR, BIT_FS_HRCV_INT_EN, "HRECV"},
+       {REG_FWISR, MASKDWORD, "FWISR"},
+       {REG_FWISR, BIT_FS_H2CCMD_INT, "CPWM"},
+       {REG_FWISR, BIT_FS_HRCV_INT, "HRECV"},
+       {REG_CPWM, MASKDWORD, "REG_CPWM"},
+};
+
+static const struct rtw_hw_reg_desc fw_core_regs[] = {
+       {REG_ARFR2_V1, MASKDWORD, "EPC"},
+       {REG_ARFRH2_V1, MASKDWORD, "BADADDR"},
+       {REG_ARFR3_V1, MASKDWORD, "CAUSE"},
+       {REG_ARFR3_V1, BIT_EXC_CODE, "ExcCode"},
+       {REG_ARFRH3_V1, MASKDWORD, "Status"},
+       {REG_ARFR4, MASKDWORD, "SP"},
+       {REG_ARFRH4, MASKDWORD, "RA"},
+       {REG_FW_DBG6, MASKDWORD, "DBG 6"},
+       {REG_FW_DBG7, MASKDWORD, "DBG 7"},
+};
+
+static void _rtw_fw_dump_dbg_info(struct rtw_dev *rtwdev,
+                                 const struct rtw_hw_reg_desc regs[], u32 size)
+{
+       const struct rtw_hw_reg_desc *reg;
+       u32 val;
+       int i;
+
+       for (i = 0;  i < size; i++) {
+               reg = &regs[i];
+               val = rtw_read32_mask(rtwdev, reg->addr, reg->mask);
+
+               rtw_dbg(rtwdev, RTW_DBG_FW, "[%s]addr:0x%x mask:0x%x 
value:0x%x\n",
+                       reg->desc, reg->addr, reg->mask, val);
+       }
+}
+
+void rtw_fw_dump_dbg_info(struct rtw_dev *rtwdev)
+{
+       int i;
+
+       if (!rtw_dbg_is_enabled(rtwdev, RTW_DBG_FW))
+               return;
+
+       _rtw_fw_dump_dbg_info(rtwdev, fw_h2c_regs, ARRAY_SIZE(fw_h2c_regs));
+       _rtw_fw_dump_dbg_info(rtwdev, fw_c2h_regs, ARRAY_SIZE(fw_c2h_regs));
+       for (i = 0 ; i < RTW_DEBUG_DUMP_TIMES; i++) {
+               rtw_dbg(rtwdev, RTW_DBG_FW, "Firmware Coredump %dth\n", i + 1);
+               _rtw_fw_dump_dbg_info(rtwdev, fw_core_regs, 
ARRAY_SIZE(fw_core_regs));
+       }
+}
+
 static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev *rtwdev,
                                      struct sk_buff *skb)
 {
@@ -349,6 +422,7 @@ static void rtw_fw_send_h2c_command_register(struct rtw_dev 
*rtwdev,
 
        if (ret) {
                rtw_err(rtwdev, "failed to send h2c command\n");
+               rtw_fw_dump_dbg_info(rtwdev);
                return;
        }
 
@@ -709,12 +783,18 @@ void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, 
bool connect,
        static const u8 rssi_min = 0, rssi_max = 100, rssi_offset = 100;
        struct rtw_sta_info *si =
                sta ? (struct rtw_sta_info *)sta->drv_priv : NULL;
-       s32 threshold = bss_conf->cqm_rssi_thold + rssi_offset;
+       s32 thold = RTW_DEFAULT_CQM_THOLD;
+       u32 hyst = RTW_DEFAULT_CQM_HYST;
        u8 h2c_pkt[H2C_PKT_SIZE] = {0};
 
        if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER))
                return;
 
+       if (bss_conf->cqm_rssi_thold)
+               thold = bss_conf->cqm_rssi_thold;
+       if (bss_conf->cqm_rssi_hyst)
+               hyst = bss_conf->cqm_rssi_hyst;
+
        if (!connect) {
                SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P1);
                SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, connect);
@@ -731,15 +811,15 @@ void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, 
bool connect,
        rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
 
        memset(h2c_pkt, 0, sizeof(h2c_pkt));
-       threshold = clamp_t(s32, threshold, rssi_min, rssi_max);
+       thold = clamp_t(s32, thold + rssi_offset, rssi_min, rssi_max);
        SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P1);
        SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, connect);
        SET_BCN_FILTER_OFFLOAD_P1_OFFLOAD_MODE(h2c_pkt,
                                               BCN_FILTER_OFFLOAD_MODE_DEFAULT);
-       SET_BCN_FILTER_OFFLOAD_P1_THRESHOLD(h2c_pkt, (u8)threshold);
+       SET_BCN_FILTER_OFFLOAD_P1_THRESHOLD(h2c_pkt, thold);
        SET_BCN_FILTER_OFFLOAD_P1_BCN_LOSS_CNT(h2c_pkt, BCN_LOSS_CNT);
        SET_BCN_FILTER_OFFLOAD_P1_MACID(h2c_pkt, si->mac_id);
-       SET_BCN_FILTER_OFFLOAD_P1_HYST(h2c_pkt, bss_conf->cqm_rssi_hyst);
+       SET_BCN_FILTER_OFFLOAD_P1_HYST(h2c_pkt, hyst);
        SET_BCN_FILTER_OFFLOAD_P1_BCN_INTERVAL(h2c_pkt, bss_conf->beacon_int);
        rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
 }
@@ -924,7 +1004,7 @@ static u8 rtw_get_rsvd_page_probe_req_location(struct 
rtw_dev *rtwdev,
                if (rsvd_pkt->type != RSVD_PROBE_REQ)
                        continue;
                if ((!ssid && !rsvd_pkt->ssid) ||
-                   rtw_ssid_equal(rsvd_pkt->ssid, ssid))
+                   cfg80211_ssid_eq(rsvd_pkt->ssid, ssid))
                        location = rsvd_pkt->page;
        }
 
@@ -941,7 +1021,7 @@ static u16 rtw_get_rsvd_page_probe_req_size(struct rtw_dev 
*rtwdev,
                if (rsvd_pkt->type != RSVD_PROBE_REQ)
                        continue;
                if ((!ssid && !rsvd_pkt->ssid) ||
-                   rtw_ssid_equal(rsvd_pkt->ssid, ssid))
+                   cfg80211_ssid_eq(rsvd_pkt->ssid, ssid))
                        size = rsvd_pkt->probe_req_size;
        }
 
diff --git a/sys/contrib/dev/rtw88/fw.h b/sys/contrib/dev/rtw88/fw.h
index 43ccdf9965ac..e999c24e4634 100644
--- a/sys/contrib/dev/rtw88/fw.h
+++ b/sys/contrib/dev/rtw88/fw.h
@@ -29,6 +29,8 @@
 #define BCN_FILTER_CONNECTION_LOSS     1
 #define BCN_FILTER_CONNECTED           2
 #define BCN_FILTER_NOTIFY_BEACON_LOSS  3
+#define RTW_DEFAULT_CQM_THOLD          -70
+#define RTW_DEFAULT_CQM_HYST           4
 
 #define SCAN_NOTIFY_TIMEOUT  msecs_to_jiffies(10)
 
@@ -44,6 +46,8 @@
 #define RTW_OLD_PROBE_PG_CNT           2
 #define RTW_PROBE_PG_CNT               4
 
+#define RTW_DEBUG_DUMP_TIMES           10
+
 enum rtw_c2h_cmd_id {
        C2H_CCX_TX_RPT = 0x03,
        C2H_BT_INFO = 0x09,
@@ -808,6 +812,7 @@ static inline bool rtw_fw_feature_ext_check(struct 
rtw_fw_state *fw,
        return !!(fw->feature_ext & feature);
 }
 
+void rtw_fw_dump_dbg_info(struct rtw_dev *rtwdev);
 void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
                               struct sk_buff *skb);
 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
diff --git a/sys/contrib/dev/rtw88/mac.c b/sys/contrib/dev/rtw88/mac.c
index 298663b03580..564f5988ee82 100644
--- a/sys/contrib/dev/rtw88/mac.c
+++ b/sys/contrib/dev/rtw88/mac.c
@@ -309,6 +309,13 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, 
bool pwr_on)
        pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq;
        ret = rtw_pwr_seq_parser(rtwdev, pwr_seq);
 
+       if (pwr_on && rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) {
+               if (chip->id == RTW_CHIP_TYPE_8822C ||
+                   chip->id == RTW_CHIP_TYPE_8822B ||
+                   chip->id == RTW_CHIP_TYPE_8821C)
+                       rtw_write8_clr(rtwdev, REG_SYS_STATUS1 + 1, BIT(0));
+       }
+
        if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO)
                rtw_write32(rtwdev, REG_SDIO_HIMR, imr);
 
@@ -936,6 +943,12 @@ static int __rtw_download_firmware_legacy(struct rtw_dev 
*rtwdev,
 {
        int ret = 0;
 
+       /* reset firmware if still present */
+       if (rtwdev->chip->id == RTW_CHIP_TYPE_8703B &&
+           rtw_read8_mask(rtwdev, REG_MCUFW_CTRL, BIT_RAM_DL_SEL)) {
+               rtw_write8(rtwdev, REG_MCUFW_CTRL, 0x00);
+       }
+
        en_download_firmware_legacy(rtwdev, true);
        ret = download_firmware_legacy(rtwdev, fw->firmware->data, 
fw->firmware->size);
        en_download_firmware_legacy(rtwdev, false);
@@ -1026,14 +1039,15 @@ static void __rtw_mac_flush_prio_queue(struct rtw_dev 
*rtwdev,
                msleep(20);
        }
 
-       /* priority queue is still not empty, throw a warning,
+       /* priority queue is still not empty, throw a debug message
         *
         * Note that if we want to flush the tx queue when having a lot of
         * traffic (ex, 100Mbps up), some of the packets could be dropped.
         * And it requires like ~2secs to flush the full priority queue.
         */
        if (!drop)
-               rtw_warn(rtwdev, "timed out to flush queue %d\n", prio_queue);
+               rtw_dbg(rtwdev, RTW_DBG_UNEXP,
+                       "timed out to flush queue %d\n", prio_queue);
 }
 
 static void rtw_mac_flush_prio_queues(struct rtw_dev *rtwdev,
@@ -1187,6 +1201,15 @@ static int __priority_queue_cfg(struct rtw_dev *rtwdev,
        rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2 + 2, fifo->rsvd_boundary);
        rtw_write16(rtwdev, REG_BCNQ1_BDNY_V1, fifo->rsvd_boundary);
        rtw_write32(rtwdev, REG_RXFF_BNDY, chip->rxff_size - C2H_PKT_BUF - 1);
+
+       if (rtwdev->hci.type == RTW_HCI_TYPE_USB) {
+               rtw_write8_mask(rtwdev, REG_AUTO_LLT_V1, BIT_MASK_BLK_DESC_NUM,
+                               chip->usb_tx_agg_desc_num);
+
+               rtw_write8(rtwdev, REG_AUTO_LLT_V1 + 3, 
chip->usb_tx_agg_desc_num);
+               rtw_write8_set(rtwdev, REG_TXDMA_OFFSET_CHK + 1, BIT(1));
+       }
+
        rtw_write8_set(rtwdev, REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1);
 
        if (!check_hw_ready(rtwdev, REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1, 0))
diff --git a/sys/contrib/dev/rtw88/mac80211.c b/sys/contrib/dev/rtw88/mac80211.c
index d01c5268191f..c158cb2e795a 100644
--- a/sys/contrib/dev/rtw88/mac80211.c
+++ b/sys/contrib/dev/rtw88/mac80211.c
@@ -62,7 +62,7 @@ static int rtw_ops_start(struct ieee80211_hw *hw)
        return ret;
 }
 
-static void rtw_ops_stop(struct ieee80211_hw *hw)
+static void rtw_ops_stop(struct ieee80211_hw *hw, bool suspend)
 {
        struct rtw_dev *rtwdev = hw->priv;
 
@@ -293,9 +293,9 @@ static void rtw_ops_configure_filter(struct ieee80211_hw 
*hw,
 
        if (changed_flags & FIF_ALLMULTI) {
                if (*new_flags & FIF_ALLMULTI)
-                       rtwdev->hal.rcr |= BIT_AM | BIT_AB;
+                       rtwdev->hal.rcr |= BIT_AM;
                else
-                       rtwdev->hal.rcr &= ~(BIT_AM | BIT_AB);
+                       rtwdev->hal.rcr &= ~(BIT_AM);
        }
        if (changed_flags & FIF_FCSFAIL) {
                if (*new_flags & FIF_FCSFAIL)
@@ -399,6 +399,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw 
*hw,
                        rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc);
                        if (rtw_bf_support)
                                rtw_bf_assoc(rtwdev, vif, conf);
+
+                       rtw_fw_beacon_filter_config(rtwdev, true, vif);
                } else {
                        rtw_leave_lps(rtwdev);
                        rtw_bf_disassoc(rtwdev, vif, conf);
@@ -940,6 +942,10 @@ static void rtw_ops_sta_rc_update(struct ieee80211_hw *hw,
 }
 
 const struct ieee80211_ops rtw_ops = {
+       .add_chanctx = ieee80211_emulate_add_chanctx,
+       .remove_chanctx = ieee80211_emulate_remove_chanctx,
+       .change_chanctx = ieee80211_emulate_change_chanctx,
+       .switch_vif_chanctx = ieee80211_emulate_switch_vif_chanctx,
        .tx                     = rtw_ops_tx,
        .wake_tx_queue          = rtw_ops_wake_tx_queue,
        .start                  = rtw_ops_start,
diff --git a/sys/contrib/dev/rtw88/main.c b/sys/contrib/dev/rtw88/main.c
index cb4e0f92ae12..de94f750200e 100644
--- a/sys/contrib/dev/rtw88/main.c
+++ b/sys/contrib/dev/rtw88/main.c
@@ -231,9 +231,6 @@ static void rtw_watch_dog_work(struct work_struct *work)
        else
                clear_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
 
-       rtw_coex_wl_status_check(rtwdev);
-       rtw_coex_query_bt_hid_list(rtwdev);
-
        if (busy_traffic != test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags))
                rtw_coex_wl_status_change_notify(rtwdev, 0);
 
@@ -261,6 +258,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
 
        /* make sure BB/RF is working for dynamic mech */
        rtw_leave_lps(rtwdev);
+       rtw_coex_wl_status_check(rtwdev);
+       rtw_coex_query_bt_hid_list(rtwdev);
 
        rtw_phy_dynamic_mechanism(rtwdev);
 
@@ -2030,6 +2029,11 @@ static int rtw_chip_efuse_info_setup(struct rtw_dev 
*rtwdev)
        efuse->ext_pa_5g = efuse->pa_type_5g & BIT(0) ? 1 : 0;
        efuse->ext_lna_2g = efuse->lna_type_5g & BIT(3) ? 1 : 0;
 
+       if (!is_valid_ether_addr(efuse->addr)) {
+               eth_random_addr(efuse->addr);
+               dev_warn(rtwdev->dev, "efuse MAC invalid, using random\n");
+       }
+
 out_disable:
        rtw_chip_efuse_disable(rtwdev);
 
@@ -2049,8 +2053,6 @@ static int rtw_chip_board_info_setup(struct rtw_dev 
*rtwdev)
        rtw_phy_setup_phy_cond(rtwdev, hal->pkg_type);
 
        rtw_phy_init_tx_power(rtwdev);
-       if (rfe_def->agc_btg_tbl)
-               rtw_load_table(rtwdev, rfe_def->agc_btg_tbl);
        rtw_load_table(rtwdev, rfe_def->phy_pg_tbl);
        rtw_load_table(rtwdev, rfe_def->txpwr_lmt_tbl);
        rtw_phy_tx_power_by_rate_config(hal);
@@ -2227,6 +2229,7 @@ EXPORT_SYMBOL(rtw_core_deinit);
 
 int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
 {
+       bool sta_mode_only = rtwdev->hci.type == RTW_HCI_TYPE_SDIO;
        struct rtw_hal *hal = &rtwdev->hal;
        int max_tx_headroom = 0;
        int ret;
@@ -2255,10 +2258,12 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct 
ieee80211_hw *hw)
        ieee80211_hw_set(hw, TX_AMSDU);
        ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
 
-       hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-                                    BIT(NL80211_IFTYPE_AP) |
-                                    BIT(NL80211_IFTYPE_ADHOC) |
-                                    BIT(NL80211_IFTYPE_MESH_POINT);
+       if (sta_mode_only)
+               hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
+       else
+               hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                            BIT(NL80211_IFTYPE_AP) |
+                                            BIT(NL80211_IFTYPE_ADHOC);
        hw->wiphy->available_antennas_tx = hal->antenna_tx;
        hw->wiphy->available_antennas_rx = hal->antenna_rx;
 
@@ -2269,7 +2274,7 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct 
ieee80211_hw *hw)
        hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS;
        hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev);
 
-       if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C) {
+       if (!sta_mode_only && rtwdev->chip->id == RTW_CHIP_TYPE_8822C) {
                hw->wiphy->iface_combinations = rtw_iface_combs;
                hw->wiphy->n_iface_combinations = ARRAY_SIZE(rtw_iface_combs);
        }
diff --git a/sys/contrib/dev/rtw88/main.h b/sys/contrib/dev/rtw88/main.h
index e1d903bb88ee..8d754237db31 100644
--- a/sys/contrib/dev/rtw88/main.h
+++ b/sys/contrib/dev/rtw88/main.h
@@ -195,6 +195,7 @@ enum rtw_chip_type {
        RTW_CHIP_TYPE_8822C,
        RTW_CHIP_TYPE_8723D,
        RTW_CHIP_TYPE_8821C,
+       RTW_CHIP_TYPE_8703B,
 };
 
 enum rtw_tx_queue_type {
@@ -350,8 +351,10 @@ enum rtw_regulatory_domains {
        RTW_REGD_UKRAINE        = 7,
        RTW_REGD_MEXICO         = 8,
        RTW_REGD_CN             = 9,
-       RTW_REGD_WW,
+       RTW_REGD_QATAR          = 10,
+       RTW_REGD_UK             = 11,
 
+       RTW_REGD_WW,
        RTW_REGD_MAX
 };
 
@@ -530,6 +533,12 @@ struct rtw_hw_reg {
        u32 mask;
 };
 
+struct rtw_hw_reg_desc {
+       u32 addr;
+       u32 mask;
+       const char *desc;
+};
+
 struct rtw_ltecoex_addr {
        u32 ctrl;
        u32 wdata;
@@ -1196,6 +1205,8 @@ struct rtw_chip_info {
        u16 fw_fifo_addr[RTW_FW_FIFO_MAX];
        const struct rtw_fwcd_segs *fwcd_segs;
 
+       u8 usb_tx_agg_desc_num;
+
        u8 default_1ss_tx_path;
 
        bool path_div_supported;
@@ -1700,11 +1711,13 @@ struct rtw_dm_info {
        s8 delta_power_index[RTW_RF_PATH_MAX];
        s8 delta_power_index_last[RTW_RF_PATH_MAX];
        u8 default_ofdm_index;
+       u8 default_cck_index;
        bool pwr_trk_triggered;
        bool pwr_trk_init_trigger;
        struct ewma_thermal avg_thermal[RTW_RF_PATH_MAX];
        s8 txagc_remnant_cck;
        s8 txagc_remnant_ofdm;
+       u8 rx_cck_agc_report_type;
 
        /* backup dack results for each path and I/Q */
        u32 dack_adck[RTW_RF_PATH_MAX];
@@ -2090,18 +2103,6 @@ static inline struct ieee80211_vif *rtwvif_to_vif(struct 
rtw_vif *rtwvif)
        return container_of(p, struct ieee80211_vif, drv_priv);
 }
 
-static inline bool rtw_ssid_equal(struct cfg80211_ssid *a,
-                                 struct cfg80211_ssid *b)
-{
-       if (!a || !b || a->ssid_len != b->ssid_len)
-               return false;
-
-       if (memcmp(a->ssid, b->ssid, a->ssid_len))
-               return false;
-
-       return true;
-}
-
 static inline void rtw_chip_efuse_grant_on(struct rtw_dev *rtwdev)
 {
        if (rtwdev->chip->ops->efuse_grant)
diff --git a/sys/contrib/dev/rtw88/pci.c b/sys/contrib/dev/rtw88/pci.c
index 7554bac4902a..82e08f14f9b7 100644
--- a/sys/contrib/dev/rtw88/pci.c
+++ b/sys/contrib/dev/rtw88/pci.c
@@ -780,7 +780,8 @@ static void __pci_flush_queue(struct rtw_dev *rtwdev, u8 
pci_q, bool drop)
        }
 
        if (!drop)
-               rtw_warn(rtwdev, "timed out to flush pci tx ring[%d]\n", pci_q);
+               rtw_dbg(rtwdev, RTW_DBG_UNEXP,
+                       "timed out to flush pci tx ring[%d]\n", pci_q);
 }
 
 static void __rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 pci_queues,
@@ -1529,6 +1530,7 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
 {
        struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
        const struct rtw_chip_info *chip = rtwdev->chip;
+       struct rtw_efuse *efuse = &rtwdev->efuse;
        struct pci_dev *pdev = rtwpci->pdev;
        const struct rtw_intf_phy_para *para;
        u16 cut;
@@ -1577,6 +1579,9 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
                        rtw_err(rtwdev, "failed to set PCI cap, ret = %d\n",
                                ret);
        }
+
+       if (chip->id == RTW_CHIP_TYPE_8822C && efuse->rfe_option == 5)
+               rtw_write32_mask(rtwdev, REG_ANAPARSW_MAC_0, BIT_CF_L_V2, 0x1);
 }
 
 static int __maybe_unused rtw_pci_suspend(struct device *dev)
@@ -1687,7 +1692,7 @@ static struct rtw_hci_ops rtw_pci_ops = {
 
 static int rtw_pci_request_irq(struct rtw_dev *rtwdev, struct pci_dev *pdev)
 {
-       unsigned int flags = PCI_IRQ_LEGACY;
+       unsigned int flags = PCI_IRQ_INTX;
        int ret;
 
        if (!rtw_disable_msi)
@@ -1756,12 +1761,16 @@ static int rtw_pci_napi_poll(struct napi_struct *napi, 
int budget)
        return work_done;
 }
 
-static void rtw_pci_napi_init(struct rtw_dev *rtwdev)
+static int rtw_pci_napi_init(struct rtw_dev *rtwdev)
 {
        struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
 
-       init_dummy_netdev(&rtwpci->netdev);
-       netif_napi_add(&rtwpci->netdev, &rtwpci->napi, rtw_pci_napi_poll);
+       rtwpci->netdev = alloc_netdev_dummy(0);
+       if (!rtwpci->netdev)
+               return -ENOMEM;
+
+       netif_napi_add(rtwpci->netdev, &rtwpci->napi, rtw_pci_napi_poll);
+       return 0;
 }
 
 static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev)
@@ -1770,6 +1779,7 @@ static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev)
 
        rtw_pci_napi_stop(rtwdev);
        netif_napi_del(&rtwpci->napi);
+       free_netdev(rtwpci->netdev);
 }
 
 int rtw_pci_probe(struct pci_dev *pdev,
@@ -1819,7 +1829,11 @@ int rtw_pci_probe(struct pci_dev *pdev,
                goto err_pci_declaim;
        }
 
-       rtw_pci_napi_init(rtwdev);
+       ret = rtw_pci_napi_init(rtwdev);
+       if (ret) {
+               rtw_err(rtwdev, "failed to setup NAPI\n");
+               goto err_pci_declaim;
+       }
 
        ret = rtw_chip_info_setup(rtwdev);
        if (ret) {
@@ -1907,7 +1921,7 @@ void rtw_pci_shutdown(struct pci_dev *pdev)
 EXPORT_SYMBOL(rtw_pci_shutdown);
 
 MODULE_AUTHOR("Realtek Corporation");
-MODULE_DESCRIPTION("Realtek 802.11ac wireless PCI driver");
+MODULE_DESCRIPTION("Realtek PCI 802.11ac wireless driver");
 MODULE_LICENSE("Dual BSD/GPL");
 #if defined(__FreeBSD__)
 MODULE_VERSION(rtw_pci, 1);
diff --git a/sys/contrib/dev/rtw88/pci.h b/sys/contrib/dev/rtw88/pci.h
index 0c37efd8c66f..13988db1cb4c 100644
--- a/sys/contrib/dev/rtw88/pci.h
+++ b/sys/contrib/dev/rtw88/pci.h
@@ -215,7 +215,7 @@ struct rtw_pci {
        bool running;
 
        /* napi structure */
-       struct net_device netdev;
+       struct net_device *netdev;
        struct napi_struct napi;
 
        u16 rx_tag;
diff --git a/sys/contrib/dev/rtw88/phy.c b/sys/contrib/dev/rtw88/phy.c
index 128e75a81bf3..37ef80c9091d 100644
--- a/sys/contrib/dev/rtw88/phy.c
+++ b/sys/contrib/dev/rtw88/phy.c
@@ -1761,12 +1761,15 @@ static void rtw_load_rfk_table(struct rtw_dev *rtwdev)
 
 void rtw_phy_load_tables(struct rtw_dev *rtwdev)
 {
+       const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev);
        const struct rtw_chip_info *chip = rtwdev->chip;
        u8 rf_path;
 
        rtw_load_table(rtwdev, chip->mac_tbl);
        rtw_load_table(rtwdev, chip->bb_tbl);
        rtw_load_table(rtwdev, chip->agc_tbl);
+       if (rfe_def->agc_btg_tbl)
+               rtw_load_table(rtwdev, rfe_def->agc_btg_tbl);
        rtw_load_rfk_table(rtwdev);
 
        for (rf_path = 0; rf_path < rtwdev->hal.rf_path_num; rf_path++) {
diff --git a/sys/contrib/dev/rtw88/ps.c b/sys/contrib/dev/rtw88/ps.c
index 07e8cbd436cd..add5a20b8432 100644
--- a/sys/contrib/dev/rtw88/ps.c
+++ b/sys/contrib/dev/rtw88/ps.c
@@ -104,6 +104,7 @@ void rtw_power_mode_change(struct rtw_dev *rtwdev, bool 
enter)
                 */
                WARN(1, "firmware failed to ack driver for %s Deep Power 
mode\n",
                     enter ? "entering" : "leaving");
+               rtw_fw_dump_dbg_info(rtwdev);
        }
 }
 EXPORT_SYMBOL(rtw_power_mode_change);
@@ -164,6 +165,7 @@ static void rtw_fw_leave_lps_check(struct rtw_dev *rtwdev)
        if (ret) {
                rtw_write32_clr(rtwdev, REG_TCR, BIT_PWRMGT_HWDATA_EN);
                rtw_warn(rtwdev, "firmware failed to leave lps state\n");
+               rtw_fw_dump_dbg_info(rtwdev);
        }
 }
 
diff --git a/sys/contrib/dev/rtw88/reg.h b/sys/contrib/dev/rtw88/reg.h
index 7c6c11d50ff3..02ef9a77316b 100644
--- a/sys/contrib/dev/rtw88/reg.h
+++ b/sys/contrib/dev/rtw88/reg.h
@@ -224,12 +224,25 @@
 #define REG_RXFF_BNDY          0x011C
 #define REG_FE1IMR             0x0120
 #define BIT_FS_RXDONE          BIT(16)
+#define REG_CPWM               0x012C
+#define REG_FWIMR              0x0130
+#define BIT_FS_H2CCMD_INT_EN   BIT(4)
+#define BIT_FS_HRCV_INT_EN     BIT(5)
+#define REG_FWISR              0x0134
+#define BIT_FS_H2CCMD_INT      BIT(4)
+#define BIT_FS_HRCV_INT                BIT(5)
 #define REG_PKTBUF_DBG_CTRL    0x0140
 #define REG_C2HEVT             0x01A0
 #define REG_MCUTST_1           0x01C0
 #define REG_MCUTST_II          0x01C4
 #define REG_WOWLAN_WAKE_REASON 0x01C7
 #define REG_HMETFR             0x01CC
+#define BIT_INT_BOX0           BIT(0)
+#define BIT_INT_BOX1           BIT(1)
+#define BIT_INT_BOX2           BIT(2)
+#define BIT_INT_BOX3           BIT(3)
+#define BIT_INT_BOX_ALL                (BIT_INT_BOX0 | BIT_INT_BOX1 | 
BIT_INT_BOX2 | \
+                                BIT_INT_BOX3)
 #define REG_HMEBOX0            0x01D0
 #define REG_HMEBOX1            0x01D4
 #define REG_HMEBOX2            0x01D8
@@ -257,6 +270,7 @@
 #define BIT_MASK_BCN_HEAD_1_V1 0xfff
 #define REG_AUTO_LLT_V1                0x0208
 #define BIT_AUTO_INIT_LLT_V1   BIT(0)
+#define BIT_MASK_BLK_DESC_NUM  GENMASK(7, 4)
 #define REG_DWBCN0_CTRL                0x0208
 #define BIT_BCN_VALID          BIT(16)
 #define REG_TXDMA_OFFSET_CHK   0x020C
@@ -338,6 +352,11 @@
 #define BIT_EN_GNT_BT_AWAKE    BIT(3)
 #define BIT_EN_EOF_V1          BIT(2)
 #define REG_DATA_SC            0x0483
+#define REG_ARFR2_V1           0x048C
+#define REG_ARFRH2_V1          0x0490
+#define REG_ARFR3_V1           0x0494
+#define BIT_EXC_CODE           GENMASK(6, 2)
+#define REG_ARFRH3_V1          0x0498
 #define REG_ARFR4              0x049C
 #define BIT_WL_RFK             BIT(0)
 #define REG_ARFRH4             0x04A0
@@ -539,6 +558,9 @@
 #define REG_RFE_INV16          0x0cbe
 #define BIT_RFE_BUF_EN         BIT(3)
 
+#define REG_ANAPARSW_MAC_0     0x1010
+#define BIT_CF_L_V2            GENMASK(29, 28)
+
 #define REG_ANAPAR_XTAL_0      0x1040
 #define BIT_XCAP_0             GENMASK(23, 10)
 #define REG_CPU_DMEM_CON       0x1080
@@ -548,11 +570,16 @@
 
 #define REG_H2C_PKT_READADDR   0x10D0
 #define REG_H2C_PKT_WRITEADDR  0x10D4
+#define REG_FW_DBG6            0x10F8
 #define REG_FW_DBG7            0x10FC
 #define FW_KEY_MASK            0xffffff00
 
 #define REG_CR_EXT             0x1100
 
+#define REG_FT1IMR             0x1138
+#define BIT_FS_H2C_CMD_OK_INT_EN BIT(25)
+#define REG_FT1ISR             0x113c
+#define BIT_FS_H2C_CMD_OK_INT  BIT(25)
 #define REG_DDMA_CH0SA         0x1200
 #define REG_DDMA_CH0DA         0x1204
 #define REG_DDMA_CH0CTRL       0x1208
diff --git a/sys/contrib/dev/rtw88/regd.c b/sys/contrib/dev/rtw88/regd.c
index 2f547cbcf6da..7f3b2ea3f2a5 100644
--- a/sys/contrib/dev/rtw88/regd.c
+++ b/sys/contrib/dev/rtw88/regd.c
@@ -70,16 +70,16 @@ static const struct rtw_regulatory rtw_reg_map[] = {
        COUNTRY_REGD_ENT("BY", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("BZ", RTW_REGD_FCC, RTW_REGD_FCC),
        COUNTRY_REGD_ENT("CA", RTW_REGD_IC, RTW_REGD_IC),
-       COUNTRY_REGD_ENT("CC", RTW_REGD_ETSI, RTW_REGD_ETSI),
+       COUNTRY_REGD_ENT("CC", RTW_REGD_ACMA, RTW_REGD_ACMA),
        COUNTRY_REGD_ENT("CD", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("CF", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("CG", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("CH", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("CI", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("CK", RTW_REGD_ETSI, RTW_REGD_ETSI),
-       COUNTRY_REGD_ENT("CL", RTW_REGD_FCC, RTW_REGD_FCC),
+       COUNTRY_REGD_ENT("CL", RTW_REGD_CHILE, RTW_REGD_CHILE),
        COUNTRY_REGD_ENT("CM", RTW_REGD_ETSI, RTW_REGD_ETSI),
-       COUNTRY_REGD_ENT("CN", RTW_REGD_ETSI, RTW_REGD_ETSI),
+       COUNTRY_REGD_ENT("CN", RTW_REGD_CN, RTW_REGD_CN),
        COUNTRY_REGD_ENT("CO", RTW_REGD_FCC, RTW_REGD_FCC),
        COUNTRY_REGD_ENT("CR", RTW_REGD_FCC, RTW_REGD_FCC),
        COUNTRY_REGD_ENT("CV", RTW_REGD_ETSI, RTW_REGD_ETSI),
@@ -106,7 +106,7 @@ static const struct rtw_regulatory rtw_reg_map[] = {
        COUNTRY_REGD_ENT("FO", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("FR", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("GA", RTW_REGD_ETSI, RTW_REGD_ETSI),
-       COUNTRY_REGD_ENT("GB", RTW_REGD_ETSI, RTW_REGD_ETSI),
+       COUNTRY_REGD_ENT("GB", RTW_REGD_UK, RTW_REGD_UK),
        COUNTRY_REGD_ENT("GD", RTW_REGD_FCC, RTW_REGD_FCC),
        COUNTRY_REGD_ENT("GE", RTW_REGD_ETSI, RTW_REGD_ETSI),
        COUNTRY_REGD_ENT("GF", RTW_REGD_ETSI, RTW_REGD_ETSI),
@@ -214,7 +214,7 @@ static const struct rtw_regulatory rtw_reg_map[] = {
*** 12010 LINES SKIPPED ***

Reply via email to