wifi: rtw89: add reserved size as factor of DLE used size
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 24 Nov 2023 07:16:58 +0000 (15:16 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 1 Dec 2023 12:39:29 +0000 (14:39 +0200)
DLE stands for Double Link Engine that is used to maintain buffer page.
To avoid linking to wrong pages, we check the used page size during
initialization and stop driver probe if the used size is unexpected.

Currently, we check the page size used by PLE (payload engine) and WDE
(WiFi descriptor engine). For coming WiFi 7 chips, additional reserved
size is added for BB as buffer to run LA mode, so add and check the
reserved size as well.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20231124071703.132549-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c

index ac14865a114a4ec760e07fbb4de036847e0fa986..bdd9c152951f05de4c2bbfb3225146221a44daf3 100644 (file)
@@ -1672,11 +1672,21 @@ static bool mac_is_txq_empty(struct rtw89_dev *rtwdev)
        return (val32 & msk32) == msk32;
 }
 
-static inline u32 dle_used_size(const struct rtw89_dle_size *wde,
-                               const struct rtw89_dle_size *ple)
+static inline u32 dle_used_size(const struct rtw89_dle_mem *cfg)
 {
-       return wde->pge_size * (wde->lnk_pge_num + wde->unlnk_pge_num) +
+       const struct rtw89_dle_size *wde = cfg->wde_size;
+       const struct rtw89_dle_size *ple = cfg->ple_size;
+       u32 used;
+
+       used = wde->pge_size * (wde->lnk_pge_num + wde->unlnk_pge_num) +
               ple->pge_size * (ple->lnk_pge_num + ple->unlnk_pge_num);
+
+       if (cfg->rsvd0_size && cfg->rsvd1_size) {
+               used += cfg->rsvd0_size->size;
+               used += cfg->rsvd1_size->size;
+       }
+
+       return used;
 }
 
 static u32 dle_expected_used_size(struct rtw89_dev *rtwdev,
@@ -1898,8 +1908,7 @@ static int dle_init(struct rtw89_dev *rtwdev, enum rtw89_qta_mode mode,
                ext_wde_min_qt_wcpu = ext_cfg->wde_min_qt->wcpu;
        }
 
-       if (dle_used_size(cfg->wde_size, cfg->ple_size) !=
-           dle_expected_used_size(rtwdev, mode)) {
+       if (dle_used_size(cfg) != dle_expected_used_size(rtwdev, mode)) {
                rtw89_err(rtwdev, "[ERR]wd/dle mem cfg\n");
                ret = -EINVAL;
                goto error;
@@ -3037,8 +3046,7 @@ static int dle_quota_change(struct rtw89_dev *rtwdev, enum rtw89_qta_mode mode)
                return -EINVAL;
        }
 
-       if (dle_used_size(cfg->wde_size, cfg->ple_size) !=
-           dle_expected_used_size(rtwdev, mode)) {
+       if (dle_used_size(cfg) != dle_expected_used_size(rtwdev, mode)) {
                rtw89_err(rtwdev, "[ERR]wd/dle mem cfg\n");
                return -EINVAL;
        }