Skip to content

Commit 547848a

Browse files
committed
Merge branch 'bnxt_en-Updates-for-net-next'
Michael Chan says: ==================== bnxt_en: Updates for net-next. This series contains these main changes: 1. Change of default message level to enable more logging. 2. Some cleanups related to processing async events from firmware. 3. Allow online ethtool selftest on multi-function PFs. 4. Return stored firmware version information to devlink. v2: Patch 3: Change bnxt_reset_task() to silent mode. Patch 8 & 9: Ensure we copy NULL terminated fw strings to devlink. Patch 8 & 9: Return directly after the last bnxt_dl_info_put() call. Patch 9: If FW call to get stored dev info fails, return success to devlink without the stored versions. ==================== Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 2ad119d + 1388875 commit 547848a

6 files changed

Lines changed: 164 additions & 62 deletions

File tree

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

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
#include "bnxt_debugfs.h"
7070

7171
#define BNXT_TX_TIMEOUT (5 * HZ)
72+
#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW)
7273

7374
MODULE_LICENSE("GPL");
7475
MODULE_DESCRIPTION("Broadcom BCM573xx network driver");
@@ -1979,11 +1980,12 @@ static int bnxt_async_event_process(struct bnxt *bp,
19791980
struct hwrm_async_event_cmpl *cmpl)
19801981
{
19811982
u16 event_id = le16_to_cpu(cmpl->event_id);
1983+
u32 data1 = le32_to_cpu(cmpl->event_data1);
1984+
u32 data2 = le32_to_cpu(cmpl->event_data2);
19821985

19831986
/* TODO CHIMP_FW: Define event id's for link change, error etc */
19841987
switch (event_id) {
19851988
case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE: {
1986-
u32 data1 = le32_to_cpu(cmpl->event_data1);
19871989
struct bnxt_link_info *link_info = &bp->link_info;
19881990

19891991
if (BNXT_VF(bp))
@@ -2013,7 +2015,6 @@ static int bnxt_async_event_process(struct bnxt *bp,
20132015
set_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event);
20142016
break;
20152017
case ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED: {
2016-
u32 data1 = le32_to_cpu(cmpl->event_data1);
20172018
u16 port_id = BNXT_GET_EVENT_PORT(data1);
20182019

20192020
if (BNXT_VF(bp))
@@ -2030,9 +2031,10 @@ static int bnxt_async_event_process(struct bnxt *bp,
20302031
goto async_event_process_exit;
20312032
set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event);
20322033
break;
2033-
case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY: {
2034-
u32 data1 = le32_to_cpu(cmpl->event_data1);
2035-
2034+
case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY:
2035+
if (netif_msg_hw(bp))
2036+
netdev_warn(bp->dev, "Received RESET_NOTIFY event, data1: 0x%x, data2: 0x%x\n",
2037+
data1, data2);
20362038
if (!bp->fw_health)
20372039
goto async_event_process_exit;
20382040

@@ -2052,10 +2054,8 @@ static int bnxt_async_event_process(struct bnxt *bp,
20522054
}
20532055
set_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event);
20542056
break;
2055-
}
20562057
case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY: {
20572058
struct bnxt_fw_health *fw_health = bp->fw_health;
2058-
u32 data1 = le32_to_cpu(cmpl->event_data1);
20592059

20602060
if (!fw_health)
20612061
goto async_event_process_exit;
@@ -2083,8 +2083,6 @@ static int bnxt_async_event_process(struct bnxt *bp,
20832083
goto async_event_process_exit;
20842084
}
20852085
case ASYNC_EVENT_CMPL_EVENT_ID_RING_MONITOR_MSG: {
2086-
u32 data1 = le32_to_cpu(cmpl->event_data1);
2087-
u32 data2 = le32_to_cpu(cmpl->event_data2);
20882086
struct bnxt_rx_ring_info *rxr;
20892087
u16 grp_idx;
20902088

@@ -4325,6 +4323,8 @@ static int bnxt_hwrm_to_stderr(u32 hwrm_err)
43254323
switch (hwrm_err) {
43264324
case HWRM_ERR_CODE_SUCCESS:
43274325
return 0;
4326+
case HWRM_ERR_CODE_RESOURCE_LOCKED:
4327+
return -EROFS;
43284328
case HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED:
43294329
return -EACCES;
43304330
case HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR:
@@ -7562,6 +7562,16 @@ static int bnxt_hwrm_func_reset(struct bnxt *bp)
75627562
return hwrm_send_message(bp, &req, sizeof(req), HWRM_RESET_TIMEOUT);
75637563
}
75647564

7565+
static void bnxt_nvm_cfg_ver_get(struct bnxt *bp)
7566+
{
7567+
struct hwrm_nvm_get_dev_info_output nvm_info;
7568+
7569+
if (!bnxt_hwrm_nvm_get_dev_info(bp, &nvm_info))
7570+
snprintf(bp->nvm_cfg_ver, FW_VER_STR_LEN, "%d.%d.%d",
7571+
nvm_info.nvm_cfg_ver_maj, nvm_info.nvm_cfg_ver_min,
7572+
nvm_info.nvm_cfg_ver_upd);
7573+
}
7574+
75657575
static int bnxt_hwrm_queue_qportcfg(struct bnxt *bp)
75667576
{
75677577
int rc = 0;
@@ -8902,6 +8912,11 @@ static void bnxt_report_link(struct bnxt *bp)
89028912
u16 fec;
89038913

89048914
netif_carrier_on(bp->dev);
8915+
speed = bnxt_fw_to_ethtool_speed(bp->link_info.link_speed);
8916+
if (speed == SPEED_UNKNOWN) {
8917+
netdev_info(bp->dev, "NIC Link is Up, speed unknown\n");
8918+
return;
8919+
}
89058920
if (bp->link_info.duplex == BNXT_LINK_DUPLEX_FULL)
89068921
duplex = "full";
89078922
else
@@ -8914,7 +8929,6 @@ static void bnxt_report_link(struct bnxt *bp)
89148929
flow_ctrl = "ON - receive";
89158930
else
89168931
flow_ctrl = "none";
8917-
speed = bnxt_fw_to_ethtool_speed(bp->link_info.link_speed);
89188932
netdev_info(bp->dev, "NIC Link is Up, %u Mbps %s duplex, Flow control: %s\n",
89198933
speed, duplex, flow_ctrl);
89208934
if (bp->flags & BNXT_FLAG_EEE_CAP)
@@ -10751,7 +10765,7 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)
1075110765
else
1075210766
netdev_warn(bp->dev, "RX ring reset failed, rc = %d, falling back to global reset\n",
1075310767
rc);
10754-
bnxt_reset_task(bp, false);
10768+
bnxt_reset_task(bp, true);
1075510769
break;
1075610770
}
1075710771
bnxt_free_one_rx_ring_skbs(bp, i);
@@ -11219,6 +11233,8 @@ static int bnxt_fw_init_one_p1(struct bnxt *bp)
1121911233
if (rc)
1122011234
return rc;
1122111235
}
11236+
bnxt_nvm_cfg_ver_get(bp);
11237+
1122211238
rc = bnxt_hwrm_func_reset(bp);
1122311239
if (rc)
1122411240
return -ENODEV;
@@ -12508,6 +12524,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1250812524
return -ENOMEM;
1250912525

1251012526
bp = netdev_priv(dev);
12527+
bp->msg_enable = BNXT_DEF_MSG_ENABLE;
1251112528
bnxt_set_max_func_irqs(bp, max_irqs);
1251212529

1251312530
if (bnxt_vf_pciid(ent->driver_data))

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,7 @@ struct bnxt {
18561856
#define PHY_VER_STR_LEN (FW_VER_STR_LEN - BC_HWRM_STR_LEN)
18571857
char fw_ver_str[FW_VER_STR_LEN];
18581858
char hwrm_ver_supp[FW_VER_STR_LEN];
1859+
char nvm_cfg_ver[FW_VER_STR_LEN];
18591860
u64 fw_ver_code;
18601861
#define BNXT_FW_VER_CODE(maj, min, bld, rsv) \
18611862
((u64)(maj) << 48 | (u64)(min) << 32 | (u64)(bld) << 16 | (rsv))

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

Lines changed: 107 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
385410
static 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

507567
static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ struct bnxt_dl_nvm_param {
6060
u8 dl_num_bytes;
6161
};
6262

63+
enum bnxt_dl_version_type {
64+
BNXT_VERSION_FIXED,
65+
BNXT_VERSION_RUNNING,
66+
BNXT_VERSION_STORED,
67+
};
68+
6369
void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event);
6470
void bnxt_dl_health_status_update(struct bnxt *bp, bool healthy);
6571
void bnxt_dl_health_recovery_done(struct bnxt *bp);

0 commit comments

Comments
 (0)