Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2559,15 +2559,15 @@
struct wmi_peer_sta_kickout_arg arg = {};
struct ieee80211_sta *sta;
struct ath11k_peer *peer;
+ struct ath11k_peer *save_peer;
+ struct ath11k_peer *save_peer = NULL;
struct ath11k *ar;
- u32 vdev_id;
+ struct ath11k *save_ar;
+ int i;

if (ath11k_pull_peer_sta_kickout_ev(ab, skb, &arg) != 0) {
ath11k_warn(ab, "failed to extract peer sta kickout event");
@@ -8083,40 +8083,30 @@ static void ath11k_peer_sta_kickout_even
@@ -8083,40 +8083,39 @@ static void ath11k_peer_sta_kickout_even

spin_lock_bh(&ab->base_lock);

Expand Down Expand Up @@ -2613,8 +2613,17 @@
- arg.mac_addr);
- goto exit;
+ if (!sta && save_peer) {
+ int vdev_id = save_peer->vdev_id;
+
+ ath11k_warn(ab, "Spurious quick kickout for STA %pM but found in peer table\n", arg.mac_addr);
+ ath11k_dp_peer_cleanup(save_ar, save_peer->vdev_id, arg.mac_addr);
+ /* ath11k_dp_peer_cleanup() takes ab->base_lock itself; calling
+ * it with the lock held would self-deadlock this CPU. Drop the
+ * lock first.
+ */
+ spin_unlock_bh(&ab->base_lock);
+ ath11k_dp_peer_cleanup(save_ar, vdev_id, arg.mac_addr);
+ rcu_read_unlock();
+ return;
}

- ath11k_dbg(ab, ATH11K_DBG_WMI, "event peer sta kickout %pM",
Expand Down