mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 09:21:34 -04:00
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: 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
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user