提交 0579119f 编写于 作者: M Michal Kazior 提交者: Kalle Valo

ath10k: track vif list internally

mac80211 interface interations functions have
peculiar locking issues. This patch introduces
internal (to ath10k) vif list that will be used
for vif iteration purposes.

kvalo: remove extra INIT_LIST_HEAD()
Signed-off-by: NMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: NKalle Valo <kvalo@qca.qualcomm.com>
上级 9dad14ae
...@@ -824,6 +824,7 @@ int ath10k_core_start(struct ath10k *ar) ...@@ -824,6 +824,7 @@ int ath10k_core_start(struct ath10k *ar)
goto err_disconnect_htc; goto err_disconnect_htc;
ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1; ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1;
INIT_LIST_HEAD(&ar->arvifs);
return 0; return 0;
......
...@@ -205,6 +205,8 @@ struct ath10k_peer { ...@@ -205,6 +205,8 @@ struct ath10k_peer {
#define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ) #define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ)
struct ath10k_vif { struct ath10k_vif {
struct list_head list;
u32 vdev_id; u32 vdev_id;
enum wmi_vdev_type vdev_type; enum wmi_vdev_type vdev_type;
enum wmi_vdev_subtype vdev_subtype; enum wmi_vdev_subtype vdev_subtype;
...@@ -404,6 +406,7 @@ struct ath10k { ...@@ -404,6 +406,7 @@ struct ath10k {
/* protects shared structure data */ /* protects shared structure data */
spinlock_t data_lock; spinlock_t data_lock;
struct list_head arvifs;
struct list_head peers; struct list_head peers;
wait_queue_head_t peer_mapping_wq; wait_queue_head_t peer_mapping_wq;
......
...@@ -2093,6 +2093,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -2093,6 +2093,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
} }
ar->free_vdev_map &= ~BIT(arvif->vdev_id); ar->free_vdev_map &= ~BIT(arvif->vdev_id);
list_add(&arvif->list, &ar->arvifs);
vdev_param = ar->wmi.vdev_param->def_keyid; vdev_param = ar->wmi.vdev_param->def_keyid;
ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param, ret = ath10k_wmi_vdev_set_param(ar, 0, vdev_param,
...@@ -2175,6 +2176,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -2175,6 +2176,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 &= ~BIT(arvif->vdev_id); ar->free_vdev_map &= ~BIT(arvif->vdev_id);
list_del(&arvif->list);
err: err:
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
...@@ -2201,6 +2203,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw, ...@@ -2201,6 +2203,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
spin_unlock_bh(&ar->data_lock); spin_unlock_bh(&ar->data_lock);
ar->free_vdev_map |= 1 << (arvif->vdev_id); ar->free_vdev_map |= 1 << (arvif->vdev_id);
list_del(&arvif->list);
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr); ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册