static int ath11k_monitor_vdev_up(struct ath11k *ar, int vdev_id)
{
+ struct vdev_up_params params = {
+ .vdev_id = vdev_id,
+ .bssid = ar->mac_addr,
+ };
int ret = 0;
- ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
+ ret = ath11k_wmi_vdev_up(ar, ¶ms);
if (ret) {
ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
vdev_id, ret);
struct ieee80211_bss_conf *info)
{
struct ath11k *ar = arvif->ar;
+ struct ieee80211_vif *parent;
+ struct vdev_up_params params = {
+ .vdev_id = arvif->vdev_id,
+ .bssid = arvif->bssid,
+ .profile_num = info->multi_bssid.count,
+ .profile_idx = info->multi_bssid.index,
+ };
int ret = 0;
lockdep_assert_held(&arvif->ar->conf_mutex);
arvif->aid = 0;
ether_addr_copy(arvif->bssid, info->bssid);
+ parent = ieee80211_get_multi_bssid_parent(arvif->vif);
+ if (parent) {
+ struct ath11k_vif *pvif = (struct ath11k_vif *)parent->drv_priv;
+
+ params.trans_bssid = pvif->bssid;
+ }
+
- ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
- arvif->bssid);
+ ret = ath11k_wmi_vdev_up(arvif->ar, ¶ms);
if (ret) {
ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
arvif->vdev_id, ret);
struct ath11k *ar = hw->priv;
struct ath11k_vif *arvif = (void *)vif->drv_priv;
struct peer_assoc_params peer_arg;
+ struct vdev_up_params params = {
+ .vdev_id = arvif->vdev_id,
+ .bssid = bss_conf->bssid,
+ .aid = bss_conf->aid,
+ };
struct ieee80211_sta *ap_sta;
int ret;
arvif->aid = bss_conf->aid;
ether_addr_copy(arvif->bssid, bss_conf->bssid);
- ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
+ ret = ath11k_wmi_vdev_up(ar, ¶ms);
if (ret) {
ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
arvif->vdev_id, ret);
/* TODO: Update ar->rx_channel */
for (i = 0; i < n_vifs; i++) {
+ struct vdev_up_params params;
+
arvif = (void *)vifs[i].vif->drv_priv;
if (WARN_ON(!arvif->is_started))
continue;
}
- ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
- arvif->bssid);
+ params.vdev_id = arvif->vdev_id,
+ params.bssid = arvif->bssid,
+ params.aid = arvif->aid,
+ ret = ath11k_wmi_vdev_up(arvif->ar, ¶ms);
if (ret) {
ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
arvif->vdev_id, ret);
return ret;
}
-int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
+int ath11k_wmi_vdev_up(struct ath11k *ar, struct vdev_up_params *params)
{
struct ath11k_pdev_wmi *wmi = ar->wmi;
struct wmi_vdev_up_cmd *cmd;
cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_VDEV_UP_CMD) |
FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
- cmd->vdev_id = vdev_id;
- cmd->vdev_assoc_id = aid;
+ cmd->vdev_id = params->vdev_id;
+ cmd->vdev_assoc_id = params->aid;
+ cmd->profile_idx = params->profile_idx;
+ cmd->profile_num = params->profile_num;
- ether_addr_copy(cmd->vdev_bssid.addr, bssid);
+ if (params->trans_bssid)
+ ether_addr_copy(cmd->trans_bssid.addr, params->trans_bssid);
+ ether_addr_copy(cmd->vdev_bssid.addr, params->bssid);
ret = ath11k_wmi_cmd_send(wmi, skb, WMI_VDEV_UP_CMDID);
if (ret) {
}
ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
- "WMI mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
- vdev_id, aid, bssid);
+ "WMI mgmt vdev up id 0x%x assoc id %d idx %d num %d bssid %pM trans_bssid %pM\n",
+ params->vdev_id, params->aid, params->profile_idx, params->profile_num,
+ params->bssid, params->trans_bssid);
return ret;
}