summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrashanth Bhatta <bhattap@qca.qualcomm.com>2015-12-10 17:21:29 -0800
committerSatish Singh <ssing@codeaurora.org>2015-12-28 22:35:55 -0800
commitedd6ca2e390437740395f33bc22fca83d65176a8 (patch)
tree68332f990e250574c27d5c1ea1db44f2fe127251
parent0413ba4ab19e3b64f7d99754c268ad9542ded9cb (diff)
qcacld-3.0: Move module init related implementation together
Move module init/exit related implementation together and at the end of the file. Change-Id: I17a02e4fdddc17fc3a725c29e89a52f5bd9d49b9 CRs-fixed: 950170
-rw-r--r--core/hdd/src/wlan_hdd_main.c668
1 files changed, 334 insertions, 334 deletions
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 3edc5ad318c5..866b08e4359c 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -5555,340 +5555,6 @@ success:
return 0;
}
-/*
- * In BMI Phase we are only sending small chunk (256 bytes) of the FW image at
- * a time, and wait for the completion interrupt to start the next transfer.
- * During this phase, the KRAIT is entering IDLE/StandAlone(SA) Power Save(PS).
- * The delay incurred for resuming from IDLE/SA PS is huge during driver load.
- * So prevent APPS IDLE/SA PS durint driver load for reducing interrupt latency.
- */
-
-#ifdef CONFIG_CNSS
-static inline void hdd_request_pm_qos(int val)
-{
- cnss_request_pm_qos(val);
-}
-
-static inline void hdd_remove_pm_qos(void)
-{
- cnss_remove_pm_qos();
-}
-#else
-static inline void hdd_request_pm_qos(int val)
-{
-}
-
-static inline void hdd_remove_pm_qos(void)
-{
-}
-#endif
-
-/**
- * hdd_driver_init() - Core Driver Init Function
- *
- * This is the driver entry point - called in different timeline depending
- * on whether the driver is statically or dynamically linked
- *
- * Return: 0 for success, non zero for failure
- */
-static int hdd_driver_init(void)
-{
- CDF_STATUS status;
- v_CONTEXT_t p_cds_context = NULL;
- int ret_status = 0;
- unsigned long rc;
-
-#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
- wlan_logging_sock_init_svc();
-#endif
-
- ENTER();
-
- cdf_wake_lock_init(&wlan_wake_lock, "wlan");
- hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
- /*
- * The Krait is going to Idle/Stand Alone Power Save
- * more aggressively which is resulting in the longer driver load time.
- * The Fix is to not allow Krait to enter Idle Power Save during driver
- * load.
- */
- hdd_request_pm_qos(DISABLE_KRAIT_IDLE_PS_VAL);
- cds_ssr_protect_init();
-
- pr_info("%s: loading driver v%s\n", WLAN_MODULE_NAME,
- QWLAN_VERSIONSTR TIMER_MANAGER_STR MEMORY_DEBUG_STR);
-
- do {
- cdf_mc_timer_manager_init();
- cdf_mem_init();
- /* Allocate CDS global context */
- status = cds_alloc_global_context(&p_cds_context);
-
- if (!CDF_IS_STATUS_SUCCESS(status)) {
- hddLog(CDF_TRACE_LEVEL_FATAL,
- FL("Failed to preOpen CDS"));
- ret_status = -1;
- break;
- }
-
- hdd_trace_init();
-
-#ifndef MODULE
- /*
- * For statically linked driver, call hdd_set_conparam to update
- * curr_con_mode
- */
- hdd_set_conparam((uint32_t) con_mode);
-#endif
-
-#ifdef QCA_WIFI_3_0_ADRASTEA
-#define HDD_WLAN_START_WAIT_TIME (3600 * 1000)
-#else
-#define HDD_WLAN_START_WAIT_TIME (CDS_WMA_TIMEOUT + 5000)
-#endif
-
- init_completion(&wlan_start_comp);
- ret_status = wlan_hdd_register_driver();
- if (!ret_status) {
- rc = wait_for_completion_timeout(
- &wlan_start_comp,
- msecs_to_jiffies(HDD_WLAN_START_WAIT_TIME));
- if (!rc) {
- hddLog(LOGP,
- FL("timed-out waiting for wlan_hdd_register_driver"));
- ret_status = -1;
- } else
- ret_status = 0;
- }
-
- hdd_remove_pm_qos();
- hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
-
- if (ret_status) {
- hddLog(LOGP, FL("WLAN Driver Initialization failed"));
- wlan_hdd_unregister_driver();
- cds_free_global_context(&p_cds_context);
- ret_status = -ENODEV;
- break;
- } else {
- pr_info("%s: driver loaded\n", WLAN_MODULE_NAME);
- memdump_init();
- return 0;
- }
-
- } while (0);
-
- if (0 != ret_status) {
- cdf_mc_timer_exit();
- cdf_mem_exit();
- cdf_wake_lock_destroy(&wlan_wake_lock);
-
-#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
- wlan_logging_sock_deinit_svc();
-#endif
- memdump_deinit();
- pr_err("%s: driver load failure\n", WLAN_MODULE_NAME);
- } else {
- pr_info("%s: driver loaded\n", WLAN_MODULE_NAME);
- }
-
- EXIT();
-
- return ret_status;
-}
-
-/**
- * hdd_module_init() - Init Function
- *
- * This is the driver entry point (invoked when module is loaded using insmod)
- *
- * Return: 0 for success, non zero for failure
- */
-#ifdef MODULE
-static int __init hdd_module_init(void)
-{
- return hdd_driver_init();
-}
-#else /* #ifdef MODULE */
-static int __init hdd_module_init(void)
-{
- /* Driver initialization is delayed to fwpath_changed_handler */
- return 0;
-}
-#endif /* #ifdef MODULE */
-
-/**
- * hdd_driver_exit() - Exit function
- *
- * This is the driver exit point (invoked when module is unloaded using rmmod
- * or con_mode was changed by userspace)
- *
- * Return: None
- */
-static void hdd_driver_exit(void)
-{
- hdd_context_t *hdd_ctx = NULL;
- int retry = 0;
-
- pr_info("%s: unloading driver v%s\n", WLAN_MODULE_NAME,
- QWLAN_VERSIONSTR);
-
- hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
- if (!hdd_ctx) {
- hddLog(CDF_TRACE_LEVEL_FATAL,
- FL("module exit called before probe"));
- } else {
- /* Check IPA HW Pipe shutdown */
- hdd_ipa_uc_force_pipe_shutdown(hdd_ctx);
-#ifdef QCA_PKT_PROTO_TRACE
- cds_pkt_proto_trace_close();
-#endif /* QCA_PKT_PROTO_TRACE */
- while (hdd_ctx->isLogpInProgress ||
- cds_is_logp_in_progress()) {
- hddLog(CDF_TRACE_LEVEL_FATAL,
- FL(
- "SSR in Progress; block rmmod for 1 second!!!"
- ));
- msleep(1000);
-
- if (retry++ == HDD_MOD_EXIT_SSR_MAX_RETRIES) {
- hddLog(CDF_TRACE_LEVEL_FATAL,
- FL("SSR never completed, fatal error"));
- CDF_BUG(0);
- }
- }
-
- rtnl_lock();
- hdd_ctx->isUnloadInProgress = true;
- cds_set_load_unload_in_progress(true);
- rtnl_unlock();
- }
-
- cds_wait_for_work_thread_completion(__func__);
- memdump_deinit();
-
- wlan_hdd_unregister_driver();
- return;
-}
-
-/**
- * hdd_module_exit() - Exit function
- *
- * This is the driver exit point (invoked when module is unloaded using rmmod)
- *
- * Return: None
- */
-static void __exit hdd_module_exit(void)
-{
- hdd_driver_exit();
-}
-
-#ifdef MODULE
-static int fwpath_changed_handler(const char *kmessage, struct kernel_param *kp)
-{
- return param_set_copystring(kmessage, kp);
-}
-
-#if !defined(QCA_WIFI_FTM)
-static int con_mode_handler(const char *kmessage, struct kernel_param *kp)
-{
- return param_set_int(kmessage, kp);
-}
-#endif
-#else /* #ifdef MODULE */
-/**
- * kickstart_driver() - driver entry point
- *
- * This is the driver entry point
- * - delayed driver initialization when driver is statically linked
- * - invoked when module parameter fwpath is modified from userspace to signal
- * initializing the WLAN driver or when con_mode is modified from userspace
- * to signal a switch in operating mode
- *
- * Return: 0 for success, non zero for failure
- */
-static int kickstart_driver(void)
-{
- int ret_status;
-
- if (!wlan_hdd_inited) {
- ret_status = hdd_driver_init();
- wlan_hdd_inited = ret_status ? 0 : 1;
- return ret_status;
- }
-
- hdd_driver_exit();
-
- msleep(200);
-
- ret_status = hdd_driver_init();
- wlan_hdd_inited = ret_status ? 0 : 1;
- return ret_status;
-}
-
-/**
- * fwpath_changed_handler() - Handler Function
- *
- * Handle changes to the fwpath parameter
- *
- * Return: 0 for success, non zero for failure
- */
-static int fwpath_changed_handler(const char *kmessage, struct kernel_param *kp)
-{
- int ret;
-
- ret = param_set_copystring(kmessage, kp);
- if (0 == ret)
- ret = kickstart_driver();
- return ret;
-}
-
-#if !defined(QCA_WIFI_FTM)
-/**
- * con_mode_handler() - handls module param con_mode change
- *
- * Handler function for module param con_mode when it is changed by userspace
- * Dynamically linked - do nothing
- * Statically linked - exit and init driver, as in rmmod and insmod
- *
- * Return -
- */
-static int con_mode_handler(const char *kmessage, struct kernel_param *kp)
-{
- int ret;
-
- ret = param_set_int(kmessage, kp);
- if (0 == ret)
- ret = kickstart_driver();
- return ret;
-}
-#endif
-#endif /* #ifdef MODULE */
-
-/**
- * hdd_get_conparam() - driver exit point
- *
- * This is the driver exit point (invoked when module is unloaded using rmmod)
- *
- * Return: tCDF_CON_MODE
- */
-tCDF_CON_MODE hdd_get_conparam(void)
-{
-#ifdef MODULE
- return (tCDF_CON_MODE) con_mode;
-#else
- return (tCDF_CON_MODE) curr_con_mode;
-#endif
-}
-
-void hdd_set_conparam(uint32_t newParam)
-{
- con_mode = newParam;
-#ifndef MODULE
- curr_con_mode = con_mode;
-#endif
-}
-
/**
* hdd_softap_sta_deauth() - handle deauth req from HDD
* @adapter: Pointer to the HDD
@@ -6782,6 +6448,340 @@ const char *hdd_get_fwpath(void)
return fwpath.string;
}
+/*
+ * In BMI Phase we are only sending small chunk (256 bytes) of the FW image at
+ * a time, and wait for the completion interrupt to start the next transfer.
+ * During this phase, the KRAIT is entering IDLE/StandAlone(SA) Power Save(PS).
+ * The delay incurred for resuming from IDLE/SA PS is huge during driver load.
+ * So prevent APPS IDLE/SA PS durint driver load for reducing interrupt latency.
+ */
+
+#ifdef CONFIG_CNSS
+static inline void hdd_request_pm_qos(int val)
+{
+ cnss_request_pm_qos(val);
+}
+
+static inline void hdd_remove_pm_qos(void)
+{
+ cnss_remove_pm_qos();
+}
+#else
+static inline void hdd_request_pm_qos(int val)
+{
+}
+
+static inline void hdd_remove_pm_qos(void)
+{
+}
+#endif
+
+/**
+ * hdd_driver_init() - Core Driver Init Function
+ *
+ * This is the driver entry point - called in different timeline depending
+ * on whether the driver is statically or dynamically linked
+ *
+ * Return: 0 for success, non zero for failure
+ */
+static int hdd_driver_init(void)
+{
+ CDF_STATUS status;
+ v_CONTEXT_t p_cds_context = NULL;
+ int ret_status = 0;
+ unsigned long rc;
+
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+ wlan_logging_sock_init_svc();
+#endif
+
+ ENTER();
+
+ cdf_wake_lock_init(&wlan_wake_lock, "wlan");
+ hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
+ /*
+ * The Krait is going to Idle/Stand Alone Power Save
+ * more aggressively which is resulting in the longer driver load time.
+ * The Fix is to not allow Krait to enter Idle Power Save during driver
+ * load.
+ */
+ hdd_request_pm_qos(DISABLE_KRAIT_IDLE_PS_VAL);
+ cds_ssr_protect_init();
+
+ pr_info("%s: loading driver v%s\n", WLAN_MODULE_NAME,
+ QWLAN_VERSIONSTR TIMER_MANAGER_STR MEMORY_DEBUG_STR);
+
+ do {
+ cdf_mc_timer_manager_init();
+ cdf_mem_init();
+ /* Allocate CDS global context */
+ status = cds_alloc_global_context(&p_cds_context);
+
+ if (!CDF_IS_STATUS_SUCCESS(status)) {
+ hddLog(CDF_TRACE_LEVEL_FATAL,
+ FL("Failed to preOpen CDS"));
+ ret_status = -1;
+ break;
+ }
+
+ hdd_trace_init();
+
+#ifndef MODULE
+ /*
+ * For statically linked driver, call hdd_set_conparam to update
+ * curr_con_mode
+ */
+ hdd_set_conparam((uint32_t) con_mode);
+#endif
+
+#ifdef QCA_WIFI_3_0_ADRASTEA
+#define HDD_WLAN_START_WAIT_TIME (3600 * 1000)
+#else
+#define HDD_WLAN_START_WAIT_TIME (CDS_WMA_TIMEOUT + 5000)
+#endif
+
+ init_completion(&wlan_start_comp);
+ ret_status = wlan_hdd_register_driver();
+ if (!ret_status) {
+ rc = wait_for_completion_timeout(
+ &wlan_start_comp,
+ msecs_to_jiffies(HDD_WLAN_START_WAIT_TIME));
+ if (!rc) {
+ hddLog(LOGP,
+ FL("timed-out waiting for wlan_hdd_register_driver"));
+ ret_status = -1;
+ } else
+ ret_status = 0;
+ }
+
+ hdd_remove_pm_qos();
+ hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
+
+ if (ret_status) {
+ hddLog(LOGP, FL("WLAN Driver Initialization failed"));
+ wlan_hdd_unregister_driver();
+ cds_free_global_context(&p_cds_context);
+ ret_status = -ENODEV;
+ break;
+ } else {
+ pr_info("%s: driver loaded\n", WLAN_MODULE_NAME);
+ memdump_init();
+ return 0;
+ }
+
+ } while (0);
+
+ if (0 != ret_status) {
+ cdf_mc_timer_exit();
+ cdf_mem_exit();
+ cdf_wake_lock_destroy(&wlan_wake_lock);
+
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+ wlan_logging_sock_deinit_svc();
+#endif
+ memdump_deinit();
+ pr_err("%s: driver load failure\n", WLAN_MODULE_NAME);
+ } else {
+ pr_info("%s: driver loaded\n", WLAN_MODULE_NAME);
+ }
+
+ EXIT();
+
+ return ret_status;
+}
+
+/**
+ * hdd_module_init() - Init Function
+ *
+ * This is the driver entry point (invoked when module is loaded using insmod)
+ *
+ * Return: 0 for success, non zero for failure
+ */
+#ifdef MODULE
+static int __init hdd_module_init(void)
+{
+ return hdd_driver_init();
+}
+#else /* #ifdef MODULE */
+static int __init hdd_module_init(void)
+{
+ /* Driver initialization is delayed to fwpath_changed_handler */
+ return 0;
+}
+#endif /* #ifdef MODULE */
+
+/**
+ * hdd_driver_exit() - Exit function
+ *
+ * This is the driver exit point (invoked when module is unloaded using rmmod
+ * or con_mode was changed by userspace)
+ *
+ * Return: None
+ */
+static void hdd_driver_exit(void)
+{
+ hdd_context_t *hdd_ctx = NULL;
+ int retry = 0;
+
+ pr_info("%s: unloading driver v%s\n", WLAN_MODULE_NAME,
+ QWLAN_VERSIONSTR);
+
+ hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
+ if (!hdd_ctx) {
+ hddLog(CDF_TRACE_LEVEL_FATAL,
+ FL("module exit called before probe"));
+ } else {
+ /* Check IPA HW Pipe shutdown */
+ hdd_ipa_uc_force_pipe_shutdown(hdd_ctx);
+#ifdef QCA_PKT_PROTO_TRACE
+ cds_pkt_proto_trace_close();
+#endif /* QCA_PKT_PROTO_TRACE */
+ while (hdd_ctx->isLogpInProgress ||
+ cds_is_logp_in_progress()) {
+ hddLog(CDF_TRACE_LEVEL_FATAL,
+ FL(
+ "SSR in Progress; block rmmod for 1 second!!!"
+ ));
+ msleep(1000);
+
+ if (retry++ == HDD_MOD_EXIT_SSR_MAX_RETRIES) {
+ hddLog(CDF_TRACE_LEVEL_FATAL,
+ FL("SSR never completed, fatal error"));
+ CDF_BUG(0);
+ }
+ }
+
+ rtnl_lock();
+ hdd_ctx->isUnloadInProgress = true;
+ cds_set_load_unload_in_progress(true);
+ rtnl_unlock();
+ }
+
+ cds_wait_for_work_thread_completion(__func__);
+ memdump_deinit();
+
+ wlan_hdd_unregister_driver();
+ return;
+}
+
+/**
+ * hdd_module_exit() - Exit function
+ *
+ * This is the driver exit point (invoked when module is unloaded using rmmod)
+ *
+ * Return: None
+ */
+static void __exit hdd_module_exit(void)
+{
+ hdd_driver_exit();
+}
+
+#ifdef MODULE
+static int fwpath_changed_handler(const char *kmessage, struct kernel_param *kp)
+{
+ return param_set_copystring(kmessage, kp);
+}
+
+#if !defined(QCA_WIFI_FTM)
+static int con_mode_handler(const char *kmessage, struct kernel_param *kp)
+{
+ return param_set_int(kmessage, kp);
+}
+#endif
+#else /* #ifdef MODULE */
+/**
+ * kickstart_driver() - driver entry point
+ *
+ * This is the driver entry point
+ * - delayed driver initialization when driver is statically linked
+ * - invoked when module parameter fwpath is modified from userspace to signal
+ * initializing the WLAN driver or when con_mode is modified from userspace
+ * to signal a switch in operating mode
+ *
+ * Return: 0 for success, non zero for failure
+ */
+static int kickstart_driver(void)
+{
+ int ret_status;
+
+ if (!wlan_hdd_inited) {
+ ret_status = hdd_driver_init();
+ wlan_hdd_inited = ret_status ? 0 : 1;
+ return ret_status;
+ }
+
+ hdd_driver_exit();
+
+ msleep(200);
+
+ ret_status = hdd_driver_init();
+ wlan_hdd_inited = ret_status ? 0 : 1;
+ return ret_status;
+}
+
+/**
+ * fwpath_changed_handler() - Handler Function
+ *
+ * Handle changes to the fwpath parameter
+ *
+ * Return: 0 for success, non zero for failure
+ */
+static int fwpath_changed_handler(const char *kmessage, struct kernel_param *kp)
+{
+ int ret;
+
+ ret = param_set_copystring(kmessage, kp);
+ if (0 == ret)
+ ret = kickstart_driver();
+ return ret;
+}
+
+#if !defined(QCA_WIFI_FTM)
+/**
+ * con_mode_handler() - handls module param con_mode change
+ *
+ * Handler function for module param con_mode when it is changed by userspace
+ * Dynamically linked - do nothing
+ * Statically linked - exit and init driver, as in rmmod and insmod
+ *
+ * Return -
+ */
+static int con_mode_handler(const char *kmessage, struct kernel_param *kp)
+{
+ int ret;
+
+ ret = param_set_int(kmessage, kp);
+ if (0 == ret)
+ ret = kickstart_driver();
+ return ret;
+}
+#endif
+#endif /* #ifdef MODULE */
+
+/**
+ * hdd_get_conparam() - driver exit point
+ *
+ * This is the driver exit point (invoked when module is unloaded using rmmod)
+ *
+ * Return: tCDF_CON_MODE
+ */
+tCDF_CON_MODE hdd_get_conparam(void)
+{
+#ifdef MODULE
+ return (tCDF_CON_MODE) con_mode;
+#else
+ return (tCDF_CON_MODE) curr_con_mode;
+#endif
+}
+
+void hdd_set_conparam(uint32_t newParam)
+{
+ con_mode = newParam;
+#ifndef MODULE
+ curr_con_mode = con_mode;
+#endif
+}
+
/* Register the module init/exit functions */
module_init(hdd_module_init);