| /* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #ifndef _CNSS_MAIN_H |
| #define _CNSS_MAIN_H |
| |
| #include <linux/esoc_client.h> |
| #include <linux/etherdevice.h> |
| #include <linux/msm-bus.h> |
| #include <linux/pm_qos.h> |
| #include <net/cnss2.h> |
| #include <soc/qcom/memory_dump.h> |
| #include <soc/qcom/subsystem_restart.h> |
| |
| #include "qmi.h" |
| |
| #define MAX_NO_OF_MAC_ADDR 4 |
| #define QMI_WLFW_MAX_TIMESTAMP_LEN 32 |
| #define QMI_WLFW_MAX_NUM_MEM_SEG 32 |
| |
| #define CNSS_EVENT_SYNC BIT(0) |
| #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) |
| #define CNSS_EVENT_SYNC_UNINTERRUPTIBLE (CNSS_EVENT_SYNC | \ |
| CNSS_EVENT_UNINTERRUPTIBLE) |
| |
| enum cnss_dev_bus_type { |
| CNSS_BUS_NONE = -1, |
| CNSS_BUS_PCI, |
| }; |
| |
| struct cnss_vreg_info { |
| struct regulator *reg; |
| const char *name; |
| u32 min_uv; |
| u32 max_uv; |
| u32 load_ua; |
| u32 delay_us; |
| }; |
| |
| struct cnss_pinctrl_info { |
| struct pinctrl *pinctrl; |
| struct pinctrl_state *bootstrap_active; |
| struct pinctrl_state *wlan_en_active; |
| struct pinctrl_state *wlan_en_sleep; |
| }; |
| |
| struct cnss_subsys_info { |
| struct subsys_device *subsys_device; |
| struct subsys_desc subsys_desc; |
| void *subsys_handle; |
| }; |
| |
| struct cnss_ramdump_info { |
| struct ramdump_device *ramdump_dev; |
| unsigned long ramdump_size; |
| void *ramdump_va; |
| phys_addr_t ramdump_pa; |
| struct msm_dump_data dump_data; |
| }; |
| |
| struct cnss_dump_seg { |
| unsigned long address; |
| void *v_address; |
| unsigned long size; |
| u32 type; |
| }; |
| |
| struct cnss_dump_data { |
| u32 version; |
| u32 magic; |
| char name[32]; |
| phys_addr_t paddr; |
| int nentries; |
| u32 seg_version; |
| }; |
| |
| struct cnss_ramdump_info_v2 { |
| struct ramdump_device *ramdump_dev; |
| unsigned long ramdump_size; |
| void *dump_data_vaddr; |
| bool dump_data_valid; |
| struct cnss_dump_data dump_data; |
| }; |
| |
| struct cnss_esoc_info { |
| struct esoc_desc *esoc_desc; |
| bool notify_modem_status; |
| void *modem_notify_handler; |
| int modem_current_status; |
| }; |
| |
| struct cnss_bus_bw_info { |
| struct msm_bus_scale_pdata *bus_scale_table; |
| u32 bus_client; |
| int current_bw_vote; |
| }; |
| |
| struct cnss_fw_mem { |
| size_t size; |
| void *va; |
| phys_addr_t pa; |
| bool valid; |
| u32 type; |
| }; |
| |
| struct wlfw_rf_chip_info { |
| u32 chip_id; |
| u32 chip_family; |
| }; |
| |
| struct wlfw_rf_board_info { |
| u32 board_id; |
| }; |
| |
| struct wlfw_soc_info { |
| u32 soc_id; |
| }; |
| |
| struct wlfw_fw_version_info { |
| u32 fw_version; |
| char fw_build_timestamp[QMI_WLFW_MAX_TIMESTAMP_LEN + 1]; |
| }; |
| |
| enum cnss_mem_type { |
| CNSS_MEM_TYPE_MSA, |
| CNSS_MEM_TYPE_DDR, |
| CNSS_MEM_BDF, |
| CNSS_MEM_M3, |
| CNSS_MEM_CAL_V01, |
| CNSS_MEM_DPD_V01, |
| }; |
| |
| enum cnss_fw_dump_type { |
| CNSS_FW_IMAGE, |
| CNSS_FW_RDDM, |
| CNSS_FW_REMOTE_HEAP, |
| }; |
| |
| enum cnss_driver_event_type { |
| CNSS_DRIVER_EVENT_SERVER_ARRIVE, |
| CNSS_DRIVER_EVENT_SERVER_EXIT, |
| CNSS_DRIVER_EVENT_REQUEST_MEM, |
| CNSS_DRIVER_EVENT_FW_MEM_READY, |
| CNSS_DRIVER_EVENT_FW_READY, |
| CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START, |
| CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE, |
| CNSS_DRIVER_EVENT_REGISTER_DRIVER, |
| CNSS_DRIVER_EVENT_UNREGISTER_DRIVER, |
| CNSS_DRIVER_EVENT_RECOVERY, |
| CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, |
| CNSS_DRIVER_EVENT_POWER_UP, |
| CNSS_DRIVER_EVENT_POWER_DOWN, |
| CNSS_DRIVER_EVENT_MAX, |
| }; |
| |
| enum cnss_driver_state { |
| CNSS_QMI_WLFW_CONNECTED, |
| CNSS_FW_MEM_READY, |
| CNSS_FW_READY, |
| CNSS_COLD_BOOT_CAL, |
| CNSS_DRIVER_LOADING, |
| CNSS_DRIVER_UNLOADING, |
| CNSS_DRIVER_PROBED, |
| CNSS_DRIVER_RECOVERY, |
| CNSS_FW_BOOT_RECOVERY, |
| CNSS_DEV_ERR_NOTIFY, |
| CNSS_DRIVER_DEBUG, |
| }; |
| |
| struct cnss_recovery_data { |
| enum cnss_recovery_reason reason; |
| }; |
| |
| enum cnss_pins { |
| CNSS_WLAN_EN, |
| CNSS_PCIE_TXP, |
| CNSS_PCIE_TXN, |
| CNSS_PCIE_RXP, |
| CNSS_PCIE_RXN, |
| CNSS_PCIE_REFCLKP, |
| CNSS_PCIE_REFCLKN, |
| CNSS_PCIE_RST, |
| CNSS_PCIE_WAKE, |
| }; |
| |
| struct cnss_pin_connect_result { |
| u32 fw_pwr_pin_result; |
| u32 fw_phy_io_pin_result; |
| u32 fw_rf_pin_result; |
| u32 host_pin_result; |
| }; |
| |
| enum cnss_debug_quirks { |
| LINK_DOWN_SELF_RECOVERY, |
| SKIP_DEVICE_BOOT, |
| USE_CORE_ONLY_FW, |
| SKIP_RECOVERY, |
| }; |
| |
| struct cnss_plat_data { |
| struct platform_device *plat_dev; |
| void *bus_priv; |
| enum cnss_dev_bus_type bus_type; |
| struct cnss_vreg_info *vreg_info; |
| struct cnss_pinctrl_info pinctrl_info; |
| struct cnss_subsys_info subsys_info; |
| struct cnss_ramdump_info ramdump_info; |
| struct cnss_ramdump_info_v2 ramdump_info_v2; |
| struct cnss_esoc_info esoc_info; |
| struct cnss_bus_bw_info bus_bw_info; |
| struct notifier_block modem_nb; |
| struct cnss_platform_cap cap; |
| struct pm_qos_request qos_request; |
| unsigned long device_id; |
| enum cnss_driver_status driver_status; |
| u32 recovery_count; |
| unsigned long driver_state; |
| struct list_head event_list; |
| spinlock_t event_lock; /* spinlock for driver work event handling */ |
| struct work_struct event_work; |
| struct workqueue_struct *event_wq; |
| struct qmi_handle *qmi_wlfw_clnt; |
| struct work_struct qmi_recv_msg_work; |
| struct notifier_block qmi_wlfw_clnt_nb; |
| struct wlfw_rf_chip_info chip_info; |
| struct wlfw_rf_board_info board_info; |
| struct wlfw_soc_info soc_info; |
| struct wlfw_fw_version_info fw_version_info; |
| u32 fw_mem_seg_len; |
| struct cnss_fw_mem fw_mem[QMI_WLFW_MAX_NUM_MEM_SEG]; |
| struct cnss_fw_mem m3_mem; |
| struct cnss_pin_connect_result pin_result; |
| struct dentry *root_dentry; |
| atomic_t pm_count; |
| struct timer_list fw_boot_timer; |
| struct completion power_up_complete; |
| struct completion cal_complete; |
| struct mutex dev_lock; /* mutex for register access through debugfs */ |
| u32 diag_reg_read_addr; |
| u32 diag_reg_read_mem_type; |
| u32 diag_reg_read_len; |
| u8 *diag_reg_read_buf; |
| bool cal_done; |
| char firmware_name[13]; |
| }; |
| |
| struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev); |
| bool *cnss_get_qmi_bypass(void); |
| unsigned long *cnss_get_debug_quirks(void); |
| int cnss_driver_event_post(struct cnss_plat_data *plat_priv, |
| enum cnss_driver_event_type type, |
| u32 flags, void *data); |
| int cnss_get_vreg(struct cnss_plat_data *plat_priv); |
| int cnss_get_pinctrl(struct cnss_plat_data *plat_priv); |
| int cnss_power_on_device(struct cnss_plat_data *plat_priv); |
| void cnss_power_off_device(struct cnss_plat_data *plat_priv); |
| int cnss_register_subsys(struct cnss_plat_data *plat_priv); |
| void cnss_unregister_subsys(struct cnss_plat_data *plat_priv); |
| int cnss_register_ramdump(struct cnss_plat_data *plat_priv); |
| void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv); |
| void cnss_set_pin_connect_status(struct cnss_plat_data *plat_priv); |
| |
| #endif /* _CNSS_MAIN_H */ |