Lines Matching refs:ab

11 static struct ath11k_peer *ath11k_peer_find_list_by_id(struct ath11k_base *ab,
16 lockdep_assert_held(&ab->base_lock);
18 list_for_each_entry(peer, &ab->peers, list) {
28 struct ath11k_peer *ath11k_peer_find(struct ath11k_base *ab, int vdev_id,
33 lockdep_assert_held(&ab->base_lock);
35 list_for_each_entry(peer, &ab->peers, list) {
47 struct ath11k_peer *ath11k_peer_find_by_addr(struct ath11k_base *ab,
52 lockdep_assert_held(&ab->base_lock);
54 if (!ab->rhead_peer_addr)
57 peer = rhashtable_lookup_fast(ab->rhead_peer_addr, addr,
58 ab->rhash_peer_addr_param);
63 struct ath11k_peer *ath11k_peer_find_by_id(struct ath11k_base *ab,
68 lockdep_assert_held(&ab->base_lock);
70 if (!ab->rhead_peer_id)
73 peer = rhashtable_lookup_fast(ab->rhead_peer_id, &peer_id,
74 ab->rhash_peer_id_param);
79 struct ath11k_peer *ath11k_peer_find_by_vdev_id(struct ath11k_base *ab,
84 spin_lock_bh(&ab->base_lock);
86 list_for_each_entry(peer, &ab->peers, list) {
88 spin_unlock_bh(&ab->base_lock);
92 spin_unlock_bh(&ab->base_lock);
96 void ath11k_peer_unmap_event(struct ath11k_base *ab, u16 peer_id)
100 spin_lock_bh(&ab->base_lock);
102 peer = ath11k_peer_find_list_by_id(ab, peer_id);
104 ath11k_warn(ab, "peer-unmap-event: unknown peer id %d\n",
109 ath11k_dbg(ab, ATH11K_DBG_DP_HTT, "peer unmap vdev %d peer %pM id %d\n",
114 wake_up(&ab->peer_mapping_wq);
117 spin_unlock_bh(&ab->base_lock);
120 void ath11k_peer_map_event(struct ath11k_base *ab, u8 vdev_id, u16 peer_id,
125 spin_lock_bh(&ab->base_lock);
126 peer = ath11k_peer_find(ab, vdev_id, mac_addr);
137 list_add(&peer->list, &ab->peers);
138 wake_up(&ab->peer_mapping_wq);
141 ath11k_dbg(ab, ATH11K_DBG_DP_HTT, "peer map vdev %d peer %pM id %d\n",
145 spin_unlock_bh(&ab->base_lock);
148 static int ath11k_wait_for_peer_common(struct ath11k_base *ab, int vdev_id,
153 ret = wait_event_timeout(ab->peer_mapping_wq, ({
156 spin_lock_bh(&ab->base_lock);
157 mapped = !!ath11k_peer_find(ab, vdev_id, addr);
158 spin_unlock_bh(&ab->base_lock);
161 test_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags));
170 static inline int ath11k_peer_rhash_insert(struct ath11k_base *ab,
178 lockdep_assert_held(&ab->tbl_mtx_lock);
190 static inline int ath11k_peer_rhash_remove(struct ath11k_base *ab,
197 lockdep_assert_held(&ab->tbl_mtx_lock);
206 static int ath11k_peer_rhash_add(struct ath11k_base *ab, struct ath11k_peer *peer)
210 lockdep_assert_held(&ab->base_lock);
211 lockdep_assert_held(&ab->tbl_mtx_lock);
213 if (!ab->rhead_peer_id || !ab->rhead_peer_addr)
216 ret = ath11k_peer_rhash_insert(ab, ab->rhead_peer_id, &peer->rhash_id,
217 &ab->rhash_peer_id_param, &peer->peer_id);
219 ath11k_warn(ab, "failed to add peer %pM with id %d in rhash_id ret %d\n",
224 ret = ath11k_peer_rhash_insert(ab, ab->rhead_peer_addr, &peer->rhash_addr,
225 &ab->rhash_peer_addr_param, &peer->addr);
227 ath11k_warn(ab, "failed to add peer %pM with id %d in rhash_addr ret %d\n",
235 ath11k_peer_rhash_remove(ab, ab->rhead_peer_id, &peer->rhash_id,
236 &ab->rhash_peer_id_param);
243 struct ath11k_base *ab = ar->ab;
247 mutex_lock(&ab->tbl_mtx_lock);
248 spin_lock_bh(&ab->base_lock);
249 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
253 ath11k_warn(ab, "removing stale peer %pM from vdev_id %d\n",
256 ath11k_peer_rhash_delete(ab, peer);
262 spin_unlock_bh(&ab->base_lock);
263 mutex_unlock(&ab->tbl_mtx_lock);
268 return ath11k_wait_for_peer_common(ar->ab, vdev_id, addr, false);
279 ath11k_warn(ar->ab, "failed wait for peer deleted");
286 ath11k_warn(ar->ab, "Timeout in receiving peer delete response\n");
297 struct ath11k_base *ab = ar->ab;
301 mutex_lock(&ab->tbl_mtx_lock);
302 spin_lock_bh(&ab->base_lock);
304 peer = ath11k_peer_find_by_addr(ab, addr);
311 ath11k_peer_rhash_delete(ab, peer);
318 peer = ath11k_peer_find(ab, vdev_id, addr);
321 spin_unlock_bh(&ab->base_lock);
322 mutex_unlock(&ab->tbl_mtx_lock);
324 ath11k_warn(ab,
330 spin_unlock_bh(&ab->base_lock);
331 mutex_unlock(&ab->tbl_mtx_lock);
337 ath11k_warn(ab,
367 return ath11k_wait_for_peer_common(ar->ab, vdev_id, addr, true);
380 ath11k_warn(ar->ab,
385 mutex_lock(&ar->ab->tbl_mtx_lock);
386 spin_lock_bh(&ar->ab->base_lock);
387 peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
390 spin_unlock_bh(&ar->ab->base_lock);
391 mutex_unlock(&ar->ab->tbl_mtx_lock);
398 ath11k_peer_rhash_delete(ar->ab, peer);
400 spin_unlock_bh(&ar->ab->base_lock);
401 mutex_unlock(&ar->ab->tbl_mtx_lock);
405 ath11k_warn(ar->ab,
416 mutex_lock(&ar->ab->tbl_mtx_lock);
417 spin_lock_bh(&ar->ab->base_lock);
419 peer = ath11k_peer_find(ar->ab, param->vdev_id, param->peer_addr);
421 spin_unlock_bh(&ar->ab->base_lock);
422 mutex_unlock(&ar->ab->tbl_mtx_lock);
423 ath11k_warn(ar->ab, "failed to find peer %pM on vdev %i after creation\n",
430 ret = ath11k_peer_rhash_add(ar->ab, peer);
432 spin_unlock_bh(&ar->ab->base_lock);
433 mutex_unlock(&ar->ab->tbl_mtx_lock);
460 spin_unlock_bh(&ar->ab->base_lock);
461 mutex_unlock(&ar->ab->tbl_mtx_lock);
468 ath11k_warn(ar->ab, "failed peer %pM delete vdev_id %d fallback ret %d\n",
474 int ath11k_peer_rhash_delete(struct ath11k_base *ab, struct ath11k_peer *peer)
478 lockdep_assert_held(&ab->base_lock);
479 lockdep_assert_held(&ab->tbl_mtx_lock);
481 if (!ab->rhead_peer_id || !ab->rhead_peer_addr)
484 ret = ath11k_peer_rhash_remove(ab, ab->rhead_peer_addr, &peer->rhash_addr,
485 &ab->rhash_peer_addr_param);
487 ath11k_warn(ab, "failed to remove peer %pM id %d in rhash_addr ret %d\n",
492 ret = ath11k_peer_rhash_remove(ab, ab->rhead_peer_id, &peer->rhash_id,
493 &ab->rhash_peer_id_param);
495 ath11k_warn(ab, "failed to remove peer %pM id %d in rhash_id ret %d\n",
503 static int ath11k_peer_rhash_id_tbl_init(struct ath11k_base *ab)
510 lockdep_assert_held(&ab->tbl_mtx_lock);
512 if (ab->rhead_peer_id)
515 size = sizeof(*ab->rhead_peer_id);
518 ath11k_warn(ab, "failed to init rhash id table due to no mem (size %zu)\n",
523 param = &ab->rhash_peer_id_param;
529 param->nelem_hint = ab->num_radios * TARGET_NUM_PEERS_PDEV(ab);
533 ath11k_warn(ab, "failed to init peer id rhash table %d\n", ret);
537 spin_lock_bh(&ab->base_lock);
539 if (!ab->rhead_peer_id) {
540 ab->rhead_peer_id = rhash_id_tbl;
542 spin_unlock_bh(&ab->base_lock);
546 spin_unlock_bh(&ab->base_lock);
558 static int ath11k_peer_rhash_addr_tbl_init(struct ath11k_base *ab)
565 lockdep_assert_held(&ab->tbl_mtx_lock);
567 if (ab->rhead_peer_addr)
570 size = sizeof(*ab->rhead_peer_addr);
573 ath11k_warn(ab, "failed to init rhash addr table due to no mem (size %zu)\n",
578 param = &ab->rhash_peer_addr_param;
584 param->nelem_hint = ab->num_radios * TARGET_NUM_PEERS_PDEV(ab);
588 ath11k_warn(ab, "failed to init peer addr rhash table %d\n", ret);
592 spin_lock_bh(&ab->base_lock);
594 if (!ab->rhead_peer_addr) {
595 ab->rhead_peer_addr = rhash_addr_tbl;
597 spin_unlock_bh(&ab->base_lock);
601 spin_unlock_bh(&ab->base_lock);
613 static inline void ath11k_peer_rhash_id_tbl_destroy(struct ath11k_base *ab)
615 lockdep_assert_held(&ab->tbl_mtx_lock);
617 if (!ab->rhead_peer_id)
620 rhashtable_destroy(ab->rhead_peer_id);
621 kfree(ab->rhead_peer_id);
622 ab->rhead_peer_id = NULL;
625 static inline void ath11k_peer_rhash_addr_tbl_destroy(struct ath11k_base *ab)
627 lockdep_assert_held(&ab->tbl_mtx_lock);
629 if (!ab->rhead_peer_addr)
632 rhashtable_destroy(ab->rhead_peer_addr);
633 kfree(ab->rhead_peer_addr);
634 ab->rhead_peer_addr = NULL;
637 int ath11k_peer_rhash_tbl_init(struct ath11k_base *ab)
641 mutex_lock(&ab->tbl_mtx_lock);
643 ret = ath11k_peer_rhash_id_tbl_init(ab);
647 ret = ath11k_peer_rhash_addr_tbl_init(ab);
651 mutex_unlock(&ab->tbl_mtx_lock);
656 ath11k_peer_rhash_id_tbl_destroy(ab);
658 mutex_unlock(&ab->tbl_mtx_lock);
662 void ath11k_peer_rhash_tbl_destroy(struct ath11k_base *ab)
664 mutex_lock(&ab->tbl_mtx_lock);
666 ath11k_peer_rhash_addr_tbl_destroy(ab);
667 ath11k_peer_rhash_id_tbl_destroy(ab);
669 mutex_unlock(&ab->tbl_mtx_lock);