Skip to content

Commit

Permalink
ath10k: use 64-bit vdev map
Browse files Browse the repository at this point in the history
This can allow more than 32 stations to be supported
without over-running the bitmap.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
  • Loading branch information
Ben Greear authored and Kalle Valo committed Oct 1, 2014
1 parent 6cddcc7 commit 16c1117
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 12 deletions.
4 changes: 2 additions & 2 deletions drivers/net/wireless/ath/ath10k/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -846,9 +846,9 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode)
goto err_hif_stop;

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
ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1;
ar->free_vdev_map = (1LL << TARGET_NUM_VDEVS) - 1;

INIT_LIST_HEAD(&ar->arvifs);

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/ath/ath10k/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ struct ath10k {
/* current operating channel definition */
struct cfg80211_chan_def chandef;

int free_vdev_map;
unsigned long long free_vdev_map;
bool monitor;
int monitor_vdev_id;
bool monitor_started;
Expand Down
21 changes: 12 additions & 9 deletions drivers/net/wireless/ath/ath10k/mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,9 +624,9 @@ static int ath10k_monitor_vdev_create(struct ath10k *ar)
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,
WMI_VDEV_TYPE_MONITOR,
Expand All @@ -637,7 +637,7 @@ static int ath10k_monitor_vdev_create(struct ath10k *ar)
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",
ar->monitor_vdev_id);

Expand All @@ -657,7 +657,7 @@ static int ath10k_monitor_vdev_delete(struct ath10k *ar)
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",
ar->monitor_vdev_id);
Expand Down Expand Up @@ -2791,9 +2791,12 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
ret = -EBUSY;
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;

if (ar->p2p)
Expand Down Expand Up @@ -2865,7 +2868,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
goto err;
}

ar->free_vdev_map &= ~(1 << arvif->vdev_id);
ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
list_add(&arvif->list, &ar->arvifs);

vdev_param = ar->wmi.vdev_param->def_keyid;
Expand Down Expand Up @@ -2958,7 +2961,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,

err_vdev_delete:
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);

err:
Expand Down Expand Up @@ -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",
arvif->vdev_id, ret);

ar->free_vdev_map |= 1 << arvif->vdev_id;
ar->free_vdev_map |= 1LL << arvif->vdev_id;
list_del(&arvif->list);

if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
Expand Down

0 comments on commit 16c1117

Please sign in to comment.