RTW88: linux-6.x.y (#5697)
This is just a cosmetic change. Patches have been consolidated into one patch within each corresponding linux version directory. Added: linux-6.6 (RC-1) Removed: linux-6.2/6.3 Signed-off-by: Patrick Yavitz <pyavitz@xxxxx.com> Co-authored-by: Patrick Yavitz <pyavitz@xxxxx.com>
This commit is contained in:
parent
55abcdb94c
commit
fdc1966847
@ -442,8 +442,6 @@ driver_rtw88() {
|
||||
if linux-version compare "${version}" ge 6.1; then
|
||||
display_alert "Adding" "Upstream wireless RTW88 drivers" "info"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch" "applying"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/${version}/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.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"
|
||||
process_patch_file "${SRC}/patch/misc/rtw88/hack/003-rtw88-decrease-the-log-level-of-tx-report.patch" "applying"
|
||||
fi
|
||||
|
||||
@ -6174,3 +6174,93 @@ index 74f9d9a6d330..f30a4e564754 100644
|
||||
--
|
||||
2.39.2
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Date: Wed, 2 Aug 2023 00:27:32 +0000
|
||||
Subject: [PATCH] wifi: rtw88: sdio: Honor the host max_req_size in the RX path
|
||||
|
||||
Lukas reports skb_over_panic errors on his Banana Pi BPI-CM4 which comes
|
||||
with an Amlogic A311D (G12B) SoC and a RTL8822CS SDIO wifi/Bluetooth
|
||||
combo card. The error he observed is identical to what has been fixed
|
||||
in commit e967229ead0e ("wifi: rtw88: sdio: Check the HISR RX_REQUEST
|
||||
bit in rtw_sdio_rx_isr()") but that commit didn't fix Lukas' problem.
|
||||
|
||||
Lukas found that disabling or limiting RX aggregation fix the problem
|
||||
for him. In the following discussion a few key topics have been
|
||||
discussed which have an impact on this problem:
|
||||
- The Amlogic A311D (G12B) SoC has a hardware bug in the SDIO controller
|
||||
which prevents DMA transfers. Instead all transfers need to go through
|
||||
the controller SRAM which limits transfers to 1536 bytes
|
||||
- rtw88 chips don't split incoming (RX) packets, so if a big packet is
|
||||
received this is forwarded to the host in it's original form
|
||||
- rtw88 chips can do RX aggregation, meaning more multiple incoming
|
||||
packets can be pulled by the host from the card with one MMC/SDIO
|
||||
transfer. This Depends on settings in the REG_RXDMA_AGG_PG_TH
|
||||
register (BIT_RXDMA_AGG_PG_TH limits the number of packets that will
|
||||
be aggregated, BIT_DMA_AGG_TO_V1 configures a timeout for aggregation
|
||||
and BIT_EN_PRE_CALC makes the chip honor the limits more effectively)
|
||||
|
||||
Use multiple consecutive reads in rtw_sdio_read_port() to limit the
|
||||
number of bytes which are copied by the host from the card in one
|
||||
MMC/SDIO transfer. This allows receiving a buffer that's larger than
|
||||
the hosts max_req_size (number of bytes which can be transferred in
|
||||
one MMC/SDIO transfer). As a result of this the skb_over_panic error
|
||||
is gone as the rtw88 driver is now able to receive more than 1536 bytes
|
||||
from the card (either because the incoming packet is larger than that
|
||||
or because multiple packets have been aggregated).
|
||||
|
||||
Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets")
|
||||
Reported-by: Lukas F. Hartmann <lukas@mntre.com>
|
||||
Closes: https://lore.kernel.org/linux-wireless/CAFBinCBaXtebixKbjkWKW_WXc5k=NdGNaGUjVE8NCPNxOhsb2g@mail.gmail.com/
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 24 +++++++++++++++++------
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 2c1fb2dabd40..b19262ec5d8c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -500,19 +500,31 @@ static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
|
||||
static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
|
||||
{
|
||||
struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
|
||||
+ struct mmc_host *host = rtwsdio->sdio_func->card->host;
|
||||
bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
|
||||
u32 rxaddr = rtwsdio->rx_addr++;
|
||||
+ size_t bytes;
|
||||
int ret;
|
||||
|
||||
if (bus_claim)
|
||||
sdio_claim_host(rtwsdio->sdio_func);
|
||||
|
||||
- ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
- RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count);
|
||||
- if (ret)
|
||||
- rtw_warn(rtwdev,
|
||||
- "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
- count, rxaddr);
|
||||
+ while (count > 0) {
|
||||
+ bytes = min_t(size_t, host->max_req_size, count);
|
||||
+
|
||||
+ ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
+ RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr),
|
||||
+ bytes);
|
||||
+ if (ret) {
|
||||
+ rtw_warn(rtwdev,
|
||||
+ "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
+ bytes, rxaddr);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ count -= bytes;
|
||||
+ buf += bytes;
|
||||
+ }
|
||||
|
||||
if (bus_claim)
|
||||
sdio_release_host(rtwsdio->sdio_func);
|
||||
--
|
||||
2.41.0
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1299,3 +1299,135 @@ index c653accdc7fd..7fada7a714fe 100644
|
||||
--
|
||||
2.39.2
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Date: Wed, 2 Aug 2023 00:27:32 +0000
|
||||
Subject: [PATCH] wifi: rtw88: sdio: Honor the host max_req_size in the RX path
|
||||
|
||||
Lukas reports skb_over_panic errors on his Banana Pi BPI-CM4 which comes
|
||||
with an Amlogic A311D (G12B) SoC and a RTL8822CS SDIO wifi/Bluetooth
|
||||
combo card. The error he observed is identical to what has been fixed
|
||||
in commit e967229ead0e ("wifi: rtw88: sdio: Check the HISR RX_REQUEST
|
||||
bit in rtw_sdio_rx_isr()") but that commit didn't fix Lukas' problem.
|
||||
|
||||
Lukas found that disabling or limiting RX aggregation fix the problem
|
||||
for him. In the following discussion a few key topics have been
|
||||
discussed which have an impact on this problem:
|
||||
- The Amlogic A311D (G12B) SoC has a hardware bug in the SDIO controller
|
||||
which prevents DMA transfers. Instead all transfers need to go through
|
||||
the controller SRAM which limits transfers to 1536 bytes
|
||||
- rtw88 chips don't split incoming (RX) packets, so if a big packet is
|
||||
received this is forwarded to the host in it's original form
|
||||
- rtw88 chips can do RX aggregation, meaning more multiple incoming
|
||||
packets can be pulled by the host from the card with one MMC/SDIO
|
||||
transfer. This Depends on settings in the REG_RXDMA_AGG_PG_TH
|
||||
register (BIT_RXDMA_AGG_PG_TH limits the number of packets that will
|
||||
be aggregated, BIT_DMA_AGG_TO_V1 configures a timeout for aggregation
|
||||
and BIT_EN_PRE_CALC makes the chip honor the limits more effectively)
|
||||
|
||||
Use multiple consecutive reads in rtw_sdio_read_port() to limit the
|
||||
number of bytes which are copied by the host from the card in one
|
||||
MMC/SDIO transfer. This allows receiving a buffer that's larger than
|
||||
the hosts max_req_size (number of bytes which can be transferred in
|
||||
one MMC/SDIO transfer). As a result of this the skb_over_panic error
|
||||
is gone as the rtw88 driver is now able to receive more than 1536 bytes
|
||||
from the card (either because the incoming packet is larger than that
|
||||
or because multiple packets have been aggregated).
|
||||
|
||||
Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets")
|
||||
Reported-by: Lukas F. Hartmann <lukas@mntre.com>
|
||||
Closes: https://lore.kernel.org/linux-wireless/CAFBinCBaXtebixKbjkWKW_WXc5k=NdGNaGUjVE8NCPNxOhsb2g@mail.gmail.com/
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 24 +++++++++++++++++------
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 2c1fb2dabd40..b19262ec5d8c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -500,19 +500,31 @@ static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
|
||||
static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
|
||||
{
|
||||
struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
|
||||
+ struct mmc_host *host = rtwsdio->sdio_func->card->host;
|
||||
bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
|
||||
u32 rxaddr = rtwsdio->rx_addr++;
|
||||
+ size_t bytes;
|
||||
int ret;
|
||||
|
||||
if (bus_claim)
|
||||
sdio_claim_host(rtwsdio->sdio_func);
|
||||
|
||||
- ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
- RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count);
|
||||
- if (ret)
|
||||
- rtw_warn(rtwdev,
|
||||
- "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
- count, rxaddr);
|
||||
+ while (count > 0) {
|
||||
+ bytes = min_t(size_t, host->max_req_size, count);
|
||||
+
|
||||
+ ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
+ RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr),
|
||||
+ bytes);
|
||||
+ if (ret) {
|
||||
+ rtw_warn(rtwdev,
|
||||
+ "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
+ bytes, rxaddr);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ count -= bytes;
|
||||
+ buf += bytes;
|
||||
+ }
|
||||
|
||||
if (bus_claim)
|
||||
sdio_release_host(rtwsdio->sdio_func);
|
||||
--
|
||||
2.41.0
|
||||
|
||||
From 248429fc23232f218d5bd81120eafad70038bd5f Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
Date: Wed, 6 Sep 2023 21:42:18 -0400
|
||||
Subject: [PATCH] drivers: net: wireless: realtek: rtw88: usb-c
|
||||
|
||||
Remove duplicate label and correct goto err_release_hw placement.
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/usb.c: In function ‘rtw_usb_probe’:
|
||||
drivers/net/wireless/realtek/rtw88/usb.c:878:1: error: duplicate label ‘err_free_rx_bufs’
|
||||
878 | err_free_rx_bufs:
|
||||
|
||||
Signed-off-by: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 7f98668cf084..d879d7e3dc81 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -822,7 +822,7 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
ret = rtw_usb_alloc_rx_bufs(rtwusb);
|
||||
if (ret)
|
||||
- goto err_free_rx_bufs;
|
||||
+ goto err_release_hw;
|
||||
|
||||
ret = rtw_core_init(rtwdev);
|
||||
if (ret)
|
||||
@@ -875,9 +875,6 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
err_free_rx_bufs:
|
||||
rtw_usb_free_rx_bufs(rtwusb);
|
||||
|
||||
-err_free_rx_bufs:
|
||||
- rtw_usb_free_rx_bufs(rtwusb);
|
||||
-
|
||||
err_release_hw:
|
||||
ieee80211_free_hw(hw);
|
||||
|
||||
--
|
||||
2.39.2
|
||||
|
||||
|
||||
@ -1,132 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Date: Wed, 2 Aug 2023 00:27:32 +0000
|
||||
Subject: [PATCH] wifi: rtw88: sdio: Honor the host max_req_size in the RX path
|
||||
|
||||
Lukas reports skb_over_panic errors on his Banana Pi BPI-CM4 which comes
|
||||
with an Amlogic A311D (G12B) SoC and a RTL8822CS SDIO wifi/Bluetooth
|
||||
combo card. The error he observed is identical to what has been fixed
|
||||
in commit e967229ead0e ("wifi: rtw88: sdio: Check the HISR RX_REQUEST
|
||||
bit in rtw_sdio_rx_isr()") but that commit didn't fix Lukas' problem.
|
||||
|
||||
Lukas found that disabling or limiting RX aggregation fix the problem
|
||||
for him. In the following discussion a few key topics have been
|
||||
discussed which have an impact on this problem:
|
||||
- The Amlogic A311D (G12B) SoC has a hardware bug in the SDIO controller
|
||||
which prevents DMA transfers. Instead all transfers need to go through
|
||||
the controller SRAM which limits transfers to 1536 bytes
|
||||
- rtw88 chips don't split incoming (RX) packets, so if a big packet is
|
||||
received this is forwarded to the host in it's original form
|
||||
- rtw88 chips can do RX aggregation, meaning more multiple incoming
|
||||
packets can be pulled by the host from the card with one MMC/SDIO
|
||||
transfer. This Depends on settings in the REG_RXDMA_AGG_PG_TH
|
||||
register (BIT_RXDMA_AGG_PG_TH limits the number of packets that will
|
||||
be aggregated, BIT_DMA_AGG_TO_V1 configures a timeout for aggregation
|
||||
and BIT_EN_PRE_CALC makes the chip honor the limits more effectively)
|
||||
|
||||
Use multiple consecutive reads in rtw_sdio_read_port() to limit the
|
||||
number of bytes which are copied by the host from the card in one
|
||||
MMC/SDIO transfer. This allows receiving a buffer that's larger than
|
||||
the hosts max_req_size (number of bytes which can be transferred in
|
||||
one MMC/SDIO transfer). As a result of this the skb_over_panic error
|
||||
is gone as the rtw88 driver is now able to receive more than 1536 bytes
|
||||
from the card (either because the incoming packet is larger than that
|
||||
or because multiple packets have been aggregated).
|
||||
|
||||
Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets")
|
||||
Reported-by: Lukas F. Hartmann <lukas@mntre.com>
|
||||
Closes: https://lore.kernel.org/linux-wireless/CAFBinCBaXtebixKbjkWKW_WXc5k=NdGNaGUjVE8NCPNxOhsb2g@mail.gmail.com/
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 24 +++++++++++++++++------
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 2c1fb2dabd40..b19262ec5d8c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -500,19 +500,31 @@ static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
|
||||
static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
|
||||
{
|
||||
struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
|
||||
+ struct mmc_host *host = rtwsdio->sdio_func->card->host;
|
||||
bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
|
||||
u32 rxaddr = rtwsdio->rx_addr++;
|
||||
+ size_t bytes;
|
||||
int ret;
|
||||
|
||||
if (bus_claim)
|
||||
sdio_claim_host(rtwsdio->sdio_func);
|
||||
|
||||
- ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
- RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count);
|
||||
- if (ret)
|
||||
- rtw_warn(rtwdev,
|
||||
- "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
- count, rxaddr);
|
||||
+ while (count > 0) {
|
||||
+ bytes = min_t(size_t, host->max_req_size, count);
|
||||
+
|
||||
+ ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
+ RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr),
|
||||
+ bytes);
|
||||
+ if (ret) {
|
||||
+ rtw_warn(rtwdev,
|
||||
+ "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
+ bytes, rxaddr);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ count -= bytes;
|
||||
+ buf += bytes;
|
||||
+ }
|
||||
|
||||
if (bus_claim)
|
||||
sdio_release_host(rtwsdio->sdio_func);
|
||||
--
|
||||
2.41.0
|
||||
|
||||
From 248429fc23232f218d5bd81120eafad70038bd5f Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
Date: Wed, 6 Sep 2023 21:42:18 -0400
|
||||
Subject: [PATCH] drivers: net: wireless: realtek: rtw88: usb-c
|
||||
|
||||
Remove duplicate label and correct goto err_release_hw placement.
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/usb.c: In function ‘rtw_usb_probe’:
|
||||
drivers/net/wireless/realtek/rtw88/usb.c:878:1: error: duplicate label ‘err_free_rx_bufs’
|
||||
878 | err_free_rx_bufs:
|
||||
|
||||
Signed-off-by: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 7f98668cf084..d879d7e3dc81 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -822,7 +822,7 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
ret = rtw_usb_alloc_rx_bufs(rtwusb);
|
||||
if (ret)
|
||||
- goto err_free_rx_bufs;
|
||||
+ goto err_release_hw;
|
||||
|
||||
ret = rtw_core_init(rtwdev);
|
||||
if (ret)
|
||||
@@ -875,9 +875,6 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
err_free_rx_bufs:
|
||||
rtw_usb_free_rx_bufs(rtwusb);
|
||||
|
||||
-err_free_rx_bufs:
|
||||
- rtw_usb_free_rx_bufs(rtwusb);
|
||||
-
|
||||
err_release_hw:
|
||||
ieee80211_free_hw(hw);
|
||||
|
||||
--
|
||||
2.39.2
|
||||
|
||||
@ -328,3 +328,135 @@ index dc8965525400..f8399128a9a3 100644
|
||||
--
|
||||
2.39.2
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Date: Wed, 2 Aug 2023 00:27:32 +0000
|
||||
Subject: [PATCH] wifi: rtw88: sdio: Honor the host max_req_size in the RX path
|
||||
|
||||
Lukas reports skb_over_panic errors on his Banana Pi BPI-CM4 which comes
|
||||
with an Amlogic A311D (G12B) SoC and a RTL8822CS SDIO wifi/Bluetooth
|
||||
combo card. The error he observed is identical to what has been fixed
|
||||
in commit e967229ead0e ("wifi: rtw88: sdio: Check the HISR RX_REQUEST
|
||||
bit in rtw_sdio_rx_isr()") but that commit didn't fix Lukas' problem.
|
||||
|
||||
Lukas found that disabling or limiting RX aggregation fix the problem
|
||||
for him. In the following discussion a few key topics have been
|
||||
discussed which have an impact on this problem:
|
||||
- The Amlogic A311D (G12B) SoC has a hardware bug in the SDIO controller
|
||||
which prevents DMA transfers. Instead all transfers need to go through
|
||||
the controller SRAM which limits transfers to 1536 bytes
|
||||
- rtw88 chips don't split incoming (RX) packets, so if a big packet is
|
||||
received this is forwarded to the host in it's original form
|
||||
- rtw88 chips can do RX aggregation, meaning more multiple incoming
|
||||
packets can be pulled by the host from the card with one MMC/SDIO
|
||||
transfer. This Depends on settings in the REG_RXDMA_AGG_PG_TH
|
||||
register (BIT_RXDMA_AGG_PG_TH limits the number of packets that will
|
||||
be aggregated, BIT_DMA_AGG_TO_V1 configures a timeout for aggregation
|
||||
and BIT_EN_PRE_CALC makes the chip honor the limits more effectively)
|
||||
|
||||
Use multiple consecutive reads in rtw_sdio_read_port() to limit the
|
||||
number of bytes which are copied by the host from the card in one
|
||||
MMC/SDIO transfer. This allows receiving a buffer that's larger than
|
||||
the hosts max_req_size (number of bytes which can be transferred in
|
||||
one MMC/SDIO transfer). As a result of this the skb_over_panic error
|
||||
is gone as the rtw88 driver is now able to receive more than 1536 bytes
|
||||
from the card (either because the incoming packet is larger than that
|
||||
or because multiple packets have been aggregated).
|
||||
|
||||
Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets")
|
||||
Reported-by: Lukas F. Hartmann <lukas@mntre.com>
|
||||
Closes: https://lore.kernel.org/linux-wireless/CAFBinCBaXtebixKbjkWKW_WXc5k=NdGNaGUjVE8NCPNxOhsb2g@mail.gmail.com/
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 24 +++++++++++++++++------
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 2c1fb2dabd40..b19262ec5d8c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -500,19 +500,31 @@ static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
|
||||
static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
|
||||
{
|
||||
struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
|
||||
+ struct mmc_host *host = rtwsdio->sdio_func->card->host;
|
||||
bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
|
||||
u32 rxaddr = rtwsdio->rx_addr++;
|
||||
+ size_t bytes;
|
||||
int ret;
|
||||
|
||||
if (bus_claim)
|
||||
sdio_claim_host(rtwsdio->sdio_func);
|
||||
|
||||
- ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
- RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count);
|
||||
- if (ret)
|
||||
- rtw_warn(rtwdev,
|
||||
- "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
- count, rxaddr);
|
||||
+ while (count > 0) {
|
||||
+ bytes = min_t(size_t, host->max_req_size, count);
|
||||
+
|
||||
+ ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
+ RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr),
|
||||
+ bytes);
|
||||
+ if (ret) {
|
||||
+ rtw_warn(rtwdev,
|
||||
+ "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
+ bytes, rxaddr);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ count -= bytes;
|
||||
+ buf += bytes;
|
||||
+ }
|
||||
|
||||
if (bus_claim)
|
||||
sdio_release_host(rtwsdio->sdio_func);
|
||||
--
|
||||
2.41.0
|
||||
|
||||
From 248429fc23232f218d5bd81120eafad70038bd5f Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
Date: Wed, 6 Sep 2023 21:42:18 -0400
|
||||
Subject: [PATCH] drivers: net: wireless: realtek: rtw88: usb-c
|
||||
|
||||
Remove duplicate label and correct goto err_release_hw placement.
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/usb.c: In function ‘rtw_usb_probe’:
|
||||
drivers/net/wireless/realtek/rtw88/usb.c:878:1: error: duplicate label ‘err_free_rx_bufs’
|
||||
878 | err_free_rx_bufs:
|
||||
|
||||
Signed-off-by: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 7f98668cf084..d879d7e3dc81 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -822,7 +822,7 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
ret = rtw_usb_alloc_rx_bufs(rtwusb);
|
||||
if (ret)
|
||||
- goto err_free_rx_bufs;
|
||||
+ goto err_release_hw;
|
||||
|
||||
ret = rtw_core_init(rtwdev);
|
||||
if (ret)
|
||||
@@ -875,9 +875,6 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
err_free_rx_bufs:
|
||||
rtw_usb_free_rx_bufs(rtwusb);
|
||||
|
||||
-err_free_rx_bufs:
|
||||
- rtw_usb_free_rx_bufs(rtwusb);
|
||||
-
|
||||
err_release_hw:
|
||||
ieee80211_free_hw(hw);
|
||||
|
||||
--
|
||||
2.39.2
|
||||
|
||||
|
||||
@ -1,132 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Date: Wed, 2 Aug 2023 00:27:32 +0000
|
||||
Subject: [PATCH] wifi: rtw88: sdio: Honor the host max_req_size in the RX path
|
||||
|
||||
Lukas reports skb_over_panic errors on his Banana Pi BPI-CM4 which comes
|
||||
with an Amlogic A311D (G12B) SoC and a RTL8822CS SDIO wifi/Bluetooth
|
||||
combo card. The error he observed is identical to what has been fixed
|
||||
in commit e967229ead0e ("wifi: rtw88: sdio: Check the HISR RX_REQUEST
|
||||
bit in rtw_sdio_rx_isr()") but that commit didn't fix Lukas' problem.
|
||||
|
||||
Lukas found that disabling or limiting RX aggregation fix the problem
|
||||
for him. In the following discussion a few key topics have been
|
||||
discussed which have an impact on this problem:
|
||||
- The Amlogic A311D (G12B) SoC has a hardware bug in the SDIO controller
|
||||
which prevents DMA transfers. Instead all transfers need to go through
|
||||
the controller SRAM which limits transfers to 1536 bytes
|
||||
- rtw88 chips don't split incoming (RX) packets, so if a big packet is
|
||||
received this is forwarded to the host in it's original form
|
||||
- rtw88 chips can do RX aggregation, meaning more multiple incoming
|
||||
packets can be pulled by the host from the card with one MMC/SDIO
|
||||
transfer. This Depends on settings in the REG_RXDMA_AGG_PG_TH
|
||||
register (BIT_RXDMA_AGG_PG_TH limits the number of packets that will
|
||||
be aggregated, BIT_DMA_AGG_TO_V1 configures a timeout for aggregation
|
||||
and BIT_EN_PRE_CALC makes the chip honor the limits more effectively)
|
||||
|
||||
Use multiple consecutive reads in rtw_sdio_read_port() to limit the
|
||||
number of bytes which are copied by the host from the card in one
|
||||
MMC/SDIO transfer. This allows receiving a buffer that's larger than
|
||||
the hosts max_req_size (number of bytes which can be transferred in
|
||||
one MMC/SDIO transfer). As a result of this the skb_over_panic error
|
||||
is gone as the rtw88 driver is now able to receive more than 1536 bytes
|
||||
from the card (either because the incoming packet is larger than that
|
||||
or because multiple packets have been aggregated).
|
||||
|
||||
Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets")
|
||||
Reported-by: Lukas F. Hartmann <lukas@mntre.com>
|
||||
Closes: https://lore.kernel.org/linux-wireless/CAFBinCBaXtebixKbjkWKW_WXc5k=NdGNaGUjVE8NCPNxOhsb2g@mail.gmail.com/
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 24 +++++++++++++++++------
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 2c1fb2dabd40..b19262ec5d8c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -500,19 +500,31 @@ static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
|
||||
static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
|
||||
{
|
||||
struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
|
||||
+ struct mmc_host *host = rtwsdio->sdio_func->card->host;
|
||||
bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
|
||||
u32 rxaddr = rtwsdio->rx_addr++;
|
||||
+ size_t bytes;
|
||||
int ret;
|
||||
|
||||
if (bus_claim)
|
||||
sdio_claim_host(rtwsdio->sdio_func);
|
||||
|
||||
- ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
- RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr), count);
|
||||
- if (ret)
|
||||
- rtw_warn(rtwdev,
|
||||
- "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
- count, rxaddr);
|
||||
+ while (count > 0) {
|
||||
+ bytes = min_t(size_t, host->max_req_size, count);
|
||||
+
|
||||
+ ret = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
|
||||
+ RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr),
|
||||
+ bytes);
|
||||
+ if (ret) {
|
||||
+ rtw_warn(rtwdev,
|
||||
+ "Failed to read %zu byte(s) from SDIO port 0x%08x",
|
||||
+ bytes, rxaddr);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ count -= bytes;
|
||||
+ buf += bytes;
|
||||
+ }
|
||||
|
||||
if (bus_claim)
|
||||
sdio_release_host(rtwsdio->sdio_func);
|
||||
--
|
||||
2.41.0
|
||||
|
||||
From 248429fc23232f218d5bd81120eafad70038bd5f Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
Date: Wed, 6 Sep 2023 21:42:18 -0400
|
||||
Subject: [PATCH] drivers: net: wireless: realtek: rtw88: usb-c
|
||||
|
||||
Remove duplicate label and correct goto err_release_hw placement.
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/usb.c: In function ‘rtw_usb_probe’:
|
||||
drivers/net/wireless/realtek/rtw88/usb.c:878:1: error: duplicate label ‘err_free_rx_bufs’
|
||||
878 | err_free_rx_bufs:
|
||||
|
||||
Signed-off-by: Patrick Yavitz <pyavitz@xxxxx.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 7f98668cf084..d879d7e3dc81 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -822,7 +822,7 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
ret = rtw_usb_alloc_rx_bufs(rtwusb);
|
||||
if (ret)
|
||||
- goto err_free_rx_bufs;
|
||||
+ goto err_release_hw;
|
||||
|
||||
ret = rtw_core_init(rtwdev);
|
||||
if (ret)
|
||||
@@ -875,9 +875,6 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
err_free_rx_bufs:
|
||||
rtw_usb_free_rx_bufs(rtwusb);
|
||||
|
||||
-err_free_rx_bufs:
|
||||
- rtw_usb_free_rx_bufs(rtwusb);
|
||||
-
|
||||
err_release_hw:
|
||||
ieee80211_free_hw(hw);
|
||||
|
||||
--
|
||||
2.39.2
|
||||
|
||||
Loading…
Reference in New Issue
Block a user