1 /* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
13 #include <linux/delay.h>
14 #include <linux/jiffies.h>
15 #include <linux/module.h>
17 #include <linux/of_device.h>
18 #include <linux/pm_wakeup.h>
19 #include <linux/rwsem.h>
20 #include <linux/suspend.h>
21 #include <linux/timer.h>
22 #include <soc/qcom/ramdump.h>
23 #include <soc/qcom/subsystem_notif.h>
29 #define CNSS_DUMP_FORMAT_VER 0x11
30 #define CNSS_DUMP_FORMAT_VER_V2 0x22
31 #define CNSS_DUMP_MAGIC_VER_V2 0x42445953
32 #define CNSS_DUMP_NAME "CNSS_WLAN"
33 #define CNSS_DUMP_DESC_SIZE 0x1000
34 #define CNSS_DUMP_SEG_VER 0x1
35 #define WLAN_RECOVERY_DELAY 1000
36 #define FILE_SYSTEM_READY 1
37 #define FW_READY_TIMEOUT 20000
38 #define FW_ASSERT_TIMEOUT 5000
39 #define CNSS_EVENT_PENDING 2989
40 #define CE_MSI_NAME "CE"
42 static struct cnss_plat_data *plat_env;
44 static DECLARE_RWSEM(cnss_pm_sem);
46 static bool qmi_bypass;
47 #ifdef CONFIG_CNSS2_DEBUG
48 module_param(qmi_bypass, bool, 0600);
49 MODULE_PARM_DESC(qmi_bypass, "Bypass QMI from platform driver");
52 static bool enable_waltest;
53 #ifdef CONFIG_CNSS2_DEBUG
54 module_param(enable_waltest, bool, 0600);
55 MODULE_PARM_DESC(enable_waltest, "Enable to handle firmware waltest");
59 #ifdef CONFIG_CNSS2_DEBUG
60 module_param(quirks, ulong, 0600);
61 MODULE_PARM_DESC(quirks, "Debug quirks for the driver");
64 static unsigned int wow_wake_gpionum;
65 #ifdef CONFIG_CNSS2_DEBUG
66 module_param(wow_wake_gpionum, uint, 0600);
67 MODULE_PARM_DESC(wow_wake_gpionum, "configure gpio number for wow wake");
70 static unsigned int wow_wake_enable;
71 int cnss_enable_wow_wake(const char *val, const struct kernel_param *kp)
74 unsigned int prev_val;
76 prev_val = *(unsigned int *)kp->arg;
77 ret = param_set_uint(val, kp);
78 if (ret || prev_val == wow_wake_enable) {
79 cnss_pr_err("failed set new wow_enable ret = %d", ret);
82 if (wow_wake_enable) {
83 if (!wow_wake_gpionum)
84 wow_wake_gpionum = HOST_WAKE_GPIO_IN;
85 cnss_set_wlan_chip_to_host_wakeup(wow_wake_gpionum);
90 static const struct kernel_param_ops cnss_param_ops_uint = {
91 .set = &cnss_enable_wow_wake,
92 .get = ¶m_get_uint
95 module_param_cb(wow_wake_enable, &cnss_param_ops_uint,
96 &wow_wake_enable, 0600);
98 static struct cnss_fw_files FW_FILES_QCA6174_FW_3_0 = {
99 "qwlan30.bin", "bdwlan30.bin", "otp30.bin", "utf30.bin",
100 "utfbd30.bin", "epping30.bin", "evicted30.bin"
103 static struct cnss_fw_files FW_FILES_DEFAULT = {
104 "qwlan.bin", "bdwlan.bin", "otp.bin", "utf.bin",
105 "utfbd.bin", "epping.bin", "evicted.bin"
108 struct cnss_driver_event {
109 struct list_head list;
110 enum cnss_driver_event_type type;
112 struct completion complete;
117 static void cnss_set_plat_priv(struct platform_device *plat_dev,
118 struct cnss_plat_data *plat_priv)
120 plat_env = plat_priv;
123 struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev)
128 static int cnss_pm_notify(struct notifier_block *b,
129 unsigned long event, void *p)
132 case PM_SUSPEND_PREPARE:
133 down_write(&cnss_pm_sem);
135 case PM_POST_SUSPEND:
136 up_write(&cnss_pm_sem);
143 static struct notifier_block cnss_pm_notifier = {
144 .notifier_call = cnss_pm_notify,
147 static void cnss_pm_stay_awake(struct cnss_plat_data *plat_priv)
149 if (atomic_inc_return(&plat_priv->pm_count) != 1)
152 cnss_pr_dbg("PM stay awake, state: 0x%lx, count: %d\n",
153 plat_priv->driver_state,
154 atomic_read(&plat_priv->pm_count));
155 pm_stay_awake(&plat_priv->plat_dev->dev);
158 static void cnss_pm_relax(struct cnss_plat_data *plat_priv)
160 int r = atomic_dec_return(&plat_priv->pm_count);
167 cnss_pr_dbg("PM relax, state: 0x%lx, count: %d\n",
168 plat_priv->driver_state,
169 atomic_read(&plat_priv->pm_count));
170 pm_relax(&plat_priv->plat_dev->dev);
173 void cnss_lock_pm_sem(struct device *dev)
175 down_read(&cnss_pm_sem);
177 EXPORT_SYMBOL(cnss_lock_pm_sem);
179 void cnss_release_pm_sem(struct device *dev)
181 up_read(&cnss_pm_sem);
183 EXPORT_SYMBOL(cnss_release_pm_sem);
185 int cnss_get_fw_files_for_target(struct device *dev,
186 struct cnss_fw_files *pfw_files,
187 u32 target_type, u32 target_version)
192 switch (target_version) {
193 case QCA6174_REV3_VERSION:
194 case QCA6174_REV3_2_VERSION:
195 memcpy(pfw_files, &FW_FILES_QCA6174_FW_3_0, sizeof(*pfw_files));
198 memcpy(pfw_files, &FW_FILES_DEFAULT, sizeof(*pfw_files));
199 cnss_pr_err("Unknown target version, type: 0x%X, version: 0x%X",
200 target_type, target_version);
206 EXPORT_SYMBOL(cnss_get_fw_files_for_target);
208 int cnss_request_bus_bandwidth(struct device *dev, int bandwidth)
211 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
212 struct cnss_bus_bw_info *bus_bw_info;
217 bus_bw_info = &plat_priv->bus_bw_info;
218 if (!bus_bw_info->bus_client)
222 case CNSS_BUS_WIDTH_NONE:
223 case CNSS_BUS_WIDTH_LOW:
224 case CNSS_BUS_WIDTH_MEDIUM:
225 case CNSS_BUS_WIDTH_HIGH:
226 ret = msm_bus_scale_client_update_request(
227 bus_bw_info->bus_client, bandwidth);
229 bus_bw_info->current_bw_vote = bandwidth;
231 cnss_pr_err("Could not set bus bandwidth: %d, err = %d\n",
235 cnss_pr_err("Invalid bus bandwidth: %d", bandwidth);
241 EXPORT_SYMBOL(cnss_request_bus_bandwidth);
243 int cnss_get_platform_cap(struct device *dev, struct cnss_platform_cap *cap)
245 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
251 *cap = plat_priv->cap;
255 EXPORT_SYMBOL(cnss_get_platform_cap);
257 void cnss_request_pm_qos(struct device *dev, u32 qos_val)
259 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
264 pm_qos_add_request(&plat_priv->qos_request, PM_QOS_CPU_DMA_LATENCY,
267 EXPORT_SYMBOL(cnss_request_pm_qos);
269 void cnss_remove_pm_qos(struct device *dev)
271 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
276 pm_qos_remove_request(&plat_priv->qos_request);
278 EXPORT_SYMBOL(cnss_remove_pm_qos);
280 int cnss_wlan_enable(struct device *dev,
281 struct cnss_wlan_enable_cfg *config,
282 enum cnss_driver_mode mode,
283 const char *host_version)
285 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL);
286 struct wlfw_wlan_cfg_req_msg_v01 req;
287 u32 i, ce_id, num_vectors, user_base_data, base_vector;
290 if (plat_priv->device_id == QCA6174_DEVICE_ID)
296 if (plat_priv->bus_type == CNSS_BUS_USB ||
297 plat_priv->bus_type == CNSS_BUS_SDIO)
300 if (!config || !host_version) {
301 cnss_pr_err("Invalid config or host_version pointer\n");
305 cnss_pr_dbg("Mode: %d, config: %pK, host_version: %s\n",
306 mode, config, host_version);
308 if (mode == CNSS_WALTEST || mode == CNSS_CCPM)
311 memset(&req, 0, sizeof(req));
313 req.host_version_valid = 1;
314 strlcpy(req.host_version, host_version,
315 QMI_WLFW_MAX_STR_LEN_V01 + 1);
317 req.tgt_cfg_valid = 1;
318 if (config->num_ce_tgt_cfg > QMI_WLFW_MAX_NUM_CE_V01)
319 req.tgt_cfg_len = QMI_WLFW_MAX_NUM_CE_V01;
321 req.tgt_cfg_len = config->num_ce_tgt_cfg;
322 for (i = 0; i < req.tgt_cfg_len; i++) {
323 req.tgt_cfg[i].pipe_num = config->ce_tgt_cfg[i].pipe_num;
324 req.tgt_cfg[i].pipe_dir = config->ce_tgt_cfg[i].pipe_dir;
325 req.tgt_cfg[i].nentries = config->ce_tgt_cfg[i].nentries;
326 req.tgt_cfg[i].nbytes_max = config->ce_tgt_cfg[i].nbytes_max;
327 req.tgt_cfg[i].flags = config->ce_tgt_cfg[i].flags;
330 req.svc_cfg_valid = 1;
331 if (config->num_ce_svc_pipe_cfg > QMI_WLFW_MAX_NUM_SVC_V01)
332 req.svc_cfg_len = QMI_WLFW_MAX_NUM_SVC_V01;
334 req.svc_cfg_len = config->num_ce_svc_pipe_cfg;
335 for (i = 0; i < req.svc_cfg_len; i++) {
336 req.svc_cfg[i].service_id = config->ce_svc_cfg[i].service_id;
337 req.svc_cfg[i].pipe_dir = config->ce_svc_cfg[i].pipe_dir;
338 req.svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num;
341 if (config->num_shadow_reg_cfg) {
342 req.shadow_reg_valid = 1;
344 if (config->num_shadow_reg_cfg >
345 QMI_WLFW_MAX_NUM_SHADOW_REG_V01)
346 req.shadow_reg_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V01;
348 req.shadow_reg_len = config->num_shadow_reg_cfg;
349 memcpy(req.shadow_reg, config->shadow_reg_cfg,
350 sizeof(struct wlfw_shadow_reg_cfg_s_v01)
351 * req.shadow_reg_len);
354 req.shadow_reg_v2_valid = 1;
355 if (config->num_shadow_reg_v2_cfg >
356 QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01)
357 req.shadow_reg_v2_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01;
359 req.shadow_reg_v2_len = config->num_shadow_reg_v2_cfg;
361 memcpy(req.shadow_reg_v2, config->shadow_reg_v2_cfg,
362 sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01)
363 * req.shadow_reg_v2_len);
365 if (config->rri_over_ddr_cfg_valid) {
366 req.rri_over_ddr_cfg_valid = 1;
367 req.rri_over_ddr_cfg.base_addr_low =
368 config->rri_over_ddr_cfg.base_addr_low;
369 req.rri_over_ddr_cfg.base_addr_high =
370 config->rri_over_ddr_cfg.base_addr_high;
373 if (plat_priv->device_id == QCN7605_DEVICE_ID) {
374 ret = cnss_get_user_msi_assignment(dev, CE_MSI_NAME,
379 req.msi_cfg_valid = 1;
380 req.msi_cfg_len = QMI_WLFW_MAX_NUM_CE_V01;
381 for (ce_id = 0; ce_id < QMI_WLFW_MAX_NUM_CE_V01;
383 req.msi_cfg[ce_id].ce_id = ce_id;
384 req.msi_cfg[ce_id].msi_vector =
385 (ce_id % num_vectors) + base_vector;
389 ret = cnss_wlfw_wlan_cfg_send_sync(plat_priv, &req);
394 ret = cnss_wlfw_wlan_mode_send_sync(plat_priv, mode);
398 EXPORT_SYMBOL(cnss_wlan_enable);
400 int cnss_wlan_disable(struct device *dev, enum cnss_driver_mode mode)
402 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL);
404 if (plat_priv->device_id == QCA6174_DEVICE_ID)
410 return cnss_wlfw_wlan_mode_send_sync(plat_priv, QMI_WLFW_OFF_V01);
412 EXPORT_SYMBOL(cnss_wlan_disable);
414 #ifdef CONFIG_CNSS2_DEBUG
415 int cnss_athdiag_read(struct device *dev, u32 offset, u32 mem_type,
416 u32 data_len, u8 *output)
418 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
422 cnss_pr_err("plat_priv is NULL!\n");
426 if (plat_priv->device_id == QCA6174_DEVICE_ID)
429 if (!output || data_len == 0 || data_len > QMI_WLFW_MAX_DATA_SIZE_V01) {
430 cnss_pr_err("Invalid parameters for athdiag read: output %p, data_len %u\n",
436 if (!test_bit(CNSS_FW_READY, &plat_priv->driver_state)) {
437 cnss_pr_err("Invalid state for athdiag read: 0x%lx\n",
438 plat_priv->driver_state);
443 ret = cnss_wlfw_athdiag_read_send_sync(plat_priv, offset, mem_type,
449 EXPORT_SYMBOL(cnss_athdiag_read);
451 int cnss_athdiag_write(struct device *dev, u32 offset, u32 mem_type,
452 u32 data_len, u8 *input)
454 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
458 cnss_pr_err("plat_priv is NULL!\n");
462 if (plat_priv->device_id == QCA6174_DEVICE_ID)
465 if (!input || data_len == 0 || data_len > QMI_WLFW_MAX_DATA_SIZE_V01) {
466 cnss_pr_err("Invalid parameters for athdiag write: input %p, data_len %u\n",
472 if (!test_bit(CNSS_FW_READY, &plat_priv->driver_state)) {
473 cnss_pr_err("Invalid state for athdiag write: 0x%lx\n",
474 plat_priv->driver_state);
479 ret = cnss_wlfw_athdiag_write_send_sync(plat_priv, offset, mem_type,
485 EXPORT_SYMBOL(cnss_athdiag_write);
487 int cnss_athdiag_read(struct device *dev, u32 offset, u32 mem_type,
488 u32 data_len, u8 *output)
492 EXPORT_SYMBOL(cnss_athdiag_read);
494 int cnss_athdiag_write(struct device *dev, u32 offset, u32 mem_type,
495 u32 data_len, u8 *input)
499 EXPORT_SYMBOL(cnss_athdiag_write);
502 int cnss_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
504 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
506 if (plat_priv->device_id == QCA6174_DEVICE_ID)
509 return cnss_wlfw_ini_send_sync(plat_priv, fw_log_mode);
511 EXPORT_SYMBOL(cnss_set_fw_log_mode);
513 unsigned long *cnss_get_debug_quirks(void)
518 bool *cnss_get_qmi_bypass(void)
523 static int cnss_fw_mem_ready_hdlr(struct cnss_plat_data *plat_priv)
530 set_bit(CNSS_FW_MEM_READY, &plat_priv->driver_state);
532 ret = cnss_wlfw_tgt_cap_send_sync(plat_priv);
536 ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv);
540 if (plat_priv->device_id == QCN7605_DEVICE_ID)
542 ret = cnss_bus_load_m3(plat_priv);
546 ret = cnss_wlfw_m3_dnld_send_sync(plat_priv);
555 static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
562 del_timer(&plat_priv->fw_boot_timer);
563 set_bit(CNSS_FW_READY, &plat_priv->driver_state);
565 if (test_bit(CNSS_FW_BOOT_RECOVERY, &plat_priv->driver_state)) {
566 clear_bit(CNSS_FW_BOOT_RECOVERY, &plat_priv->driver_state);
567 clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
570 if (enable_waltest) {
571 ret = cnss_wlfw_wlan_mode_send_sync(plat_priv,
572 QMI_WLFW_WALTEST_V01);
573 } else if (test_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state)) {
574 ret = cnss_wlfw_wlan_mode_send_sync(plat_priv,
575 QMI_WLFW_CALIBRATION_V01);
576 } else if (test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) ||
577 test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
578 ret = cnss_bus_call_driver_probe(plat_priv);
580 complete(&plat_priv->power_up_complete);
583 if (ret && test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
591 cnss_bus_dev_shutdown(plat_priv);
593 clear_bit(CNSS_FW_READY, &plat_priv->driver_state);
594 clear_bit(CNSS_FW_MEM_READY, &plat_priv->driver_state);
600 static int caldb_mem_bounds_check(struct cnss_plat_data *plat_priv, void *data)
603 struct cnss_cal_data *cal_data = data;
604 u8 *end_ptr, *cal_data_ptr;
607 end_ptr = (u8 *)plat_priv->caldb_mem + QCN7605_CALDB_SIZE;
608 cal_data_ptr = (u8 *)plat_priv->caldb_mem + cal_data->index;
609 total_size = cal_data->total_size;
611 if (cal_data_ptr >= end_ptr || (cal_data_ptr + total_size) >= end_ptr) {
612 cnss_pr_err("caldb data offset or size error\n");
619 static int cnss_cal_update_hdlr(struct cnss_plat_data *plat_priv, void *data)
623 ret = caldb_mem_bounds_check(plat_priv, data);
627 cnss_wlfw_cal_update_req_send_sync(plat_priv, data);
632 static int cnss_cal_download_hdlr(struct cnss_plat_data *plat_priv, void *data)
636 ret = caldb_mem_bounds_check(plat_priv, data);
640 cnss_wlfw_cal_download_req_send_sync(plat_priv, data);
645 static char *cnss_driver_event_to_str(enum cnss_driver_event_type type)
648 case CNSS_DRIVER_EVENT_SERVER_ARRIVE:
649 return "SERVER_ARRIVE";
650 case CNSS_DRIVER_EVENT_SERVER_EXIT:
651 return "SERVER_EXIT";
652 case CNSS_DRIVER_EVENT_REQUEST_MEM:
653 return "REQUEST_MEM";
654 case CNSS_DRIVER_EVENT_FW_MEM_READY:
655 return "FW_MEM_READY";
656 case CNSS_DRIVER_EVENT_FW_READY:
658 case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START:
659 return "COLD_BOOT_CAL_START";
660 case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE:
661 return "COLD_BOOT_CAL_DONE";
662 case CNSS_DRIVER_EVENT_CAL_UPDATE:
663 return "COLD_BOOT_CAL_DATA_UPDATE";
664 case CNSS_DRIVER_EVENT_CAL_DOWNLOAD:
665 return "COLD_BOOT_CAL_DATA_DOWNLOAD";
666 case CNSS_DRIVER_EVENT_REGISTER_DRIVER:
667 return "REGISTER_DRIVER";
668 case CNSS_DRIVER_EVENT_UNREGISTER_DRIVER:
669 return "UNREGISTER_DRIVER";
670 case CNSS_DRIVER_EVENT_RECOVERY:
672 case CNSS_DRIVER_EVENT_FORCE_FW_ASSERT:
673 return "FORCE_FW_ASSERT";
674 case CNSS_DRIVER_EVENT_POWER_UP:
676 case CNSS_DRIVER_EVENT_POWER_DOWN:
678 case CNSS_DRIVER_EVENT_MAX:
685 int cnss_driver_event_post(struct cnss_plat_data *plat_priv,
686 enum cnss_driver_event_type type,
687 u32 flags, void *data)
689 struct cnss_driver_event *event;
690 unsigned long irq_flags;
691 int gfp = GFP_KERNEL;
697 cnss_pr_dbg("Posting event: %s(%d)%s, state: 0x%lx flags: 0x%0x\n",
698 cnss_driver_event_to_str(type), type,
699 flags ? "-sync" : "", plat_priv->driver_state, flags);
701 if (type >= CNSS_DRIVER_EVENT_MAX) {
702 cnss_pr_err("Invalid Event type: %d, can't post", type);
706 if (in_interrupt() || irqs_disabled())
709 event = kzalloc(sizeof(*event), gfp);
713 cnss_pm_stay_awake(plat_priv);
717 init_completion(&event->complete);
718 event->ret = CNSS_EVENT_PENDING;
719 event->sync = !!(flags & CNSS_EVENT_SYNC);
721 spin_lock_irqsave(&plat_priv->event_lock, irq_flags);
722 list_add_tail(&event->list, &plat_priv->event_list);
723 spin_unlock_irqrestore(&plat_priv->event_lock, irq_flags);
725 queue_work(plat_priv->event_wq, &plat_priv->event_work);
727 if (!(flags & CNSS_EVENT_SYNC))
730 if (flags & CNSS_EVENT_UNINTERRUPTIBLE)
731 wait_for_completion(&event->complete);
733 ret = wait_for_completion_interruptible(&event->complete);
735 cnss_pr_dbg("Completed event: %s(%d), state: 0x%lx, ret: %d/%d\n",
736 cnss_driver_event_to_str(type), type,
737 plat_priv->driver_state, ret, event->ret);
738 spin_lock_irqsave(&plat_priv->event_lock, irq_flags);
739 if (ret == -ERESTARTSYS && event->ret == CNSS_EVENT_PENDING) {
741 spin_unlock_irqrestore(&plat_priv->event_lock, irq_flags);
745 spin_unlock_irqrestore(&plat_priv->event_lock, irq_flags);
751 cnss_pm_relax(plat_priv);
755 int cnss_power_up(struct device *dev)
758 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
759 unsigned int timeout;
762 cnss_pr_err("plat_priv is NULL\n");
766 cnss_pr_dbg("Powering up device\n");
768 ret = cnss_driver_event_post(plat_priv,
769 CNSS_DRIVER_EVENT_POWER_UP,
770 CNSS_EVENT_SYNC, NULL);
774 if (plat_priv->device_id == QCA6174_DEVICE_ID)
777 timeout = cnss_get_qmi_timeout();
779 reinit_completion(&plat_priv->power_up_complete);
780 ret = wait_for_completion_timeout(&plat_priv->power_up_complete,
781 msecs_to_jiffies(timeout) << 2);
783 cnss_pr_err("Timeout waiting for power up to complete\n");
793 EXPORT_SYMBOL(cnss_power_up);
795 int cnss_power_down(struct device *dev)
797 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
800 cnss_pr_err("plat_priv is NULL\n");
804 cnss_pr_dbg("Powering down device\n");
806 return cnss_driver_event_post(plat_priv,
807 CNSS_DRIVER_EVENT_POWER_DOWN,
808 CNSS_EVENT_SYNC, NULL);
810 EXPORT_SYMBOL(cnss_power_down);
812 int cnss_idle_restart(struct device *dev)
816 EXPORT_SYMBOL(cnss_idle_restart);
818 int cnss_idle_shutdown(struct device *dev)
822 EXPORT_SYMBOL(cnss_idle_shutdown);
824 static int cnss_get_resources(struct cnss_plat_data *plat_priv)
828 ret = cnss_get_vreg(plat_priv);
830 cnss_pr_err("Failed to get vreg, err = %d\n", ret);
834 ret = cnss_get_pinctrl(plat_priv);
836 cnss_pr_err("Failed to get pinctrl, err = %d\n", ret);
845 static void cnss_put_resources(struct cnss_plat_data *plat_priv)
849 static int cnss_modem_notifier_nb(struct notifier_block *nb,
853 struct cnss_plat_data *plat_priv =
854 container_of(nb, struct cnss_plat_data, modem_nb);
855 struct cnss_esoc_info *esoc_info;
857 cnss_pr_dbg("Modem notifier: event %lu\n", code);
862 esoc_info = &plat_priv->esoc_info;
864 if (code == SUBSYS_AFTER_POWERUP)
865 esoc_info->modem_current_status = 1;
866 else if (code == SUBSYS_BEFORE_SHUTDOWN)
867 esoc_info->modem_current_status = 0;
871 if (!cnss_bus_call_driver_modem_status(plat_priv,
872 esoc_info->modem_current_status))
878 static int cnss_register_esoc(struct cnss_plat_data *plat_priv)
882 struct cnss_esoc_info *esoc_info;
883 struct esoc_desc *esoc_desc;
884 const char *client_desc;
886 dev = &plat_priv->plat_dev->dev;
887 esoc_info = &plat_priv->esoc_info;
889 esoc_info->notify_modem_status =
890 of_property_read_bool(dev->of_node,
891 "qcom,notify-modem-status");
893 if (esoc_info->notify_modem_status)
896 ret = of_property_read_string_index(dev->of_node, "esoc-names", 0,
899 cnss_pr_dbg("esoc-names is not defined in DT, skip!\n");
901 esoc_desc = devm_register_esoc_client(dev, client_desc);
902 if (IS_ERR_OR_NULL(esoc_desc)) {
903 ret = PTR_RET(esoc_desc);
904 cnss_pr_err("Failed to register esoc_desc, err = %d\n",
908 esoc_info->esoc_desc = esoc_desc;
911 plat_priv->modem_nb.notifier_call = cnss_modem_notifier_nb;
912 esoc_info->modem_current_status = 0;
913 esoc_info->modem_notify_handler =
914 subsys_notif_register_notifier(esoc_info->esoc_desc ?
915 esoc_info->esoc_desc->name :
916 "modem", &plat_priv->modem_nb);
917 if (IS_ERR(esoc_info->modem_notify_handler)) {
918 ret = PTR_ERR(esoc_info->modem_notify_handler);
919 cnss_pr_err("Failed to register esoc notifier, err = %d\n",
926 if (esoc_info->esoc_desc)
927 devm_unregister_esoc_client(dev, esoc_info->esoc_desc);
932 static void cnss_unregister_esoc(struct cnss_plat_data *plat_priv)
935 struct cnss_esoc_info *esoc_info;
937 dev = &plat_priv->plat_dev->dev;
938 esoc_info = &plat_priv->esoc_info;
940 if (esoc_info->notify_modem_status)
941 subsys_notif_unregister_notifier(esoc_info->
942 modem_notify_handler,
943 &plat_priv->modem_nb);
944 if (esoc_info->esoc_desc)
945 devm_unregister_esoc_client(dev, esoc_info->esoc_desc);
948 static int cnss_subsys_powerup(const struct subsys_desc *subsys_desc)
950 struct cnss_plat_data *plat_priv;
952 if (!subsys_desc->dev) {
953 cnss_pr_err("dev from subsys_desc is NULL\n");
957 plat_priv = dev_get_drvdata(subsys_desc->dev);
959 cnss_pr_err("plat_priv is NULL\n");
963 if (!plat_priv->driver_state) {
964 cnss_pr_dbg("Powerup is ignored\n");
968 return cnss_bus_dev_powerup(plat_priv);
971 static int cnss_subsys_shutdown(const struct subsys_desc *subsys_desc,
974 struct cnss_plat_data *plat_priv;
976 if (!subsys_desc->dev) {
977 cnss_pr_err("dev from subsys_desc is NULL\n");
981 plat_priv = dev_get_drvdata(subsys_desc->dev);
983 cnss_pr_err("plat_priv is NULL\n");
987 if (!plat_priv->driver_state) {
988 cnss_pr_dbg("shutdown is ignored\n");
992 return cnss_bus_dev_shutdown(plat_priv);
995 static int cnss_subsys_ramdump(int enable,
996 const struct subsys_desc *subsys_desc)
998 struct cnss_plat_data *plat_priv = dev_get_drvdata(subsys_desc->dev);
1001 cnss_pr_err("plat_priv is NULL!\n");
1008 return cnss_bus_dev_ramdump(plat_priv);
1011 void *cnss_get_virt_ramdump_mem(struct device *dev, unsigned long *size)
1013 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
1014 struct cnss_ramdump_info *ramdump_info;
1019 ramdump_info = &plat_priv->ramdump_info;
1020 *size = ramdump_info->ramdump_size;
1022 return ramdump_info->ramdump_va;
1024 EXPORT_SYMBOL(cnss_get_virt_ramdump_mem);
1026 void cnss_device_crashed(struct device *dev)
1028 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
1029 struct cnss_subsys_info *subsys_info;
1034 subsys_info = &plat_priv->subsys_info;
1035 if (subsys_info->subsys_device) {
1036 set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
1037 subsys_set_crash_status(subsys_info->subsys_device, true);
1038 subsystem_restart_dev(subsys_info->subsys_device);
1041 EXPORT_SYMBOL(cnss_device_crashed);
1043 static void cnss_subsys_crash_shutdown(const struct subsys_desc *subsys_desc)
1045 struct cnss_plat_data *plat_priv = dev_get_drvdata(subsys_desc->dev);
1048 cnss_pr_err("plat_priv is NULL!\n");
1051 cnss_bus_dev_crash_shutdown(plat_priv);
1054 static const char *cnss_recovery_reason_to_str(enum cnss_recovery_reason reason)
1057 case CNSS_REASON_DEFAULT:
1059 case CNSS_REASON_LINK_DOWN:
1061 case CNSS_REASON_RDDM:
1063 case CNSS_REASON_TIMEOUT:
1070 static int cnss_do_recovery(struct cnss_plat_data *plat_priv,
1071 enum cnss_recovery_reason reason)
1073 struct cnss_subsys_info *subsys_info =
1074 &plat_priv->subsys_info;
1076 plat_priv->recovery_count++;
1078 if (plat_priv->device_id == QCA6174_DEVICE_ID)
1081 cnss_bus_recovery_update_status(plat_priv);
1083 if (test_bit(SKIP_RECOVERY, &quirks)) {
1084 cnss_pr_dbg("Skip device recovery\n");
1089 case CNSS_REASON_LINK_DOWN:
1090 if (test_bit(LINK_DOWN_SELF_RECOVERY, &quirks))
1093 case CNSS_REASON_RDDM:
1094 cnss_bus_collect_dump_info(plat_priv);
1095 clear_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state);
1097 case CNSS_REASON_DEFAULT:
1098 case CNSS_REASON_TIMEOUT:
1101 cnss_pr_err("Unsupported recovery reason: %s(%d)\n",
1102 cnss_recovery_reason_to_str(reason), reason);
1106 if (!subsys_info->subsys_device)
1109 subsys_set_crash_status(subsys_info->subsys_device, true);
1110 subsystem_restart_dev(subsys_info->subsys_device);
1115 cnss_bus_dev_shutdown(plat_priv);
1116 cnss_bus_dev_powerup(plat_priv);
1121 static int cnss_driver_recovery_hdlr(struct cnss_plat_data *plat_priv,
1124 struct cnss_recovery_data *recovery_data = data;
1127 cnss_pr_dbg("Driver recovery is triggered with reason: %s(%d)\n",
1128 cnss_recovery_reason_to_str(recovery_data->reason),
1129 recovery_data->reason);
1131 if (!plat_priv->driver_state) {
1132 cnss_pr_err("Improper driver state, ignore recovery\n");
1137 if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
1138 cnss_pr_err("Recovery is already in progress\n");
1143 if (test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) {
1144 cnss_pr_err("Driver unload is in progress, ignore recovery\n");
1149 switch (plat_priv->device_id) {
1150 case QCA6174_DEVICE_ID:
1151 if (test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state)) {
1152 cnss_pr_err("Driver load is in progress, ignore recovery\n");
1158 if (!test_bit(CNSS_FW_READY, &plat_priv->driver_state)) {
1159 set_bit(CNSS_FW_BOOT_RECOVERY,
1160 &plat_priv->driver_state);
1165 set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
1166 ret = cnss_do_recovery(plat_priv, recovery_data->reason);
1173 int cnss_self_recovery(struct device *dev,
1174 enum cnss_recovery_reason reason)
1176 cnss_schedule_recovery(dev, reason);
1179 EXPORT_SYMBOL(cnss_self_recovery);
1181 void cnss_schedule_recovery(struct device *dev,
1182 enum cnss_recovery_reason reason)
1184 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
1185 struct cnss_recovery_data *data;
1186 int gfp = GFP_KERNEL;
1188 if (in_interrupt() || irqs_disabled())
1191 data = kzalloc(sizeof(*data), gfp);
1195 data->reason = reason;
1196 cnss_driver_event_post(plat_priv,
1197 CNSS_DRIVER_EVENT_RECOVERY,
1200 EXPORT_SYMBOL(cnss_schedule_recovery);
1202 int cnss_force_fw_assert(struct device *dev)
1204 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
1207 cnss_pr_err("plat_priv is NULL\n");
1211 if (plat_priv->device_id == QCA6174_DEVICE_ID) {
1212 cnss_pr_info("Forced FW assert is not supported\n");
1216 if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
1217 cnss_pr_info("Recovery is already in progress, ignore forced FW assert\n");
1221 cnss_driver_event_post(plat_priv,
1222 CNSS_DRIVER_EVENT_FORCE_FW_ASSERT,
1227 EXPORT_SYMBOL(cnss_force_fw_assert);
1229 int cnss_force_collect_rddm(struct device *dev)
1231 struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
1235 cnss_pr_err("plat_priv is NULL\n");
1239 if (plat_priv->device_id == QCA6174_DEVICE_ID) {
1240 cnss_pr_info("Force collect rddm is not supported\n");
1244 if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
1245 cnss_pr_info("Recovery is already in progress, ignore forced collect rddm\n");
1249 cnss_driver_event_post(plat_priv,
1250 CNSS_DRIVER_EVENT_FORCE_FW_ASSERT,
1253 reinit_completion(&plat_priv->rddm_complete);
1254 ret = wait_for_completion_timeout
1255 (&plat_priv->rddm_complete,
1256 msecs_to_jiffies(CNSS_RDDM_TIMEOUT_MS));
1262 EXPORT_SYMBOL(cnss_force_collect_rddm);
1264 int cnss_qmi_send_get(struct device *dev)
1268 EXPORT_SYMBOL(cnss_qmi_send_get);
1270 int cnss_qmi_send_put(struct device *dev)
1274 EXPORT_SYMBOL(cnss_qmi_send_put);
1276 int cnss_qmi_send(struct device *dev, int type, void *cmd,
1277 int cmd_len, void *cb_ctx,
1278 int (*cb)(void *ctx, void *event, int event_len))
1282 EXPORT_SYMBOL(cnss_qmi_send);
1284 static int cnss_wlfw_server_arrive_hdlr(struct cnss_plat_data *plat_priv)
1288 ret = cnss_wlfw_server_arrive(plat_priv);
1292 if (plat_priv->bus_type == CNSS_BUS_USB ||
1293 plat_priv->bus_type == CNSS_BUS_SDIO) {
1294 ret = cnss_wlfw_tgt_cap_send_sync(plat_priv);
1298 ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv);
1304 static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv)
1307 bool pwr_up_reqd = false;
1309 set_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state);
1310 if (test_bit(CNSS_DEV_REMOVED, &plat_priv->driver_state))
1313 if (pwr_up_reqd || plat_priv->bus_type == CNSS_BUS_PCI)
1314 ret = cnss_bus_dev_powerup(plat_priv);
1317 clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state);
1322 static int cnss_cold_boot_cal_done_hdlr(struct cnss_plat_data *plat_priv)
1324 plat_priv->cal_done = true;
1325 cnss_wlfw_wlan_mode_send_sync(plat_priv, QMI_WLFW_OFF_V01);
1326 if (plat_priv->device_id == QCN7605_DEVICE_ID ||
1327 plat_priv->bus_type == CNSS_BUS_USB)
1329 cnss_bus_dev_shutdown(plat_priv);
1332 clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state);
1336 static int cnss_power_up_hdlr(struct cnss_plat_data *plat_priv)
1338 return cnss_bus_dev_powerup(plat_priv);
1341 static int cnss_power_down_hdlr(struct cnss_plat_data *plat_priv)
1343 cnss_bus_dev_shutdown(plat_priv);
1348 static void cnss_driver_event_work(struct work_struct *work)
1350 struct cnss_plat_data *plat_priv =
1351 container_of(work, struct cnss_plat_data, event_work);
1352 struct cnss_driver_event *event;
1353 unsigned long flags;
1357 cnss_pr_err("plat_priv is NULL!\n");
1361 cnss_pm_stay_awake(plat_priv);
1363 spin_lock_irqsave(&plat_priv->event_lock, flags);
1365 while (!list_empty(&plat_priv->event_list)) {
1366 event = list_first_entry(&plat_priv->event_list,
1367 struct cnss_driver_event, list);
1368 list_del(&event->list);
1369 spin_unlock_irqrestore(&plat_priv->event_lock, flags);
1371 cnss_pr_dbg("Processing driver event: %s%s(%d), state: 0x%lx\n",
1372 cnss_driver_event_to_str(event->type),
1373 event->sync ? "-sync" : "", event->type,
1374 plat_priv->driver_state);
1376 switch (event->type) {
1377 case CNSS_DRIVER_EVENT_SERVER_ARRIVE:
1378 ret = cnss_wlfw_server_arrive_hdlr(plat_priv);
1380 case CNSS_DRIVER_EVENT_SERVER_EXIT:
1381 ret = cnss_wlfw_server_exit(plat_priv);
1383 case CNSS_DRIVER_EVENT_REQUEST_MEM:
1384 ret = cnss_bus_alloc_fw_mem(plat_priv);
1387 ret = cnss_wlfw_respond_mem_send_sync(plat_priv);
1389 case CNSS_DRIVER_EVENT_FW_MEM_READY:
1390 ret = cnss_fw_mem_ready_hdlr(plat_priv);
1392 case CNSS_DRIVER_EVENT_FW_READY:
1393 ret = cnss_fw_ready_hdlr(plat_priv);
1395 case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START:
1396 ret = cnss_cold_boot_cal_start_hdlr(plat_priv);
1398 case CNSS_DRIVER_EVENT_CAL_UPDATE:
1399 ret = cnss_cal_update_hdlr(plat_priv, event->data);
1401 case CNSS_DRIVER_EVENT_CAL_DOWNLOAD:
1402 ret = cnss_cal_download_hdlr(plat_priv, event->data);
1404 case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE:
1405 ret = cnss_cold_boot_cal_done_hdlr(plat_priv);
1407 case CNSS_DRIVER_EVENT_REGISTER_DRIVER:
1408 ret = cnss_bus_register_driver_hdlr(plat_priv,
1411 case CNSS_DRIVER_EVENT_UNREGISTER_DRIVER:
1412 ret = cnss_bus_unregister_driver_hdlr(plat_priv);
1414 case CNSS_DRIVER_EVENT_RECOVERY:
1415 ret = cnss_driver_recovery_hdlr(plat_priv,
1418 case CNSS_DRIVER_EVENT_FORCE_FW_ASSERT:
1419 ret = cnss_bus_force_fw_assert_hdlr(plat_priv);
1421 case CNSS_DRIVER_EVENT_POWER_UP:
1422 ret = cnss_power_up_hdlr(plat_priv);
1424 case CNSS_DRIVER_EVENT_POWER_DOWN:
1425 ret = cnss_power_down_hdlr(plat_priv);
1428 cnss_pr_err("Invalid driver event type: %d",
1431 spin_lock_irqsave(&plat_priv->event_lock, flags);
1435 spin_lock_irqsave(&plat_priv->event_lock, flags);
1438 complete(&event->complete);
1441 spin_unlock_irqrestore(&plat_priv->event_lock, flags);
1445 spin_lock_irqsave(&plat_priv->event_lock, flags);
1447 spin_unlock_irqrestore(&plat_priv->event_lock, flags);
1449 cnss_pm_relax(plat_priv);
1452 int cnss_register_subsys(struct cnss_plat_data *plat_priv)
1455 struct cnss_subsys_info *subsys_info;
1457 subsys_info = &plat_priv->subsys_info;
1459 switch (plat_priv->device_id) {
1460 case QCA6174_DEVICE_ID:
1461 subsys_info->subsys_desc.name = "AR6320";
1463 case QCA6290_EMULATION_DEVICE_ID:
1464 case QCA6290_DEVICE_ID:
1465 subsys_info->subsys_desc.name = "QCA6290";
1467 case QCN7605_DEVICE_ID:
1468 case QCN7605_STANDALONE_DEVICE_ID:
1469 case QCN7605_COMPOSITE_DEVICE_ID:
1470 case QCN7605_VER20_STANDALONE_DEVICE_ID:
1471 case QCN7605_VER20_COMPOSITE_DEVICE_ID:
1472 case QCN7605_SDIO_DEVICE_ID:
1473 subsys_info->subsys_desc.name = "QCN7605";
1476 cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id);
1481 subsys_info->subsys_desc.owner = THIS_MODULE;
1482 subsys_info->subsys_desc.powerup = cnss_subsys_powerup;
1483 subsys_info->subsys_desc.shutdown = cnss_subsys_shutdown;
1484 subsys_info->subsys_desc.ramdump = cnss_subsys_ramdump;
1485 subsys_info->subsys_desc.crash_shutdown = cnss_subsys_crash_shutdown;
1486 subsys_info->subsys_desc.dev = &plat_priv->plat_dev->dev;
1488 subsys_info->subsys_device = subsys_register(&subsys_info->subsys_desc);
1489 if (IS_ERR(subsys_info->subsys_device)) {
1490 ret = PTR_ERR(subsys_info->subsys_device);
1491 cnss_pr_err("Failed to register subsys, err = %d\n", ret);
1495 subsys_info->subsys_handle =
1496 subsystem_get(subsys_info->subsys_desc.name);
1497 if (!subsys_info->subsys_handle) {
1498 cnss_pr_err("Failed to get subsys_handle!\n");
1500 goto unregister_subsys;
1501 } else if (IS_ERR(subsys_info->subsys_handle)) {
1502 ret = PTR_ERR(subsys_info->subsys_handle);
1503 cnss_pr_err("Failed to do subsystem_get, err = %d\n", ret);
1504 goto unregister_subsys;
1510 subsys_unregister(subsys_info->subsys_device);
1515 void cnss_unregister_subsys(struct cnss_plat_data *plat_priv)
1517 struct cnss_subsys_info *subsys_info;
1519 subsys_info = &plat_priv->subsys_info;
1520 subsystem_put(subsys_info->subsys_handle);
1521 subsys_unregister(subsys_info->subsys_device);
1524 static int cnss_init_dump_entry(struct cnss_plat_data *plat_priv)
1526 struct cnss_ramdump_info *ramdump_info;
1527 struct msm_dump_entry dump_entry;
1529 ramdump_info = &plat_priv->ramdump_info;
1530 ramdump_info->dump_data.addr = ramdump_info->ramdump_pa;
1531 ramdump_info->dump_data.len = ramdump_info->ramdump_size;
1532 ramdump_info->dump_data.version = CNSS_DUMP_FORMAT_VER;
1533 ramdump_info->dump_data.magic = CNSS_DUMP_MAGIC_VER_V2;
1534 strlcpy(ramdump_info->dump_data.name, CNSS_DUMP_NAME,
1535 sizeof(ramdump_info->dump_data.name));
1536 dump_entry.id = MSM_DUMP_DATA_CNSS_WLAN;
1537 dump_entry.addr = virt_to_phys(&ramdump_info->dump_data);
1539 return msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
1542 static int cnss_register_ramdump_v1(struct cnss_plat_data *plat_priv)
1546 struct cnss_subsys_info *subsys_info;
1547 struct cnss_ramdump_info *ramdump_info;
1548 u32 ramdump_size = 0;
1550 dev = &plat_priv->plat_dev->dev;
1551 subsys_info = &plat_priv->subsys_info;
1552 ramdump_info = &plat_priv->ramdump_info;
1554 if (of_property_read_u32(dev->of_node, "qcom,wlan-ramdump-dynamic",
1555 &ramdump_size) == 0) {
1556 ramdump_info->ramdump_va = dma_alloc_coherent(dev, ramdump_size,
1557 &ramdump_info->ramdump_pa, GFP_KERNEL);
1559 if (ramdump_info->ramdump_va)
1560 ramdump_info->ramdump_size = ramdump_size;
1563 cnss_pr_dbg("ramdump va: %pK, pa: %pa\n",
1564 ramdump_info->ramdump_va, &ramdump_info->ramdump_pa);
1566 if (ramdump_info->ramdump_size == 0) {
1567 cnss_pr_info("Ramdump will not be collected");
1571 ret = cnss_init_dump_entry(plat_priv);
1573 cnss_pr_err("Failed to setup dump table, err = %d\n", ret);
1577 ramdump_info->ramdump_dev = create_ramdump_device(
1578 subsys_info->subsys_desc.name, subsys_info->subsys_desc.dev);
1579 if (!ramdump_info->ramdump_dev) {
1580 cnss_pr_err("Failed to create ramdump device!");
1587 dma_free_coherent(dev, ramdump_info->ramdump_size,
1588 ramdump_info->ramdump_va, ramdump_info->ramdump_pa);
1593 static void cnss_unregister_ramdump_v1(struct cnss_plat_data *plat_priv)
1596 struct cnss_ramdump_info *ramdump_info;
1598 dev = &plat_priv->plat_dev->dev;
1599 ramdump_info = &plat_priv->ramdump_info;
1601 if (ramdump_info->ramdump_dev)
1602 destroy_ramdump_device(ramdump_info->ramdump_dev);
1604 if (ramdump_info->ramdump_va)
1605 dma_free_coherent(dev, ramdump_info->ramdump_size,
1606 ramdump_info->ramdump_va,
1607 ramdump_info->ramdump_pa);
1610 static int cnss_register_ramdump_v2(struct cnss_plat_data *plat_priv)
1613 struct cnss_subsys_info *subsys_info;
1614 struct cnss_ramdump_info_v2 *info_v2;
1615 struct cnss_dump_data *dump_data;
1616 struct msm_dump_entry dump_entry;
1617 struct device *dev = &plat_priv->plat_dev->dev;
1618 u32 ramdump_size = 0;
1620 subsys_info = &plat_priv->subsys_info;
1621 info_v2 = &plat_priv->ramdump_info_v2;
1622 dump_data = &info_v2->dump_data;
1624 if (of_property_read_u32(dev->of_node, "qcom,wlan-ramdump-dynamic",
1625 &ramdump_size) == 0)
1626 info_v2->ramdump_size = ramdump_size;
1628 cnss_pr_dbg("Ramdump size 0x%lx\n", info_v2->ramdump_size);
1630 info_v2->dump_data_vaddr = kzalloc(CNSS_DUMP_DESC_SIZE, GFP_KERNEL);
1631 if (!info_v2->dump_data_vaddr)
1634 dump_data->paddr = virt_to_phys(info_v2->dump_data_vaddr);
1635 dump_data->version = CNSS_DUMP_FORMAT_VER_V2;
1636 dump_data->magic = CNSS_DUMP_MAGIC_VER_V2;
1637 dump_data->seg_version = CNSS_DUMP_SEG_VER;
1638 strlcpy(dump_data->name, CNSS_DUMP_NAME,
1639 sizeof(dump_data->name));
1640 dump_entry.id = MSM_DUMP_DATA_CNSS_WLAN;
1641 dump_entry.addr = virt_to_phys(dump_data);
1643 ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
1645 cnss_pr_err("Failed to setup dump table, err = %d\n", ret);
1649 info_v2->ramdump_dev =
1650 create_ramdump_device(subsys_info->subsys_desc.name,
1651 subsys_info->subsys_desc.dev);
1652 if (!info_v2->ramdump_dev) {
1653 cnss_pr_err("Failed to create ramdump device!\n");
1661 kfree(info_v2->dump_data_vaddr);
1662 info_v2->dump_data_vaddr = NULL;
1666 static void cnss_unregister_ramdump_v2(struct cnss_plat_data *plat_priv)
1668 struct cnss_ramdump_info_v2 *info_v2;
1670 info_v2 = &plat_priv->ramdump_info_v2;
1672 if (info_v2->ramdump_dev)
1673 destroy_ramdump_device(info_v2->ramdump_dev);
1675 kfree(info_v2->dump_data_vaddr);
1676 info_v2->dump_data_vaddr = NULL;
1677 info_v2->dump_data_valid = false;
1680 int cnss_register_ramdump(struct cnss_plat_data *plat_priv)
1684 switch (plat_priv->device_id) {
1685 case QCA6174_DEVICE_ID:
1686 ret = cnss_register_ramdump_v1(plat_priv);
1688 case QCA6290_EMULATION_DEVICE_ID:
1689 case QCA6290_DEVICE_ID:
1690 case QCN7605_DEVICE_ID:
1691 ret = cnss_register_ramdump_v2(plat_priv);
1693 case QCN7605_COMPOSITE_DEVICE_ID:
1694 case QCN7605_STANDALONE_DEVICE_ID:
1695 case QCN7605_VER20_STANDALONE_DEVICE_ID:
1696 case QCN7605_VER20_COMPOSITE_DEVICE_ID:
1700 cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id);
1707 void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv)
1709 switch (plat_priv->device_id) {
1710 case QCA6174_DEVICE_ID:
1711 cnss_unregister_ramdump_v1(plat_priv);
1713 case QCA6290_EMULATION_DEVICE_ID:
1714 case QCA6290_DEVICE_ID:
1715 cnss_unregister_ramdump_v2(plat_priv);
1717 case QCN7605_COMPOSITE_DEVICE_ID:
1718 case QCN7605_STANDALONE_DEVICE_ID:
1719 case QCN7605_VER20_STANDALONE_DEVICE_ID:
1720 case QCN7605_VER20_COMPOSITE_DEVICE_ID:
1723 cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id);
1728 static int cnss_register_bus_scale(struct cnss_plat_data *plat_priv)
1731 struct cnss_bus_bw_info *bus_bw_info;
1733 bus_bw_info = &plat_priv->bus_bw_info;
1735 bus_bw_info->bus_scale_table =
1736 msm_bus_cl_get_pdata(plat_priv->plat_dev);
1737 if (bus_bw_info->bus_scale_table) {
1738 bus_bw_info->bus_client =
1739 msm_bus_scale_register_client(
1740 bus_bw_info->bus_scale_table);
1741 if (!bus_bw_info->bus_client) {
1742 cnss_pr_err("Failed to register bus scale client!\n");
1753 static void cnss_unregister_bus_scale(struct cnss_plat_data *plat_priv)
1755 struct cnss_bus_bw_info *bus_bw_info;
1757 bus_bw_info = &plat_priv->bus_bw_info;
1759 if (bus_bw_info->bus_client)
1760 msm_bus_scale_unregister_client(bus_bw_info->bus_client);
1763 static ssize_t cnss_fs_ready_store(struct device *dev,
1764 struct device_attribute *attr,
1769 struct cnss_plat_data *plat_priv = dev_get_drvdata(dev);
1771 if (sscanf(buf, "%du", &fs_ready) != 1)
1774 cnss_pr_dbg("File system is ready, fs_ready is %d, count is %zu\n",
1778 cnss_pr_dbg("QMI is bypassed.\n");
1783 cnss_pr_err("plat_priv is NULL!\n");
1787 switch (plat_priv->device_id) {
1788 case QCA6290_EMULATION_DEVICE_ID:
1789 case QCA6290_DEVICE_ID:
1790 case QCN7605_DEVICE_ID:
1791 case QCN7605_COMPOSITE_DEVICE_ID:
1792 case QCN7605_STANDALONE_DEVICE_ID:
1795 cnss_pr_err("Not supported for device ID 0x%lx\n",
1796 plat_priv->device_id);
1800 if (fs_ready == FILE_SYSTEM_READY) {
1801 cnss_driver_event_post(plat_priv,
1802 CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START,
1803 CNSS_EVENT_SYNC, NULL);
1809 #ifdef CONFIG_SDIO_QCN
1810 static void cnss_set_card_state(bool state)
1812 qcn_sdio_card_state(state);
1815 static void cnss_set_card_state(bool state)
1821 static DEVICE_ATTR(fs_ready, 0220, NULL, cnss_fs_ready_store);
1823 static ssize_t cnss_wl_pwr_on(struct device *dev,
1824 struct device_attribute *attr,
1829 struct cnss_plat_data *plat_priv = dev_get_drvdata(dev);
1830 unsigned int timeout;
1832 if (sscanf(buf, "%du", &pwr_state) != 1)
1835 cnss_pr_dbg("vreg-wlan-en state change %d, count %zu", pwr_state,
1838 timeout = cnss_get_qmi_timeout();
1840 cnss_power_on_device(plat_priv);
1841 cnss_set_card_state(true);
1843 mod_timer(&plat_priv->fw_boot_timer,
1844 jiffies + msecs_to_jiffies(timeout));
1847 cnss_power_off_device(plat_priv);
1848 cnss_set_card_state(false);
1849 del_timer(&plat_priv->fw_boot_timer);
1854 static DEVICE_ATTR(wl_pwr_on, 0220, NULL, cnss_wl_pwr_on);
1856 static int cnss_create_sysfs(struct cnss_plat_data *plat_priv)
1860 ret = device_create_file(&plat_priv->plat_dev->dev, &dev_attr_fs_ready);
1862 cnss_pr_err("Failed to create device file, err = %d\n", ret);
1871 static void cnss_remove_sysfs(struct cnss_plat_data *plat_priv)
1873 device_remove_file(&plat_priv->plat_dev->dev, &dev_attr_fs_ready);
1876 static int cnss_create_sysfs_wl_pwr(struct cnss_plat_data *plat_priv)
1880 ret = device_create_file(&plat_priv->plat_dev->dev,
1881 &dev_attr_wl_pwr_on);
1883 cnss_pr_err("Failed to create device file, err = %d\n", ret);
1886 cnss_pr_dbg("created sysfs for vreg-wlan-en control\n");
1892 static void cnss_remove_sysfs_wl_pwr(struct cnss_plat_data *plat_priv)
1894 device_remove_file(&plat_priv->plat_dev->dev, &dev_attr_wl_pwr_on);
1897 static int cnss_event_work_init(struct cnss_plat_data *plat_priv)
1899 spin_lock_init(&plat_priv->event_lock);
1900 plat_priv->event_wq = alloc_workqueue("cnss_driver_event",
1902 if (!plat_priv->event_wq) {
1903 cnss_pr_err("Failed to create event workqueue!\n");
1907 INIT_WORK(&plat_priv->event_work, cnss_driver_event_work);
1908 INIT_LIST_HEAD(&plat_priv->event_list);
1913 static void cnss_event_work_deinit(struct cnss_plat_data *plat_priv)
1915 destroy_workqueue(plat_priv->event_wq);
1918 static int cnss_alloc_caldb_mem(struct cnss_plat_data *plat_priv)
1922 plat_priv->caldb_mem = vzalloc(QCN7605_CALDB_SIZE);
1923 if (plat_priv->caldb_mem)
1924 cnss_pr_dbg("600KB cal db alloc done caldb_mem %pK\n",
1925 plat_priv->caldb_mem);
1932 static void cnss_free_caldb_mem(struct cnss_plat_data *plat_priv)
1934 vfree(plat_priv->caldb_mem);
1937 static const struct platform_device_id cnss_platform_id_table[] = {
1938 { .name = "qca6174", .driver_data = QCA6174_DEVICE_ID, },
1939 { .name = "qca6290", .driver_data = QCA6290_DEVICE_ID, },
1940 { .name = "qcn7605", .driver_data = QCN7605_DEVICE_ID, },
1941 { .name = "qcn7605_sdio", .driver_data = QCN7605_SDIO_DEVICE_ID, },
1944 static const struct of_device_id cnss_of_match_table[] = {
1946 .compatible = "qcom,cnss",
1947 .data = (void *)&cnss_platform_id_table[0]},
1949 .compatible = "qcom,cnss-qca6290",
1950 .data = (void *)&cnss_platform_id_table[1]},
1952 .compatible = "qcom,cnss",
1953 .data = (void *)&cnss_platform_id_table[2]},
1955 .compatible = "qcom,cnss-sdio",
1956 .data = (void *)&cnss_platform_id_table[3]},
1959 MODULE_DEVICE_TABLE(of, cnss_of_match_table);
1961 static int cnss_probe(struct platform_device *plat_dev)
1964 struct cnss_plat_data *plat_priv;
1965 const struct of_device_id *of_id;
1966 const struct platform_device_id *device_id;
1968 if (cnss_get_plat_priv(plat_dev)) {
1969 cnss_pr_err("Driver is already initialized!\n");
1974 of_id = of_match_device(cnss_of_match_table, &plat_dev->dev);
1975 if (!of_id || !of_id->data) {
1976 cnss_pr_err("Failed to find of match device!\n");
1981 device_id = of_id->data;
1983 plat_priv = devm_kzalloc(&plat_dev->dev, sizeof(*plat_priv),
1990 plat_priv->plat_dev = plat_dev;
1991 plat_priv->device_id = device_id->driver_data;
1992 plat_priv->bus_type = cnss_get_bus_type(plat_priv->device_id);
1993 cnss_pr_dbg("bus type selected %d\n", plat_priv->bus_type);
1994 cnss_set_plat_priv(plat_dev, plat_priv);
1995 platform_set_drvdata(plat_dev, plat_priv);
1997 ret = cnss_get_resources(plat_priv);
2001 if (!test_bit(SKIP_DEVICE_BOOT, &quirks)) {
2002 ret = cnss_power_on_device(plat_priv);
2006 ret = cnss_bus_init(plat_priv);
2007 if (ret == -EPROBE_DEFER)
2013 ret = cnss_register_esoc(plat_priv);
2017 ret = cnss_register_bus_scale(plat_priv);
2021 ret = cnss_create_sysfs(plat_priv);
2023 goto unreg_bus_scale;
2025 ret = cnss_create_sysfs_wl_pwr(plat_priv);
2029 ret = cnss_event_work_init(plat_priv);
2031 goto remove_sysfs_pwr;
2033 ret = cnss_qmi_init(plat_priv);
2035 goto deinit_event_work;
2037 ret = cnss_debugfs_create(plat_priv);
2041 if (plat_priv->bus_type == CNSS_BUS_USB) {
2042 ret = cnss_alloc_caldb_mem(plat_priv);
2044 goto remove_debugfs;
2047 setup_timer(&plat_priv->fw_boot_timer,
2048 cnss_bus_fw_boot_timeout_hdlr, (unsigned long)plat_priv);
2050 register_pm_notifier(&cnss_pm_notifier);
2052 ret = device_init_wakeup(&plat_dev->dev, true);
2054 cnss_pr_err("Failed to init platform device wakeup source, err = %d\n",
2057 init_completion(&plat_priv->power_up_complete);
2058 init_completion(&plat_priv->rddm_complete);
2059 mutex_init(&plat_priv->dev_lock);
2061 cnss_pr_info("Platform driver probed successfully.\n");
2066 cnss_debugfs_destroy(plat_priv);
2068 cnss_qmi_deinit(plat_priv);
2070 cnss_event_work_deinit(plat_priv);
2072 cnss_remove_sysfs(plat_priv);
2074 cnss_remove_sysfs_wl_pwr(plat_priv);
2076 cnss_unregister_bus_scale(plat_priv);
2078 cnss_unregister_esoc(plat_priv);
2080 if (!test_bit(SKIP_DEVICE_BOOT, &quirks))
2081 cnss_bus_deinit(plat_priv);
2083 if (!test_bit(SKIP_DEVICE_BOOT, &quirks))
2084 cnss_power_off_device(plat_priv);
2086 cnss_put_resources(plat_priv);
2088 platform_set_drvdata(plat_dev, NULL);
2089 cnss_set_plat_priv(plat_dev, NULL);
2094 static int cnss_remove(struct platform_device *plat_dev)
2096 struct cnss_plat_data *plat_priv = platform_get_drvdata(plat_dev);
2098 complete_all(&plat_priv->rddm_complete);
2099 complete_all(&plat_priv->power_up_complete);
2100 device_init_wakeup(&plat_dev->dev, false);
2101 unregister_pm_notifier(&cnss_pm_notifier);
2102 del_timer(&plat_priv->fw_boot_timer);
2103 cnss_free_caldb_mem(plat_priv);
2104 cnss_debugfs_destroy(plat_priv);
2105 cnss_qmi_deinit(plat_priv);
2106 cnss_event_work_deinit(plat_priv);
2107 cnss_remove_sysfs(plat_priv);
2108 cnss_unregister_bus_scale(plat_priv);
2109 cnss_unregister_esoc(plat_priv);
2110 cnss_bus_deinit(plat_priv);
2111 cnss_put_resources(plat_priv);
2112 platform_set_drvdata(plat_dev, NULL);
2118 static struct platform_driver cnss_platform_driver = {
2119 .probe = cnss_probe,
2120 .remove = cnss_remove,
2123 .owner = THIS_MODULE,
2124 .of_match_table = cnss_of_match_table,
2125 #ifdef CONFIG_CNSS_ASYNC
2126 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
2131 static int __init cnss_initialize(void)
2136 ret = platform_driver_register(&cnss_platform_driver);
2138 cnss_debug_deinit();
2143 static void __exit cnss_exit(void)
2145 platform_driver_unregister(&cnss_platform_driver);
2146 cnss_debug_deinit();
2149 module_init(cnss_initialize);
2150 module_exit(cnss_exit);
2152 MODULE_LICENSE("GPL v2");
2153 MODULE_DESCRIPTION("CNSS2 Platform Driver");