wifi: rtw89: check DLE FIFO size with reserved size
authorPing-Ke Shih <pkshih@realtek.com>
Tue, 27 Sep 2022 06:26:10 +0000 (14:26 +0800)
committerKalle Valo <kvalo@kernel.org>
Wed, 28 Sep 2022 06:45:59 +0000 (09:45 +0300)
For SCC mode, some FIFO are reserved, so compare the quantity after minus
the reserved size.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220927062611.30484-9-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c

index be01350ee0e29063b84af8af3dc9001d49931293..db041b32a8c2cf5a7eb0236ca7e4ee09ead21529 100644 (file)
@@ -2612,6 +2612,7 @@ struct rtw89_chip_info {
        const struct rtw89_chip_ops *ops;
        const char *fw_name;
        u32 fifo_size;
+       u32 dle_scc_rsvd_size;
        u16 max_amsdu_limit;
        bool dis_2g_40m_ul_ofdma;
        u32 rsvd_ple_ofst;
index 8fd70730689f8454ba9f70662e23f8775c57bc02..892fdb7f090efa7b5ef222e51d8c1de580f8891a 100644 (file)
@@ -1324,6 +1324,17 @@ static inline u32 dle_used_size(const struct rtw89_dle_size *wde,
               ple->pge_size * (ple->lnk_pge_num + ple->unlnk_pge_num);
 }
 
+static u32 dle_expected_used_size(struct rtw89_dev *rtwdev,
+                                 enum rtw89_qta_mode mode)
+{
+       u32 size = rtwdev->chip->fifo_size;
+
+       if (mode == RTW89_QTA_SCC)
+               size -= rtwdev->chip->dle_scc_rsvd_size;
+
+       return size;
+}
+
 static void dle_func_en(struct rtw89_dev *rtwdev, bool enable)
 {
        if (enable)
@@ -1491,7 +1502,8 @@ 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) != rtwdev->chip->fifo_size) {
+       if (dle_used_size(cfg->wde_size, cfg->ple_size) !=
+           dle_expected_used_size(rtwdev, mode)) {
                rtw89_err(rtwdev, "[ERR]wd/dle mem cfg\n");
                ret = -EINVAL;
                goto error;
@@ -2604,7 +2616,8 @@ 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) != rtwdev->chip->fifo_size) {
+       if (dle_used_size(cfg->wde_size, cfg->ple_size) !=
+           dle_expected_used_size(rtwdev, mode)) {
                rtw89_err(rtwdev, "[ERR]wd/dle mem cfg\n");
                return -EINVAL;
        }
index 948a2027ed69c4f75f519d9c0a579c5fa30b1bcf..78414768035356bde880c2dfd44414b6fe467382 100644 (file)
@@ -2190,6 +2190,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
        .ops                    = &rtw8852a_chip_ops,
        .fw_name                = "rtw89/rtw8852a_fw.bin",
        .fifo_size              = 458752,
+       .dle_scc_rsvd_size      = 0,
        .max_amsdu_limit        = 3500,
        .dis_2g_40m_ul_ofdma    = true,
        .rsvd_ple_ofst          = 0x6f800,
index 799da0c9f75ad9601ec1c8cf835c7cb6cee98530..8428614a3b150a4360bbf7d707c7ad688a40e83c 100644 (file)
@@ -66,6 +66,8 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
 
 const struct rtw89_chip_info rtw8852b_chip_info = {
        .chip_id                = RTL8852B,
+       .fifo_size              = 196608,
+       .dle_scc_rsvd_size      = 98304,
        .dma_ch_mask            = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
                                  BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
                                  BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
index c8c0d68e1601475980d472f65719f5373db527a3..67653b3e1a356f4e50b186dae3f87b2788670e42 100644 (file)
@@ -3039,6 +3039,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .ops                    = &rtw8852c_chip_ops,
        .fw_name                = "rtw89/rtw8852c_fw.bin",
        .fifo_size              = 458752,
+       .dle_scc_rsvd_size      = 0,
        .max_amsdu_limit        = 8000,
        .dis_2g_40m_ul_ofdma    = false,
        .rsvd_ple_ofst          = 0x6f800,