forked from Openwrt/openwrt
Backport support for RTL8812AU/RTL8821AU USB adapters Manually backported patch: 045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver Patches from 046 to 051 are pending. Signed-off-by: Marty Jones <mj8263788@gmail.com> Link: https://github.com/openwrt/openwrt/pull/17079 [Move BPAUTO_WANT_DEV_COREDUMP to original patch] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
116 lines
4.2 KiB
Diff
116 lines
4.2 KiB
Diff
From 82a617413e8545775ec03a1970809ac5f549ef32 Mon Sep 17 00:00:00 2001
|
|
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Date: Wed, 23 Oct 2024 17:12:06 +0300
|
|
Subject: [PATCH] wifi: rtw88: Support TX page sizes bigger than 128
|
|
|
|
All the chips supported so far have a TX page size of 128 bytes.
|
|
|
|
Change the type of the page_size member of struct rtw_chip_info from u8
|
|
to u16 in order to support RTL8821AU (page size of 256 bytes) and
|
|
RTL8812AU (page size of 512 bytes). Also change the types of several
|
|
related variables and function parameters from u8 to u16.
|
|
|
|
The TX page size is used, among other things, to construct the beacon,
|
|
null data, QOS null data, and PS poll templates which are uploaded to
|
|
the chip's reserved page. Each template needs to be aligned on a
|
|
multiple of the TX page size. Power saving can't work if the TX page
|
|
size is wrong.
|
|
|
|
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Link: https://patch.msgid.link/acdefbb1-3daf-4349-9e03-9472754d5f1e@gmail.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw88/debug.c | 2 +-
|
|
drivers/net/wireless/realtek/rtw88/fw.c | 21 +++++++++++----------
|
|
drivers/net/wireless/realtek/rtw88/mac.c | 2 +-
|
|
drivers/net/wireless/realtek/rtw88/main.h | 2 +-
|
|
4 files changed, 14 insertions(+), 13 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/debug.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
|
|
@@ -308,7 +308,7 @@ static int rtw_debugfs_get_rsvd_page(str
|
|
{
|
|
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
|
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
|
- u8 page_size = rtwdev->chip->page_size;
|
|
+ u16 page_size = rtwdev->chip->page_size;
|
|
u32 buf_size = debugfs_priv->rsvd_page.page_num * page_size;
|
|
u32 offset = debugfs_priv->rsvd_page.page_offset * page_size;
|
|
u8 *buf;
|
|
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
|
@@ -1293,13 +1293,13 @@ static void rtw_fill_rsvd_page_desc(stru
|
|
rtw_tx_fill_tx_desc(rtwdev, &pkt_info, skb);
|
|
}
|
|
|
|
-static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
|
|
+static inline u8 rtw_len_to_page(unsigned int len, u16 page_size)
|
|
{
|
|
return DIV_ROUND_UP(len, page_size);
|
|
}
|
|
|
|
-static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 page_size,
|
|
- u8 page_margin, u32 page, u8 *buf,
|
|
+static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u16 page_size,
|
|
+ u16 page_margin, u32 page, u8 *buf,
|
|
struct rtw_rsvd_page *rsvd_pkt)
|
|
{
|
|
struct sk_buff *skb = rsvd_pkt->skb;
|
|
@@ -1601,13 +1601,13 @@ static int __rtw_build_rsvd_page_from_v
|
|
|
|
static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size)
|
|
{
|
|
- struct ieee80211_hw *hw = rtwdev->hw;
|
|
const struct rtw_chip_info *chip = rtwdev->chip;
|
|
- struct sk_buff *iter;
|
|
+ struct ieee80211_hw *hw = rtwdev->hw;
|
|
struct rtw_rsvd_page *rsvd_pkt;
|
|
- u32 page = 0;
|
|
+ struct sk_buff *iter;
|
|
+ u16 page_size, page_margin, tx_desc_sz;
|
|
u8 total_page = 0;
|
|
- u8 page_size, page_margin, tx_desc_sz;
|
|
+ u32 page = 0;
|
|
u8 *buf;
|
|
int ret;
|
|
|
|
@@ -2013,12 +2013,13 @@ static int _rtw_hw_scan_update_probe_req
|
|
{
|
|
const struct rtw_chip_info *chip = rtwdev->chip;
|
|
struct sk_buff *skb, *tmp;
|
|
- u8 page_offset = 1, *buf, page_size = chip->page_size;
|
|
u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
|
|
- u16 buf_offset = page_size * page_offset;
|
|
u8 tx_desc_sz = chip->tx_pkt_desc_sz;
|
|
- u8 page_cnt, pages;
|
|
+ u16 page_size = chip->page_size;
|
|
+ u8 page_offset = 1, *buf;
|
|
+ u16 buf_offset = page_size * page_offset;
|
|
unsigned int pkt_len;
|
|
+ u8 page_cnt, pages;
|
|
int ret;
|
|
|
|
if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
|
|
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
|
@@ -1138,7 +1138,7 @@ int rtw_set_trx_fifo_info(struct rtw_dev
|
|
|
|
/* config rsvd page num */
|
|
fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num;
|
|
- fifo->txff_pg_num = chip->txff_size >> 7;
|
|
+ fifo->txff_pg_num = chip->txff_size / chip->page_size;
|
|
if (rtw_chip_wcpu_11n(rtwdev))
|
|
fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num;
|
|
else
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
|
@@ -1187,7 +1187,7 @@ struct rtw_chip_info {
|
|
u32 fw_rxff_size;
|
|
u16 rsvd_drv_pg_num;
|
|
u8 band;
|
|
- u8 page_size;
|
|
+ u16 page_size;
|
|
u8 csi_buf_pg_num;
|
|
u8 dig_max;
|
|
u8 dig_min;
|