mirror of
https://github.com/libretro/Lakka-LibreELEC.git
synced 2025-02-12 16:18:11 +00:00
127 lines
4.9 KiB
Diff
127 lines
4.9 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(-)
|
|
|
|
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
|
index c26a6905fd15..364ec0436d0f 100644
|
|
--- 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(struct seq_file *m, void *v)
|
|
{
|
|
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;
|
|
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
|
index 19de5ba555a9..e6e9946fbf44 100644
|
|
--- 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(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
|
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_vifs(struct rtw_dev *rtwdev)
|
|
|
|
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(struct rtw_dev *rtwdev, u8 num_probes,
|
|
{
|
|
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))
|
|
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
|
index daf23ccf6378..cae9cca6dca3 100644
|
|
--- 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 *rtwdev)
|
|
|
|
/* 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
|
|
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
|
index 45f0e8fff453..ef82e60d5c19 100644
|
|
--- 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;
|
|
--
|
|
2.43.0
|
|
|