qcacld-3.0: Remove CDS instances in HIF
Remove CDS instances in HIF for WIN/MCL convergence.
a. Update con_mode param in HIF
b. Have callbacks to CDS from HIF to update CDS global context
Change-Id: Ie9a65b5684f38bb2bf4feac615b97415e2bc7ed9
CRs-Fixed: 967765
diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h
index c88218f..3356003 100644
--- a/core/cds/inc/cds_api.h
+++ b/core/cds/inc/cds_api.h
@@ -209,6 +209,8 @@
CDF_STATUS cds_free_context(void *p_cds_context, CDF_MODULE_ID moduleID,
void *pModuleContext);
+CDF_STATUS cds_set_context(CDF_MODULE_ID moduleID, void *context);
+
CDF_STATUS cds_get_vdev_types(enum tCDF_ADAPTER_MODE mode, uint32_t *type,
uint32_t *subType);
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index d54bfca..6e3f9ff 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -1122,6 +1122,40 @@
} /* cds_alloc_context() */
/**
+ * cds_set_context() - API to set context in global CDS Context
+ * @moduleID: Module ID
+ * @context: Pointer to the Module Context
+ *
+ * API to set a MODULE Context in gloabl CDS Context
+ *
+ * Return: CDF_STATUS
+ */
+CDF_STATUS cds_set_context(CDF_MODULE_ID module_id, void *context)
+{
+ p_cds_contextType p_cds_context = cds_get_global_context();
+
+ if (!p_cds_context) {
+ CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
+ "cds context is Invald");
+ return CDF_STATUS_NOT_INITIALIZED;
+ }
+
+ switch (module_id) {
+ case CDF_MODULE_ID_HIF:
+ p_cds_context->pHIFContext = context;
+ break;
+ default:
+ CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
+ "%s: Module ID %i does not have its context "
+ "allocated by CDS", __func__, module_id);
+ CDF_ASSERT(0);
+ return CDF_STATUS_E_INVAL;
+ }
+
+ return CDF_STATUS_SUCCESS;
+}
+
+/**
* cds_free_context() - free an allocated context within the
* CDS global Context
* @p_cds_context: pointer to the global Vos context
diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c
index c3d85e8..85abb7c 100644
--- a/core/hdd/src/wlan_hdd_driver_ops.c
+++ b/core/hdd/src/wlan_hdd_driver_ops.c
@@ -108,6 +108,107 @@
#endif
/**
+ * hdd_set_recovery_in_progress() - API to set recovery in progress
+ * @data: Context
+ * @val: Value to set
+ *
+ * Return: None
+ */
+static void hdd_set_recovery_in_progress(void *data, uint8_t val)
+{
+ cds_set_recovery_in_progress(val);
+}
+
+/**
+ * hdd_is_driver_unloading() - API to query if driver is unloading
+ * @data: Private Data
+ *
+ * Return: True/False
+ */
+static bool hdd_is_driver_unloading(void *data)
+{
+ return cds_is_driver_unloading();
+}
+
+/**
+ * hdd_is_load_or_unload_in_progress() - API to query if driver is
+ * loading/unloading
+ * @data: Private Data
+ *
+ * Return: bool
+ */
+static bool hdd_is_load_or_unload_in_progress(void *data)
+{
+ return cds_is_load_or_unload_in_progress();
+}
+
+/**
+ * hdd_is_recovery_in_prgress() - API to query if recovery in progress
+ * @data: Private Data
+ *
+ * Return: bool
+ */
+static bool hdd_is_recovery_in_prgress(void *data)
+{
+ return cds_is_driver_recovering();
+}
+
+/**
+ * hdd_hif_init_cds_callbacks() - API to initialize HIF callbacks
+ * @data: Private Data
+ * @cbk: callbacks
+ *
+ * HIF should be independent of CDS calls. Pass CDS Callbacks to HIF, HIF will
+ * call the callbacks.
+ *
+ * Return: void
+ */
+static void hdd_hif_init_cds_callbacks(void *data, struct hif_callbacks *cbk)
+{
+ cbk->context = data;
+ cbk->set_recovery_in_progress = hdd_set_recovery_in_progress;
+ cbk->get_monotonic_boottime = cds_get_monotonic_boottime;
+ cbk->is_recovery_in_progress = hdd_is_recovery_in_prgress;
+ cbk->is_load_unload_in_progress = hdd_is_load_or_unload_in_progress;
+ cbk->is_driver_unloading = hdd_is_driver_unloading;
+}
+
+/**
+ * hdd_init_cds_hif_context() - API to set CDS HIF Context
+ * @hif: HIF Context
+ *
+ * Return: success/failure
+ */
+static int hdd_init_cds_hif_context(void *hif)
+{
+ CDF_STATUS status;
+
+ status = cds_set_context(CDF_MODULE_ID_HIF, hif);
+
+ if (status)
+ return -ENOENT;
+
+ return 0;
+}
+
+/**
+ * hdd_deinit_cds_hif_context() - API to clear CDS HIF COntext
+ *
+ * Return: None
+ */
+static void hdd_deinit_cds_hif_context(void)
+{
+ CDF_STATUS status;
+
+ status = cds_set_context(CDF_MODULE_ID_HIF, NULL);
+
+ if (status)
+ hdd_err("Failed to reset CDS HIF Context");
+
+ return;
+}
+
+/**
* hdd_hif_open() - HIF open helper
* @dev: wlan device structure
* @bdev: bus device structure
@@ -124,23 +225,31 @@
{
CDF_STATUS status;
int ret = 0;
- void *hif_ctx;
+ struct hif_opaque_softc *hif_ctx;
cdf_device_t cdf_ctx = cds_get_context(CDF_MODULE_ID_CDF_DEVICE);
+ struct hif_callbacks cbk;
+ uint32_t mode = cds_get_conparam();
- status = hif_open(cdf_ctx, bus_type);
- if (!CDF_IS_STATUS_SUCCESS(status)) {
- hdd_err("hif_open error = %d", status);
- return cdf_status_to_os_return(status);
+ hdd_hif_init_cds_callbacks(dev, &cbk);
+
+ hif_ctx = hif_open(cdf_ctx, mode, bus_type, &cbk);
+ if (!hif_ctx) {
+ hdd_err("hif_open error");
+ return -ENOMEM;
}
- hif_ctx = cds_get_context(CDF_MODULE_ID_HIF);
+ ret = hdd_init_cds_hif_context(hif_ctx);
+ if (ret) {
+ hdd_err("Failed to set global HIF CDS Context err:%d", ret);
+ goto err_hif_close;
+ }
ret = hdd_napi_create();
if (hdd_napi_enabled(HDD_NAPI_ANY)) {
- hdd_info("hdd_napi_create returned: %d", status);
+ hdd_info("hdd_napi_create returned: %d", ret);
if (ret <= 0) {
hdd_err("NAPI creation error, rc: 0x%x, reinit = %d",
- status, reinit);
+ ret, reinit);
ret = -EFAULT;
goto err_hif_close;
}
@@ -162,10 +271,9 @@
hdd_napi_destroy(true);
err_hif_close:
+ hdd_deinit_cds_hif_context();
hif_close(hif_ctx);
-
return ret;
-
}
/**
@@ -183,6 +291,7 @@
hdd_napi_destroy(true);
+ hdd_deinit_cds_hif_context();
hif_close(hif_ctx);
}
@@ -221,6 +330,7 @@
CDF_STATUS status;
int ret = 0;
cdf_device_t cdf_dev;
+ uint32_t mode = cds_get_conparam();
pr_info("%s: %sprobing driver v%s\n", WLAN_MODULE_NAME,
reinit ? "re-" : "", QWLAN_VERSIONSTR);
@@ -245,7 +355,7 @@
cds_set_load_in_progress(true);
}
- if (WLAN_IS_EPPING_ENABLED(cds_get_conparam())) {
+ if (WLAN_IS_EPPING_ENABLED(mode)) {
status = epping_open();
if (status != CDF_STATUS_SUCCESS)
goto err_hdd_deinit;
@@ -295,7 +405,7 @@
err_hif_close:
hdd_hif_close(hif_ctx);
err_epping_close:
- if (WLAN_IS_EPPING_ENABLED(cds_get_conparam()))
+ if (WLAN_IS_EPPING_ENABLED(mode))
epping_close();
err_hdd_deinit:
cds_set_load_in_progress(false);