Bladeren bron

qcacld-3.0: Restrict PLD event as per the driver state

PLD event try to clean up the driver data structures
which is not even initialized.
Restrict the PLD event, if the driver is loading and
not initialized.

Change-Id: I914adac8efc080d01f3ccd43d024427770f9018f
CRs-Fixed: 2147359
Kabilan Kannan 7 jaren geleden
bovenliggende
commit
d48b01664d
1 gewijzigde bestanden met toevoegingen van 53 en 8 verwijderingen
  1. 53 8
      core/hdd/src/wlan_hdd_driver_ops.c

+ 53 - 8
core/hdd/src/wlan_hdd_driver_ops.c

@@ -1437,33 +1437,78 @@ static void wlan_hdd_purge_notifier(void)
 }
 
 /**
- * wlan_hdd_pld_uevent() - update driver status
- * @dev: device
+ * wlan_hdd_set_the_pld_uevent() - set the pld event
  * @uevent: uevent status
  *
  * Return: void
  */
-static void wlan_hdd_pld_uevent(struct device *dev,
-				struct pld_uevent_data *uevent)
+static void wlan_hdd_set_the_pld_uevent(struct pld_uevent_data *uevent)
 {
-
-	hdd_info("pld event %d", uevent->uevent);
 	switch (uevent->uevent) {
 	case PLD_RECOVERY:
 		cds_set_recovery_in_progress(true);
-		hdd_pld_ipa_uc_shutdown_pipes();
 		break;
 	case PLD_FW_DOWN:
 		cds_set_fw_state(CDS_FW_STATE_DOWN);
+		break;
+	case PLD_FW_READY:
+		cds_set_target_ready(true);
+		break;
+	}
+}
+
+/**
+ * wlan_hdd_handle_the_pld_uevent() - handle the pld event
+ * @uevent: uevent status
+ *
+ * Return: void
+ */
+static void wlan_hdd_handle_the_pld_uevent(struct pld_uevent_data *uevent)
+{
+	enum cds_driver_state driver_state;
+
+	driver_state = cds_get_driver_state();
+
+	if (driver_state == CDS_DRIVER_STATE_UNINITIALIZED)
+		return;
+
+	if (cds_is_driver_loading())
+		return;
+
+	switch (uevent->uevent) {
+	case PLD_RECOVERY:
+		hdd_pld_ipa_uc_shutdown_pipes();
+		break;
+	case PLD_FW_DOWN:
 		qdf_complete_wait_events();
 		cds_set_target_ready(false);
 		break;
 	case PLD_FW_READY:
-		cds_set_target_ready(true);
+	default:
 		break;
 	}
+}
+
+/**
+ * wlan_hdd_pld_uevent() - update driver status
+ * @dev: device
+ * @uevent: uevent status
+ *
+ * Return: void
+ */
+static void wlan_hdd_pld_uevent(struct device *dev,
+				struct pld_uevent_data *uevent)
+{
+	ENTER();
+	hdd_info("pld event %d", uevent->uevent);
+
+	mutex_lock(&hdd_init_deinit_lock);
+	wlan_hdd_set_the_pld_uevent(uevent);
+	wlan_hdd_handle_the_pld_uevent(uevent);
+	mutex_unlock(&hdd_init_deinit_lock);
 
 	wlan_hdd_purge_notifier();
+	EXIT();
 }
 
 #ifdef FEATURE_RUNTIME_PM