Skip to content

Commit

Permalink
rtw88: update Realtek's rtw88 driver.
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
Bjoern A. Zeeb authored and fichtner committed Feb 18, 2025
1 parent f15f440 commit c296eeb
Show file tree
Hide file tree
Showing 40 changed files with 6,278 additions and 2,089 deletions.
9 changes: 9 additions & 0 deletions sys/contrib/dev/rtw88/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 3 additions & 1 deletion sys/contrib/dev/rtw88/coex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
54 changes: 13 additions & 41 deletions sys/contrib/dev/rtw88/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand All @@ -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 */
23 changes: 15 additions & 8 deletions sys/contrib/dev/rtw88/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
};

Expand All @@ -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)
Expand Down
92 changes: 86 additions & 6 deletions sys/contrib/dev/rtw88/fw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down
5 changes: 5 additions & 0 deletions sys/contrib/dev/rtw88/fw.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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,
Expand Down Expand Up @@ -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);
Expand Down
Loading

0 comments on commit c296eeb

Please sign in to comment.