diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2020-09-24 03:59:59 -0700 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2020-09-24 03:59:59 -0700 |
commit | e3a29a89106bde5518688dba77e9e333fec411d7 (patch) | |
tree | 068674f8ba8bec471df4ee392def4ce6630dd3f3 | |
parent | 8f42144c507b6a95ba1f2a2504a90a0038b82fd3 (diff) | |
parent | c56c416a37fa86ec9eef976a87d04287a3238a76 (diff) |
Merge c56c416a37fa86ec9eef976a87d04287a3238a76 on remote branchLA.UM.8.13.r1-10300-SAIPAN.0
Change-Id: Ib8f7db66d288a99e05ef295826a225202ef25e3b
24 files changed, 510 insertions, 137 deletions
diff --git a/drivers/media/platform/msm/cvp/msm_cvp_core.c b/drivers/media/platform/msm/cvp/msm_cvp_core.c index a4a86def1616..f970d1df4b98 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_core.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_core.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include <linux/dma-direction.h> @@ -367,14 +367,39 @@ EXPORT_SYMBOL(msm_cvp_open); static void msm_cvp_cleanup_instance(struct msm_cvp_inst *inst) { + bool empty; + int max_retries; + if (!inst) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return; } + max_retries = inst->core->resources.msm_cvp_hw_rsp_timeout >> 1; + +wait: + mutex_lock(&inst->cvpdspbufs.lock); + empty = list_empty(&inst->cvpdspbufs.list); + if (!empty && max_retries > 0) { + mutex_unlock(&inst->cvpdspbufs.lock); + usleep_range(1000, 2000); + max_retries--; + goto wait; + } + mutex_unlock(&inst->cvpdspbufs.lock); + + dprintk(CVP_DBG, "empty %d, retry %d\n", (int)empty, + (inst->core->resources.msm_cvp_hw_rsp_timeout >> 1) - max_retries); + if (!empty) { + dprintk(CVP_WARN, + "Failed to process frames before session close\n"); + } + if (cvp_comm_release_persist_buffers(inst)) dprintk(CVP_ERR, "Failed to release persist buffers\n"); + + dprintk(CVP_DBG, "Done cvp cleanup instance\n"); } int msm_cvp_destroy(struct msm_cvp_inst *inst) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 43dbbbe8508a..a4b8f0fc963d 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1584,6 +1584,17 @@ static void cnss_pci_dump_misc_reg(struct cnss_pci_data *pci_priv) pci_priv->wlaon_reg_size, "wlaon"); } +static void cnss_pci_dump_mhi_reg(struct cnss_pci_data *pci_priv) +{ + if (in_interrupt() || irqs_disabled()) + return; + + if (cnss_pci_check_link_status(pci_priv)) + return; + + mhi_debug_reg_dump(pci_priv->mhi_ctrl); +} + static void cnss_pci_dump_shadow_reg(struct cnss_pci_data *pci_priv) { int i, j = 0, array_size = SHADOW_REG_COUNT + SHADOW_REG_INTER_COUNT; @@ -1642,6 +1653,150 @@ static void cnss_pci_collect_dump(struct cnss_pci_data *pci_priv) } #endif +/** + * cnss_pci_dump_qca6390_sram_mem - Dump WLAN FW bootloader debug log + * @pci_priv: PCI device private data structure of cnss platform driver + * + * Dump Primary and secondary bootloader debug log data. For SBL check the + * log struct address and size for validity. + * + * Supported only on QCA6390 + * + * Return: None + */ +static void cnss_pci_dump_qca6390_sram_mem(struct cnss_pci_data *pci_priv) +{ + int i; + u32 mem_addr, val, pbl_stage, sbl_log_start, sbl_log_size; + u32 pbl_wlan_boot_cfg, pbl_bootstrap_status; + struct cnss_plat_data *plat_priv = pci_priv->plat_priv; + + if (plat_priv->device_id != QCA6390_DEVICE_ID) + return; + + if (cnss_pci_check_link_status(pci_priv)) + return; + + cnss_pci_reg_read(pci_priv, QCA6390_TCSR_PBL_LOGGING_REG, &pbl_stage); + cnss_pci_reg_read(pci_priv, QCA6390_PCIE_BHI_ERRDBG2_REG, + &sbl_log_start); + cnss_pci_reg_read(pci_priv, QCA6390_PCIE_BHI_ERRDBG3_REG, + &sbl_log_size); + cnss_pci_reg_read(pci_priv, QCA6390_PBL_WLAN_BOOT_CFG, + &pbl_wlan_boot_cfg); + cnss_pci_reg_read(pci_priv, QCA6390_PBL_BOOTSTRAP_STATUS, + &pbl_bootstrap_status); + cnss_pr_dbg("TCSR_PBL_LOGGING: 0x%08x PCIE_BHI_ERRDBG: Start: 0x%08x Size:0x%08x\n", + pbl_stage, sbl_log_start, sbl_log_size); + cnss_pr_dbg("PBL_WLAN_BOOT_CFG: 0x%08x PBL_BOOTSTRAP_STATUS: 0x%08x\n", + pbl_wlan_boot_cfg, pbl_bootstrap_status); + + cnss_pr_dbg("Dumping PBL log data\n"); + /* cnss_pci_reg_read provides 32bit register values */ + for (i = 0; i < QCA6390_DEBUG_PBL_LOG_SRAM_MAX_SIZE; i += sizeof(val)) { + mem_addr = QCA6390_DEBUG_PBL_LOG_SRAM_START + i; + if (cnss_pci_reg_read(pci_priv, mem_addr, &val)) + break; + cnss_pr_dbg("SRAM[0x%x] = 0x%x\n", mem_addr, val); + } + + sbl_log_size = (sbl_log_size > QCA6390_DEBUG_SBL_LOG_SRAM_MAX_SIZE ? + QCA6390_DEBUG_SBL_LOG_SRAM_MAX_SIZE : sbl_log_size); + + if (sbl_log_start < QCA6390_V2_SBL_DATA_START || + sbl_log_start > QCA6390_V2_SBL_DATA_END || + (sbl_log_start + sbl_log_size) > QCA6390_V2_SBL_DATA_END) + goto out; + + cnss_pr_dbg("Dumping SBL log data\n"); + for (i = 0; i < sbl_log_size; i += sizeof(val)) { + mem_addr = sbl_log_start + i; + if (cnss_pci_reg_read(pci_priv, mem_addr, &val)) + break; + cnss_pr_dbg("SRAM[0x%x] = 0x%x\n", mem_addr, val); + } + return; +out: + cnss_pr_err("Invalid SBL log data\n"); +} + +/** + * cnss_pci_dump_bl_sram_mem - Dump WLAN FW bootloader debug log + * @pci_priv: PCI device private data structure of cnss platform driver + * + * Dump Primary and secondary bootloader debug log data. For SBL check the + * log struct address and size for validity. + * + * Supported only on QCA6490 + * + * Return: None + */ +static void cnss_pci_dump_bl_sram_mem(struct cnss_pci_data *pci_priv) +{ + int i; + u32 mem_addr, val, pbl_stage, sbl_log_start, sbl_log_size; + u32 pbl_wlan_boot_cfg, pbl_bootstrap_status; + struct cnss_plat_data *plat_priv = pci_priv->plat_priv; + + if (plat_priv->device_id == QCA6390_DEVICE_ID) { + cnss_pci_dump_qca6390_sram_mem(pci_priv); + return; + } else if (plat_priv->device_id != QCA6490_DEVICE_ID) { + return; + } + + if (cnss_pci_check_link_status(pci_priv)) + return; + + cnss_pci_reg_read(pci_priv, QCA6490_TCSR_PBL_LOGGING_REG, &pbl_stage); + cnss_pci_reg_read(pci_priv, QCA6490_PCIE_BHI_ERRDBG2_REG, + &sbl_log_start); + cnss_pci_reg_read(pci_priv, QCA6490_PCIE_BHI_ERRDBG3_REG, + &sbl_log_size); + cnss_pci_reg_read(pci_priv, QCA6490_PBL_WLAN_BOOT_CFG, + &pbl_wlan_boot_cfg); + cnss_pci_reg_read(pci_priv, QCA6490_PBL_BOOTSTRAP_STATUS, + &pbl_bootstrap_status); + cnss_pr_dbg("TCSR_PBL_LOGGING: 0x%08x PCIE_BHI_ERRDBG: Start: 0x%08x Size:0x%08x", + pbl_stage, sbl_log_start, sbl_log_size); + cnss_pr_dbg("PBL_WLAN_BOOT_CFG: 0x%08x PBL_BOOTSTRAP_STATUS: 0x%08x", + pbl_wlan_boot_cfg, pbl_bootstrap_status); + + cnss_pr_dbg("Dumping PBL log data"); + /* cnss_pci_reg_read provides 32bit register values */ + for (i = 0; i < QCA6490_DEBUG_PBL_LOG_SRAM_MAX_SIZE; i += sizeof(val)) { + mem_addr = QCA6490_DEBUG_PBL_LOG_SRAM_START + i; + if (cnss_pci_reg_read(pci_priv, mem_addr, &val)) + break; + cnss_pr_dbg("SRAM[0x%x] = 0x%x\n", mem_addr, val); + } + + sbl_log_size = (sbl_log_size > QCA6490_DEBUG_SBL_LOG_SRAM_MAX_SIZE ? + QCA6490_DEBUG_SBL_LOG_SRAM_MAX_SIZE : sbl_log_size); + if (plat_priv->device_version.major_version == FW_V2_NUMBER) { + if (sbl_log_start < QCA6490_V2_SBL_DATA_START || + sbl_log_start > QCA6490_V2_SBL_DATA_END || + (sbl_log_start + sbl_log_size) > QCA6490_V2_SBL_DATA_END) + goto out; + } else { + if (sbl_log_start < QCA6490_V1_SBL_DATA_START || + sbl_log_start > QCA6490_V1_SBL_DATA_END || + (sbl_log_start + sbl_log_size) > QCA6490_V1_SBL_DATA_END) + goto out; + } + + cnss_pr_dbg("Dumping SBL log data"); + for (i = 0; i < sbl_log_size; i += sizeof(val)) { + mem_addr = sbl_log_start + i; + if (cnss_pci_reg_read(pci_priv, mem_addr, &val)) + break; + cnss_pr_dbg("SRAM[0x%x] = 0x%x\n", mem_addr, val); + } + return; +out: + cnss_pr_err("Invalid SBL log data"); +} + static int cnss_qca6174_powerup(struct cnss_pci_data *pci_priv) { int ret = 0; @@ -2095,8 +2250,10 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) msecs_to_jiffies(timeout) << 2); if (!ret) { cnss_pr_err("Timeout waiting for calibration to complete\n"); - if (!test_bit(CNSS_IN_REBOOT, &plat_priv->driver_state)) + if (!test_bit(CNSS_IN_REBOOT, &plat_priv->driver_state)) { + cnss_pci_dump_bl_sram_mem(pci_priv); CNSS_ASSERT(0); + } cal_info = kzalloc(sizeof(*cal_info), GFP_KERNEL); if (!cal_info) @@ -3752,21 +3909,6 @@ static void cnss_pci_dump_ce_reg(struct cnss_pci_data *pci_priv, } } -static void cnss_pci_dump_sram_mem(struct cnss_pci_data *pci_priv) -{ - int i; - u32 mem_addr, val; - - if (cnss_pci_check_link_status(pci_priv)) - return; - for (i = 0; i < CNSS_DEBUG_DUMP_SRAM_SIZE; i++) { - mem_addr = CNSS_DEBUG_DUMP_SRAM_START + i * 4; - if (cnss_pci_reg_read(pci_priv, mem_addr, &val)) - return; - cnss_pr_dbg("SRAM[0x%x] = 0x%x\n", mem_addr, val); - } -} - static void cnss_pci_dump_registers(struct cnss_pci_data *pci_priv) { cnss_pr_dbg("Start to dump debug registers\n"); @@ -3799,7 +3941,6 @@ int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv) cnss_auto_resume(&pci_priv->pci_dev->dev); cnss_pci_dump_misc_reg(pci_priv); cnss_pci_dump_shadow_reg(pci_priv); - cnss_pci_dump_sram_mem(pci_priv); ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_TRIGGER_RDDM); if (ret) { @@ -3950,7 +4091,7 @@ void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) cnss_pci_dump_misc_reg(pci_priv); cnss_pci_dump_qdss_reg(pci_priv); - cnss_pci_dump_sram_mem(pci_priv); + cnss_pci_dump_bl_sram_mem(pci_priv); ret = mhi_download_rddm_img(pci_priv->mhi_ctrl, in_panic); if (ret) { @@ -4254,6 +4395,13 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv, plat_priv->use_fw_path_with_prefix = false; cnss_pci_update_fw_name(pci_priv); return; + case MHI_CB_BOOTUP_TIMEOUT: + if (plat_priv->device_id == QCA6490_DEVICE_ID || + plat_priv->device_id == QCA6390_DEVICE_ID) { + cnss_pci_dump_bl_sram_mem(pci_priv); + cnss_pci_dump_mhi_reg(pci_priv); + } + break; default: cnss_pr_err("Unsupported MHI status cb reason: %d\n", reason); return; diff --git a/drivers/net/wireless/cnss2/reg.h b/drivers/net/wireless/cnss2/reg.h index 69f22eb62188..1c8c12e72a15 100644 --- a/drivers/net/wireless/cnss2/reg.h +++ b/drivers/net/wireless/cnss2/reg.h @@ -267,4 +267,27 @@ #define QCA6390_SYSPM_DBG_BUS_SEL_REG 0x1F82008 #define QCA6390_SYSPM_WCSSAON_SR_STATUS 0x1F8200C +#define QCA6490_DEBUG_PBL_LOG_SRAM_START 0x1403D58 +#define QCA6490_DEBUG_PBL_LOG_SRAM_MAX_SIZE 40 +#define QCA6490_V1_SBL_DATA_START 0x143b000 +#define QCA6490_V1_SBL_DATA_END (0x143b000 + 0x00011000) +#define QCA6490_V2_SBL_DATA_START 0x1435000 +#define QCA6490_V2_SBL_DATA_END (0x1435000 + 0x00011000) +#define QCA6490_DEBUG_SBL_LOG_SRAM_MAX_SIZE 48 +#define QCA6490_TCSR_PBL_LOGGING_REG 0x01B000F8 +#define QCA6490_PCIE_BHI_ERRDBG2_REG 0x01E0E238 +#define QCA6490_PCIE_BHI_ERRDBG3_REG 0x01E0E23C +#define QCA6490_PBL_WLAN_BOOT_CFG 0x01E22B34 +#define QCA6490_PBL_BOOTSTRAP_STATUS 0x01910008 + +#define QCA6390_DEBUG_PBL_LOG_SRAM_START 0x01403D58 +#define QCA6390_DEBUG_PBL_LOG_SRAM_MAX_SIZE 80 +#define QCA6390_V2_SBL_DATA_START 0x016c8580 +#define QCA6390_V2_SBL_DATA_END (0x016c8580 + 0x00011000) +#define QCA6390_DEBUG_SBL_LOG_SRAM_MAX_SIZE 44 +#define QCA6390_TCSR_PBL_LOGGING_REG 0x01B000F8 +#define QCA6390_PCIE_BHI_ERRDBG2_REG 0x01E0E238 +#define QCA6390_PCIE_BHI_ERRDBG3_REG 0x01E0E23C +#define QCA6390_PBL_WLAN_BOOT_CFG 0x01E22B34 +#define QCA6390_PBL_BOOTSTRAP_STATUS 0x01910008 #endif diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 53a224696907..44e3ecc57615 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -6201,6 +6201,7 @@ static void ipa3_load_ipa_fw(struct work_struct *work) if (result) { IPAERR("IPA FW loading process has failed result=%d\n", result); + ipa_assert(); return; } pr_info("IPA FW loaded successfully\n"); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index acc50865aa4e..33de4e4d1026 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -3940,8 +3940,9 @@ static int ipa3_assign_policy(struct ipa_sys_connect_params *in, * Dont enable ipa_status for APQ, since MDM IPA * has IPA >= 4.5 with DPLv3. */ - if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ && - ipa3_is_mhip_offload_enabled()) + if ((ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ && + ipa3_is_mhip_offload_enabled()) || + (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5)) sys->ep->status.status_en = false; else sys->ep->status.status_en = true; @@ -4996,10 +4997,12 @@ start_poll: int ipa3_rx_poll(u32 clnt_hdl, int weight) { struct ipa3_ep_context *ep; + struct ipa3_sys_context *wan_def_sys; int ret; int cnt = 0; int num = 0; int remain_aggr_weight; + int ipa_ep_idx; struct ipa_active_client_logging_info log; struct gsi_chan_xfer_notify notify[IPA_WAN_NAPI_MAX_FRAMES]; @@ -5011,6 +5014,13 @@ int ipa3_rx_poll(u32 clnt_hdl, int weight) return cnt; } + ipa_ep_idx = ipa3_get_ep_mapping(IPA_CLIENT_APPS_WAN_CONS); + if (ipa_ep_idx == IPA_EP_NOT_ALLOCATED) { + IPAERR("Invalid client.\n"); + return cnt; + } + + wan_def_sys = ipa3_ctx->ep[ipa_ep_idx].sys; remain_aggr_weight = weight / IPA_WAN_AGGR_PKT_CNT; if (remain_aggr_weight > IPA_WAN_NAPI_MAX_FRAMES) { @@ -5050,10 +5060,11 @@ start_poll: /* call repl_hdlr before napi_reschedule / napi_complete */ ep->sys->repl_hdlr(ep->sys); - /* When not able to replenish enough descriptors pipe wait - * until minimum number descripotrs to replish. + /* When not able to replenish enough descriptors, keep in polling + * mode, wait for napi-poll and replenish again. */ - if (cnt < weight && ep->sys->len > IPA_DEFAULT_SYS_YELLOW_WM) { + if (cnt < weight && ep->sys->len > IPA_DEFAULT_SYS_YELLOW_WM && + wan_def_sys->len > IPA_DEFAULT_SYS_YELLOW_WM) { napi_complete(ep->sys->napi_obj); IPA_STATS_INC_CNT(ep->sys->napi_comp_cnt); ret = ipa3_rx_switch_to_intr_mode(ep->sys); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.h b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.h index baf7b0186b7c..9a5c7eb0bb2a 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #ifndef _IPA_PM_H_ @@ -13,7 +13,7 @@ #define IPA_PM_MAX_EX_CL 64 #define IPA_PM_THRESHOLD_MAX 5 #define IPA_PM_EXCEPTION_MAX 5 -#define IPA_PM_DEFERRED_TIMEOUT 10 +#define IPA_PM_DEFERRED_TIMEOUT 100 /* * ipa_pm group names diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index cad2f4ad845f..b1fc78e17e8c 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -1428,6 +1428,7 @@ static void apps_ipa_packet_receive_notify(void *priv, IPAWANDBG_LOW("Rx packet was received"); skb->dev = IPA_NETDEV(); skb->protocol = htons(ETH_P_MAP); + skb_set_mac_header(skb, 0); if (ipa3_rmnet_res.ipa_napi_enable) { trace_rmnet_ipa_netif_rcv_skb3(dev->stats.rx_packets); diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 502576c4f54f..0c14c855784d 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -1005,11 +1005,17 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) if (!left_size) { spin_lock(&channel->recv_lock); if (channel->ept.cb) { - channel->ept.cb(channel->ept.rpdev, + ret = channel->ept.cb(channel->ept.rpdev, intent->data, intent->offset, channel->ept.priv, RPMSG_ADDR_ANY); + if (ret < 0) + CH_INFO(channel, + "glink:callback error ret = %d\n", ret); + } else { + CH_INFO(channel, "callback not present\n"); + dev_err(glink->dev, "glink:callback not present\n"); } spin_unlock(&channel->recv_lock); @@ -1349,13 +1355,14 @@ static struct rpmsg_endpoint *qcom_glink_create_ept(struct rpmsg_device *rpdev, if (ret) return NULL; } + CH_INFO(channel, "Initializing ept\n"); ept = &channel->ept; ept->rpdev = rpdev; ept->cb = cb; ept->priv = priv; ept->ops = &glink_endpoint_ops; - + CH_INFO(channel, "Initialized ept\n"); return ept; } @@ -1375,6 +1382,7 @@ static int qcom_glink_announce_create(struct rpmsg_device *rpdev) int iid; int size; + CH_INFO(channel, "Entered\n"); if (glink->intentless || !completion_done(&channel->open_ack)) return 0; @@ -1411,6 +1419,7 @@ static int qcom_glink_announce_create(struct rpmsg_device *rpdev) qcom_glink_advertise_intent(glink, channel, intent); } } + CH_INFO(channel, "Exit\n"); return 0; } diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c index 1b3dc0d0d847..23b7609503ae 100644 --- a/drivers/soc/qcom/icnss.c +++ b/drivers/soc/qcom/icnss.c @@ -54,6 +54,7 @@ #define ICNSS_SERVICE_LOCATION_CLIENT_NAME "ICNSS-WLAN" #define ICNSS_WLAN_SERVICE_NAME "wlan/fw" +#define ICNSS_CHAIN1_REGULATOR "vdd-3.3-ch1" #define ICNSS_THRESHOLD_HIGH 3600000 #define ICNSS_THRESHOLD_LOW 3450000 #define ICNSS_THRESHOLD_GUARD 20000 @@ -80,11 +81,11 @@ void *icnss_ipc_log_long_context; #define ICNSS_EVENT_SYNC_UNINTERRUPTIBLE (ICNSS_EVENT_UNINTERRUPTIBLE | \ ICNSS_EVENT_SYNC) static struct icnss_vreg_info icnss_vreg_info[] = { - {NULL, "vdd-cx-mx", 752000, 752000, 0, 0, false}, - {NULL, "vdd-1.8-xo", 1800000, 1800000, 0, 0, false}, - {NULL, "vdd-1.3-rfa", 1304000, 1304000, 0, 0, false}, - {NULL, "vdd-3.3-ch1", 3312000, 3312000, 0, 0, false}, - {NULL, "vdd-3.3-ch0", 3312000, 3312000, 0, 0, false}, + {NULL, "vdd-cx-mx", 752000, 752000, 0, 0, false, true}, + {NULL, "vdd-1.8-xo", 1800000, 1800000, 0, 0, false, true}, + {NULL, "vdd-1.3-rfa", 1304000, 1304000, 0, 0, false, true}, + {NULL, "vdd-3.3-ch1", 3312000, 3312000, 0, 0, false, true}, + {NULL, "vdd-3.3-ch0", 3312000, 3312000, 0, 0, false, true}, }; #define ICNSS_VREG_INFO_SIZE ARRAY_SIZE(icnss_vreg_info) @@ -258,9 +259,18 @@ static int icnss_vreg_on(struct icnss_priv *priv) for (i = 0; i < ICNSS_VREG_INFO_SIZE; i++) { vreg_info = &priv->vreg_info[i]; - if (!vreg_info->reg) + if (!vreg_info->reg || !vreg_info->is_supported) continue; + if (!priv->chain_reg_info_updated && + !strcmp(ICNSS_CHAIN1_REGULATOR, vreg_info->name)) { + priv->chain_reg_info_updated = true; + if (!priv->is_chain1_supported) { + vreg_info->is_supported = false; + continue; + } + } + if (vreg_info->min_v || vreg_info->max_v) { icnss_pr_vdbg("Set voltage for regulator %s\n", vreg_info->name); @@ -307,7 +317,7 @@ static int icnss_vreg_on(struct icnss_priv *priv) for (; i >= 0; i--) { vreg_info = &priv->vreg_info[i]; - if (!vreg_info->reg) + if (!vreg_info->reg || !vreg_info->is_supported) continue; regulator_disable(vreg_info->reg); @@ -332,7 +342,7 @@ static int icnss_vreg_off(struct icnss_priv *priv) for (i = ICNSS_VREG_INFO_SIZE - 1; i >= 0; i--) { vreg_info = &priv->vreg_info[i]; - if (!vreg_info->reg) + if (!vreg_info->reg || !vreg_info->is_supported) continue; icnss_pr_vdbg("Regulator %s being disabled\n", vreg_info->name); @@ -857,10 +867,6 @@ static int icnss_driver_event_server_arrive(void *data) set_bit(ICNSS_WLFW_CONNECTED, &penv->state); - ret = icnss_hw_power_on(penv); - if (ret) - goto clear_server; - ret = wlfw_ind_register_send_sync_msg(penv); if (ret < 0) { if (ret == -EALREADY) { @@ -868,33 +874,37 @@ static int icnss_driver_event_server_arrive(void *data) goto qmi_registered; } ignore_assert = true; - goto err_power_on; + goto clear_server; } if (!penv->msa_va) { icnss_pr_err("Invalid MSA address\n"); ret = -EINVAL; - goto err_power_on; + goto clear_server; } ret = wlfw_msa_mem_info_send_sync_msg(penv); if (ret < 0) { ignore_assert = true; - goto err_power_on; + goto clear_server; } ret = wlfw_msa_ready_send_sync_msg(penv); if (ret < 0) { ignore_assert = true; - goto err_power_on; + goto clear_server; } ret = wlfw_cap_send_sync_msg(penv); if (ret < 0) { ignore_assert = true; - goto err_power_on; + goto clear_server; } + ret = icnss_hw_power_on(penv); + if (ret) + goto clear_server; + wlfw_dynamic_feature_mask_send_sync_msg(penv, dynamic_feature_mask); @@ -909,8 +919,6 @@ static int icnss_driver_event_server_arrive(void *data) return ret; -err_power_on: - icnss_hw_power_off(penv); clear_server: icnss_clear_server(penv); fail: @@ -3451,6 +3459,7 @@ static int icnss_probe(struct platform_device *pdev) priv->pdev = pdev; priv->vreg_info = icnss_vreg_info; + priv->is_chain1_supported = true; icnss_allow_recursive_recovery(dev); diff --git a/drivers/soc/qcom/icnss_private.h b/drivers/soc/qcom/icnss_private.h index a8a761eec986..c36b4403b69c 100644 --- a/drivers/soc/qcom/icnss_private.h +++ b/drivers/soc/qcom/icnss_private.h @@ -173,6 +173,7 @@ struct icnss_vreg_info { u32 load_ua; unsigned long settle_delay; bool required; + bool is_supported; }; struct icnss_clk_info { @@ -355,6 +356,8 @@ struct icnss_priv { void __iomem *hang_event_data_va; uint16_t hang_event_data_len; void *hang_event_data; + bool is_chain1_supported; + bool chain_reg_info_updated; }; struct icnss_reg_info { diff --git a/drivers/soc/qcom/icnss_qmi.c b/drivers/soc/qcom/icnss_qmi.c index 1f73ae4420c1..aba4f769a509 100644 --- a/drivers/soc/qcom/icnss_qmi.c +++ b/drivers/soc/qcom/icnss_qmi.c @@ -408,6 +408,9 @@ int wlfw_cap_send_sync_msg(struct icnss_priv *priv) if (resp->fw_build_id_valid) strlcpy(priv->fw_build_id, resp->fw_build_id, QMI_WLFW_MAX_BUILD_ID_LEN_V01 + 1); + if (resp->rd_card_chain_cap_valid && + resp->rd_card_chain_cap == WLFW_RD_CARD_CHAIN_CAP_1x1_V01) + priv->is_chain1_supported = false; icnss_pr_dbg("Capability, chip_id: 0x%x, chip_family: 0x%x, board_id: 0x%x, soc_id: 0x%x, fw_version: 0x%x, fw_build_timestamp: %s, fw_build_id: %s", priv->chip_info.chip_id, priv->chip_info.chip_family, diff --git a/drivers/soc/qcom/qdss_bridge.c b/drivers/soc/qcom/qdss_bridge.c index 2edd9af7fd24..7a2af697696d 100644 --- a/drivers/soc/qcom/qdss_bridge.c +++ b/drivers/soc/qcom/qdss_bridge.c @@ -307,6 +307,21 @@ out: static DEVICE_ATTR_RW(mode); static DEVICE_ATTR_RO(curr_chan); +static struct attribute *qdss_bridge_attrs[] = { + &dev_attr_mode.attr, + &dev_attr_curr_chan.attr, + NULL, +}; + +static const struct attribute_group qdss_bridge_group = { + .attrs = qdss_bridge_attrs, +}; + +static const struct attribute_group *qdss_bridge_groups[] = { + &qdss_bridge_group, + NULL, +}; + static void mhi_read_work_fn(struct work_struct *work) { int err = 0; @@ -838,7 +853,6 @@ static void qdss_mhi_remove(struct mhi_device *mhi_dev) } else spin_unlock_bh(&drvdata->lock); - device_remove_file(drvdata->dev, &dev_attr_mode); device_destroy(mhi_class, drvdata->cdev.dev); cdev_del(&drvdata->cdev); unregister_chrdev_region(drvdata->cdev.dev, 1); @@ -937,27 +951,14 @@ static int qdss_mhi_probe(struct mhi_device *mhi_dev, mhi_device_set_devdata(mhi_dev, drvdata); dev_set_drvdata(drvdata->dev, drvdata); - ret = device_create_file(drvdata->dev, &dev_attr_mode); - if (ret) { - pr_err("mode sysfs node create failed error:%d\n", ret); - goto exit_destroy_device; - } - ret = device_create_file(drvdata->dev, &dev_attr_curr_chan); - if (ret) { - pr_err("curr_chan sysfs node create failed error:%d\n", ret); - goto exit_destroy_device; - } - ret = qdss_mhi_init(drvdata); if (ret) { pr_err("Device probe failed err:%d\n", ret); - goto remove_sysfs_exit; + goto exit_destroy_device; } queue_work(drvdata->mhi_wq, &drvdata->open_work); return 0; -remove_sysfs_exit: - device_remove_file(drvdata->dev, &dev_attr_mode); exit_destroy_device: device_destroy(mhi_class, drvdata->cdev.dev); exit_cdev_add: @@ -994,6 +995,8 @@ static int __init qdss_bridge_init(void) if (IS_ERR(mhi_class)) return -ENODEV; + mhi_class->dev_groups = qdss_bridge_groups; + ret = mhi_driver_register(&qdss_mhi_driver); if (ret) class_destroy(mhi_class); diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c index b8585d13838a..a9bec22f0708 100644 --- a/drivers/soc/qcom/smp2p.c +++ b/drivers/soc/qcom/smp2p.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2015, Sony Mobile Communications AB. - * Copyright (c) 2012-2013, 2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2013, 2018-2020 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 @@ -289,11 +289,7 @@ static void qcom_smp2p_notify_in(struct qcom_smp2p *smp2p) (!(val & BIT(i)) && test_bit(i, entry->irq_falling))) { irq_pin = irq_find_mapping(entry->domain, i); handle_nested_irq(irq_pin); - - if (test_bit(i, entry->irq_enabled)) - clear_bit(i, entry->irq_pending); - else - set_bit(i, entry->irq_pending); + clear_bit(i, entry->irq_pending); } } } @@ -392,11 +388,23 @@ static int smp2p_set_irq_type(struct irq_data *irqd, unsigned int type) return 0; } +static int smp2p_retrigger_irq(struct irq_data *irqd) +{ + struct smp2p_entry *entry = irq_data_get_irq_chip_data(irqd); + irq_hw_number_t irq = irqd_to_hwirq(irqd); + + SMP2P_INFO("%d: %s: %lu\n", entry->smp2p->remote_pid, entry->name, irq); + set_bit(irq, entry->irq_pending); + + return 0; +} + static struct irq_chip smp2p_irq_chip = { .name = "smp2p", .irq_mask = smp2p_mask_irq, .irq_unmask = smp2p_unmask_irq, .irq_set_type = smp2p_set_irq_type, + .irq_retrigger = smp2p_retrigger_irq, }; static int smp2p_irq_map(struct irq_domain *d, diff --git a/drivers/soc/qcom/wlan_firmware_service_v01.c b/drivers/soc/qcom/wlan_firmware_service_v01.c index cc5a812b398c..21e62ecae10a 100644 --- a/drivers/soc/qcom/wlan_firmware_service_v01.c +++ b/drivers/soc/qcom/wlan_firmware_service_v01.c @@ -1432,6 +1432,24 @@ struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[] = { .array_type = NO_ARRAY, .tlv_type = 0x1A, .offset = offsetof(struct wlfw_cap_resp_msg_v01, + fw_caps_valid), + }, + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, + .elem_size = sizeof(u64), + .array_type = NO_ARRAY, + .tlv_type = 0x1A, + .offset = offsetof(struct wlfw_cap_resp_msg_v01, + fw_caps), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1B, + .offset = offsetof(struct wlfw_cap_resp_msg_v01, rd_card_chain_cap_valid), }, { @@ -1439,7 +1457,7 @@ struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[] = { .elem_len = 1, .elem_size = sizeof(enum wlfw_rd_card_chain_cap_v01), .array_type = NO_ARRAY, - .tlv_type = 0x1A, + .tlv_type = 0x1B, .offset = offsetof(struct wlfw_cap_resp_msg_v01, rd_card_chain_cap), }, @@ -1597,6 +1615,26 @@ struct qmi_elem_info wlfw_bdf_download_resp_msg_v01_ei[] = { .ei_array = qmi_response_type_v01_ei, }, { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof(struct + wlfw_bdf_download_resp_msg_v01, + host_bdf_data_valid), + }, + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, + .elem_size = sizeof(u64), + .array_type = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof(struct + wlfw_bdf_download_resp_msg_v01, + host_bdf_data), + }, + { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, @@ -4486,3 +4524,40 @@ struct qmi_elem_info wlfw_qdss_mem_ready_ind_msg_v01_ei[] = { }, }; +struct qmi_elem_info wlfw_pcie_gen_switch_req_msg_v01_ei[] = { + { + .data_type = QMI_SIGNED_4_BYTE_ENUM, + .elem_len = 1, + .elem_size = sizeof(enum wlfw_pcie_gen_speed_v01), + .array_type = NO_ARRAY, + .tlv_type = 0x01, + .offset = offsetof(struct + wlfw_pcie_gen_switch_req_msg_v01, + pcie_speed), + }, + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, + .tlv_type = QMI_COMMON_TLV_TYPE, + }, +}; + +struct qmi_elem_info wlfw_pcie_gen_switch_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct qmi_response_type_v01), + .array_type = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof(struct + wlfw_pcie_gen_switch_resp_msg_v01, + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type = QMI_EOTI, + .array_type = NO_ARRAY, + .tlv_type = QMI_COMMON_TLV_TYPE, + }, +}; + diff --git a/drivers/soc/qcom/wlan_firmware_service_v01.h b/drivers/soc/qcom/wlan_firmware_service_v01.h index 992766075f82..f9a1f68b8deb 100644 --- a/drivers/soc/qcom/wlan_firmware_service_v01.h +++ b/drivers/soc/qcom/wlan_firmware_service_v01.h @@ -9,90 +9,92 @@ #define WLFW_SERVICE_ID_V01 0x45 #define WLFW_SERVICE_VERS_V01 0x01 -#define QMI_WLFW_WFC_CALL_STATUS_REQ_V01 0x0049 -#define QMI_WLFW_DEVICE_INFO_RESP_V01 0x004C -#define QMI_WLFW_BDF_DOWNLOAD_REQ_V01 0x0025 -#define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037 -#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_REQ_V01 0x0044 -#define QMI_WLFW_GET_INFO_REQ_V01 0x004A -#define QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01 0x002A -#define QMI_WLFW_CAL_DONE_IND_V01 0x003E -#define QMI_WLFW_M3_DUMP_UPLOAD_REQ_IND_V01 0x004D -#define QMI_WLFW_WFC_CALL_STATUS_RESP_V01 0x0049 -#define QMI_WLFW_HOST_CAP_REQ_V01 0x0034 -#define QMI_WLFW_QDSS_MEM_READY_IND_V01 0x0052 -#define QMI_WLFW_DYNAMIC_FEATURE_MASK_RESP_V01 0x003B -#define QMI_WLFW_M3_INFO_REQ_V01 0x003C +#define QMI_WLFW_CAL_UPDATE_REQ_V01 0x0029 #define QMI_WLFW_CAP_REQ_V01 0x0024 -#define QMI_WLFW_FW_INIT_DONE_IND_V01 0x0038 -#define QMI_WLFW_ANTENNA_GRANT_RESP_V01 0x0048 #define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026 -#define QMI_WLFW_RESPOND_GET_INFO_IND_V01 0x004B #define QMI_WLFW_M3_INFO_RESP_V01 0x003C +#define QMI_WLFW_CAL_REPORT_RESP_V01 0x0026 +#define QMI_WLFW_MAC_ADDR_RESP_V01 0x0033 +#define QMI_WLFW_DYNAMIC_FEATURE_MASK_RESP_V01 0x003B +#define QMI_WLFW_IND_REGISTER_REQ_V01 0x0020 +#define QMI_WLFW_DYNAMIC_FEATURE_MASK_REQ_V01 0x003B +#define QMI_WLFW_QDSS_TRACE_MODE_RESP_V01 0x0045 +#define QMI_WLFW_FW_READY_IND_V01 0x0021 +#define QMI_WLFW_QDSS_TRACE_MEM_INFO_RESP_V01 0x0040 +#define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035 +#define QMI_WLFW_QDSS_TRACE_DATA_RESP_V01 0x0042 +#define QMI_WLFW_RESPOND_MEM_RESP_V01 0x0036 +#define QMI_WLFW_VBATT_RESP_V01 0x0032 +#define QMI_WLFW_QDSS_TRACE_MODE_REQ_V01 0x0045 +#define QMI_WLFW_CAL_DOWNLOAD_REQ_V01 0x0027 +#define QMI_WLFW_IND_REGISTER_RESP_V01 0x0020 #define QMI_WLFW_CAL_UPDATE_RESP_V01 0x0029 +#define QMI_WLFW_M3_INFO_REQ_V01 0x003C +#define QMI_WLFW_PCIE_GEN_SWITCH_REQ_V01 0x0053 +#define QMI_WLFW_ANTENNA_GRANT_RESP_V01 0x0048 +#define QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01 0x002A +#define QMI_WLFW_RESPOND_MEM_REQ_V01 0x0036 +#define QMI_WLFW_HOST_CAP_RESP_V01 0x0034 +#define QMI_WLFW_MSA_READY_IND_V01 0x002B +#define QMI_WLFW_WLAN_MODE_REQ_V01 0x0022 +#define QMI_WLFW_WLAN_CFG_RESP_V01 0x0023 +#define QMI_WLFW_EXIT_POWER_SAVE_RESP_V01 0x0050 +#define QMI_WLFW_REJUVENATE_IND_V01 0x0039 +#define QMI_WLFW_ATHDIAG_WRITE_REQ_V01 0x0031 +#define QMI_WLFW_SOC_WAKE_REQ_V01 0x004F +#define QMI_WLFW_PIN_CONNECT_RESULT_IND_V01 0x002C #define QMI_WLFW_M3_DUMP_UPLOAD_DONE_RESP_V01 0x004E +#define QMI_WLFW_QDSS_TRACE_SAVE_IND_V01 0x0041 +#define QMI_WLFW_BDF_DOWNLOAD_RESP_V01 0x0025 +#define QMI_WLFW_REJUVENATE_ACK_RESP_V01 0x003A +#define QMI_WLFW_MSA_INFO_RESP_V01 0x002D +#define QMI_WLFW_SHUTDOWN_REQ_V01 0x0043 +#define QMI_WLFW_VBATT_REQ_V01 0x0032 +#define QMI_WLFW_MAC_ADDR_REQ_V01 0x0033 +#define QMI_WLFW_WLAN_CFG_REQ_V01 0x0023 +#define QMI_WLFW_ANTENNA_GRANT_REQ_V01 0x0048 +#define QMI_WLFW_BDF_DOWNLOAD_REQ_V01 0x0025 +#define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037 +#define QMI_WLFW_RESPOND_GET_INFO_IND_V01 0x004B +#define QMI_WLFW_QDSS_TRACE_DATA_REQ_V01 0x0042 #define QMI_WLFW_CAL_DOWNLOAD_RESP_V01 0x0027 -#define QMI_WLFW_XO_CAL_IND_V01 0x003D #define QMI_WLFW_INI_RESP_V01 0x002F -#define QMI_WLFW_CAL_REPORT_RESP_V01 0x0026 #define QMI_WLFW_QDSS_TRACE_MEM_INFO_REQ_V01 0x0040 #define QMI_WLFW_ANTENNA_SWITCH_REQ_V01 0x0047 #define QMI_WLFW_QDSS_TRACE_REQ_MEM_IND_V01 0x003F -#define QMI_WLFW_SHUTDOWN_RESP_V01 0x0043 -#define QMI_WLFW_MAC_ADDR_RESP_V01 0x0033 #define QMI_WLFW_INITIATE_CAL_DOWNLOAD_IND_V01 0x0028 -#define QMI_WLFW_HOST_CAP_RESP_V01 0x0034 -#define QMI_WLFW_MSA_READY_IND_V01 0x002B #define QMI_WLFW_ATHDIAG_WRITE_RESP_V01 0x0031 #define QMI_WLFW_EXIT_POWER_SAVE_REQ_V01 0x0050 -#define QMI_WLFW_WLAN_MODE_REQ_V01 0x0022 -#define QMI_WLFW_IND_REGISTER_REQ_V01 0x0020 -#define QMI_WLFW_WLAN_CFG_RESP_V01 0x0023 -#define QMI_WLFW_QDSS_TRACE_MODE_REQ_V01 0x0045 -#define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035 #define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_RESP_V01 0x0044 #define QMI_WLFW_SOC_WAKE_RESP_V01 0x004F -#define QMI_WLFW_REJUVENATE_IND_V01 0x0039 -#define QMI_WLFW_DYNAMIC_FEATURE_MASK_REQ_V01 0x003B -#define QMI_WLFW_ATHDIAG_WRITE_REQ_V01 0x0031 -#define QMI_WLFW_WLAN_MODE_RESP_V01 0x0022 -#define QMI_WLFW_RESPOND_MEM_REQ_V01 0x0036 #define QMI_WLFW_GET_INFO_RESP_V01 0x004A -#define QMI_WLFW_QDSS_TRACE_MODE_RESP_V01 0x0045 -#define QMI_WLFW_PIN_CONNECT_RESULT_IND_V01 0x002C -#define QMI_WLFW_FW_READY_IND_V01 0x0021 -#define QMI_WLFW_QDSS_TRACE_SAVE_IND_V01 0x0041 -#define QMI_WLFW_QDSS_TRACE_MEM_INFO_RESP_V01 0x0040 -#define QMI_WLFW_ANTENNA_GRANT_REQ_V01 0x0048 -#define QMI_WLFW_MSA_READY_RESP_V01 0x002E -#define QMI_WLFW_QDSS_TRACE_DATA_REQ_V01 0x0042 -#define QMI_WLFW_CAL_UPDATE_REQ_V01 0x0029 +#define QMI_WLFW_PCIE_GEN_SWITCH_RESP_V01 0x0053 #define QMI_WLFW_INI_REQ_V01 0x002F -#define QMI_WLFW_BDF_DOWNLOAD_RESP_V01 0x0025 -#define QMI_WLFW_REJUVENATE_ACK_RESP_V01 0x003A -#define QMI_WLFW_MSA_INFO_RESP_V01 0x002D #define QMI_WLFW_MSA_READY_REQ_V01 0x002E -#define QMI_WLFW_QDSS_TRACE_DATA_RESP_V01 0x0042 #define QMI_WLFW_M3_DUMP_UPLOAD_DONE_REQ_V01 0x004E #define QMI_WLFW_CAP_RESP_V01 0x0024 -#define QMI_WLFW_SOC_WAKE_REQ_V01 0x004F #define QMI_WLFW_REJUVENATE_ACK_REQ_V01 0x003A #define QMI_WLFW_ATHDIAG_READ_RESP_V01 0x0030 -#define QMI_WLFW_SHUTDOWN_REQ_V01 0x0043 -#define QMI_WLFW_VBATT_REQ_V01 0x0032 #define QMI_WLFW_ANTENNA_SWITCH_RESP_V01 0x0047 #define QMI_WLFW_DEVICE_INFO_REQ_V01 0x004C -#define QMI_WLFW_MAC_ADDR_REQ_V01 0x0033 -#define QMI_WLFW_EXIT_POWER_SAVE_RESP_V01 0x0050 -#define QMI_WLFW_RESPOND_MEM_RESP_V01 0x0036 -#define QMI_WLFW_WFC_CALL_TWT_CONFIG_IND_V01 0x0051 -#define QMI_WLFW_VBATT_RESP_V01 0x0032 #define QMI_WLFW_MSA_INFO_REQ_V01 0x002D -#define QMI_WLFW_QDSS_TRACE_FREE_IND_V01 0x0046 -#define QMI_WLFW_CAL_DOWNLOAD_REQ_V01 0x0027 +#define QMI_WLFW_HOST_CAP_REQ_V01 0x0034 +#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_REQ_V01 0x0044 +#define QMI_WLFW_GET_INFO_REQ_V01 0x004A +#define QMI_WLFW_CAL_DONE_IND_V01 0x003E +#define QMI_WLFW_M3_DUMP_UPLOAD_REQ_IND_V01 0x004D +#define QMI_WLFW_WFC_CALL_STATUS_RESP_V01 0x0049 +#define QMI_WLFW_FW_INIT_DONE_IND_V01 0x0038 +#define QMI_WLFW_XO_CAL_IND_V01 0x003D +#define QMI_WLFW_SHUTDOWN_RESP_V01 0x0043 #define QMI_WLFW_ATHDIAG_READ_REQ_V01 0x0030 -#define QMI_WLFW_WLAN_CFG_REQ_V01 0x0023 -#define QMI_WLFW_IND_REGISTER_RESP_V01 0x0020 +#define QMI_WLFW_WFC_CALL_TWT_CONFIG_IND_V01 0x0051 +#define QMI_WLFW_WLAN_MODE_RESP_V01 0x0022 +#define QMI_WLFW_WFC_CALL_STATUS_REQ_V01 0x0049 +#define QMI_WLFW_DEVICE_INFO_RESP_V01 0x004C +#define QMI_WLFW_MSA_READY_RESP_V01 0x002E +#define QMI_WLFW_QDSS_TRACE_FREE_IND_V01 0x0046 +#define QMI_WLFW_QDSS_MEM_READY_IND_V01 0x0052 #define QMI_WLFW_MAX_NUM_MEMORY_REGIONS_V01 2 #define QMI_WLFW_MAX_NUM_MEM_SEG_V01 32 @@ -207,6 +209,15 @@ enum wlfw_rd_card_chain_cap_v01 { WLFW_RD_CARD_CHAIN_CAP_MAX_VAL_V01 = INT_MAX, }; +enum wlfw_pcie_gen_speed_v01 { + WLFW_PCIE_GEN_SPEED_MIN_VAL_V01 = INT_MIN, + QMI_PCIE_GEN_SPEED_INVALID_V01 = 0, + QMI_PCIE_GEN_SPEED_1_V01 = 1, + QMI_PCIE_GEN_SPEED_2_V01 = 2, + QMI_PCIE_GEN_SPEED_3_V01 = 3, + WLFW_PCIE_GEN_SPEED_MAX_VAL_V01 = INT_MAX, +}; + #define QMI_WLFW_CE_ATTR_FLAGS_V01 ((u32)0x00) #define QMI_WLFW_CE_ATTR_NO_SNOOP_V01 ((u32)0x01) #define QMI_WLFW_CE_ATTR_BYTE_SWAP_DATA_V01 ((u32)0x02) @@ -222,6 +233,11 @@ enum wlfw_rd_card_chain_cap_v01 { #define QMI_WLFW_FW_REJUVENATE_V01 ((u64)0x01ULL) +#define QMI_WLFW_HW_XPA_V01 ((u64)0x01ULL) +#define QMI_WLFW_CBC_FILE_DOWNLOAD_V01 ((u64)0x02ULL) + +#define QMI_WLFW_HOST_PCIE_GEN_SWITCH_V01 ((u64)0x01ULL) + struct wlfw_ce_tgt_pipe_cfg_s_v01 { u32 pipe_num; enum wlfw_pipedir_enum_v01 pipe_dir; @@ -455,10 +471,12 @@ struct wlfw_cap_resp_msg_v01 { u32 otp_version; u8 eeprom_caldata_read_timeout_valid; u32 eeprom_caldata_read_timeout; + u8 fw_caps_valid; + u64 fw_caps; u8 rd_card_chain_cap_valid; enum wlfw_rd_card_chain_cap_v01 rd_card_chain_cap; }; -#define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 242 +#define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 253 extern struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[]; struct wlfw_bdf_download_req_msg_v01 { @@ -482,8 +500,10 @@ extern struct qmi_elem_info wlfw_bdf_download_req_msg_v01_ei[]; struct wlfw_bdf_download_resp_msg_v01 { struct qmi_response_type_v01 resp; + u8 host_bdf_data_valid; + u64 host_bdf_data; }; -#define WLFW_BDF_DOWNLOAD_RESP_MSG_V01_MAX_MSG_LEN 7 +#define WLFW_BDF_DOWNLOAD_RESP_MSG_V01_MAX_MSG_LEN 18 extern struct qmi_elem_info wlfw_bdf_download_resp_msg_v01_ei[]; struct wlfw_cal_report_req_msg_v01 { @@ -1092,4 +1112,16 @@ struct wlfw_qdss_mem_ready_ind_msg_v01 { #define WLFW_QDSS_MEM_READY_IND_MSG_V01_MAX_MSG_LEN 0 extern struct qmi_elem_info wlfw_qdss_mem_ready_ind_msg_v01_ei[]; +struct wlfw_pcie_gen_switch_req_msg_v01 { + enum wlfw_pcie_gen_speed_v01 pcie_speed; +}; +#define WLFW_PCIE_GEN_SWITCH_REQ_MSG_V01_MAX_MSG_LEN 7 +extern struct qmi_elem_info wlfw_pcie_gen_switch_req_msg_v01_ei[]; + +struct wlfw_pcie_gen_switch_resp_msg_v01 { + struct qmi_response_type_v01 resp; +}; +#define WLFW_PCIE_GEN_SWITCH_RESP_MSG_V01_MAX_MSG_LEN 7 +extern struct qmi_elem_info wlfw_pcie_gen_switch_resp_msg_v01_ei[]; + #endif diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c index 6692263ae9d4..07757eabcd43 100644 --- a/drivers/usb/pd/policy_engine.c +++ b/drivers/usb/pd/policy_engine.c @@ -3484,6 +3484,7 @@ static void handle_disconnect(struct usbpd *pd) pd->forced_pr = POWER_SUPPLY_TYPEC_PR_NONE; pd->current_state = PE_UNKNOWN; + pd_reset_protocol(pd); kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE); typec_unregister_partner(pd->partner); diff --git a/include/linux/sched.h b/include/linux/sched.h index 264274a37916..f36586669cf7 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -130,6 +130,7 @@ enum fps { FPS60 = 60, FPS90 = 90, FPS120 = 120, + FPS144 = 144, }; #ifdef CONFIG_DEBUG_ATOMIC_SLEEP diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index b335ad2a27f9..ba1fc3335b6d 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -31,6 +31,7 @@ extern unsigned int sysctl_sched_sync_hint_enable; extern unsigned int sysctl_sched_cstate_aware; extern unsigned int sysctl_sched_wakeup_granularity; extern unsigned int sysctl_sched_child_runs_first; +extern unsigned int sysctl_sched_force_lb_enable; #ifdef CONFIG_SCHED_WALT extern unsigned int sysctl_sched_capacity_margin_up[MAX_MARGIN_LEVELS]; extern unsigned int sysctl_sched_capacity_margin_down[MAX_MARGIN_LEVELS]; diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 8f98203d78dc..45884f14600c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -180,6 +180,7 @@ unsigned int sysctl_walt_rtg_cfs_boost_prio = 99; /* disabled by default */ unsigned int sysctl_walt_low_latency_task_boost; /* disabled by default */ #endif unsigned int sched_small_task_threshold = 102; +__read_mostly unsigned int sysctl_sched_force_lb_enable = 1; static inline void update_load_add(struct load_weight *lw, unsigned long inc) { @@ -11761,6 +11762,7 @@ static int idle_balance(struct rq *this_rq, struct rq_flags *rf) bool prefer_spread = prefer_spread_on_idle(this_cpu); bool force_lb = (!is_min_capacity_cpu(this_cpu) && silver_has_big_tasks() && + sysctl_sched_force_lb_enable && (atomic_read(&this_rq->nr_iowait) == 0)); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 21ab70812d01..f6148ce0fa9d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -588,6 +588,15 @@ static struct ctl_table kern_table[] = { .extra2 = &one, }, #endif + { + .procname = "sched_force_lb_enable", + .data = &sysctl_sched_force_lb_enable, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &zero, + .extra2 = &one, + }, #ifdef CONFIG_SCHED_DEBUG { .procname = "sched_cstate_aware", diff --git a/net/qrtr/smd.c b/net/qrtr/smd.c index fff972011fb1..aec36db4e4ef 100644 --- a/net/qrtr/smd.c +++ b/net/qrtr/smd.c @@ -23,8 +23,10 @@ static int qcom_smd_qrtr_callback(struct rpmsg_device *rpdev, struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev); int rc; - if (!qdev) + if (!qdev) { + pr_err("%d:Not ready\n", __func__); return -EAGAIN; + } rc = qrtr_endpoint_post(&qdev->ep, data, len); if (rc == -EINVAL) { @@ -62,6 +64,7 @@ static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) u32 net_id; bool rt; int rc; + pr_err("%d:Entered\n", __func__); qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL); if (!qdev) @@ -83,7 +86,8 @@ static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) dev_set_drvdata(&rpdev->dev, qdev); - dev_dbg(&rpdev->dev, "Qualcomm SMD QRTR driver probed\n"); + pr_err("%d:SMD QRTR driver probed\n", __func__); + dev_dbg(&rpdev->dev, "SMD QRTR driver probed\n"); return 0; } diff --git a/net/socket.c b/net/socket.c index 7a0ddf86620f..7d872ad31fb8 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1496,9 +1496,10 @@ int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) (struct sockaddr *) &address, addrlen); } - fput_light(sock->file, fput_needed); if (!err) sockev_notify(SOCKEV_BIND, sock); + + fput_light(sock->file, fput_needed); } return err; } @@ -1530,9 +1531,10 @@ int __sys_listen(int fd, int backlog) if (!err) err = sock->ops->listen(sock, backlog); - fput_light(sock->file, fput_needed); if (!err) sockev_notify(SOCKEV_LISTEN, sock); + + fput_light(sock->file, fput_needed); } return err; } diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 5e82ea170dac..6dde7a46f45f 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -5377,7 +5377,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) params.he_6ghz_capa = - nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); + nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); /* Include parameters for TDLS peer (will check later) */ err = nl80211_set_station_tdls(info, ¶ms); diff --git a/net/wireless/util.c b/net/wireless/util.c index 9a99dbe9b422..8a42769f1c91 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -117,11 +117,13 @@ int ieee80211_freq_khz_to_channel(u32 freq) return (freq - 2407) / 5; else if (freq >= 4910 && freq <= 4980) return (freq - 4000) / 5; - else if (freq < 5940) + else if (freq < 5925) return (freq - 5000) / 5; + else if (freq == 5935) + return 2; else if (freq <= 45000) /* DMG band lower limit */ - /* see 802.11ax D4.1 27.3.22.2 */ - return (freq - 5940) / 5; + /* see 802.11ax D6.1 27.3.23.2 */ + return (freq - 5950) / 5; else if (freq >= 58320 && freq <= 70200) return (freq - 56160) / 2160; else |