Browse Source

qca-wifi: Activate deferred start send to FW

Start cmd send to FW is deferred when restart is in progress and
activated when restart is sent to FW.
There can be scenario where this restart is cancelled if the VDEV
is brought down as part of STOP cmd, during which the deferred start
cmd is not activated.

Add change to activate the deferred start on cancellation of multi
vdev restart

Change-Id: Ie202454f67943761219933be5b91a28ecba15c13
Santosh Anbu 4 năm trước cách đây
mục cha
commit
f434bda1f6

+ 28 - 17
umac/mlme/vdev_mgr/core/src/vdev_mlme_sm_actions.c

@@ -189,6 +189,23 @@ static QDF_STATUS mlme_stop_pending_start(struct wlan_objmgr_pdev *pdev,
 	return status;
 	return status;
 }
 }
 
 
+static void wlan_vdev_start_fw_send(struct wlan_objmgr_pdev *pdev,
+				    void *object,
+				    void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
+	unsigned long *send_array = (unsigned long *)arg;
+
+	if (wlan_util_map_index_is_set(send_array, wlan_vdev_get_id(vdev)) ==
+					false)
+		return;
+
+	mlme_vdev_start_fw_cmd_send(pdev, vdev, 0);
+
+	 /* Reset the flag */
+	wlan_util_change_map_index(send_array, wlan_vdev_get_id(vdev), 0);
+}
+
 static QDF_STATUS mlme_stop_pending_restart(struct wlan_objmgr_pdev *pdev,
 static QDF_STATUS mlme_stop_pending_restart(struct wlan_objmgr_pdev *pdev,
 					    struct wlan_objmgr_vdev *vdev)
 					    struct wlan_objmgr_vdev *vdev)
 {
 {
@@ -227,7 +244,18 @@ static QDF_STATUS mlme_stop_pending_restart(struct wlan_objmgr_pdev *pdev,
 					 WLAN_PDEV_OP_RESTART_INPROGRESS);
 					 WLAN_PDEV_OP_RESTART_INPROGRESS);
 			wlan_pdev_mlme_op_clear(pdev,
 			wlan_pdev_mlme_op_clear(pdev,
 						WLAN_PDEV_OP_MBSSID_RESTART);
 						WLAN_PDEV_OP_MBSSID_RESTART);
+
+			if (wlan_util_map_is_any_index_set(
+			    pdev_mlme->start_send_vdev_arr,
+			    sizeof(pdev_mlme->start_send_vdev_arr))) {
+				wlan_objmgr_pdev_iterate_obj_list(
+					 pdev, WLAN_VDEV_OP,
+					 wlan_vdev_start_fw_send,
+					 pdev_mlme->start_send_vdev_arr, 0,
+					 WLAN_MLME_NB_ID);
+			}
 		}
 		}
+
 	}
 	}
 	qdf_spin_unlock_bh(&pdev_mlme->vdev_restart_lock);
 	qdf_spin_unlock_bh(&pdev_mlme->vdev_restart_lock);
 
 
@@ -250,23 +278,6 @@ static void wlan_vdev_restart_fw_send(struct wlan_objmgr_pdev *pdev,
 	wlan_util_change_map_index(send_array, wlan_vdev_get_id(vdev), 0);
 	wlan_util_change_map_index(send_array, wlan_vdev_get_id(vdev), 0);
 }
 }
 
 
-static void wlan_vdev_start_fw_send(struct wlan_objmgr_pdev *pdev,
-				    void *object,
-				    void *arg)
-{
-	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
-	unsigned long *send_array = (unsigned long *)arg;
-
-	if (wlan_util_map_index_is_set(send_array, wlan_vdev_get_id(vdev)) ==
-					false)
-		return;
-
-	mlme_vdev_start_fw_cmd_send(pdev, vdev, 0);
-
-	 /* Reset the flag */
-	wlan_util_change_map_index(send_array, wlan_vdev_get_id(vdev), 0);
-}
-
 static void wlan_vdev_update_des_chan(struct wlan_objmgr_pdev *pdev,
 static void wlan_vdev_update_des_chan(struct wlan_objmgr_pdev *pdev,
 				      void *object,
 				      void *object,
 				      void *arg)
 				      void *arg)