Selaa lähdekoodia

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 vuotta sitten
vanhempi
sitoutus
f434bda1f6
1 muutettua tiedostoa jossa 28 lisäystä ja 17 poistoa
  1. 28 17
      umac/mlme/vdev_mgr/core/src/vdev_mlme_sm_actions.c

+ 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;
 }
 
+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,
 					    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_mlme_op_clear(pdev,
 						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);
 
@@ -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);
 }
 
-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,
 				      void *object,
 				      void *arg)