patch/misc/rtw88: wireless-next 2023-06-22
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>
This commit is contained in:
parent
42de8b678c
commit
da0f7467a4
@ -406,21 +406,11 @@ driver_rtw88() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Upstream wireless RTW88 drivers
|
||||
if [[ "$version" == "6.1" || "$version" == "6.2" || "$version" == "6.3" ]] && [ $EXTRAWIFI == yes ]; then
|
||||
# Upstream wireless RTW88 drivers (wireless-next-2023-06-22)
|
||||
if [[ "$version" == "6.1" || "$version" == "6.2" || "$version" == "6.3" || "$version" == "6.4" ]] && [ $EXTRAWIFI == yes ]; then
|
||||
display_alert "Adding" "Upstream wireless RTW88 drivers" "info"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/001-rtw88-linux-next.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/002-rtw88-linux-next.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/003-rtw88-add-missing-unwind-goto-for_rtw_download_firmware.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/004-rtw88-fix-action-frame-transmission-fail-before-association.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/hack/001-revert-rtw88-sdio-size-and-timout-to-rfc-v1.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch" "applying"
|
||||
fi
|
||||
if [[ "$version" == "6.4" ]] && [ $EXTRAWIFI == yes ]; then
|
||||
display_alert "Adding" "Upstream wireless RTW88 drivers" "info"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/001-rtw88-add-support-for-the-RTL8723DS-SDIO-wifi-chip.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/002-rtw88-add-missing-unwind-goto-for_rtw_download_firmware.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/003-rtw88-fix-action-frame-transmission-fail-before-association.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/hack/001-revert-rtw88-sdio-size-and-timout-to-rfc-v1.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch" "applying"
|
||||
fi
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-11 07:10:49.401245393 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,41 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -42,8 +42,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723du.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723du.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
@ -81,8 +81,8 @@
|
||||
+MODULE_AUTHOR("Hans Ulli Kroll <linux@ulli-kroll.de>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11n wireless 8723du driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -120,8 +120,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,50 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
@ -173,8 +173,8 @@
|
||||
+MODULE_AUTHOR("Hans Ulli Kroll <linux@ulli-kroll.de>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cu driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
@ -212,8 +212,8 @@
|
||||
+MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,90 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
@ -305,8 +305,8 @@
|
||||
+MODULE_AUTHOR("Realtek Corporation");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bu driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -344,8 +344,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,44 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
@ -391,8 +391,8 @@
|
||||
+MODULE_AUTHOR("Realtek Corporation");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cu driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-11 07:10:49.399245425 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,1404 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -1798,8 +1798,8 @@
|
||||
+MODULE_AUTHOR("Jernej Skrabec");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,178 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -1979,9 +1979,9 @@
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-10 16:36:07.000000000 -0400
|
||||
@@ -0,0 +1,924 @@
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,931 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
+ */
|
||||
@ -2008,11 +2008,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);
|
||||
+}
|
||||
+
|
||||
@ -2290,11 +2291,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;
|
||||
@ -2347,9 +2350,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;
|
||||
+}
|
||||
@ -2449,6 +2453,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
|
||||
@ -2519,7 +2526,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;
|
||||
+ }
|
||||
@ -2906,8 +2913,8 @@
|
||||
+MODULE_AUTHOR("Realtek Corporation");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless USB driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.h 2023-06-10 16:36:07.000000000 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.h 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,107 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-07 1:27 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: s.hauer, dan.carpenter, lkp, linux-wireless
|
||||
|
||||
This flaw is detected by smatch:
|
||||
drivers/net/wireless/realtek/rtw88/mac.c:748 __rtw_download_firmware()
|
||||
warn: missing unwind goto?
|
||||
|
||||
Though most things of dlfw_fail have been done by
|
||||
download_firmware_end_flow() and wlan_cpu_enable(), an exception is that
|
||||
download_firmware_end_flow() clear BIT_MCUFWDL_EN bit conditionally.
|
||||
So, make this change to clear the bit.
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index a168f36c38ece..298663b035808 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -794,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
|
||||
|
||||
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)
|
||||
--
|
||||
2.25.1
|
||||
@ -1,41 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-15 11:43 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: phhuang, linux-wireless
|
||||
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
|
||||
For combo chips, antennas were controlled by bluetooth only during
|
||||
power on. If WiFi wish to do transmission, notification to the coexistence
|
||||
module are required. Previously we only do this before authentication.
|
||||
To allow transmission before auth, such as management TX, now we start
|
||||
the initiation of coexistence earlier so antennas are shared between
|
||||
WiFi and bluetooth after set_channel(), and frames could then be sent.
|
||||
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/ps.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
index 53933fb38a330..43e80a3a8136d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
|
||||
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 @@ int rtw_leave_ips(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
||||
|
||||
- rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-12 05:04:19.622514805 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,41 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -42,8 +42,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-12 05:02:33.135048216 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -81,8 +81,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-12 05:02:33.136048201 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
@ -120,8 +120,8 @@
|
||||
+MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-12 05:02:33.139048158 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -159,8 +159,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-12 05:04:19.620514834 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,1404 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -1566,8 +1566,8 @@
|
||||
+MODULE_AUTHOR("Jernej Skrabec");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-12 05:02:33.140048143 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,178 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-07 1:27 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: s.hauer, dan.carpenter, lkp, linux-wireless
|
||||
|
||||
This flaw is detected by smatch:
|
||||
drivers/net/wireless/realtek/rtw88/mac.c:748 __rtw_download_firmware()
|
||||
warn: missing unwind goto?
|
||||
|
||||
Though most things of dlfw_fail have been done by
|
||||
download_firmware_end_flow() and wlan_cpu_enable(), an exception is that
|
||||
download_firmware_end_flow() clear BIT_MCUFWDL_EN bit conditionally.
|
||||
So, make this change to clear the bit.
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index a168f36c38ece..298663b035808 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -794,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
|
||||
|
||||
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)
|
||||
--
|
||||
2.25.1
|
||||
@ -1,41 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-15 11:43 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: phhuang, linux-wireless
|
||||
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
|
||||
For combo chips, antennas were controlled by bluetooth only during
|
||||
power on. If WiFi wish to do transmission, notification to the coexistence
|
||||
module are required. Previously we only do this before authentication.
|
||||
To allow transmission before auth, such as management TX, now we start
|
||||
the initiation of coexistence earlier so antennas are shared between
|
||||
WiFi and bluetooth after set_channel(), and frames could then be sent.
|
||||
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/ps.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
index 53933fb38a330..43e80a3a8136d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
|
||||
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 @@ int rtw_leave_ips(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
||||
|
||||
- rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-11 07:28:33.845740907 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,41 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -42,8 +42,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-11 07:25:27.501596984 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -81,8 +81,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-11 07:25:27.508596876 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
@ -120,8 +120,8 @@
|
||||
+MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-11 07:25:27.519596708 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,36 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -159,8 +159,8 @@
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-11 07:28:33.844740922 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,1404 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
@ -1566,8 +1566,8 @@
|
||||
+MODULE_AUTHOR("Jernej Skrabec");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--- /dev/null 2023-06-08 17:12:18.013167787 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-11 07:25:27.521596677 -0400
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,178 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-07 1:27 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: s.hauer, dan.carpenter, lkp, linux-wireless
|
||||
|
||||
This flaw is detected by smatch:
|
||||
drivers/net/wireless/realtek/rtw88/mac.c:748 __rtw_download_firmware()
|
||||
warn: missing unwind goto?
|
||||
|
||||
Though most things of dlfw_fail have been done by
|
||||
download_firmware_end_flow() and wlan_cpu_enable(), an exception is that
|
||||
download_firmware_end_flow() clear BIT_MCUFWDL_EN bit conditionally.
|
||||
So, make this change to clear the bit.
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index a168f36c38ece..298663b035808 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -794,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
|
||||
|
||||
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)
|
||||
--
|
||||
2.25.1
|
||||
@ -1,41 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-15 11:43 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: phhuang, linux-wireless
|
||||
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
|
||||
For combo chips, antennas were controlled by bluetooth only during
|
||||
power on. If WiFi wish to do transmission, notification to the coexistence
|
||||
module are required. Previously we only do this before authentication.
|
||||
To allow transmission before auth, such as management TX, now we start
|
||||
the initiation of coexistence earlier so antennas are shared between
|
||||
WiFi and bluetooth after set_channel(), and frames could then be sent.
|
||||
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/ps.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
index 53933fb38a330..43e80a3a8136d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
|
||||
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 @@ int rtw_leave_ips(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
||||
|
||||
- rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
@ -1,314 +0,0 @@
|
||||
From: Martin Blumenstingl @ 2023-05-22 20:24 UTC (permalink / raw)
|
||||
To: linux-wireless
|
||||
Cc: linux-mmc, linux-kernel, ulf.hansson, kvalo, tony0620emma,
|
||||
Peter Robinson, Ping-Ke Shih, jernej.skrabec, Larry Finger,
|
||||
Martin Blumenstingl
|
||||
|
||||
rtw_sdio_rx_isr() is responsible for receiving data from the wifi chip
|
||||
and is called from the SDIO interrupt handler when the interrupt status
|
||||
register (HISR) has the RX_REQUEST bit set. After the first batch of
|
||||
data has been processed by the driver the wifi chip may have more data
|
||||
ready to be read, which is managed by a loop in rtw_sdio_rx_isr().
|
||||
|
||||
It turns out that there are cases where the RX buffer length (from the
|
||||
REG_SDIO_RX0_REQ_LEN register) does not match the data we receive. The
|
||||
following two cases were observed with a RTL8723DS card:
|
||||
- RX length is smaller than the total packet length including overhead
|
||||
and actual data bytes (whose length is part of the buffer we read from
|
||||
the wifi chip and is stored in rtw_rx_pkt_stat.pkt_len). This can
|
||||
result in errors like:
|
||||
skbuff: skb_over_panic: text:ffff8000011924ac len:3341 put:3341
|
||||
(one case observed was: RX buffer length = 1536 bytes but
|
||||
rtw_rx_pkt_stat.pkt_len = 1546 bytes, this is not valid as it means
|
||||
we need to read beyond the end of the buffer)
|
||||
- RX length looks valid but rtw_rx_pkt_stat.pkt_len is zero
|
||||
|
||||
Check if the RX_REQUEST is set in the HISR register for each iteration
|
||||
inside rtw_sdio_rx_isr(). This mimics what the RTL8723DS vendor driver
|
||||
does and makes the driver only read more data if the RX_REQUEST bit is
|
||||
set (which seems to be a way for the card's hardware or firmware to
|
||||
tell the host that data is ready to be processed).
|
||||
|
||||
For RTW_WCPU_11AC chips this check is not needed. The RTL8822BS vendor
|
||||
driver for example states that this check is unnecessary (but still uses
|
||||
it) and the RTL8822CS drops this check entirely.
|
||||
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
Changes since v1:
|
||||
- added Ping-Ke's Reviewed-by (thank you!)
|
||||
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 24 ++++++++++++++++++++---
|
||||
1 file changed, 21 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 06fce7c3adda..2c1fb2dabd40 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -998,9 +998,9 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len)
|
||||
|
||||
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 @@ static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
|
||||
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)
|
||||
--
|
||||
2.40.1
|
||||
From: Martin Blumenstingl @ 2023-05-22 20:24 UTC (permalink / raw)
|
||||
To: linux-wireless
|
||||
Cc: linux-mmc, linux-kernel, ulf.hansson, kvalo, tony0620emma,
|
||||
Peter Robinson, Ping-Ke Shih, jernej.skrabec, Larry Finger,
|
||||
Martin Blumenstingl
|
||||
|
||||
The efuse of the SDIO RTL8723DS chip has only one known member: the mac
|
||||
address is at offset 0x11a. Add a struct rtw8723ds_efuse describing this
|
||||
and use it for copying the mac address when the SDIO bus is used.
|
||||
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
Changes since v1:
|
||||
- added Ping-Ke's Reviewed-by (thank you!)
|
||||
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 9 +++++++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.h | 6 ++++++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 06e7454c9ca6..cadf66f4e854 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -216,6 +216,12 @@ static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse,
|
||||
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 @@ static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
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;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h
|
||||
index a356318a5c15..3642a2c7f80c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h
|
||||
@@ -49,6 +49,11 @@ struct rtw8723du_efuse {
|
||||
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 @@ struct rtw8723d_efuse {
|
||||
union {
|
||||
struct rtw8723de_efuse e;
|
||||
struct rtw8723du_efuse u;
|
||||
+ struct rtw8723ds_efuse s;
|
||||
};
|
||||
};
|
||||
|
||||
--
|
||||
2.40.1
|
||||
From: Martin Blumenstingl @ 2023-05-22 20:24 UTC (permalink / raw)
|
||||
To: linux-wireless
|
||||
Cc: linux-mmc, linux-kernel, ulf.hansson, kvalo, tony0620emma,
|
||||
Peter Robinson, Ping-Ke Shih, jernej.skrabec, Larry Finger,
|
||||
Martin Blumenstingl
|
||||
|
||||
RTL8723DS comes in two variant and each of them has their own SDIO ID:
|
||||
- 0xd723 can connect two antennas. The WiFi part is still 1x1 so the
|
||||
second antenna can be dedicated to Bluetooth
|
||||
- 0xd724 can only connect one antenna so it's shared between WiFi and
|
||||
Bluetooth
|
||||
|
||||
Add a new entry for the single antenna RTL8723DS (0xd724) which can be
|
||||
found on the MangoPi MQ-Quad. Also rename the existing RTL8723DS entry
|
||||
(0xd723) so it's name reflects that it's the variant with support for
|
||||
two antennas.
|
||||
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
Changes since v1:
|
||||
- added Ping-Ke's Reviewed-by (thank you!)
|
||||
|
||||
|
||||
include/linux/mmc/sdio_ids.h | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
|
||||
index c653accdc7fd..7fada7a714fe 100644
|
||||
--- a/include/linux/mmc/sdio_ids.h
|
||||
+++ b/include/linux/mmc/sdio_ids.h
|
||||
@@ -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
|
||||
--
|
||||
2.40.1
|
||||
From: Martin Blumenstingl @ 2023-05-22 20:24 UTC (permalink / raw)
|
||||
To: linux-wireless
|
||||
Cc: linux-mmc, linux-kernel, ulf.hansson, kvalo, tony0620emma,
|
||||
Peter Robinson, Ping-Ke Shih, jernej.skrabec, Larry Finger,
|
||||
Martin Blumenstingl
|
||||
|
||||
Wire up RTL8723DS chipset support using the rtw88 SDIO HCI code as well
|
||||
as the existing RTL8723D chipset code.
|
||||
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
Changes since v1:
|
||||
- added Ping-Ke's Reviewed-by (thank you!)
|
||||
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/Kconfig | 11 +++++
|
||||
drivers/net/wireless/realtek/rtw88/Makefile | 3 ++
|
||||
.../net/wireless/realtek/rtw88/rtw8723ds.c | 41 +++++++++++++++++++
|
||||
3 files changed, 55 insertions(+)
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723ds.c
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
index 29eb2f8e0eb7..cffad1c01249 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
@@ -111,6 +111,17 @@ config RTW88_8723DE
|
||||
|
||||
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 --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
index 82979b30ae8d..fd212c09d88a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
@@ -50,6 +50,9 @@ rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o
|
||||
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 --git a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c
|
||||
new file mode 100644
|
||||
index 000000000000..e5b6960ba0a0
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c
|
||||
@@ -0,0 +1,41 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/mmc/sdio_func.h>
|
||||
+#include <linux/mmc/sdio_ids.h>
|
||||
+#include <linux/module.h>
|
||||
+#include "main.h"
|
||||
+#include "rtw8723d.h"
|
||||
+#include "sdio.h"
|
||||
+
|
||||
+static const struct sdio_device_id rtw_8723ds_id_table[] = {
|
||||
+ {
|
||||
+ SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
|
||||
+ SDIO_DEVICE_ID_REALTEK_RTW8723DS_1ANT),
|
||||
+ .driver_data = (kernel_ulong_t)&rtw8723d_hw_spec,
|
||||
+ },
|
||||
+ {
|
||||
+ SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
|
||||
+ SDIO_DEVICE_ID_REALTEK_RTW8723DS_2ANT),
|
||||
+ .driver_data = (kernel_ulong_t)&rtw8723d_hw_spec,
|
||||
+ },
|
||||
+ {}
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(sdio, rtw_8723ds_id_table);
|
||||
+
|
||||
+static struct sdio_driver rtw_8723ds_driver = {
|
||||
+ .name = "rtw_8723ds",
|
||||
+ .probe = rtw_sdio_probe,
|
||||
+ .remove = rtw_sdio_remove,
|
||||
+ .id_table = rtw_8723ds_id_table,
|
||||
+ .drv = {
|
||||
+ .pm = &rtw_sdio_pm_ops,
|
||||
+ .shutdown = rtw_sdio_shutdown,
|
||||
+ }
|
||||
+};
|
||||
+module_sdio_driver(rtw_8723ds_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--
|
||||
2.40.1
|
||||
969
patch/misc/rtw88/6.4/001-rtw88-linux-next.patch
Normal file
969
patch/misc/rtw88/6.4/001-rtw88-linux-next.patch
Normal file
@ -0,0 +1,969 @@
|
||||
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
|
||||
@ -1,31 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-07 1:27 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: s.hauer, dan.carpenter, lkp, linux-wireless
|
||||
|
||||
This flaw is detected by smatch:
|
||||
drivers/net/wireless/realtek/rtw88/mac.c:748 __rtw_download_firmware()
|
||||
warn: missing unwind goto?
|
||||
|
||||
Though most things of dlfw_fail have been done by
|
||||
download_firmware_end_flow() and wlan_cpu_enable(), an exception is that
|
||||
download_firmware_end_flow() clear BIT_MCUFWDL_EN bit conditionally.
|
||||
So, make this change to clear the bit.
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index a168f36c38ece..298663b035808 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -794,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
|
||||
|
||||
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)
|
||||
--
|
||||
2.25.1
|
||||
44
patch/misc/rtw88/6.4/002-rtw88-linux-next.patch
Normal file
44
patch/misc/rtw88/6.4/002-rtw88-linux-next.patch
Normal file
@ -0,0 +1,44 @@
|
||||
--- /dev/null 2023-06-17 08:32:20.061755428 -0400
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400
|
||||
@@ -0,0 +1,41 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/mmc/sdio_func.h>
|
||||
+#include <linux/mmc/sdio_ids.h>
|
||||
+#include <linux/module.h>
|
||||
+#include "main.h"
|
||||
+#include "rtw8723d.h"
|
||||
+#include "sdio.h"
|
||||
+
|
||||
+static const struct sdio_device_id rtw_8723ds_id_table[] = {
|
||||
+ {
|
||||
+ SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
|
||||
+ SDIO_DEVICE_ID_REALTEK_RTW8723DS_1ANT),
|
||||
+ .driver_data = (kernel_ulong_t)&rtw8723d_hw_spec,
|
||||
+ },
|
||||
+ {
|
||||
+ SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
|
||||
+ SDIO_DEVICE_ID_REALTEK_RTW8723DS_2ANT),
|
||||
+ .driver_data = (kernel_ulong_t)&rtw8723d_hw_spec,
|
||||
+ },
|
||||
+ {}
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(sdio, rtw_8723ds_id_table);
|
||||
+
|
||||
+static struct sdio_driver rtw_8723ds_driver = {
|
||||
+ .name = "rtw_8723ds",
|
||||
+ .probe = rtw_sdio_probe,
|
||||
+ .remove = rtw_sdio_remove,
|
||||
+ .id_table = rtw_8723ds_id_table,
|
||||
+ .drv = {
|
||||
+ .pm = &rtw_sdio_pm_ops,
|
||||
+ .shutdown = rtw_sdio_shutdown,
|
||||
+ }
|
||||
+};
|
||||
+module_sdio_driver(rtw_8723ds_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
@ -1,41 +0,0 @@
|
||||
From: Ping-Ke Shih @ 2023-06-15 11:43 UTC (permalink / raw)
|
||||
To: tony0620emma, kvalo; +Cc: phhuang, linux-wireless
|
||||
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
|
||||
For combo chips, antennas were controlled by bluetooth only during
|
||||
power on. If WiFi wish to do transmission, notification to the coexistence
|
||||
module are required. Previously we only do this before authentication.
|
||||
To allow transmission before auth, such as management TX, now we start
|
||||
the initiation of coexistence earlier so antennas are shared between
|
||||
WiFi and bluetooth after set_channel(), and frames could then be sent.
|
||||
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/ps.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
index 53933fb38a330..43e80a3a8136d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
|
||||
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 @@ int rtw_leave_ips(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
||||
|
||||
- rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
Loading…
Reference in New Issue
Block a user