mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 22:57:21 -04:00
Merge tag 'rtw-next-2024-08-09' of https://github.com/pkshih/rtw
rtw-next patches for v6.12 A pull-request for v6.12 containing fixes and features, and list major changes below: rtw88: - improve USB performance by aggregation - fix RX bandwidth for rx_status rtw89: - support new WiFi 6 chip RTL8852BE-VT - support WoWLAN net-detect feature - support hardware encryption in unicast management frames - support hardware rfkill
This commit is contained in:
@@ -20,9 +20,8 @@ config RTL8XXXU
|
||||
memory footprint than the vendor drivers and benefits
|
||||
from the in kernel mac80211 stack.
|
||||
|
||||
It can coexist with drivers from drivers/staging/rtl8723au,
|
||||
drivers/staging/rtl8192u, and drivers/net/wireless/rtlwifi,
|
||||
but you will need to control which module you wish to load.
|
||||
It can coexist with the rtlwifi driver but you will need
|
||||
to control which module you wish to load.
|
||||
|
||||
To compile this driver as a module, choose M here: the module will
|
||||
be called rtl8xxxu. If unsure, say N.
|
||||
|
||||
@@ -8110,6 +8110,12 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x817f, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x819a, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8754, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x817c, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
/* Tested by Larry Finger */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0x7811, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
|
||||
@@ -12,6 +12,7 @@ if RTW88
|
||||
|
||||
config RTW88_CORE
|
||||
tristate
|
||||
select WANT_DEV_COREDUMP
|
||||
|
||||
config RTW88_PCI
|
||||
tristate
|
||||
|
||||
@@ -43,6 +43,62 @@ struct rtw_debugfs_priv {
|
||||
};
|
||||
};
|
||||
|
||||
struct rtw_debugfs {
|
||||
struct rtw_debugfs_priv mac_0;
|
||||
struct rtw_debugfs_priv mac_1;
|
||||
struct rtw_debugfs_priv mac_2;
|
||||
struct rtw_debugfs_priv mac_3;
|
||||
struct rtw_debugfs_priv mac_4;
|
||||
struct rtw_debugfs_priv mac_5;
|
||||
struct rtw_debugfs_priv mac_6;
|
||||
struct rtw_debugfs_priv mac_7;
|
||||
struct rtw_debugfs_priv mac_10;
|
||||
struct rtw_debugfs_priv mac_11;
|
||||
struct rtw_debugfs_priv mac_12;
|
||||
struct rtw_debugfs_priv mac_13;
|
||||
struct rtw_debugfs_priv mac_14;
|
||||
struct rtw_debugfs_priv mac_15;
|
||||
struct rtw_debugfs_priv mac_16;
|
||||
struct rtw_debugfs_priv mac_17;
|
||||
struct rtw_debugfs_priv bb_8;
|
||||
struct rtw_debugfs_priv bb_9;
|
||||
struct rtw_debugfs_priv bb_a;
|
||||
struct rtw_debugfs_priv bb_b;
|
||||
struct rtw_debugfs_priv bb_c;
|
||||
struct rtw_debugfs_priv bb_d;
|
||||
struct rtw_debugfs_priv bb_e;
|
||||
struct rtw_debugfs_priv bb_f;
|
||||
struct rtw_debugfs_priv bb_18;
|
||||
struct rtw_debugfs_priv bb_19;
|
||||
struct rtw_debugfs_priv bb_1a;
|
||||
struct rtw_debugfs_priv bb_1b;
|
||||
struct rtw_debugfs_priv bb_1c;
|
||||
struct rtw_debugfs_priv bb_1d;
|
||||
struct rtw_debugfs_priv bb_1e;
|
||||
struct rtw_debugfs_priv bb_1f;
|
||||
struct rtw_debugfs_priv bb_2c;
|
||||
struct rtw_debugfs_priv bb_2d;
|
||||
struct rtw_debugfs_priv bb_40;
|
||||
struct rtw_debugfs_priv bb_41;
|
||||
struct rtw_debugfs_priv rf_dump;
|
||||
struct rtw_debugfs_priv tx_pwr_tbl;
|
||||
struct rtw_debugfs_priv write_reg;
|
||||
struct rtw_debugfs_priv h2c;
|
||||
struct rtw_debugfs_priv rf_write;
|
||||
struct rtw_debugfs_priv rf_read;
|
||||
struct rtw_debugfs_priv read_reg;
|
||||
struct rtw_debugfs_priv fix_rate;
|
||||
struct rtw_debugfs_priv dump_cam;
|
||||
struct rtw_debugfs_priv rsvd_page;
|
||||
struct rtw_debugfs_priv phy_info;
|
||||
struct rtw_debugfs_priv coex_enable;
|
||||
struct rtw_debugfs_priv coex_info;
|
||||
struct rtw_debugfs_priv edcca_enable;
|
||||
struct rtw_debugfs_priv fw_crash;
|
||||
struct rtw_debugfs_priv force_lowest_basic_rate;
|
||||
struct rtw_debugfs_priv dm_cap;
|
||||
};
|
||||
|
||||
static const char * const rtw_dm_cap_strs[] = {
|
||||
[RTW_DM_CAP_NA] = "NA",
|
||||
[RTW_DM_CAP_TXGAPK] = "TXGAPK",
|
||||
@@ -524,7 +580,7 @@ static int rtw_debug_get_bb_page(struct seq_file *m, void *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
|
||||
static int rtw_debugfs_get_rf_dump(struct seq_file *m, void *v)
|
||||
{
|
||||
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
@@ -1074,139 +1130,102 @@ static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define rtw_debug_impl_mac(page, addr) \
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = { \
|
||||
#define rtw_debug_priv_mac(addr) \
|
||||
{ \
|
||||
.cb_read = rtw_debug_get_mac_page, \
|
||||
.cb_data = addr, \
|
||||
}
|
||||
|
||||
rtw_debug_impl_mac(0, 0x0000);
|
||||
rtw_debug_impl_mac(1, 0x0100);
|
||||
rtw_debug_impl_mac(2, 0x0200);
|
||||
rtw_debug_impl_mac(3, 0x0300);
|
||||
rtw_debug_impl_mac(4, 0x0400);
|
||||
rtw_debug_impl_mac(5, 0x0500);
|
||||
rtw_debug_impl_mac(6, 0x0600);
|
||||
rtw_debug_impl_mac(7, 0x0700);
|
||||
rtw_debug_impl_mac(10, 0x1000);
|
||||
rtw_debug_impl_mac(11, 0x1100);
|
||||
rtw_debug_impl_mac(12, 0x1200);
|
||||
rtw_debug_impl_mac(13, 0x1300);
|
||||
rtw_debug_impl_mac(14, 0x1400);
|
||||
rtw_debug_impl_mac(15, 0x1500);
|
||||
rtw_debug_impl_mac(16, 0x1600);
|
||||
rtw_debug_impl_mac(17, 0x1700);
|
||||
|
||||
#define rtw_debug_impl_bb(page, addr) \
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_bb_ ##page = { \
|
||||
#define rtw_debug_priv_bb(addr) \
|
||||
{ \
|
||||
.cb_read = rtw_debug_get_bb_page, \
|
||||
.cb_data = addr, \
|
||||
}
|
||||
|
||||
rtw_debug_impl_bb(8, 0x0800);
|
||||
rtw_debug_impl_bb(9, 0x0900);
|
||||
rtw_debug_impl_bb(a, 0x0a00);
|
||||
rtw_debug_impl_bb(b, 0x0b00);
|
||||
rtw_debug_impl_bb(c, 0x0c00);
|
||||
rtw_debug_impl_bb(d, 0x0d00);
|
||||
rtw_debug_impl_bb(e, 0x0e00);
|
||||
rtw_debug_impl_bb(f, 0x0f00);
|
||||
rtw_debug_impl_bb(18, 0x1800);
|
||||
rtw_debug_impl_bb(19, 0x1900);
|
||||
rtw_debug_impl_bb(1a, 0x1a00);
|
||||
rtw_debug_impl_bb(1b, 0x1b00);
|
||||
rtw_debug_impl_bb(1c, 0x1c00);
|
||||
rtw_debug_impl_bb(1d, 0x1d00);
|
||||
rtw_debug_impl_bb(1e, 0x1e00);
|
||||
rtw_debug_impl_bb(1f, 0x1f00);
|
||||
rtw_debug_impl_bb(2c, 0x2c00);
|
||||
rtw_debug_impl_bb(2d, 0x2d00);
|
||||
rtw_debug_impl_bb(40, 0x4000);
|
||||
rtw_debug_impl_bb(41, 0x4100);
|
||||
#define rtw_debug_priv_get(name) \
|
||||
{ \
|
||||
.cb_read = rtw_debugfs_get_ ##name, \
|
||||
}
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_rf_dump = {
|
||||
.cb_read = rtw_debug_get_rf_dump,
|
||||
};
|
||||
#define rtw_debug_priv_set(name) \
|
||||
{ \
|
||||
.cb_write = rtw_debugfs_set_ ##name, \
|
||||
}
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_tx_pwr_tbl = {
|
||||
.cb_read = rtw_debugfs_get_tx_pwr_tbl,
|
||||
};
|
||||
#define rtw_debug_priv_set_and_get(name) \
|
||||
{ \
|
||||
.cb_write = rtw_debugfs_set_ ##name, \
|
||||
.cb_read = rtw_debugfs_get_ ##name, \
|
||||
}
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_write_reg = {
|
||||
.cb_write = rtw_debugfs_set_write_reg,
|
||||
};
|
||||
#define rtw_debug_priv_set_single_and_get(name) \
|
||||
{ \
|
||||
.cb_write = rtw_debugfs_set_single_input, \
|
||||
.cb_read = rtw_debugfs_get_ ##name, \
|
||||
}
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_h2c = {
|
||||
.cb_write = rtw_debugfs_set_h2c,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_rf_write = {
|
||||
.cb_write = rtw_debugfs_set_rf_write,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_rf_read = {
|
||||
.cb_write = rtw_debugfs_set_rf_read,
|
||||
.cb_read = rtw_debugfs_get_rf_read,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_read_reg = {
|
||||
.cb_write = rtw_debugfs_set_read_reg,
|
||||
.cb_read = rtw_debugfs_get_read_reg,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_fix_rate = {
|
||||
.cb_write = rtw_debugfs_set_fix_rate,
|
||||
.cb_read = rtw_debugfs_get_fix_rate,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_dump_cam = {
|
||||
.cb_write = rtw_debugfs_set_single_input,
|
||||
.cb_read = rtw_debugfs_get_dump_cam,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_rsvd_page = {
|
||||
.cb_write = rtw_debugfs_set_rsvd_page,
|
||||
.cb_read = rtw_debugfs_get_rsvd_page,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_phy_info = {
|
||||
.cb_read = rtw_debugfs_get_phy_info,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_coex_enable = {
|
||||
.cb_write = rtw_debugfs_set_coex_enable,
|
||||
.cb_read = rtw_debugfs_get_coex_enable,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_coex_info = {
|
||||
.cb_read = rtw_debugfs_get_coex_info,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_edcca_enable = {
|
||||
.cb_write = rtw_debugfs_set_edcca_enable,
|
||||
.cb_read = rtw_debugfs_get_edcca_enable,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_fw_crash = {
|
||||
.cb_write = rtw_debugfs_set_fw_crash,
|
||||
.cb_read = rtw_debugfs_get_fw_crash,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_force_lowest_basic_rate = {
|
||||
.cb_write = rtw_debugfs_set_force_lowest_basic_rate,
|
||||
.cb_read = rtw_debugfs_get_force_lowest_basic_rate,
|
||||
};
|
||||
|
||||
static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {
|
||||
.cb_write = rtw_debugfs_set_dm_cap,
|
||||
.cb_read = rtw_debugfs_get_dm_cap,
|
||||
static const struct rtw_debugfs rtw_debugfs_templ = {
|
||||
.mac_0 = rtw_debug_priv_mac(0x0000),
|
||||
.mac_1 = rtw_debug_priv_mac(0x0100),
|
||||
.mac_2 = rtw_debug_priv_mac(0x0200),
|
||||
.mac_3 = rtw_debug_priv_mac(0x0300),
|
||||
.mac_4 = rtw_debug_priv_mac(0x0400),
|
||||
.mac_5 = rtw_debug_priv_mac(0x0500),
|
||||
.mac_6 = rtw_debug_priv_mac(0x0600),
|
||||
.mac_7 = rtw_debug_priv_mac(0x0700),
|
||||
.mac_10 = rtw_debug_priv_mac(0x1000),
|
||||
.mac_11 = rtw_debug_priv_mac(0x1100),
|
||||
.mac_12 = rtw_debug_priv_mac(0x1200),
|
||||
.mac_13 = rtw_debug_priv_mac(0x1300),
|
||||
.mac_14 = rtw_debug_priv_mac(0x1400),
|
||||
.mac_15 = rtw_debug_priv_mac(0x1500),
|
||||
.mac_16 = rtw_debug_priv_mac(0x1600),
|
||||
.mac_17 = rtw_debug_priv_mac(0x1700),
|
||||
.bb_8 = rtw_debug_priv_bb(0x0800),
|
||||
.bb_9 = rtw_debug_priv_bb(0x0900),
|
||||
.bb_a = rtw_debug_priv_bb(0x0a00),
|
||||
.bb_b = rtw_debug_priv_bb(0x0b00),
|
||||
.bb_c = rtw_debug_priv_bb(0x0c00),
|
||||
.bb_d = rtw_debug_priv_bb(0x0d00),
|
||||
.bb_e = rtw_debug_priv_bb(0x0e00),
|
||||
.bb_f = rtw_debug_priv_bb(0x0f00),
|
||||
.bb_18 = rtw_debug_priv_bb(0x1800),
|
||||
.bb_19 = rtw_debug_priv_bb(0x1900),
|
||||
.bb_1a = rtw_debug_priv_bb(0x1a00),
|
||||
.bb_1b = rtw_debug_priv_bb(0x1b00),
|
||||
.bb_1c = rtw_debug_priv_bb(0x1c00),
|
||||
.bb_1d = rtw_debug_priv_bb(0x1d00),
|
||||
.bb_1e = rtw_debug_priv_bb(0x1e00),
|
||||
.bb_1f = rtw_debug_priv_bb(0x1f00),
|
||||
.bb_2c = rtw_debug_priv_bb(0x2c00),
|
||||
.bb_2d = rtw_debug_priv_bb(0x2d00),
|
||||
.bb_40 = rtw_debug_priv_bb(0x4000),
|
||||
.bb_41 = rtw_debug_priv_bb(0x4100),
|
||||
.rf_dump = rtw_debug_priv_get(rf_dump),
|
||||
.tx_pwr_tbl = rtw_debug_priv_get(tx_pwr_tbl),
|
||||
.write_reg = rtw_debug_priv_set(write_reg),
|
||||
.h2c = rtw_debug_priv_set(h2c),
|
||||
.rf_write = rtw_debug_priv_set(rf_write),
|
||||
.rf_read = rtw_debug_priv_set_and_get(rf_read),
|
||||
.read_reg = rtw_debug_priv_set_and_get(read_reg),
|
||||
.fix_rate = rtw_debug_priv_set_and_get(fix_rate),
|
||||
.dump_cam = rtw_debug_priv_set_single_and_get(dump_cam),
|
||||
.rsvd_page = rtw_debug_priv_set_and_get(rsvd_page),
|
||||
.phy_info = rtw_debug_priv_get(phy_info),
|
||||
.coex_enable = rtw_debug_priv_set_and_get(coex_enable),
|
||||
.coex_info = rtw_debug_priv_get(coex_info),
|
||||
.edcca_enable = rtw_debug_priv_set_and_get(edcca_enable),
|
||||
.fw_crash = rtw_debug_priv_set_and_get(fw_crash),
|
||||
.force_lowest_basic_rate = rtw_debug_priv_set_and_get(force_lowest_basic_rate),
|
||||
.dm_cap = rtw_debug_priv_set_and_get(dm_cap),
|
||||
};
|
||||
|
||||
#define rtw_debugfs_add_core(name, mode, fopname, parent) \
|
||||
do { \
|
||||
rtw_debug_priv_ ##name.rtwdev = rtwdev; \
|
||||
struct rtw_debugfs_priv *priv = &rtwdev->debugfs->name; \
|
||||
priv->rtwdev = rtwdev; \
|
||||
if (IS_ERR(debugfs_create_file(#name, mode, \
|
||||
parent, &rtw_debug_priv_ ##name,\
|
||||
parent, priv, \
|
||||
&file_ops_ ##fopname))) \
|
||||
pr_debug("Unable to initialize debugfs:%s\n", \
|
||||
#name); \
|
||||
@@ -1219,12 +1238,9 @@ static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {
|
||||
#define rtw_debugfs_add_r(name) \
|
||||
rtw_debugfs_add_core(name, S_IFREG | 0444, single_r, debugfs_topdir)
|
||||
|
||||
void rtw_debugfs_init(struct rtw_dev *rtwdev)
|
||||
static
|
||||
void rtw_debugfs_add_basic(struct rtw_dev *rtwdev, struct dentry *debugfs_topdir)
|
||||
{
|
||||
struct dentry *debugfs_topdir;
|
||||
|
||||
debugfs_topdir = debugfs_create_dir("rtw88",
|
||||
rtwdev->hw->wiphy->debugfsdir);
|
||||
rtw_debugfs_add_w(write_reg);
|
||||
rtw_debugfs_add_rw(read_reg);
|
||||
rtw_debugfs_add_w(rf_write);
|
||||
@@ -1236,6 +1252,17 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)
|
||||
rtw_debugfs_add_r(coex_info);
|
||||
rtw_debugfs_add_rw(coex_enable);
|
||||
rtw_debugfs_add_w(h2c);
|
||||
rtw_debugfs_add_r(rf_dump);
|
||||
rtw_debugfs_add_r(tx_pwr_tbl);
|
||||
rtw_debugfs_add_rw(edcca_enable);
|
||||
rtw_debugfs_add_rw(fw_crash);
|
||||
rtw_debugfs_add_rw(force_lowest_basic_rate);
|
||||
rtw_debugfs_add_rw(dm_cap);
|
||||
}
|
||||
|
||||
static
|
||||
void rtw_debugfs_add_sec0(struct rtw_dev *rtwdev, struct dentry *debugfs_topdir)
|
||||
{
|
||||
rtw_debugfs_add_r(mac_0);
|
||||
rtw_debugfs_add_r(mac_1);
|
||||
rtw_debugfs_add_r(mac_2);
|
||||
@@ -1252,6 +1279,11 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)
|
||||
rtw_debugfs_add_r(bb_d);
|
||||
rtw_debugfs_add_r(bb_e);
|
||||
rtw_debugfs_add_r(bb_f);
|
||||
}
|
||||
|
||||
static
|
||||
void rtw_debugfs_add_sec1(struct rtw_dev *rtwdev, struct dentry *debugfs_topdir)
|
||||
{
|
||||
rtw_debugfs_add_r(mac_10);
|
||||
rtw_debugfs_add_r(mac_11);
|
||||
rtw_debugfs_add_r(mac_12);
|
||||
@@ -1274,14 +1306,29 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)
|
||||
rtw_debugfs_add_r(bb_40);
|
||||
rtw_debugfs_add_r(bb_41);
|
||||
}
|
||||
rtw_debugfs_add_r(rf_dump);
|
||||
rtw_debugfs_add_r(tx_pwr_tbl);
|
||||
rtw_debugfs_add_rw(edcca_enable);
|
||||
rtw_debugfs_add_rw(fw_crash);
|
||||
rtw_debugfs_add_rw(force_lowest_basic_rate);
|
||||
rtw_debugfs_add_rw(dm_cap);
|
||||
}
|
||||
|
||||
void rtw_debugfs_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct dentry *debugfs_topdir;
|
||||
|
||||
rtwdev->debugfs = kmemdup(&rtw_debugfs_templ, sizeof(rtw_debugfs_templ),
|
||||
GFP_KERNEL);
|
||||
if (!rtwdev->debugfs)
|
||||
return;
|
||||
|
||||
debugfs_topdir = debugfs_create_dir("rtw88",
|
||||
rtwdev->hw->wiphy->debugfsdir);
|
||||
|
||||
rtw_debugfs_add_basic(rtwdev, debugfs_topdir);
|
||||
rtw_debugfs_add_sec0(rtwdev, debugfs_topdir);
|
||||
rtw_debugfs_add_sec1(rtwdev, debugfs_topdir);
|
||||
}
|
||||
|
||||
void rtw_debugfs_deinit(struct rtw_dev *rtwdev)
|
||||
{
|
||||
kfree(rtwdev->debugfs);
|
||||
}
|
||||
#endif /* CONFIG_RTW88_DEBUGFS */
|
||||
|
||||
#ifdef CONFIG_RTW88_DEBUG
|
||||
|
||||
@@ -25,6 +25,7 @@ enum rtw_debug_mask {
|
||||
RTW_DBG_HW_SCAN = 0x00010000,
|
||||
RTW_DBG_STATE = 0x00020000,
|
||||
RTW_DBG_SDIO = 0x00040000,
|
||||
RTW_DBG_USB = 0x00080000,
|
||||
|
||||
RTW_DBG_UNEXP = 0x80000000,
|
||||
RTW_DBG_ALL = 0xffffffff
|
||||
@@ -33,11 +34,13 @@ enum rtw_debug_mask {
|
||||
#ifdef CONFIG_RTW88_DEBUGFS
|
||||
|
||||
void rtw_debugfs_init(struct rtw_dev *rtwdev);
|
||||
void rtw_debugfs_deinit(struct rtw_dev *rtwdev);
|
||||
void rtw_debugfs_get_simple_phy_info(struct seq_file *m);
|
||||
|
||||
#else
|
||||
|
||||
static inline void rtw_debugfs_init(struct rtw_dev *rtwdev) {}
|
||||
static inline void rtw_debugfs_deinit(struct rtw_dev *rtwdev) {}
|
||||
|
||||
#endif /* CONFIG_RTW88_DEBUGFS */
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ struct rtw_hci_ops {
|
||||
void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);
|
||||
void (*link_ps)(struct rtw_dev *rtwdev, bool enter);
|
||||
void (*interface_cfg)(struct rtw_dev *rtwdev);
|
||||
void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable);
|
||||
|
||||
int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
|
||||
int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
|
||||
@@ -72,6 +73,12 @@ static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)
|
||||
rtwdev->hci.ops->interface_cfg(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw_hci_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
|
||||
{
|
||||
if (rtwdev->hci.ops->dynamic_rx_agg)
|
||||
rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable);
|
||||
}
|
||||
|
||||
static inline int
|
||||
rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
|
||||
{
|
||||
|
||||
@@ -212,6 +212,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
struct rtw_traffic_stats *stats = &rtwdev->stats;
|
||||
struct rtw_watch_dog_iter_data data = {};
|
||||
bool busy_traffic = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
|
||||
u32 tx_unicast_mbps, rx_unicast_mbps;
|
||||
bool ps_active;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
@@ -236,10 +237,11 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
else
|
||||
ps_active = false;
|
||||
|
||||
ewma_tp_add(&stats->tx_ewma_tp,
|
||||
(u32)(stats->tx_unicast >> RTW_TP_SHIFT));
|
||||
ewma_tp_add(&stats->rx_ewma_tp,
|
||||
(u32)(stats->rx_unicast >> RTW_TP_SHIFT));
|
||||
tx_unicast_mbps = stats->tx_unicast >> RTW_TP_SHIFT;
|
||||
rx_unicast_mbps = stats->rx_unicast >> RTW_TP_SHIFT;
|
||||
|
||||
ewma_tp_add(&stats->tx_ewma_tp, tx_unicast_mbps);
|
||||
ewma_tp_add(&stats->rx_ewma_tp, rx_unicast_mbps);
|
||||
stats->tx_throughput = ewma_tp_read(&stats->tx_ewma_tp);
|
||||
stats->rx_throughput = ewma_tp_read(&stats->rx_ewma_tp);
|
||||
|
||||
@@ -259,6 +261,9 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
|
||||
rtw_phy_dynamic_mechanism(rtwdev);
|
||||
|
||||
rtw_hci_dynamic_rx_agg(rtwdev,
|
||||
tx_unicast_mbps >= 1 || rx_unicast_mbps >= 1);
|
||||
|
||||
data.rtwdev = rtwdev;
|
||||
/* rtw_iterate_vifs internally uses an atomic iterator which is needed
|
||||
* to avoid taking local->iflist_mtx mutex
|
||||
@@ -1313,20 +1318,21 @@ static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fw_state *fw;
|
||||
int ret = 0;
|
||||
|
||||
fw = &rtwdev->fw;
|
||||
wait_for_completion(&fw->completion);
|
||||
if (!fw->firmware)
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
|
||||
if (chip->wow_fw_name) {
|
||||
fw = &rtwdev->wow_fw;
|
||||
wait_for_completion(&fw->completion);
|
||||
if (!fw->firmware)
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,
|
||||
@@ -2005,7 +2011,7 @@ static int rtw_chip_efuse_info_setup(struct rtw_dev *rtwdev)
|
||||
efuse->ext_pa_2g = efuse->pa_type_2g & BIT(4) ? 1 : 0;
|
||||
efuse->ext_lna_2g = efuse->lna_type_2g & BIT(3) ? 1 : 0;
|
||||
efuse->ext_pa_5g = efuse->pa_type_5g & BIT(0) ? 1 : 0;
|
||||
efuse->ext_lna_2g = efuse->lna_type_5g & BIT(3) ? 1 : 0;
|
||||
efuse->ext_lna_5g = efuse->lna_type_5g & BIT(3) ? 1 : 0;
|
||||
|
||||
if (!is_valid_ether_addr(efuse->addr)) {
|
||||
eth_random_addr(efuse->addr);
|
||||
@@ -2299,6 +2305,7 @@ void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
|
||||
ieee80211_unregister_hw(hw);
|
||||
rtw_unset_supported_band(hw, chip);
|
||||
rtw_debugfs_deinit(rtwdev);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_unregister_hw);
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ extern const struct ieee80211_ops rtw_ops;
|
||||
#define RTW_MAX_CHANNEL_NUM_5G 49
|
||||
|
||||
struct rtw_dev;
|
||||
struct rtw_debugfs;
|
||||
|
||||
enum rtw_hci_type {
|
||||
RTW_HCI_TYPE_PCIE,
|
||||
@@ -622,6 +623,7 @@ struct rtw_rx_pkt_stat {
|
||||
bool crc_err;
|
||||
bool decrypted;
|
||||
bool is_c2h;
|
||||
bool channel_invalid;
|
||||
|
||||
s32 signal_power;
|
||||
u16 pkt_len;
|
||||
@@ -1785,6 +1787,8 @@ struct rtw_efuse {
|
||||
bool share_ant;
|
||||
u8 bt_setting;
|
||||
|
||||
u8 usb_mode_switch;
|
||||
|
||||
struct {
|
||||
u8 hci;
|
||||
u8 bw;
|
||||
@@ -2051,7 +2055,7 @@ struct rtw_dev {
|
||||
bool beacon_loss;
|
||||
struct completion lps_leave_check;
|
||||
|
||||
struct dentry *debugfs;
|
||||
struct rtw_debugfs *debugfs;
|
||||
|
||||
u8 sta_cnt;
|
||||
u32 rts_threshold;
|
||||
|
||||
@@ -1088,6 +1088,7 @@ static u32 rtw_pci_rx_napi(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
|
||||
/* remove rx_desc */
|
||||
skb_pull(new, pkt_offset);
|
||||
|
||||
rtw_update_rx_freq_for_invalid(rtwdev, new, &rx_status, &pkt_stat);
|
||||
rtw_rx_stats(rtwdev, pkt_stat.vif, new);
|
||||
memcpy(new->cb, &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_napi(rtwdev->hw, NULL, new, napi);
|
||||
@@ -1600,6 +1601,7 @@ static struct rtw_hci_ops rtw_pci_ops = {
|
||||
.deep_ps = rtw_pci_deep_ps,
|
||||
.link_ps = rtw_pci_link_ps,
|
||||
.interface_cfg = rtw_pci_interface_cfg,
|
||||
.dynamic_rx_agg = NULL,
|
||||
|
||||
.read8 = rtw_pci_read8,
|
||||
.read16 = rtw_pci_read16,
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#define BIT_WLOCK_1C_B6 BIT(5)
|
||||
#define REG_SYS_PW_CTRL 0x0004
|
||||
#define BIT_PFM_WOWL BIT(3)
|
||||
#define BIT_APFM_OFFMAC BIT(9)
|
||||
#define REG_SYS_CLK_CTRL 0x0008
|
||||
#define BIT_CPU_CLK_EN BIT(14)
|
||||
|
||||
@@ -133,6 +134,14 @@
|
||||
#define REG_PMC_DBG_CTRL1 0xa8
|
||||
#define BITS_PMC_BT_IQK_STS GENMASK(22, 21)
|
||||
|
||||
#define REG_PAD_CTRL2 0x00C4
|
||||
#define BIT_RSM_EN_V1 BIT(16)
|
||||
#define BIT_NO_PDN_CHIPOFF_V1 BIT(17)
|
||||
#define BIT_MASK_USB23_SW_MODE_V1 GENMASK(19, 18)
|
||||
#define BIT_USB3_USB2_TRANSITION BIT(20)
|
||||
#define BIT_USB_MODE_U2 1
|
||||
#define BIT_USB_MODE_U3 2
|
||||
|
||||
#define REG_EFUSE_ACCESS 0x00CF
|
||||
#define EFUSE_ACCESS_ON 0x69
|
||||
#define EFUSE_ACCESS_OFF 0x00
|
||||
@@ -313,6 +322,12 @@
|
||||
#define REG_RXDMA_DPR 0x028C
|
||||
#define REG_RXDMA_MODE 0x0290
|
||||
#define BIT_DMA_MODE BIT(1)
|
||||
#define BIT_DMA_BURST_CNT GENMASK(3, 2)
|
||||
#define BIT_DMA_BURST_SIZE GENMASK(5, 4)
|
||||
#define BIT_DMA_BURST_SIZE_64 2
|
||||
#define BIT_DMA_BURST_SIZE_512 1
|
||||
#define BIT_DMA_BURST_SIZE_1024 0
|
||||
|
||||
#define REG_RXPKTNUM 0x02B0
|
||||
|
||||
#define REG_INT_MIG 0x0304
|
||||
@@ -568,6 +583,8 @@
|
||||
#define BIT_WL_SECURITY_CLK BIT(15)
|
||||
#define BIT_DDMA_EN BIT(8)
|
||||
|
||||
#define REG_SW_MDIO 0x10C0
|
||||
|
||||
#define REG_H2C_PKT_READADDR 0x10D0
|
||||
#define REG_H2C_PKT_WRITEADDR 0x10D4
|
||||
#define REG_FW_DBG6 0x10F8
|
||||
|
||||
@@ -31,8 +31,6 @@ static const struct usb_device_id rtw_8821cu_id_table[] = {
|
||||
.driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82b, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82c, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331d, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* D-Link */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xc811, 0xff, 0xff, 0xff),
|
||||
|
||||
@@ -46,6 +46,7 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
|
||||
map = (struct rtw8822b_efuse *)log_map;
|
||||
|
||||
efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(7));
|
||||
efuse->rfe_option = map->rfe_option;
|
||||
efuse->rf_board_option = map->rf_board_option;
|
||||
efuse->crystal_cap = map->xtal_k;
|
||||
|
||||
@@ -72,7 +72,9 @@ struct rtw8822bs_efuse {
|
||||
|
||||
struct rtw8822b_efuse {
|
||||
__le16 rtl_id;
|
||||
u8 res0[0x0e];
|
||||
u8 res0[4];
|
||||
u8 usb_mode;
|
||||
u8 res1[0x09];
|
||||
|
||||
/* power index for four RF paths */
|
||||
struct rtw_txpwr_idx txpwr_idx_table[4];
|
||||
|
||||
@@ -49,6 +49,7 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
|
||||
map = (struct rtw8822c_efuse *)log_map;
|
||||
|
||||
efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(7));
|
||||
efuse->rfe_option = map->rfe_option;
|
||||
efuse->rf_board_option = map->rf_board_option;
|
||||
efuse->crystal_cap = map->xtal_k & XCAP_MASK;
|
||||
@@ -2575,9 +2576,10 @@ static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
rx_power[RF_PATH_B] -= 110;
|
||||
|
||||
channel = GET_PHY_STAT_P0_CHANNEL(phy_status);
|
||||
if (channel == 0)
|
||||
channel = rtwdev->hal.current_channel;
|
||||
rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
if (channel != 0)
|
||||
rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
else
|
||||
pkt_stat->channel_invalid = true;
|
||||
|
||||
pkt_stat->rx_power[RF_PATH_A] = rx_power[RF_PATH_A];
|
||||
pkt_stat->rx_power[RF_PATH_B] = rx_power[RF_PATH_B];
|
||||
@@ -2611,12 +2613,14 @@ static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
else
|
||||
rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
|
||||
|
||||
if (rxsc >= 9 && rxsc <= 12)
|
||||
bw = RTW_CHANNEL_WIDTH_40;
|
||||
else if (rxsc >= 13)
|
||||
bw = RTW_CHANNEL_WIDTH_80;
|
||||
else
|
||||
if (rxsc == 0)
|
||||
bw = rtwdev->hal.current_band_width;
|
||||
else if (rxsc >= 1 && rxsc <= 8)
|
||||
bw = RTW_CHANNEL_WIDTH_20;
|
||||
else if (rxsc >= 9 && rxsc <= 12)
|
||||
bw = RTW_CHANNEL_WIDTH_40;
|
||||
else
|
||||
bw = RTW_CHANNEL_WIDTH_80;
|
||||
|
||||
channel = GET_PHY_STAT_P1_CHANNEL(phy_status);
|
||||
rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
|
||||
@@ -59,16 +59,18 @@ struct rtw8822ce_efuse {
|
||||
|
||||
struct rtw8822c_efuse {
|
||||
__le16 rtl_id;
|
||||
u8 res0[0x0e];
|
||||
u8 res0[4];
|
||||
u8 usb_mode;
|
||||
u8 res1[0x09];
|
||||
|
||||
/* power index for four RF paths */
|
||||
struct rtw_txpwr_idx txpwr_idx_table[4];
|
||||
|
||||
u8 channel_plan; /* 0xb8 */
|
||||
u8 xtal_k;
|
||||
u8 res1;
|
||||
u8 res2;
|
||||
u8 iqk_lck;
|
||||
u8 res2[5]; /* 0xbc */
|
||||
u8 res3[5]; /* 0xbc */
|
||||
u8 rf_board_option;
|
||||
u8 rf_feature_option;
|
||||
u8 rf_bt_setting;
|
||||
@@ -80,21 +82,21 @@ struct rtw8822c_efuse {
|
||||
u8 rf_antenna_option; /* 0xc9 */
|
||||
u8 rfe_option;
|
||||
u8 country_code[2];
|
||||
u8 res3[3];
|
||||
u8 res4[3];
|
||||
u8 path_a_thermal; /* 0xd0 */
|
||||
u8 path_b_thermal;
|
||||
u8 res4[2];
|
||||
u8 res5[2];
|
||||
u8 rx_gain_gap_2g_ofdm;
|
||||
u8 res5;
|
||||
u8 rx_gain_gap_2g_cck;
|
||||
u8 res6;
|
||||
u8 rx_gain_gap_5gl;
|
||||
u8 rx_gain_gap_2g_cck;
|
||||
u8 res7;
|
||||
u8 rx_gain_gap_5gm;
|
||||
u8 rx_gain_gap_5gl;
|
||||
u8 res8;
|
||||
u8 rx_gain_gap_5gh;
|
||||
u8 rx_gain_gap_5gm;
|
||||
u8 res9;
|
||||
u8 res10[0x42];
|
||||
u8 rx_gain_gap_5gh;
|
||||
u8 res10;
|
||||
u8 res11[0x42];
|
||||
union {
|
||||
struct rtw8822ce_efuse e;
|
||||
struct rtw8822cu_efuse u;
|
||||
|
||||
@@ -146,6 +146,47 @@ static void rtw_set_rx_freq_by_pktstat(struct rtw_rx_pkt_stat *pkt_stat,
|
||||
rx_status->band = pkt_stat->band;
|
||||
}
|
||||
|
||||
void rtw_update_rx_freq_from_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtw_rx_pkt_stat *pkt_stat)
|
||||
{
|
||||
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
|
||||
int channel = rtwdev->hal.current_channel;
|
||||
size_t hdr_len, ielen;
|
||||
int channel_number;
|
||||
u8 *variable;
|
||||
|
||||
if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
|
||||
goto fill_rx_status;
|
||||
|
||||
if (ieee80211_is_beacon(mgmt->frame_control)) {
|
||||
variable = mgmt->u.beacon.variable;
|
||||
hdr_len = offsetof(struct ieee80211_mgmt,
|
||||
u.beacon.variable);
|
||||
} else if (ieee80211_is_probe_resp(mgmt->frame_control)) {
|
||||
variable = mgmt->u.probe_resp.variable;
|
||||
hdr_len = offsetof(struct ieee80211_mgmt,
|
||||
u.probe_resp.variable);
|
||||
} else {
|
||||
goto fill_rx_status;
|
||||
}
|
||||
|
||||
if (skb->len > hdr_len)
|
||||
ielen = skb->len - hdr_len;
|
||||
else
|
||||
goto fill_rx_status;
|
||||
|
||||
channel_number = cfg80211_get_ies_channel_number(variable, ielen,
|
||||
NL80211_BAND_2GHZ);
|
||||
if (channel_number != -1)
|
||||
channel = channel_number;
|
||||
|
||||
fill_rx_status:
|
||||
rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
rtw_set_rx_freq_by_pktstat(pkt_stat, rx_status);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_update_rx_freq_from_ie);
|
||||
|
||||
void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
struct rtw_rx_pkt_stat *pkt_stat,
|
||||
struct ieee80211_hdr *hdr,
|
||||
|
||||
@@ -41,7 +41,7 @@ enum rtw_rx_desc_enc {
|
||||
#define GET_RX_DESC_TSFL(rxdesc) \
|
||||
le32_get_bits(*((__le32 *)(rxdesc) + 0x05), GENMASK(31, 0))
|
||||
#define GET_RX_DESC_BW(rxdesc) \
|
||||
(le32_get_bits(*((__le32 *)(rxdesc) + 0x04), GENMASK(31, 24)))
|
||||
(le32_get_bits(*((__le32 *)(rxdesc) + 0x04), GENMASK(5, 4)))
|
||||
|
||||
void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct sk_buff *skb);
|
||||
@@ -50,5 +50,18 @@ void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
struct ieee80211_hdr *hdr,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
u8 *phy_status);
|
||||
void rtw_update_rx_freq_from_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtw_rx_pkt_stat *pkt_stat);
|
||||
|
||||
static inline
|
||||
void rtw_update_rx_freq_for_invalid(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtw_rx_pkt_stat *pkt_stat)
|
||||
{
|
||||
if (pkt_stat->channel_invalid)
|
||||
rtw_update_rx_freq_from_ie(rtwdev, skb, rx_status, pkt_stat);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -948,6 +948,7 @@ static void rtw_sdio_rx_skb(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
skb_put(skb, pkt_stat->pkt_len);
|
||||
skb_reserve(skb, pkt_offset);
|
||||
|
||||
rtw_update_rx_freq_for_invalid(rtwdev, skb, rx_status, pkt_stat);
|
||||
rtw_rx_stats(rtwdev, pkt_stat->vif, skb);
|
||||
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
@@ -1156,6 +1157,7 @@ static struct rtw_hci_ops rtw_sdio_ops = {
|
||||
.deep_ps = rtw_sdio_deep_ps,
|
||||
.link_ps = rtw_sdio_link_ps,
|
||||
.interface_cfg = rtw_sdio_interface_cfg,
|
||||
.dynamic_rx_agg = NULL,
|
||||
|
||||
.read8 = rtw_sdio_read8,
|
||||
.read16 = rtw_sdio_read16,
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
#include "ps.h"
|
||||
#include "usb.h"
|
||||
|
||||
static bool rtw_switch_usb_mode = true;
|
||||
module_param_named(switch_usb_mode, rtw_switch_usb_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(switch_usb_mode,
|
||||
"Set to N to disable switching to USB 3 mode to avoid potential interference in the 2.4 GHz band (default: Y)");
|
||||
|
||||
#define RTW_USB_MAX_RXQ_LEN 512
|
||||
|
||||
struct rtw_usb_txcb {
|
||||
@@ -541,11 +546,12 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_work);
|
||||
struct rtw_dev *rtwdev = rtwusb->rtwdev;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_rx_pkt_stat pkt_stat;
|
||||
struct ieee80211_rx_status rx_status;
|
||||
struct sk_buff *skb;
|
||||
u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
|
||||
u32 pkt_offset;
|
||||
struct ieee80211_rx_status rx_status;
|
||||
u32 pkt_offset, next_pkt, urb_len;
|
||||
struct rtw_rx_pkt_stat pkt_stat;
|
||||
struct sk_buff *next_skb;
|
||||
struct sk_buff *skb;
|
||||
u8 *rx_desc;
|
||||
int limit;
|
||||
|
||||
@@ -554,28 +560,48 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
if (!skb)
|
||||
break;
|
||||
|
||||
rx_desc = skb->data;
|
||||
chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
&rx_status);
|
||||
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
pkt_stat.shift;
|
||||
|
||||
if (pkt_stat.is_c2h) {
|
||||
skb_put(skb, pkt_stat.pkt_len + pkt_offset);
|
||||
rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) {
|
||||
dev_dbg_ratelimited(rtwdev->dev, "failed to get rx_queue, overflow\n");
|
||||
dev_kfree_skb_any(skb);
|
||||
continue;
|
||||
}
|
||||
|
||||
skb_put(skb, pkt_stat.pkt_len);
|
||||
skb_reserve(skb, pkt_offset);
|
||||
memcpy(skb->cb, &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
urb_len = skb->len;
|
||||
|
||||
do {
|
||||
rx_desc = skb->data;
|
||||
chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
&rx_status);
|
||||
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
pkt_stat.shift;
|
||||
|
||||
next_pkt = round_up(pkt_stat.pkt_len + pkt_offset, 8);
|
||||
|
||||
if (urb_len >= next_pkt + pkt_desc_sz)
|
||||
next_skb = skb_clone(skb, GFP_KERNEL);
|
||||
else
|
||||
next_skb = NULL;
|
||||
|
||||
if (pkt_stat.is_c2h) {
|
||||
skb_trim(skb, pkt_stat.pkt_len + pkt_offset);
|
||||
rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
|
||||
} else {
|
||||
skb_pull(skb, pkt_offset);
|
||||
skb_trim(skb, pkt_stat.pkt_len);
|
||||
rtw_update_rx_freq_for_invalid(rtwdev, skb,
|
||||
&rx_status,
|
||||
&pkt_stat);
|
||||
rtw_rx_stats(rtwdev, pkt_stat.vif, skb);
|
||||
memcpy(skb->cb, &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
}
|
||||
|
||||
skb = next_skb;
|
||||
if (skb)
|
||||
skb_pull(skb, next_pkt);
|
||||
|
||||
urb_len -= next_pkt;
|
||||
} while (skb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -619,6 +645,7 @@ static void rtw_usb_read_port_complete(struct urb *urb)
|
||||
if (skb)
|
||||
dev_kfree_skb_any(skb);
|
||||
} else {
|
||||
skb_put(skb, urb->actual_length);
|
||||
skb_queue_tail(&rtwusb->rx_queue, skb);
|
||||
queue_work(rtwusb->rxwq, &rtwusb->rx_work);
|
||||
}
|
||||
@@ -713,9 +740,69 @@ static void rtw_usb_link_ps(struct rtw_dev *rtwdev, bool enter)
|
||||
/* empty function for rtw_hci_ops */
|
||||
}
|
||||
|
||||
static void rtw_usb_init_burst_pkt_len(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
|
||||
enum usb_device_speed speed = rtwusb->udev->speed;
|
||||
u8 rxdma, burst_size;
|
||||
|
||||
rxdma = BIT_DMA_BURST_CNT | BIT_DMA_MODE;
|
||||
|
||||
if (speed == USB_SPEED_SUPER)
|
||||
burst_size = BIT_DMA_BURST_SIZE_1024;
|
||||
else if (speed == USB_SPEED_HIGH)
|
||||
burst_size = BIT_DMA_BURST_SIZE_512;
|
||||
else
|
||||
burst_size = BIT_DMA_BURST_SIZE_64;
|
||||
|
||||
u8p_replace_bits(&rxdma, burst_size, BIT_DMA_BURST_SIZE);
|
||||
|
||||
rtw_write8(rtwdev, REG_RXDMA_MODE, rxdma);
|
||||
rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
|
||||
}
|
||||
|
||||
static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
/* empty function for rtw_hci_ops */
|
||||
rtw_usb_init_burst_pkt_len(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw_usb_dynamic_rx_agg_v1(struct rtw_dev *rtwdev, bool enable)
|
||||
{
|
||||
u8 size, timeout;
|
||||
u16 val16;
|
||||
|
||||
rtw_write32_set(rtwdev, REG_RXDMA_AGG_PG_TH, BIT_EN_PRE_CALC);
|
||||
rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
|
||||
rtw_write8_clr(rtwdev, REG_RXDMA_AGG_PG_TH + 3, BIT(7));
|
||||
|
||||
if (enable) {
|
||||
size = 0x5;
|
||||
timeout = 0x20;
|
||||
} else {
|
||||
size = 0x0;
|
||||
timeout = 0x1;
|
||||
}
|
||||
val16 = u16_encode_bits(size, BIT_RXDMA_AGG_PG_TH) |
|
||||
u16_encode_bits(timeout, BIT_DMA_AGG_TO_V1);
|
||||
|
||||
rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
|
||||
}
|
||||
|
||||
static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
|
||||
{
|
||||
switch (rtwdev->chip->id) {
|
||||
case RTW_CHIP_TYPE_8822C:
|
||||
case RTW_CHIP_TYPE_8822B:
|
||||
case RTW_CHIP_TYPE_8821C:
|
||||
rtw_usb_dynamic_rx_agg_v1(rtwdev, enable);
|
||||
break;
|
||||
case RTW_CHIP_TYPE_8723D:
|
||||
/* Doesn't like aggregation. */
|
||||
break;
|
||||
case RTW_CHIP_TYPE_8703B:
|
||||
/* Likely not found in USB devices. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct rtw_hci_ops rtw_usb_ops = {
|
||||
@@ -727,6 +814,7 @@ static struct rtw_hci_ops rtw_usb_ops = {
|
||||
.deep_ps = rtw_usb_deep_ps,
|
||||
.link_ps = rtw_usb_link_ps,
|
||||
.interface_cfg = rtw_usb_interface_cfg,
|
||||
.dynamic_rx_agg = rtw_usb_dynamic_rx_agg,
|
||||
|
||||
.write8 = rtw_usb_write8,
|
||||
.write16 = rtw_usb_write16,
|
||||
@@ -841,6 +929,77 @@ static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev,
|
||||
usb_set_intfdata(intf, NULL);
|
||||
}
|
||||
|
||||
static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev)
|
||||
{
|
||||
enum usb_device_speed cur_speed;
|
||||
u8 id = rtwdev->chip->id;
|
||||
bool can_switch;
|
||||
u32 pad_ctrl2;
|
||||
|
||||
if (rtw_read8(rtwdev, REG_SYS_CFG2 + 3) == 0x20)
|
||||
cur_speed = USB_SPEED_SUPER;
|
||||
else
|
||||
cur_speed = USB_SPEED_HIGH;
|
||||
|
||||
if (cur_speed == USB_SPEED_SUPER)
|
||||
return 0;
|
||||
|
||||
pad_ctrl2 = rtw_read32(rtwdev, REG_PAD_CTRL2);
|
||||
|
||||
can_switch = !!(pad_ctrl2 & (BIT_MASK_USB23_SW_MODE_V1 |
|
||||
BIT_USB3_USB2_TRANSITION));
|
||||
|
||||
if (!can_switch) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
"Switching to USB 3 mode unsupported by the chip\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* At this point cur_speed is USB_SPEED_HIGH. If we already tried
|
||||
* to switch don't try again - it's a USB 2 port.
|
||||
*/
|
||||
if (u32_get_bits(pad_ctrl2, BIT_MASK_USB23_SW_MODE_V1) == BIT_USB_MODE_U3)
|
||||
return 0;
|
||||
|
||||
/* Enable IO wrapper timeout */
|
||||
if (id == RTW_CHIP_TYPE_8822B || id == RTW_CHIP_TYPE_8821C)
|
||||
rtw_write8_clr(rtwdev, REG_SW_MDIO + 3, BIT(0));
|
||||
|
||||
u32p_replace_bits(&pad_ctrl2, BIT_USB_MODE_U3, BIT_MASK_USB23_SW_MODE_V1);
|
||||
pad_ctrl2 |= BIT_RSM_EN_V1;
|
||||
|
||||
rtw_write32(rtwdev, REG_PAD_CTRL2, pad_ctrl2);
|
||||
rtw_write8(rtwdev, REG_PAD_CTRL2 + 1, 4);
|
||||
|
||||
rtw_write16_set(rtwdev, REG_SYS_PW_CTRL, BIT_APFM_OFFMAC);
|
||||
usleep_range(1000, 1001);
|
||||
rtw_write32_set(rtwdev, REG_PAD_CTRL2, BIT_NO_PDN_CHIPOFF_V1);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int rtw_usb_switch_mode(struct rtw_dev *rtwdev)
|
||||
{
|
||||
u8 id = rtwdev->chip->id;
|
||||
|
||||
if (id != RTW_CHIP_TYPE_8822C && id != RTW_CHIP_TYPE_8822B)
|
||||
return 0;
|
||||
|
||||
if (!rtwdev->efuse.usb_mode_switch) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
"Switching to USB 3 mode disabled by chip's efuse\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!rtw_switch_usb_mode) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
"Switching to USB 3 mode disabled by module parameter\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return rtw_usb_switch_mode_new(rtwdev);
|
||||
}
|
||||
|
||||
int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct rtw_dev *rtwdev;
|
||||
@@ -896,6 +1055,14 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
goto err_destroy_rxwq;
|
||||
}
|
||||
|
||||
ret = rtw_usb_switch_mode(rtwdev);
|
||||
if (ret) {
|
||||
/* Not a fail, but we do need to skip rtw_register_hw. */
|
||||
rtw_dbg(rtwdev, RTW_DBG_USB, "switching to USB 3 mode\n");
|
||||
ret = 0;
|
||||
goto err_destroy_rxwq;
|
||||
}
|
||||
|
||||
ret = rtw_register_hw(rtwdev, rtwdev->hw);
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to register hw\n");
|
||||
|
||||
@@ -12,6 +12,7 @@ if RTW89
|
||||
|
||||
config RTW89_CORE
|
||||
tristate
|
||||
select WANT_DEV_COREDUMP
|
||||
|
||||
config RTW89_PCI
|
||||
tristate
|
||||
@@ -28,6 +29,9 @@ config RTW89_8852B_COMMON
|
||||
config RTW89_8852B
|
||||
tristate
|
||||
|
||||
config RTW89_8852BT
|
||||
tristate
|
||||
|
||||
config RTW89_8852C
|
||||
tristate
|
||||
|
||||
@@ -68,6 +72,18 @@ config RTW89_8852BE
|
||||
|
||||
802.11ax PCIe wireless network (Wi-Fi 6) adapter
|
||||
|
||||
config RTW89_8852BTE
|
||||
tristate "Realtek 8852BE-VT PCI wireless network (Wi-Fi 6) adapter"
|
||||
depends on PCI
|
||||
select RTW89_CORE
|
||||
select RTW89_PCI
|
||||
select RTW89_8852BT
|
||||
select RTW89_8852B_COMMON
|
||||
help
|
||||
Select this option will enable support for 8852BE-VT chipset
|
||||
|
||||
802.11ax PCIe wireless network (Wi-Fi 6) adapter
|
||||
|
||||
config RTW89_8852CE
|
||||
tristate "Realtek 8852CE PCI wireless network (Wi-Fi 6E) adapter"
|
||||
depends on PCI
|
||||
|
||||
@@ -52,6 +52,14 @@ rtw89_8852b-objs := rtw8852b.o \
|
||||
obj-$(CONFIG_RTW89_8852BE) += rtw89_8852be.o
|
||||
rtw89_8852be-objs := rtw8852be.o
|
||||
|
||||
obj-$(CONFIG_RTW89_8852BT) += rtw89_8852bt.o
|
||||
rtw89_8852bt-objs := rtw8852bt.o \
|
||||
rtw8852bt_rfk.o \
|
||||
rtw8852bt_rfk_table.o
|
||||
|
||||
obj-$(CONFIG_RTW89_8852BTE) += rtw89_8852bte.o
|
||||
rtw89_8852bte-objs := rtw8852bte.o
|
||||
|
||||
obj-$(CONFIG_RTW89_8852C) += rtw89_8852c.o
|
||||
rtw89_8852c-objs := rtw8852c.o \
|
||||
rtw8852c_table.o \
|
||||
|
||||
@@ -384,20 +384,24 @@ int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_CCMP128;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_CCMP256;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
ext_key = true;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_GCMP128;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_GCMP256;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
ext_key = true;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
|
||||
@@ -124,12 +124,12 @@ void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan,
|
||||
}
|
||||
|
||||
bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct rtw89_chan *new)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_chan *chan = &hal->sub[idx].chan;
|
||||
struct rtw89_chan_rcd *rcd = &hal->sub[idx].rcd;
|
||||
struct rtw89_chan *chan = &hal->chanctx[idx].chan;
|
||||
struct rtw89_chan_rcd *rcd = &hal->chanctx[idx].rcd;
|
||||
bool band_changed;
|
||||
|
||||
rcd->prev_primary_channel = chan->primary_channel;
|
||||
@@ -153,7 +153,7 @@ int rtw89_iterate_entity_chan(struct rtw89_dev *rtwdev,
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_SUB_ENTITY) {
|
||||
for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) {
|
||||
chan = rtw89_chan_get(rtwdev, idx);
|
||||
ret = iterator(chan, data);
|
||||
if (ret)
|
||||
@@ -164,36 +164,36 @@ int rtw89_iterate_entity_chan(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void __rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
bool from_stack)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
|
||||
hal->sub[idx].chandef = *chandef;
|
||||
hal->chanctx[idx].chandef = *chandef;
|
||||
|
||||
if (from_stack)
|
||||
set_bit(idx, hal->entity_map);
|
||||
}
|
||||
|
||||
void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
__rtw89_config_entity_chandef(rtwdev, idx, chandef, true);
|
||||
}
|
||||
|
||||
void rtw89_config_roc_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
enum rtw89_sub_entity_idx cur;
|
||||
enum rtw89_chanctx_idx cur;
|
||||
|
||||
if (chandef) {
|
||||
cur = atomic_cmpxchg(&hal->roc_entity_idx,
|
||||
RTW89_SUB_ENTITY_IDLE, idx);
|
||||
if (cur != RTW89_SUB_ENTITY_IDLE) {
|
||||
RTW89_CHANCTX_IDLE, idx);
|
||||
if (cur != RTW89_CHANCTX_IDLE) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX,
|
||||
"ROC still processing on entity %d\n", idx);
|
||||
return;
|
||||
@@ -202,11 +202,11 @@ void rtw89_config_roc_chandef(struct rtw89_dev *rtwdev,
|
||||
hal->roc_chandef = *chandef;
|
||||
} else {
|
||||
cur = atomic_cmpxchg(&hal->roc_entity_idx, idx,
|
||||
RTW89_SUB_ENTITY_IDLE);
|
||||
RTW89_CHANCTX_IDLE);
|
||||
if (cur == idx)
|
||||
return;
|
||||
|
||||
if (cur == RTW89_SUB_ENTITY_IDLE)
|
||||
if (cur == RTW89_CHANCTX_IDLE)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX,
|
||||
"ROC already finished on entity %d\n", idx);
|
||||
else
|
||||
@@ -220,7 +220,7 @@ static void rtw89_config_default_chandef(struct rtw89_dev *rtwdev)
|
||||
struct cfg80211_chan_def chandef = {0};
|
||||
|
||||
rtw89_get_default_chandef(&chandef);
|
||||
__rtw89_config_entity_chandef(rtwdev, RTW89_SUB_ENTITY_0, &chandef, false);
|
||||
__rtw89_config_entity_chandef(rtwdev, RTW89_CHANCTX_0, &chandef, false);
|
||||
}
|
||||
|
||||
void rtw89_entity_init(struct rtw89_dev *rtwdev)
|
||||
@@ -228,9 +228,9 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev)
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
|
||||
hal->entity_pause = false;
|
||||
bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
|
||||
bitmap_zero(hal->entity_map, NUM_OF_RTW89_CHANCTX);
|
||||
bitmap_zero(hal->changes, NUM_OF_RTW89_CHANCTX_CHANGES);
|
||||
atomic_set(&hal->roc_entity_idx, RTW89_SUB_ENTITY_IDLE);
|
||||
atomic_set(&hal->roc_entity_idx, RTW89_CHANCTX_IDLE);
|
||||
rtw89_config_default_chandef(rtwdev);
|
||||
}
|
||||
|
||||
@@ -242,8 +242,8 @@ static void rtw89_entity_calculate_weight(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif;
|
||||
int idx;
|
||||
|
||||
for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_SUB_ENTITY) {
|
||||
cfg = hal->sub[idx].cfg;
|
||||
for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) {
|
||||
cfg = hal->chanctx[idx].cfg;
|
||||
if (!cfg) {
|
||||
/* doesn't run with chanctx ops; one channel at most */
|
||||
w->active_chanctxs = 1;
|
||||
@@ -262,7 +262,7 @@ static void rtw89_entity_calculate_weight(struct rtw89_dev *rtwdev,
|
||||
|
||||
enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
DECLARE_BITMAP(recalc_map, NUM_OF_RTW89_SUB_ENTITY) = {};
|
||||
DECLARE_BITMAP(recalc_map, NUM_OF_RTW89_CHANCTX) = {};
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct cfg80211_chan_def *chandef;
|
||||
struct rtw89_entity_weight w = {};
|
||||
@@ -272,23 +272,23 @@ enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
bitmap_copy(recalc_map, hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
|
||||
bitmap_copy(recalc_map, hal->entity_map, NUM_OF_RTW89_CHANCTX);
|
||||
|
||||
rtw89_entity_calculate_weight(rtwdev, &w);
|
||||
switch (w.active_chanctxs) {
|
||||
default:
|
||||
rtw89_warn(rtwdev, "unknown ent chanctxs weight: %d\n",
|
||||
w.active_chanctxs);
|
||||
bitmap_zero(recalc_map, NUM_OF_RTW89_SUB_ENTITY);
|
||||
bitmap_zero(recalc_map, NUM_OF_RTW89_CHANCTX);
|
||||
fallthrough;
|
||||
case 0:
|
||||
rtw89_config_default_chandef(rtwdev);
|
||||
set_bit(RTW89_SUB_ENTITY_0, recalc_map);
|
||||
set_bit(RTW89_CHANCTX_0, recalc_map);
|
||||
fallthrough;
|
||||
case 1:
|
||||
mode = RTW89_ENTITY_MODE_SCC;
|
||||
break;
|
||||
case 2 ... NUM_OF_RTW89_SUB_ENTITY:
|
||||
case 2 ... NUM_OF_RTW89_CHANCTX:
|
||||
if (w.active_roles != NUM_OF_RTW89_MCC_ROLES) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
"unhandled ent: %d chanctxs %d roles\n",
|
||||
@@ -304,7 +304,7 @@ enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
|
||||
break;
|
||||
}
|
||||
|
||||
for_each_set_bit(idx, recalc_map, NUM_OF_RTW89_SUB_ENTITY) {
|
||||
for_each_set_bit(idx, recalc_map, NUM_OF_RTW89_CHANCTX) {
|
||||
chandef = rtw89_chandef_get(rtwdev, idx);
|
||||
rtw89_get_channel_params(chandef, &chan);
|
||||
if (chan.channel == 0) {
|
||||
@@ -650,7 +650,7 @@ static int rtw89_mcc_fill_role(struct rtw89_dev *rtwdev,
|
||||
|
||||
role->duration = role->beacon_interval / 2;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
role->is_2ghz = chan->band_type == RTW89_BAND_2G;
|
||||
role->is_go = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_GO;
|
||||
role->is_gc = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT;
|
||||
@@ -678,10 +678,10 @@ static void rtw89_mcc_fill_bt_role(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
struct rtw89_mcc_fill_role_selector {
|
||||
struct rtw89_vif *bind_vif[NUM_OF_RTW89_SUB_ENTITY];
|
||||
struct rtw89_vif *bind_vif[NUM_OF_RTW89_CHANCTX];
|
||||
};
|
||||
|
||||
static_assert((u8)NUM_OF_RTW89_SUB_ENTITY >= NUM_OF_RTW89_MCC_ROLES);
|
||||
static_assert((u8)NUM_OF_RTW89_CHANCTX >= NUM_OF_RTW89_MCC_ROLES);
|
||||
|
||||
static int rtw89_mcc_fill_role_iterator(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mcc_role *mcc_role,
|
||||
@@ -719,14 +719,14 @@ static int rtw89_mcc_fill_all_roles(struct rtw89_dev *rtwdev)
|
||||
if (!rtwvif->chanctx_assigned)
|
||||
continue;
|
||||
|
||||
if (sel.bind_vif[rtwvif->sub_entity_idx]) {
|
||||
if (sel.bind_vif[rtwvif->chanctx_idx]) {
|
||||
rtw89_warn(rtwdev,
|
||||
"MCC skip extra vif <macid %d> on chanctx[%d]\n",
|
||||
rtwvif->mac_id, rtwvif->sub_entity_idx);
|
||||
rtwvif->mac_id, rtwvif->chanctx_idx);
|
||||
continue;
|
||||
}
|
||||
|
||||
sel.bind_vif[rtwvif->sub_entity_idx] = rtwvif;
|
||||
sel.bind_vif[rtwvif->chanctx_idx] = rtwvif;
|
||||
}
|
||||
|
||||
ret = rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_fill_role_iterator, &sel);
|
||||
@@ -1390,7 +1390,7 @@ static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *ro
|
||||
const struct rtw89_chan *chan;
|
||||
int ret;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif->sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif->chanctx_idx);
|
||||
req.central_ch_seg0 = chan->channel;
|
||||
req.primary_ch = chan->primary_channel;
|
||||
req.bandwidth = chan->band_width;
|
||||
@@ -1448,7 +1448,7 @@ void __mrc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role,
|
||||
slot_arg->duration = role->duration;
|
||||
slot_arg->role_num = 1;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif->sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, role->rtwvif->chanctx_idx);
|
||||
|
||||
slot_arg->roles[0].role_type = RTW89_H2C_MRC_ROLE_WIFI;
|
||||
slot_arg->roles[0].is_master = role == ref;
|
||||
@@ -1934,22 +1934,53 @@ static int rtw89_mcc_start(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct rtw89_mcc_stop_sel {
|
||||
u8 mac_id;
|
||||
u8 slot_idx;
|
||||
};
|
||||
|
||||
static void rtw89_mcc_stop_sel_fill(struct rtw89_mcc_stop_sel *sel,
|
||||
const struct rtw89_mcc_role *mcc_role)
|
||||
{
|
||||
sel->mac_id = mcc_role->rtwvif->mac_id;
|
||||
sel->slot_idx = mcc_role->slot_idx;
|
||||
}
|
||||
|
||||
static int rtw89_mcc_stop_sel_iterator(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mcc_role *mcc_role,
|
||||
unsigned int ordered_idx,
|
||||
void *data)
|
||||
{
|
||||
struct rtw89_mcc_stop_sel *sel = data;
|
||||
|
||||
if (!mcc_role->rtwvif->chanctx_assigned)
|
||||
return 0;
|
||||
|
||||
rtw89_mcc_stop_sel_fill(sel, mcc_role);
|
||||
return 1; /* break iteration */
|
||||
}
|
||||
|
||||
static void rtw89_mcc_stop(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_mcc_info *mcc = &rtwdev->mcc;
|
||||
struct rtw89_mcc_role *ref = &mcc->role_ref;
|
||||
struct rtw89_mcc_stop_sel sel;
|
||||
int ret;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC stop\n");
|
||||
/* by default, stop at ref */
|
||||
rtw89_mcc_stop_sel_fill(&sel, ref);
|
||||
rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_stop_sel_iterator, &sel);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC stop at <macid %d>\n", sel.mac_id);
|
||||
|
||||
if (rtw89_concurrent_via_mrc(rtwdev)) {
|
||||
ret = rtw89_fw_h2c_mrc_del(rtwdev, mcc->group);
|
||||
ret = rtw89_fw_h2c_mrc_del(rtwdev, mcc->group, sel.slot_idx);
|
||||
if (ret)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
"MRC h2c failed to trigger del: %d\n", ret);
|
||||
} else {
|
||||
ret = rtw89_fw_h2c_stop_mcc(rtwdev, mcc->group,
|
||||
ref->rtwvif->mac_id, true);
|
||||
sel.mac_id, true);
|
||||
if (ret)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
"MCC h2c failed to trigger stop: %d\n", ret);
|
||||
@@ -2339,9 +2370,9 @@ void rtw89_chanctx_proceed(struct rtw89_dev *rtwdev)
|
||||
rtw89_queue_chanctx_work(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw89_swap_sub_entity(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx1,
|
||||
enum rtw89_sub_entity_idx idx2)
|
||||
static void rtw89_swap_chanctx(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_chanctx_idx idx1,
|
||||
enum rtw89_chanctx_idx idx2)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_vif *rtwvif;
|
||||
@@ -2350,18 +2381,18 @@ static void rtw89_swap_sub_entity(struct rtw89_dev *rtwdev,
|
||||
if (idx1 == idx2)
|
||||
return;
|
||||
|
||||
hal->sub[idx1].cfg->idx = idx2;
|
||||
hal->sub[idx2].cfg->idx = idx1;
|
||||
hal->chanctx[idx1].cfg->idx = idx2;
|
||||
hal->chanctx[idx2].cfg->idx = idx1;
|
||||
|
||||
swap(hal->sub[idx1], hal->sub[idx2]);
|
||||
swap(hal->chanctx[idx1], hal->chanctx[idx2]);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
if (!rtwvif->chanctx_assigned)
|
||||
continue;
|
||||
if (rtwvif->sub_entity_idx == idx1)
|
||||
rtwvif->sub_entity_idx = idx2;
|
||||
else if (rtwvif->sub_entity_idx == idx2)
|
||||
rtwvif->sub_entity_idx = idx1;
|
||||
if (rtwvif->chanctx_idx == idx1)
|
||||
rtwvif->chanctx_idx = idx2;
|
||||
else if (rtwvif->chanctx_idx == idx2)
|
||||
rtwvif->chanctx_idx = idx1;
|
||||
}
|
||||
|
||||
cur = atomic_read(&hal->roc_entity_idx);
|
||||
@@ -2379,14 +2410,14 @@ int rtw89_chanctx_ops_add(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
u8 idx;
|
||||
|
||||
idx = find_first_zero_bit(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
|
||||
idx = find_first_zero_bit(hal->entity_map, NUM_OF_RTW89_CHANCTX);
|
||||
if (idx >= chip->support_chanctx_num)
|
||||
return -ENOENT;
|
||||
|
||||
rtw89_config_entity_chandef(rtwdev, idx, &ctx->def);
|
||||
cfg->idx = idx;
|
||||
cfg->ref_count = 0;
|
||||
hal->sub[idx].cfg = cfg;
|
||||
hal->chanctx[idx].cfg = cfg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2419,19 +2450,19 @@ int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv;
|
||||
struct rtw89_entity_weight w = {};
|
||||
|
||||
rtwvif->sub_entity_idx = cfg->idx;
|
||||
rtwvif->chanctx_idx = cfg->idx;
|
||||
rtwvif->chanctx_assigned = true;
|
||||
cfg->ref_count++;
|
||||
|
||||
if (cfg->idx == RTW89_SUB_ENTITY_0)
|
||||
if (cfg->idx == RTW89_CHANCTX_0)
|
||||
goto out;
|
||||
|
||||
rtw89_entity_calculate_weight(rtwdev, &w);
|
||||
if (w.active_chanctxs != 1)
|
||||
goto out;
|
||||
|
||||
/* put the first active chanctx at RTW89_SUB_ENTITY_0 */
|
||||
rtw89_swap_sub_entity(rtwdev, cfg->idx, RTW89_SUB_ENTITY_0);
|
||||
/* put the first active chanctx at RTW89_CHANCTX_0 */
|
||||
rtw89_swap_chanctx(rtwdev, cfg->idx, RTW89_CHANCTX_0);
|
||||
|
||||
out:
|
||||
return rtw89_set_channel(rtwdev);
|
||||
@@ -2443,47 +2474,60 @@ void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_entity_weight w = {};
|
||||
enum rtw89_sub_entity_idx roll;
|
||||
enum rtw89_chanctx_idx roll;
|
||||
enum rtw89_entity_mode cur;
|
||||
enum rtw89_entity_mode new;
|
||||
int ret;
|
||||
|
||||
rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
rtwvif->chanctx_idx = RTW89_CHANCTX_0;
|
||||
rtwvif->chanctx_assigned = false;
|
||||
cfg->ref_count--;
|
||||
|
||||
if (cfg->ref_count != 0)
|
||||
goto out;
|
||||
|
||||
if (cfg->idx != RTW89_SUB_ENTITY_0)
|
||||
if (cfg->idx != RTW89_CHANCTX_0)
|
||||
goto out;
|
||||
|
||||
roll = find_next_bit(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY,
|
||||
roll = find_next_bit(hal->entity_map, NUM_OF_RTW89_CHANCTX,
|
||||
cfg->idx + 1);
|
||||
/* Follow rtw89_config_default_chandef() when rtw89_entity_recalc(). */
|
||||
if (roll == NUM_OF_RTW89_SUB_ENTITY)
|
||||
if (roll == NUM_OF_RTW89_CHANCTX)
|
||||
goto out;
|
||||
|
||||
/* RTW89_SUB_ENTITY_0 is going to release, and another exists.
|
||||
* Make another roll down to RTW89_SUB_ENTITY_0 to replace.
|
||||
/* RTW89_CHANCTX_0 is going to release, and another exists.
|
||||
* Make another roll down to RTW89_CHANCTX_0 to replace.
|
||||
*/
|
||||
rtw89_swap_sub_entity(rtwdev, cfg->idx, roll);
|
||||
rtw89_swap_chanctx(rtwdev, cfg->idx, roll);
|
||||
|
||||
out:
|
||||
rtw89_entity_calculate_weight(rtwdev, &w);
|
||||
if (!hal->entity_pause) {
|
||||
cur = rtw89_get_entity_mode(rtwdev);
|
||||
switch (cur) {
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
rtw89_mcc_stop(rtwdev);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cur = rtw89_get_entity_mode(rtwdev);
|
||||
switch (cur) {
|
||||
ret = rtw89_set_channel(rtwdev);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
if (hal->entity_pause)
|
||||
return;
|
||||
|
||||
new = rtw89_get_entity_mode(rtwdev);
|
||||
switch (new) {
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
/* If still multi-roles, re-plan MCC for chanctx changes.
|
||||
* Otherwise, just stop MCC.
|
||||
*/
|
||||
rtw89_mcc_stop(rtwdev);
|
||||
if (w.active_roles == NUM_OF_RTW89_MCC_ROLES)
|
||||
rtw89_mcc_start(rtwdev);
|
||||
/* re-plan MCC for chanctx changes. */
|
||||
ret = rtw89_mcc_start(rtwdev);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "failed to start MCC: %d\n", ret);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
rtw89_set_channel(rtwdev);
|
||||
}
|
||||
|
||||
@@ -76,17 +76,17 @@ static inline void rtw89_set_entity_mode(struct rtw89_dev *rtwdev,
|
||||
void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan,
|
||||
enum rtw89_band band, enum rtw89_bandwidth bandwidth);
|
||||
bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct rtw89_chan *new);
|
||||
int rtw89_iterate_entity_chan(struct rtw89_dev *rtwdev,
|
||||
int (*iterator)(const struct rtw89_chan *chan,
|
||||
void *data),
|
||||
void *data);
|
||||
void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef);
|
||||
void rtw89_config_roc_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef);
|
||||
void rtw89_entity_init(struct rtw89_dev *rtwdev);
|
||||
enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev);
|
||||
|
||||
@@ -7169,7 +7169,7 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif
|
||||
struct rtw89_sta *rtwsta, enum btc_role_state state)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta);
|
||||
struct rtw89_btc *btc = &rtwdev->btc;
|
||||
|
||||
@@ -193,6 +193,8 @@ enum btc_wa_type {
|
||||
BTC_WA_5G_HI_CH_RX = BIT(0),
|
||||
BTC_WA_NULL_AP = BIT(1),
|
||||
BTC_WA_HFP_ZB = BIT(2), /* HFP PTA req bit4 define issue */
|
||||
BTC_WA_HFP_LAG = BIT(3), /* 52BT WL break BT Rx lag issue */
|
||||
BTC_WA_INIT_SCAN = BIT(4) /* 52A/C/D init scan move to wl slot WA */
|
||||
};
|
||||
|
||||
enum btc_3cx_type {
|
||||
@@ -289,9 +291,10 @@ void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev);
|
||||
|
||||
static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_rf_path_bit paths)
|
||||
enum rtw89_rf_path_bit paths,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 phy_map;
|
||||
|
||||
phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) |
|
||||
@@ -303,9 +306,10 @@ static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
|
||||
|
||||
static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path));
|
||||
return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path), chanctx_idx);
|
||||
}
|
||||
|
||||
/* return bt req len in TU */
|
||||
|
||||
@@ -346,8 +346,8 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
enum rtw89_sub_entity_idx roc_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx;
|
||||
enum rtw89_chanctx_idx roc_idx;
|
||||
enum rtw89_phy_idx phy_idx;
|
||||
enum rtw89_entity_mode mode;
|
||||
bool entity_active;
|
||||
@@ -360,10 +360,10 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_SCC:
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
chanctx_idx = RTW89_CHANCTX_0;
|
||||
break;
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_1;
|
||||
chanctx_idx = RTW89_CHANCTX_1;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Invalid ent mode: %d\n", mode);
|
||||
@@ -371,11 +371,11 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
roc_idx = atomic_read(&hal->roc_entity_idx);
|
||||
if (roc_idx != RTW89_SUB_ENTITY_IDLE)
|
||||
sub_entity_idx = roc_idx;
|
||||
if (roc_idx != RTW89_CHANCTX_IDLE)
|
||||
chanctx_idx = roc_idx;
|
||||
|
||||
phy_idx = RTW89_PHY_0;
|
||||
chan = rtw89_chan_get(rtwdev, sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
chip->ops->set_txpwr(rtwdev, chan, phy_idx);
|
||||
}
|
||||
|
||||
@@ -385,8 +385,8 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_chan_rcd *chan_rcd;
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
enum rtw89_sub_entity_idx roc_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx;
|
||||
enum rtw89_chanctx_idx roc_idx;
|
||||
enum rtw89_mac_idx mac_idx;
|
||||
enum rtw89_phy_idx phy_idx;
|
||||
struct rtw89_channel_help_params bak;
|
||||
@@ -399,10 +399,10 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_SCC:
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
chanctx_idx = RTW89_CHANCTX_0;
|
||||
break;
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_1;
|
||||
chanctx_idx = RTW89_CHANCTX_1;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Invalid ent mode: %d\n", mode);
|
||||
@@ -410,14 +410,14 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
roc_idx = atomic_read(&hal->roc_entity_idx);
|
||||
if (roc_idx != RTW89_SUB_ENTITY_IDLE)
|
||||
sub_entity_idx = roc_idx;
|
||||
if (roc_idx != RTW89_CHANCTX_IDLE)
|
||||
chanctx_idx = roc_idx;
|
||||
|
||||
mac_idx = RTW89_MAC_0;
|
||||
phy_idx = RTW89_PHY_0;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, sub_entity_idx);
|
||||
chan_rcd = rtw89_chan_rcd_get(rtwdev, sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
chan_rcd = rtw89_chan_rcd_get(rtwdev, chanctx_idx);
|
||||
|
||||
rtw89_chip_set_channel_prepare(rtwdev, &bak, chan, mac_idx, phy_idx);
|
||||
|
||||
@@ -441,7 +441,7 @@ void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
const struct cfg80211_chan_def *chandef;
|
||||
|
||||
chandef = rtw89_chandef_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
chandef = rtw89_chandef_get(rtwdev, rtwvif->chanctx_idx);
|
||||
rtw89_get_channel_params(chandef, chan);
|
||||
}
|
||||
|
||||
@@ -602,15 +602,28 @@ static u8 rtw89_core_tx_get_mac_id(struct rtw89_dev *rtwdev,
|
||||
return rtwsta->mac_id;
|
||||
}
|
||||
|
||||
static void rtw89_core_tx_update_llc_hdr(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_tx_desc_info *desc_info,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
__le16 fc = hdr->frame_control;
|
||||
|
||||
desc_info->hdr_llc_len = ieee80211_hdrlen(fc);
|
||||
desc_info->hdr_llc_len >>= 1; /* in unit of 2 bytes */
|
||||
}
|
||||
|
||||
static void
|
||||
rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
struct sk_buff *skb = tx_req->skb;
|
||||
u8 qsel, ch_dma;
|
||||
|
||||
qsel = desc_info->hiq ? RTW89_TX_QSEL_B0_HI : RTW89_TX_QSEL_B0_MGMT;
|
||||
@@ -629,6 +642,11 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
||||
desc_info->dis_data_fb = true;
|
||||
desc_info->data_rate = rtw89_core_get_mgmt_rate(rtwdev, tx_req, chan);
|
||||
|
||||
if (chip->hw_mgmt_tx_encrypt && IEEE80211_SKB_CB(skb)->control.hw_key) {
|
||||
rtw89_core_tx_update_sec_key(rtwdev, tx_req);
|
||||
rtw89_core_tx_update_llc_hdr(rtwdev, desc_info, skb);
|
||||
}
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX,
|
||||
"tx mgmt frame with rate 0x%x on channel %d (band %d, bw %d)\n",
|
||||
desc_info->data_rate, chan->channel, chan->band_type,
|
||||
@@ -769,7 +787,7 @@ static u16 rtw89_core_get_data_rate(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_sta *sta = tx_req->sta;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern;
|
||||
enum rtw89_sub_entity_idx idx = rtwvif->sub_entity_idx;
|
||||
enum rtw89_chanctx_idx idx = rtwvif->chanctx_idx;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, idx);
|
||||
u16 lowest_rate;
|
||||
|
||||
@@ -862,17 +880,6 @@ rtw89_core_tx_btc_spec_pkt_notify(struct rtw89_dev *rtwdev,
|
||||
return PACKET_MAX;
|
||||
}
|
||||
|
||||
static void rtw89_core_tx_update_llc_hdr(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_tx_desc_info *desc_info,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
__le16 fc = hdr->frame_control;
|
||||
|
||||
desc_info->hdr_llc_len = ieee80211_hdrlen(fc);
|
||||
desc_info->hdr_llc_len >>= 1; /* in unit of 2 bytes */
|
||||
}
|
||||
|
||||
static void
|
||||
rtw89_core_tx_wake(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
@@ -1449,16 +1456,20 @@ static int rtw89_core_rx_process_mac_ppdu(struct rtw89_dev *rtwdev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* For WiFi 7 chips, RXWD.mac_id of PPDU status is not set by hardware,
|
||||
* so update mac_id by rxinfo_user[].mac_id.
|
||||
*/
|
||||
for (i = 0; i < usr_num && chip_gen == RTW89_CHIP_BE; i++) {
|
||||
for (i = 0; i < usr_num; i++) {
|
||||
user = &rxinfo->user[i];
|
||||
if (!le32_get_bits(user->w0, RTW89_RXINFO_USER_MAC_ID_VALID))
|
||||
continue;
|
||||
|
||||
phy_ppdu->mac_id =
|
||||
le32_get_bits(user->w0, RTW89_RXINFO_USER_MACID);
|
||||
/* For WiFi 7 chips, RXWD.mac_id of PPDU status is not set
|
||||
* by hardware, so update mac_id by rxinfo_user[].mac_id.
|
||||
*/
|
||||
if (chip_gen == RTW89_CHIP_BE)
|
||||
phy_ppdu->mac_id =
|
||||
le32_get_bits(user->w0, RTW89_RXINFO_USER_MACID);
|
||||
phy_ppdu->has_data =
|
||||
le32_get_bits(user->w0, RTW89_RXINFO_USER_DATA);
|
||||
phy_ppdu->has_bcn =
|
||||
le32_get_bits(user->w0, RTW89_RXINFO_USER_BCN);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1480,6 +1491,26 @@ static int rtw89_core_rx_process_mac_ppdu(struct rtw89_dev *rtwdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 rtw89_get_data_rate_nss(struct rtw89_dev *rtwdev, u16 data_rate)
|
||||
{
|
||||
u8 data_rate_mode;
|
||||
|
||||
data_rate_mode = rtw89_get_data_rate_mode(rtwdev, data_rate);
|
||||
switch (data_rate_mode) {
|
||||
case DATA_RATE_MODE_NON_HT:
|
||||
return 1;
|
||||
case DATA_RATE_MODE_HT:
|
||||
return rtw89_get_data_ht_nss(rtwdev, data_rate) + 1;
|
||||
case DATA_RATE_MODE_VHT:
|
||||
case DATA_RATE_MODE_HE:
|
||||
case DATA_RATE_MODE_EHT:
|
||||
return rtw89_get_data_nss(rtwdev, data_rate) + 1;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "invalid RX rate mode %d\n", data_rate_mode);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw89_core_rx_process_phy_ppdu_iter(void *data,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
@@ -1509,10 +1540,14 @@ static void rtw89_core_rx_process_phy_ppdu_iter(void *data,
|
||||
ewma_rssi_add(&rtwsta->rssi[i], phy_ppdu->rssi[i]);
|
||||
}
|
||||
|
||||
if (phy_ppdu->ofdm.has) {
|
||||
if (phy_ppdu->ofdm.has && (phy_ppdu->has_data || phy_ppdu->has_bcn)) {
|
||||
ewma_snr_add(&rtwsta->avg_snr, phy_ppdu->ofdm.avg_snr);
|
||||
ewma_evm_add(&rtwsta->evm_min[evm_pos], phy_ppdu->ofdm.evm_min);
|
||||
ewma_evm_add(&rtwsta->evm_max[evm_pos], phy_ppdu->ofdm.evm_max);
|
||||
if (rtw89_get_data_rate_nss(rtwdev, phy_ppdu->rate) == 1) {
|
||||
ewma_evm_add(&rtwsta->evm_1ss, phy_ppdu->ofdm.evm_min);
|
||||
} else {
|
||||
ewma_evm_add(&rtwsta->evm_min[evm_pos], phy_ppdu->ofdm.evm_min);
|
||||
ewma_evm_add(&rtwsta->evm_max[evm_pos], phy_ppdu->ofdm.evm_max);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1959,7 +1994,7 @@ static void rtw89_correct_cck_chan(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_rx_status *status)
|
||||
{
|
||||
const struct rtw89_chan_rcd *rcd =
|
||||
rtw89_chan_rcd_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
rtw89_chan_rcd_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u16 chan = rcd->prev_primary_channel;
|
||||
u8 band = rtw89_hw_to_nl80211_band(rcd->prev_band_type);
|
||||
|
||||
@@ -2363,7 +2398,7 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_rx_status *rx_status)
|
||||
{
|
||||
const struct cfg80211_chan_def *chandef =
|
||||
rtw89_chandef_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
rtw89_chandef_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u16 data_rate;
|
||||
u8 data_rate_mode;
|
||||
bool eht = false;
|
||||
@@ -2856,7 +2891,7 @@ static void rtw89_core_sta_pending_tx_iter(void *data,
|
||||
struct sk_buff *skb, *tmp;
|
||||
int qsel, ret;
|
||||
|
||||
if (rtwvif->sub_entity_idx != rtwvif_target->sub_entity_idx)
|
||||
if (rtwvif->chanctx_idx != rtwvif_target->chanctx_idx)
|
||||
return;
|
||||
|
||||
if (skb_queue_len(&rtwsta->roc_queue) == 0)
|
||||
@@ -2950,11 +2985,11 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
"roc send null-1 failed: %d\n", ret);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, tmp)
|
||||
if (tmp->sub_entity_idx == rtwvif->sub_entity_idx)
|
||||
if (tmp->chanctx_idx == rtwvif->chanctx_idx)
|
||||
tmp->offchan = true;
|
||||
|
||||
cfg80211_chandef_create(&roc_chan, &roc->chan, NL80211_CHAN_NO_HT);
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->sub_entity_idx, &roc_chan);
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->chanctx_idx, &roc_chan);
|
||||
rtw89_set_channel(rtwdev);
|
||||
rtw89_write32_clr(rtwdev,
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
@@ -2987,7 +3022,7 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
rtwdev->hal.rx_fltr);
|
||||
|
||||
roc->state = RTW89_ROC_IDLE;
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->sub_entity_idx, NULL);
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->chanctx_idx, NULL);
|
||||
rtw89_chanctx_proceed(rtwdev);
|
||||
ret = rtw89_core_send_nullfunc(rtwdev, rtwvif, true, false);
|
||||
if (ret)
|
||||
@@ -2995,7 +3030,7 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
"roc send null-0 failed: %d\n", ret);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, tmp)
|
||||
if (tmp->sub_entity_idx == rtwvif->sub_entity_idx)
|
||||
if (tmp->chanctx_idx == rtwvif->chanctx_idx)
|
||||
tmp->offchan = false;
|
||||
|
||||
rtw89_core_handle_sta_pending_tx(rtwdev, rtwvif);
|
||||
@@ -3189,6 +3224,7 @@ static void rtw89_track_work(struct work_struct *work)
|
||||
rtw89_phy_edcca_track(rtwdev);
|
||||
rtw89_tas_track(rtwdev);
|
||||
rtw89_chanctx_track(rtwdev);
|
||||
rtw89_core_rfkill_poll(rtwdev, false);
|
||||
|
||||
if (rtwdev->lps_enabled && !rtwdev->btc.lps)
|
||||
rtw89_enter_lps_track(rtwdev);
|
||||
@@ -3367,6 +3403,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
||||
|
||||
ewma_rssi_init(&rtwsta->avg_rssi);
|
||||
ewma_snr_init(&rtwsta->avg_snr);
|
||||
ewma_evm_init(&rtwsta->evm_1ss);
|
||||
for (i = 0; i < ant_num; i++) {
|
||||
ewma_rssi_init(&rtwsta->rssi[i]);
|
||||
ewma_evm_init(&rtwsta->evm_min[i]);
|
||||
@@ -3384,7 +3421,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
|
||||
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta,
|
||||
BTC_ROLE_MSTS_STA_CONN_START);
|
||||
rtw89_chip_rfk_channel(rtwdev);
|
||||
rtw89_chip_rfk_channel(rtwdev, rtwvif);
|
||||
} else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
|
||||
rtwsta->mac_id = rtw89_acquire_mac_id(rtwdev);
|
||||
if (rtwsta->mac_id == RTW89_MAX_MAC_ID_NUM)
|
||||
@@ -3491,7 +3528,7 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
int ret;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
|
||||
@@ -4333,7 +4370,7 @@ void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
const u8 *mac_addr, bool hw_scan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
|
||||
rtwdev->scanning = true;
|
||||
rtw89_leave_lps(rtwdev);
|
||||
@@ -4342,7 +4379,7 @@ void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
|
||||
ether_addr_copy(rtwvif->mac_addr, mac_addr);
|
||||
rtw89_btc_ntfy_scan_start(rtwdev, RTW89_PHY_0, chan->band_type);
|
||||
rtw89_chip_rfk_scan(rtwdev, true);
|
||||
rtw89_chip_rfk_scan(rtwdev, rtwvif, true);
|
||||
rtw89_hci_recalc_int_mit(rtwdev);
|
||||
rtw89_phy_config_edcca(rtwdev, true);
|
||||
|
||||
@@ -4360,7 +4397,7 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
|
||||
ether_addr_copy(rtwvif->mac_addr, vif->addr);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
|
||||
|
||||
rtw89_chip_rfk_scan(rtwdev, false);
|
||||
rtw89_chip_rfk_scan(rtwdev, rtwvif, false);
|
||||
rtw89_btc_ntfy_scan_finish(rtwdev, RTW89_PHY_0);
|
||||
rtw89_phy_config_edcca(rtwdev, false);
|
||||
|
||||
@@ -4470,6 +4507,70 @@ static int rtw89_chip_board_info_setup(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool rtw89_chip_has_rfkill(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
return !!rtwdev->chip->rfkill_init;
|
||||
}
|
||||
|
||||
static void rtw89_core_rfkill_init(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_rfkill_regs *regs = rtwdev->chip->rfkill_init;
|
||||
|
||||
rtw89_write16_mask(rtwdev, regs->pinmux.addr,
|
||||
regs->pinmux.mask, regs->pinmux.data);
|
||||
rtw89_write16_mask(rtwdev, regs->mode.addr,
|
||||
regs->mode.mask, regs->mode.data);
|
||||
}
|
||||
|
||||
static bool rtw89_core_rfkill_get(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_reg_def *reg = &rtwdev->chip->rfkill_get;
|
||||
|
||||
return !rtw89_read8_mask(rtwdev, reg->addr, reg->mask);
|
||||
}
|
||||
|
||||
static void rtw89_rfkill_polling_init(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
if (!rtw89_chip_has_rfkill(rtwdev))
|
||||
return;
|
||||
|
||||
rtw89_core_rfkill_init(rtwdev);
|
||||
rtw89_core_rfkill_poll(rtwdev, true);
|
||||
wiphy_rfkill_start_polling(rtwdev->hw->wiphy);
|
||||
}
|
||||
|
||||
static void rtw89_rfkill_polling_deinit(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
if (!rtw89_chip_has_rfkill(rtwdev))
|
||||
return;
|
||||
|
||||
wiphy_rfkill_stop_polling(rtwdev->hw->wiphy);
|
||||
}
|
||||
|
||||
void rtw89_core_rfkill_poll(struct rtw89_dev *rtwdev, bool force)
|
||||
{
|
||||
bool prev, blocked;
|
||||
|
||||
if (!rtw89_chip_has_rfkill(rtwdev))
|
||||
return;
|
||||
|
||||
prev = test_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
|
||||
blocked = rtw89_core_rfkill_get(rtwdev);
|
||||
|
||||
if (!force && prev == blocked)
|
||||
return;
|
||||
|
||||
rtw89_info(rtwdev, "rfkill hardware state changed to %s\n",
|
||||
blocked ? "disable" : "enable");
|
||||
|
||||
if (blocked)
|
||||
set_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
|
||||
else
|
||||
clear_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
|
||||
|
||||
wiphy_rfkill_set_hw_state(rtwdev->hw->wiphy, blocked);
|
||||
}
|
||||
|
||||
int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
@@ -4587,6 +4688,7 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
hw->wiphy->wowlan = rtwdev->chip->wowlan_stub;
|
||||
hw->wiphy->max_sched_scan_ssids = RTW89_SCANOFLD_MAX_SSID;
|
||||
#endif
|
||||
|
||||
hw->wiphy->tid_config_support.vif |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
|
||||
@@ -4625,6 +4727,8 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
|
||||
goto err_unregister_hw;
|
||||
}
|
||||
|
||||
rtw89_rfkill_polling_init(rtwdev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unregister_hw:
|
||||
@@ -4639,6 +4743,7 @@ static void rtw89_core_unregister_hw(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
|
||||
rtw89_rfkill_polling_deinit(rtwdev);
|
||||
ieee80211_unregister_hw(hw);
|
||||
rtw89_core_clr_supported_band(rtwdev);
|
||||
}
|
||||
|
||||
@@ -802,6 +802,8 @@ struct rtw89_rx_phy_ppdu {
|
||||
u8 evm_max;
|
||||
u8 evm_min;
|
||||
} ofdm;
|
||||
bool has_data;
|
||||
bool has_bcn;
|
||||
bool ldpc;
|
||||
bool stbc;
|
||||
bool to_self;
|
||||
@@ -820,12 +822,12 @@ enum rtw89_phy_idx {
|
||||
RTW89_PHY_MAX
|
||||
};
|
||||
|
||||
enum rtw89_sub_entity_idx {
|
||||
RTW89_SUB_ENTITY_0 = 0,
|
||||
RTW89_SUB_ENTITY_1 = 1,
|
||||
enum rtw89_chanctx_idx {
|
||||
RTW89_CHANCTX_0 = 0,
|
||||
RTW89_CHANCTX_1 = 1,
|
||||
|
||||
NUM_OF_RTW89_SUB_ENTITY,
|
||||
RTW89_SUB_ENTITY_IDLE = NUM_OF_RTW89_SUB_ENTITY,
|
||||
NUM_OF_RTW89_CHANCTX,
|
||||
RTW89_CHANCTX_IDLE = NUM_OF_RTW89_CHANCTX,
|
||||
};
|
||||
|
||||
enum rtw89_rf_path {
|
||||
@@ -925,10 +927,12 @@ enum rtw89_sc_offset {
|
||||
RTW89_SC_40_LOWER = 10,
|
||||
};
|
||||
|
||||
/* only mgd features can be added to the enum */
|
||||
enum rtw89_wow_flags {
|
||||
RTW89_WOW_FLAG_EN_MAGIC_PKT,
|
||||
RTW89_WOW_FLAG_EN_REKEY_PKT,
|
||||
RTW89_WOW_FLAG_EN_DISCONNECT,
|
||||
RTW89_WOW_FLAG_EN_PATTERN,
|
||||
RTW89_WOW_FLAG_NUM,
|
||||
};
|
||||
|
||||
@@ -3306,6 +3310,7 @@ struct rtw89_sta {
|
||||
struct ewma_rssi avg_rssi;
|
||||
struct ewma_rssi rssi[RF_PATH_MAX];
|
||||
struct ewma_snr avg_snr;
|
||||
struct ewma_evm evm_1ss;
|
||||
struct ewma_evm evm_min[RF_PATH_MAX];
|
||||
struct ewma_evm evm_max[RF_PATH_MAX];
|
||||
struct rtw89_ampdu_params ampdu_params[IEEE80211_NUM_TIDS];
|
||||
@@ -3403,7 +3408,7 @@ struct rtw89_vif {
|
||||
struct rtw89_dev *rtwdev;
|
||||
struct rtw89_roc roc;
|
||||
bool chanctx_assigned; /* only valid when running with chanctx_ops */
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx;
|
||||
enum rtw89_reg_6ghz_power reg_6ghz_power;
|
||||
struct rtw89_reg_6ghz_tpe reg_6ghz_tpe;
|
||||
|
||||
@@ -3537,10 +3542,11 @@ struct rtw89_chip_ops {
|
||||
void (*rfk_hw_init)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_init)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_init_late)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_channel)(struct rtw89_dev *rtwdev);
|
||||
void (*rfk_channel)(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void (*rfk_band_changed)(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
void (*rfk_scan)(struct rtw89_dev *rtwdev, bool start);
|
||||
void (*rfk_scan)(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start);
|
||||
void (*rfk_track)(struct rtw89_dev *rtwdev);
|
||||
void (*power_trim)(struct rtw89_dev *rtwdev);
|
||||
void (*set_txpwr)(struct rtw89_dev *rtwdev,
|
||||
@@ -3671,6 +3677,7 @@ struct rtw89_scan_option {
|
||||
u16 slow_pd;
|
||||
u16 norm_cy;
|
||||
u8 opch_end;
|
||||
u16 delay;
|
||||
u64 prohib_chan;
|
||||
enum rtw89_phy_idx band;
|
||||
enum rtw89_scan_be_operation operation;
|
||||
@@ -4066,6 +4073,11 @@ struct rtw89_rrsr_cfgs {
|
||||
struct rtw89_reg3_def rsc;
|
||||
};
|
||||
|
||||
struct rtw89_rfkill_regs {
|
||||
struct rtw89_reg3_def pinmux;
|
||||
struct rtw89_reg3_def mode;
|
||||
};
|
||||
|
||||
struct rtw89_dig_regs {
|
||||
u32 seg0_pd_reg;
|
||||
u32 pd_lower_bound_mask;
|
||||
@@ -4174,6 +4186,7 @@ struct rtw89_chip_info {
|
||||
bool ul_tb_waveform_ctrl;
|
||||
bool ul_tb_pwr_diff;
|
||||
bool hw_sec_hdr;
|
||||
bool hw_mgmt_tx_encrypt;
|
||||
u8 rf_path_num;
|
||||
u8 tx_nss;
|
||||
u8 rx_nss;
|
||||
@@ -4257,6 +4270,8 @@ struct rtw89_chip_info {
|
||||
const struct rtw89_rrsr_cfgs *rrsr_cfgs;
|
||||
struct rtw89_reg_def bss_clr_vld;
|
||||
u32 bss_clr_map_reg;
|
||||
const struct rtw89_rfkill_regs *rfkill_init;
|
||||
struct rtw89_reg_def rfkill_get;
|
||||
u32 dma_ch_mask;
|
||||
const struct rtw89_edcca_regs *edcca_regs;
|
||||
const struct wiphy_wowlan_support *wowlan_stub;
|
||||
@@ -4356,7 +4371,9 @@ enum rtw89_fw_feature {
|
||||
RTW89_FW_FEATURE_NO_LPS_PG,
|
||||
RTW89_FW_FEATURE_BEACON_FILTER,
|
||||
RTW89_FW_FEATURE_MACID_PAUSE_SLEEP,
|
||||
RTW89_FW_FEATURE_SCAN_OFFLOAD_BE_V0,
|
||||
RTW89_FW_FEATURE_WOW_REASON_V1,
|
||||
RTW89_FW_FEATURE_RFK_PRE_NOTIFY_V0,
|
||||
};
|
||||
|
||||
struct rtw89_fw_suit {
|
||||
@@ -4519,7 +4536,7 @@ struct rtw89_tas_info {
|
||||
};
|
||||
|
||||
struct rtw89_chanctx_cfg {
|
||||
enum rtw89_sub_entity_idx idx;
|
||||
enum rtw89_chanctx_idx idx;
|
||||
int ref_count;
|
||||
};
|
||||
|
||||
@@ -4544,7 +4561,7 @@ enum rtw89_entity_mode {
|
||||
RTW89_ENTITY_MODE_UNHANDLED = -ESRCH,
|
||||
};
|
||||
|
||||
struct rtw89_sub_entity {
|
||||
struct rtw89_chanctx {
|
||||
struct cfg80211_chan_def chandef;
|
||||
struct rtw89_chan chan;
|
||||
struct rtw89_chan_rcd rcd;
|
||||
@@ -4580,8 +4597,8 @@ struct rtw89_hal {
|
||||
atomic_t roc_entity_idx;
|
||||
|
||||
DECLARE_BITMAP(changes, NUM_OF_RTW89_CHANCTX_CHANGES);
|
||||
DECLARE_BITMAP(entity_map, NUM_OF_RTW89_SUB_ENTITY);
|
||||
struct rtw89_sub_entity sub[NUM_OF_RTW89_SUB_ENTITY];
|
||||
DECLARE_BITMAP(entity_map, NUM_OF_RTW89_CHANCTX);
|
||||
struct rtw89_chanctx chanctx[NUM_OF_RTW89_CHANCTX];
|
||||
struct cfg80211_chan_def roc_chandef;
|
||||
|
||||
bool entity_active;
|
||||
@@ -4615,6 +4632,7 @@ enum rtw89_flags {
|
||||
RTW89_FLAG_WOWLAN,
|
||||
RTW89_FLAG_FORBIDDEN_TRACK_WROK,
|
||||
RTW89_FLAG_CHANGING_INTERFACE,
|
||||
RTW89_FLAG_HW_RFKILL_STATE,
|
||||
|
||||
NUM_OF_RTW89_FLAGS,
|
||||
};
|
||||
@@ -5293,6 +5311,10 @@ struct rtw89_wow_param {
|
||||
u8 gtk_alg;
|
||||
u8 ptk_keyidx;
|
||||
u8 akm;
|
||||
|
||||
bool pno_inited;
|
||||
struct list_head pno_pkt_list;
|
||||
struct cfg80211_sched_scan_request *nd_config;
|
||||
};
|
||||
|
||||
struct rtw89_mcc_limit {
|
||||
@@ -6028,33 +6050,33 @@ void rtw89_chip_set_channel_done(struct rtw89_dev *rtwdev,
|
||||
|
||||
static inline
|
||||
const struct cfg80211_chan_def *rtw89_chandef_get(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx)
|
||||
enum rtw89_chanctx_idx idx)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
enum rtw89_sub_entity_idx roc_idx = atomic_read(&hal->roc_entity_idx);
|
||||
enum rtw89_chanctx_idx roc_idx = atomic_read(&hal->roc_entity_idx);
|
||||
|
||||
if (roc_idx == idx)
|
||||
return &hal->roc_chandef;
|
||||
|
||||
return &hal->sub[idx].chandef;
|
||||
return &hal->chanctx[idx].chandef;
|
||||
}
|
||||
|
||||
static inline
|
||||
const struct rtw89_chan *rtw89_chan_get(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx)
|
||||
enum rtw89_chanctx_idx idx)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
|
||||
return &hal->sub[idx].chan;
|
||||
return &hal->chanctx[idx].chan;
|
||||
}
|
||||
|
||||
static inline
|
||||
const struct rtw89_chan_rcd *rtw89_chan_rcd_get(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx)
|
||||
enum rtw89_chanctx_idx idx)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
|
||||
return &hal->sub[idx].rcd;
|
||||
return &hal->chanctx[idx].rcd;
|
||||
}
|
||||
|
||||
static inline
|
||||
@@ -6064,9 +6086,9 @@ const struct rtw89_chan *rtw89_scan_chan_get(struct rtw89_dev *rtwdev)
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
|
||||
|
||||
if (rtwvif)
|
||||
return rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
return rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
else
|
||||
return rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
return rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_fem_setup(struct rtw89_dev *rtwdev)
|
||||
@@ -6140,12 +6162,13 @@ static inline void rtw89_chip_rfk_init_late(struct rtw89_dev *rtwdev)
|
||||
chip->ops->rfk_init_late(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static inline void rtw89_chip_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->rfk_channel)
|
||||
chip->ops->rfk_channel(rtwdev);
|
||||
chip->ops->rfk_channel(rtwdev, rtwvif);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
@@ -6157,12 +6180,13 @@ static inline void rtw89_chip_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
chip->ops->rfk_band_changed(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static inline void rtw89_chip_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool start)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->rfk_scan)
|
||||
chip->ops->rfk_scan(rtwdev, start);
|
||||
chip->ops->rfk_scan(rtwdev, rtwvif, start);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@@ -6503,6 +6527,7 @@ int rtw89_core_sta_remove(struct rtw89_dev *rtwdev,
|
||||
void rtw89_core_set_tid_config(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_sta *sta,
|
||||
struct cfg80211_tid_config *tid_config);
|
||||
void rtw89_core_rfkill_poll(struct rtw89_dev *rtwdev, bool force);
|
||||
void rtw89_check_quirks(struct rtw89_dev *rtwdev, const struct dmi_system_id *quirks);
|
||||
int rtw89_core_init(struct rtw89_dev *rtwdev);
|
||||
void rtw89_core_deinit(struct rtw89_dev *rtwdev);
|
||||
|
||||
@@ -851,7 +851,7 @@ static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_debug_priv_txpwr_table_get_regd(m, rtwdev, chan);
|
||||
|
||||
@@ -3505,7 +3505,7 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
u8 ant_num = hal->ant_diversity ? 2 : rtwdev->chip->rf_path_num;
|
||||
bool ant_asterisk = hal->tx_path_diversity || hal->ant_diversity;
|
||||
u8 evm_min, evm_max;
|
||||
u8 evm_min, evm_max, evm_1ss;
|
||||
u8 rssi;
|
||||
u8 snr;
|
||||
int i;
|
||||
@@ -3574,7 +3574,8 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
}
|
||||
seq_puts(m, "]\n");
|
||||
|
||||
seq_puts(m, "EVM: [");
|
||||
evm_1ss = ewma_evm_read(&rtwsta->evm_1ss);
|
||||
seq_printf(m, "EVM: [%2u.%02u, ", evm_1ss >> 2, (evm_1ss & 0x3) * 25);
|
||||
for (i = 0; i < (hal->ant_diversity ? 2 : 1); i++) {
|
||||
evm_min = ewma_evm_read(&rtwsta->evm_min[i]);
|
||||
evm_max = ewma_evm_read(&rtwsta->evm_max[i]);
|
||||
|
||||
@@ -670,6 +670,10 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
|
||||
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 26, 0, TX_WAKE),
|
||||
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 0, CRASH_TRIGGER),
|
||||
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 0, SCAN_OFFLOAD),
|
||||
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 74, 0, NO_LPS_PG),
|
||||
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 74, 0, TX_WAKE),
|
||||
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 90, 0, CRASH_TRIGGER),
|
||||
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 91, 0, SCAN_OFFLOAD),
|
||||
__CFG_FW_FEAT(RTL8852C, le, 0, 27, 33, 0, NO_DEEP_PS),
|
||||
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 34, 0, TX_WAKE),
|
||||
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 36, 0, SCAN_OFFLOAD),
|
||||
@@ -679,8 +683,10 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
|
||||
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 30, 0, CRASH_TRIGGER),
|
||||
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 11, 0, MACID_PAUSE_SLEEP),
|
||||
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 35, 0, SCAN_OFFLOAD),
|
||||
__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 21, 0, SCAN_OFFLOAD_BE_V0),
|
||||
__CFG_FW_FEAT(RTL8922A, ge, 0, 35, 12, 0, BEACON_FILTER),
|
||||
__CFG_FW_FEAT(RTL8922A, ge, 0, 35, 22, 0, WOW_REASON_V1),
|
||||
__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 31, 0, RFK_PRE_NOTIFY_V0),
|
||||
};
|
||||
|
||||
static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
|
||||
@@ -2491,7 +2497,7 @@ int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
|
||||
int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_h2c_lps_ch_info *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
@@ -2810,7 +2816,7 @@ int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
struct sk_buff *skb;
|
||||
u8 pads[RTW89_PPE_BW_NUM];
|
||||
u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id;
|
||||
@@ -2943,9 +2949,9 @@ int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id;
|
||||
struct rtw89_h2c_cctlinfo_ud_g7 *h2c;
|
||||
u8 pads[RTW89_PPE_BW_NUM];
|
||||
@@ -3206,7 +3212,7 @@ int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_h2c_bcn_upd *h2c;
|
||||
struct sk_buff *skb_beacon;
|
||||
@@ -3285,7 +3291,7 @@ EXPORT_SYMBOL(rtw89_fw_h2c_update_beacon);
|
||||
int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_h2c_bcn_upd_be *h2c;
|
||||
struct sk_buff *skb_beacon;
|
||||
@@ -4802,16 +4808,20 @@ int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtw89_fw_h2c_scan_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *option,
|
||||
struct rtw89_vif *rtwvif)
|
||||
#define RTW89_SCAN_DELAY_TSF_UNIT 104800
|
||||
int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *option,
|
||||
struct rtw89_vif *rtwvif,
|
||||
bool wowlan)
|
||||
{
|
||||
struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
|
||||
struct rtw89_chan *op = &rtwdev->scan_info.op_chan;
|
||||
enum rtw89_scan_mode scan_mode = RTW89_SCAN_IMMEDIATE;
|
||||
struct rtw89_h2c_scanofld *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
unsigned int cond;
|
||||
u64 tsf = 0;
|
||||
int ret;
|
||||
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
|
||||
@@ -4822,6 +4832,17 @@ int rtw89_fw_h2c_scan_offload(struct rtw89_dev *rtwdev,
|
||||
skb_put(skb, len);
|
||||
h2c = (struct rtw89_h2c_scanofld *)skb->data;
|
||||
|
||||
if (option->delay) {
|
||||
ret = rtw89_mac_port_get_tsf(rtwdev, rtwvif, &tsf);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "NLO failed to get port tsf: %d\n", ret);
|
||||
scan_mode = RTW89_SCAN_IMMEDIATE;
|
||||
} else {
|
||||
scan_mode = RTW89_SCAN_DELAY;
|
||||
tsf += option->delay * RTW89_SCAN_DELAY_TSF_UNIT;
|
||||
}
|
||||
}
|
||||
|
||||
h2c->w0 = le32_encode_bits(rtwvif->mac_id, RTW89_H2C_SCANOFLD_W0_MACID) |
|
||||
le32_encode_bits(rtwvif->port, RTW89_H2C_SCANOFLD_W0_PORT_ID) |
|
||||
le32_encode_bits(RTW89_PHY_0, RTW89_H2C_SCANOFLD_W0_BAND) |
|
||||
@@ -4830,9 +4851,11 @@ int rtw89_fw_h2c_scan_offload(struct rtw89_dev *rtwdev,
|
||||
h2c->w1 = le32_encode_bits(true, RTW89_H2C_SCANOFLD_W1_NOTIFY_END) |
|
||||
le32_encode_bits(option->target_ch_mode,
|
||||
RTW89_H2C_SCANOFLD_W1_TARGET_CH_MODE) |
|
||||
le32_encode_bits(RTW89_SCAN_IMMEDIATE,
|
||||
RTW89_H2C_SCANOFLD_W1_START_MODE) |
|
||||
le32_encode_bits(RTW89_SCAN_ONCE, RTW89_H2C_SCANOFLD_W1_SCAN_TYPE);
|
||||
le32_encode_bits(scan_mode, RTW89_H2C_SCANOFLD_W1_START_MODE) |
|
||||
le32_encode_bits(option->repeat, RTW89_H2C_SCANOFLD_W1_SCAN_TYPE);
|
||||
|
||||
h2c->w2 = le32_encode_bits(option->norm_pd, RTW89_H2C_SCANOFLD_W2_NORM_PD) |
|
||||
le32_encode_bits(option->slow_pd, RTW89_H2C_SCANOFLD_W2_SLOW_PD);
|
||||
|
||||
if (option->target_ch_mode) {
|
||||
h2c->w1 |= le32_encode_bits(op->band_width,
|
||||
@@ -4845,6 +4868,11 @@ int rtw89_fw_h2c_scan_offload(struct rtw89_dev *rtwdev,
|
||||
RTW89_H2C_SCANOFLD_W0_TARGET_CH_BAND);
|
||||
}
|
||||
|
||||
h2c->tsf_high = le32_encode_bits(upper_32_bits(tsf),
|
||||
RTW89_H2C_SCANOFLD_W3_TSF_HIGH);
|
||||
h2c->tsf_low = le32_encode_bits(lower_32_bits(tsf),
|
||||
RTW89_H2C_SCANOFLD_W4_TSF_LOW);
|
||||
|
||||
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
||||
H2C_CAT_MAC, H2C_CL_MAC_FW_OFLD,
|
||||
H2C_FUNC_SCANOFLD, 1, 1,
|
||||
@@ -4888,7 +4916,8 @@ static void rtw89_scan_get_6g_disabled_chan(struct rtw89_dev *rtwdev,
|
||||
|
||||
int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *option,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif *rtwvif,
|
||||
bool wowlan)
|
||||
{
|
||||
struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
|
||||
struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
|
||||
@@ -4902,6 +4931,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
u8 macc_role_size = sizeof(*macc_role) * option->num_macc_role;
|
||||
u8 opch_size = sizeof(*opch) * option->num_opch;
|
||||
u8 probe_id[NUM_NL80211_BANDS];
|
||||
u8 cfg_len = sizeof(*h2c);
|
||||
unsigned int cond;
|
||||
void *ptr;
|
||||
int ret;
|
||||
@@ -4910,7 +4940,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
|
||||
rtw89_scan_get_6g_disabled_chan(rtwdev, option);
|
||||
|
||||
len = sizeof(*h2c) + macc_role_size + opch_size;
|
||||
len = cfg_len + macc_role_size + opch_size;
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
|
||||
if (!skb) {
|
||||
rtw89_err(rtwdev, "failed to alloc skb for h2c scan offload\n");
|
||||
@@ -4923,11 +4953,13 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
|
||||
memset(probe_id, RTW89_SCANOFLD_PKT_NONE, sizeof(probe_id));
|
||||
|
||||
list_for_each_entry(pkt_info, &scan_info->pkt_list[NL80211_BAND_6GHZ], list) {
|
||||
if (pkt_info->wildcard_6ghz) {
|
||||
/* Provide wildcard as template */
|
||||
probe_id[NL80211_BAND_6GHZ] = pkt_info->id;
|
||||
break;
|
||||
if (!wowlan) {
|
||||
list_for_each_entry(pkt_info, &scan_info->pkt_list[NL80211_BAND_6GHZ], list) {
|
||||
if (pkt_info->wildcard_6ghz) {
|
||||
/* Provide wildcard as template */
|
||||
probe_id[NL80211_BAND_6GHZ] = pkt_info->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4958,7 +4990,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
RTW89_H2C_SCANOFLD_BE_W4_PROBE_5G) |
|
||||
le32_encode_bits(probe_id[NL80211_BAND_6GHZ],
|
||||
RTW89_H2C_SCANOFLD_BE_W4_PROBE_6G) |
|
||||
le32_encode_bits(0, RTW89_H2C_SCANOFLD_BE_W4_DELAY_START);
|
||||
le32_encode_bits(option->delay, RTW89_H2C_SCANOFLD_BE_W4_DELAY_START);
|
||||
|
||||
h2c->w5 = le32_encode_bits(option->mlo_mode, RTW89_H2C_SCANOFLD_BE_W5_MLO_MODE);
|
||||
|
||||
@@ -4966,7 +4998,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
RTW89_H2C_SCANOFLD_BE_W6_CHAN_PROHIB_LOW);
|
||||
h2c->w7 = le32_encode_bits(option->prohib_chan >> 32,
|
||||
RTW89_H2C_SCANOFLD_BE_W7_CHAN_PROHIB_HIGH);
|
||||
if (req->no_cck) {
|
||||
if (!wowlan && req->no_cck) {
|
||||
h2c->w0 |= le32_encode_bits(true, RTW89_H2C_SCANOFLD_BE_W0_PROBE_WITH_RATE);
|
||||
h2c->w8 = le32_encode_bits(RTW89_HW_RATE_OFDM6,
|
||||
RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_2GHZ) |
|
||||
@@ -4975,10 +5007,24 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
le32_encode_bits(RTW89_HW_RATE_OFDM6,
|
||||
RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ);
|
||||
}
|
||||
ptr += sizeof(*h2c);
|
||||
|
||||
if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw)) {
|
||||
cfg_len = offsetofend(typeof(*h2c), w8);
|
||||
goto flex_member;
|
||||
}
|
||||
|
||||
h2c->w9 = le32_encode_bits(sizeof(*h2c) / sizeof(h2c->w0),
|
||||
RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG) |
|
||||
le32_encode_bits(sizeof(*macc_role) / sizeof(macc_role->w0),
|
||||
RTW89_H2C_SCANOFLD_BE_W9_SIZE_MACC) |
|
||||
le32_encode_bits(sizeof(*opch) / sizeof(opch->w0),
|
||||
RTW89_H2C_SCANOFLD_BE_W9_SIZE_OP);
|
||||
|
||||
flex_member:
|
||||
ptr += cfg_len;
|
||||
|
||||
for (i = 0; i < option->num_macc_role; i++) {
|
||||
macc_role = (struct rtw89_h2c_scanofld_be_macc_role *)&h2c->role[i];
|
||||
macc_role = ptr;
|
||||
macc_role->w0 =
|
||||
le32_encode_bits(0, RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_BAND) |
|
||||
le32_encode_bits(0, RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_PORT) |
|
||||
@@ -5132,14 +5178,21 @@ int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
|
||||
struct rtw89_fw_h2c_rfk_pre_info_v0 *h2c_v0;
|
||||
struct rtw89_fw_h2c_rfk_pre_info *h2c;
|
||||
u8 tbl_sel = rfk_mcc->table_idx;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
u8 ver = U8_MAX;
|
||||
u8 tbl, path;
|
||||
u32 val32;
|
||||
int ret;
|
||||
|
||||
if (RTW89_CHK_FW_FEATURE(RFK_PRE_NOTIFY_V0, &rtwdev->fw)) {
|
||||
len = sizeof(*h2c_v0);
|
||||
ver = 0;
|
||||
}
|
||||
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
|
||||
if (!skb) {
|
||||
rtw89_err(rtwdev, "failed to alloc skb for h2c rfk_pre_ntfy\n");
|
||||
@@ -5148,41 +5201,53 @@ int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
|
||||
skb_put(skb, len);
|
||||
h2c = (struct rtw89_fw_h2c_rfk_pre_info *)skb->data;
|
||||
|
||||
h2c->mlo_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
|
||||
h2c->common.mlo_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
|
||||
|
||||
BUILD_BUG_ON(NUM_OF_RTW89_FW_RFK_TBL > RTW89_RFK_CHS_NR);
|
||||
|
||||
for (tbl = 0; tbl < NUM_OF_RTW89_FW_RFK_TBL; tbl++) {
|
||||
for (path = 0; path < NUM_OF_RTW89_FW_RFK_PATH; path++) {
|
||||
h2c->dbcc.ch[path][tbl] = cpu_to_le32(rfk_mcc->ch[tbl]);
|
||||
h2c->dbcc.band[path][tbl] = cpu_to_le32(rfk_mcc->band[tbl]);
|
||||
h2c->common.dbcc.ch[path][tbl] =
|
||||
cpu_to_le32(rfk_mcc->ch[tbl]);
|
||||
h2c->common.dbcc.band[path][tbl] =
|
||||
cpu_to_le32(rfk_mcc->band[tbl]);
|
||||
}
|
||||
}
|
||||
|
||||
for (path = 0; path < NUM_OF_RTW89_FW_RFK_PATH; path++) {
|
||||
h2c->tbl.cur_ch[path] = cpu_to_le32(rfk_mcc->ch[tbl_sel]);
|
||||
h2c->tbl.cur_band[path] = cpu_to_le32(rfk_mcc->band[tbl_sel]);
|
||||
h2c->common.tbl.cur_ch[path] = cpu_to_le32(rfk_mcc->ch[tbl_sel]);
|
||||
h2c->common.tbl.cur_band[path] = cpu_to_le32(rfk_mcc->band[tbl_sel]);
|
||||
}
|
||||
|
||||
h2c->phy_idx = cpu_to_le32(phy_idx);
|
||||
h2c->cur_band = cpu_to_le32(rfk_mcc->band[tbl_sel]);
|
||||
h2c->cur_bw = cpu_to_le32(rfk_mcc->bw[tbl_sel]);
|
||||
h2c->cur_center_ch = cpu_to_le32(rfk_mcc->ch[tbl_sel]);
|
||||
h2c->common.phy_idx = cpu_to_le32(phy_idx);
|
||||
|
||||
val32 = rtw89_phy_read32_mask(rtwdev, R_COEF_SEL, B_COEF_SEL_IQC_V1);
|
||||
h2c->ktbl_sel0 = cpu_to_le32(val32);
|
||||
val32 = rtw89_phy_read32_mask(rtwdev, R_COEF_SEL_C1, B_COEF_SEL_IQC_V1);
|
||||
h2c->ktbl_sel1 = cpu_to_le32(val32);
|
||||
val32 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
|
||||
h2c->rfmod0 = cpu_to_le32(val32);
|
||||
val32 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CFGCH, RFREG_MASK);
|
||||
h2c->rfmod1 = cpu_to_le32(val32);
|
||||
if (ver == 0) { /* RFK_PRE_NOTIFY_V0 */
|
||||
h2c_v0 = (struct rtw89_fw_h2c_rfk_pre_info_v0 *)skb->data;
|
||||
|
||||
h2c_v0->cur_band = cpu_to_le32(rfk_mcc->band[tbl_sel]);
|
||||
h2c_v0->cur_bw = cpu_to_le32(rfk_mcc->bw[tbl_sel]);
|
||||
h2c_v0->cur_center_ch = cpu_to_le32(rfk_mcc->ch[tbl_sel]);
|
||||
|
||||
val32 = rtw89_phy_read32_mask(rtwdev, R_COEF_SEL, B_COEF_SEL_IQC_V1);
|
||||
h2c_v0->ktbl_sel0 = cpu_to_le32(val32);
|
||||
val32 = rtw89_phy_read32_mask(rtwdev, R_COEF_SEL_C1, B_COEF_SEL_IQC_V1);
|
||||
h2c_v0->ktbl_sel1 = cpu_to_le32(val32);
|
||||
val32 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
|
||||
h2c_v0->rfmod0 = cpu_to_le32(val32);
|
||||
val32 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CFGCH, RFREG_MASK);
|
||||
h2c_v0->rfmod1 = cpu_to_le32(val32);
|
||||
|
||||
if (rtw89_is_mlo_1_1(rtwdev))
|
||||
h2c_v0->mlo_1_1 = cpu_to_le32(1);
|
||||
|
||||
h2c_v0->rfe_type = cpu_to_le32(rtwdev->efuse.rfe_type);
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (rtw89_is_mlo_1_1(rtwdev))
|
||||
h2c->mlo_1_1 = cpu_to_le32(1);
|
||||
|
||||
h2c->rfe_type = cpu_to_le32(rtwdev->efuse.rfe_type);
|
||||
|
||||
done:
|
||||
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
||||
H2C_CAT_OUTSRC, H2C_CL_OUTSRC_RF_FW_RFK,
|
||||
H2C_FUNC_RFK_PRE_NOTIFY, 0, 0,
|
||||
@@ -5205,7 +5270,7 @@ int rtw89_fw_h2c_rf_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_tssi_mode tssi_mode)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
RTW89_SUB_ENTITY_0);
|
||||
RTW89_CHANCTX_0);
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_h2c_rf_tssi *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
@@ -5287,7 +5352,7 @@ int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
RTW89_SUB_ENTITY_0);
|
||||
RTW89_CHANCTX_0);
|
||||
struct rtw89_h2c_rf_dpk *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
@@ -5330,7 +5395,7 @@ int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
RTW89_SUB_ENTITY_0);
|
||||
RTW89_CHANCTX_0);
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_h2c_rf_txgapk *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
@@ -5410,7 +5475,7 @@ int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
RTW89_SUB_ENTITY_0);
|
||||
RTW89_CHANCTX_0);
|
||||
struct rtw89_h2c_rf_rxdck *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
@@ -5926,6 +5991,56 @@ static int rtw89_update_6ghz_rnr_chan(struct rtw89_dev *rtwdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rtw89_pno_scan_add_chan_ax(struct rtw89_dev *rtwdev,
|
||||
int chan_type, int ssid_num,
|
||||
struct rtw89_mac_chinfo *ch_info)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_pktofld_info *info;
|
||||
u8 probe_count = 0;
|
||||
|
||||
ch_info->notify_action = RTW89_SCANOFLD_DEBUG_MASK;
|
||||
ch_info->dfs_ch = chan_type == RTW89_CHAN_DFS;
|
||||
ch_info->bw = RTW89_SCAN_WIDTH;
|
||||
ch_info->tx_pkt = true;
|
||||
ch_info->cfg_tx_pwr = false;
|
||||
ch_info->tx_pwr_idx = 0;
|
||||
ch_info->tx_null = false;
|
||||
ch_info->pause_data = false;
|
||||
ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE;
|
||||
|
||||
if (ssid_num) {
|
||||
list_for_each_entry(info, &rtw_wow->pno_pkt_list, list) {
|
||||
if (info->channel_6ghz &&
|
||||
ch_info->pri_ch != info->channel_6ghz)
|
||||
continue;
|
||||
else if (info->channel_6ghz && probe_count != 0)
|
||||
ch_info->period += RTW89_CHANNEL_TIME_6G;
|
||||
|
||||
if (info->wildcard_6ghz)
|
||||
continue;
|
||||
|
||||
ch_info->pkt_id[probe_count++] = info->id;
|
||||
if (probe_count >= RTW89_SCANOFLD_MAX_SSID)
|
||||
break;
|
||||
}
|
||||
ch_info->num_pkt = probe_count;
|
||||
}
|
||||
|
||||
switch (chan_type) {
|
||||
case RTW89_CHAN_DFS:
|
||||
if (ch_info->ch_band != RTW89_BAND_6G)
|
||||
ch_info->period = max_t(u8, ch_info->period,
|
||||
RTW89_DFS_CHAN_TIME);
|
||||
ch_info->dwell_time = RTW89_DWELL_TIME;
|
||||
break;
|
||||
case RTW89_CHAN_ACTIVE:
|
||||
break;
|
||||
default:
|
||||
rtw89_err(rtwdev, "Channel type out of bound\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
|
||||
int ssid_num,
|
||||
struct rtw89_mac_chinfo *ch_info)
|
||||
@@ -6004,6 +6119,45 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw89_pno_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,
|
||||
int ssid_num,
|
||||
struct rtw89_mac_chinfo_be *ch_info)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_pktofld_info *info;
|
||||
u8 probe_count = 0, i;
|
||||
|
||||
ch_info->notify_action = RTW89_SCANOFLD_DEBUG_MASK;
|
||||
ch_info->dfs_ch = chan_type == RTW89_CHAN_DFS;
|
||||
ch_info->bw = RTW89_SCAN_WIDTH;
|
||||
ch_info->tx_null = false;
|
||||
ch_info->pause_data = false;
|
||||
ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE;
|
||||
|
||||
if (ssid_num) {
|
||||
list_for_each_entry(info, &rtw_wow->pno_pkt_list, list) {
|
||||
ch_info->pkt_id[probe_count++] = info->id;
|
||||
if (probe_count >= RTW89_SCANOFLD_MAX_SSID)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = probe_count; i < RTW89_SCANOFLD_MAX_SSID; i++)
|
||||
ch_info->pkt_id[i] = RTW89_SCANOFLD_PKT_NONE;
|
||||
|
||||
switch (chan_type) {
|
||||
case RTW89_CHAN_DFS:
|
||||
ch_info->period = max_t(u8, ch_info->period, RTW89_DFS_CHAN_TIME);
|
||||
ch_info->dwell_time = RTW89_DWELL_TIME;
|
||||
break;
|
||||
case RTW89_CHAN_ACTIVE:
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "Channel type out of bound\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw89_hw_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,
|
||||
int ssid_num,
|
||||
struct rtw89_mac_chinfo_be *ch_info)
|
||||
@@ -6066,8 +6220,58 @@ static void rtw89_hw_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,
|
||||
}
|
||||
}
|
||||
|
||||
int rtw89_hw_scan_add_chan_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected)
|
||||
int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;
|
||||
struct rtw89_mac_chinfo *ch_info, *tmp;
|
||||
struct ieee80211_channel *channel;
|
||||
struct list_head chan_list;
|
||||
int list_len;
|
||||
enum rtw89_chan_type type;
|
||||
int ret = 0;
|
||||
u32 idx;
|
||||
|
||||
INIT_LIST_HEAD(&chan_list);
|
||||
for (idx = 0, list_len = 0;
|
||||
idx < nd_config->n_channels && list_len < RTW89_SCAN_LIST_LIMIT;
|
||||
idx++, list_len++) {
|
||||
channel = nd_config->channels[idx];
|
||||
ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL);
|
||||
if (!ch_info) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ch_info->period = RTW89_CHANNEL_TIME;
|
||||
ch_info->ch_band = rtw89_nl80211_to_hw_band(channel->band);
|
||||
ch_info->central_ch = channel->hw_value;
|
||||
ch_info->pri_ch = channel->hw_value;
|
||||
ch_info->is_psc = cfg80211_channel_is_psc(channel);
|
||||
|
||||
if (channel->flags &
|
||||
(IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR))
|
||||
type = RTW89_CHAN_DFS;
|
||||
else
|
||||
type = RTW89_CHAN_ACTIVE;
|
||||
|
||||
rtw89_pno_scan_add_chan_ax(rtwdev, type, nd_config->n_match_sets, ch_info);
|
||||
list_add_tail(&ch_info->list, &chan_list);
|
||||
}
|
||||
ret = rtw89_fw_h2c_scan_list_offload(rtwdev, list_len, &chan_list);
|
||||
|
||||
out:
|
||||
list_for_each_entry_safe(ch_info, tmp, &chan_list, list) {
|
||||
list_del(&ch_info->list);
|
||||
kfree(ch_info);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected)
|
||||
{
|
||||
struct cfg80211_scan_request *req = rtwvif->scan_req;
|
||||
struct rtw89_mac_chinfo *ch_info, *tmp;
|
||||
@@ -6143,6 +6347,58 @@ int rtw89_hw_scan_add_chan_list(struct rtw89_dev *rtwdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;
|
||||
struct rtw89_mac_chinfo_be *ch_info, *tmp;
|
||||
struct ieee80211_channel *channel;
|
||||
struct list_head chan_list;
|
||||
enum rtw89_chan_type type;
|
||||
int list_len, ret;
|
||||
u32 idx;
|
||||
|
||||
INIT_LIST_HEAD(&chan_list);
|
||||
|
||||
for (idx = 0, list_len = 0;
|
||||
idx < nd_config->n_channels && list_len < RTW89_SCAN_LIST_LIMIT;
|
||||
idx++, list_len++) {
|
||||
channel = nd_config->channels[idx];
|
||||
ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL);
|
||||
if (!ch_info) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ch_info->period = RTW89_CHANNEL_TIME;
|
||||
ch_info->ch_band = rtw89_nl80211_to_hw_band(channel->band);
|
||||
ch_info->central_ch = channel->hw_value;
|
||||
ch_info->pri_ch = channel->hw_value;
|
||||
ch_info->is_psc = cfg80211_channel_is_psc(channel);
|
||||
|
||||
if (channel->flags &
|
||||
(IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR))
|
||||
type = RTW89_CHAN_DFS;
|
||||
else
|
||||
type = RTW89_CHAN_ACTIVE;
|
||||
|
||||
rtw89_pno_scan_add_chan_be(rtwdev, type,
|
||||
nd_config->n_match_sets, ch_info);
|
||||
list_add_tail(&ch_info->list, &chan_list);
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_scan_list_offload_be(rtwdev, list_len, &chan_list);
|
||||
|
||||
out:
|
||||
list_for_each_entry_safe(ch_info, tmp, &chan_list, list) {
|
||||
list_del(&ch_info->list);
|
||||
kfree(ch_info);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected)
|
||||
{
|
||||
@@ -6352,7 +6608,7 @@ int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
opt.opch_end = connected ? 0 : RTW89_CHAN_INVALID;
|
||||
}
|
||||
|
||||
ret = mac->scan_offload(rtwdev, &opt, rtwvif);
|
||||
ret = mac->scan_offload(rtwdev, &opt, rtwvif, false);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -6602,6 +6858,57 @@ int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;
|
||||
struct rtw89_h2c_cfg_nlo *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
int ret, i;
|
||||
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
|
||||
if (!skb) {
|
||||
rtw89_err(rtwdev, "failed to alloc skb for nlo\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
skb_put(skb, len);
|
||||
h2c = (struct rtw89_h2c_cfg_nlo *)skb->data;
|
||||
|
||||
h2c->w0 = le32_encode_bits(enable, RTW89_H2C_NLO_W0_ENABLE) |
|
||||
le32_encode_bits(enable, RTW89_H2C_NLO_W0_IGNORE_CIPHER) |
|
||||
le32_encode_bits(rtwvif->mac_id, RTW89_H2C_NLO_W0_MACID);
|
||||
|
||||
if (enable) {
|
||||
h2c->nlo_cnt = nd_config->n_match_sets;
|
||||
for (i = 0 ; i < nd_config->n_match_sets; i++) {
|
||||
h2c->ssid_len[i] = nd_config->match_sets[i].ssid.ssid_len;
|
||||
memcpy(h2c->ssid[i], nd_config->match_sets[i].ssid.ssid,
|
||||
nd_config->match_sets[i].ssid.ssid_len);
|
||||
}
|
||||
}
|
||||
|
||||
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
||||
H2C_CAT_MAC,
|
||||
H2C_CL_MAC_WOW,
|
||||
H2C_FUNC_NLO, 0, 1,
|
||||
len);
|
||||
|
||||
ret = rtw89_h2c_tx(rtwdev, skb, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to send h2c\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
dev_kfree_skb_any(skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable)
|
||||
{
|
||||
@@ -6816,7 +7123,43 @@ int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
|
||||
goto fail;
|
||||
}
|
||||
return 0;
|
||||
fail:
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable)
|
||||
{
|
||||
struct rtw89_h2c_fwips *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
|
||||
if (!skb) {
|
||||
rtw89_err(rtwdev, "failed to alloc skb for fw ips\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
skb_put(skb, len);
|
||||
h2c = (struct rtw89_h2c_fwips *)skb->data;
|
||||
|
||||
h2c->w0 = le32_encode_bits(rtwvif->mac_id, RTW89_H2C_FW_IPS_W0_MACID) |
|
||||
le32_encode_bits(enable, RTW89_H2C_FW_IPS_W0_ENABLE);
|
||||
|
||||
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
||||
H2C_CAT_MAC,
|
||||
H2C_CL_MAC_PS,
|
||||
H2C_FUNC_IPS_CFG, 0, 1,
|
||||
len);
|
||||
|
||||
ret = rtw89_h2c_tx(rtwdev, skb, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to send h2c\n");
|
||||
goto fail;
|
||||
}
|
||||
return 0;
|
||||
fail:
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
@@ -7341,7 +7684,7 @@ int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
|
||||
return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
|
||||
}
|
||||
|
||||
int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx)
|
||||
int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx)
|
||||
{
|
||||
struct rtw89_wait_info *wait = &rtwdev->mcc.wait;
|
||||
struct rtw89_h2c_mrc_del *h2c;
|
||||
@@ -7358,7 +7701,8 @@ int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx)
|
||||
skb_put(skb, len);
|
||||
h2c = (struct rtw89_h2c_mrc_del *)skb->data;
|
||||
|
||||
h2c->w0 = le32_encode_bits(sch_idx, RTW89_H2C_MRC_DEL_W0_SCH_IDX);
|
||||
h2c->w0 = le32_encode_bits(sch_idx, RTW89_H2C_MRC_DEL_W0_SCH_IDX) |
|
||||
le32_encode_bits(slot_idx, RTW89_H2C_MRC_DEL_W0_STOP_SLOT_IDX);
|
||||
|
||||
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
||||
H2C_CAT_MAC,
|
||||
|
||||
@@ -1898,6 +1898,24 @@ struct rtw89_h2c_wow_global {
|
||||
#define RTW89_H2C_WOW_GLOBAL_W0_PAIRWISE_SEC_ALGO GENMASK(23, 16)
|
||||
#define RTW89_H2C_WOW_GLOBAL_W0_GROUP_SEC_ALGO GENMASK(31, 24)
|
||||
|
||||
#define RTW89_MAX_SUPPORT_NL_NUM 16
|
||||
struct rtw89_h2c_cfg_nlo {
|
||||
__le32 w0;
|
||||
u8 nlo_cnt;
|
||||
u8 rsvd[3];
|
||||
__le32 patterncheck;
|
||||
__le32 rsvd1;
|
||||
__le32 rsvd2;
|
||||
u8 ssid_len[RTW89_MAX_SUPPORT_NL_NUM];
|
||||
u8 chiper[RTW89_MAX_SUPPORT_NL_NUM];
|
||||
u8 rsvd3[24];
|
||||
u8 ssid[RTW89_MAX_SUPPORT_NL_NUM][IEEE80211_MAX_SSID_LEN];
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_NLO_W0_ENABLE BIT(0)
|
||||
#define RTW89_H2C_NLO_W0_IGNORE_CIPHER BIT(2)
|
||||
#define RTW89_H2C_NLO_W0_MACID GENMASK(31, 24)
|
||||
|
||||
static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val)
|
||||
{
|
||||
le32p_replace_bits((__le32 *)h2c, val, BIT(0));
|
||||
@@ -2089,10 +2107,15 @@ enum rtw89_btc_cxdrvinfo {
|
||||
|
||||
enum rtw89_scan_mode {
|
||||
RTW89_SCAN_IMMEDIATE,
|
||||
RTW89_SCAN_DELAY,
|
||||
};
|
||||
|
||||
enum rtw89_scan_type {
|
||||
RTW89_SCAN_ONCE,
|
||||
RTW89_SCAN_NORMAL,
|
||||
RTW89_SCAN_NORMAL_SLOW,
|
||||
RTW89_SCAN_SEAMLESS,
|
||||
RTW89_SCAN_MAX,
|
||||
};
|
||||
|
||||
static inline void RTW89_SET_FWCMD_CXHDR_TYPE(void *cmd, u8 val)
|
||||
@@ -2664,6 +2687,8 @@ struct rtw89_h2c_scanofld {
|
||||
#define RTW89_H2C_SCANOFLD_W1_PROBE_REQ_PKT_ID GENMASK(31, 24)
|
||||
#define RTW89_H2C_SCANOFLD_W2_NORM_PD GENMASK(15, 0)
|
||||
#define RTW89_H2C_SCANOFLD_W2_SLOW_PD GENMASK(23, 16)
|
||||
#define RTW89_H2C_SCANOFLD_W3_TSF_HIGH GENMASK(31, 0)
|
||||
#define RTW89_H2C_SCANOFLD_W4_TSF_LOW GENMASK(31, 0)
|
||||
|
||||
struct rtw89_h2c_scanofld_be_macc_role {
|
||||
__le32 w0;
|
||||
@@ -2711,7 +2736,9 @@ struct rtw89_h2c_scanofld_be {
|
||||
__le32 w6;
|
||||
__le32 w7;
|
||||
__le32 w8;
|
||||
struct rtw89_h2c_scanofld_be_macc_role role[];
|
||||
__le32 w9; /* Added after SCAN_OFFLOAD_BE_V1 */
|
||||
/* struct rtw89_h2c_scanofld_be_macc_role (flexible number) */
|
||||
/* struct rtw89_h2c_scanofld_be_opch (flexible number) */
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_SCANOFLD_BE_W0_OP GENMASK(1, 0)
|
||||
@@ -2742,6 +2769,16 @@ struct rtw89_h2c_scanofld_be {
|
||||
#define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_2GHZ GENMASK(7, 0)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_5GHZ GENMASK(15, 8)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ GENMASK(23, 16)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG GENMASK(7, 0)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W9_SIZE_MACC GENMASK(15, 8)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W9_SIZE_OP GENMASK(23, 16)
|
||||
|
||||
struct rtw89_h2c_fwips {
|
||||
__le32 w0;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_FW_IPS_W0_MACID GENMASK(7, 0)
|
||||
#define RTW89_H2C_FW_IPS_W0_ENABLE BIT(8)
|
||||
|
||||
static inline void RTW89_SET_FWCMD_P2P_MACID(void *cmd, u32 val)
|
||||
{
|
||||
@@ -3741,17 +3778,28 @@ enum rtw89_fw_element_id {
|
||||
RTW89_FW_ELEMENT_ID_NUM,
|
||||
};
|
||||
|
||||
#define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \
|
||||
#define BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ \
|
||||
(BIT(RTW89_FW_ELEMENT_ID_TXPWR_BYRATE) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU))
|
||||
|
||||
#define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \
|
||||
(BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ))
|
||||
|
||||
#define RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ \
|
||||
(BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \
|
||||
BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ)
|
||||
|
||||
#define RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS (BIT(RTW89_FW_ELEMENT_ID_BBMCU0) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
|
||||
@@ -3935,6 +3983,7 @@ enum rtw89_wow_h2c_func {
|
||||
H2C_FUNC_WOW_GLOBAL = 0x2,
|
||||
H2C_FUNC_GTK_OFLD = 0x3,
|
||||
H2C_FUNC_ARP_OFLD = 0x4,
|
||||
H2C_FUNC_NLO = 0x7,
|
||||
H2C_FUNC_WAKEUP_CTRL = 0x8,
|
||||
H2C_FUNC_WOW_CAM_UPD = 0xC,
|
||||
H2C_FUNC_AOAC_REPORT_REQ = 0xD,
|
||||
@@ -3949,6 +3998,7 @@ enum rtw89_wow_h2c_func {
|
||||
#define H2C_CL_MAC_PS 0x2
|
||||
#define H2C_FUNC_MAC_LPS_PARM 0x0
|
||||
#define H2C_FUNC_P2P_ACT 0x1
|
||||
#define H2C_FUNC_IPS_CFG 0x3
|
||||
|
||||
/* CLASS 3 - FW download */
|
||||
#define H2C_CL_MAC_FWDL 0x3
|
||||
@@ -4095,7 +4145,7 @@ struct rtw89_fw_h2c_rf_get_mccch {
|
||||
#define NUM_OF_RTW89_FW_RFK_PATH 2
|
||||
#define NUM_OF_RTW89_FW_RFK_TBL 3
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_common {
|
||||
struct {
|
||||
__le32 ch[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
|
||||
__le32 band[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
|
||||
@@ -4108,6 +4158,11 @@ struct rtw89_fw_h2c_rfk_pre_info {
|
||||
} __packed tbl;
|
||||
|
||||
__le32 phy_idx;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info_v0 {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_common common;
|
||||
|
||||
__le32 cur_band;
|
||||
__le32 cur_bw;
|
||||
__le32 cur_center_ch;
|
||||
@@ -4127,6 +4182,11 @@ struct rtw89_fw_h2c_rfk_pre_info {
|
||||
} __packed mlo;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_common common;
|
||||
__le32 mlo_1_1;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_rf_tssi {
|
||||
__le16 len;
|
||||
u8 phy;
|
||||
@@ -4378,12 +4438,14 @@ int rtw89_fw_h2c_scan_list_offload(struct rtw89_dev *rtwdev, int ch_num,
|
||||
struct list_head *chan_list);
|
||||
int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
|
||||
struct list_head *chan_list);
|
||||
int rtw89_fw_h2c_scan_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif);
|
||||
int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif,
|
||||
bool wowlan);
|
||||
int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif);
|
||||
struct rtw89_vif *vif,
|
||||
bool wowlan);
|
||||
int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_fw_h2c_rf_reg_info *info,
|
||||
u16 len, u8 page);
|
||||
@@ -4420,6 +4482,8 @@ int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_lps_parm *lps_param);
|
||||
int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable);
|
||||
struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len);
|
||||
struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len);
|
||||
int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
|
||||
@@ -4434,10 +4498,14 @@ void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
bool enable);
|
||||
void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
int rtw89_hw_scan_add_chan_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_pkt_drop_params *params);
|
||||
@@ -4450,6 +4518,8 @@ int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev,
|
||||
@@ -4488,7 +4558,7 @@ int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_add_arg *arg);
|
||||
int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_start_arg *arg);
|
||||
int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx);
|
||||
int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx);
|
||||
int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_req_tsf_arg *arg,
|
||||
struct rtw89_mac_mrc_tsf_rpt *rpt);
|
||||
|
||||
@@ -1625,6 +1625,7 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
|
||||
.wde_size18 = {RTW89_WDE_PG_64, 0, 2048,},
|
||||
/* 8852C PCIE SCC */
|
||||
.wde_size19 = {RTW89_WDE_PG_64, 3328, 0,},
|
||||
.wde_size23 = {RTW89_WDE_PG_64, 1022, 2,},
|
||||
/* PCIE */
|
||||
.ple_size0 = {RTW89_PLE_PG_128, 1520, 16,},
|
||||
.ple_size0_v1 = {RTW89_PLE_PG_128, 2688, 240, 212992,},
|
||||
@@ -1635,6 +1636,7 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
|
||||
.ple_size6 = {RTW89_PLE_PG_128, 496, 16,},
|
||||
/* DLFW */
|
||||
.ple_size8 = {RTW89_PLE_PG_128, 64, 960,},
|
||||
.ple_size9 = {RTW89_PLE_PG_128, 2288, 16,},
|
||||
/* 8852C DLFW */
|
||||
.ple_size18 = {RTW89_PLE_PG_128, 2544, 16,},
|
||||
/* 8852C PCIE SCC */
|
||||
@@ -1652,6 +1654,7 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
|
||||
.wde_qt17 = {0, 0, 0, 0,},
|
||||
/* 8852C PCIE SCC */
|
||||
.wde_qt18 = {3228, 60, 0, 40,},
|
||||
.wde_qt23 = {958, 48, 0, 16,},
|
||||
.ple_qt0 = {320, 320, 32, 16, 13, 13, 292, 292, 64, 18, 1, 4, 0,},
|
||||
.ple_qt1 = {320, 320, 32, 16, 1316, 1316, 1595, 1595, 1367, 1321, 1, 1307, 0,},
|
||||
/* PCIE SCC */
|
||||
@@ -1671,12 +1674,16 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
|
||||
.ple_qt46 = {525, 0, 16, 20, 13, 13, 178, 0, 32, 62, 8, 16,},
|
||||
/* 8852C PCIE SCC */
|
||||
.ple_qt47 = {525, 0, 32, 20, 1034, 13, 1199, 0, 1053, 62, 160, 1037,},
|
||||
.ple_qt57 = {147, 0, 16, 20, 13, 13, 178, 0, 32, 14, 8, 0,},
|
||||
/* PCIE 64 */
|
||||
.ple_qt58 = {147, 0, 16, 20, 157, 13, 229, 0, 172, 14, 24, 0,},
|
||||
.ple_qt59 = {147, 0, 32, 20, 1860, 13, 2025, 0, 1879, 14, 24, 0,},
|
||||
/* 8852A PCIE WOW */
|
||||
.ple_qt_52a_wow = {264, 0, 32, 20, 64, 13, 1005, 0, 64, 128, 120,},
|
||||
/* 8852B PCIE WOW */
|
||||
.ple_qt_52b_wow = {147, 0, 16, 20, 157, 13, 133, 0, 172, 14, 24, 0,},
|
||||
/* 8852BT PCIE WOW */
|
||||
.ple_qt_52bt_wow = {147, 0, 32, 20, 1860, 13, 1929, 0, 1879, 14, 24, 0,},
|
||||
/* 8851B PCIE WOW */
|
||||
.ple_qt_51b_wow = {147, 0, 16, 20, 157, 13, 133, 0, 172, 14, 24, 0,},
|
||||
.ple_rsvd_qt0 = {2, 107, 107, 6, 6, 6, 6, 0, 0, 0,},
|
||||
@@ -2025,11 +2032,16 @@ int rtw89_mac_resize_ple_rx_quota(struct rtw89_dev *rtwdev, bool wow)
|
||||
|
||||
void rtw89_mac_hw_mgnt_sec(struct rtw89_dev *rtwdev, bool enable)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
u32 msk32 = B_AX_UC_MGNT_DEC | B_AX_BMC_MGNT_DEC;
|
||||
|
||||
if (rtwdev->chip->chip_gen != RTW89_CHIP_AX)
|
||||
return;
|
||||
|
||||
/* 8852C enable B_AX_UC_MGNT_DEC by default */
|
||||
if (chip->chip_id == RTL8852C)
|
||||
msk32 = B_AX_BMC_MGNT_DEC;
|
||||
|
||||
if (enable)
|
||||
rtw89_write32_set(rtwdev, R_AX_SEC_ENG_CTRL, msk32);
|
||||
else
|
||||
@@ -2254,6 +2266,8 @@ static int sec_eng_init_ax(struct rtw89_dev *rtwdev)
|
||||
/* init TX encryption */
|
||||
val |= (B_AX_SEC_TX_ENC | B_AX_SEC_RX_DEC);
|
||||
val |= (B_AX_MC_DEC | B_AX_BC_DEC);
|
||||
if (chip->chip_id == RTL8852C)
|
||||
val |= B_AX_UC_MGNT_DEC;
|
||||
if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B ||
|
||||
chip->chip_id == RTL8851B)
|
||||
val &= ~B_AX_TX_PARTIAL_MODE;
|
||||
@@ -3781,7 +3795,7 @@ static int rtw89_mac_enable_cpu_ax(struct rtw89_dev *rtwdev, u8 boot_reason,
|
||||
|
||||
rtw89_write32(rtwdev, R_AX_WCPU_FW_CTRL, val);
|
||||
|
||||
if (rtwdev->chip->chip_id == RTL8852B)
|
||||
if (rtw89_is_rtl885xb(rtwdev))
|
||||
rtw89_write32_mask(rtwdev, R_AX_SEC_CTRL,
|
||||
B_AX_SEC_IDMEM_SIZE_CONFIG_MASK, 0x2);
|
||||
|
||||
@@ -4774,14 +4788,14 @@ rtw89_mac_c2h_scanofld_rsp(struct rtw89_dev *rtwdev, struct sk_buff *skb,
|
||||
case RTW89_SCAN_ENTER_OP_NOTIFY:
|
||||
case RTW89_SCAN_ENTER_CH_NOTIFY:
|
||||
if (rtw89_is_op_chan(rtwdev, band, chan)) {
|
||||
rtw89_assign_entity_chan(rtwdev, rtwvif->sub_entity_idx,
|
||||
rtw89_assign_entity_chan(rtwdev, rtwvif->chanctx_idx,
|
||||
&rtwdev->scan_info.op_chan);
|
||||
rtw89_mac_enable_beacon_for_ap_vifs(rtwdev, true);
|
||||
ieee80211_wake_queues(rtwdev->hw);
|
||||
} else {
|
||||
rtw89_chan_create(&new, chan, chan, band,
|
||||
RTW89_CHANNEL_WIDTH_20);
|
||||
rtw89_assign_entity_chan(rtwdev, rtwvif->sub_entity_idx,
|
||||
rtw89_assign_entity_chan(rtwdev, rtwvif->chanctx_idx,
|
||||
&new);
|
||||
}
|
||||
break;
|
||||
@@ -6513,8 +6527,9 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
|
||||
|
||||
.is_txq_empty = mac_is_txq_empty_ax,
|
||||
|
||||
.add_chan_list = rtw89_hw_scan_add_chan_list,
|
||||
.scan_offload = rtw89_fw_h2c_scan_offload,
|
||||
.add_chan_list = rtw89_hw_scan_add_chan_list_ax,
|
||||
.add_chan_list_pno = rtw89_pno_scan_add_chan_list_ax,
|
||||
.scan_offload = rtw89_fw_h2c_scan_offload_ax,
|
||||
|
||||
.wow_config_mac = rtw89_wow_config_mac_ax,
|
||||
};
|
||||
|
||||
@@ -885,12 +885,14 @@ struct rtw89_mac_size_set {
|
||||
const struct rtw89_dle_size wde_size9;
|
||||
const struct rtw89_dle_size wde_size18;
|
||||
const struct rtw89_dle_size wde_size19;
|
||||
const struct rtw89_dle_size wde_size23;
|
||||
const struct rtw89_dle_size ple_size0;
|
||||
const struct rtw89_dle_size ple_size0_v1;
|
||||
const struct rtw89_dle_size ple_size3_v1;
|
||||
const struct rtw89_dle_size ple_size4;
|
||||
const struct rtw89_dle_size ple_size6;
|
||||
const struct rtw89_dle_size ple_size8;
|
||||
const struct rtw89_dle_size ple_size9;
|
||||
const struct rtw89_dle_size ple_size18;
|
||||
const struct rtw89_dle_size ple_size19;
|
||||
const struct rtw89_wde_quota wde_qt0;
|
||||
@@ -900,6 +902,7 @@ struct rtw89_mac_size_set {
|
||||
const struct rtw89_wde_quota wde_qt7;
|
||||
const struct rtw89_wde_quota wde_qt17;
|
||||
const struct rtw89_wde_quota wde_qt18;
|
||||
const struct rtw89_wde_quota wde_qt23;
|
||||
const struct rtw89_ple_quota ple_qt0;
|
||||
const struct rtw89_ple_quota ple_qt1;
|
||||
const struct rtw89_ple_quota ple_qt4;
|
||||
@@ -911,9 +914,12 @@ struct rtw89_mac_size_set {
|
||||
const struct rtw89_ple_quota ple_qt45;
|
||||
const struct rtw89_ple_quota ple_qt46;
|
||||
const struct rtw89_ple_quota ple_qt47;
|
||||
const struct rtw89_ple_quota ple_qt57;
|
||||
const struct rtw89_ple_quota ple_qt58;
|
||||
const struct rtw89_ple_quota ple_qt59;
|
||||
const struct rtw89_ple_quota ple_qt_52a_wow;
|
||||
const struct rtw89_ple_quota ple_qt_52b_wow;
|
||||
const struct rtw89_ple_quota ple_qt_52bt_wow;
|
||||
const struct rtw89_ple_quota ple_qt_51b_wow;
|
||||
const struct rtw89_rsvd_quota ple_rsvd_qt0;
|
||||
const struct rtw89_rsvd_quota ple_rsvd_qt1;
|
||||
@@ -1000,9 +1006,12 @@ struct rtw89_mac_gen_def {
|
||||
|
||||
int (*add_chan_list)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
int (*add_chan_list_pno)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int (*scan_offload)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *option,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif *rtwvif,
|
||||
bool wowlan);
|
||||
|
||||
int (*wow_config_mac)(struct rtw89_dev *rtwdev, bool enable_wow);
|
||||
};
|
||||
|
||||
@@ -90,7 +90,7 @@ static int rtw89_ops_config(struct ieee80211_hw *hw, u32 changed)
|
||||
rtw89_leave_ips(rtwdev);
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
||||
rtw89_config_entity_chandef(rtwdev, RTW89_SUB_ENTITY_0,
|
||||
rtw89_config_entity_chandef(rtwdev, RTW89_CHANCTX_0,
|
||||
&hw->conf.chandef);
|
||||
rtw89_set_channel(rtwdev);
|
||||
}
|
||||
@@ -126,7 +126,9 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
|
||||
rtwvif->rtwdev = rtwdev;
|
||||
rtwvif->roc.state = RTW89_ROC_IDLE;
|
||||
rtwvif->offchan = false;
|
||||
list_add_tail(&rtwvif->list, &rtwdev->rtwvifs_list);
|
||||
if (!rtw89_rtwvif_in_list(rtwdev, rtwvif))
|
||||
list_add_tail(&rtwvif->list, &rtwdev->rtwvifs_list);
|
||||
|
||||
INIT_WORK(&rtwvif->update_beacon_work, rtw89_core_update_beacon_work);
|
||||
INIT_DELAYED_WORK(&rtwvif->roc.roc_work, rtw89_roc_work);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
@@ -144,7 +146,7 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
|
||||
rtwvif->bcn_hit_cond = 0;
|
||||
rtwvif->mac_idx = RTW89_MAC_0;
|
||||
rtwvif->phy_idx = RTW89_PHY_0;
|
||||
rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
rtwvif->chanctx_idx = RTW89_CHANCTX_0;
|
||||
rtwvif->chanctx_assigned = false;
|
||||
rtwvif->hit_rule = 0;
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
@@ -313,7 +315,7 @@ static u8 rtw89_aifsn_to_aifs(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
u8 slot_time;
|
||||
u8 sifs;
|
||||
|
||||
@@ -503,7 +505,7 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
if (chan->band_type == RTW89_BAND_6G) {
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
return -EOPNOTSUPP;
|
||||
@@ -519,7 +521,7 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
|
||||
rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, NULL, RTW89_ROLE_TYPE_CHANGE);
|
||||
rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
|
||||
rtw89_chip_rfk_channel(rtwdev);
|
||||
rtw89_chip_rfk_channel(rtwdev, rtwvif);
|
||||
|
||||
rtw89_queue_chanctx_work(rtwdev);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
@@ -783,7 +785,7 @@ static void rtw89_ra_mask_info_update_iter(void *data, struct ieee80211_sta *sta
|
||||
|
||||
rtwsta->use_cfg_mask = true;
|
||||
rtwsta->mask = *br_data->mask;
|
||||
rtw89_phy_ra_updata_sta(br_data->rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED);
|
||||
rtw89_phy_ra_update_sta(br_data->rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED);
|
||||
}
|
||||
|
||||
static void rtw89_ra_mask_info_update(struct rtw89_dev *rtwdev,
|
||||
@@ -925,7 +927,7 @@ static void rtw89_ops_sta_rc_update(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
|
||||
rtw89_phy_ra_updata_sta(rtwdev, sta, changed);
|
||||
rtw89_phy_ra_update_sta(rtwdev, sta, changed);
|
||||
}
|
||||
|
||||
static int rtw89_ops_add_chanctx(struct ieee80211_hw *hw,
|
||||
@@ -1147,6 +1149,22 @@ static void rtw89_set_rekey_data(struct ieee80211_hw *hw,
|
||||
}
|
||||
#endif
|
||||
|
||||
static void rtw89_ops_rfkill_poll(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
/* wl_disable GPIO get floating when entering LPS */
|
||||
if (test_bit(RTW89_FLAG_RUNNING, rtwdev->flags))
|
||||
goto out;
|
||||
|
||||
rtw89_core_rfkill_poll(rtwdev, false);
|
||||
|
||||
out:
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
const struct ieee80211_ops rtw89_ops = {
|
||||
.tx = rtw89_ops_tx,
|
||||
.wake_tx_queue = rtw89_ops_wake_tx_queue,
|
||||
@@ -1193,5 +1211,6 @@ const struct ieee80211_ops rtw89_ops = {
|
||||
.set_wakeup = rtw89_ops_set_wakeup,
|
||||
.set_rekey_data = rtw89_set_rekey_data,
|
||||
#endif
|
||||
.rfkill_poll = rtw89_ops_rfkill_poll,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_ops);
|
||||
|
||||
@@ -2599,6 +2599,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
|
||||
.is_txq_empty = mac_is_txq_empty_be,
|
||||
|
||||
.add_chan_list = rtw89_hw_scan_add_chan_list_be,
|
||||
.add_chan_list_pno = rtw89_pno_scan_add_chan_list_be,
|
||||
.scan_offload = rtw89_fw_h2c_scan_offload_be,
|
||||
|
||||
.wow_config_mac = rtw89_wow_config_mac_be,
|
||||
|
||||
@@ -302,7 +302,7 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern;
|
||||
struct rtw89_ra_info *ra = &rtwsta->ra;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif);
|
||||
const u64 *high_rate_masks = rtw89_ra_mask_ht_rates;
|
||||
u8 rssi = ewma_rssi_read(&rtwsta->avg_rssi);
|
||||
@@ -341,8 +341,11 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
|
||||
mode |= RTW89_RA_MODE_VHT;
|
||||
csi_mode = RTW89_RA_RPT_MODE_VHT;
|
||||
/* MCS9, MCS8, MCS7 */
|
||||
ra_mask |= get_mcs_ra_mask(mcs_map, 9, 1);
|
||||
/* MCS9 (non-20MHz), MCS8, MCS7 */
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
ra_mask |= get_mcs_ra_mask(mcs_map, 8, 1);
|
||||
else
|
||||
ra_mask |= get_mcs_ra_mask(mcs_map, 9, 1);
|
||||
high_rate_masks = rtw89_ra_mask_vht_rates;
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
|
||||
stbc_en = 1;
|
||||
@@ -462,7 +465,7 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
ra->csi_mode = csi_mode;
|
||||
}
|
||||
|
||||
void rtw89_phy_ra_updata_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
void rtw89_phy_ra_update_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
u32 changed)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
@@ -528,7 +531,7 @@ void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_phy_rate_pattern next_pattern = {0};
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
static const u16 hw_rate_he[][RTW89_CHIP_GEN_NUM] = {
|
||||
RTW89_HW_RATE_BY_CHIP_GEN(HE_NSS1_MCS0),
|
||||
RTW89_HW_RATE_BY_CHIP_GEN(HE_NSS2_MCS0),
|
||||
@@ -610,17 +613,17 @@ void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RA, "unset rate pattern\n");
|
||||
}
|
||||
|
||||
static void rtw89_phy_ra_updata_sta_iter(void *data, struct ieee80211_sta *sta)
|
||||
static void rtw89_phy_ra_update_sta_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = (struct rtw89_dev *)data;
|
||||
|
||||
rtw89_phy_ra_updata_sta(rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED);
|
||||
rtw89_phy_ra_update_sta(rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED);
|
||||
}
|
||||
|
||||
void rtw89_phy_ra_update(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
ieee80211_iterate_stations_atomic(rtwdev->hw,
|
||||
rtw89_phy_ra_updata_sta_iter,
|
||||
rtw89_phy_ra_update_sta_iter,
|
||||
rtwdev);
|
||||
}
|
||||
|
||||
@@ -4285,7 +4288,7 @@ void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
rtwvif->chanctx_idx);
|
||||
struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info;
|
||||
|
||||
if (!chip->ul_tb_waveform_ctrl)
|
||||
@@ -5367,7 +5370,7 @@ static void rtw89_phy_dig_update_rssi_info(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_phy_dig_update_para(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_dig_info *dig = &rtwdev->dig;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
bool is_linked = rtwdev->total_sta_assoc > 0;
|
||||
const u16 *fa_th_src = NULL;
|
||||
|
||||
@@ -5611,7 +5614,7 @@ static void rtw89_phy_dig_config_igi(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
|
||||
bool enable)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
|
||||
enum rtw89_bandwidth cbw = chan->band_width;
|
||||
struct rtw89_dig_info *dig = &rtwdev->dig;
|
||||
|
||||
@@ -894,7 +894,7 @@ void rtw89_phy_set_txpwr_limit_ru(struct rtw89_dev *rtwdev,
|
||||
|
||||
void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta);
|
||||
void rtw89_phy_ra_update(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_ra_updata_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
void rtw89_phy_ra_update_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
u32 changed);
|
||||
void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
|
||||
@@ -107,6 +107,15 @@
|
||||
#define B_AX_DBG_SEL0_16BIT BIT(11)
|
||||
#define B_AX_DBG_SEL0 GENMASK(7, 0)
|
||||
|
||||
#define R_AX_GPIO_EXT_CTRL 0x0060
|
||||
#define B_AX_GPIO_MOD_15_TO_8_MASK GENMASK(31, 24)
|
||||
#define B_AX_GPIO_MOD_9 BIT(25)
|
||||
#define B_AX_GPIO_IO_SEL_15_TO_8_MASK GENMASK(23, 16)
|
||||
#define B_AX_GPIO_IO_SEL_9 BIT(17)
|
||||
#define B_AX_GPIO_OUT_15_TO_8_MASK GENMASK(15, 8)
|
||||
#define B_AX_GPIO_IN_15_TO_8_MASK GENMASK(7, 0)
|
||||
#define B_AX_GPIO_IN_9 BIT(1)
|
||||
|
||||
#define R_AX_SYS_SDIO_CTRL 0x0070
|
||||
#define B_AX_PCIE_DIS_L2_CTRL_LDO_HCI BIT(15)
|
||||
#define B_AX_PCIE_DIS_WLSUS_AFT_PDN BIT(14)
|
||||
@@ -267,6 +276,9 @@
|
||||
|
||||
#define R_AX_GPIO0_7_FUNC_SEL 0x02D0
|
||||
|
||||
#define R_AX_GPIO8_15_FUNC_SEL 0x02D4
|
||||
#define B_AX_PINMUX_GPIO9_FUNC_SEL_MASK GENMASK(7, 4)
|
||||
|
||||
#define R_AX_EECS_EESK_FUNC_SEL 0x02D8
|
||||
#define B_AX_PINMUX_EESK_FUNC_SEL_MASK GENMASK(7, 4)
|
||||
|
||||
@@ -706,6 +718,14 @@
|
||||
B_AX_HDT_CHANNEL_DMA_ERR_INT_EN | \
|
||||
B_AX_HDT_TOTAL_LEN_ERR_INT_EN | \
|
||||
B_AX_HDT_DMA_PROCESS_ERR_INT_EN)
|
||||
#define B_AX_HOST_DISP_IMR_SET_V01 (B_AX_HDT_CHANNEL_DIFF_ERR_INT_EN | \
|
||||
B_AX_HDT_PAYLOAD_OVERFLOW_INT_EN | \
|
||||
B_AX_HDT_PAYLOAD_UNDERFLOW_INT_EN | \
|
||||
B_AX_HDT_CHANNEL_DMA_ERR_INT_EN | \
|
||||
B_AX_HDT_TOTAL_LEN_ERR_INT_EN | \
|
||||
B_AX_HDT_DMA_PROCESS_ERR_INT_EN | \
|
||||
B_AX_HDT_RX_WRITE_OVERFLOW_INT_EN | \
|
||||
B_AX_HDT_RX_WRITE_UNDERFLOW_INT_EN)
|
||||
|
||||
#define B_AX_HR_WRFF_UNDERFLOW_ERR_INT_EN BIT(31)
|
||||
#define B_AX_HR_WRFF_OVERFLOW_ERR_INT_EN BIT(30)
|
||||
@@ -1096,6 +1116,7 @@
|
||||
#define B_AX_WDE_BUFMGN_FRZTMR_MODE BIT(0)
|
||||
|
||||
#define R_AX_WDE_ERR_IMR 0x8C38
|
||||
#define B_AX_WDE_DATCHN_UAPG_ERR_INT_EN BIT(30)
|
||||
#define B_AX_WDE_DATCHN_RRDY_ERR_INT_EN BIT(27)
|
||||
#define B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN BIT(26)
|
||||
#define B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN BIT(25)
|
||||
@@ -1135,6 +1156,29 @@
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_CLR_V01 (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_SIZE_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SRCHTAILPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_STRPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_PGOFST_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_CMDTYPE_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_DSTQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_SRCQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_OVRF_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_NVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_PREPKTLLT_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_NXTPKTLL_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_QUEMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_RRDY_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_UAPG_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_SET (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
@@ -1154,6 +1198,28 @@
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_SET_V01 (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_SIZE_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SRCHTAILPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_STRPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_PGOFST_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_CMDTYPE_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_DSTQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_SRCQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_OVRF_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_NVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_PREPKTLLT_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_NXTPKTLL_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_QUEMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_RRDY_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN)
|
||||
|
||||
#define B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN BIT(29)
|
||||
#define B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN BIT(28)
|
||||
@@ -3098,7 +3164,9 @@
|
||||
B_AX_OFDM_CCA_TIMEOUT_INT_EN | \
|
||||
B_AX_DATA_ON_TIMEOUT_INT_EN | \
|
||||
B_AX_STS_ON_TIMEOUT_INT_EN | \
|
||||
B_AX_CSI_ON_TIMEOUT_INT_EN)
|
||||
B_AX_CSI_ON_TIMEOUT_INT_EN | \
|
||||
B_AX_PHYINTF_TIMEOUT_THR_MSAK)
|
||||
#define B_AX_PHYINFO_IMR_SET (B_AX_PHY_TXON_TIMEOUT_INT_EN | 0x7)
|
||||
|
||||
#define R_AX_PHYINFO_ERR_ISR 0xCCFC
|
||||
#define R_AX_PHYINFO_ERR_ISR_C1 0xECFC
|
||||
@@ -3854,6 +3922,15 @@
|
||||
#define R_BE_EFUSE_CTRL_1_V1 0x0034
|
||||
#define B_BE_EF_DATA_MASK GENMASK(31, 0)
|
||||
|
||||
#define R_BE_GPIO_EXT_CTRL 0x0060
|
||||
#define B_BE_GPIO_MOD_15_TO_8_MASK GENMASK(31, 24)
|
||||
#define B_BE_GPIO_MOD_9 BIT(25)
|
||||
#define B_BE_GPIO_IO_SEL_15_TO_8_MASK GENMASK(23, 16)
|
||||
#define B_BE_GPIO_IO_SEL_9 BIT(17)
|
||||
#define B_BE_GPIO_OUT_15_TO_8_MASK GENMASK(15, 8)
|
||||
#define B_BE_GPIO_IN_15_TO_8_MASK GENMASK(7, 0)
|
||||
#define B_BE_GPIO_IN_9 BIT(1)
|
||||
|
||||
#define R_BE_WL_BT_PWR_CTRL 0x0068
|
||||
#define B_BE_ISO_BD2PP BIT(31)
|
||||
#define B_BE_LDOV12B_EN BIT(30)
|
||||
@@ -4299,6 +4376,9 @@
|
||||
#define B_BE_REG_CK40M_EN BIT(1)
|
||||
#define B_BE_REG_CK640M_EN BIT(0)
|
||||
|
||||
#define R_BE_GPIO8_15_FUNC_SEL 0x02D4
|
||||
#define B_BE_PINMUX_GPIO9_FUNC_SEL_MASK GENMASK(7, 4)
|
||||
|
||||
#define R_BE_WLAN_XTAL_SI_CTRL 0x0270
|
||||
#define B_BE_WL_XTAL_SI_CMD_POLL BIT(31)
|
||||
#define B_BE_WL_XTAL_SI_CHIPID_MASK GENMASK(30, 28)
|
||||
|
||||
@@ -800,7 +800,7 @@ static bool __rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev)
|
||||
const struct rtw89_reg_6ghz_tpe *tmp;
|
||||
const struct rtw89_chan *chan;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
|
||||
@@ -872,7 +872,7 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
|
||||
u8 index;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->chanctx_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -185,6 +185,15 @@ static const struct rtw89_rrsr_cfgs rtw8851b_rrsr_cfgs = {
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8851b_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8851b_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V1,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@@ -1581,9 +1590,9 @@ static void rtw8851b_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtw8851b_rx_dck(rtwdev, RTW89_PHY_0);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
|
||||
rtw8851b_rx_dck(rtwdev, phy_idx);
|
||||
rtw8851b_iqk(rtwdev, phy_idx);
|
||||
@@ -1597,9 +1606,10 @@ static void rtw8851b_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
rtw8851b_tssi_scan(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8851b_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start)
|
||||
{
|
||||
rtw8851b_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8851b_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@@ -1801,7 +1811,7 @@ rtw8851b_init_txpwr_unit(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
static void rtw8851b_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_phy_write_reg3_tbl(rtwdev, en ? &rtw8851b_btc_preagc_en_defs_tbl :
|
||||
&rtw8851b_btc_preagc_dis_defs_tbl);
|
||||
@@ -1824,7 +1834,7 @@ static void rtw8851b_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
|
||||
static void rtw8851b_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
if (en) {
|
||||
rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1,
|
||||
@@ -1869,7 +1879,7 @@ static void rtw8851b_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en,
|
||||
static void rtw8851b_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path_bit rx_path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u32 rst_mask0;
|
||||
|
||||
if (rx_path == RF_A) {
|
||||
@@ -2463,6 +2473,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 1,
|
||||
.tx_nss = 1,
|
||||
.rx_nss = 1,
|
||||
@@ -2524,6 +2535,8 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
.rrsr_cfgs = &rtw8851b_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP_V1, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V1,
|
||||
.rfkill_init = &rtw8851b_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
|
||||
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
|
||||
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
|
||||
|
||||
@@ -523,7 +523,7 @@ static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
|
||||
static void _rx_dck_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool is_afe)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[RX_DCK] ==== S%d RX DCK (%s / CH%d / %s / by %s)====\n", path,
|
||||
@@ -1483,7 +1483,7 @@ static void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev,
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
u8 path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 idx = 0;
|
||||
|
||||
@@ -1589,7 +1589,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, RTW89_CHANCTX_0);
|
||||
u32 backup_rf_val[RTW8851B_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
|
||||
@@ -1748,7 +1748,7 @@ static void _dpk_init(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@@ -2619,7 +2619,7 @@ static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_sys_defs_tbl);
|
||||
@@ -2664,7 +2664,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@@ -2757,7 +2757,7 @@ static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
|
||||
@@ -2768,7 +2768,7 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool all)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
|
||||
@@ -2947,7 +2947,7 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
u8 ch = chan->channel;
|
||||
s8 de_1st;
|
||||
@@ -2983,7 +2983,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
u8 ch = chan->channel;
|
||||
s8 tde_1st;
|
||||
@@ -3020,7 +3020,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@@ -3099,7 +3099,7 @@ static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
|
||||
@@ -3257,7 +3257,7 @@ void rtw8851b_dack(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@@ -3273,7 +3273,7 @@ void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
@@ -3288,7 +3288,7 @@ void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
@@ -3310,7 +3310,7 @@ void rtw8851b_dpk_track(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_A);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_A, RTW89_CHANCTX_0);
|
||||
u8 i;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);
|
||||
@@ -3338,7 +3338,7 @@ void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_e
|
||||
|
||||
void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
u32 i;
|
||||
|
||||
@@ -3361,7 +3361,7 @@ void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void rtw8851b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, bool enable)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",
|
||||
|
||||
@@ -478,6 +478,15 @@ static const struct rtw89_rrsr_cfgs rtw8852a_rrsr_cfgs = {
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852a_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852a_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@@ -1336,9 +1345,9 @@ static void rtw8852a_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtw8852a_rx_dck(rtwdev, RTW89_PHY_0, true);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
|
||||
rtw8852a_rx_dck(rtwdev, phy_idx, true);
|
||||
rtw8852a_iqk(rtwdev, phy_idx);
|
||||
@@ -1352,9 +1361,10 @@ static void rtw8852a_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
rtw8852a_tssi_scan(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8852a_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start)
|
||||
{
|
||||
rtw8852a_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8852a_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@@ -1536,7 +1546,7 @@ void rtw8852a_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw8852a_bb_pmac_info *tx_info,
|
||||
enum rtw89_phy_idx idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
if (!tx_info->en_pmac_tx) {
|
||||
rtw8852a_stop_pmac_tx(rtwdev, tx_info, idx);
|
||||
@@ -2178,6 +2188,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@@ -2240,6 +2251,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.rrsr_cfgs = &rtw8852a_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP,
|
||||
.rfkill_init = &rtw8852a_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = 0,
|
||||
.edcca_regs = &rtw8852a_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -497,7 +497,7 @@ static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
|
||||
{
|
||||
struct rtw89_dack_info *dack = &rtwdev->dack;
|
||||
u32 rf0_0, rf1_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB, RTW89_CHANCTX_0);
|
||||
|
||||
dack->dack_done = false;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n");
|
||||
@@ -804,7 +804,7 @@ static bool _iqk_one_shot(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
bool fail = false;
|
||||
u32 iqk_cmd = 0x0;
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy_idx, path);
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy_idx, path, RTW89_CHANCTX_0);
|
||||
u32 addr_rfc_ctl = 0x0;
|
||||
|
||||
if (path == RF_PATH_A)
|
||||
@@ -1356,7 +1356,7 @@ static void _iqk_get_ch_info(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 path)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u32 reg_rf18 = 0x0, reg_35c = 0x0;
|
||||
u8 idx = 0;
|
||||
u8 get_empty_table = false;
|
||||
@@ -1612,7 +1612,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852A_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@@ -1658,7 +1658,7 @@ static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool forc
|
||||
static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool is_afe)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path);
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path, RTW89_CHANCTX_0);
|
||||
u32 ori_val;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
@@ -1802,7 +1802,7 @@ static void _dpk_reload_kip(struct rtw89_dev *rtwdev, u32 *reg,
|
||||
static u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, enum rtw8852a_dpk_id id)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path);
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path, RTW89_CHANCTX_0);
|
||||
u16 dpk_cmd = 0x0;
|
||||
u32 val;
|
||||
int ret;
|
||||
@@ -1852,7 +1852,7 @@ static void _dpk_information(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
|
||||
dpk->bp[path][kidx].band = chan->band_type;
|
||||
@@ -2330,7 +2330,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
#define DPK_RXBB_UPPER 0x1f
|
||||
#define DPK_RXBB_LOWER 0
|
||||
#define DPK_GL_CRIT 7
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
|
||||
u8 agc_cnt = 0;
|
||||
bool limited_rxbb = false;
|
||||
@@ -2521,7 +2521,7 @@ static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
bool is_reload = false;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
|
||||
@@ -2655,7 +2655,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
@@ -2817,7 +2817,7 @@ static void _dpk_track(struct rtw89_dev *rtwdev)
|
||||
static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (band == RTW89_BAND_2G)
|
||||
@@ -2828,7 +2828,7 @@ static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_sys_defs_tbl);
|
||||
@@ -2840,7 +2840,7 @@ static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
|
||||
@@ -2883,7 +2883,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@@ -3078,7 +3078,7 @@ static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,
|
||||
static void _tssi_pak(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 subband = chan->subband_type;
|
||||
|
||||
switch (subband) {
|
||||
@@ -3255,7 +3255,7 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
s8 de_1st = 0;
|
||||
@@ -3293,7 +3293,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
s8 tde_1st = 0;
|
||||
@@ -3332,7 +3332,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
#define __DE_MASK 0x003ff000
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
static const u32 r_cck_long[RF_PATH_NUM_8852A] = {0x5858, 0x7858};
|
||||
static const u32 r_cck_short[RF_PATH_NUM_8852A] = {0x5860, 0x7860};
|
||||
static const u32 r_mcs_20m[RF_PATH_NUM_8852A] = {0x5838, 0x7838};
|
||||
@@ -3461,7 +3461,7 @@ static void _tssi_track(struct rtw89_dev *rtwdev)
|
||||
static void _tssi_high_power(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel, ch_tmp;
|
||||
u8 bw = chan->band_width;
|
||||
u8 band = chan->band_type;
|
||||
@@ -3508,13 +3508,13 @@ static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
const struct rtw89_chip_info *mac_reg = rtwdev->chip;
|
||||
u8 ch = chan->channel, ch_tmp;
|
||||
u8 bw = chan->band_width;
|
||||
u8 band = chan->band_type;
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0, RTW89_CHANCTX_0);
|
||||
s8 power;
|
||||
s16 xdbm;
|
||||
u32 i, tx_counter = 0;
|
||||
@@ -3602,7 +3602,7 @@ void rtw8852a_rck(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852a_dack(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
@@ -3612,7 +3612,7 @@ void rtw8852a_dack(struct rtw89_dev *rtwdev)
|
||||
void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
@@ -3632,7 +3632,7 @@ void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
bool is_afe)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
@@ -3647,7 +3647,7 @@ void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
|
||||
@@ -150,6 +150,15 @@ static const struct rtw89_rrsr_cfgs rtw8852b_rrsr_cfgs = {
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852b_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852b_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V1,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@@ -553,9 +562,9 @@ static void rtw8852b_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtw8852b_rx_dck(rtwdev, RTW89_PHY_0);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
|
||||
rtw8852b_rx_dck(rtwdev, phy_idx);
|
||||
rtw8852b_iqk(rtwdev, phy_idx);
|
||||
@@ -569,9 +578,10 @@ static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
rtw8852b_tssi_scan(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start)
|
||||
{
|
||||
rtw8852b_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8852b_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@@ -818,6 +828,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@@ -880,6 +891,8 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
.rrsr_cfgs = &rtw8852b_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP_V1, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V1,
|
||||
.rfkill_init = &rtw8852b_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
|
||||
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
|
||||
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
|
||||
|
||||
@@ -1447,7 +1447,7 @@ void rtw8852bx_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw8852bx_bb_pmac_info *tx_info,
|
||||
enum rtw89_phy_idx idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
if (!tx_info->en_pmac_tx) {
|
||||
rtw8852bx_stop_pmac_tx(rtwdev, tx_info, idx);
|
||||
@@ -1625,7 +1625,7 @@ static
|
||||
void __rtw8852bx_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path_bit rx_path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u32 rst_mask0;
|
||||
u32 rst_mask1;
|
||||
|
||||
|
||||
@@ -1384,7 +1384,7 @@ static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 reg_rf18;
|
||||
u32 reg_35c;
|
||||
@@ -1613,7 +1613,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852B_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@@ -1763,7 +1763,7 @@ static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@@ -1788,7 +1788,7 @@ static void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kpath)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_defs_tbl);
|
||||
|
||||
@@ -1805,7 +1805,7 @@ static void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kpath)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_restore_defs_tbl);
|
||||
|
||||
@@ -2219,7 +2219,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
|
||||
bool loss_only)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 step = DPK_AGC_STEP_SYNC_DGAIN;
|
||||
u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
|
||||
u8 goout = 0, agc_cnt = 0, limited_rxbb = 0;
|
||||
@@ -2418,7 +2418,7 @@ static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
bool is_reload = false;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
@@ -2545,7 +2545,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
|
||||
if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
|
||||
@@ -2724,7 +2724,7 @@ static void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (band == RTW89_BAND_2G)
|
||||
@@ -2736,7 +2736,7 @@ static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852b_tssi_sys_defs_tbl);
|
||||
@@ -2792,7 +2792,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@@ -2946,7 +2946,7 @@ static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A)
|
||||
@@ -2962,7 +2962,7 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool all)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
const struct rtw89_rfk_tbl *tbl = NULL;
|
||||
u8 ch = chan->channel;
|
||||
@@ -3234,7 +3234,7 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
s8 de_1st;
|
||||
@@ -3270,7 +3270,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
s8 tde_1st;
|
||||
@@ -3307,7 +3307,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@@ -3386,7 +3386,7 @@ static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
|
||||
@@ -3574,7 +3574,7 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static const s16 power_2g[4] = {48, 20, 4, 4};
|
||||
static const s16 power_5g[4] = {48, 20, 4, 4};
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
|
||||
u32 tssi_cw_rpt[RTW8852B_TSSI_PATH_NR] = {0};
|
||||
u8 channel = chan->channel;
|
||||
@@ -3757,7 +3757,7 @@ void rtw8852b_rck(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852b_dack(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
@@ -3766,7 +3766,7 @@ void rtw8852b_dack(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@@ -3782,7 +3782,7 @@ void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
@@ -3797,7 +3797,7 @@ void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
@@ -3819,7 +3819,7 @@ void rtw8852b_dpk_track(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
u8 i;
|
||||
|
||||
@@ -3856,7 +3856,7 @@ void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_e
|
||||
|
||||
void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
@@ -3896,7 +3896,7 @@ void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, bool enable)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",
|
||||
|
||||
843
drivers/net/wireless/realtek/rtw89/rtw8852bt.c
Normal file
843
drivers/net/wireless/realtek/rtw89/rtw8852bt.c
Normal file
@@ -0,0 +1,843 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/* Copyright(c) 2024 Realtek Corporation
|
||||
*/
|
||||
|
||||
#include "coex.h"
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "phy.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852bt.h"
|
||||
#include "rtw8852bt_rfk.h"
|
||||
#include "rtw8852b_common.h"
|
||||
|
||||
#define RTW8852BT_FW_FORMAT_MAX 0
|
||||
#define RTW8852BT_FW_BASENAME "rtw89/rtw8852bt_fw"
|
||||
#define RTW8852BT_MODULE_FIRMWARE \
|
||||
RTW8852BT_FW_BASENAME ".bin"
|
||||
|
||||
static const struct rtw89_hfc_ch_cfg rtw8852bt_hfc_chcfg_pcie[] = {
|
||||
{16, 742, grp_0}, /* ACH 0 */
|
||||
{16, 742, grp_0}, /* ACH 1 */
|
||||
{16, 742, grp_0}, /* ACH 2 */
|
||||
{16, 742, grp_0}, /* ACH 3 */
|
||||
{0, 0, grp_0}, /* ACH 4 */
|
||||
{0, 0, grp_0}, /* ACH 5 */
|
||||
{0, 0, grp_0}, /* ACH 6 */
|
||||
{0, 0, grp_0}, /* ACH 7 */
|
||||
{15, 743, grp_0}, /* B0MGQ */
|
||||
{15, 743, grp_0}, /* B0HIQ */
|
||||
{0, 0, grp_0}, /* B1MGQ */
|
||||
{0, 0, grp_0}, /* B1HIQ */
|
||||
{40, 0, 0} /* FWCMDQ */
|
||||
};
|
||||
|
||||
static const struct rtw89_hfc_pub_cfg rtw8852bt_hfc_pubcfg_pcie = {
|
||||
958, /* Group 0 */
|
||||
0, /* Group 1 */
|
||||
958, /* Public Max */
|
||||
0 /* WP threshold */
|
||||
};
|
||||
|
||||
static const struct rtw89_hfc_param_ini rtw8852bt_hfc_param_ini_pcie[] = {
|
||||
[RTW89_QTA_SCC] = {rtw8852bt_hfc_chcfg_pcie, &rtw8852bt_hfc_pubcfg_pcie,
|
||||
&rtw89_mac_size.hfc_preccfg_pcie, RTW89_HCIFC_POH},
|
||||
[RTW89_QTA_DLFW] = {NULL, NULL, &rtw89_mac_size.hfc_preccfg_pcie,
|
||||
RTW89_HCIFC_POH},
|
||||
[RTW89_QTA_INVALID] = {NULL},
|
||||
};
|
||||
|
||||
static const struct rtw89_dle_mem rtw8852bt_dle_mem_pcie[] = {
|
||||
[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size23,
|
||||
&rtw89_mac_size.ple_size9, &rtw89_mac_size.wde_qt23,
|
||||
&rtw89_mac_size.wde_qt23, &rtw89_mac_size.ple_qt57,
|
||||
&rtw89_mac_size.ple_qt59},
|
||||
[RTW89_QTA_WOW] = {RTW89_QTA_WOW, &rtw89_mac_size.wde_size23,
|
||||
&rtw89_mac_size.ple_size9, &rtw89_mac_size.wde_qt23,
|
||||
&rtw89_mac_size.wde_qt23, &rtw89_mac_size.ple_qt57,
|
||||
&rtw89_mac_size.ple_qt_52bt_wow},
|
||||
[RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size4,
|
||||
&rtw89_mac_size.ple_size4, &rtw89_mac_size.wde_qt4,
|
||||
&rtw89_mac_size.wde_qt4, &rtw89_mac_size.ple_qt13,
|
||||
&rtw89_mac_size.ple_qt13},
|
||||
[RTW89_QTA_INVALID] = {RTW89_QTA_INVALID, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL},
|
||||
};
|
||||
|
||||
static const u32 rtw8852bt_h2c_regs[RTW89_H2CREG_MAX] = {
|
||||
R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1, R_AX_H2CREG_DATA2,
|
||||
R_AX_H2CREG_DATA3
|
||||
};
|
||||
|
||||
static const u32 rtw8852bt_c2h_regs[RTW89_C2HREG_MAX] = {
|
||||
R_AX_C2HREG_DATA0, R_AX_C2HREG_DATA1, R_AX_C2HREG_DATA2,
|
||||
R_AX_C2HREG_DATA3
|
||||
};
|
||||
|
||||
static const u32 rtw8852bt_wow_wakeup_regs[RTW89_WOW_REASON_NUM] = {
|
||||
R_AX_C2HREG_DATA3 + 3, R_AX_C2HREG_DATA3 + 3,
|
||||
};
|
||||
|
||||
static const struct rtw89_page_regs rtw8852bt_page_regs = {
|
||||
.hci_fc_ctrl = R_AX_HCI_FC_CTRL,
|
||||
.ch_page_ctrl = R_AX_CH_PAGE_CTRL,
|
||||
.ach_page_ctrl = R_AX_ACH0_PAGE_CTRL,
|
||||
.ach_page_info = R_AX_ACH0_PAGE_INFO,
|
||||
.pub_page_info3 = R_AX_PUB_PAGE_INFO3,
|
||||
.pub_page_ctrl1 = R_AX_PUB_PAGE_CTRL1,
|
||||
.pub_page_ctrl2 = R_AX_PUB_PAGE_CTRL2,
|
||||
.pub_page_info1 = R_AX_PUB_PAGE_INFO1,
|
||||
.pub_page_info2 = R_AX_PUB_PAGE_INFO2,
|
||||
.wp_page_ctrl1 = R_AX_WP_PAGE_CTRL1,
|
||||
.wp_page_ctrl2 = R_AX_WP_PAGE_CTRL2,
|
||||
.wp_page_info1 = R_AX_WP_PAGE_INFO1,
|
||||
};
|
||||
|
||||
static const struct rtw89_reg_def rtw8852bt_dcfo_comp = {
|
||||
R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK
|
||||
};
|
||||
|
||||
static const struct rtw89_imr_info rtw8852bt_imr_info = {
|
||||
.wdrls_imr_set = B_AX_WDRLS_IMR_SET,
|
||||
.wsec_imr_reg = R_AX_SEC_DEBUG,
|
||||
.wsec_imr_set = B_AX_IMR_ERROR,
|
||||
.mpdu_tx_imr_set = 0,
|
||||
.mpdu_rx_imr_set = 0,
|
||||
.sta_sch_imr_set = B_AX_STA_SCHEDULER_IMR_SET,
|
||||
.txpktctl_imr_b0_reg = R_AX_TXPKTCTL_ERR_IMR_ISR,
|
||||
.txpktctl_imr_b0_clr = B_AX_TXPKTCTL_IMR_B0_CLR,
|
||||
.txpktctl_imr_b0_set = B_AX_TXPKTCTL_IMR_B0_SET,
|
||||
.txpktctl_imr_b1_reg = R_AX_TXPKTCTL_ERR_IMR_ISR_B1,
|
||||
.txpktctl_imr_b1_clr = B_AX_TXPKTCTL_IMR_B1_CLR,
|
||||
.txpktctl_imr_b1_set = B_AX_TXPKTCTL_IMR_B1_SET,
|
||||
.wde_imr_clr = B_AX_WDE_IMR_CLR_V01,
|
||||
.wde_imr_set = B_AX_WDE_IMR_SET_V01,
|
||||
.ple_imr_clr = B_AX_PLE_IMR_CLR,
|
||||
.ple_imr_set = B_AX_PLE_IMR_SET,
|
||||
.host_disp_imr_clr = B_AX_HOST_DISP_IMR_CLR,
|
||||
.host_disp_imr_set = B_AX_HOST_DISP_IMR_SET_V01,
|
||||
.cpu_disp_imr_clr = B_AX_CPU_DISP_IMR_CLR,
|
||||
.cpu_disp_imr_set = B_AX_CPU_DISP_IMR_SET,
|
||||
.other_disp_imr_clr = B_AX_OTHER_DISP_IMR_CLR,
|
||||
.other_disp_imr_set = 0,
|
||||
.bbrpt_com_err_imr_reg = R_AX_BBRPT_COM_ERR_IMR_ISR,
|
||||
.bbrpt_chinfo_err_imr_reg = R_AX_BBRPT_CHINFO_ERR_IMR_ISR,
|
||||
.bbrpt_err_imr_set = 0,
|
||||
.bbrpt_dfs_err_imr_reg = R_AX_BBRPT_DFS_ERR_IMR_ISR,
|
||||
.ptcl_imr_clr = B_AX_PTCL_IMR_CLR_ALL,
|
||||
.ptcl_imr_set = B_AX_PTCL_IMR_SET,
|
||||
.cdma_imr_0_reg = R_AX_DLE_CTRL,
|
||||
.cdma_imr_0_clr = B_AX_DLE_IMR_CLR,
|
||||
.cdma_imr_0_set = B_AX_DLE_IMR_SET,
|
||||
.cdma_imr_1_reg = 0,
|
||||
.cdma_imr_1_clr = 0,
|
||||
.cdma_imr_1_set = 0,
|
||||
.phy_intf_imr_reg = R_AX_PHYINFO_ERR_IMR,
|
||||
.phy_intf_imr_clr = B_AX_PHYINFO_IMR_EN_ALL,
|
||||
.phy_intf_imr_set = B_AX_PHYINFO_IMR_SET,
|
||||
.rmac_imr_reg = R_AX_RMAC_ERR_ISR,
|
||||
.rmac_imr_clr = B_AX_RMAC_IMR_CLR,
|
||||
.rmac_imr_set = B_AX_RMAC_IMR_SET,
|
||||
.tmac_imr_reg = R_AX_TMAC_ERR_IMR_ISR,
|
||||
.tmac_imr_clr = B_AX_TMAC_IMR_CLR,
|
||||
.tmac_imr_set = B_AX_TMAC_IMR_SET,
|
||||
};
|
||||
|
||||
static const struct rtw89_rrsr_cfgs rtw8852bt_rrsr_cfgs = {
|
||||
.ref_rate = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_REF_RATE_SEL, 0},
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852bt_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852bt_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V1,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
.pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1,
|
||||
.bmode_pd_reg = R_BMODE_PDTH_EN_V1,
|
||||
.bmode_cca_rssi_limit_en = B_BMODE_PDTH_LIMIT_EN_MSK_V1,
|
||||
.bmode_pd_lower_bound_reg = R_BMODE_PDTH_V1,
|
||||
.bmode_rssi_nocca_low_th_mask = B_BMODE_PDTH_LOWER_BOUND_MSK_V1,
|
||||
.p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK},
|
||||
.p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK},
|
||||
.p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1},
|
||||
.p1_tia_init = {R_PATH1_TIA_INIT_V1, B_PATH1_TIA_INIT_IDX_MSK_V1},
|
||||
.p0_rxb_init = {R_PATH0_RXB_INIT_V1, B_PATH0_RXB_INIT_IDX_MSK_V1},
|
||||
.p1_rxb_init = {R_PATH1_RXB_INIT_V1, B_PATH1_RXB_INIT_IDX_MSK_V1},
|
||||
.p0_p20_pagcugc_en = {R_PATH0_P20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH0_P20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
.p0_s20_pagcugc_en = {R_PATH0_S20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH0_S20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
.p1_p20_pagcugc_en = {R_PATH1_P20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH1_P20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
.p1_s20_pagcugc_en = {R_PATH1_S20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH1_S20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
};
|
||||
|
||||
static const struct rtw89_edcca_regs rtw8852bt_edcca_regs = {
|
||||
.edcca_level = R_SEG0R_EDCCA_LVL_V1,
|
||||
.edcca_mask = B_EDCCA_LVL_MSK0,
|
||||
.edcca_p_mask = B_EDCCA_LVL_MSK1,
|
||||
.ppdu_level = R_SEG0R_EDCCA_LVL_V1,
|
||||
.ppdu_mask = B_EDCCA_LVL_MSK3,
|
||||
.rpt_a = R_EDCCA_RPT_A,
|
||||
.rpt_b = R_EDCCA_RPT_B,
|
||||
.rpt_sel = R_EDCCA_RPT_SEL,
|
||||
.rpt_sel_mask = B_EDCCA_RPT_SEL_MSK,
|
||||
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
|
||||
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
|
||||
};
|
||||
|
||||
static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_ul[] = {
|
||||
{255, 0, 0, 7}, /* 0 -> original */
|
||||
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
|
||||
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 3- >reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 4 ->reserved for shared-antenna */
|
||||
{255, 1, 0, 7}, /* the below id is for non-shared-antenna free-run */
|
||||
{6, 1, 0, 7},
|
||||
{13, 1, 0, 7},
|
||||
{13, 1, 0, 7}
|
||||
};
|
||||
|
||||
static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_dl[] = {
|
||||
{255, 0, 0, 7}, /* 0 -> original */
|
||||
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 3- >reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 4 ->reserved for shared-antenna */
|
||||
{255, 1, 0, 7}, /* the below id is for non-shared-antenna free-run */
|
||||
{255, 1, 0, 7},
|
||||
{255, 1, 0, 7},
|
||||
{255, 1, 0, 7}
|
||||
};
|
||||
|
||||
static const struct rtw89_btc_fbtc_mreg rtw89_btc_8852bt_mon_reg[] = {
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda24),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda28),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda2c),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda30),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda4c),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda10),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda20),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda34),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xcef4),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0x8424),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd200),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd220),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x980),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x4aa4),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x4778),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x476c),
|
||||
};
|
||||
|
||||
static const u8 rtw89_btc_8852bt_wl_rssi_thres[BTC_WL_RSSI_THMAX] = {70, 60, 50, 40};
|
||||
static const u8 rtw89_btc_8852bt_bt_rssi_thres[BTC_BT_RSSI_THMAX] = {50, 40, 30, 20};
|
||||
|
||||
static int rtw8852bt_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_LDO_AON_CTRL0, B_AX_PD_REGU_L);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN |
|
||||
B_AX_AFSM_PCIE_SUS_EN);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_DIS_WLBT_PDNSUSEN_SOPC);
|
||||
rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_DIS_WLBT_LPSEN_LOPC);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APDM_HPDN);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_OCP_L1_MASK, 7);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_RDY_SYSPWR,
|
||||
1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFN_ONMAC),
|
||||
1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
|
||||
XTAL_SI_GND_SHDN_WL, XTAL_SI_GND_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
|
||||
XTAL_SI_SHDN_WL, XTAL_SI_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI,
|
||||
XTAL_SI_OFF_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_EI,
|
||||
XTAL_SI_OFF_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_RFC2RF);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_WEI,
|
||||
XTAL_SI_PON_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_EI,
|
||||
XTAL_SI_PON_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SRAM2RFC);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_SRAM_CTRL, 0, XTAL_SI_SRAM_DIS);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_2, 0, XTAL_SI_LDO_LPS);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_4, 0, XTAL_SI_LPS_CAP);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_ISO_EB2CORE);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B15);
|
||||
|
||||
fsleep(1000);
|
||||
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);
|
||||
rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
|
||||
|
||||
if (!rtwdev->efuse.valid || rtwdev->efuse.power_k_valid)
|
||||
goto func_en;
|
||||
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9);
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA);
|
||||
|
||||
func_en:
|
||||
rtw89_write32_set(rtwdev, R_AX_DMAC_FUNC_EN,
|
||||
B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MPDU_PROC_EN |
|
||||
B_AX_WD_RLS_EN | B_AX_DLE_WDE_EN | B_AX_TXPKT_CTRL_EN |
|
||||
B_AX_STA_SCH_EN | B_AX_DLE_PLE_EN | B_AX_PKT_BUF_EN |
|
||||
B_AX_DMAC_TBL_EN | B_AX_PKT_IN_EN | B_AX_DLE_CPUIO_EN |
|
||||
B_AX_DISPATCHER_EN | B_AX_BBRPT_EN | B_AX_MAC_SEC_EN |
|
||||
B_AX_DMACREG_GCKEN);
|
||||
rtw89_write32_set(rtwdev, R_AX_CMAC_FUNC_EN,
|
||||
B_AX_CMAC_EN | B_AX_CMAC_TXEN | B_AX_CMAC_RXEN |
|
||||
B_AX_FORCE_CMACREG_GCKEN | B_AX_PHYINTF_EN | B_AX_CMAC_DMA_EN |
|
||||
B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN | B_AX_TMAC_EN |
|
||||
B_AX_RMAC_EN);
|
||||
|
||||
rtw89_write32_mask(rtwdev, R_AX_EECS_EESK_FUNC_SEL,
|
||||
B_AX_PINMUX_EESK_FUNC_SEL_MASK, 0x1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw8852bt_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
|
||||
XTAL_SI_RFC2RF);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S1, 0, XTAL_SI_RF10);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC,
|
||||
XTAL_SI_SRAM2RFC);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
|
||||
rtw89_write32_clr(rtwdev, R_AX_WLRF_CTRL, B_AX_AFC_AFEDIG);
|
||||
rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_GND_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC),
|
||||
1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtw8852bt_bb_reset_en(struct rtw89_dev *rtwdev, enum rtw89_band band,
|
||||
enum rtw89_phy_idx phy_idx, bool en)
|
||||
{
|
||||
if (en) {
|
||||
rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS,
|
||||
B_S0_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS,
|
||||
B_S1_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx);
|
||||
if (band == RTW89_BAND_2G)
|
||||
rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x0);
|
||||
rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0);
|
||||
} else {
|
||||
rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1);
|
||||
rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1);
|
||||
rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS,
|
||||
B_S0_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS,
|
||||
B_S1_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
|
||||
fsleep(1);
|
||||
rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, phy_idx);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_bb_reset(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB,
|
||||
B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI, 0x1);
|
||||
rtw89_phy_write32_set(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB,
|
||||
B_P1_TXPW_RSTB_MANON | B_P1_TXPW_RSTB_TSSI, 0x1);
|
||||
rtw89_phy_write32_set(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN);
|
||||
rtw8852bx_bb_reset_all(rtwdev, phy_idx);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB,
|
||||
B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI, 3);
|
||||
rtw89_phy_write32_clr(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB,
|
||||
B_P1_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI, 0x3);
|
||||
rtw89_phy_write32_clr(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN);
|
||||
}
|
||||
|
||||
static void rtw8852bt_set_channel(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_mac_idx mac_idx,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852bx_set_channel_mac(rtwdev, chan, mac_idx);
|
||||
rtw8852bx_set_channel_bb(rtwdev, chan, phy_idx);
|
||||
rtw8852bt_set_channel_rf(rtwdev, chan, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_tssi_cont_en(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
static const u32 tssi_trk[2] = {R_P0_TSSI_TRK, R_P1_TSSI_TRK};
|
||||
|
||||
if (en)
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x0);
|
||||
else
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x1);
|
||||
}
|
||||
|
||||
static void rtw8852bt_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en,
|
||||
u8 phy_idx)
|
||||
{
|
||||
if (!rtwdev->dbcc_en) {
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_A);
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_B);
|
||||
rtw8852bt_tssi_scan(rtwdev, phy_idx);
|
||||
} else {
|
||||
if (phy_idx == RTW89_PHY_0)
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_A);
|
||||
else
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_B);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_adc_en(struct rtw89_dev *rtwdev, bool en)
|
||||
{
|
||||
if (en)
|
||||
rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0);
|
||||
else
|
||||
rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0xf);
|
||||
}
|
||||
|
||||
static void rtw8852bt_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
struct rtw89_channel_help_params *p,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_mac_idx mac_idx,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
if (enter) {
|
||||
rtw89_chip_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
|
||||
rtw8852bt_tssi_cont_en_phyidx(rtwdev, false, RTW89_PHY_0);
|
||||
rtw8852bt_adc_en(rtwdev, false);
|
||||
fsleep(40);
|
||||
rtw8852bt_bb_reset_en(rtwdev, chan->band_type, phy_idx, false);
|
||||
} else {
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
|
||||
rtw8852bt_adc_en(rtwdev, true);
|
||||
rtw8852bt_tssi_cont_en_phyidx(rtwdev, true, RTW89_PHY_0);
|
||||
rtw8852bt_bb_reset_en(rtwdev, chan->band_type, phy_idx, true);
|
||||
rtw89_chip_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_init(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtwdev->is_tssi_mode[RF_PATH_A] = false;
|
||||
rtwdev->is_tssi_mode[RF_PATH_B] = false;
|
||||
|
||||
rtw8852bt_dpk_init(rtwdev);
|
||||
rtw8852bt_rck(rtwdev);
|
||||
rtw8852bt_dack(rtwdev);
|
||||
rtw8852bt_rx_dck(rtwdev, RTW89_PHY_0);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
|
||||
rtw8852bt_rx_dck(rtwdev, phy_idx);
|
||||
rtw8852bt_iqk(rtwdev, phy_idx);
|
||||
rtw8852bt_tssi(rtwdev, phy_idx, true);
|
||||
rtw8852bt_dpk(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852bt_tssi_scan(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start)
|
||||
{
|
||||
rtw8852bt_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_track(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw8852bt_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw8852bt_btc_set_rfe(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
|
||||
union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo;
|
||||
|
||||
if (ver->fcxinit == 7) {
|
||||
md->md_v7.rfe_type = rtwdev->efuse.rfe_type;
|
||||
md->md_v7.kt_ver = rtwdev->hal.cv;
|
||||
md->md_v7.kt_ver_adie = rtwdev->hal.acv;
|
||||
md->md_v7.bt_solo = 0;
|
||||
md->md_v7.bt_pos = BTC_BT_BTG;
|
||||
md->md_v7.switch_type = BTC_SWITCH_INTERNAL;
|
||||
md->md_v7.wa_type = 0;
|
||||
|
||||
md->md_v7.ant.type = BTC_ANT_SHARED;
|
||||
md->md_v7.ant.num = 2;
|
||||
md->md_v7.ant.isolation = 10;
|
||||
md->md_v7.ant.diversity = 0;
|
||||
/* WL 1-stream+1-Ant is located at 0:s0(path-A) or 1:s1(path-B) */
|
||||
md->md_v7.ant.single_pos = RF_PATH_A;
|
||||
md->md_v7.ant.btg_pos = RF_PATH_B;
|
||||
|
||||
if (md->md_v7.rfe_type == 0) {
|
||||
rtwdev->btc.dm.error.map.rfe_type0 = true;
|
||||
return;
|
||||
}
|
||||
|
||||
md->md_v7.ant.num = (md->md_v7.rfe_type % 2) ? 2 : 3;
|
||||
md->md_v7.ant.stream_cnt = 2;
|
||||
md->md_v7.wa_type |= BTC_WA_INIT_SCAN;
|
||||
|
||||
if (md->md_v7.ant.num == 2) {
|
||||
md->md_v7.ant.type = BTC_ANT_SHARED;
|
||||
md->md_v7.bt_pos = BTC_BT_BTG;
|
||||
md->md_v7.wa_type |= BTC_WA_HFP_LAG;
|
||||
} else {
|
||||
md->md_v7.ant.type = BTC_ANT_DEDICATED;
|
||||
md->md_v7.bt_pos = BTC_BT_ALONE;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rtw8852bt_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val)
|
||||
{
|
||||
u16 ctrl_all_time = u32_get_bits(txpwr_val, GENMASK(15, 0));
|
||||
u16 ctrl_gnt_bt = u32_get_bits(txpwr_val, GENMASK(31, 16));
|
||||
|
||||
switch (ctrl_all_time) {
|
||||
case 0xffff:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_EN, 0x0);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, 0x0);
|
||||
break;
|
||||
default:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_VALUE_MASK,
|
||||
ctrl_all_time);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_EN, 0x1);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (ctrl_gnt_bt) {
|
||||
case 0xffff:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_EN, 0x0);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_MASK, 0x0);
|
||||
break;
|
||||
default:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_MASK, ctrl_gnt_bt);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_EN, 0x1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
|
||||
.enable_bb_rf = rtw8852bx_mac_enable_bb_rf,
|
||||
.disable_bb_rf = rtw8852bx_mac_disable_bb_rf,
|
||||
.bb_preinit = NULL,
|
||||
.bb_postinit = NULL,
|
||||
.bb_reset = rtw8852bt_bb_reset,
|
||||
.bb_sethw = rtw8852bx_bb_sethw,
|
||||
.read_rf = rtw89_phy_read_rf_v1,
|
||||
.write_rf = rtw89_phy_write_rf_v1,
|
||||
.set_channel = rtw8852bt_set_channel,
|
||||
.set_channel_help = rtw8852bt_set_channel_help,
|
||||
.read_efuse = rtw8852bx_read_efuse,
|
||||
.read_phycap = rtw8852bx_read_phycap,
|
||||
.fem_setup = NULL,
|
||||
.rfe_gpio = NULL,
|
||||
.rfk_hw_init = NULL,
|
||||
.rfk_init = rtw8852bt_rfk_init,
|
||||
.rfk_init_late = NULL,
|
||||
.rfk_channel = rtw8852bt_rfk_channel,
|
||||
.rfk_band_changed = rtw8852bt_rfk_band_changed,
|
||||
.rfk_scan = rtw8852bt_rfk_scan,
|
||||
.rfk_track = rtw8852bt_rfk_track,
|
||||
.power_trim = rtw8852bx_power_trim,
|
||||
.set_txpwr = rtw8852bx_set_txpwr,
|
||||
.set_txpwr_ctrl = rtw8852bx_set_txpwr_ctrl,
|
||||
.init_txpwr_unit = rtw8852bx_init_txpwr_unit,
|
||||
.get_thermal = rtw8852bx_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8852bx_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8852bx_query_ppdu,
|
||||
.ctrl_nbtg_bt_tx = rtw8852bx_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = rtw8852bx_bb_cfg_txrx_path,
|
||||
.set_txpwr_ul_tb_offset = rtw8852bx_set_txpwr_ul_tb_offset,
|
||||
.pwr_on_func = rtw8852bt_pwr_on_func,
|
||||
.pwr_off_func = rtw8852bt_pwr_off_func,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc,
|
||||
.fill_txdesc = rtw89_core_fill_txdesc,
|
||||
.fill_txdesc_fwcmd = rtw89_core_fill_txdesc,
|
||||
.cfg_ctrl_path = rtw89_mac_cfg_ctrl_path,
|
||||
.mac_cfg_gnt = rtw89_mac_cfg_gnt,
|
||||
.stop_sch_tx = rtw89_mac_stop_sch_tx,
|
||||
.resume_sch_tx = rtw89_mac_resume_sch_tx,
|
||||
.h2c_dctl_sec_cam = NULL,
|
||||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
||||
.btc_set_rfe = rtw8852bt_btc_set_rfe,
|
||||
.btc_init_cfg = rtw8852bx_btc_init_cfg,
|
||||
.btc_set_wl_pri = rtw8852bx_btc_set_wl_pri,
|
||||
.btc_set_wl_txpwr_ctrl = rtw8852bt_btc_set_wl_txpwr_ctrl,
|
||||
.btc_get_bt_rssi = rtw8852bx_btc_get_bt_rssi,
|
||||
.btc_update_bt_cnt = rtw8852bx_btc_update_bt_cnt,
|
||||
.btc_wl_s1_standby = rtw8852bx_btc_wl_s1_standby,
|
||||
.btc_set_wl_rx_gain = rtw8852bx_btc_set_wl_rx_gain,
|
||||
.btc_set_policy = rtw89_btc_set_policy_v1,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support rtw_wowlan_stub_8852bt = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
|
||||
.n_patterns = RTW89_MAX_PATTERN_NUM,
|
||||
.pattern_max_len = RTW89_MAX_PATTERN_SIZE,
|
||||
.pattern_min_len = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
const struct rtw89_chip_info rtw8852bt_chip_info = {
|
||||
.chip_id = RTL8852BT,
|
||||
.chip_gen = RTW89_CHIP_AX,
|
||||
.ops = &rtw8852bt_chip_ops,
|
||||
.mac_def = &rtw89_mac_gen_ax,
|
||||
.phy_def = &rtw89_phy_gen_ax,
|
||||
.fw_basename = RTW8852BT_FW_BASENAME,
|
||||
.fw_format_max = RTW8852BT_FW_FORMAT_MAX,
|
||||
.try_ce_fw = true,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ,
|
||||
.fifo_size = 458752,
|
||||
.small_fifo_size = true,
|
||||
.dle_scc_rsvd_size = 98304,
|
||||
.max_amsdu_limit = 5000,
|
||||
.dis_2g_40m_ul_ofdma = true,
|
||||
.rsvd_ple_ofst = 0x6f800,
|
||||
.hfc_param_ini = rtw8852bt_hfc_param_ini_pcie,
|
||||
.dle_mem = rtw8852bt_dle_mem_pcie,
|
||||
.wde_qempty_acq_grpnum = 4,
|
||||
.wde_qempty_mgq_grpsel = 4,
|
||||
.rf_base_addr = {0xe000, 0xf000},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.bb_table = NULL,
|
||||
.bb_gain_table = NULL,
|
||||
.rf_table = {},
|
||||
.nctl_table = NULL,
|
||||
.nctl_post_table = NULL,
|
||||
.dflt_parms = NULL,
|
||||
.rfe_parms_conf = NULL,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = NULL,
|
||||
.dig_regs = &rtw8852bt_dig_regs,
|
||||
.tssi_dbw_table = NULL,
|
||||
.support_macid_num = RTW89_MAX_MAC_ID_NUM,
|
||||
.support_chanctx_num = 1,
|
||||
.support_rnr = false,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
BIT(NL80211_BAND_5GHZ),
|
||||
.support_bandwidths = BIT(NL80211_CHAN_WIDTH_20) |
|
||||
BIT(NL80211_CHAN_WIDTH_40) |
|
||||
BIT(NL80211_CHAN_WIDTH_80),
|
||||
.support_unii4 = true,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
.acam_num = 128,
|
||||
.bcam_num = 10,
|
||||
.scam_num = 128,
|
||||
.bacam_num = 2,
|
||||
.bacam_dynamic_num = 4,
|
||||
.bacam_ver = RTW89_BACAM_V0,
|
||||
.ppdu_max_usr = 4,
|
||||
.sec_ctrl_efuse_size = 4,
|
||||
.physical_efuse_size = 1216,
|
||||
.logical_efuse_size = 2048,
|
||||
.limit_efuse_size = 1280,
|
||||
.dav_phy_efuse_size = 96,
|
||||
.dav_log_efuse_size = 16,
|
||||
.efuse_blocks = NULL,
|
||||
.phycap_addr = 0x580,
|
||||
.phycap_size = 128,
|
||||
.para_ver = 0,
|
||||
.wlcx_desired = 0x070e0000,
|
||||
.btcx_desired = 0x7,
|
||||
.scbd = 0x1,
|
||||
.mailbox = 0x1,
|
||||
|
||||
.afh_guard_ch = 6,
|
||||
.wl_rssi_thres = rtw89_btc_8852bt_wl_rssi_thres,
|
||||
.bt_rssi_thres = rtw89_btc_8852bt_bt_rssi_thres,
|
||||
.rssi_tol = 2,
|
||||
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8852bt_mon_reg),
|
||||
.mon_reg = rtw89_btc_8852bt_mon_reg,
|
||||
.rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852bt_rf_ul),
|
||||
.rf_para_ulink = rtw89_btc_8852bt_rf_ul,
|
||||
.rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852bt_rf_dl),
|
||||
.rf_para_dlink = rtw89_btc_8852bt_rf_dl,
|
||||
.ps_mode_supported = BIT(RTW89_PS_MODE_RFOFF) |
|
||||
BIT(RTW89_PS_MODE_CLK_GATED) |
|
||||
BIT(RTW89_PS_MODE_PWR_GATED),
|
||||
.low_power_hci_modes = 0,
|
||||
.h2c_cctl_func_id = H2C_FUNC_MAC_CCTLINFO_UD,
|
||||
.hci_func_en_addr = R_AX_HCI_FUNC_EN,
|
||||
.h2c_desc_size = sizeof(struct rtw89_txwd_body),
|
||||
.txwd_body_size = sizeof(struct rtw89_txwd_body),
|
||||
.txwd_info_size = sizeof(struct rtw89_txwd_info),
|
||||
.h2c_ctrl_reg = R_AX_H2CREG_CTRL,
|
||||
.h2c_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_H2C_DEQ_CNT_MASK >> 8},
|
||||
.h2c_regs = rtw8852bt_h2c_regs,
|
||||
.c2h_ctrl_reg = R_AX_C2HREG_CTRL,
|
||||
.c2h_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8},
|
||||
.c2h_regs = rtw8852bt_c2h_regs,
|
||||
.page_regs = &rtw8852bt_page_regs,
|
||||
.wow_reason_reg = rtw8852bt_wow_wakeup_regs,
|
||||
.cfo_src_fd = true,
|
||||
.cfo_hw_comp = true,
|
||||
.dcfo_comp = &rtw8852bt_dcfo_comp,
|
||||
.dcfo_comp_sft = 10,
|
||||
.imr_info = &rtw8852bt_imr_info,
|
||||
.imr_dmac_table = NULL,
|
||||
.imr_cmac_table = NULL,
|
||||
.rrsr_cfgs = &rtw8852bt_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP_V1, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V1,
|
||||
.rfkill_init = &rtw8852bt_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
|
||||
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
|
||||
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
|
||||
.edcca_regs = &rtw8852bt_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
.wowlan_stub = &rtw_wowlan_stub_8852bt,
|
||||
#endif
|
||||
.xtal_info = NULL,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852bt_chip_info);
|
||||
|
||||
MODULE_FIRMWARE(RTW8852BT_MODULE_FIRMWARE);
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852BT driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
@@ -10,4 +10,6 @@
|
||||
#define RF_PATH_NUM_8852BT 2
|
||||
#define BB_PATH_NUM_8852BT 2
|
||||
|
||||
extern const struct rtw89_chip_info rtw8852bt_chip_info;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1527,7 +1527,7 @@ static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 get_empty_table = false;
|
||||
u32 reg_rf18;
|
||||
@@ -1760,7 +1760,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852BT_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@@ -1824,7 +1824,7 @@ static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool o
|
||||
BIT(24), val);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,
|
||||
kidx, dpk->is_dpk_enable & off_reverse ? "enable" : "disable");
|
||||
kidx, str_enable_disable(dpk->is_dpk_enable & off_reverse));
|
||||
}
|
||||
|
||||
static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
@@ -1863,7 +1863,7 @@ static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
id == 0x14 ? "PWR_CAL" :
|
||||
id == 0x15 ? "DPK_RXAGC" :
|
||||
id == 0x16 ? "KIP_PRESET" :
|
||||
id == 0x17 ? "KIP_RESOTRE" :
|
||||
id == 0x17 ? "KIP_RESTORE" :
|
||||
"DPK_TXAGC", dpk_cmd);
|
||||
}
|
||||
|
||||
@@ -1881,7 +1881,7 @@ static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@@ -2279,7 +2279,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
|
||||
bool loss_only)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 goout = 0, agc_cnt = 0, limited_rxbb = 0, gl_cnt = 0;
|
||||
u8 tmp_txagc, tmp_rxbb, tmp_gl_idx = 0;
|
||||
@@ -2506,7 +2506,7 @@ static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
bool is_reload = false;
|
||||
@@ -2648,7 +2648,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev,
|
||||
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
|
||||
if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
|
||||
@@ -2819,7 +2819,7 @@ static void _tssi_dpk_off(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (band == RTW89_BAND_2G)
|
||||
@@ -2831,7 +2831,7 @@ static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852bt_tssi_sys_defs_tbl);
|
||||
@@ -2893,7 +2893,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
})
|
||||
struct rtw89_fw_txpwr_track_cfg *trk = rtwdev->fw.elm_info.txpwr_trk;
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@@ -3049,7 +3049,7 @@ static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A)
|
||||
@@ -3065,7 +3065,7 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool all)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
const struct rtw89_rfk_tbl *tbl = NULL;
|
||||
u8 ch = chan->channel;
|
||||
@@ -3313,7 +3313,7 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
s8 de_1st;
|
||||
@@ -3349,7 +3349,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
s8 tde_1st;
|
||||
@@ -3386,7 +3386,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@@ -3466,7 +3466,7 @@ static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
|
||||
@@ -3655,7 +3655,7 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static const s16 power_2g[4] = {48, 20, 4, -8};
|
||||
static const s16 power_5g[4] = {48, 20, 4, 4};
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
|
||||
u32 tssi_cw_rpt[RTW8852BT_TSSI_PATH_NR] = {};
|
||||
u8 channel = chan->channel;
|
||||
@@ -3835,7 +3835,7 @@ void rtw8852bt_rck(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852bt_dack(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
@@ -3844,7 +3844,7 @@ void rtw8852bt_dack(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@@ -3860,7 +3860,7 @@ void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
@@ -3892,7 +3892,7 @@ void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev)
|
||||
void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
|
||||
{
|
||||
static const u32 reg[2] = {R_DPD_CH0A, R_DPD_CH0B};
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB, RTW89_CHANCTX_0);
|
||||
u32 reg_backup[2] = {};
|
||||
u32 tx_en;
|
||||
u8 i;
|
||||
@@ -3934,7 +3934,7 @@ void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_
|
||||
|
||||
void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
@@ -3974,7 +3974,7 @@ void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void rtw8852bt_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, bool enable)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 channel = chan->channel;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",
|
||||
@@ -4017,3 +4017,229 @@ void rtw8852bt_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
else
|
||||
rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, false);
|
||||
}
|
||||
|
||||
static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
enum rtw89_bandwidth bw, bool dav)
|
||||
{
|
||||
u32 rf_reg18;
|
||||
u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
|
||||
|
||||
rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
|
||||
if (rf_reg18 == INV_RF_DATA) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[RFK]Invalid RF_0x18 for Path-%d\n", path);
|
||||
return;
|
||||
}
|
||||
rf_reg18 &= ~RR_CFGCH_BW;
|
||||
|
||||
switch (bw) {
|
||||
case RTW89_CHANNEL_WIDTH_5:
|
||||
case RTW89_CHANNEL_WIDTH_10:
|
||||
case RTW89_CHANNEL_WIDTH_20:
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M);
|
||||
break;
|
||||
case RTW89_CHANNEL_WIDTH_40:
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M);
|
||||
break;
|
||||
case RTW89_CHANNEL_WIDTH_80:
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M);
|
||||
break;
|
||||
default:
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n");
|
||||
}
|
||||
|
||||
rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
|
||||
RR_CFGCH_BW2) & RFREG_MASK;
|
||||
rf_reg18 |= RR_CFGCH_BW2;
|
||||
rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n",
|
||||
bw, path, reg18_addr,
|
||||
rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
|
||||
}
|
||||
|
||||
static void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_bandwidth bw)
|
||||
{
|
||||
_bw_setting(rtwdev, RF_PATH_A, bw, true);
|
||||
_bw_setting(rtwdev, RF_PATH_B, bw, true);
|
||||
_bw_setting(rtwdev, RF_PATH_A, bw, false);
|
||||
_bw_setting(rtwdev, RF_PATH_B, bw, false);
|
||||
}
|
||||
|
||||
static bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val)
|
||||
{
|
||||
u32 tmp;
|
||||
int ret;
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val);
|
||||
|
||||
ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000,
|
||||
false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY);
|
||||
if (ret)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n");
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
|
||||
return !!ret;
|
||||
}
|
||||
|
||||
static void _lck_check(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n");
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0);
|
||||
}
|
||||
|
||||
udelay(10);
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n");
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
|
||||
_set_s0_arfc18(rtwdev, tmp);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
|
||||
}
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n");
|
||||
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp);
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp);
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0);
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
|
||||
_set_s0_arfc18(rtwdev, tmp);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n",
|
||||
rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK),
|
||||
rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK));
|
||||
}
|
||||
}
|
||||
|
||||
static void _set_ch(struct rtw89_dev *rtwdev, u32 val)
|
||||
{
|
||||
bool timeout;
|
||||
u32 bak;
|
||||
|
||||
bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1);
|
||||
timeout = _set_s0_arfc18(rtwdev, val);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak);
|
||||
if (!timeout)
|
||||
_lck_check(rtwdev);
|
||||
}
|
||||
|
||||
static void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
u8 central_ch, bool dav)
|
||||
{
|
||||
u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
|
||||
bool is_2g_ch = central_ch <= 14;
|
||||
u32 rf_reg18;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
|
||||
|
||||
rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
|
||||
rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH |
|
||||
RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH);
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch);
|
||||
|
||||
if (!is_2g_ch)
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) |
|
||||
FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G);
|
||||
|
||||
rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
|
||||
RR_CFGCH_BW2) & RFREG_MASK;
|
||||
rf_reg18 |= RR_CFGCH_BW2;
|
||||
|
||||
if (path == RF_PATH_A && dav)
|
||||
_set_ch(rtwdev, rf_reg18);
|
||||
else
|
||||
rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
|
||||
|
||||
rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0);
|
||||
rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n",
|
||||
central_ch, path, reg18_addr,
|
||||
rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
|
||||
}
|
||||
|
||||
static void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch)
|
||||
{
|
||||
_ch_setting(rtwdev, RF_PATH_A, central_ch, true);
|
||||
_ch_setting(rtwdev, RF_PATH_B, central_ch, true);
|
||||
_ch_setting(rtwdev, RF_PATH_A, central_ch, false);
|
||||
_ch_setting(rtwdev, RF_PATH_B, central_ch, false);
|
||||
}
|
||||
|
||||
static void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1);
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12);
|
||||
|
||||
if (bw == RTW89_CHANNEL_WIDTH_20)
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b);
|
||||
else if (bw == RTW89_CHANNEL_WIDTH_40)
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13);
|
||||
else if (bw == RTW89_CHANNEL_WIDTH_80)
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb);
|
||||
else
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n",
|
||||
path, rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB));
|
||||
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0);
|
||||
}
|
||||
|
||||
static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_bandwidth bw)
|
||||
{
|
||||
u8 kpath, path;
|
||||
|
||||
kpath = _kpath(rtwdev, phy);
|
||||
|
||||
for (path = 0; path < RF_PATH_NUM_8852BT; path++) {
|
||||
if (!(kpath & BIT(path)))
|
||||
continue;
|
||||
|
||||
_set_rxbb_bw(rtwdev, bw, path);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_ctrl_bw_ch(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 central_ch,
|
||||
enum rtw89_band band, enum rtw89_bandwidth bw)
|
||||
{
|
||||
_ctrl_ch(rtwdev, central_ch);
|
||||
_ctrl_bw(rtwdev, phy, bw);
|
||||
_rxbb_bw(rtwdev, phy, bw);
|
||||
}
|
||||
|
||||
void rtw8852bt_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852bt_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type,
|
||||
chan->band_width);
|
||||
}
|
||||
|
||||
@@ -18,5 +18,8 @@ void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_
|
||||
void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852bt_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852bt_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
|
||||
#endif
|
||||
|
||||
93
drivers/net/wireless/realtek/rtw89/rtw8852bte.c
Normal file
93
drivers/net/wireless/realtek/rtw89/rtw8852bte.c
Normal file
@@ -0,0 +1,93 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/* Copyright(c) 2024 Realtek Corporation
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "pci.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852bt.h"
|
||||
|
||||
static const struct rtw89_pci_info rtw8852bt_pci_info = {
|
||||
.gen_def = &rtw89_pci_gen_ax,
|
||||
.txbd_trunc_mode = MAC_AX_BD_TRUNC,
|
||||
.rxbd_trunc_mode = MAC_AX_BD_TRUNC,
|
||||
.rxbd_mode = MAC_AX_RXBD_PKT,
|
||||
.tag_mode = MAC_AX_TAG_MULTI,
|
||||
.tx_burst = MAC_AX_TX_BURST_2048B,
|
||||
.rx_burst = MAC_AX_RX_BURST_128B,
|
||||
.wd_dma_idle_intvl = MAC_AX_WD_DMA_INTVL_256NS,
|
||||
.wd_dma_act_intvl = MAC_AX_WD_DMA_INTVL_256NS,
|
||||
.multi_tag_num = MAC_AX_TAG_NUM_8,
|
||||
.lbc_en = MAC_AX_PCIE_ENABLE,
|
||||
.lbc_tmr = MAC_AX_LBC_TMR_2MS,
|
||||
.autok_en = MAC_AX_PCIE_DISABLE,
|
||||
.io_rcy_en = MAC_AX_PCIE_DISABLE,
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS,
|
||||
.rx_ring_eq_is_full = false,
|
||||
.check_rx_tag = false,
|
||||
|
||||
.init_cfg_reg = R_AX_PCIE_INIT_CFG1,
|
||||
.txhci_en_bit = B_AX_TXHCI_EN,
|
||||
.rxhci_en_bit = B_AX_RXHCI_EN,
|
||||
.rxbd_mode_bit = B_AX_RXBD_MODE,
|
||||
.exp_ctrl_reg = R_AX_PCIE_EXP_CTRL,
|
||||
.max_tag_num_mask = B_AX_MAX_TAG_NUM,
|
||||
.rxbd_rwptr_clr_reg = R_AX_RXBD_RWPTR_CLR,
|
||||
.txbd_rwptr_clr2_reg = 0,
|
||||
.dma_io_stop = {R_AX_PCIE_DMA_STOP1, B_AX_STOP_PCIEIO},
|
||||
.dma_stop1 = {R_AX_PCIE_DMA_STOP1, B_AX_TX_STOP1_MASK_V1},
|
||||
.dma_stop2 = {0},
|
||||
.dma_busy1 = {R_AX_PCIE_DMA_BUSY1, DMA_BUSY1_CHECK_V1},
|
||||
.dma_busy2_reg = 0,
|
||||
.dma_busy3_reg = R_AX_PCIE_DMA_BUSY1,
|
||||
|
||||
.rpwm_addr = R_AX_PCIE_HRPWM,
|
||||
.cpwm_addr = R_AX_CPWM,
|
||||
.mit_addr = R_AX_INT_MIT_RX,
|
||||
.wp_sel_addr = 0,
|
||||
.tx_dma_ch_mask = BIT(RTW89_TXCH_ACH4) | BIT(RTW89_TXCH_ACH5) |
|
||||
BIT(RTW89_TXCH_ACH6) | BIT(RTW89_TXCH_ACH7) |
|
||||
BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11),
|
||||
.bd_idx_addr_low_power = NULL,
|
||||
.dma_addr_set = &rtw89_pci_ch_dma_addr_set,
|
||||
.bd_ram_table = &rtw89_bd_ram_table_single,
|
||||
|
||||
.ltr_set = rtw89_pci_ltr_set,
|
||||
.fill_txaddr_info = rtw89_pci_fill_txaddr_info,
|
||||
.config_intr_mask = rtw89_pci_config_intr_mask,
|
||||
.enable_intr = rtw89_pci_enable_intr,
|
||||
.disable_intr = rtw89_pci_disable_intr,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852bte_info = {
|
||||
.chip = &rtw8852bt_chip_info,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8852bt_pci_info,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct pci_device_id rtw89_8852bte_id_table[] = {
|
||||
{
|
||||
PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb520),
|
||||
.driver_data = (kernel_ulong_t)&rtw89_8852bte_info,
|
||||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, rtw89_8852bte_id_table);
|
||||
|
||||
static struct pci_driver rtw89_8852bte_driver = {
|
||||
.name = "rtw89_8852bte",
|
||||
.id_table = rtw89_8852bte_id_table,
|
||||
.probe = rtw89_pci_probe,
|
||||
.remove = rtw89_pci_remove,
|
||||
.driver.pm = &rtw89_pm_ops,
|
||||
};
|
||||
module_pci_driver(rtw89_8852bte_driver);
|
||||
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852BE-VT driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
@@ -14,10 +14,10 @@
|
||||
#include "rtw8852c_table.h"
|
||||
#include "util.h"
|
||||
|
||||
#define RTW8852C_FW_FORMAT_MAX 0
|
||||
#define RTW8852C_FW_FORMAT_MAX 1
|
||||
#define RTW8852C_FW_BASENAME "rtw89/rtw8852c_fw"
|
||||
#define RTW8852C_MODULE_FIRMWARE \
|
||||
RTW8852C_FW_BASENAME ".bin"
|
||||
RTW8852C_FW_BASENAME "-" __stringify(RTW8852C_FW_FORMAT_MAX) ".bin"
|
||||
|
||||
static const struct rtw89_hfc_ch_cfg rtw8852c_hfc_chcfg_pcie[] = {
|
||||
{13, 1614, grp_0}, /* ACH 0 */
|
||||
@@ -147,6 +147,15 @@ static const struct rtw89_rrsr_cfgs rtw8852c_rrsr_cfgs = {
|
||||
.rsc = {R_AX_PTCL_RRSR1, B_AX_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852c_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852c_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@@ -1837,9 +1846,9 @@ static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtw8852c_rx_dck(rtwdev, RTW89_PHY_0, false);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
|
||||
rtw8852c_mcc_get_ch_info(rtwdev, phy_idx);
|
||||
rtw8852c_rx_dck(rtwdev, phy_idx, false);
|
||||
@@ -1855,9 +1864,10 @@ static void rtw8852c_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
rtw8852c_tssi_scan(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8852c_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start)
|
||||
{
|
||||
rtw8852c_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8852c_wifi_scan_notify(rtwdev, start, rtwvif->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@@ -2108,7 +2118,7 @@ rtw8852c_init_txpwr_unit(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
static void rtw8852c_bb_cfg_rx_path(struct rtw89_dev *rtwdev, u8 rx_path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 band = chan->band_type;
|
||||
u32 rst_mask0 = B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI;
|
||||
u32 rst_mask1 = B_P1_TXPW_RSTB_MANON | B_P1_TXPW_RSTB_TSSI;
|
||||
@@ -2840,10 +2850,12 @@ static const struct rtw89_chanctx_listener rtw8852c_chanctx_listener = {
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support rtw_wowlan_stub_8852c = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_NET_DETECT,
|
||||
.n_patterns = RTW89_MAX_PATTERN_NUM,
|
||||
.pattern_max_len = RTW89_MAX_PATTERN_SIZE,
|
||||
.pattern_min_len = 1,
|
||||
.max_nd_match_sets = RTW89_SCANOFLD_MAX_SSID,
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -2959,6 +2971,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = true,
|
||||
.hw_sec_hdr = true,
|
||||
.hw_mgmt_tx_encrypt = true,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@@ -3022,6 +3035,8 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.rrsr_cfgs = &rtw8852c_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP,
|
||||
.rfkill_init = &rtw8852c_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = 0,
|
||||
.edcca_regs = &rtw8852c_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -588,7 +588,7 @@ static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
|
||||
{
|
||||
struct rtw89_dack_info *dack = &rtwdev->dack;
|
||||
u32 rf0_0, rf1_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB, RTW89_CHANCTX_0);
|
||||
|
||||
dack->dack_done = false;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n");
|
||||
@@ -1323,7 +1323,7 @@ static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
|
||||
@@ -1521,7 +1521,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852C_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@@ -1903,7 +1903,7 @@ static void _dpk_information(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@@ -2497,7 +2497,7 @@ static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
bool is_reload = false;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
@@ -2758,7 +2758,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 band = chan->band_type;
|
||||
|
||||
if (rtwdev->hal.cv == CHIP_CAV && band != RTW89_BAND_2G) {
|
||||
@@ -2893,7 +2893,7 @@ static void _dpk_track(struct rtw89_dev *rtwdev)
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_bandwidth bw = chan->band_width;
|
||||
enum rtw89_band band = chan->band_type;
|
||||
u32 clk = 0x0;
|
||||
@@ -2947,7 +2947,7 @@ static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,
|
||||
static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A) {
|
||||
@@ -2986,7 +2986,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@@ -3160,7 +3160,7 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A) {
|
||||
@@ -3177,7 +3177,7 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
static void _tssi_set_aligk_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
const struct rtw89_rfk_tbl *tbl;
|
||||
|
||||
@@ -3589,7 +3589,7 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
@@ -3653,7 +3653,7 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
@@ -3718,7 +3718,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@@ -4079,10 +4079,10 @@ void rtw8852c_mcc_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_i
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
chan_idx = RTW89_SUB_ENTITY_1;
|
||||
chan_idx = RTW89_CHANCTX_1;
|
||||
break;
|
||||
default:
|
||||
chan_idx = RTW89_SUB_ENTITY_0;
|
||||
chan_idx = RTW89_CHANCTX_0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -4114,7 +4114,7 @@ void rtw8852c_rck(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw8852c_dack(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
@@ -4124,7 +4124,7 @@ void rtw8852c_dack(struct rtw89_dev *rtwdev)
|
||||
void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
@@ -4202,10 +4202,10 @@ void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_a
|
||||
|
||||
void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck;
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
u8 dck_channel;
|
||||
u8 cur_thermal;
|
||||
u32 tx_en;
|
||||
@@ -4262,7 +4262,7 @@ void rtw8852c_dpk_init(struct rtw89_dev *rtwdev)
|
||||
void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
#include "rtw8922a_rfk.h"
|
||||
#include "util.h"
|
||||
|
||||
#define RTW8922A_FW_FORMAT_MAX 0
|
||||
#define RTW8922A_FW_FORMAT_MAX 1
|
||||
#define RTW8922A_FW_BASENAME "rtw89/rtw8922a_fw"
|
||||
#define RTW8922A_MODULE_FIRMWARE \
|
||||
RTW8922A_FW_BASENAME ".bin"
|
||||
RTW8922A_FW_BASENAME "-" __stringify(RTW8922A_FW_FORMAT_MAX) ".bin"
|
||||
|
||||
#define HE_N_USER_MAX_8922A 4
|
||||
|
||||
@@ -165,6 +165,15 @@ static const struct rtw89_rrsr_cfgs rtw8922a_rrsr_cfgs = {
|
||||
.rsc = {R_BE_PTCL_RRSR1, B_BE_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8922a_rfkill_regs = {
|
||||
.pinmux = {R_BE_GPIO8_15_FUNC_SEL,
|
||||
B_BE_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_BE_GPIO_EXT_CTRL + 2,
|
||||
(B_BE_GPIO_MOD_9 | B_BE_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8922a_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V2,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@@ -1682,7 +1691,7 @@ static int rtw8922a_ctrl_rx_path_tmac(struct rtw89_dev *rtwdev,
|
||||
|
||||
static int rtw8922a_ctrl_mlo(struct rtw89_dev *rtwdev, enum rtw89_mlo_dbcc_mode mode)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
if (mode == MLO_1_PLUS_1_1RF || mode == DBCC_LEGACY) {
|
||||
rtw89_phy_write32_mask(rtwdev, R_DBCC, B_DBCC_EN, 0x1);
|
||||
@@ -1953,10 +1962,10 @@ static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
enum rtw89_phy_idx phy_idx = rtwvif->phy_idx;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, RTW89_CHANCTX_0);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_CHLK, BTC_WRFK_START);
|
||||
@@ -1980,7 +1989,8 @@ static void rtw8922a_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_rfk_tssi_and_wait(rtwdev, phy_idx, RTW89_TSSI_SCAN, 6);
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8922a_rfk_scan(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool start)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -2109,7 +2119,7 @@ static void rtw8922a_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
|
||||
|
||||
static void rtw8922a_bb_cfg_txrx_path(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
u8 ntx_path = RF_PATH_AB;
|
||||
@@ -2562,6 +2572,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = true,
|
||||
.hw_mgmt_tx_encrypt = true,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@@ -2624,6 +2635,8 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
.rrsr_cfgs = &rtw8922a_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_VLD_V2, B_BSS_CLR_VLD0_V2},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V2,
|
||||
.rfkill_init = &rtw8922a_rfkill_regs,
|
||||
.rfkill_get = {R_BE_GPIO_EXT_CTRL, B_BE_GPIO_IN_9},
|
||||
.dma_ch_mask = 0,
|
||||
.edcca_regs = &rtw8922a_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -256,7 +256,7 @@ static void rtw8922a_chlk_reload(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
|
||||
struct rtw89_rfk_chan_desc desc[__RTW89_RFK_CHS_NR_V1] = {};
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
enum rtw89_chanctx_idx chanctx_idx;
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_entity_mode mode;
|
||||
u8 s0_tbl, s1_tbl;
|
||||
@@ -265,14 +265,14 @@ static void rtw8922a_chlk_reload(struct rtw89_dev *rtwdev)
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_1;
|
||||
chanctx_idx = RTW89_CHANCTX_1;
|
||||
break;
|
||||
default:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
chanctx_idx = RTW89_CHANCTX_0;
|
||||
break;
|
||||
}
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, sub_entity_idx);
|
||||
chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
|
||||
for (tbl_sel = 0; tbl_sel < ARRAY_SIZE(desc); tbl_sel++) {
|
||||
struct rtw89_rfk_chan_desc *p = &desc[tbl_sel];
|
||||
|
||||
@@ -366,7 +366,7 @@ static void rtw89_tas_state_update(struct rtw89_dev *rtwdev)
|
||||
if (src == RTW89_SAR_SOURCE_NONE)
|
||||
return;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
ret = sar_hdl->query_sar_config(rtwdev, chan->freq, &cfg);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#define DATA_RATE_HT_IDX_MASK GENMASK(4, 0)
|
||||
#define DATA_RATE_HT_IDX_MASK_V1 GENMASK(4, 0)
|
||||
#define DATA_RATE_MODE_HT 0x1
|
||||
#define DATA_RATE_HT_NSS_MASK GENMASK(4, 3)
|
||||
#define DATA_RATE_VHT_HE_NSS_MASK GENMASK(6, 4)
|
||||
#define DATA_RATE_VHT_HE_IDX_MASK GENMASK(3, 0)
|
||||
#define DATA_RATE_NSS_MASK_V1 GENMASK(7, 5)
|
||||
@@ -51,6 +52,11 @@ static inline u8 rtw89_get_data_mcs(struct rtw89_dev *rtwdev, u16 hw_rate)
|
||||
return u16_get_bits(hw_rate, DATA_RATE_VHT_HE_IDX_MASK);
|
||||
}
|
||||
|
||||
static inline u8 rtw89_get_data_ht_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
|
||||
{
|
||||
return u16_get_bits(hw_rate, DATA_RATE_HT_NSS_MASK);
|
||||
}
|
||||
|
||||
static inline u8 rtw89_get_data_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
|
||||
{
|
||||
if (rtwdev->chip->chip_gen == RTW89_CHIP_BE)
|
||||
@@ -408,7 +414,7 @@ struct rtw89_rxinfo_user {
|
||||
#define RTW89_RXINFO_USER_DATA BIT(1)
|
||||
#define RTW89_RXINFO_USER_CTRL BIT(2)
|
||||
#define RTW89_RXINFO_USER_MGMT BIT(3)
|
||||
#define RTW89_RXINFO_USER_BCM BIT(4)
|
||||
#define RTW89_RXINFO_USER_BCN BIT(4)
|
||||
#define RTW89_RXINFO_USER_MACID GENMASK(15, 8)
|
||||
|
||||
struct rtw89_rxinfo {
|
||||
|
||||
@@ -16,6 +16,24 @@
|
||||
#define rtw89_for_each_rtwvif(rtwdev, rtwvif) \
|
||||
list_for_each_entry(rtwvif, &(rtwdev)->rtwvifs_list, list)
|
||||
|
||||
/* Before adding rtwvif to list, we need to check if it already exist, beacase
|
||||
* in some case such as SER L2 happen during WoWLAN flow, calling reconfig
|
||||
* twice cause the list to be added twice.
|
||||
*/
|
||||
static inline bool rtw89_rtwvif_in_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *new)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
if (rtwvif == new)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* The result of negative dividend and positive divisor is undefined, but it
|
||||
* should be one case of round-down or round-up. So, make it round-down if the
|
||||
* result is round-up.
|
||||
|
||||
@@ -687,17 +687,30 @@ static void rtw89_wow_enter_deep_ps(struct rtw89_dev *rtwdev)
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif);
|
||||
}
|
||||
|
||||
static void rtw89_wow_enter_lps(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_wow_enter_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
|
||||
rtw89_enter_lps(rtwdev, rtwvif, false);
|
||||
if (rtw89_wow_mgd_linked(rtwdev))
|
||||
rtw89_enter_lps(rtwdev, rtwvif, false);
|
||||
else if (rtw89_wow_no_link(rtwdev))
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif, true);
|
||||
}
|
||||
|
||||
static void rtw89_wow_leave_lps(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_wow_leave_ps(struct rtw89_dev *rtwdev, bool enable_wow)
|
||||
{
|
||||
rtw89_leave_lps(rtwdev);
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
|
||||
if (rtw89_wow_mgd_linked(rtwdev)) {
|
||||
rtw89_leave_lps(rtwdev);
|
||||
} else if (rtw89_wow_no_link(rtwdev)) {
|
||||
if (enable_wow)
|
||||
rtw89_leave_ips(rtwdev);
|
||||
else
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif, false);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw89_wow_config_mac(struct rtw89_dev *rtwdev, bool enable_wow)
|
||||
@@ -781,17 +794,22 @@ static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvi
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
|
||||
/* Current wowlan function support setting of only one STATION vif.
|
||||
* So when one suitable vif is found, stop the iteration.
|
||||
/* Current WoWLAN function support setting of only vif in
|
||||
* infra mode or no link mode. When one suitable vif is found,
|
||||
* stop the iteration.
|
||||
*/
|
||||
if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
switch (rtwvif->net_type) {
|
||||
case RTW89_NET_TYPE_INFRA:
|
||||
rtw_wow->wow_vif = vif;
|
||||
if (rtw_wow_has_mgd_features(rtwdev))
|
||||
rtw_wow->wow_vif = vif;
|
||||
break;
|
||||
case RTW89_NET_TYPE_NO_LINK:
|
||||
if (rtw_wow->pno_inited)
|
||||
rtw_wow->wow_vif = vif;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1025,6 +1043,23 @@ static void rtw89_wow_clear_wakeups(struct rtw89_dev *rtwdev)
|
||||
rtw_wow->wow_vif = NULL;
|
||||
rtw89_core_release_all_bits_map(rtw_wow->flags, RTW89_WOW_FLAG_NUM);
|
||||
rtw_wow->pattern_cnt = 0;
|
||||
rtw_wow->pno_inited = false;
|
||||
}
|
||||
|
||||
static void rtw89_wow_init_pno(struct rtw89_dev *rtwdev,
|
||||
struct cfg80211_sched_scan_request *nd_config)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
|
||||
if (!nd_config->n_match_sets || !nd_config->n_channels)
|
||||
return;
|
||||
|
||||
rtw_wow->nd_config = nd_config;
|
||||
rtw_wow->pno_inited = true;
|
||||
|
||||
INIT_LIST_HEAD(&rtw_wow->pno_pkt_list);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: net-detect is enabled\n");
|
||||
}
|
||||
|
||||
static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
|
||||
@@ -1037,6 +1072,11 @@ static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
|
||||
set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags);
|
||||
if (wowlan->magic_pkt)
|
||||
set_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags);
|
||||
if (wowlan->n_patterns && wowlan->patterns)
|
||||
set_bit(RTW89_WOW_FLAG_EN_PATTERN, rtw_wow->flags);
|
||||
|
||||
if (wowlan->nd_config)
|
||||
rtw89_wow_init_pno(rtwdev, wowlan->nd_config);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_wow_vif_iter(rtwdev, rtwvif);
|
||||
@@ -1048,6 +1088,34 @@ static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
|
||||
return rtw89_wow_parse_patterns(rtwdev, rtwvif, wowlan);
|
||||
}
|
||||
|
||||
static int rtw89_wow_cfg_wake_pno(struct rtw89_dev *rtwdev, bool wow)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to config pno\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow global\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
@@ -1308,100 +1376,238 @@ static int rtw89_wow_disable_trx_post(struct rtw89_dev *rtwdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rtw89_fw_release_pno_pkt_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct list_head *pkt_list = &rtw_wow->pno_pkt_list;
|
||||
struct rtw89_pktofld_info *info, *tmp;
|
||||
|
||||
list_for_each_entry_safe(info, tmp, pkt_list, list) {
|
||||
rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id);
|
||||
list_del(&info->list);
|
||||
kfree(info);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;
|
||||
u8 num = nd_config->n_match_sets, i;
|
||||
struct rtw89_pktofld_info *info;
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
skb = ieee80211_probereq_get(rtwdev->hw, rtwvif->mac_addr,
|
||||
nd_config->match_sets[i].ssid.ssid,
|
||||
nd_config->match_sets[i].ssid.ssid_len,
|
||||
nd_config->ie_len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_put_data(skb, nd_config->ie, nd_config->ie_len);
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
kfree_skb(skb);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb);
|
||||
if (ret) {
|
||||
kfree_skb(skb);
|
||||
kfree(info);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif);
|
||||
return ret;
|
||||
}
|
||||
|
||||
list_add_tail(&info->list, &rtw_wow->pno_pkt_list);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_pno_scan_offload(struct rtw89_dev *rtwdev, bool enable)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_scan_option opt = {};
|
||||
int ret;
|
||||
|
||||
if (enable) {
|
||||
ret = rtw89_pno_scan_update_probe_req(rtwdev, rtwvif);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Update probe request failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = mac->add_chan_list_pno(rtwdev, rtwvif);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Update channel list failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
opt.enable = enable;
|
||||
opt.repeat = RTW89_SCAN_NORMAL;
|
||||
opt.norm_pd = 10; /* in unit of 100ms */
|
||||
opt.delay = max(rtw_wow->nd_config->delay, 1);
|
||||
|
||||
if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) {
|
||||
opt.operation = enable ? RTW89_SCAN_OP_START : RTW89_SCAN_OP_STOP;
|
||||
opt.scan_mode = RTW89_SCAN_MODE_SA;
|
||||
opt.band = RTW89_PHY_0;
|
||||
opt.num_macc_role = 0;
|
||||
opt.mlo_mode = rtwdev->mlo_dbcc_mode;
|
||||
opt.num_opch = 0;
|
||||
opt.opch_end = RTW89_CHAN_INVALID;
|
||||
}
|
||||
|
||||
mac->scan_offload(rtwdev, &opt, rtwvif, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_fw_start(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
rtw89_wow_pattern_write(rtwdev);
|
||||
rtw89_wow_construct_key_info(rtwdev);
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
ret = rtw89_pno_scan_offload(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno scan offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable keep alive\n");
|
||||
return ret;
|
||||
ret = rtw89_pno_scan_offload(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable pno scan offload\n");
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
rtw89_wow_pattern_write(rtwdev);
|
||||
rtw89_wow_construct_key_info(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable keep alive\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable GTK offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, true);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to enable arp offload\n");
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable GTK offload\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, true);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to enable arp offload\n");
|
||||
|
||||
ret = rtw89_wow_cfg_wake(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to config wake\n");
|
||||
goto out;
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
ret = rtw89_wow_cfg_wake_pno(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to config wake PNO\n");
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
ret = rtw89_wow_cfg_wake(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to config wake\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = rtw89_wow_check_fw_status(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to check enable fw ready\n");
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
int ret;
|
||||
|
||||
rtw89_wow_pattern_clear(rtwdev);
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
ret = rtw89_pno_scan_offload(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno scan offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable keep alive\n");
|
||||
goto out;
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif);
|
||||
} else {
|
||||
rtw89_wow_pattern_clear(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable keep alive\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable GTK offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, false);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to disable arp offload\n");
|
||||
|
||||
rtw89_wow_key_clear(rtwdev);
|
||||
rtw89_fw_release_general_pkt_list(rtwdev, true);
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable GTK offload\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, false);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to disable arp offload\n");
|
||||
|
||||
rtw89_wow_key_clear(rtwdev);
|
||||
rtw89_fw_release_general_pkt_list(rtwdev, true);
|
||||
|
||||
ret = rtw89_wow_cfg_wake(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable config wake\n");
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_wow_check_fw_status(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to check disable fw ready\n");
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_enable(struct rtw89_dev *rtwdev)
|
||||
@@ -1430,7 +1636,7 @@ static int rtw89_wow_enable(struct rtw89_dev *rtwdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rtw89_wow_enter_lps(rtwdev);
|
||||
rtw89_wow_enter_ps(rtwdev);
|
||||
|
||||
ret = rtw89_wow_enable_trx_post(rtwdev);
|
||||
if (ret) {
|
||||
@@ -1455,7 +1661,7 @@ static int rtw89_wow_disable(struct rtw89_dev *rtwdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rtw89_wow_leave_lps(rtwdev);
|
||||
rtw89_wow_leave_ps(rtwdev, false);
|
||||
|
||||
ret = rtw89_wow_fw_stop(rtwdev);
|
||||
if (ret) {
|
||||
@@ -1480,6 +1686,12 @@ static int rtw89_wow_disable(struct rtw89_dev *rtwdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rtw89_wow_restore_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
if (rtw89_wow_no_link(rtwdev))
|
||||
rtw89_enter_ips(rtwdev);
|
||||
}
|
||||
|
||||
int rtw89_wow_resume(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
@@ -1504,6 +1716,7 @@ int rtw89_wow_resume(struct rtw89_dev *rtwdev)
|
||||
if (ret)
|
||||
rtw89_err(rtwdev, "failed to disable wow\n");
|
||||
|
||||
rtw89_wow_restore_ps(rtwdev);
|
||||
out:
|
||||
rtw89_wow_clear_wakeups(rtwdev);
|
||||
return ret;
|
||||
@@ -1519,7 +1732,7 @@ int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_wow_leave_lps(rtwdev);
|
||||
rtw89_wow_leave_ps(rtwdev, true);
|
||||
|
||||
ret = rtw89_wow_enable(rtwdev);
|
||||
if (ret) {
|
||||
|
||||
@@ -95,6 +95,29 @@ static inline int rtw89_wow_get_sec_hdr_len(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static inline bool rtw89_wow_mgd_linked(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
|
||||
return rtwvif->net_type == RTW89_NET_TYPE_INFRA;
|
||||
}
|
||||
|
||||
static inline bool rtw89_wow_no_link(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
|
||||
return rtwvif->net_type == RTW89_NET_TYPE_NO_LINK;
|
||||
}
|
||||
|
||||
static inline bool rtw_wow_has_mgd_features(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
|
||||
return !bitmap_empty(rtw_wow->flags, RTW89_WOW_FLAG_NUM);
|
||||
}
|
||||
|
||||
int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan);
|
||||
int rtw89_wow_resume(struct rtw89_dev *rtwdev);
|
||||
void rtw89_wow_parse_akm(struct rtw89_dev *rtwdev, struct sk_buff *skb);
|
||||
|
||||
Reference in New Issue
Block a user