]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw88: Support TX page sizes bigger than 128
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Wed, 23 Oct 2024 14:12:06 +0000 (17:12 +0300)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 29 Oct 2024 03:59:53 +0000 (11:59 +0800)
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
drivers/net/wireless/realtek/rtw88/fw.c
drivers/net/wireless/realtek/rtw88/mac.c
drivers/net/wireless/realtek/rtw88/main.h

index c26a6905fd15ad1d9b834436260c7a48f8a4b905..364ec0436d0fe854427179806b38094f4185f2b6 100644 (file)
@@ -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;
index 19de5ba555a9e0741e213792e6c280e332a6bd14..e6e9946fbf44e44a2f6f7283addee75831dbddc6 100644 (file)
@@ -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))
index daf23ccf63783b73b653356cdbe2c27c23dc7354..cae9cca6dca3d8f38f5324bbc7b24742f87b9be6 100644 (file)
@@ -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
index 45f0e8fff4538356f30af2f71715c38235eb138f..ef82e60d5c19fc77125f161d22f76cef37d7edbb 100644 (file)
@@ -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;