From 2af1153b42048ff3e1ad049dee7ddff26081acd2 Mon Sep 17 00:00:00 2001 From: Hsiu-Chang Chen Date: Tue, 15 Feb 2022 10:19:35 +0800 Subject: wcn6740: Update cnss/mhi/qmi/qrtr drivers Migrate wlan codes to Rel2(Post CS5) Bug: 218419889 Test: Basic functions Change-Id: Ifd845bfba4ca35d14f5606b5cf2dde12e397801b --- cnss2/Kconfig | 9 --- cnss2/bus.c | 7 ++- cnss2/bus.h | 9 ++- cnss2/debug.c | 3 + cnss2/main.c | 35 +++++++---- cnss2/main.h | 10 +++- cnss2/pci.c | 142 ++++++++++++++++++++++++++++++++++---------- cnss2/pci.h | 2 +- cnss2/pci_platform.h | 24 ++++++-- cnss2/pci_platform_google.c | 9 ++- cnss2/pci_qcom.c | 11 ++-- cnss2/qmi.c | 21 ++++++- cnss2/reg.h | 13 ++-- 13 files changed, 214 insertions(+), 81 deletions(-) (limited to 'cnss2') diff --git a/cnss2/Kconfig b/cnss2/Kconfig index c6b06b3..58610be 100644 --- a/cnss2/Kconfig +++ b/cnss2/Kconfig @@ -90,15 +90,6 @@ config CNSS_QCA6490 These changes are needed to support the new hardware architecture for CNSS QCA6490 chipset. -config CNSS_WCN7850 - bool "Enable CNSS WCN7850 chipset specific changes" - depends on CNSS2 - help - This enables the changes from WLAN host driver that are specific to - CNSS WCN7850 chipset. - These changes are needed to support the new hardware architecture - for CNSS WCN7850 chipset. - config CNSS_REQ_FW_DIRECT bool "Enable request_firmware_direct for firmware or configuration file" depends on CNSS2 diff --git a/cnss2/bus.c b/cnss2/bus.c index 0c05001..ef1f26e 100644 --- a/cnss2/bus.c +++ b/cnss2/bus.c @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. */ +/* + * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + */ #include "bus.h" #include "debug.h" @@ -26,7 +29,7 @@ enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: return CNSS_BUS_PCI; default: cnss_pr_err("Unknown device_id: 0x%lx\n", device_id); diff --git a/cnss2/bus.h b/cnss2/bus.h index 33cff28..f6634b2 100644 --- a/cnss2/bus.h +++ b/cnss2/bus.h @@ -1,5 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. */ +/* + * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + */ #ifndef _CNSS_BUS_H #define _CNSS_BUS_H @@ -17,8 +20,8 @@ #define QCA6390_DEVICE_ID 0x1101 #define QCA6490_VENDOR_ID 0x17CB #define QCA6490_DEVICE_ID 0x1103 -#define WCN7850_VENDOR_ID 0x17CB -#define WCN7850_DEVICE_ID 0x1107 +#define KIWI_VENDOR_ID 0x17CB +#define KIWI_DEVICE_ID 0x1107 enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev); enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id); diff --git a/cnss2/debug.c b/cnss2/debug.c index aad49ea..957d501 100644 --- a/cnss2/debug.c +++ b/cnss2/debug.c @@ -134,6 +134,9 @@ static int cnss_stats_show_state(struct seq_file *s, case CNSS_PCI_PROBE_DONE: seq_puts(s, "PCI PROBE DONE"); continue; + case CNSS_DRIVER_REGISTER: + seq_puts(s, "DRIVER_REGISTERED"); + continue; } seq_printf(s, "UNKNOWN-%d", i); diff --git a/cnss2/main.c b/cnss2/main.c index 8a5f9d3..d6b349e 100644 --- a/cnss2/main.c +++ b/cnss2/main.c @@ -1684,7 +1684,7 @@ EXPORT_SYMBOL(cnss_qmi_send); static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) { int ret = 0; - u32 retry = 0; + u32 retry = 0, timeout; if (test_bit(CNSS_COLD_BOOT_CAL_DONE, &plat_priv->driver_state)) { cnss_pr_dbg("Calibration complete. Ignore calibration req\n"); @@ -1716,6 +1716,15 @@ static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) } set_bit(CNSS_IN_COLD_BOOT_CAL, &plat_priv->driver_state); + if (test_bit(CNSS_DRIVER_REGISTER, &plat_priv->driver_state)) { + timeout = cnss_get_timeout(plat_priv, + CNSS_TIMEOUT_CALIBRATION); + cnss_pr_dbg("Restarting calibration %ds timeout\n", + timeout / 1000); + if (cancel_delayed_work_sync(&plat_priv->wlan_reg_driver_work)) + schedule_delayed_work(&plat_priv->wlan_reg_driver_work, + msecs_to_jiffies(timeout)); + } reinit_completion(&plat_priv->cal_complete); ret = cnss_bus_dev_powerup(plat_priv); mark_cal_fail: @@ -1769,12 +1778,13 @@ static int cnss_cold_boot_cal_done_hdlr(struct cnss_plat_data *plat_priv, if (cal_info->cal_status == CNSS_CAL_DONE) { cnss_cal_mem_upload_to_file(plat_priv); - if (cancel_delayed_work_sync(&plat_priv->wlan_reg_driver_work) - ) { - cnss_pr_dbg("Schedule WLAN driver load\n"); + if (!test_bit(CNSS_DRIVER_REGISTER, &plat_priv->driver_state)) + goto out; + + cnss_pr_dbg("Schedule WLAN driver load\n"); + if (cancel_delayed_work_sync(&plat_priv->wlan_reg_driver_work)) schedule_delayed_work(&plat_priv->wlan_reg_driver_work, 0); - } } out: kfree(data); @@ -2534,7 +2544,7 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: ret = cnss_register_ramdump_v2(plat_priv); break; default: @@ -2554,7 +2564,7 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: cnss_unregister_ramdump_v2(plat_priv); break; default: @@ -2963,7 +2973,7 @@ static ssize_t fs_ready_store(struct device *dev, case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: cnss_pr_err("Not supported for device ID 0x%lx\n", @@ -2971,11 +2981,10 @@ static ssize_t fs_ready_store(struct device *dev, return count; } - if (fs_ready == FILE_SYSTEM_READY && plat_priv->cbc_enabled) { + if (fs_ready == FILE_SYSTEM_READY && plat_priv->cbc_enabled) cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START, 0, NULL); - } return count; } @@ -3287,7 +3296,7 @@ static const struct platform_device_id cnss_platform_id_table[] = { { .name = "qca6290", .driver_data = QCA6290_DEVICE_ID, }, { .name = "qca6390", .driver_data = QCA6390_DEVICE_ID, }, { .name = "qca6490", .driver_data = QCA6490_DEVICE_ID, }, - { .name = "wcn7850", .driver_data = WCN7850_DEVICE_ID, }, + { .name = "kiwi", .driver_data = KIWI_DEVICE_ID, }, { }, }; @@ -3305,7 +3314,7 @@ static const struct of_device_id cnss_of_match_table[] = { .compatible = "qcom,cnss-qca6490", .data = (void *)&cnss_platform_id_table[3]}, { - .compatible = "qcom,cnss-wcn7850", + .compatible = "qcom,cnss-kiwi", .data = (void *)&cnss_platform_id_table[4]}, { }, }; @@ -3517,7 +3526,7 @@ static bool cnss_is_valid_dt_node_found(void) { struct device_node *dn = NULL; - for_each_matching_node(dn, cnss_of_match_table) { + for_each_node_with_property(dn, "qcom,wlan") { if (of_device_is_available(dn)) break; } diff --git a/cnss2/main.h b/cnss2/main.h index 60b2eff..2664435 100644 --- a/cnss2/main.h +++ b/cnss2/main.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _CNSS_MAIN_H @@ -65,6 +65,7 @@ #define FW_V2_NUMBER 2 #define POWER_ON_RETRY_MAX_TIMES 3 #define POWER_ON_RETRY_DELAY_MS 500 +#define WLFW_MAX_HANG_EVENT_DATA_SIZE 384 #define CNSS_EVENT_SYNC BIT(0) #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) @@ -206,14 +207,12 @@ struct cnss_bus_bw_info { * struct cnss_interconnect_cfg - CNSS platform interconnect config * @list_head: List of interconnect path bandwidth configs * @path_count: Count of interconnect path configured in device tree - * @current_bw_vote: WLAN driver provided bandwidth vote * @bus_bw_cfg_count: Number of bandwidth configs for voting. It is the array * size of struct cnss_bus_bw_info.cfg_table */ struct cnss_interconnect_cfg { struct list_head list_head; u32 path_count; - int current_bw_vote; u32 bus_bw_cfg_count; }; @@ -323,6 +322,7 @@ enum cnss_driver_state { CNSS_QMI_DMS_CONNECTED = 20, CNSS_DAEMON_CONNECTED, CNSS_PCI_PROBE_DONE, + CNSS_DRIVER_REGISTER, }; struct cnss_recovery_data { @@ -536,6 +536,10 @@ struct cnss_plat_data { bool adsp_pc_enabled; u64 feature_list; u8 charger_mode; + /* WLAN driver provided bandwidth vote */ + int current_bw_vote; + u16 hang_event_data_len; + u32 hang_data_addr_offset; }; #if IS_ENABLED(CONFIG_ARCH_QCOM) && !IS_ENABLED(CONFIG_WCN_GOOGLE) diff --git a/cnss2/pci.c b/cnss2/pci.c index 3c8c72e..b5543bd 100644 --- a/cnss2/pci.c +++ b/cnss2/pci.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -44,7 +44,7 @@ #define QCA6390_PATH_PREFIX "qca6390/" #define QCA6490_PATH_PREFIX "qca6490/" -#define WCN7850_PATH_PREFIX "wcn7850/" +#define KIWI_PATH_PREFIX "kiwi/" #define DEFAULT_PHY_M3_FILE_NAME "m3.bin" #define DEFAULT_PHY_UCODE_FILE_NAME "phy_ucode.elf" #define DEFAULT_FW_FILE_NAME "amss.bin" @@ -854,7 +854,7 @@ static int cnss_setup_bus_bandwidth(struct cnss_plat_data *plat_priv, } } if (ret == 0 && save) - plat_priv->icc.current_bw_vote = bw; + plat_priv->current_bw_vote = bw; return ret; } @@ -1144,7 +1144,7 @@ int cnss_pci_recover_link_down(struct cnss_pci_data *pci_priv) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return -EOPNOTSUPP; @@ -1257,6 +1257,27 @@ int cnss_pci_link_down(struct device *dev) } EXPORT_SYMBOL(cnss_pci_link_down); +int cnss_pci_get_reg_dump(struct device *dev, uint8_t *buffer, uint32_t len) +{ + struct pci_dev *pci_dev = to_pci_dev(dev); + struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); + + if (!pci_priv) { + cnss_pr_err("pci_priv is NULL\n"); + return -ENODEV; + } + + if (pci_priv->pci_link_state == PCI_LINK_DOWN) { + cnss_pr_dbg("No PCIe reg dump since PCIe is suspended(D3)\n"); + return -EACCES; + } + + cnss_pr_dbg("Start to get PCIe reg dump\n"); + + return _cnss_pci_get_reg_dump(pci_priv, buffer, len); +} +EXPORT_SYMBOL(cnss_pci_get_reg_dump); + int cnss_pcie_is_device_down(struct cnss_pci_data *pci_priv) { struct cnss_plat_data *plat_priv; @@ -1296,6 +1317,27 @@ void cnss_pci_unlock_reg_window(struct device *dev, unsigned long *flags) } EXPORT_SYMBOL(cnss_pci_unlock_reg_window); +int cnss_get_pci_slot(struct device *dev) +{ + struct pci_dev *pci_dev = to_pci_dev(dev); + struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); + struct cnss_plat_data *plat_priv = NULL; + + if (!pci_priv) { + cnss_pr_err("pci_priv is NULL\n"); + return -EINVAL; + } + + plat_priv = pci_priv->plat_priv; + if (!plat_priv) { + cnss_pr_err("plat_priv is NULL\n"); + return -ENODEV; + } + + return plat_priv->rc_num; +} +EXPORT_SYMBOL(cnss_get_pci_slot); + /** * cnss_pci_dump_bl_sram_mem - Dump WLAN device bootloader debug log * @pci_priv: driver PCI bus context pointer @@ -1327,11 +1369,11 @@ static void cnss_pci_dump_bl_sram_mem(struct cnss_pci_data *pci_priv) pbl_log_max_size = QCA6490_DEBUG_PBL_LOG_SRAM_MAX_SIZE; sbl_log_max_size = QCA6490_DEBUG_SBL_LOG_SRAM_MAX_SIZE; break; - case WCN7850_DEVICE_ID: - pbl_bootstrap_status_reg = WCN7850_PBL_BOOTSTRAP_STATUS; - pbl_log_sram_start = WCN7850_DEBUG_PBL_LOG_SRAM_START; - pbl_log_max_size = WCN7850_DEBUG_PBL_LOG_SRAM_MAX_SIZE; - sbl_log_max_size = WCN7850_DEBUG_SBL_LOG_SRAM_MAX_SIZE; + case KIWI_DEVICE_ID: + pbl_bootstrap_status_reg = KIWI_PBL_BOOTSTRAP_STATUS; + pbl_log_sram_start = KIWI_DEBUG_PBL_LOG_SRAM_START; + pbl_log_max_size = KIWI_DEBUG_PBL_LOG_SRAM_MAX_SIZE; + sbl_log_max_size = KIWI_DEBUG_SBL_LOG_SRAM_MAX_SIZE; default: return; } @@ -2537,7 +2579,7 @@ int cnss_pci_dev_powerup(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: ret = cnss_qca6290_powerup(pci_priv); break; default: @@ -2565,7 +2607,7 @@ int cnss_pci_dev_shutdown(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: ret = cnss_qca6290_shutdown(pci_priv); break; default: @@ -2593,7 +2635,7 @@ int cnss_pci_dev_crash_shutdown(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: cnss_qca6290_crash_shutdown(pci_priv); break; default: @@ -2621,7 +2663,7 @@ int cnss_pci_dev_ramdump(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: ret = cnss_qca6290_ramdump(pci_priv); break; default: @@ -2650,18 +2692,32 @@ static void cnss_wlan_reg_driver_work(struct work_struct *work) container_of(work, struct cnss_plat_data, wlan_reg_driver_work.work); struct cnss_pci_data *pci_priv = plat_priv->bus_priv; struct cnss_cal_info *cal_info; + unsigned int timeout; if (test_bit(CNSS_COLD_BOOT_CAL_DONE, &plat_priv->driver_state)) { goto reg_driver; } else { - cnss_pr_err("Timeout waiting for calibration to complete\n"); - del_timer(&plat_priv->fw_boot_timer); if (plat_priv->charger_mode) { cnss_pr_err("Ignore calibration timeout in charger mode\n"); return; } - if (!test_bit(CNSS_IN_REBOOT, &plat_priv->driver_state)) + if (!test_bit(CNSS_IN_COLD_BOOT_CAL, + &plat_priv->driver_state)) { + timeout = cnss_get_timeout(plat_priv, + CNSS_TIMEOUT_CALIBRATION); + cnss_pr_dbg("File system not ready to start calibration. Wait for %ds..\n", + timeout / 1000); + schedule_delayed_work(&plat_priv->wlan_reg_driver_work, + msecs_to_jiffies(timeout)); + return; + } + + del_timer(&plat_priv->fw_boot_timer); + if (test_bit(CNSS_IN_COLD_BOOT_CAL, &plat_priv->driver_state) && + !test_bit(CNSS_IN_REBOOT, &plat_priv->driver_state)) { + cnss_pr_err("Timeout waiting for calibration to complete\n"); CNSS_ASSERT(0); + } cal_info = kzalloc(sizeof(*cal_info), GFP_KERNEL); if (!cal_info) return; @@ -2729,6 +2785,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) return -ENODEV; } #endif + set_bit(CNSS_DRIVER_REGISTER, &plat_priv->driver_state); if (!plat_priv->cbc_enabled || test_bit(CNSS_COLD_BOOT_CAL_DONE, &plat_priv->driver_state)) @@ -3453,7 +3510,7 @@ int cnss_auto_resume(struct device *dev) cnss_pci_set_auto_suspended(pci_priv, 0); mutex_unlock(&pci_priv->bus_lock); - cnss_request_bus_bandwidth(dev, plat_priv->icc.current_bw_vote); + cnss_request_bus_bandwidth(dev, plat_priv->current_bw_vote); return 0; } @@ -3472,7 +3529,7 @@ int cnss_pci_force_wake_request_sync(struct device *dev, int timeout_us) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return 0; @@ -3513,7 +3570,7 @@ int cnss_pci_force_wake_request(struct device *dev) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return 0; @@ -3548,7 +3605,7 @@ int cnss_pci_is_device_awake(struct device *dev) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return 0; @@ -3575,7 +3632,7 @@ int cnss_pci_force_wake_release(struct device *dev) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return 0; @@ -4243,7 +4300,7 @@ static int cnss_pci_enable_bus(struct cnss_pci_data *pci_priv) break; case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: pci_priv->dma_bit_mask = PCI_DMA_MASK_36_BIT; break; default: @@ -4529,6 +4586,7 @@ static void cnss_pci_send_hang_event(struct cnss_pci_data *pci_priv) struct cnss_hang_event hang_event; void *hang_data_va = NULL; u64 offset = 0; + u16 length = 0; int i = 0; if (!fw_mem || !plat_priv->fw_mem_seg_len) @@ -4538,9 +4596,20 @@ static void cnss_pci_send_hang_event(struct cnss_pci_data *pci_priv) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: offset = HST_HANG_DATA_OFFSET; + length = HANG_DATA_LENGTH; break; case QCA6490_DEVICE_ID: - offset = HSP_HANG_DATA_OFFSET; + /* Fallback to hard-coded values if hang event params not + * present in QMI. Once all the firmware branches have the + * fix to send params over QMI, this can be removed. + */ + if (plat_priv->hang_event_data_len) { + offset = plat_priv->hang_data_addr_offset; + length = plat_priv->hang_event_data_len; + } else { + offset = HSP_HANG_DATA_OFFSET; + length = HANG_DATA_LENGTH; + } break; default: cnss_pr_err("Skip Hang Event Data as unsupported Device ID received: %d\n", @@ -4551,15 +4620,19 @@ static void cnss_pci_send_hang_event(struct cnss_pci_data *pci_priv) for (i = 0; i < plat_priv->fw_mem_seg_len; i++) { if (fw_mem[i].type == QMI_WLFW_MEM_TYPE_DDR_V01 && fw_mem[i].va) { + /* The offset must be < (fw_mem size- hangdata length) */ + if (!(offset <= fw_mem[i].size - length)) + goto exit; + hang_data_va = fw_mem[i].va + offset; hang_event.hang_event_data = kmemdup(hang_data_va, - HANG_DATA_LENGTH, + length, GFP_ATOMIC); if (!hang_event.hang_event_data) { cnss_pr_dbg("Hang data memory alloc failed\n"); return; } - hang_event.hang_event_data_len = HANG_DATA_LENGTH; + hang_event.hang_event_data_len = length; break; } } @@ -4568,6 +4641,11 @@ static void cnss_pci_send_hang_event(struct cnss_pci_data *pci_priv) kfree(hang_event.hang_event_data); hang_event.hang_event_data = NULL; + return; +exit: + cnss_pr_dbg("Invalid hang event params, offset:0x%x, length:0x%x\n", + plat_priv->hang_data_addr_offset, + plat_priv->hang_event_data_len); } void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) @@ -4786,9 +4864,9 @@ void cnss_pci_add_fw_prefix_name(struct cnss_pci_data *pci_priv, scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, QCA6490_PATH_PREFIX "%s", name); break; - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, - WCN7850_PATH_PREFIX "%s", name); + KIWI_PATH_PREFIX "%s", name); break; default: scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, "%s", name); @@ -4831,6 +4909,7 @@ static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv) FW_V2_FILE_NAME); break; case QCA6490_DEVICE_ID: + case KIWI_DEVICE_ID: switch (plat_priv->device_version.major_version) { case FW_V2_NUMBER: cnss_pci_add_fw_prefix_name(pci_priv, @@ -5407,7 +5486,7 @@ static int cnss_pci_probe(struct pci_dev *pci_dev, case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: cnss_pci_set_wlaon_pwr_ctrl(pci_priv, false, false, false); timer_setup(&pci_priv->dev_rddm_timer, cnss_dev_rddm_timeout_hdlr, 0); @@ -5475,7 +5554,7 @@ static void cnss_pci_remove(struct pci_dev *pci_dev) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: - case WCN7850_DEVICE_ID: + case KIWI_DEVICE_ID: cnss_pci_wake_gpio_deinit(pci_priv); del_timer(&pci_priv->boot_debug_timer); del_timer(&pci_priv->dev_rddm_timer); @@ -5506,7 +5585,7 @@ static const struct pci_device_id cnss_pci_id_table[] = { { QCA6290_VENDOR_ID, QCA6290_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6390_VENDOR_ID, QCA6390_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6490_VENDOR_ID, QCA6490_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, - { WCN7850_VENDOR_ID, WCN7850_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, + { KIWI_VENDOR_ID, KIWI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; MODULE_DEVICE_TABLE(pci, cnss_pci_id_table); @@ -5592,9 +5671,6 @@ int cnss_pci_init(struct cnss_plat_data *plat_priv) } ret = pci_register_driver(&cnss_pci_driver); -#if IS_ENABLED(CONFIG_WCN_GOOGLE) - cnss_pr_err("ret of pci_register_driver: %d\n", ret); -#endif if (ret) { cnss_pr_err("Failed to register to PCI framework, err = %d\n", ret); diff --git a/cnss2/pci.h b/cnss2/pci.h index 2a9a36e..16d4b65 100644 --- a/cnss2/pci.h +++ b/cnss2/pci.h @@ -66,7 +66,7 @@ enum cnss_rtpm_id { enum cnss_pci_reg_dev_mask { REG_MASK_QCA6390, REG_MASK_QCA6490, - REG_MASK_WCN7850, + REG_MASK_KIWI, }; struct cnss_msi_user { diff --git a/cnss2/pci_platform.h b/cnss2/pci_platform.h index 9d03f83..74ed99b 100644 --- a/cnss2/pci_platform.h +++ b/cnss2/pci_platform.h @@ -1,8 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. - */ +/* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _CNSS_PCI_PLATFORM_H #define _CNSS_PCI_PLATFORM_H @@ -109,6 +106,19 @@ int cnss_pci_prevent_l1(struct device *dev); void cnss_pci_allow_l1(struct device *dev); int cnss_pci_get_msi_assignment(struct cnss_pci_data *pci_priv); int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv); +/** + * _cnss_pci_get_reg_dump() - Dump PCIe RC registers for debug + * @pci_priv: driver PCI bus context pointer + * @buf: destination buffer pointer + * @len: length of the buffer + * + * This function shall call corresponding PCIe root complex driver API + * to dump PCIe RC registers for debug purpose. + * + * Return: 0 for success, negative value for error + */ +int _cnss_pci_get_reg_dump(struct cnss_pci_data *pci_priv, + u8 *buf, u32 len); #else int _cnss_pci_enumerate(struct cnss_plat_data *plat_priv, u32 rc_num) { @@ -174,6 +184,12 @@ int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv) { return 0; } + +int _cnss_pci_get_reg_dump(struct cnss_pci_data *pci_priv, + u8 *buf, u32 len) +{ + return 0; +} #endif /* CONFIG_PCI_MSM */ #if IS_ENABLED(CONFIG_WCN_GOOGLE) diff --git a/cnss2/pci_platform_google.c b/cnss2/pci_platform_google.c index 6266f58..44d0638 100644 --- a/cnss2/pci_platform_google.c +++ b/cnss2/pci_platform_google.c @@ -168,7 +168,14 @@ int cnss_pci_get_msi_assignment(struct cnss_pci_data *pci_priv) return 0; } -int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv) { +int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv) +{ + return 0; +} + +int _cnss_pci_get_reg_dump(struct cnss_pci_data *pci_priv, + u8 *buf, u32 len) +{ return 0; } diff --git a/cnss2/pci_qcom.c b/cnss2/pci_qcom.c index 1df4976..f9242d5 100644 --- a/cnss2/pci_qcom.c +++ b/cnss2/pci_qcom.c @@ -1,8 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (c) 2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. - */ +/* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "pci_platform.h" #include "debug.h" @@ -514,6 +511,12 @@ int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv) return 0; } +int _cnss_pci_get_reg_dump(struct cnss_pci_data *pci_priv, + u8 *buf, u32 len) +{ + return 0; +} + #if IS_ENABLED(CONFIG_ARCH_QCOM) /** * cnss_pci_of_reserved_mem_device_init() - Assign reserved memory region diff --git a/cnss2/qmi.c b/cnss2/qmi.c index 3ffcc66..d599565 100644 --- a/cnss2/qmi.c +++ b/cnss2/qmi.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -189,7 +189,7 @@ qmi_registered: static void cnss_wlfw_host_cap_parse_mlo(struct cnss_plat_data *plat_priv, struct wlfw_host_cap_req_msg_v01 *req) { - if (plat_priv->device_id == WCN7850_DEVICE_ID) { + if (plat_priv->device_id == KIWI_DEVICE_ID) { req->mlo_capable_valid = 1; req->mlo_capable = 1; req->mlo_chip_id_valid = 1; @@ -520,6 +520,18 @@ int cnss_wlfw_tgt_cap_send_sync(struct cnss_plat_data *plat_priv) plat_priv->fw_pcie_gen_switch = !!(resp->fw_caps & QMI_WLFW_HOST_PCIE_GEN_SWITCH_V01); + if (resp->hang_data_length_valid && + resp->hang_data_length && + resp->hang_data_length <= WLFW_MAX_HANG_EVENT_DATA_SIZE) + plat_priv->hang_event_data_len = resp->hang_data_length; + else + plat_priv->hang_event_data_len = 0; + + if (resp->hang_data_addr_offset_valid) + plat_priv->hang_data_addr_offset = resp->hang_data_addr_offset; + else + plat_priv->hang_data_addr_offset = 0; + cnss_pr_dbg("Target capability: chip_id: 0x%x, chip_family: 0x%x, board_id: 0x%x, soc_id: 0x%x, otp_version: 0x%x\n", plat_priv->chip_info.chip_id, plat_priv->chip_info.chip_family, @@ -529,6 +541,9 @@ int cnss_wlfw_tgt_cap_send_sync(struct cnss_plat_data *plat_priv) plat_priv->fw_version_info.fw_version, plat_priv->fw_version_info.fw_build_timestamp, plat_priv->fw_build_id); + cnss_pr_dbg("Hang event params, Length: 0x%x, Offset Address: 0x%x\n", + plat_priv->hang_event_data_len, + plat_priv->hang_data_addr_offset); kfree(req); kfree(resp); @@ -1013,7 +1028,7 @@ void cnss_get_qdss_cfg_filename(struct cnss_plat_data *plat_priv, char filename_tmp[MAX_FIRMWARE_NAME_LEN]; char *debug_str = QDSS_DEBUG_FILE_STR; - if (plat_priv->device_id == WCN7850_DEVICE_ID) + if (plat_priv->device_id == KIWI_DEVICE_ID) debug_str = ""; if (plat_priv->device_version.major_version == FW_V2_NUMBER) diff --git a/cnss2/reg.h b/cnss2/reg.h index 2807b30..0ac689d 100644 --- a/cnss2/reg.h +++ b/cnss2/reg.h @@ -1,5 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. */ +/* + * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + */ #ifndef _CNSS_REG_H #define _CNSS_REG_H @@ -81,10 +84,10 @@ #define QCA6490_DEBUG_PBL_LOG_SRAM_MAX_SIZE 40 #define QCA6490_DEBUG_SBL_LOG_SRAM_MAX_SIZE 48 -#define WCN7850_DEBUG_PBL_LOG_SRAM_START 0x01403D98 -#define WCN7850_DEBUG_PBL_LOG_SRAM_MAX_SIZE 40 -#define WCN7850_DEBUG_SBL_LOG_SRAM_MAX_SIZE 48 -#define WCN7850_PBL_BOOTSTRAP_STATUS 0x01A10008 +#define KIWI_DEBUG_PBL_LOG_SRAM_START 0x01403D98 +#define KIWI_DEBUG_PBL_LOG_SRAM_MAX_SIZE 40 +#define KIWI_DEBUG_SBL_LOG_SRAM_MAX_SIZE 48 +#define KIWI_PBL_BOOTSTRAP_STATUS 0x01A10008 #define TCSR_PBL_LOGGING_REG 0x01B000F8 #define PCIE_BHI_ERRDBG2_REG 0x01E0E238 -- cgit v1.2.3