diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 07c2d2f61964..7d6b5802dfb0 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -6025,6 +6025,13 @@ static int ipa3_panic_notifier(struct notifier_block *this, int res; struct ipa_active_client_logging_info log_info; + if (ipa3_ctx != NULL) + { + if (ipa3_ctx->is_device_crashed) + return NOTIFY_DONE; + ipa3_ctx->is_device_crashed = true; + } + ipa3_freeze_clock_vote_and_notify_modem(); IPADBG("Calling uC panic handler\n"); @@ -7126,6 +7133,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, ipa3_ctx->gsi_ch20_wa = resource_p->gsi_ch20_wa; ipa3_ctx->wdi_over_pcie = resource_p->wdi_over_pcie; ipa3_ctx->ipa3_active_clients_logging.log_rdy = false; + ipa3_ctx->is_device_crashed = false; ipa3_ctx->mhi_evid_limits[0] = resource_p->mhi_evid_limits[0]; ipa3_ctx->mhi_evid_limits[1] = resource_p->mhi_evid_limits[1]; ipa3_ctx->entire_ipa_block_size = resource_p->entire_ipa_block_size; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c index 4aeab4968f2a..f71b4346b186 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c @@ -1078,7 +1078,7 @@ static int __ipa_del_flt_rule(u32 rule_hdl) list_del(&entry->link); entry->tbl->rule_cnt--; - if (entry->rt_tbl) + if (entry->rt_tbl && !ipa3_check_idr_if_freed(entry->rt_tbl)) entry->rt_tbl->ref_cnt--; IPADBG("del flt rule rule_cnt=%d rule_id=%d\n", entry->tbl->rule_cnt, entry->rule_id); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c index 4fd5ccc7604a..3ae0f9976cf8 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c @@ -1533,6 +1533,9 @@ int ipa_drop_stats_init(void) /* Always enable drop stats for USB DPL Pipe. */ pipe_bitmask |= IPA_CLIENT_BIT_32(IPA_CLIENT_USB_DPL_CONS); + /* Always enable drop stats for ODL DPL Pipe. */ + pipe_bitmask |= IPA_CLIENT_BIT_32(IPA_CLIENT_ODL_DPL_CONS); + /* Currently we have option to enable drop stats using debugfs. * To enable drop stats for a different pipe, first user needs * to query drop stats to get the current stats and enable. diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 2bc0d82040b3..a6a742fee493 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -2154,6 +2154,7 @@ struct ipa3_context { bool is_bw_monitor_supported; bool modem_load_ipa_fw; bool fnr_stats_not_supported; + bool is_device_crashed; }; struct ipa3_plat_drv_res { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index e011fdcae27a..ae02f21d11de 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -893,7 +893,10 @@ int ipa3_qmi_add_offload_request_send( } /* check if the filter rules from IPACM is valid */ - if (req->filter_spec_ex2_list_len == 0) { + if (req->filter_spec_ex2_list_len < 0) { + IPAWANERR("IPACM pass invalid num of rules\n"); + return -EINVAL; + } else if (req->filter_spec_ex2_list_len == 0) { IPAWANDBG("IPACM pass zero rules to Q6\n"); } else { IPAWANDBG("IPACM pass %u rules to Q6\n", @@ -901,9 +904,10 @@ int ipa3_qmi_add_offload_request_send( } /* currently set total max to 64 */ - if (req->filter_spec_ex2_list_len + - ipa3_qmi_ctx->num_ipa_offload_connection - >= QMI_IPA_MAX_FILTERS_V01) { + if ((ipa3_qmi_ctx->num_ipa_offload_connection < 0) || + (req->filter_spec_ex2_list_len >= + (QMI_IPA_MAX_FILTERS_V01 - + ipa3_qmi_ctx->num_ipa_offload_connection))) { IPAWANDBG( "cur(%d), req(%d), exceed limit (%d)\n", ipa3_qmi_ctx->num_ipa_offload_connection, diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 4d00cf315deb..47fd1fbb0802 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -8784,6 +8784,8 @@ void ipa3_force_close_coal(void) int ipa3_suspend_apps_pipes(bool suspend) { int res; + struct ipa_ep_cfg_holb holb_cfg; + int odl_ep_idx; /* As per HPG first need start/stop coalescing channel * then default one. Coalescing client number was greater then @@ -8805,6 +8807,24 @@ int ipa3_suspend_apps_pipes(bool suspend) if (res == -EAGAIN) goto undo_odl_cons; + odl_ep_idx = ipa3_get_ep_mapping(IPA_CLIENT_ODL_DPL_CONS); + if (odl_ep_idx != IPA_EP_NOT_ALLOCATED && ipa3_ctx->ep[odl_ep_idx].valid) { + memset(&holb_cfg, 0, sizeof(holb_cfg)); + if (suspend) + holb_cfg.en = 0; + else + holb_cfg.en = 1; + + ipahal_write_reg_n_fields(IPA_ENDP_INIT_HOL_BLOCK_EN_n, + odl_ep_idx, &holb_cfg); + /* IPA4.5 issue requires HOLB_EN to be written twice */ + if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 && holb_cfg.en) + ipahal_write_reg_n_fields( + IPA_ENDP_INIT_HOL_BLOCK_EN_n, + odl_ep_idx, &holb_cfg); + + } + res = _ipa_suspend_resume_pipe(IPA_CLIENT_APPS_WAN_LOW_LAT_CONS, suspend); if (res == -EAGAIN) diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index 358472ac9480..07c9fc828d24 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2237,16 +2237,14 @@ static int rmnet_ipa_send_coalesce_notification(uint8_t qmap_id, if (!coalesce_info) return -ENOMEM; - if (enable) { - coalesce_info->qmap_id = qmap_id; - coalesce_info->tcp_enable = tcp; - coalesce_info->udp_enable = udp; + coalesce_info->qmap_id = qmap_id; + coalesce_info->tcp_enable = tcp; + coalesce_info->udp_enable = udp; + msg_meta.msg_len = sizeof(struct ipa_coalesce_info); + if (enable) msg_meta.msg_type = IPA_COALESCE_ENABLE; - msg_meta.msg_len = sizeof(struct ipa_coalesce_info); - } else { + else msg_meta.msg_type = IPA_COALESCE_DISABLE; - msg_meta.msg_len = sizeof(struct ipa_coalesce_info); - } rc = ipa_send_msg(&msg_meta, coalesce_info, ipa3_wwan_msg_free_cb); if (rc) { IPAWANERR("ipa_send_msg failed: %d\n", rc);