Commit de9f9338 authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo
Browse files

wifi: rtw89: add chip_ops::query_rxdesc() and rxd_len as helpers to support newer chips



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: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230522122513.13559-2-pkshih@realtek.com
parent 14820388
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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)
+14 −0
Original line number Diff line number Diff line
@@ -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,
+4 −8
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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,
Loading