Commit 7d992bd4 authored by Manikanta Pubbisetty's avatar Manikanta Pubbisetty Committed by Kalle Valo

wifi: ath11k: Add support to connect to non-transmit MBSSID profiles

Add support to connect to a non-transmit MBSSID AP profile.

Non-transmit MBSSID profile parameters are passed to the firmware
via WMI VDEV UP command and this helps firmware to track MBSSID
profile within the multi-BSS beacon and report beacon loss if
any.

WCN6750, QCA6390 & WCN6855 firmwares have the support and hence
enable the support on these hardwares.

Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1
Signed-off-by: default avatarManikanta Pubbisetty <quic_mpubbise@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20220901080616.29414-1-quic_mpubbise@quicinc.com
parent 607c467e
...@@ -107,6 +107,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -107,6 +107,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false, .hybrid_bus_type = false,
.fixed_fw_mem = false, .fixed_fw_mem = false,
.support_off_channel_tx = false, .support_off_channel_tx = false,
.supports_multi_bssid = false,
}, },
{ {
.hw_rev = ATH11K_HW_IPQ6018_HW10, .hw_rev = ATH11K_HW_IPQ6018_HW10,
...@@ -179,6 +180,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -179,6 +180,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false, .hybrid_bus_type = false,
.fixed_fw_mem = false, .fixed_fw_mem = false,
.support_off_channel_tx = false, .support_off_channel_tx = false,
.supports_multi_bssid = false,
}, },
{ {
.name = "qca6390 hw2.0", .name = "qca6390 hw2.0",
...@@ -250,6 +252,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -250,6 +252,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false, .hybrid_bus_type = false,
.fixed_fw_mem = false, .fixed_fw_mem = false,
.support_off_channel_tx = true, .support_off_channel_tx = true,
.supports_multi_bssid = true,
}, },
{ {
.name = "qcn9074 hw1.0", .name = "qcn9074 hw1.0",
...@@ -321,6 +324,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -321,6 +324,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false, .hybrid_bus_type = false,
.fixed_fw_mem = false, .fixed_fw_mem = false,
.support_off_channel_tx = false, .support_off_channel_tx = false,
.supports_multi_bssid = false,
}, },
{ {
.name = "wcn6855 hw2.0", .name = "wcn6855 hw2.0",
...@@ -392,6 +396,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -392,6 +396,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false, .hybrid_bus_type = false,
.fixed_fw_mem = false, .fixed_fw_mem = false,
.support_off_channel_tx = true, .support_off_channel_tx = true,
.supports_multi_bssid = true,
}, },
{ {
.name = "wcn6855 hw2.1", .name = "wcn6855 hw2.1",
...@@ -462,6 +467,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -462,6 +467,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false, .hybrid_bus_type = false,
.fixed_fw_mem = false, .fixed_fw_mem = false,
.support_off_channel_tx = true, .support_off_channel_tx = true,
.supports_multi_bssid = true,
}, },
{ {
.name = "wcn6750 hw1.0", .name = "wcn6750 hw1.0",
...@@ -532,6 +538,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -532,6 +538,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = true, .hybrid_bus_type = true,
.fixed_fw_mem = true, .fixed_fw_mem = true,
.support_off_channel_tx = false, .support_off_channel_tx = false,
.supports_multi_bssid = true,
}, },
}; };
......
...@@ -201,6 +201,7 @@ struct ath11k_hw_params { ...@@ -201,6 +201,7 @@ struct ath11k_hw_params {
bool hybrid_bus_type; bool hybrid_bus_type;
bool fixed_fw_mem; bool fixed_fw_mem;
bool support_off_channel_tx; bool support_off_channel_tx;
bool supports_multi_bssid;
}; };
struct ath11k_hw_ops { struct ath11k_hw_ops {
......
...@@ -8787,6 +8787,11 @@ static int __ath11k_mac_register(struct ath11k *ar) ...@@ -8787,6 +8787,11 @@ static int __ath11k_mac_register(struct ath11k *ar)
if (ab->hw_params.single_pdev_only && ar->supports_6ghz) if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS); ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
if (ab->hw_params.supports_multi_bssid) {
ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
}
ieee80211_hw_set(ar->hw, SIGNAL_DBM); ieee80211_hw_set(ar->hw, SIGNAL_DBM);
ieee80211_hw_set(ar->hw, SUPPORTS_PS); ieee80211_hw_set(ar->hw, SUPPORTS_PS);
ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS); ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
......
...@@ -991,9 +991,13 @@ int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid) ...@@ -991,9 +991,13 @@ int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
{ {
struct ath11k_pdev_wmi *wmi = ar->wmi; struct ath11k_pdev_wmi *wmi = ar->wmi;
struct wmi_vdev_up_cmd *cmd; struct wmi_vdev_up_cmd *cmd;
struct ieee80211_bss_conf *bss_conf;
struct ath11k_vif *arvif;
struct sk_buff *skb; struct sk_buff *skb;
int ret; int ret;
arvif = ath11k_mac_get_arvif(ar, vdev_id);
skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, sizeof(*cmd)); skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, sizeof(*cmd));
if (!skb) if (!skb)
return -ENOMEM; return -ENOMEM;
...@@ -1007,6 +1011,17 @@ int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid) ...@@ -1007,6 +1011,17 @@ int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
ether_addr_copy(cmd->vdev_bssid.addr, bssid); ether_addr_copy(cmd->vdev_bssid.addr, bssid);
if (arvif && arvif->vif->type == NL80211_IFTYPE_STATION) {
bss_conf = &arvif->vif->bss_conf;
if (bss_conf->nontransmitted) {
ether_addr_copy(cmd->trans_bssid.addr,
bss_conf->transmitter_bssid);
cmd->profile_idx = bss_conf->bssid_index;
cmd->profile_num = bss_conf->bssid_indicator;
}
}
ret = ath11k_wmi_cmd_send(wmi, skb, WMI_VDEV_UP_CMDID); ret = ath11k_wmi_cmd_send(wmi, skb, WMI_VDEV_UP_CMDID);
if (ret) { if (ret) {
ath11k_warn(ar->ab, "failed to submit WMI_VDEV_UP cmd\n"); ath11k_warn(ar->ab, "failed to submit WMI_VDEV_UP cmd\n");
......
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