Commit 4bd27ee6 authored by David S. Miller's avatar David S. Miller

Merge branch 'bnxt_en-Updates-to-devlink-info_get-cb'

Vasundhara Volam says:

====================
bnxt_en: Updates to devlink info_get cb

This series adds support for a generic macro to devlink info_get cb.
Adds support for fw.mgmt.api and board.id info to bnxt_en driver info_get
cb. Also, updates the devlink-info.rst and bnxt.rst documentation
accordingly.

This series adds a patch to fix few macro names that maps to bnxt_en
firmware versions.

v1->v2: Remove ECN dev param, base_mh_addr and serial number info support
in this series.
Rename drv.spec macro to fw.api.
---
v2->v3: Remove hw.addr info as it is per netdev but not per device info.
---
v3->v4: Rename "fw.api" to "fw.mgmt.api".
Also, add a patch that modifies few macro names in info_get command,
to match the devlink documentation.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a1c7a536 2013d038
...@@ -51,6 +51,9 @@ The ``bnxt_en`` driver reports the following versions ...@@ -51,6 +51,9 @@ The ``bnxt_en`` driver reports the following versions
* - Name * - Name
- Type - Type
- Description - Description
* - ``board.id``
- fixed
- Part number identifying the board design
* - ``asic.id`` * - ``asic.id``
- fixed - fixed
- ASIC design identifier - ASIC design identifier
...@@ -63,12 +66,15 @@ The ``bnxt_en`` driver reports the following versions ...@@ -63,12 +66,15 @@ The ``bnxt_en`` driver reports the following versions
* - ``fw`` * - ``fw``
- stored, running - stored, running
- Overall board firmware version - Overall board firmware version
* - ``fw.app``
- stored, running
- Data path firmware version
* - ``fw.mgmt`` * - ``fw.mgmt``
- stored, running - stored, running
- Management firmware version - NIC hardware resource management firmware version
* - ``fw.mgmt.api``
- running
- Minimum firmware interface spec version supported between driver and firmware
* - ``fw.nsci``
- stored, running
- General platform management firmware version
* - ``fw.roce`` * - ``fw.roce``
- stored, running - stored, running
- RoCE management firmware version - RoCE management firmware version
...@@ -157,6 +157,12 @@ Control unit firmware version. This firmware is responsible for house ...@@ -157,6 +157,12 @@ Control unit firmware version. This firmware is responsible for house
keeping tasks, PHY control etc. but not the packet-by-packet data path keeping tasks, PHY control etc. but not the packet-by-packet data path
operation. operation.
fw.mgmt.api
-----------
Firmware interface specification version of the software interfaces between
driver and firmware.
fw.app fw.app
------ ------
......
...@@ -7223,7 +7223,7 @@ static int __bnxt_hwrm_ver_get(struct bnxt *bp, bool silent) ...@@ -7223,7 +7223,7 @@ static int __bnxt_hwrm_ver_get(struct bnxt *bp, bool silent)
static int bnxt_hwrm_ver_get(struct bnxt *bp) static int bnxt_hwrm_ver_get(struct bnxt *bp)
{ {
struct hwrm_ver_get_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_ver_get_output *resp = bp->hwrm_cmd_resp_addr;
u32 dev_caps_cfg; u32 dev_caps_cfg, hwrm_ver;
int rc; int rc;
bp->hwrm_max_req_len = HWRM_MAX_REQ_LEN; bp->hwrm_max_req_len = HWRM_MAX_REQ_LEN;
...@@ -7243,6 +7243,19 @@ static int bnxt_hwrm_ver_get(struct bnxt *bp) ...@@ -7243,6 +7243,19 @@ static int bnxt_hwrm_ver_get(struct bnxt *bp)
resp->hwrm_intf_upd_8b); resp->hwrm_intf_upd_8b);
netdev_warn(bp->dev, "Please update firmware with HWRM interface 1.0.0 or newer.\n"); netdev_warn(bp->dev, "Please update firmware with HWRM interface 1.0.0 or newer.\n");
} }
hwrm_ver = HWRM_VERSION_MAJOR << 16 | HWRM_VERSION_MINOR << 8 |
HWRM_VERSION_UPDATE;
if (bp->hwrm_spec_code > hwrm_ver)
snprintf(bp->hwrm_ver_supp, FW_VER_STR_LEN, "%d.%d.%d",
HWRM_VERSION_MAJOR, HWRM_VERSION_MINOR,
HWRM_VERSION_UPDATE);
else
snprintf(bp->hwrm_ver_supp, FW_VER_STR_LEN, "%d.%d.%d",
resp->hwrm_intf_maj_8b, resp->hwrm_intf_min_8b,
resp->hwrm_intf_upd_8b);
snprintf(bp->fw_ver_str, BC_HWRM_STR_LEN, "%d.%d.%d.%d", snprintf(bp->fw_ver_str, BC_HWRM_STR_LEN, "%d.%d.%d.%d",
resp->hwrm_fw_maj_8b, resp->hwrm_fw_min_8b, resp->hwrm_fw_maj_8b, resp->hwrm_fw_min_8b,
resp->hwrm_fw_bld_8b, resp->hwrm_fw_rsvd_8b); resp->hwrm_fw_bld_8b, resp->hwrm_fw_rsvd_8b);
...@@ -11739,6 +11752,63 @@ static int bnxt_init_mac_addr(struct bnxt *bp) ...@@ -11739,6 +11752,63 @@ static int bnxt_init_mac_addr(struct bnxt *bp)
return rc; return rc;
} }
#define BNXT_VPD_LEN 512
static void bnxt_vpd_read_info(struct bnxt *bp)
{
struct pci_dev *pdev = bp->pdev;
int i, len, pos, ro_size;
ssize_t vpd_size;
u8 *vpd_data;
vpd_data = kmalloc(BNXT_VPD_LEN, GFP_KERNEL);
if (!vpd_data)
return;
vpd_size = pci_read_vpd(pdev, 0, BNXT_VPD_LEN, vpd_data);
if (vpd_size <= 0) {
netdev_err(bp->dev, "Unable to read VPD\n");
goto exit;
}
i = pci_vpd_find_tag(vpd_data, 0, vpd_size, PCI_VPD_LRDT_RO_DATA);
if (i < 0) {
netdev_err(bp->dev, "VPD READ-Only not found\n");
goto exit;
}
ro_size = pci_vpd_lrdt_size(&vpd_data[i]);
i += PCI_VPD_LRDT_TAG_SIZE;
if (i + ro_size > vpd_size)
goto exit;
pos = pci_vpd_find_info_keyword(vpd_data, i, ro_size,
PCI_VPD_RO_KEYWORD_PARTNO);
if (pos < 0)
goto read_sn;
len = pci_vpd_info_field_size(&vpd_data[pos]);
pos += PCI_VPD_INFO_FLD_HDR_SIZE;
if (len + pos > vpd_size)
goto read_sn;
strlcpy(bp->board_partno, &vpd_data[pos], min(len, BNXT_VPD_FLD_LEN));
read_sn:
pos = pci_vpd_find_info_keyword(vpd_data, i, ro_size,
PCI_VPD_RO_KEYWORD_SERIALNO);
if (pos < 0)
goto exit;
len = pci_vpd_info_field_size(&vpd_data[pos]);
pos += PCI_VPD_INFO_FLD_HDR_SIZE;
if (len + pos > vpd_size)
goto exit;
strlcpy(bp->board_serialno, &vpd_data[pos], min(len, BNXT_VPD_FLD_LEN));
exit:
kfree(vpd_data);
}
static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[]) static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[])
{ {
struct pci_dev *pdev = bp->pdev; struct pci_dev *pdev = bp->pdev;
...@@ -11796,6 +11866,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -11796,6 +11866,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
dev->ethtool_ops = &bnxt_ethtool_ops; dev->ethtool_ops = &bnxt_ethtool_ops;
pci_set_drvdata(pdev, dev); pci_set_drvdata(pdev, dev);
bnxt_vpd_read_info(bp);
rc = bnxt_alloc_hwrm_resources(bp); rc = bnxt_alloc_hwrm_resources(bp);
if (rc) if (rc)
goto init_err_pci_clean; goto init_err_pci_clean;
......
...@@ -1500,6 +1500,10 @@ struct bnxt { ...@@ -1500,6 +1500,10 @@ struct bnxt {
(chip_num) == CHIP_NUM_58804 || \ (chip_num) == CHIP_NUM_58804 || \
(chip_num) == CHIP_NUM_58808) (chip_num) == CHIP_NUM_58808)
#define BNXT_VPD_FLD_LEN 32
char board_partno[BNXT_VPD_FLD_LEN];
char board_serialno[BNXT_VPD_FLD_LEN];
struct net_device *dev; struct net_device *dev;
struct pci_dev *pdev; struct pci_dev *pdev;
...@@ -1730,6 +1734,7 @@ struct bnxt { ...@@ -1730,6 +1734,7 @@ struct bnxt {
#define BC_HWRM_STR_LEN 21 #define BC_HWRM_STR_LEN 21
#define PHY_VER_STR_LEN (FW_VER_STR_LEN - BC_HWRM_STR_LEN) #define PHY_VER_STR_LEN (FW_VER_STR_LEN - BC_HWRM_STR_LEN)
char fw_ver_str[FW_VER_STR_LEN]; char fw_ver_str[FW_VER_STR_LEN];
char hwrm_ver_supp[FW_VER_STR_LEN];
__be16 vxlan_port; __be16 vxlan_port;
u8 vxlan_port_cnt; u8 vxlan_port_cnt;
__le16 vxlan_fw_dst_port_id; __le16 vxlan_fw_dst_port_id;
......
...@@ -403,6 +403,14 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, ...@@ -403,6 +403,14 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
if (rc) if (rc)
return rc; return rc;
if (strlen(bp->board_partno)) {
rc = devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_BOARD_ID,
bp->board_partno);
if (rc)
return rc;
}
sprintf(buf, "%X", bp->chip_num); sprintf(buf, "%X", bp->chip_num);
rc = devlink_info_version_fixed_put(req, rc = devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_ASIC_ID, buf); DEVLINK_INFO_VERSION_GENERIC_ASIC_ID, buf);
...@@ -471,13 +479,19 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, ...@@ -471,13 +479,19 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
ver_resp->roce_fw_bld_8b, ver_resp->roce_fw_rsvd_8b); ver_resp->roce_fw_bld_8b, ver_resp->roce_fw_rsvd_8b);
} }
rc = devlink_info_version_running_put(req, rc = devlink_info_version_running_put(req,
DEVLINK_INFO_VERSION_GENERIC_FW_APP, fw_ver); DEVLINK_INFO_VERSION_GENERIC_FW_MGMT, fw_ver);
if (rc)
return rc;
rc = devlink_info_version_running_put(req,
DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API,
bp->hwrm_ver_supp);
if (rc) if (rc)
return rc; return rc;
if (!(bp->flags & BNXT_FLAG_CHIP_P5)) { if (!(bp->flags & BNXT_FLAG_CHIP_P5)) {
rc = devlink_info_version_running_put(req, rc = devlink_info_version_running_put(req,
DEVLINK_INFO_VERSION_GENERIC_FW_MGMT, mgmt_ver); DEVLINK_INFO_VERSION_GENERIC_FW_NCSI, mgmt_ver);
if (rc) if (rc)
return rc; return rc;
......
...@@ -2184,6 +2184,7 @@ int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask); ...@@ -2184,6 +2184,7 @@ int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask);
#define PCI_VPD_INFO_FLD_HDR_SIZE 3 #define PCI_VPD_INFO_FLD_HDR_SIZE 3
#define PCI_VPD_RO_KEYWORD_PARTNO "PN" #define PCI_VPD_RO_KEYWORD_PARTNO "PN"
#define PCI_VPD_RO_KEYWORD_SERIALNO "SN"
#define PCI_VPD_RO_KEYWORD_MFR_ID "MN" #define PCI_VPD_RO_KEYWORD_MFR_ID "MN"
#define PCI_VPD_RO_KEYWORD_VENDOR0 "V0" #define PCI_VPD_RO_KEYWORD_VENDOR0 "V0"
#define PCI_VPD_RO_KEYWORD_CHKSUM "RV" #define PCI_VPD_RO_KEYWORD_CHKSUM "RV"
......
...@@ -481,6 +481,8 @@ enum devlink_param_generic_id { ...@@ -481,6 +481,8 @@ enum devlink_param_generic_id {
#define DEVLINK_INFO_VERSION_GENERIC_FW "fw" #define DEVLINK_INFO_VERSION_GENERIC_FW "fw"
/* Control processor FW version */ /* Control processor FW version */
#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT "fw.mgmt" #define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT "fw.mgmt"
/* FW interface specification version */
#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API "fw.mgmt.api"
/* Data path microcode controlling high-speed packet processing */ /* Data path microcode controlling high-speed packet processing */
#define DEVLINK_INFO_VERSION_GENERIC_FW_APP "fw.app" #define DEVLINK_INFO_VERSION_GENERIC_FW_APP "fw.app"
/* UNDI software version */ /* UNDI software version */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment