@@ -226,12 +226,55 @@ static const struct bnxt_dl_nvm_param nvm_params[] = {
226
226
BNXT_NVM_SHARED_CFG , 1 , 1 },
227
227
};
228
228
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
+
229
272
static int bnxt_hwrm_nvm_req (struct bnxt * bp , u32 param_id , void * msg ,
230
273
int msg_len , union devlink_param_value * val )
231
274
{
232
275
struct hwrm_nvm_get_variable_input * req = msg ;
233
- void * data_addr = NULL , * buf = NULL ;
234
276
struct bnxt_dl_nvm_param nvm_param ;
277
+ union bnxt_nvm_data * data ;
235
278
dma_addr_t data_dma_addr ;
236
279
int idx = 0 , rc , i ;
237
280
@@ -254,26 +297,9 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
254
297
else if (nvm_param .dir_type == BNXT_NVM_FUNC_CFG )
255
298
idx = bp -> pf .fw_fid - BNXT_FIRST_PF_FID ;
256
299
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 )
277
303
return - ENOMEM ;
278
304
279
305
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,
284
310
req -> dimensions = cpu_to_le16 (1 );
285
311
286
312
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 );
288
315
rc = hwrm_send_message (bp , msg , msg_len , HWRM_CMD_TIMEOUT );
289
316
} else {
290
317
rc = hwrm_send_message_silent (bp , msg , msg_len ,
291
318
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 );
292
323
}
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 );
298
325
if (rc == - EACCES )
299
326
netdev_err (bp -> dev , "PF does not have admin privileges to modify NVM config\n" );
300
327
return rc ;
0 commit comments