Răsfoiți Sursa

qcacmn: Reset the vdev response timer during SSR

Presently, whenever there is any kind of reference leak in the system
wlan driver doesn't recover and goes into a bad state.

Add support to forcefully reset the vdev response timer so the system
can gracefully recover and wifi can be functional.

Change-Id: Iab705c17f4313e4b8efd980d5427bf8d4ce9496f
CRs-Fixed: 3051962
Arun Kumar Khandavalli 3 ani în urmă
părinte
comite
eb3e1b4096

+ 5 - 0
umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -24,6 +25,8 @@
 #include <wlan_psoc_mlme_api.h>
 #include <qdf_module.h>
 #include "cfg_ucfg_api.h"
+#include "wlan_vdev_mgr_tgt_if_rx_api.h"
+#include <qdf_platform.h>
 
 struct psoc_mlme_obj *wlan_psoc_mlme_get_cmpt_obj(struct wlan_objmgr_psoc *psoc)
 {
@@ -102,6 +105,8 @@ QDF_STATUS mlme_psoc_open(struct wlan_objmgr_psoc *psoc)
 
 QDF_STATUS mlme_psoc_close(struct wlan_objmgr_psoc *psoc)
 {
+	if (qdf_is_recovering())
+		tgt_vdev_mgr_reset_response_timer_info(psoc);
 	return QDF_STATUS_SUCCESS;
 }
 

+ 11 - 1
umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_api.h

@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019,2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -28,6 +29,15 @@
 #include <wlan_objmgr_vdev_obj.h>
 #include <wlan_vdev_mgr_tgt_if_rx_defs.h>
 
+/**
+ * tgt_vdev_mgr_reset_response_timer_info() - API to force reset vdev rsp timer
+ * @psoc: objmgr psoc object
+ *
+ * Return: void
+ */
+void
+tgt_vdev_mgr_reset_response_timer_info(struct wlan_objmgr_psoc *psoc);
+
 /**
  * tgt_vdev_mgr_register_rx_ops() - API to register rx ops with lmac
  * @rx_ops: rx ops struct

+ 25 - 1
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c

@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -33,6 +34,29 @@
 #include <include/wlan_psoc_mlme.h>
 #include <include/wlan_mlme_cmn.h>
 
+void
+tgt_vdev_mgr_reset_response_timer_info(struct wlan_objmgr_psoc *psoc)
+{
+	struct psoc_mlme_obj *psoc_mlme;
+	struct vdev_response_timer *vdev_rsp;
+	int i;
+
+	psoc_mlme = mlme_psoc_get_priv(psoc);
+	if (!psoc_mlme) {
+		mlme_err("PSOC_%d PSOC_MLME is NULL",
+			 wlan_psoc_get_id(psoc));
+		return;
+	}
+
+	for (i = 0; i < WLAN_UMAC_PSOC_MAX_VDEVS; i++) {
+		vdev_rsp = &psoc_mlme->psoc_vdev_rt[i];
+		qdf_atomic_set(&vdev_rsp->rsp_timer_inuse, 0);
+		vdev_rsp->psoc = NULL;
+	}
+}
+
+qdf_export_symbol(tgt_vdev_mgr_reset_response_timer_info);
+
 struct vdev_response_timer *
 tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_psoc *psoc,
 				     uint8_t vdev_id)