Browse Source

qcacld-3.0: Add code to handle hang event data via ICNSS_UEVENT_HANG_DATA

Add code to handle hang event data via ICNSS_UEVENT_HANG_DATA
uevent.

Change-Id: I3efe64fab7c8fcd78eb23f32152ca23e40f1f1f7
Aasir Rasheed 4 years ago
parent
commit
437828f8f1
1 changed files with 58 additions and 0 deletions
  1. 58 0
      core/pld/src/pld_ipci.c

+ 58 - 0
core/pld/src/pld_ipci.c

@@ -287,12 +287,25 @@ static int pld_ipci_runtime_resume(struct device *dev)
 	return 0;
 }
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
+static int pld_update_hang_evt_data(struct icnss_uevent_hang_data *evt_data,
+				    struct pld_uevent_data *data)
+{
+	if (!evt_data || !data)
+		return -EINVAL;
+
+	data->hang_data.hang_event_data = evt_data->hang_event_data;
+	data->hang_data.hang_event_data_len = evt_data->hang_event_data_len;
+	return 0;
+}
+
 static int pld_ipci_uevent(struct device *dev,
 			   struct icnss_uevent_data *uevent)
 {
 	struct pld_context *pld_context;
 	struct icnss_uevent_fw_down_data *uevent_data = NULL;
 	struct pld_uevent_data data = {0};
+	struct icnss_uevent_hang_data *hang_data = NULL;
 
 	pld_context = pld_get_global_context();
 	if (!pld_context)
@@ -315,6 +328,13 @@ static int pld_ipci_uevent(struct device *dev,
 		data.uevent = PLD_FW_DOWN;
 		data.fw_down.crashed = uevent_data->crashed;
 		break;
+	case ICNSS_UEVENT_HANG_DATA:
+		if (!uevent->data)
+			return -EINVAL;
+		hang_data = (struct icnss_uevent_hang_data *)uevent->data;
+		data.uevent = PLD_FW_HANG_EVENT;
+		pld_update_hang_evt_data(hang_data, &data);
+		break;
 	default:
 		goto out;
 	}
@@ -323,6 +343,44 @@ static int pld_ipci_uevent(struct device *dev,
 out:
 	return 0;
 }
+#else
+static int pld_ipci_uevent(struct device *dev,
+			   struct icnss_uevent_data *uevent)
+{
+	struct pld_context *pld_context;
+	struct icnss_uevent_fw_down_data *uevent_data = NULL;
+	struct pld_uevent_data data = {0};
+
+	pld_context = pld_get_global_context();
+	if (!pld_context)
+		return -EINVAL;
+
+	if (!pld_context->ops->uevent)
+		goto out;
+
+	if (!uevent)
+		return -EINVAL;
+
+	switch (uevent->uevent) {
+	case ICNSS_UEVENT_FW_CRASHED:
+		data.uevent = PLD_FW_CRASHED;
+		break;
+	case ICNSS_UEVENT_FW_DOWN:
+		if (!uevent->data)
+			return -EINVAL;
+		uevent_data = (struct icnss_uevent_fw_down_data *)uevent->data;
+		data.uevent = PLD_FW_DOWN;
+		data.fw_down.crashed = uevent_data->crashed;
+		break;
+	default:
+		goto out;
+	}
+
+	pld_context->ops->uevent(dev, &data);
+out:
+	return 0;
+}
+#endif
 
 /**
  * pld_ipci_idle_restart_cb() - Perform idle restart