Răsfoiți Sursa

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 ani în urmă
părinte
comite
d48b01664d
1 a modificat fișierele cu 53 adăugiri și 8 ștergeri
  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