]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: Add support to handle reason inactivity STA kickout event for QCN9274...
authorArulanbu Balusamy <quic_abalusam@quicinc.com>
Tue, 12 Aug 2025 11:17:07 +0000 (16:47 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Thu, 18 Sep 2025 23:43:49 +0000 (16:43 -0700)
Currently, when the non-AP STA connected to the AP STA, and the AP STA goes
down or becomes inactive without indication, firmware detects the beacon
miss and sends the WMI event WMI_PEER_STA_KICKOUT_EVENTID with reason as
INACTIVITY. The host driver handles this event as low ACK and reports it to
the mac80211 driver.

However, the expectation is that non-AP STA should be disconnected from
AP STA instantly once it receives the STA kickout event with reason of
inactivity.

Trigger a disconnect from AP STA through beacon miss handling upon
receiving non-AP STA peer kickout event with reason code inactivity.

Replace the helper function ath12k_mac_get_ar_by_vdev_id() with
ath12k_mac_get_arvif_by_vdev_id() due to the following reasons.

1. Check the station VIF type for handling the beacon miss.

2. Retrieve the proper ar from the arvif by checking the vdev_id with
   vdev_map and link_map lookup which is needed for the MLO case in the
   following patch.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1

Co-developed-by: Ramya Gnanasekar <ramya.gnanasekar@oss.qualcomm.com>
Signed-off-by: Ramya Gnanasekar <ramya.gnanasekar@oss.qualcomm.com>
Signed-off-by: Arulanbu Balusamy <quic_abalusam@quicinc.com>
Co-developed-by: Maharaja Kennadyrajan <maharaja.kennadyrajan@oss.qualcomm.com>
Signed-off-by: Maharaja Kennadyrajan <maharaja.kennadyrajan@oss.qualcomm.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250812111708.3686-3-maharaja.kennadyrajan@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/wmi.c

index 95819ca97212603f8bb62ed5cd4969823a742c15..918d5b505179277867e397bdb64cf70eb6e961c7 100644 (file)
@@ -7305,6 +7305,7 @@ static void ath12k_scan_event(struct ath12k_base *ab, struct sk_buff *skb)
 static void ath12k_peer_sta_kickout_event(struct ath12k_base *ab, struct sk_buff *skb)
 {
        struct wmi_peer_sta_kickout_arg arg = {};
+       struct ath12k_link_vif *arvif;
        struct ieee80211_sta *sta;
        struct ath12k_peer *peer;
        struct ath12k *ar;
@@ -7326,13 +7327,15 @@ static void ath12k_peer_sta_kickout_event(struct ath12k_base *ab, struct sk_buff
                goto exit;
        }
 
-       ar = ath12k_mac_get_ar_by_vdev_id(ab, peer->vdev_id);
-       if (!ar) {
+       arvif = ath12k_mac_get_arvif_by_vdev_id(ab, peer->vdev_id);
+       if (!arvif) {
                ath12k_warn(ab, "invalid vdev id in peer sta kickout ev %d",
                            peer->vdev_id);
                goto exit;
        }
 
+       ar = arvif->ar;
+
        sta = ieee80211_find_sta_by_ifaddr(ath12k_ar_to_hw(ar),
                                           arg.mac_addr, NULL);
        if (!sta) {
@@ -7345,7 +7348,16 @@ static void ath12k_peer_sta_kickout_event(struct ath12k_base *ab, struct sk_buff
                   "peer sta kickout event %pM reason: %d rssi: %d\n",
                   arg.mac_addr, arg.reason, arg.rssi);
 
-       ieee80211_report_low_ack(sta, 10);
+       switch (arg.reason) {
+       case WMI_PEER_STA_KICKOUT_REASON_INACTIVITY:
+               if (arvif->ahvif->vif->type == NL80211_IFTYPE_STATION) {
+                       ath12k_mac_handle_beacon_miss(ar, peer->vdev_id);
+                       break;
+               }
+               fallthrough;
+       default:
+               ieee80211_report_low_ack(sta, 10);
+       }
 
 exit:
        spin_unlock_bh(&ab->base_lock);