Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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;
+12 −9
Original line number Diff line number Diff line
@@ -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,
@@ -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);

@@ -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);
@@ -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)
@@ -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;
@@ -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:
@@ -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) {