Author: np
Date: Sat Aug 27 00:13:41 2016
New Revision: 304873
URL: https://svnweb.freebsd.org/changeset/base/304873

Log:
  cxgbe(4): Provide more details about the card in the sysctl MIB.
  
  dev.t5nex.0.%desc: Chelsio T580-CR
  dev.t5nex.0.hw_revision: 1
  dev.t5nex.0.sn: PT13140042
  dev.t5nex.0.pn: 110117150A0
  dev.t5nex.0.ec: 0000000000000000
  dev.t5nex.0.na: 0007432AF490
  dev.t5nex.0.vpd_version: 3
  dev.t5nex.0.scfg_version: 53255
  dev.t5nex.0.bs_version: 1.1.0.0
  dev.t5nex.0.er_version: 1.0.0.68
  dev.t5nex.0.tp_version: 0.1.4.9
  dev.t5nex.0.firmware_version: 1.16.2.0
  
  Sponsored by: Chelsio Communications

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/common/common.h
  head/sys/dev/cxgbe/common/t4_hw.c
  head/sys/dev/cxgbe/firmware/t4fw_interface.h
  head/sys/dev/cxgbe/t4_main.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Sat Aug 27 00:07:48 2016        
(r304872)
+++ head/sys/dev/cxgbe/adapter.h        Sat Aug 27 00:13:41 2016        
(r304873)
@@ -821,7 +821,8 @@ struct adapter {
 
        char fw_version[16];
        char tp_version[16];
-       char exprom_version[16];
+       char er_version[16];
+       char bs_version[16];
        char cfg_file[32];
        u_int cfcsum;
        struct adapter_params params;

Modified: head/sys/dev/cxgbe/common/common.h
==============================================================================
--- head/sys/dev/cxgbe/common/common.h  Sat Aug 27 00:07:48 2016        
(r304872)
+++ head/sys/dev/cxgbe/common/common.h  Sat Aug 27 00:13:41 2016        
(r304873)
@@ -330,9 +330,12 @@ struct adapter_params {
        unsigned int sf_size;             /* serial flash size in bytes */
        unsigned int sf_nsec;             /* # of flash sectors */
 
-       unsigned int fw_vers;
-       unsigned int tp_vers;
-       unsigned int exprom_vers;
+       unsigned int fw_vers;           /* firmware version */
+       unsigned int bs_vers;           /* bootstrap version */
+       unsigned int tp_vers;           /* TP microcode version */
+       unsigned int er_vers;           /* expansion ROM version */
+       unsigned int scfg_vers;         /* Serial Configuration version */
+       unsigned int vpd_vers;          /* VPD version */
 
        unsigned short mtus[NMTUS];
        unsigned short a_wnd[NCCTRL_WIN];
@@ -548,8 +551,12 @@ int t4_flash_erase_sectors(struct adapte
 int t4_flash_cfg_addr(struct adapter *adapter);
 int t4_load_cfg(struct adapter *adapter, const u8 *cfg_data, unsigned int 
size);
 int t4_get_fw_version(struct adapter *adapter, u32 *vers);
+int t4_get_bs_version(struct adapter *adapter, u32 *vers);
 int t4_get_tp_version(struct adapter *adapter, u32 *vers);
 int t4_get_exprom_version(struct adapter *adapter, u32 *vers);
+int t4_get_scfg_version(struct adapter *adapter, u32 *vers);
+int t4_get_vpd_version(struct adapter *adapter, u32 *vers);
+int t4_get_version_info(struct adapter *adapter);
 int t4_init_hw(struct adapter *adapter, u32 fw_params);
 int t4_prep_adapter(struct adapter *adapter, u8 *buf);
 int t4_shutdown_adapter(struct adapter *adapter);

Modified: head/sys/dev/cxgbe/common/t4_hw.c
==============================================================================
--- head/sys/dev/cxgbe/common/t4_hw.c   Sat Aug 27 00:07:48 2016        
(r304872)
+++ head/sys/dev/cxgbe/common/t4_hw.c   Sat Aug 27 00:13:41 2016        
(r304873)
@@ -3234,6 +3234,20 @@ int t4_get_fw_version(struct adapter *ad
 }
 
 /**
+ *     t4_get_bs_version - read the firmware bootstrap version
+ *     @adapter: the adapter
+ *     @vers: where to place the version
+ *
+ *     Reads the FW Bootstrap version from flash.
+ */
+int t4_get_bs_version(struct adapter *adapter, u32 *vers)
+{
+       return t4_read_flash(adapter, FLASH_FWBOOTSTRAP_START +
+                            offsetof(struct fw_hdr, fw_ver), 1,
+                            vers, 0);
+}
+
+/**
  *     t4_get_tp_version - read the TP microcode version
  *     @adapter: the adapter
  *     @vers: where to place the version
@@ -3285,6 +3299,110 @@ int t4_get_exprom_version(struct adapter
 }
 
 /**
+ *     t4_get_scfg_version - return the Serial Configuration version
+ *     @adapter: the adapter
+ *     @vers: where to place the version
+ *
+ *     Reads the Serial Configuration Version via the Firmware interface
+ *     (thus this can only be called once we're ready to issue Firmware
+ *     commands).  The format of the Serial Configuration version is
+ *     adapter specific.  Returns 0 on success, an error on failure.
+ *
+ *     Note that early versions of the Firmware didn't include the ability
+ *     to retrieve the Serial Configuration version, so we zero-out the
+ *     return-value parameter in that case to avoid leaving it with
+ *     garbage in it.
+ *
+ *     Also note that the Firmware will return its cached copy of the Serial
+ *     Initialization Revision ID, not the actual Revision ID as written in
+ *     the Serial EEPROM.  This is only an issue if a new VPD has been written
+ *     and the Firmware/Chip haven't yet gone through a RESET sequence.  So
+ *     it's best to defer calling this routine till after a FW_RESET_CMD has
+ *     been issued if the Host Driver will be performing a full adapter
+ *     initialization.
+ */
+int t4_get_scfg_version(struct adapter *adapter, u32 *vers)
+{
+       u32 scfgrev_param;
+       int ret;
+
+       scfgrev_param = (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
+                        V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_SCFGREV));
+       ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
+                             1, &scfgrev_param, vers);
+       if (ret)
+               *vers = 0;
+       return ret;
+}
+
+/**
+ *     t4_get_vpd_version - return the VPD version
+ *     @adapter: the adapter
+ *     @vers: where to place the version
+ *
+ *     Reads the VPD via the Firmware interface (thus this can only be called
+ *     once we're ready to issue Firmware commands).  The format of the
+ *     VPD version is adapter specific.  Returns 0 on success, an error on
+ *     failure.
+ *
+ *     Note that early versions of the Firmware didn't include the ability
+ *     to retrieve the VPD version, so we zero-out the return-value parameter
+ *     in that case to avoid leaving it with garbage in it.
+ *
+ *     Also note that the Firmware will return its cached copy of the VPD
+ *     Revision ID, not the actual Revision ID as written in the Serial
+ *     EEPROM.  This is only an issue if a new VPD has been written and the
+ *     Firmware/Chip haven't yet gone through a RESET sequence.  So it's best
+ *     to defer calling this routine till after a FW_RESET_CMD has been issued
+ *     if the Host Driver will be performing a full adapter initialization.
+ */
+int t4_get_vpd_version(struct adapter *adapter, u32 *vers)
+{
+       u32 vpdrev_param;
+       int ret;
+
+       vpdrev_param = (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
+                       V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_VPDREV));
+       ret = t4_query_params(adapter, adapter->mbox, adapter->pf, 0,
+                             1, &vpdrev_param, vers);
+       if (ret)
+               *vers = 0;
+       return ret;
+}
+
+/**
+ *     t4_get_version_info - extract various chip/firmware version information
+ *     @adapter: the adapter
+ *
+ *     Reads various chip/firmware version numbers and stores them into the
+ *     adapter Adapter Parameters structure.  If any of the efforts fails
+ *     the first failure will be returned, but all of the version numbers
+ *     will be read.
+ */
+int t4_get_version_info(struct adapter *adapter)
+{
+       int ret = 0;
+
+       #define FIRST_RET(__getvinfo) \
+       do { \
+               int __ret = __getvinfo; \
+               if (__ret && !ret) \
+                       ret = __ret; \
+       } while (0)
+
+       FIRST_RET(t4_get_fw_version(adapter, &adapter->params.fw_vers));
+       FIRST_RET(t4_get_bs_version(adapter, &adapter->params.bs_vers));
+       FIRST_RET(t4_get_tp_version(adapter, &adapter->params.tp_vers));
+       FIRST_RET(t4_get_exprom_version(adapter, &adapter->params.er_vers));
+       FIRST_RET(t4_get_scfg_version(adapter, &adapter->params.scfg_vers));
+       FIRST_RET(t4_get_vpd_version(adapter, &adapter->params.vpd_vers));
+
+       #undef FIRST_RET
+
+       return ret;
+}
+
+/**
  *     t4_flash_erase_sectors - erase a range of flash sectors
  *     @adapter: the adapter
  *     @start: the first sector to erase

Modified: head/sys/dev/cxgbe/firmware/t4fw_interface.h
==============================================================================
--- head/sys/dev/cxgbe/firmware/t4fw_interface.h        Sat Aug 27 00:07:48 
2016        (r304872)
+++ head/sys/dev/cxgbe/firmware/t4fw_interface.h        Sat Aug 27 00:13:41 
2016        (r304873)
@@ -4206,6 +4206,8 @@ enum fw_params_param_dev {
        FW_PARAMS_PARAM_DEV_ULPTX_MEMWRITE_DSGL = 0x17,
        FW_PARAMS_PARAM_DEV_FWCACHE     = 0x18,
        FW_PARAMS_PARAM_DEV_RSSINFO     = 0x19,
+       FW_PARAMS_PARAM_DEV_SCFGREV     = 0x1A,
+       FW_PARAMS_PARAM_DEV_VPDREV      = 0x1B,
 };
 
 /*

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Sat Aug 27 00:07:48 2016        
(r304872)
+++ head/sys/dev/cxgbe/t4_main.c        Sat Aug 27 00:13:41 2016        
(r304873)
@@ -2882,32 +2882,6 @@ prep_firmware(struct adapter *sc)
                goto done;
        }
 
-       /* We're using whatever's on the card and it's known to be good. */
-       sc->params.fw_vers = ntohl(card_fw->fw_ver);
-       snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u",
-           G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
-           G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
-           G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
-           G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers));
-
-       t4_get_tp_version(sc, &sc->params.tp_vers);
-       snprintf(sc->tp_version, sizeof(sc->tp_version), "%u.%u.%u.%u",
-           G_FW_HDR_FW_VER_MAJOR(sc->params.tp_vers),
-           G_FW_HDR_FW_VER_MINOR(sc->params.tp_vers),
-           G_FW_HDR_FW_VER_MICRO(sc->params.tp_vers),
-           G_FW_HDR_FW_VER_BUILD(sc->params.tp_vers));
-
-       if (t4_get_exprom_version(sc, &sc->params.exprom_vers) != 0)
-               sc->params.exprom_vers = 0;
-       else {
-               snprintf(sc->exprom_version, sizeof(sc->exprom_version),
-                   "%u.%u.%u.%u",
-                   G_FW_HDR_FW_VER_MAJOR(sc->params.exprom_vers),
-                   G_FW_HDR_FW_VER_MINOR(sc->params.exprom_vers),
-                   G_FW_HDR_FW_VER_MICRO(sc->params.exprom_vers),
-                   G_FW_HDR_FW_VER_BUILD(sc->params.exprom_vers));
-       }
-
        /* Reset device */
        if (need_fw_reset &&
            (rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST)) != 0) {
@@ -3152,6 +3126,32 @@ get_params__pre_init(struct adapter *sc)
        int rc;
        uint32_t param[2], val[2];
 
+       t4_get_version_info(sc);
+
+       snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u",
+           G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
+           G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
+           G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
+           G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers));
+
+       snprintf(sc->bs_version, sizeof(sc->bs_version), "%u.%u.%u.%u",
+           G_FW_HDR_FW_VER_MAJOR(sc->params.bs_vers),
+           G_FW_HDR_FW_VER_MINOR(sc->params.bs_vers),
+           G_FW_HDR_FW_VER_MICRO(sc->params.bs_vers),
+           G_FW_HDR_FW_VER_BUILD(sc->params.bs_vers));
+
+       snprintf(sc->tp_version, sizeof(sc->tp_version), "%u.%u.%u.%u",
+           G_FW_HDR_FW_VER_MAJOR(sc->params.tp_vers),
+           G_FW_HDR_FW_VER_MINOR(sc->params.tp_vers),
+           G_FW_HDR_FW_VER_MICRO(sc->params.tp_vers),
+           G_FW_HDR_FW_VER_BUILD(sc->params.tp_vers));
+
+       snprintf(sc->er_version, sizeof(sc->er_version), "%u.%u.%u.%u",
+           G_FW_HDR_FW_VER_MAJOR(sc->params.er_vers),
+           G_FW_HDR_FW_VER_MINOR(sc->params.er_vers),
+           G_FW_HDR_FW_VER_MICRO(sc->params.er_vers),
+           G_FW_HDR_FW_VER_BUILD(sc->params.er_vers));
+
        param[0] = FW_PARAM_DEV(PORTVEC);
        param[1] = FW_PARAM_DEV(CCLK);
        rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
@@ -3365,9 +3365,7 @@ t4_set_desc(struct adapter *sc)
        char buf[128];
        struct adapter_params *p = &sc->params;
 
-       snprintf(buf, sizeof(buf), "Chelsio %s %sNIC (rev %d), S/N:%s, "
-           "P/N:%s, E/C:%s", p->vpd.id, is_offload(sc) ? "R" : "",
-           chip_rev(sc), p->vpd.sn, p->vpd.pn, p->vpd.ec);
+       snprintf(buf, sizeof(buf), "Chelsio %s", p->vpd.id);
 
        device_set_desc_copy(sc->dev, buf);
 }
@@ -4621,17 +4619,36 @@ t4_sysctls(struct adapter *sc)
        SYSCTL_ADD_INT(ctx, children, OID_AUTO, "hw_revision", CTLFLAG_RD,
            NULL, chip_rev(sc), "chip hardware revision");
 
+       SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "sn",
+           CTLFLAG_RD, sc->params.vpd.sn, 0, "serial number");
+
+       SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "pn",
+           CTLFLAG_RD, sc->params.vpd.pn, 0, "part number");
+
+       SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "ec",
+           CTLFLAG_RD, sc->params.vpd.ec, 0, "engineering change");
+
+       SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "na",
+           CTLFLAG_RD, sc->params.vpd.na, 0, "network address");
+
        SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "tp_version",
            CTLFLAG_RD, sc->tp_version, 0, "TP microcode version");
 
-       if (sc->params.exprom_vers != 0) {
-               SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "exprom_version",
-                   CTLFLAG_RD, sc->exprom_version, 0, "expansion ROM version");
-       }
+       SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "er_version", CTLFLAG_RD,
+           sc->er_version, 0, "expansion ROM version");
 
        SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "firmware_version",
            CTLFLAG_RD, sc->fw_version, 0, "firmware version");
 
+       SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "bs_version", CTLFLAG_RD,
+           sc->bs_version, 0, "bootstrap firmware version");
+
+       SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "scfg_version", CTLFLAG_RD,
+           NULL, sc->params.scfg_vers, "serial config version");
+
+       SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "vpd_version", CTLFLAG_RD,
+           NULL, sc->params.vpd_vers, "VPD version");
+
        SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "cf",
            CTLFLAG_RD, sc->cfg_file, 0, "configuration file");
 
@@ -4641,7 +4658,7 @@ t4_sysctls(struct adapter *sc)
 #define SYSCTL_CAP(name, n, text) \
        SYSCTL_ADD_PROC(ctx, children, OID_AUTO, #name, \
            CTLTYPE_STRING | CTLFLAG_RD, caps_decoder[n], sc->name, \
-           sysctl_bitfield, "A", "available " text "capabilities")
+           sysctl_bitfield, "A", "available " text " capabilities")
 
        SYSCTL_CAP(nbmcaps, 0, "NBM");
        SYSCTL_CAP(linkcaps, 1, "link");
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to