msm: ipa3: Fix to map the npn phy address only once

Ethenet driver npn phy address was same for UL/DL
pipes, currently this address was mapped twice.
Added changes to map the map npn phy address only
once.

Change-Id: Icd713943326aad38ecf8e080a73d1d6bb8f641d2
Signed-off-by: Ashok Vuyyuru <avuyyuru@codeaurora.org>
This commit is contained in:
Ashok Vuyyuru 2020-06-16 17:42:38 +05:30 committed by Gerrit - the friendly Code Review server
parent 08220bfd1c
commit 465494eea8
2 changed files with 29 additions and 22 deletions

View File

@ -592,6 +592,10 @@ int ipa_uc_offload_conn_pipes(struct ipa_uc_offload_conn_in_params *inp,
return -EPERM;
}
/*Store the connection info, required during disconnect pipe */
memcpy(&offload_ctx->conn, &inp->u.ntn,
sizeof(struct ipa_ntn_conn_in_params));
switch (offload_ctx->proto) {
case IPA_UC_NTN:
ret = ipa_uc_ntn_conn_pipes(&inp->u.ntn, &outp->u.ntn,

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2016-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
@ -263,7 +263,7 @@ static int ipa3_uc_send_ntn_setup_pipe_cmd(
}
static int ipa3_smmu_map_uc_ntn_pipes(struct ipa_ntn_setup_info *params,
bool map)
bool map, bool map_unmap_once)
{
struct iommu_domain *smmu_domain;
int result;
@ -279,14 +279,16 @@ static int ipa3_smmu_map_uc_ntn_pipes(struct ipa_ntn_setup_info *params,
return -EINVAL;
}
result = ipa3_smmu_map_peer_reg(rounddown(params->ntn_reg_base_ptr_pa,
PAGE_SIZE), map, IPA_SMMU_CB_UC);
if (result) {
IPAERR("failed to %s uC regs %d\n",
map ? "map" : "unmap", result);
goto fail;
if (map_unmap_once) {
result = ipa3_smmu_map_peer_reg(rounddown(
params->ntn_reg_base_ptr_pa, PAGE_SIZE),
map, IPA_SMMU_CB_UC);
if (result) {
IPAERR("failed to %s uC regs %d\n",
map ? "map" : "unmap", result);
goto fail;
}
}
if (params->smmu_enabled) {
IPADBG("smmu is enabled on EMAC\n");
result = ipa3_smmu_map_peer_buff((u64)params->ring_base_iova,
@ -349,14 +351,13 @@ static int ipa3_smmu_map_uc_ntn_pipes(struct ipa_ntn_setup_info *params,
IPAERR("Fail to map 0x%llx\n", iova);
} else {
result = iommu_unmap(smmu_domain, iova_p, size_p);
if (result != params->data_buff_size)
if (result != size_p) {
IPAERR("Fail to unmap 0x%llx\n", iova);
}
if (result) {
if (params->smmu_enabled)
goto fail_map_data_buff_smmu_enabled;
else
goto fail_map_data_buff_smmu_disabled;
if (params->smmu_enabled)
goto fail_map_data_buff_smmu_enabled;
else
goto fail_map_data_buff_smmu_disabled;
}
}
}
return 0;
@ -396,6 +397,7 @@ int ipa3_setup_uc_ntn_pipes(struct ipa_ntn_conn_in_params *in,
int ipa_ep_idx_ul;
int ipa_ep_idx_dl;
int result = 0;
bool unmapped = false;
if (in == NULL) {
IPAERR("invalid input\n");
@ -449,7 +451,7 @@ int ipa3_setup_uc_ntn_pipes(struct ipa_ntn_conn_in_params *in,
goto fail;
}
result = ipa3_smmu_map_uc_ntn_pipes(&in->ul, true);
result = ipa3_smmu_map_uc_ntn_pipes(&in->ul, true, true);
if (result) {
IPAERR("failed to map SMMU for UL %d\n", result);
goto fail;
@ -488,7 +490,7 @@ int ipa3_setup_uc_ntn_pipes(struct ipa_ntn_conn_in_params *in,
goto fail_disable_dp_ul;
}
result = ipa3_smmu_map_uc_ntn_pipes(&in->dl, true);
result = ipa3_smmu_map_uc_ntn_pipes(&in->dl, true, false);
if (result) {
IPAERR("failed to map SMMU for DL %d\n", result);
goto fail_disable_dp_ul;
@ -519,11 +521,12 @@ int ipa3_setup_uc_ntn_pipes(struct ipa_ntn_conn_in_params *in,
fail_disable_dp_dl:
ipa3_disable_data_path(ipa_ep_idx_dl);
fail_smmu_unmap_dl:
ipa3_smmu_map_uc_ntn_pipes(&in->dl, false);
ipa3_smmu_map_uc_ntn_pipes(&in->dl, false, true);
unmapped = true;
fail_disable_dp_ul:
ipa3_disable_data_path(ipa_ep_idx_ul);
fail_smmu_unmap_ul:
ipa3_smmu_map_uc_ntn_pipes(&in->ul, false);
ipa3_smmu_map_uc_ntn_pipes(&in->ul, false, !unmapped);
fail:
IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
return result;
@ -603,7 +606,7 @@ int ipa3_tear_down_uc_offload_pipes(int ipa_ep_idx_ul,
}
/* unmap the DL pipe */
result = ipa3_smmu_map_uc_ntn_pipes(&params->dl, false);
result = ipa3_smmu_map_uc_ntn_pipes(&params->dl, false, true);
if (result) {
IPAERR("failed to unmap SMMU for DL %d\n", result);
goto fail;
@ -624,7 +627,7 @@ int ipa3_tear_down_uc_offload_pipes(int ipa_ep_idx_ul,
}
/* unmap the UL pipe */
result = ipa3_smmu_map_uc_ntn_pipes(&params->ul, false);
result = ipa3_smmu_map_uc_ntn_pipes(&params->ul, false, false);
if (result) {
IPAERR("failed to unmap SMMU for UL %d\n", result);
goto fail;