aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2020-09-24 03:59:59 -0700
committerLinux Build Service Account <lnxbuild@localhost>2020-09-24 03:59:59 -0700
commite3a29a89106bde5518688dba77e9e333fec411d7 (patch)
tree068674f8ba8bec471df4ee392def4ce6630dd3f3
parent8f42144c507b6a95ba1f2a2504a90a0038b82fd3 (diff)
parentc56c416a37fa86ec9eef976a87d04287a3238a76 (diff)
Merge c56c416a37fa86ec9eef976a87d04287a3238a76 on remote branchLA.UM.8.13.r1-10300-SAIPAN.0
Change-Id: Ib8f7db66d288a99e05ef295826a225202ef25e3b
-rw-r--r--drivers/media/platform/msm/cvp/msm_cvp_core.c27
-rw-r--r--drivers/net/wireless/cnss2/pci.c184
-rw-r--r--drivers/net/wireless/cnss2/reg.h23
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa.c1
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_dp.c21
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_pm.h4
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c1
-rw-r--r--drivers/rpmsg/qcom_glink_native.c13
-rw-r--r--drivers/soc/qcom/icnss.c47
-rw-r--r--drivers/soc/qcom/icnss_private.h3
-rw-r--r--drivers/soc/qcom/icnss_qmi.c3
-rw-r--r--drivers/soc/qcom/qdss_bridge.c33
-rw-r--r--drivers/soc/qcom/smp2p.c20
-rw-r--r--drivers/soc/qcom/wlan_firmware_service_v01.c77
-rw-r--r--drivers/soc/qcom/wlan_firmware_service_v01.h152
-rw-r--r--drivers/usb/pd/policy_engine.c1
-rw-r--r--include/linux/sched.h1
-rw-r--r--include/linux/sched/sysctl.h1
-rw-r--r--kernel/sched/fair.c2
-rw-r--r--kernel/sysctl.c9
-rw-r--r--net/qrtr/smd.c8
-rw-r--r--net/socket.c6
-rw-r--r--net/wireless/nl80211.c2
-rw-r--r--net/wireless/util.c8
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, &params);
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