Skip to content

Commit 83a46a8

Browse files
Michael ChanJakub Kicinski
authored andcommitted
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: 782a624 ("bnxt_en: Add bnxt_en initial port params table and register it") Cc: Jiri Pirko <[email protected]> Reviewed-by: Vasundhara Volam <[email protected]> Signed-off-by: Michael Chan <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent c329230 commit 83a46a8

File tree

1 file changed

+54
-27
lines changed

1 file changed

+54
-27
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,55 @@ static const struct bnxt_dl_nvm_param nvm_params[] = {
226226
BNXT_NVM_SHARED_CFG, 1, 1},
227227
};
228228

229+
union bnxt_nvm_data {
230+
u8 val8;
231+
__le32 val32;
232+
};
233+
234+
static void bnxt_copy_to_nvm_data(union bnxt_nvm_data *dst,
235+
union devlink_param_value *src,
236+
int nvm_num_bits, int dl_num_bytes)
237+
{
238+
u32 val32 = 0;
239+
240+
if (nvm_num_bits == 1) {
241+
dst->val8 = src->vbool;
242+
return;
243+
}
244+
if (dl_num_bytes == 4)
245+
val32 = src->vu32;
246+
else if (dl_num_bytes == 2)
247+
val32 = (u32)src->vu16;
248+
else if (dl_num_bytes == 1)
249+
val32 = (u32)src->vu8;
250+
dst->val32 = cpu_to_le32(val32);
251+
}
252+
253+
static void bnxt_copy_from_nvm_data(union devlink_param_value *dst,
254+
union bnxt_nvm_data *src,
255+
int nvm_num_bits, int dl_num_bytes)
256+
{
257+
u32 val32;
258+
259+
if (nvm_num_bits == 1) {
260+
dst->vbool = src->val8;
261+
return;
262+
}
263+
val32 = le32_to_cpu(src->val32);
264+
if (dl_num_bytes == 4)
265+
dst->vu32 = val32;
266+
else if (dl_num_bytes == 2)
267+
dst->vu16 = (u16)val32;
268+
else if (dl_num_bytes == 1)
269+
dst->vu8 = (u8)val32;
270+
}
271+
229272
static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
230273
int msg_len, union devlink_param_value *val)
231274
{
232275
struct hwrm_nvm_get_variable_input *req = msg;
233-
void *data_addr = NULL, *buf = NULL;
234276
struct bnxt_dl_nvm_param nvm_param;
277+
union bnxt_nvm_data *data;
235278
dma_addr_t data_dma_addr;
236279
int idx = 0, rc, i;
237280

@@ -254,26 +297,9 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
254297
else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG)
255298
idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID;
256299

257-
switch (nvm_param.dl_num_bytes) {
258-
case 1:
259-
if (nvm_param.nvm_num_bits == 1)
260-
buf = &val->vbool;
261-
else
262-
buf = &val->vu8;
263-
break;
264-
case 2:
265-
buf = &val->vu16;
266-
break;
267-
case 4:
268-
buf = &val->vu32;
269-
break;
270-
default:
271-
return -EFAULT;
272-
}
273-
274-
data_addr = dma_alloc_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes,
275-
&data_dma_addr, GFP_KERNEL);
276-
if (!data_addr)
300+
data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data),
301+
&data_dma_addr, GFP_KERNEL);
302+
if (!data)
277303
return -ENOMEM;
278304

279305
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,
284310
req->dimensions = cpu_to_le16(1);
285311

286312
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) {
287-
memcpy(data_addr, buf, nvm_param.dl_num_bytes);
313+
bnxt_copy_to_nvm_data(data, val, nvm_param.nvm_num_bits,
314+
nvm_param.dl_num_bytes);
288315
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT);
289316
} else {
290317
rc = hwrm_send_message_silent(bp, msg, msg_len,
291318
HWRM_CMD_TIMEOUT);
319+
if (!rc)
320+
bnxt_copy_from_nvm_data(val, data,
321+
nvm_param.nvm_num_bits,
322+
nvm_param.dl_num_bytes);
292323
}
293-
if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE))
294-
memcpy(buf, data_addr, nvm_param.dl_num_bytes);
295-
296-
dma_free_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes, data_addr,
297-
data_dma_addr);
324+
dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr);
298325
if (rc == -EACCES)
299326
netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n");
300327
return rc;

0 commit comments

Comments
 (0)