This brings the patch set up to 2023-06-22 wireless-next Drivers tested; 8822CS. 8821CU and 8723DS Notables; Not seeing random dmesg spam `rtw_8822cs failed to get tx report from firmware` which I would see on both the CS and CU from time to time. Signed-off-by: Patrick Yavitz <pyavitz@gmail.com>
970 lines
34 KiB
Diff
970 lines
34 KiB
Diff
diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -183,8 +183,8 @@
|
|
|
|
tmp_len = (count > size - 1 ? size - 1 : count);
|
|
|
|
- if (!buffer || copy_from_user(tmp, buffer, tmp_len))
|
|
- return count;
|
|
+ if (copy_from_user(tmp, buffer, tmp_len))
|
|
+ return -EFAULT;
|
|
|
|
tmp[tmp_len] = '\0';
|
|
|
|
@@ -201,13 +201,16 @@
|
|
char tmp[32 + 1];
|
|
u32 addr, len;
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
num = sscanf(tmp, "%x %x", &addr, &len);
|
|
|
|
if (num != 2)
|
|
- return count;
|
|
+ return -EINVAL;
|
|
|
|
if (len != 1 && len != 2 && len != 4) {
|
|
rtw_warn(rtwdev, "read reg setting wrong len\n");
|
|
@@ -288,8 +291,11 @@
|
|
char tmp[32 + 1];
|
|
u32 offset, page_num;
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
num = sscanf(tmp, "%d %d", &offset, &page_num);
|
|
|
|
@@ -314,8 +320,11 @@
|
|
char tmp[32 + 1];
|
|
u32 input;
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
num = kstrtoint(tmp, 0, &input);
|
|
|
|
@@ -338,14 +347,17 @@
|
|
char tmp[32 + 1];
|
|
u32 addr, val, len;
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
/* write BB/MAC register */
|
|
num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
|
|
|
|
if (num != 3)
|
|
- return count;
|
|
+ return -EINVAL;
|
|
|
|
switch (len) {
|
|
case 1:
|
|
@@ -381,8 +393,11 @@
|
|
char tmp[32 + 1];
|
|
u8 param[8];
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx",
|
|
¶m[0], ¶m[1], ¶m[2], ¶m[3],
|
|
@@ -408,14 +423,17 @@
|
|
char tmp[32 + 1];
|
|
u32 path, addr, mask, val;
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 4);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 4);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
num = sscanf(tmp, "%x %x %x %x", &path, &addr, &mask, &val);
|
|
|
|
if (num != 4) {
|
|
rtw_warn(rtwdev, "invalid args, [path] [addr] [mask] [val]\n");
|
|
- return count;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
mutex_lock(&rtwdev->mutex);
|
|
@@ -438,14 +456,17 @@
|
|
char tmp[32 + 1];
|
|
u32 path, addr, mask;
|
|
int num;
|
|
+ int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
num = sscanf(tmp, "%x %x %x", &path, &addr, &mask);
|
|
|
|
if (num != 3) {
|
|
rtw_warn(rtwdev, "invalid args, [path] [addr] [mask] [val]\n");
|
|
- return count;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
debugfs_priv->rf_path = path;
|
|
@@ -467,7 +488,9 @@
|
|
char tmp[32 + 1];
|
|
int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
ret = kstrtou8(tmp, 0, &fix_rate);
|
|
if (ret) {
|
|
@@ -860,7 +883,9 @@
|
|
bool enable;
|
|
int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
ret = kstrtobool(tmp, &enable);
|
|
if (ret) {
|
|
@@ -930,7 +955,9 @@
|
|
bool input;
|
|
int ret;
|
|
|
|
- rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ ret = rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
ret = kstrtobool(tmp, &input);
|
|
if (ret)
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -308,6 +308,57 @@
|
|
}
|
|
EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr);
|
|
|
|
+static void rtw_fw_send_h2c_command_register(struct rtw_dev *rtwdev,
|
|
+ struct rtw_h2c_register *h2c)
|
|
+{
|
|
+ u32 box_reg, box_ex_reg;
|
|
+ u8 box_state, box;
|
|
+ int ret;
|
|
+
|
|
+ rtw_dbg(rtwdev, RTW_DBG_FW, "send H2C content %08x %08x\n", h2c->w0,
|
|
+ h2c->w1);
|
|
+
|
|
+ lockdep_assert_held(&rtwdev->mutex);
|
|
+
|
|
+ box = rtwdev->h2c.last_box_num;
|
|
+ switch (box) {
|
|
+ case 0:
|
|
+ box_reg = REG_HMEBOX0;
|
|
+ box_ex_reg = REG_HMEBOX0_EX;
|
|
+ break;
|
|
+ case 1:
|
|
+ box_reg = REG_HMEBOX1;
|
|
+ box_ex_reg = REG_HMEBOX1_EX;
|
|
+ break;
|
|
+ case 2:
|
|
+ box_reg = REG_HMEBOX2;
|
|
+ box_ex_reg = REG_HMEBOX2_EX;
|
|
+ break;
|
|
+ case 3:
|
|
+ box_reg = REG_HMEBOX3;
|
|
+ box_ex_reg = REG_HMEBOX3_EX;
|
|
+ break;
|
|
+ default:
|
|
+ WARN(1, "invalid h2c mail box number\n");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ ret = read_poll_timeout_atomic(rtw_read8, box_state,
|
|
+ !((box_state >> box) & 0x1), 100, 3000,
|
|
+ false, rtwdev, REG_HMETFR);
|
|
+
|
|
+ if (ret) {
|
|
+ rtw_err(rtwdev, "failed to send h2c command\n");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ rtw_write32(rtwdev, box_ex_reg, h2c->w1);
|
|
+ rtw_write32(rtwdev, box_reg, h2c->w0);
|
|
+
|
|
+ if (++rtwdev->h2c.last_box_num >= 4)
|
|
+ rtwdev->h2c.last_box_num = 0;
|
|
+}
|
|
+
|
|
static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
|
|
u8 *h2c)
|
|
{
|
|
@@ -468,6 +519,23 @@
|
|
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
|
|
}
|
|
|
|
+void rtw_fw_default_port(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
|
|
+{
|
|
+ struct rtw_h2c_register h2c = {};
|
|
+
|
|
+ if (rtwvif->net_type != RTW_NET_MGD_LINKED)
|
|
+ return;
|
|
+
|
|
+ /* Leave LPS before default port H2C so FW timer is correct */
|
|
+ rtw_leave_lps(rtwdev);
|
|
+
|
|
+ h2c.w0 = u32_encode_bits(H2C_CMD_DEFAULT_PORT, RTW_H2C_W0_CMDID) |
|
|
+ u32_encode_bits(rtwvif->port, RTW_H2C_DEFAULT_PORT_W0_PORTID) |
|
|
+ u32_encode_bits(rtwvif->mac_id, RTW_H2C_DEFAULT_PORT_W0_MACID);
|
|
+
|
|
+ rtw_fw_send_h2c_command_register(rtwdev, &h2c);
|
|
+}
|
|
+
|
|
void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw)
|
|
{
|
|
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
|
|
--- a/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -81,6 +81,17 @@
|
|
u8 option;
|
|
} __packed;
|
|
|
|
+struct rtw_h2c_register {
|
|
+ u32 w0;
|
|
+ u32 w1;
|
|
+} __packed;
|
|
+
|
|
+#define RTW_H2C_W0_CMDID GENMASK(7, 0)
|
|
+
|
|
+/* H2C_CMD_DEFAULT_PORT command */
|
|
+#define RTW_H2C_DEFAULT_PORT_W0_PORTID GENMASK(15, 8)
|
|
+#define RTW_H2C_DEFAULT_PORT_W0_MACID GENMASK(23, 16)
|
|
+
|
|
struct rtw_h2c_cmd {
|
|
__le32 msg;
|
|
__le32 msg_ext;
|
|
@@ -530,6 +541,7 @@
|
|
#define H2C_CMD_MEDIA_STATUS_RPT 0x01
|
|
#define H2C_CMD_SET_PWR_MODE 0x20
|
|
#define H2C_CMD_LPS_PG_INFO 0x2b
|
|
+#define H2C_CMD_DEFAULT_PORT 0x2c
|
|
#define H2C_CMD_RA_INFO 0x40
|
|
#define H2C_CMD_RSSI_MONITOR 0x42
|
|
#define H2C_CMD_BCN_FILTER_OFFLOAD_P0 0x56
|
|
@@ -801,6 +813,7 @@
|
|
void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
|
|
void rtw_fw_send_general_info(struct rtw_dev *rtwdev);
|
|
void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev);
|
|
+void rtw_fw_default_port(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
|
|
|
|
void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para);
|
|
void rtw_fw_inform_rfk_status(struct rtw_dev *rtwdev, bool start);
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig
|
|
--- a/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -111,6 +111,17 @@
|
|
|
|
802.11n PCIe wireless network adapter
|
|
|
|
+config RTW88_8723DS
|
|
+ tristate "Realtek 8723DS SDIO wireless network adapter"
|
|
+ depends on MMC
|
|
+ select RTW88_CORE
|
|
+ select RTW88_SDIO
|
|
+ select RTW88_8723D
|
|
+ help
|
|
+ Select this option will enable support for 8723DS chipset
|
|
+
|
|
+ 802.11n SDIO wireless network adapter
|
|
+
|
|
config RTW88_8723DU
|
|
tristate "Realtek 8723DU USB wireless network adapter"
|
|
depends on USB
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -43,7 +43,11 @@
|
|
list_add_tail(&rtwtxq->list, &rtwdev->txqs);
|
|
spin_unlock_bh(&rtwdev->txq_lock);
|
|
|
|
- queue_work(rtwdev->tx_wq, &rtwdev->tx_work);
|
|
+ /* ensure to dequeue EAPOL (4/4) at the right time */
|
|
+ if (txq->ac == IEEE80211_AC_VO)
|
|
+ __rtw_tx_work(rtwdev);
|
|
+ else
|
|
+ queue_work(rtwdev->tx_wq, &rtwdev->tx_work);
|
|
}
|
|
|
|
static int rtw_ops_start(struct ieee80211_hw *hw)
|
|
@@ -164,8 +168,10 @@
|
|
mutex_lock(&rtwdev->mutex);
|
|
|
|
port = find_first_zero_bit(rtwdev->hw_port, RTW_PORT_NUM);
|
|
- if (port >= RTW_PORT_NUM)
|
|
+ if (port >= RTW_PORT_NUM) {
|
|
+ mutex_unlock(&rtwdev->mutex);
|
|
return -EINVAL;
|
|
+ }
|
|
set_bit(port, rtwdev->hw_port);
|
|
|
|
rtwvif->port = port;
|
|
@@ -376,6 +382,7 @@
|
|
|
|
rtw_fw_download_rsvd_page(rtwdev);
|
|
rtw_send_rsvd_page_h2c(rtwdev);
|
|
+ rtw_fw_default_port(rtwdev, rtwvif);
|
|
rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc);
|
|
if (rtw_bf_support)
|
|
rtw_bf_assoc(rtwdev, vif, conf);
|
|
@@ -447,6 +454,7 @@
|
|
const struct rtw_chip_info *chip = rtwdev->chip;
|
|
|
|
mutex_lock(&rtwdev->mutex);
|
|
+ rtw_write32_set(rtwdev, REG_TCR, BIT_TCR_UPDATE_HGQMD);
|
|
rtwdev->ap_active = true;
|
|
rtw_store_op_chan(rtwdev, true);
|
|
chip->ops->phy_calibration(rtwdev);
|
|
@@ -462,6 +470,7 @@
|
|
struct rtw_dev *rtwdev = hw->priv;
|
|
|
|
mutex_lock(&rtwdev->mutex);
|
|
+ rtw_write32_clr(rtwdev, REG_TCR, BIT_TCR_UPDATE_HGQMD);
|
|
rtwdev->ap_active = false;
|
|
if (!rtw_core_check_sta_active(rtwdev))
|
|
rtw_clear_op_chan(rtwdev);
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -794,8 +794,10 @@
|
|
|
|
wlan_cpu_enable(rtwdev, true);
|
|
|
|
- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp))
|
|
- return -EBUSY;
|
|
+ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) {
|
|
+ ret = -EBUSY;
|
|
+ goto dlfw_fail;
|
|
+ }
|
|
|
|
ret = download_firmware_validate(rtwdev);
|
|
if (ret)
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -334,12 +334,15 @@
|
|
struct ieee80211_vif *vif)
|
|
{
|
|
struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
|
|
+ struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
|
|
int i;
|
|
|
|
si->mac_id = rtw_acquire_macid(rtwdev);
|
|
if (si->mac_id >= RTW_MAX_MAC_ID_NUM)
|
|
return -ENOSPC;
|
|
|
|
+ if (vif->type == NL80211_IFTYPE_STATION && vif->cfg.assoc == 0)
|
|
+ rtwvif->mac_id = si->mac_id;
|
|
si->rtwdev = rtwdev;
|
|
si->sta = sta;
|
|
si->vif = vif;
|
|
@@ -2340,6 +2343,9 @@
|
|
rtw_dbg(rtwdev, RTW_DBG_STATE, "AP port switch from %d -> %d\n",
|
|
rtwvif_ap->port, rtwvif_target->port);
|
|
|
|
+ /* Leave LPS so the value swapped are not in PS mode */
|
|
+ rtw_leave_lps(rtwdev);
|
|
+
|
|
reg1 = &rtwvif_ap->conf->net_type;
|
|
reg2 = &rtwvif_target->conf->net_type;
|
|
rtw_swap_reg_mask(rtwdev, reg1, reg2);
|
|
@@ -2358,6 +2364,8 @@
|
|
|
|
swap(rtwvif_target->port, rtwvif_ap->port);
|
|
swap(rtwvif_target->conf, rtwvif_ap->conf);
|
|
+
|
|
+ rtw_fw_default_port(rtwdev, rtwvif_target);
|
|
}
|
|
|
|
void rtw_core_port_switch(struct rtw_dev *rtwdev, struct ieee80211_vif *vif)
|
|
@@ -2403,10 +2411,13 @@
|
|
if (!rtwdev->ap_active)
|
|
return;
|
|
|
|
- if (enable)
|
|
+ if (enable) {
|
|
rtw_write32_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
|
|
- else
|
|
+ rtw_write32_clr(rtwdev, REG_TXPAUSE, BIT_HIGH_QUEUE);
|
|
+ } else {
|
|
rtw_write32_clr(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
|
|
+ rtw_write32_set(rtwdev, REG_TXPAUSE, BIT_HIGH_QUEUE);
|
|
+ }
|
|
}
|
|
|
|
MODULE_AUTHOR("Realtek Corporation");
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.h 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.h 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -803,6 +803,7 @@
|
|
struct rtw_vif {
|
|
enum rtw_net_type net_type;
|
|
u16 aid;
|
|
+ u8 mac_id; /* for STA mode only */
|
|
u8 mac_addr[ETH_ALEN];
|
|
u8 bssid[ETH_ALEN];
|
|
u8 port;
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile
|
|
--- a/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -50,6 +50,9 @@
|
|
obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o
|
|
rtw88_8723de-objs := rtw8723de.o
|
|
|
|
+obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o
|
|
+rtw88_8723ds-objs := rtw8723ds.o
|
|
+
|
|
obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o
|
|
rtw88_8723du-objs := rtw8723du.o
|
|
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -738,8 +738,9 @@
|
|
u8 q;
|
|
|
|
for (q = 0; q < RTK_MAX_TX_QUEUE_NUM; q++) {
|
|
- /* It may be not necessary to flush BCN and H2C tx queues. */
|
|
- if (q == RTW_TX_QUEUE_BCN || q == RTW_TX_QUEUE_H2C)
|
|
+ /* Unnecessary to flush BCN, H2C and HI tx queues. */
|
|
+ if (q == RTW_TX_QUEUE_BCN || q == RTW_TX_QUEUE_H2C ||
|
|
+ q == RTW_TX_QUEUE_HI0)
|
|
continue;
|
|
|
|
if (pci_queues & BIT(q))
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -18,6 +18,7 @@
|
|
if (ret)
|
|
rtw_err(rtwdev, "leave idle state failed\n");
|
|
|
|
+ rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
|
rtw_set_channel(rtwdev);
|
|
|
|
return ret;
|
|
@@ -63,8 +64,6 @@
|
|
|
|
rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
|
|
|
- rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
|
--- a/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -378,6 +378,7 @@
|
|
#define BIT_SIFS_BK_EN BIT(12)
|
|
#define REG_TXPAUSE 0x0522
|
|
#define BIT_AC_QUEUE GENMASK(7, 0)
|
|
+#define BIT_HIGH_QUEUE BIT(5)
|
|
#define REG_RD_CTRL 0x0524
|
|
#define BIT_EDCCA_MSK_CNTDOWN_EN BIT(11)
|
|
#define BIT_DIS_TXOP_CFE BIT(10)
|
|
@@ -410,6 +411,7 @@
|
|
#define REG_TCR 0x0604
|
|
#define BIT_PWRMGT_HWDATA_EN BIT(7)
|
|
#define BIT_TCR_UPDATE_TIMIE BIT(5)
|
|
+#define BIT_TCR_UPDATE_HGQMD BIT(4)
|
|
#define REG_RCR 0x0608
|
|
#define BIT_APP_FCS BIT(31)
|
|
#define BIT_APP_MIC BIT(30)
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -216,6 +216,12 @@
|
|
ether_addr_copy(efuse->addr, map->u.mac_addr);
|
|
}
|
|
|
|
+static void rtw8723ds_efuse_parsing(struct rtw_efuse *efuse,
|
|
+ struct rtw8723d_efuse *map)
|
|
+{
|
|
+ ether_addr_copy(efuse->addr, map->s.mac_addr);
|
|
+}
|
|
+
|
|
static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
|
{
|
|
struct rtw_efuse *efuse = &rtwdev->efuse;
|
|
@@ -248,6 +254,9 @@
|
|
case RTW_HCI_TYPE_USB:
|
|
rtw8723du_efuse_parsing(efuse, map);
|
|
break;
|
|
+ case RTW_HCI_TYPE_SDIO:
|
|
+ rtw8723ds_efuse_parsing(efuse, map);
|
|
+ break;
|
|
default:
|
|
/* unsupported now */
|
|
return -ENOTSUPP;
|
|
@@ -1961,15 +1970,17 @@
|
|
size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */
|
|
__le16 chksum = 0;
|
|
__le16 *data = (__le16 *)(txdesc);
|
|
+ struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)txdesc;
|
|
|
|
- SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000);
|
|
+ le32p_replace_bits(&tx_desc->w7, 0, RTW_TX_DESC_W7_TXDESC_CHECKSUM);
|
|
|
|
while (words--)
|
|
chksum ^= *data++;
|
|
|
|
chksum = ~chksum;
|
|
|
|
- SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum));
|
|
+ le32p_replace_bits(&tx_desc->w7, __le16_to_cpu(chksum),
|
|
+ RTW_TX_DESC_W7_TXDESC_CHECKSUM);
|
|
}
|
|
|
|
static struct rtw_chip_ops rtw8723d_ops = {
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -49,6 +49,11 @@
|
|
u8 mac_addr[ETH_ALEN]; /* 0x107 */
|
|
};
|
|
|
|
+struct rtw8723ds_efuse {
|
|
+ u8 res4[0x4a]; /* 0xd0 */
|
|
+ u8 mac_addr[ETH_ALEN]; /* 0x11a */
|
|
+};
|
|
+
|
|
struct rtw8723d_efuse {
|
|
__le16 rtl_id;
|
|
u8 rsvd[2];
|
|
@@ -80,6 +85,7 @@
|
|
union {
|
|
struct rtw8723de_efuse e;
|
|
struct rtw8723du_efuse u;
|
|
+ struct rtw8723ds_efuse s;
|
|
};
|
|
};
|
|
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -998,9 +998,9 @@
|
|
|
|
static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
|
|
{
|
|
- u32 rx_len, total_rx_bytes = 0;
|
|
+ u32 rx_len, hisr, total_rx_bytes = 0;
|
|
|
|
- while (total_rx_bytes < SZ_64K) {
|
|
+ do {
|
|
if (rtw_chip_wcpu_11n(rtwdev))
|
|
rx_len = rtw_read16(rtwdev, REG_SDIO_RX0_REQ_LEN);
|
|
else
|
|
@@ -1012,7 +1012,25 @@
|
|
rtw_sdio_rxfifo_recv(rtwdev, rx_len);
|
|
|
|
total_rx_bytes += rx_len;
|
|
- }
|
|
+
|
|
+ if (rtw_chip_wcpu_11n(rtwdev)) {
|
|
+ /* Stop if no more RX requests are pending, even if
|
|
+ * rx_len could be greater than zero in the next
|
|
+ * iteration. This is needed because the RX buffer may
|
|
+ * already contain data while either HW or FW are not
|
|
+ * done filling that buffer yet. Still reading the
|
|
+ * buffer can result in packets where
|
|
+ * rtw_rx_pkt_stat.pkt_len is zero or points beyond the
|
|
+ * end of the buffer.
|
|
+ */
|
|
+ hisr = rtw_read32(rtwdev, REG_SDIO_HISR);
|
|
+ } else {
|
|
+ /* RTW_WCPU_11AC chips have improved hardware or
|
|
+ * firmware and can use rx_len unconditionally.
|
|
+ */
|
|
+ hisr = REG_SDIO_HISR_RX_REQUEST;
|
|
+ }
|
|
+ } while (total_rx_bytes < SZ_64K && hisr & REG_SDIO_HISR_RX_REQUEST);
|
|
}
|
|
|
|
static void rtw_sdio_handle_interrupt(struct sdio_func *sdio_func)
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -34,43 +34,57 @@
|
|
|
|
void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
|
{
|
|
- __le32 *txdesc = (__le32 *)skb->data;
|
|
+ struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data;
|
|
+ bool more_data = false;
|
|
+
|
|
+ if (pkt_info->qsel == TX_DESC_QSEL_HIGH)
|
|
+ more_data = true;
|
|
+
|
|
+ tx_desc->w0 = le32_encode_bits(pkt_info->tx_pkt_size, RTW_TX_DESC_W0_TXPKTSIZE) |
|
|
+ le32_encode_bits(pkt_info->offset, RTW_TX_DESC_W0_OFFSET) |
|
|
+ le32_encode_bits(pkt_info->bmc, RTW_TX_DESC_W0_BMC) |
|
|
+ le32_encode_bits(pkt_info->ls, RTW_TX_DESC_W0_LS) |
|
|
+ le32_encode_bits(pkt_info->dis_qselseq, RTW_TX_DESC_W0_DISQSELSEQ);
|
|
+
|
|
+ tx_desc->w1 = le32_encode_bits(pkt_info->qsel, RTW_TX_DESC_W1_QSEL) |
|
|
+ le32_encode_bits(pkt_info->rate_id, RTW_TX_DESC_W1_RATE_ID) |
|
|
+ le32_encode_bits(pkt_info->sec_type, RTW_TX_DESC_W1_SEC_TYPE) |
|
|
+ le32_encode_bits(pkt_info->pkt_offset, RTW_TX_DESC_W1_PKT_OFFSET) |
|
|
+ le32_encode_bits(more_data, RTW_TX_DESC_W1_MORE_DATA);
|
|
+
|
|
+ tx_desc->w2 = le32_encode_bits(pkt_info->ampdu_en, RTW_TX_DESC_W2_AGG_EN) |
|
|
+ le32_encode_bits(pkt_info->report, RTW_TX_DESC_W2_SPE_RPT) |
|
|
+ le32_encode_bits(pkt_info->ampdu_density, RTW_TX_DESC_W2_AMPDU_DEN) |
|
|
+ le32_encode_bits(pkt_info->bt_null, RTW_TX_DESC_W2_BT_NULL);
|
|
+
|
|
+ tx_desc->w3 = le32_encode_bits(pkt_info->hw_ssn_sel, RTW_TX_DESC_W3_HW_SSN_SEL) |
|
|
+ le32_encode_bits(pkt_info->use_rate, RTW_TX_DESC_W3_USE_RATE) |
|
|
+ le32_encode_bits(pkt_info->dis_rate_fallback, RTW_TX_DESC_W3_DISDATAFB) |
|
|
+ le32_encode_bits(pkt_info->rts, RTW_TX_DESC_W3_USE_RTS) |
|
|
+ le32_encode_bits(pkt_info->nav_use_hdr, RTW_TX_DESC_W3_NAVUSEHDR) |
|
|
+ le32_encode_bits(pkt_info->ampdu_factor, RTW_TX_DESC_W3_MAX_AGG_NUM);
|
|
+
|
|
+ tx_desc->w4 = le32_encode_bits(pkt_info->rate, RTW_TX_DESC_W4_DATARATE);
|
|
+
|
|
+ tx_desc->w5 = le32_encode_bits(pkt_info->short_gi, RTW_TX_DESC_W5_DATA_SHORT) |
|
|
+ le32_encode_bits(pkt_info->bw, RTW_TX_DESC_W5_DATA_BW) |
|
|
+ le32_encode_bits(pkt_info->ldpc, RTW_TX_DESC_W5_DATA_LDPC) |
|
|
+ le32_encode_bits(pkt_info->stbc, RTW_TX_DESC_W5_DATA_STBC);
|
|
+
|
|
+ tx_desc->w6 = le32_encode_bits(pkt_info->sn, RTW_TX_DESC_W6_SW_DEFINE);
|
|
+
|
|
+ tx_desc->w8 = le32_encode_bits(pkt_info->en_hwseq, RTW_TX_DESC_W8_EN_HWSEQ);
|
|
+
|
|
+ tx_desc->w9 = le32_encode_bits(pkt_info->seq, RTW_TX_DESC_W9_SW_SEQ);
|
|
|
|
- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size);
|
|
- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset);
|
|
- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset);
|
|
- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel);
|
|
- SET_TX_DESC_BMC(txdesc, pkt_info->bmc);
|
|
- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id);
|
|
- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate);
|
|
- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback);
|
|
- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate);
|
|
- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type);
|
|
- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw);
|
|
- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq);
|
|
- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor);
|
|
- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density);
|
|
- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc);
|
|
- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc);
|
|
- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en);
|
|
- SET_TX_DESC_LS(txdesc, pkt_info->ls);
|
|
- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi);
|
|
- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report);
|
|
- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn);
|
|
- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts);
|
|
if (pkt_info->rts) {
|
|
- SET_TX_DESC_RTSRATE(txdesc, DESC_RATE24M);
|
|
- SET_TX_DESC_DATA_RTS_SHORT(txdesc, 1);
|
|
- }
|
|
- SET_TX_DESC_DISQSELSEQ(txdesc, pkt_info->dis_qselseq);
|
|
- SET_TX_DESC_EN_HWSEQ(txdesc, pkt_info->en_hwseq);
|
|
- SET_TX_DESC_HW_SSN_SEL(txdesc, pkt_info->hw_ssn_sel);
|
|
- SET_TX_DESC_NAVUSEHDR(txdesc, pkt_info->nav_use_hdr);
|
|
- SET_TX_DESC_BT_NULL(txdesc, pkt_info->bt_null);
|
|
- if (pkt_info->tim_offset) {
|
|
- SET_TX_DESC_TIM_EN(txdesc, 1);
|
|
- SET_TX_DESC_TIM_OFFSET(txdesc, pkt_info->tim_offset);
|
|
+ tx_desc->w4 |= le32_encode_bits(DESC_RATE24M, RTW_TX_DESC_W4_RTSRATE);
|
|
+ tx_desc->w5 |= le32_encode_bits(1, RTW_TX_DESC_W5_DATA_RTS_SHORT);
|
|
}
|
|
+
|
|
+ if (pkt_info->tim_offset)
|
|
+ tx_desc->w9 |= le32_encode_bits(1, RTW_TX_DESC_W9_TIM_EN) |
|
|
+ le32_encode_bits(pkt_info->tim_offset, RTW_TX_DESC_W9_TIM_OFFSET);
|
|
}
|
|
EXPORT_SYMBOL(rtw_tx_fill_tx_desc);
|
|
|
|
@@ -635,9 +649,8 @@
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
-void rtw_tx_work(struct work_struct *w)
|
|
+void __rtw_tx_work(struct rtw_dev *rtwdev)
|
|
{
|
|
- struct rtw_dev *rtwdev = container_of(w, struct rtw_dev, tx_work);
|
|
struct rtw_txq *rtwtxq, *tmp;
|
|
|
|
spin_lock_bh(&rtwdev->txq_lock);
|
|
@@ -658,6 +671,13 @@
|
|
spin_unlock_bh(&rtwdev->txq_lock);
|
|
}
|
|
|
|
+void rtw_tx_work(struct work_struct *w)
|
|
+{
|
|
+ struct rtw_dev *rtwdev = container_of(w, struct rtw_dev, tx_work);
|
|
+
|
|
+ __rtw_tx_work(rtwdev);
|
|
+}
|
|
+
|
|
void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq)
|
|
{
|
|
struct rtw_txq *rtwtxq;
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h
|
|
--- a/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -9,76 +9,53 @@
|
|
|
|
#define RTW_TX_PROBE_TIMEOUT msecs_to_jiffies(500)
|
|
|
|
-#define SET_TX_DESC_TXPKTSIZE(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, GENMASK(15, 0))
|
|
-#define SET_TX_DESC_OFFSET(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, GENMASK(23, 16))
|
|
-#define SET_TX_DESC_PKT_OFFSET(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x01, value, GENMASK(28, 24))
|
|
-#define SET_TX_DESC_QSEL(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x01, value, GENMASK(12, 8))
|
|
-#define SET_TX_DESC_BMC(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, BIT(24))
|
|
-#define SET_TX_DESC_RATE_ID(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x01, value, GENMASK(20, 16))
|
|
-#define SET_TX_DESC_DATARATE(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x04, value, GENMASK(6, 0))
|
|
-#define SET_TX_DESC_DISDATAFB(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(10))
|
|
-#define SET_TX_DESC_USE_RATE(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(8))
|
|
-#define SET_TX_DESC_SEC_TYPE(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x01, value, GENMASK(23, 22))
|
|
-#define SET_TX_DESC_DATA_BW(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x05, value, GENMASK(6, 5))
|
|
-#define SET_TX_DESC_SW_SEQ(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x09, value, GENMASK(23, 12))
|
|
-#define SET_TX_DESC_TIM_EN(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x09, value, BIT(7))
|
|
-#define SET_TX_DESC_TIM_OFFSET(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x09, value, GENMASK(6, 0))
|
|
-#define SET_TX_DESC_MAX_AGG_NUM(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, GENMASK(21, 17))
|
|
-#define SET_TX_DESC_USE_RTS(tx_desc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(12))
|
|
-#define SET_TX_DESC_RTSRATE(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x04, value, GENMASK(28, 24))
|
|
-#define SET_TX_DESC_DATA_RTS_SHORT(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x05, value, BIT(12))
|
|
-#define SET_TX_DESC_AMPDU_DENSITY(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, GENMASK(22, 20))
|
|
-#define SET_TX_DESC_DATA_STBC(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x05, value, GENMASK(9, 8))
|
|
-#define SET_TX_DESC_DATA_LDPC(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x05, value, BIT(7))
|
|
-#define SET_TX_DESC_AGG_EN(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(12))
|
|
-#define SET_TX_DESC_LS(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, BIT(26))
|
|
-#define SET_TX_DESC_DATA_SHORT(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x05, value, BIT(4))
|
|
-#define SET_TX_DESC_SPE_RPT(tx_desc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(19))
|
|
-#define SET_TX_DESC_SW_DEFINE(tx_desc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x06, value, GENMASK(11, 0))
|
|
-#define SET_TX_DESC_DISQSELSEQ(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x00, value, BIT(31))
|
|
-#define SET_TX_DESC_EN_HWSEQ(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x08, value, BIT(15))
|
|
-#define SET_TX_DESC_HW_SSN_SEL(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, GENMASK(7, 6))
|
|
-#define SET_TX_DESC_NAVUSEHDR(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(15))
|
|
-#define SET_TX_DESC_BT_NULL(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(23))
|
|
-#define SET_TX_DESC_TXDESC_CHECKSUM(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(15, 0))
|
|
-#define SET_TX_DESC_DMA_TXAGG_NUM(txdesc, value) \
|
|
- le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(31, 24))
|
|
-#define GET_TX_DESC_PKT_OFFSET(txdesc) \
|
|
- le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(28, 24))
|
|
-#define GET_TX_DESC_QSEL(txdesc) \
|
|
- le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(12, 8))
|
|
+struct rtw_tx_desc {
|
|
+ __le32 w0;
|
|
+ __le32 w1;
|
|
+ __le32 w2;
|
|
+ __le32 w3;
|
|
+ __le32 w4;
|
|
+ __le32 w5;
|
|
+ __le32 w6;
|
|
+ __le32 w7;
|
|
+ __le32 w8;
|
|
+ __le32 w9;
|
|
+} __packed;
|
|
+
|
|
+#define RTW_TX_DESC_W0_TXPKTSIZE GENMASK(15, 0)
|
|
+#define RTW_TX_DESC_W0_OFFSET GENMASK(23, 16)
|
|
+#define RTW_TX_DESC_W0_BMC BIT(24)
|
|
+#define RTW_TX_DESC_W0_LS BIT(26)
|
|
+#define RTW_TX_DESC_W0_DISQSELSEQ BIT(31)
|
|
+#define RTW_TX_DESC_W1_QSEL GENMASK(12, 8)
|
|
+#define RTW_TX_DESC_W1_RATE_ID GENMASK(20, 16)
|
|
+#define RTW_TX_DESC_W1_SEC_TYPE GENMASK(23, 22)
|
|
+#define RTW_TX_DESC_W1_PKT_OFFSET GENMASK(28, 24)
|
|
+#define RTW_TX_DESC_W1_MORE_DATA BIT(29)
|
|
+#define RTW_TX_DESC_W2_AGG_EN BIT(12)
|
|
+#define RTW_TX_DESC_W2_SPE_RPT BIT(19)
|
|
+#define RTW_TX_DESC_W2_AMPDU_DEN GENMASK(22, 20)
|
|
+#define RTW_TX_DESC_W2_BT_NULL BIT(23)
|
|
+#define RTW_TX_DESC_W3_HW_SSN_SEL GENMASK(7, 6)
|
|
+#define RTW_TX_DESC_W3_USE_RATE BIT(8)
|
|
+#define RTW_TX_DESC_W3_DISDATAFB BIT(10)
|
|
+#define RTW_TX_DESC_W3_USE_RTS BIT(12)
|
|
+#define RTW_TX_DESC_W3_NAVUSEHDR BIT(15)
|
|
+#define RTW_TX_DESC_W3_MAX_AGG_NUM GENMASK(21, 17)
|
|
+#define RTW_TX_DESC_W4_DATARATE GENMASK(6, 0)
|
|
+#define RTW_TX_DESC_W4_RTSRATE GENMASK(28, 24)
|
|
+#define RTW_TX_DESC_W5_DATA_SHORT BIT(4)
|
|
+#define RTW_TX_DESC_W5_DATA_BW GENMASK(6, 5)
|
|
+#define RTW_TX_DESC_W5_DATA_LDPC BIT(7)
|
|
+#define RTW_TX_DESC_W5_DATA_STBC GENMASK(9, 8)
|
|
+#define RTW_TX_DESC_W5_DATA_RTS_SHORT BIT(12)
|
|
+#define RTW_TX_DESC_W6_SW_DEFINE GENMASK(11, 0)
|
|
+#define RTW_TX_DESC_W7_TXDESC_CHECKSUM GENMASK(15, 0)
|
|
+#define RTW_TX_DESC_W7_DMA_TXAGG_NUM GENMASK(31, 24)
|
|
+#define RTW_TX_DESC_W8_EN_HWSEQ BIT(15)
|
|
+#define RTW_TX_DESC_W9_SW_SEQ GENMASK(23, 12)
|
|
+#define RTW_TX_DESC_W9_TIM_EN BIT(7)
|
|
+#define RTW_TX_DESC_W9_TIM_OFFSET GENMASK(6, 0)
|
|
|
|
enum rtw_tx_desc_queue_select {
|
|
TX_DESC_QSEL_TID0 = 0,
|
|
@@ -111,6 +88,7 @@
|
|
void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq);
|
|
void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq);
|
|
void rtw_tx_work(struct work_struct *w);
|
|
+void __rtw_tx_work(struct rtw_dev *rtwdev);
|
|
void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev,
|
|
struct rtw_tx_pkt_info *pkt_info,
|
|
struct ieee80211_sta *sta,
|
|
@@ -139,13 +117,15 @@
|
|
{
|
|
__le16 chksum = 0;
|
|
__le16 *data = (__le16 *)(txdesc);
|
|
+ struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)txdesc;
|
|
|
|
- SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000);
|
|
+ le32p_replace_bits(&tx_desc->w7, 0, RTW_TX_DESC_W7_TXDESC_CHECKSUM);
|
|
|
|
while (words--)
|
|
chksum ^= *data++;
|
|
|
|
- SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum));
|
|
+ le32p_replace_bits(&tx_desc->w7, __le16_to_cpu(chksum),
|
|
+ RTW_TX_DESC_W7_TXDESC_CHECKSUM);
|
|
}
|
|
|
|
static inline void rtw_tx_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
|
diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
|
--- a/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -24,11 +24,12 @@
|
|
static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb,
|
|
struct sk_buff *skb, int agg_num)
|
|
{
|
|
+ struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data;
|
|
struct rtw_dev *rtwdev = rtwusb->rtwdev;
|
|
struct rtw_tx_pkt_info pkt_info;
|
|
|
|
- SET_TX_DESC_DMA_TXAGG_NUM(skb->data, agg_num);
|
|
- pkt_info.pkt_offset = GET_TX_DESC_PKT_OFFSET(skb->data);
|
|
+ le32p_replace_bits(&tx_desc->w7, agg_num, RTW_TX_DESC_W7_DMA_TXAGG_NUM);
|
|
+ pkt_info.pkt_offset = le32_get_bits(tx_desc->w1, RTW_TX_DESC_W1_PKT_OFFSET);
|
|
rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data);
|
|
}
|
|
|
|
@@ -306,11 +307,13 @@
|
|
static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list)
|
|
{
|
|
struct rtw_dev *rtwdev = rtwusb->rtwdev;
|
|
+ struct rtw_tx_desc *tx_desc;
|
|
struct rtw_usb_txcb *txcb;
|
|
struct sk_buff *skb_head;
|
|
struct sk_buff *skb_iter;
|
|
int agg_num = 0;
|
|
unsigned int align_next = 0;
|
|
+ u8 qsel;
|
|
|
|
if (skb_queue_empty(list))
|
|
return false;
|
|
@@ -363,9 +366,10 @@
|
|
|
|
queue:
|
|
skb_queue_tail(&txcb->tx_ack_queue, skb_head);
|
|
+ tx_desc = (struct rtw_tx_desc *)skb_head->data;
|
|
+ qsel = le32_get_bits(tx_desc->w1, RTW_TX_DESC_W1_QSEL);
|
|
|
|
- rtw_usb_write_port(rtwdev, GET_TX_DESC_QSEL(skb_head->data), skb_head,
|
|
- rtw_usb_write_port_tx_complete, txcb);
|
|
+ rtw_usb_write_port(rtwdev, qsel, skb_head, rtw_usb_write_port_tx_complete, txcb);
|
|
|
|
return true;
|
|
}
|
|
@@ -465,6 +469,9 @@
|
|
|
|
if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc)))
|
|
qsel = TX_DESC_QSEL_MGMT;
|
|
+ else if (is_broadcast_ether_addr(hdr->addr1) ||
|
|
+ is_multicast_ether_addr(hdr->addr1))
|
|
+ qsel = TX_DESC_QSEL_HIGH;
|
|
else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK)
|
|
qsel = skb->priority;
|
|
else
|
|
@@ -535,7 +542,7 @@
|
|
}
|
|
|
|
if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) {
|
|
- rtw_err(rtwdev, "failed to get rx_queue, overflow\n");
|
|
+ dev_dbg_ratelimited(rtwdev->dev, "failed to get rx_queue, overflow\n");
|
|
dev_kfree_skb_any(skb);
|
|
continue;
|
|
}
|
|
diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
|
|
--- a/include/linux/mmc/sdio_ids.h 2023-06-18 17:06:27.000000000 -0400
|
|
+++ b/include/linux/mmc/sdio_ids.h 2023-06-22 13:52:09.000000000 -0400
|
|
@@ -121,7 +121,8 @@
|
|
#define SDIO_DEVICE_ID_REALTEK_RTW8822BS 0xb822
|
|
#define SDIO_DEVICE_ID_REALTEK_RTW8821CS 0xc821
|
|
#define SDIO_DEVICE_ID_REALTEK_RTW8822CS 0xc822
|
|
-#define SDIO_DEVICE_ID_REALTEK_RTW8723DS 0xd723
|
|
+#define SDIO_DEVICE_ID_REALTEK_RTW8723DS_2ANT 0xd723
|
|
+#define SDIO_DEVICE_ID_REALTEK_RTW8723DS_1ANT 0xd724
|
|
#define SDIO_DEVICE_ID_REALTEK_RTW8821DS 0xd821
|
|
|
|
#define SDIO_VENDOR_ID_SIANO 0x039a
|