wifi: rtw89: add chip_ops::query_rxdesc() and rxd_len as helpers to support newer...
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 22 May 2023 12:25:09 +0000 (20:25 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 25 May 2023 16:13:13 +0000 (19:13 +0300)
The next generation chips use different RX descriptor format, so add
a chip_ops to hook suitable handlers. Also, the length of RX descriptor is
different, so add a variable to store the length according to chip and
descriptor content dynamically. Then, the code can be more general.

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

index fbcb9b6e6f754cb1a53d978928c1579d91213879..ae547b38dfaa8152921c0ed5b82d88fba7a15ae2 100644 (file)
@@ -1819,6 +1819,10 @@ void rtw89_core_query_rxdesc(struct rtw89_dev *rtwdev,
        shift_len = desc_info->shift << 1; /* 2-byte unit */
        drv_info_len = desc_info->drv_info_size << 3; /* 8-byte unit */
        desc_info->offset = data_offset + shift_len + drv_info_len;
+       if (desc_info->long_rxdesc)
+               desc_info->rxd_len = sizeof(struct rtw89_rxdesc_long);
+       else
+               desc_info->rxd_len = sizeof(struct rtw89_rxdesc_short);
        desc_info->ready = true;
 
        if (!desc_info->long_rxdesc)
index ce6fc18dbfc76ed605223d0bae732b7914cc195f..7b0e780c8a02555520ac6024ae91f68dc6e1ad25 100644 (file)
@@ -776,6 +776,7 @@ struct rtw89_rx_desc_info {
        u8 sec_cam_id;
        u8 mac_id;
        u16 offset;
+       u16 rxd_len;
        bool ready;
 };
 
@@ -2824,6 +2825,9 @@ struct rtw89_chip_ops {
                                       s8 pw_ofst, enum rtw89_mac_idx mac_idx);
        int (*pwr_on_func)(struct rtw89_dev *rtwdev);
        int (*pwr_off_func)(struct rtw89_dev *rtwdev);
+       void (*query_rxdesc)(struct rtw89_dev *rtwdev,
+                            struct rtw89_rx_desc_info *desc_info,
+                            u8 *data, u32 data_offset);
        void (*fill_txdesc)(struct rtw89_dev *rtwdev,
                            struct rtw89_tx_desc_info *desc_info,
                            void *txdesc);
@@ -4855,6 +4859,16 @@ static inline void rtw89_ctrl_btg(struct rtw89_dev *rtwdev, bool btg)
                chip->ops->ctrl_btg(rtwdev, btg);
 }
 
+static inline
+void rtw89_chip_query_rxdesc(struct rtw89_dev *rtwdev,
+                            struct rtw89_rx_desc_info *desc_info,
+                            u8 *data, u32 data_offset)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       chip->ops->query_rxdesc(rtwdev, desc_info, data, data_offset);
+}
+
 static inline
 void rtw89_chip_fill_txdesc(struct rtw89_dev *rtwdev,
                            struct rtw89_tx_desc_info *desc_info,
index 92bfef942d3a93e44af4f2c30c253d664467ad9e..9402f1a0caea8aa35c8e85804523adb37c37e75c 100644 (file)
@@ -265,7 +265,7 @@ static u32 rtw89_pci_rxbd_deliver_skbs(struct rtw89_dev *rtwdev,
                        goto err_sync_device;
                }
 
-               rtw89_core_query_rxdesc(rtwdev, desc_info, skb->data, rxinfo_size);
+               rtw89_chip_query_rxdesc(rtwdev, desc_info, skb->data, rxinfo_size);
 
                new = rtw89_alloc_skb_for_rx(rtwdev, desc_info->pkt_size);
                if (!new)
@@ -274,9 +274,7 @@ static u32 rtw89_pci_rxbd_deliver_skbs(struct rtw89_dev *rtwdev,
                rx_ring->diliver_skb = new;
 
                /* first segment has RX desc */
-               offset = desc_info->offset;
-               offset += desc_info->long_rxdesc ? sizeof(struct rtw89_rxdesc_long) :
-                         sizeof(struct rtw89_rxdesc_short);
+               offset = desc_info->offset + desc_info->rxd_len;
        } else {
                offset = sizeof(struct rtw89_pci_rxbd_info);
                if (!new) {
@@ -546,12 +544,10 @@ static u32 rtw89_pci_release_tx_skbs(struct rtw89_dev *rtwdev,
                return cnt;
        }
 
-       rtw89_core_query_rxdesc(rtwdev, &desc_info, skb->data, rxinfo_size);
+       rtw89_chip_query_rxdesc(rtwdev, &desc_info, skb->data, rxinfo_size);
 
        /* first segment has RX desc */
-       offset = desc_info.offset;
-       offset += desc_info.long_rxdesc ? sizeof(struct rtw89_rxdesc_long) :
-                                         sizeof(struct rtw89_rxdesc_short);
+       offset = desc_info.offset + desc_info.rxd_len;
        for (; offset + rpp_size <= rx_info->len; offset += rpp_size) {
                rpp = (struct rtw89_pci_rpp_fmt *)(skb->data + offset);
                rtw89_pci_release_rpp(rtwdev, rpp);
index eb98d4adc306b057e63dd152db78aa5557e39aeb..c4254e051be05f9ba6cacb0112069eebc011ed67 100644 (file)
@@ -2298,6 +2298,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
        .set_txpwr_ul_tb_offset = rtw8851b_set_txpwr_ul_tb_offset,
        .pwr_on_func            = rtw8851b_pwr_on_func,
        .pwr_off_func           = rtw8851b_pwr_off_func,
+       .query_rxdesc           = rtw89_core_query_rxdesc,
        .fill_txdesc            = rtw89_core_fill_txdesc,
        .fill_txdesc_fwcmd      = rtw89_core_fill_txdesc,
        .cfg_ctrl_path          = rtw89_mac_cfg_ctrl_path,
index 541ad2f4b0c2bce6c3556c82be4531cf74b04ddc..559835ce86bb6ae105ae3c6d55da5366ab13f541 100644 (file)
@@ -2050,6 +2050,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .set_txpwr_ul_tb_offset = rtw8852a_set_txpwr_ul_tb_offset,
        .pwr_on_func            = NULL,
        .pwr_off_func           = NULL,
+       .query_rxdesc           = rtw89_core_query_rxdesc,
        .fill_txdesc            = rtw89_core_fill_txdesc,
        .fill_txdesc_fwcmd      = rtw89_core_fill_txdesc,
        .cfg_ctrl_path          = rtw89_mac_cfg_ctrl_path,
index 4e4023f114ec815b73039ad0b5d48c8bcfed85bd..2a143751abc5fbabd14b50902e907e78961c5e9c 100644 (file)
@@ -2472,6 +2472,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
        .set_txpwr_ul_tb_offset = rtw8852b_set_txpwr_ul_tb_offset,
        .pwr_on_func            = rtw8852b_pwr_on_func,
        .pwr_off_func           = rtw8852b_pwr_off_func,
+       .query_rxdesc           = rtw89_core_query_rxdesc,
        .fill_txdesc            = rtw89_core_fill_txdesc,
        .fill_txdesc_fwcmd      = rtw89_core_fill_txdesc,
        .cfg_ctrl_path          = rtw89_mac_cfg_ctrl_path,
index e4c984c87d6cc14a3e09372f1c21a4bbae731de1..9c7c9812d4f45685031ed6c0bf6c78f35a4e12be 100644 (file)
@@ -2780,6 +2780,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset,
        .pwr_on_func            = rtw8852c_pwr_on_func,
        .pwr_off_func           = rtw8852c_pwr_off_func,
+       .query_rxdesc           = rtw89_core_query_rxdesc,
        .fill_txdesc            = rtw89_core_fill_txdesc_v1,
        .fill_txdesc_fwcmd      = rtw89_core_fill_txdesc_fwcmd_v1,
        .cfg_ctrl_path          = rtw89_mac_cfg_ctrl_path_v1,