Browse Source

qcacld-3.0: Handle twt renegotiation failure scenario

Handle twt renegotiation failure scenario when there is
error reported by firmware as part of
wmi_twt_ack_complete_event_id event.

Change-Id: I91e4bfd8f08ae81b474354c90ab8c770dcdfe19b
CRs-Fixed: 3297783
Nirav Shah 2 years ago
parent
commit
2e86058c4a

+ 4 - 3
components/umac/twt/core/src/wlan_twt_main.c

@@ -2150,7 +2150,8 @@ QDF_STATUS wlan_twt_update_beacon_template(void)
 
 void wlan_twt_set_work_params(
 			struct wlan_objmgr_vdev *vdev,
-			struct twt_add_dialog_complete_event_param *params,
+			struct qdf_mac_addr *peer_mac,
+			uint8_t dialog_id,
 			uint32_t twt_next_action)
 {
 	struct twt_vdev_priv_obj *twt_vdev_priv;
@@ -2163,8 +2164,8 @@ void wlan_twt_set_work_params(
 		return;
 	}
 
-	qdf_copy_macaddr(&twt_vdev_priv->peer_macaddr, &params->peer_macaddr);
-	twt_vdev_priv->dialog_id = params->dialog_id;
+	qdf_copy_macaddr(&twt_vdev_priv->peer_macaddr, peer_mac);
+	twt_vdev_priv->dialog_id = dialog_id;
 	twt_vdev_priv->next_action = twt_next_action;
 
 	twt_debug("renego: twt_terminate: dialog_id:%d next_action:%d peer mac_addr  "

+ 4 - 2
components/umac/twt/core/src/wlan_twt_main.h

@@ -291,14 +291,16 @@ bool wlan_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
 /**
  * wlan_twt_set_work_params() - Set TWT work params
  * @vdev: vdev pointer
- * @params: TWT add dialog params
+ * @peer_mac: mac address of peer
+ * @dialog_id: dialog_id of TWT session
  * @twt_next_action: Set next action to do before work scheduled
  *
  * Return: None
  */
 void wlan_twt_set_work_params(
 			struct wlan_objmgr_vdev *vdev,
-			struct twt_add_dialog_complete_event_param *params,
+			struct qdf_mac_addr *peer_mac,
+			uint8_t dialog_id,
 			uint32_t twt_next_action);
 
 /**

+ 6 - 3
components/umac/twt/dispatcher/inc/wlan_twt_ucfg_ext_api.h

@@ -281,14 +281,16 @@ bool ucfg_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
 /**
  * ucfg_twt_set_work_params() - Set TWT work params
  * @vdev: Vdev pointer
- * @params: TWT params
+ * @peer_mac: peer mac address
+ * @dialog_id: dialog_id
  * @twt_next_action: Set TWT next action to do before work schedule
  *
  * Return: None
  */
 void ucfg_twt_set_work_params(
 		struct wlan_objmgr_vdev *vdev,
-		struct twt_add_dialog_complete_event_param *params,
+		struct qdf_mac_addr *peer_mac,
+		uint8_t dialog_id,
 		uint32_t twt_next_action);
 
 /**
@@ -404,7 +406,8 @@ ucfg_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
 static inline void
 ucfg_twt_set_work_params(
 		struct wlan_objmgr_vdev *vdev,
-		struct twt_add_dialog_complete_event_param *params,
+		struct qdf_mac_addr *peer_mac,
+		uint8_t dialog_id,
 		uint32_t twt_next_action)
 {
 }

+ 4 - 2
components/umac/twt/dispatcher/src/wlan_twt_ucfg_ext_api.c

@@ -214,10 +214,12 @@ bool ucfg_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
 
 void ucfg_twt_set_work_params(
 		struct wlan_objmgr_vdev *vdev,
-		struct twt_add_dialog_complete_event_param *params,
+		struct qdf_mac_addr *peer_mac,
+		uint8_t dialog_id,
 		uint32_t twt_next_action)
 {
-	return wlan_twt_set_work_params(vdev, params, twt_next_action);
+	return wlan_twt_set_work_params(vdev, peer_mac, dialog_id,
+					twt_next_action);
 }
 
 void ucfg_twt_get_work_params(

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

@@ -459,6 +459,17 @@ osif_twt_ack_wait_response(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+static void
+osif_send_twt_delete_cmd(struct wlan_objmgr_vdev *vdev,
+			 struct qdf_mac_addr *peer_mac, uint8_t dialog_id)
+{
+	uint32_t twt_next_action = HOST_TWT_SEND_DELETE_CMD;
+
+	ucfg_twt_set_work_params(vdev, peer_mac,
+				 dialog_id, twt_next_action);
+	qdf_sched_work(0, &vdev->twt_work);
+}
+
 static int
 osif_send_twt_setup_req(struct wlan_objmgr_vdev *vdev,
 			struct wlan_objmgr_psoc *psoc,
@@ -508,8 +519,22 @@ osif_send_twt_setup_req(struct wlan_objmgr_vdev *vdev,
 	if (ack_priv->status) {
 		osif_err("Received TWT ack error: %d. Reset twt command",
 			 ack_priv->status);
-		ucfg_twt_init_context(psoc, &twt_params->peer_macaddr,
-				      twt_params->dialog_id);
+
+		if (ucfg_twt_is_setup_done(psoc,
+					   &twt_params->peer_macaddr,
+					   twt_params->dialog_id)) {
+			/* If TWT setup is already done then this is
+			 * renegotiation failure scenario.
+			 * Terminate TWT session on renegotiation failure.
+			 */
+			osif_debug("setup_done set, renego failure");
+			osif_send_twt_delete_cmd(vdev,
+						 &twt_params->peer_macaddr,
+						 twt_params->dialog_id);
+		} else {
+			ucfg_twt_init_context(psoc, &twt_params->peer_macaddr,
+					      twt_params->dialog_id);
+		}
 
 		switch (ack_priv->status) {
 		case HOST_ADD_TWT_STATUS_INVALID_PARAM:
@@ -1073,7 +1098,6 @@ osif_twt_handle_renego_failure(struct wlan_objmgr_psoc *psoc,
 	struct wlan_objmgr_pdev *pdev;
 	struct wlan_objmgr_vdev *vdev;
 	uint32_t vdev_id;
-	uint32_t twt_next_action = 0;
 
 	if (!event)
 		return;
@@ -1099,9 +1123,8 @@ osif_twt_handle_renego_failure(struct wlan_objmgr_psoc *psoc,
 		goto end;
 	}
 
-	twt_next_action = HOST_TWT_SEND_DELETE_CMD;
-	ucfg_twt_set_work_params(vdev, &event->params, twt_next_action);
-	qdf_sched_work(0, &vdev->twt_work);
+	osif_send_twt_delete_cmd(vdev, &event->params.peer_macaddr,
+				 event->params.dialog_id);
 
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TWT_ID);