mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
bnxt_en: Fix devlink NVRAM related byte order related issues.
The current code does not do endian swapping between the devlink
parameter and the internal NVRAM representation. Define a union to
represent the little endian NVRAM data and add 2 helper functions to
copy to and from the NVRAM data with the proper byte swapping.
Fixes: 782a624d00
("bnxt_en: Add bnxt_en initial port params table and register it")
Cc: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
This commit is contained in:
parent
c329230ce8
commit
83a46a82b9
@ -226,12 +226,55 @@ static const struct bnxt_dl_nvm_param nvm_params[] = {
|
|||||||
BNXT_NVM_SHARED_CFG, 1, 1},
|
BNXT_NVM_SHARED_CFG, 1, 1},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
union bnxt_nvm_data {
|
||||||
|
u8 val8;
|
||||||
|
__le32 val32;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void bnxt_copy_to_nvm_data(union bnxt_nvm_data *dst,
|
||||||
|
union devlink_param_value *src,
|
||||||
|
int nvm_num_bits, int dl_num_bytes)
|
||||||
|
{
|
||||||
|
u32 val32 = 0;
|
||||||
|
|
||||||
|
if (nvm_num_bits == 1) {
|
||||||
|
dst->val8 = src->vbool;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (dl_num_bytes == 4)
|
||||||
|
val32 = src->vu32;
|
||||||
|
else if (dl_num_bytes == 2)
|
||||||
|
val32 = (u32)src->vu16;
|
||||||
|
else if (dl_num_bytes == 1)
|
||||||
|
val32 = (u32)src->vu8;
|
||||||
|
dst->val32 = cpu_to_le32(val32);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bnxt_copy_from_nvm_data(union devlink_param_value *dst,
|
||||||
|
union bnxt_nvm_data *src,
|
||||||
|
int nvm_num_bits, int dl_num_bytes)
|
||||||
|
{
|
||||||
|
u32 val32;
|
||||||
|
|
||||||
|
if (nvm_num_bits == 1) {
|
||||||
|
dst->vbool = src->val8;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
val32 = le32_to_cpu(src->val32);
|
||||||
|
if (dl_num_bytes == 4)
|
||||||
|
dst->vu32 = val32;
|
||||||
|
else if (dl_num_bytes == 2)
|
||||||
|
dst->vu16 = (u16)val32;
|
||||||
|
else if (dl_num_bytes == 1)
|
||||||
|
dst->vu8 = (u8)val32;
|
||||||
|
}
|
||||||
|
|
||||||
static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
|
static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
|
||||||
int msg_len, union devlink_param_value *val)
|
int msg_len, union devlink_param_value *val)
|
||||||
{
|
{
|
||||||
struct hwrm_nvm_get_variable_input *req = msg;
|
struct hwrm_nvm_get_variable_input *req = msg;
|
||||||
void *data_addr = NULL, *buf = NULL;
|
|
||||||
struct bnxt_dl_nvm_param nvm_param;
|
struct bnxt_dl_nvm_param nvm_param;
|
||||||
|
union bnxt_nvm_data *data;
|
||||||
dma_addr_t data_dma_addr;
|
dma_addr_t data_dma_addr;
|
||||||
int idx = 0, rc, i;
|
int idx = 0, rc, i;
|
||||||
|
|
||||||
@ -254,26 +297,9 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
|
|||||||
else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG)
|
else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG)
|
||||||
idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID;
|
idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID;
|
||||||
|
|
||||||
switch (nvm_param.dl_num_bytes) {
|
data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data),
|
||||||
case 1:
|
&data_dma_addr, GFP_KERNEL);
|
||||||
if (nvm_param.nvm_num_bits == 1)
|
if (!data)
|
||||||
buf = &val->vbool;
|
|
||||||
else
|
|
||||||
buf = &val->vu8;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
buf = &val->vu16;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
buf = &val->vu32;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
data_addr = dma_alloc_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes,
|
|
||||||
&data_dma_addr, GFP_KERNEL);
|
|
||||||
if (!data_addr)
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
req->dest_data_addr = cpu_to_le64(data_dma_addr);
|
req->dest_data_addr = cpu_to_le64(data_dma_addr);
|
||||||
@ -284,17 +310,18 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
|
|||||||
req->dimensions = cpu_to_le16(1);
|
req->dimensions = cpu_to_le16(1);
|
||||||
|
|
||||||
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) {
|
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) {
|
||||||
memcpy(data_addr, buf, nvm_param.dl_num_bytes);
|
bnxt_copy_to_nvm_data(data, val, nvm_param.nvm_num_bits,
|
||||||
|
nvm_param.dl_num_bytes);
|
||||||
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT);
|
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
rc = hwrm_send_message_silent(bp, msg, msg_len,
|
rc = hwrm_send_message_silent(bp, msg, msg_len,
|
||||||
HWRM_CMD_TIMEOUT);
|
HWRM_CMD_TIMEOUT);
|
||||||
|
if (!rc)
|
||||||
|
bnxt_copy_from_nvm_data(val, data,
|
||||||
|
nvm_param.nvm_num_bits,
|
||||||
|
nvm_param.dl_num_bytes);
|
||||||
}
|
}
|
||||||
if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE))
|
dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr);
|
||||||
memcpy(buf, data_addr, nvm_param.dl_num_bytes);
|
|
||||||
|
|
||||||
dma_free_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes, data_addr,
|
|
||||||
data_dma_addr);
|
|
||||||
if (rc == -EACCES)
|
if (rc == -EACCES)
|
||||||
netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n");
|
netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n");
|
||||||
return rc;
|
return rc;
|
||||||
|
Loading…
Reference in New Issue
Block a user