Commit 5b70ec60 authored by Aloka Dixit's avatar Aloka Dixit Committed by Kalle Valo

wifi: ath12k: add WMI support for EHT peer

Add new WMI tag and pass the EHT parameters for peer association
to firmware.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Signed-off-by: default avatarAloka Dixit <quic_alokad@quicinc.com>
Signed-off-by: default avatarPradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230725224034.14045-8-quic_alokad@quicinc.com
parent 17bbb8aa
...@@ -1801,6 +1801,7 @@ static void ath12k_wmi_copy_peer_flags(struct wmi_peer_assoc_complete_cmd *cmd, ...@@ -1801,6 +1801,7 @@ static void ath12k_wmi_copy_peer_flags(struct wmi_peer_assoc_complete_cmd *cmd,
bool hw_crypto_disabled) bool hw_crypto_disabled)
{ {
cmd->peer_flags = 0; cmd->peer_flags = 0;
cmd->peer_flags_ext = 0;
if (arg->is_wme_set) { if (arg->is_wme_set) {
if (arg->qos_flag) if (arg->qos_flag)
...@@ -1842,6 +1843,8 @@ static void ath12k_wmi_copy_peer_flags(struct wmi_peer_assoc_complete_cmd *cmd, ...@@ -1842,6 +1843,8 @@ static void ath12k_wmi_copy_peer_flags(struct wmi_peer_assoc_complete_cmd *cmd,
cmd->peer_flags |= cpu_to_le32(WMI_PEER_TWT_REQ); cmd->peer_flags |= cpu_to_le32(WMI_PEER_TWT_REQ);
if (arg->twt_responder) if (arg->twt_responder)
cmd->peer_flags |= cpu_to_le32(WMI_PEER_TWT_RESP); cmd->peer_flags |= cpu_to_le32(WMI_PEER_TWT_RESP);
if (arg->eht_flag)
cmd->peer_flags_ext |= cpu_to_le32(WMI_PEER_EXT_EHT);
} }
/* Suppress authorization for all AUTH modes that need 4-way handshake /* Suppress authorization for all AUTH modes that need 4-way handshake
...@@ -1886,6 +1889,7 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, ...@@ -1886,6 +1889,7 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
struct wmi_peer_assoc_complete_cmd *cmd; struct wmi_peer_assoc_complete_cmd *cmd;
struct ath12k_wmi_vht_rate_set_params *mcs; struct ath12k_wmi_vht_rate_set_params *mcs;
struct ath12k_wmi_he_rate_set_params *he_mcs; struct ath12k_wmi_he_rate_set_params *he_mcs;
struct ath12k_wmi_eht_rate_set_params *eht_mcs;
struct sk_buff *skb; struct sk_buff *skb;
struct wmi_tlv *tlv; struct wmi_tlv *tlv;
void *ptr; void *ptr;
...@@ -1902,7 +1906,8 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, ...@@ -1902,7 +1906,8 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
TLV_HDR_SIZE + (peer_legacy_rates_align * sizeof(u8)) + TLV_HDR_SIZE + (peer_legacy_rates_align * sizeof(u8)) +
TLV_HDR_SIZE + (peer_ht_rates_align * sizeof(u8)) + TLV_HDR_SIZE + (peer_ht_rates_align * sizeof(u8)) +
sizeof(*mcs) + TLV_HDR_SIZE + sizeof(*mcs) + TLV_HDR_SIZE +
(sizeof(*he_mcs) * arg->peer_he_mcs_count); (sizeof(*he_mcs) * arg->peer_he_mcs_count) +
TLV_HDR_SIZE + (sizeof(*eht_mcs) * arg->peer_eht_mcs_count);
skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len); skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
if (!skb) if (!skb)
...@@ -1949,6 +1954,16 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, ...@@ -1949,6 +1954,16 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
cmd->peer_ppet.ppet16_ppet8_ru3_ru0[i] = cmd->peer_ppet.ppet16_ppet8_ru3_ru0[i] =
cpu_to_le32(arg->peer_ppet.ppet16_ppet8_ru3_ru0[i]); cpu_to_le32(arg->peer_ppet.ppet16_ppet8_ru3_ru0[i]);
/* Update 11be capabilities */
memcpy_and_pad(cmd->peer_eht_cap_mac, sizeof(cmd->peer_eht_cap_mac),
arg->peer_eht_cap_mac, sizeof(arg->peer_eht_cap_mac),
0);
memcpy_and_pad(cmd->peer_eht_cap_phy, sizeof(cmd->peer_eht_cap_phy),
arg->peer_eht_cap_phy, sizeof(arg->peer_eht_cap_phy),
0);
memcpy_and_pad(&cmd->peer_eht_ppet, sizeof(cmd->peer_eht_ppet),
&arg->peer_eht_ppet, sizeof(arg->peer_eht_ppet), 0);
/* Update peer legacy rate information */ /* Update peer legacy rate information */
ptr += sizeof(*cmd); ptr += sizeof(*cmd);
...@@ -2015,8 +2030,24 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, ...@@ -2015,8 +2030,24 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
ptr += sizeof(*he_mcs); ptr += sizeof(*he_mcs);
} }
/* Loop through the EHT rate set */
len = arg->peer_eht_mcs_count * sizeof(*eht_mcs);
tlv = ptr;
tlv->header = ath12k_wmi_tlv_hdr(WMI_TAG_ARRAY_STRUCT, len);
ptr += TLV_HDR_SIZE;
for (i = 0; i < arg->peer_eht_mcs_count; i++) {
eht_mcs = ptr;
eht_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_HE_RATE_SET,
sizeof(*eht_mcs));
eht_mcs->rx_mcs_set = cpu_to_le32(arg->peer_eht_rx_mcs_set[i]);
eht_mcs->tx_mcs_set = cpu_to_le32(arg->peer_eht_tx_mcs_set[i]);
ptr += sizeof(*eht_mcs);
}
ath12k_dbg(ar->ab, ATH12K_DBG_WMI, ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
"wmi peer assoc vdev id %d assoc id %d peer mac %pM peer_flags %x rate_caps %x peer_caps %x listen_intval %d ht_caps %x max_mpdu %d nss %d phymode %d peer_mpdu_density %d vht_caps %x he cap_info %x he ops %x he cap_info_ext %x he phy %x %x %x peer_bw_rxnss_override %x\n", "wmi peer assoc vdev id %d assoc id %d peer mac %pM peer_flags %x rate_caps %x peer_caps %x listen_intval %d ht_caps %x max_mpdu %d nss %d phymode %d peer_mpdu_density %d vht_caps %x he cap_info %x he ops %x he cap_info_ext %x he phy %x %x %x peer_bw_rxnss_override %x peer_flags_ext %x eht mac_cap %x %x eht phy_cap %x %x %x\n",
cmd->vdev_id, cmd->peer_associd, arg->peer_mac, cmd->vdev_id, cmd->peer_associd, arg->peer_mac,
cmd->peer_flags, cmd->peer_rate_caps, cmd->peer_caps, cmd->peer_flags, cmd->peer_rate_caps, cmd->peer_caps,
cmd->peer_listen_intval, cmd->peer_ht_caps, cmd->peer_listen_intval, cmd->peer_ht_caps,
...@@ -2026,7 +2057,10 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, ...@@ -2026,7 +2057,10 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
cmd->peer_he_ops, cmd->peer_he_cap_info_ext, cmd->peer_he_ops, cmd->peer_he_cap_info_ext,
cmd->peer_he_cap_phy[0], cmd->peer_he_cap_phy[1], cmd->peer_he_cap_phy[0], cmd->peer_he_cap_phy[1],
cmd->peer_he_cap_phy[2], cmd->peer_he_cap_phy[2],
cmd->peer_bw_rxnss_override); cmd->peer_bw_rxnss_override, cmd->peer_flags_ext,
cmd->peer_eht_cap_mac[0], cmd->peer_eht_cap_mac[1],
cmd->peer_eht_cap_phy[0], cmd->peer_eht_cap_phy[1],
cmd->peer_eht_cap_phy[2]);
ret = ath12k_wmi_cmd_send(wmi, skb, WMI_PEER_ASSOC_CMDID); ret = ath12k_wmi_cmd_send(wmi, skb, WMI_PEER_ASSOC_CMDID);
if (ret) { if (ret) {
......
...@@ -1167,6 +1167,10 @@ enum wmi_tlv_peer_flags { ...@@ -1167,6 +1167,10 @@ enum wmi_tlv_peer_flags {
}; };
enum wmi_tlv_peer_flags_ext {
WMI_PEER_EXT_EHT = BIT(0),
};
/** Enum list of TLV Tags for each parameter structure type. */ /** Enum list of TLV Tags for each parameter structure type. */
enum wmi_tlv_tag { enum wmi_tlv_tag {
WMI_TAG_LAST_RESERVED = 15, WMI_TAG_LAST_RESERVED = 15,
...@@ -1924,6 +1928,7 @@ enum wmi_tlv_tag { ...@@ -1924,6 +1928,7 @@ enum wmi_tlv_tag {
WMI_TAG_MAC_PHY_CAPABILITIES_EXT = 0x36F, WMI_TAG_MAC_PHY_CAPABILITIES_EXT = 0x36F,
WMI_TAG_REGULATORY_RULE_EXT_STRUCT = 0x3A9, WMI_TAG_REGULATORY_RULE_EXT_STRUCT = 0x3A9,
WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT, WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT,
WMI_TAG_EHT_RATE_SET = 0x3C4,
WMI_TAG_MAX WMI_TAG_MAX
}; };
...@@ -3612,6 +3617,15 @@ struct wmi_peer_assoc_complete_cmd { ...@@ -3612,6 +3617,15 @@ struct wmi_peer_assoc_complete_cmd {
__le32 peer_he_cap_info_internal; __le32 peer_he_cap_info_internal;
__le32 min_data_rate; __le32 min_data_rate;
__le32 peer_he_caps_6ghz; __le32 peer_he_caps_6ghz;
__le32 sta_type;
__le32 bss_max_idle_option;
__le32 auth_mode;
__le32 peer_flags_ext;
__le32 puncture_20mhz_bitmap;
__le32 peer_eht_cap_mac[WMI_MAX_EHTCAP_MAC_SIZE];
__le32 peer_eht_cap_phy[WMI_MAX_EHTCAP_PHY_SIZE];
__le32 peer_eht_ops;
struct ath12k_wmi_ppe_threshold_params peer_eht_ppet;
} __packed; } __packed;
struct wmi_stop_scan_cmd { struct wmi_stop_scan_cmd {
...@@ -3839,6 +3853,12 @@ struct ath12k_wmi_he_rate_set_params { ...@@ -3839,6 +3853,12 @@ struct ath12k_wmi_he_rate_set_params {
__le32 tx_mcs_set; __le32 tx_mcs_set;
} __packed; } __packed;
struct ath12k_wmi_eht_rate_set_params {
__le32 tlv_header;
__le32 rx_mcs_set;
__le32 tx_mcs_set;
} __packed;
#define MAX_REG_RULES 10 #define MAX_REG_RULES 10
#define REG_ALPHA2_LEN 2 #define REG_ALPHA2_LEN 2
#define MAX_6G_REG_RULES 5 #define MAX_6G_REG_RULES 5
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment