@@ -357,6 +357,8 @@ struct ath11k_vif {
#ifdef CONFIG_ATH11K_DEBUGFS
struct dentry *debugfs_twt;
#endif /* CONFIG_ATH11K_DEBUGFS */
+
+ u8 nontransmitting_vif_count;
};
struct ath11k_vif_iter {
@@ -1421,9 +1421,13 @@ static void ath11k_control_beaconing(struct ath11k_vif *arvif,
struct ieee80211_bss_conf *info)
{
struct ath11k *ar = arvif->ar;
+ struct ath11k_vif *tx_arvif = NULL;
int ret = 0;
struct vdev_up_params params = { 0 };
+ if (arvif->vif->mbssid_tx_vif)
+ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
+
lockdep_assert_held(&arvif->ar->conf_mutex);
if (!info->enable_beacon) {
@@ -1433,6 +1437,9 @@ static void ath11k_control_beaconing(struct ath11k_vif *arvif,
arvif->vdev_id, ret);
arvif->is_up = false;
+ if (tx_arvif)
+ tx_arvif->nontransmitting_vif_count = 0;
+
return;
}
@@ -1453,6 +1460,13 @@ static void ath11k_control_beaconing(struct ath11k_vif *arvif,
params.vdev_id = arvif->vdev_id;
params.aid = arvif->aid;
params.bssid = arvif->bssid;
+ if (tx_arvif) {
+ params.tx_bssid = tx_arvif->bssid;
+ params.profile_idx = info->bssid_index;
+ if (params.profile_idx >= tx_arvif->nontransmitting_vif_count)
+ tx_arvif->nontransmitting_vif_count = params.profile_idx;
+ params.profile_count = tx_arvif->nontransmitting_vif_count;
+ }
ret = ath11k_wmi_vdev_up(arvif->ar, ¶ms);
if (ret) {
ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
@@ -2813,7 +2827,7 @@ static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
struct ieee80211_vif *vif)
{
struct ath11k *ar = hw->priv;
- struct ath11k_vif *arvif = (void *)vif->drv_priv;
+ struct ath11k_vif *arvif = (void *)vif->drv_priv, *tx_arvif;
int ret;
lockdep_assert_held(&ar->conf_mutex);
@@ -2827,6 +2841,11 @@ static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
arvif->vdev_id, ret);
arvif->is_up = false;
+ if (arvif->vif->mbssid_tx_vif) {
+ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
+ if (tx_arvif != arvif)
+ tx_arvif->nontransmitting_vif_count--;
+ }
memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
@@ -3372,7 +3391,8 @@ static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
ar, arvif->vdev_id, info->he_bss_color.color,
ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
- info->he_bss_color.enabled);
+ arvif->vif->bss_conf.nontransmitted ?
+ 0 : info->he_bss_color.enabled);
if (ret)
ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
arvif->vdev_id, ret);
@@ -6952,7 +6972,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar,
int n_vifs)
{
struct ath11k_base *ab = ar->ab;
- struct ath11k_vif *arvif;
+ struct ath11k_vif *arvif, *tx_arvif;
int ret;
int i;
bool monitor_vif = false;
@@ -7011,6 +7031,12 @@ ath11k_mac_update_vif_chan(struct ath11k *ar,
params.vdev_id = arvif->vdev_id;
params.aid = arvif->aid;
params.bssid = arvif->bssid;
+ if (arvif->vif->mbssid_tx_vif) {
+ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
+ params.tx_bssid = tx_arvif->bssid;
+ params.profile_idx = arvif->vif->bss_conf.bssid_index;
+ params.profile_count = tx_arvif->nontransmitting_vif_count;
+ }
ret = ath11k_wmi_vdev_up(arvif->ar, ¶ms);
if (ret) {
ath11k_warn(ab, "failed to bring vdev up %d: %d\n",