mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
wifi: ath12k: Add support to handle reason inactivity STA kickout event for QCN9274/IPQ5332
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>
This commit is contained in:
parent
59a2ef69ec
commit
9891fbd9d8
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user