mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 04:56:13 +02:00
wifi: rtw89: add H2C command of TX time for WiFi 7 chips
BT-coexistence configure WiFi TX time to share time slots with Bluetooth devices. Since the format is different from WiFi 6 chips, add the new format accordingly. Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Link: https://patch.msgid.link/20250217063053.38936-3-pkshih@realtek.com
This commit is contained in:
parent
a5b8fd3f07
commit
c852d2abee
|
|
@ -3676,6 +3676,8 @@ struct rtw89_chip_ops {
|
|||
int (*h2c_ampdu_cmac_tbl)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int (*h2c_txtime_cmac_tbl)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int (*h2c_default_dmac_tbl)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
|
|
|
|||
|
|
@ -3574,6 +3574,61 @@ int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_fw_h2c_txtime_cmac_tbl);
|
||||
|
||||
int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
struct rtw89_h2c_cctlinfo_ud_g7 *h2c;
|
||||
u32 len = sizeof(*h2c);
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
|
||||
if (!skb) {
|
||||
rtw89_err(rtwdev, "failed to alloc skb for txtime_cmac_g7\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
skb_put(skb, len);
|
||||
h2c = (struct rtw89_h2c_cctlinfo_ud_g7 *)skb->data;
|
||||
|
||||
h2c->c0 = le32_encode_bits(rtwsta_link->mac_id, CCTLINFO_G7_C0_MACID) |
|
||||
le32_encode_bits(1, CCTLINFO_G7_C0_OP);
|
||||
|
||||
if (rtwsta_link->cctl_tx_time) {
|
||||
h2c->w3 |= le32_encode_bits(1, CCTLINFO_G7_W3_AMPDU_TIME_SEL);
|
||||
h2c->m3 |= cpu_to_le32(CCTLINFO_G7_W3_AMPDU_TIME_SEL);
|
||||
|
||||
h2c->w2 |= le32_encode_bits(rtwsta_link->ampdu_max_time,
|
||||
CCTLINFO_G7_W2_AMPDU_MAX_TIME);
|
||||
h2c->m2 |= cpu_to_le32(CCTLINFO_G7_W2_AMPDU_MAX_TIME);
|
||||
}
|
||||
if (rtwsta_link->cctl_tx_retry_limit) {
|
||||
h2c->w2 |= le32_encode_bits(1, CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL) |
|
||||
le32_encode_bits(rtwsta_link->data_tx_cnt_lmt,
|
||||
CCTLINFO_G7_W2_DATA_TX_CNT_LMT);
|
||||
h2c->m2 |= cpu_to_le32(CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL |
|
||||
CCTLINFO_G7_W2_DATA_TX_CNT_LMT);
|
||||
}
|
||||
|
||||
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
|
||||
H2C_CAT_MAC, H2C_CL_MAC_FR_EXCHG,
|
||||
H2C_FUNC_MAC_CCTLINFO_UD_G7, 0, 1,
|
||||
len);
|
||||
|
||||
ret = rtw89_h2c_tx(rtwdev, skb, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to send h2c\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_fw_h2c_txtime_cmac_tbl_g7);
|
||||
|
||||
int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
|
|
|
|||
|
|
@ -4588,6 +4588,8 @@ int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
|||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
|
|
@ -4869,6 +4871,15 @@ static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int rtw89_chip_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return chip->ops->h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
}
|
||||
|
||||
static inline
|
||||
int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
bool valid, struct ieee80211_ampdu_params *params)
|
||||
|
|
|
|||
|
|
@ -6441,7 +6441,7 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
|
|||
|
||||
if (rtwsta_link->cctl_tx_time) {
|
||||
rtwsta_link->ampdu_max_time = (max_tx_time - 512) >> 9;
|
||||
ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
} else {
|
||||
ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL);
|
||||
if (ret) {
|
||||
|
|
@ -6507,9 +6507,9 @@ int rtw89_mac_set_tx_retry_limit(struct rtw89_dev *rtwdev,
|
|||
|
||||
if (!resume) {
|
||||
rtwsta_link->cctl_tx_retry_limit = true;
|
||||
ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
} else {
|
||||
ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
|
||||
rtwsta_link->cctl_tx_retry_limit = false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2423,6 +2423,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
|
|||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
|
|
|||
|
|
@ -2149,6 +2149,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
|
|||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
|
|
|||
|
|
@ -776,6 +776,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
|
|||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
|
|
|||
|
|
@ -710,6 +710,7 @@ static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
|
|||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
|
|
|||
|
|
@ -2941,6 +2941,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
|||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
|
|
|||
|
|
@ -2702,6 +2702,7 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
|
|||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl_g7,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl_g7,
|
||||
.h2c_ampdu_cmac_tbl = rtw89_fw_h2c_ampdu_cmac_tbl_g7,
|
||||
.h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl_g7,
|
||||
.h2c_default_dmac_tbl = rtw89_fw_h2c_default_dmac_tbl_v2,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon_be,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam_v1,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user