static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
{
+ struct ieee80211_vif *parent;
struct ath11k *ar = arvif->ar;
struct ath11k_base *ab = ar->ab;
struct ieee80211_hw *hw = ar->hw;
atomic_set(&ar->num_pending_mgmt_tx, 0);
}
-static void
+static int
ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
struct vdev_create_params *params)
{
struct ath11k *ar = arvif->ar;
struct ath11k_pdev *pdev = ar->pdev;
+ struct ieee80211_vif *parent;
params->if_id = arvif->vdev_id;
params->type = arvif->vdev_type;
params->subtype = arvif->vdev_subtype;
params->pdev_id = pdev->pdev_id;
+ params->vdevid_trans = 0;
+ switch (ieee80211_get_multi_bssid_mode(arvif->vif)) {
+ case NL80211_MULTIPLE_BSSID_TRANSMITTED:
+ params->flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP;
+ break;
+ case NL80211_MULTIPLE_BSSID_NON_TRANSMITTED:
+ params->flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP;
+ parent = ieee80211_get_multi_bssid_parent(arvif->vif);
+ if (!parent)
+ return -ENOENT;
+ if (ar->hw->wiphy != ieee80211_vif_to_wdev(parent)->wiphy)
+ return -EINVAL;
+ params->vdevid_trans = ath11k_vif_to_arvif(parent)->vdev_id;
+ break;
+ default:
+ params->flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP;
+ break;
+ }
if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
}
+ return 0;
}
static u32
for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
- ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
+ ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
+ if (ret) {
+ ath11k_warn(ab, "failed to prepare vdev %d\n", ret);
+ goto err;
+ }
ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
if (ret) {
WMI_HOST_WLAN_2G_5G_CAP = 0x3,
};
+enum {
+ WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP = 1,
+ WMI_HOST_VDEV_FLAGS_TRANSMIT_AP = 2,
+ WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP = 4,
+};
+
/*
* wmi command groups.
*/
u8 rx;
} chains[NUM_NL80211_BANDS];
u32 pdev_id;
+ u32 flags;
+ u32 vdevid_trans;
};
struct wmi_vdev_create_cmd {
struct wmi_mac_addr vdev_macaddr;
u32 num_cfg_txrx_streams;
u32 pdev_id;
+ u32 flags;
+ u32 vdevid_trans;
} __packed;
struct wmi_vdev_txrx_streams {