Browse Source

qcacld-3.0: Send TWT teardown if power save mode is disabled

When power save mode is disabled, TWT is also disabled. All existing
TWT sessions must be removed.

Change-Id: I7c1ceb7abbfea0205e65a038fdf8d574b797685e
CRs-Fixed: 3147231
David Oladunjoye 3 years ago
parent
commit
a26ed5042c
3 changed files with 49 additions and 0 deletions
  1. 2 0
      core/hdd/src/wlan_hdd_twt.c
  2. 18 0
      os_if/twt/inc/osif_twt_internal.h
  3. 29 0
      os_if/twt/src/osif_twt_ext_req.c

+ 2 - 0
core/hdd/src/wlan_hdd_twt.c

@@ -111,6 +111,8 @@ void hdd_twt_del_dialog_in_ps_disable(struct hdd_context *hdd_ctx,
 				      struct qdf_mac_addr *mac_addr,
 				      uint8_t vdev_id)
 {
+	return osif_twt_teardown_in_ps_disable(hdd_ctx->psoc, mac_addr,
+					       vdev_id);
 }
 
 void hdd_send_twt_role_disable_cmd(struct hdd_context *hdd_ctx,

+ 18 - 0
os_if/twt/inc/osif_twt_internal.h

@@ -90,6 +90,18 @@ int osif_twt_send_responder_disable_cmd(struct wlan_objmgr_psoc *psoc,
  */
 void osif_twt_concurrency_update_handler(struct wlan_objmgr_psoc *psoc,
 					 struct wlan_objmgr_pdev *pdev);
+
+/**
+ * osif_twt_teardown_in_ps_disable() - Send TWT teardown if power save
+ * mode is disabled
+ *
+ * @psoc: pointer to global psoc structure
+ * @mac_addr: Peer MAC Address
+ * @vdev_id: vdev_id
+ */
+void osif_twt_teardown_in_ps_disable(struct wlan_objmgr_psoc *psoc,
+				     struct qdf_mac_addr *mac_addr,
+				     uint8_t vdev_id);
 #else
 static inline
 int osif_twt_send_requestor_disable_cmd(struct wlan_objmgr_psoc *psoc,
@@ -117,6 +129,12 @@ void osif_twt_concurrency_update_handler(struct wlan_objmgr_psoc *psoc,
 					 struct wlan_objmgr_pdev *pdev)
 {
 }
+static inline
+void osif_twt_teardown_in_ps_disable(struct wlan_objmgr_psoc *psoc,
+				     struct qdf_mac_addr *mac_addr,
+				     uint8_t vdev_id)
+{
+}
 #endif
 #endif /* _OSIF_TWT_INTERNAL_H_ */
 

+ 29 - 0
os_if/twt/src/osif_twt_ext_req.c

@@ -895,6 +895,35 @@ int osif_twt_send_responder_disable_cmd(struct wlan_objmgr_psoc *psoc,
 	return osif_twt_responder_disable(psoc, &req);
 }
 
+void osif_twt_teardown_in_ps_disable(struct wlan_objmgr_psoc *psoc,
+				     struct qdf_mac_addr *mac_addr,
+				     uint8_t vdev_id)
+{
+	struct twt_del_dialog_param params = {0};
+	int ret;
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_TWT_ID);
+	if (!vdev) {
+		osif_err("vdev is NULL");
+		return;
+	}
+
+	params.dialog_id = TWT_ALL_SESSIONS_DIALOG_ID;
+	params.vdev_id = vdev_id;
+	qdf_copy_macaddr(&params.peer_macaddr, mac_addr);
+
+	if (ucfg_twt_is_setup_done(psoc, mac_addr, params.dialog_id)) {
+		osif_debug("vdev%d: Terminate existing TWT session %d due to ps disable",
+			  params.vdev_id, params.dialog_id);
+		ret = osif_send_sta_twt_teardown_req(vdev, psoc, &params);
+		if (ret)
+			osif_debug("TWT teardown is failed on vdev: %d",
+				   vdev_id);
+	}
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_TWT_ID);
+}
+
 int osif_twt_get_capabilities(struct wlan_objmgr_vdev *vdev)
 {
 	struct wlan_objmgr_psoc *psoc;