Commit 16c11176 authored by Ben Greear's avatar Ben Greear Committed by Kalle Valo

ath10k: use 64-bit vdev map

This can allow more than 32 stations to be supported
without over-running the bitmap.
Signed-off-by: default avatarBen Greear <greearb@candelatech.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 6cddcc7a
...@@ -846,9 +846,9 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode) ...@@ -846,9 +846,9 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode)
goto err_hif_stop; goto err_hif_stop;
if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
ar->free_vdev_map = (1 << TARGET_10X_NUM_VDEVS) - 1; ar->free_vdev_map = (1LL << TARGET_10X_NUM_VDEVS) - 1;
else else
ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1; ar->free_vdev_map = (1LL << TARGET_NUM_VDEVS) - 1;
INIT_LIST_HEAD(&ar->arvifs); INIT_LIST_HEAD(&ar->arvifs);
......
...@@ -482,7 +482,7 @@ struct ath10k { ...@@ -482,7 +482,7 @@ struct ath10k {
/* current operating channel definition */ /* current operating channel definition */
struct cfg80211_chan_def chandef; struct cfg80211_chan_def chandef;
int free_vdev_map; unsigned long long free_vdev_map;
bool monitor; bool monitor;
int monitor_vdev_id; int monitor_vdev_id;
bool monitor_started; bool monitor_started;
......
...@@ -624,9 +624,9 @@ static int ath10k_monitor_vdev_create(struct ath10k *ar) ...@@ -624,9 +624,9 @@ static int ath10k_monitor_vdev_create(struct ath10k *ar)
return -ENOMEM; return -ENOMEM;
} }
bit = ffs(ar->free_vdev_map); bit = __ffs64(ar->free_vdev_map);
ar->monitor_vdev_id = bit - 1; ar->monitor_vdev_id = bit;
ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id, ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
WMI_VDEV_TYPE_MONITOR, WMI_VDEV_TYPE_MONITOR,
...@@ -637,7 +637,7 @@ static int ath10k_monitor_vdev_create(struct ath10k *ar) ...@@ -637,7 +637,7 @@ static int ath10k_monitor_vdev_create(struct ath10k *ar)
return ret; return ret;
} }
ar->free_vdev_map &= ~(1 << ar->monitor_vdev_id); ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n", ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
ar->monitor_vdev_id); ar->monitor_vdev_id);
...@@ -657,7 +657,7 @@ static int ath10k_monitor_vdev_delete(struct ath10k *ar) ...@@ -657,7 +657,7 @@ static int ath10k_monitor_vdev_delete(struct ath10k *ar)
return ret; return ret;
} }
ar->free_vdev_map |= 1 << ar->monitor_vdev_id; ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n", ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
ar->monitor_vdev_id); ar->monitor_vdev_id);
...@@ -2791,9 +2791,12 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -2791,9 +2791,12 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
ret = -EBUSY; ret = -EBUSY;
goto err; goto err;
} }
bit = ffs(ar->free_vdev_map); bit = __ffs64(ar->free_vdev_map);
arvif->vdev_id = bit - 1; ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
bit, ar->free_vdev_map);
arvif->vdev_id = bit;
arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE; arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
if (ar->p2p) if (ar->p2p)
...@@ -2865,7 +2868,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -2865,7 +2868,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
goto err; goto err;
} }
ar->free_vdev_map &= ~(1 << arvif->vdev_id); ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
list_add(&arvif->list, &ar->arvifs); list_add(&arvif->list, &ar->arvifs);
vdev_param = ar->wmi.vdev_param->def_keyid; vdev_param = ar->wmi.vdev_param->def_keyid;
...@@ -2958,7 +2961,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -2958,7 +2961,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
err_vdev_delete: err_vdev_delete:
ath10k_wmi_vdev_delete(ar, arvif->vdev_id); ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
ar->free_vdev_map |= 1 << arvif->vdev_id; ar->free_vdev_map |= 1LL << arvif->vdev_id;
list_del(&arvif->list); list_del(&arvif->list);
err: err:
...@@ -2993,7 +2996,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw, ...@@ -2993,7 +2996,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n", ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
arvif->vdev_id, ret); arvif->vdev_id, ret);
ar->free_vdev_map |= 1 << arvif->vdev_id; ar->free_vdev_map |= 1LL << arvif->vdev_id;
list_del(&arvif->list); list_del(&arvif->list);
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
......
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