@@ -382,26 +382,53 @@ static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp,
382382 return rc ;
383383}
384384
385+ static int bnxt_dl_info_put (struct bnxt * bp , struct devlink_info_req * req ,
386+ enum bnxt_dl_version_type type , const char * key ,
387+ char * buf )
388+ {
389+ if (!strlen (buf ))
390+ return 0 ;
391+
392+ if ((bp -> flags & BNXT_FLAG_CHIP_P5 ) &&
393+ (!strcmp (key , DEVLINK_INFO_VERSION_GENERIC_FW_NCSI ) ||
394+ !strcmp (key , DEVLINK_INFO_VERSION_GENERIC_FW_ROCE )))
395+ return 0 ;
396+
397+ switch (type ) {
398+ case BNXT_VERSION_FIXED :
399+ return devlink_info_version_fixed_put (req , key , buf );
400+ case BNXT_VERSION_RUNNING :
401+ return devlink_info_version_running_put (req , key , buf );
402+ case BNXT_VERSION_STORED :
403+ return devlink_info_version_stored_put (req , key , buf );
404+ }
405+ return 0 ;
406+ }
407+
408+ #define HWRM_FW_VER_STR_LEN 16
409+
385410static int bnxt_dl_info_get (struct devlink * dl , struct devlink_info_req * req ,
386411 struct netlink_ext_ack * extack )
387412{
413+ struct hwrm_nvm_get_dev_info_output nvm_dev_info ;
388414 struct bnxt * bp = bnxt_get_bp_from_dl (dl );
389415 union devlink_param_value nvm_cfg_ver ;
390416 struct hwrm_ver_get_output * ver_resp ;
391417 char mgmt_ver [FW_VER_STR_LEN ];
392418 char roce_ver [FW_VER_STR_LEN ];
393- char fw_ver [FW_VER_STR_LEN ];
419+ char ncsi_ver [FW_VER_STR_LEN ];
394420 char buf [32 ];
395421 int rc ;
396422
397423 rc = devlink_info_driver_name_put (req , DRV_MODULE_NAME );
398424 if (rc )
399425 return rc ;
400426
401- if (strlen (bp -> board_partno )) {
402- rc = devlink_info_version_fixed_put (req ,
403- DEVLINK_INFO_VERSION_GENERIC_BOARD_ID ,
404- bp -> board_partno );
427+ if (BNXT_PF (bp ) && (bp -> flags & BNXT_FLAG_DSN_VALID )) {
428+ sprintf (buf , "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X" ,
429+ bp -> dsn [7 ], bp -> dsn [6 ], bp -> dsn [5 ], bp -> dsn [4 ],
430+ bp -> dsn [3 ], bp -> dsn [2 ], bp -> dsn [1 ], bp -> dsn [0 ]);
431+ rc = devlink_info_serial_number_put (req , buf );
405432 if (rc )
406433 return rc ;
407434 }
@@ -412,96 +439,129 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
412439 return rc ;
413440 }
414441
442+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_FIXED ,
443+ DEVLINK_INFO_VERSION_GENERIC_BOARD_ID ,
444+ bp -> board_partno );
445+ if (rc )
446+ return rc ;
447+
415448 sprintf (buf , "%X" , bp -> chip_num );
416- rc = devlink_info_version_fixed_put ( req ,
417- DEVLINK_INFO_VERSION_GENERIC_ASIC_ID , buf );
449+ rc = bnxt_dl_info_put ( bp , req , BNXT_VERSION_FIXED ,
450+ DEVLINK_INFO_VERSION_GENERIC_ASIC_ID , buf );
418451 if (rc )
419452 return rc ;
420453
421454 ver_resp = & bp -> ver_resp ;
422455 sprintf (buf , "%X" , ver_resp -> chip_rev );
423- rc = devlink_info_version_fixed_put ( req ,
424- DEVLINK_INFO_VERSION_GENERIC_ASIC_REV , buf );
456+ rc = bnxt_dl_info_put ( bp , req , BNXT_VERSION_FIXED ,
457+ DEVLINK_INFO_VERSION_GENERIC_ASIC_REV , buf );
425458 if (rc )
426459 return rc ;
427460
428- if (BNXT_PF (bp )) {
429- sprintf (buf , "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X" ,
430- bp -> dsn [7 ], bp -> dsn [6 ], bp -> dsn [5 ], bp -> dsn [4 ],
431- bp -> dsn [3 ], bp -> dsn [2 ], bp -> dsn [1 ], bp -> dsn [0 ]);
432- rc = devlink_info_serial_number_put (req , buf );
433- if (rc )
434- return rc ;
435- }
461+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_RUNNING ,
462+ DEVLINK_INFO_VERSION_GENERIC_FW_PSID ,
463+ bp -> nvm_cfg_ver );
464+ if (rc )
465+ return rc ;
436466
437- if (strlen (ver_resp -> active_pkg_name )) {
438- rc =
439- devlink_info_version_running_put (req ,
440- DEVLINK_INFO_VERSION_GENERIC_FW ,
441- ver_resp -> active_pkg_name );
442- if (rc )
443- return rc ;
444- }
467+ buf [0 ] = 0 ;
468+ strncat (buf , ver_resp -> active_pkg_name , HWRM_FW_VER_STR_LEN );
469+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_RUNNING ,
470+ DEVLINK_INFO_VERSION_GENERIC_FW , buf );
471+ if (rc )
472+ return rc ;
445473
446474 if (BNXT_PF (bp ) && !bnxt_hwrm_get_nvm_cfg_ver (bp , & nvm_cfg_ver )) {
447475 u32 ver = nvm_cfg_ver .vu32 ;
448476
449477 sprintf (buf , "%X.%X.%X" , (ver >> 16 ) & 0xF , (ver >> 8 ) & 0xF ,
450478 ver & 0xF );
451- rc = devlink_info_version_running_put (req ,
452- DEVLINK_INFO_VERSION_GENERIC_FW_PSID , buf );
479+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_STORED ,
480+ DEVLINK_INFO_VERSION_GENERIC_FW_PSID ,
481+ buf );
453482 if (rc )
454483 return rc ;
455484 }
456485
457486 if (ver_resp -> flags & VER_GET_RESP_FLAGS_EXT_VER_AVAIL ) {
458- snprintf (fw_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
487+ snprintf (mgmt_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
459488 ver_resp -> hwrm_fw_major , ver_resp -> hwrm_fw_minor ,
460489 ver_resp -> hwrm_fw_build , ver_resp -> hwrm_fw_patch );
461490
462- snprintf (mgmt_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
491+ snprintf (ncsi_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
463492 ver_resp -> mgmt_fw_major , ver_resp -> mgmt_fw_minor ,
464493 ver_resp -> mgmt_fw_build , ver_resp -> mgmt_fw_patch );
465494
466495 snprintf (roce_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
467496 ver_resp -> roce_fw_major , ver_resp -> roce_fw_minor ,
468497 ver_resp -> roce_fw_build , ver_resp -> roce_fw_patch );
469498 } else {
470- snprintf (fw_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
499+ snprintf (mgmt_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
471500 ver_resp -> hwrm_fw_maj_8b , ver_resp -> hwrm_fw_min_8b ,
472501 ver_resp -> hwrm_fw_bld_8b , ver_resp -> hwrm_fw_rsvd_8b );
473502
474- snprintf (mgmt_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
503+ snprintf (ncsi_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
475504 ver_resp -> mgmt_fw_maj_8b , ver_resp -> mgmt_fw_min_8b ,
476505 ver_resp -> mgmt_fw_bld_8b , ver_resp -> mgmt_fw_rsvd_8b );
477506
478507 snprintf (roce_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
479508 ver_resp -> roce_fw_maj_8b , ver_resp -> roce_fw_min_8b ,
480509 ver_resp -> roce_fw_bld_8b , ver_resp -> roce_fw_rsvd_8b );
481510 }
482- rc = devlink_info_version_running_put ( req ,
483- DEVLINK_INFO_VERSION_GENERIC_FW_MGMT , fw_ver );
511+ rc = bnxt_dl_info_put ( bp , req , BNXT_VERSION_RUNNING ,
512+ DEVLINK_INFO_VERSION_GENERIC_FW_MGMT , mgmt_ver );
484513 if (rc )
485514 return rc ;
486515
487- rc = devlink_info_version_running_put ( req ,
488- DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API ,
489- bp -> hwrm_ver_supp );
516+ rc = bnxt_dl_info_put ( bp , req , BNXT_VERSION_RUNNING ,
517+ DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API ,
518+ bp -> hwrm_ver_supp );
490519 if (rc )
491520 return rc ;
492521
493- if (!(bp -> flags & BNXT_FLAG_CHIP_P5 )) {
494- rc = devlink_info_version_running_put (req ,
495- DEVLINK_INFO_VERSION_GENERIC_FW_NCSI , mgmt_ver );
496- if (rc )
497- return rc ;
522+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_RUNNING ,
523+ DEVLINK_INFO_VERSION_GENERIC_FW_NCSI , ncsi_ver );
524+ if (rc )
525+ return rc ;
498526
499- rc = devlink_info_version_running_put (req ,
500- DEVLINK_INFO_VERSION_GENERIC_FW_ROCE , roce_ver );
501- if (rc )
502- return rc ;
503- }
504- return 0 ;
527+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_RUNNING ,
528+ DEVLINK_INFO_VERSION_GENERIC_FW_ROCE , roce_ver );
529+ if (rc )
530+ return rc ;
531+
532+ rc = bnxt_hwrm_nvm_get_dev_info (bp , & nvm_dev_info );
533+ if (rc ||
534+ !(nvm_dev_info .flags & NVM_GET_DEV_INFO_RESP_FLAGS_FW_VER_VALID ))
535+ return 0 ;
536+
537+ buf [0 ] = 0 ;
538+ strncat (buf , nvm_dev_info .pkg_name , HWRM_FW_VER_STR_LEN );
539+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_STORED ,
540+ DEVLINK_INFO_VERSION_GENERIC_FW , buf );
541+ if (rc )
542+ return rc ;
543+
544+ snprintf (mgmt_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
545+ nvm_dev_info .hwrm_fw_major , nvm_dev_info .hwrm_fw_minor ,
546+ nvm_dev_info .hwrm_fw_build , nvm_dev_info .hwrm_fw_patch );
547+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_STORED ,
548+ DEVLINK_INFO_VERSION_GENERIC_FW_MGMT , mgmt_ver );
549+ if (rc )
550+ return rc ;
551+
552+ snprintf (ncsi_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
553+ nvm_dev_info .mgmt_fw_major , nvm_dev_info .mgmt_fw_minor ,
554+ nvm_dev_info .mgmt_fw_build , nvm_dev_info .mgmt_fw_patch );
555+ rc = bnxt_dl_info_put (bp , req , BNXT_VERSION_STORED ,
556+ DEVLINK_INFO_VERSION_GENERIC_FW_NCSI , ncsi_ver );
557+ if (rc )
558+ return rc ;
559+
560+ snprintf (roce_ver , FW_VER_STR_LEN , "%d.%d.%d.%d" ,
561+ nvm_dev_info .roce_fw_major , nvm_dev_info .roce_fw_minor ,
562+ nvm_dev_info .roce_fw_build , nvm_dev_info .roce_fw_patch );
563+ return bnxt_dl_info_put (bp , req , BNXT_VERSION_STORED ,
564+ DEVLINK_INFO_VERSION_GENERIC_FW_ROCE , roce_ver );
505565}
506566
507567static int bnxt_hwrm_nvm_req (struct bnxt * bp , u32 param_id , void * msg ,
0 commit comments