cxgb4: Add support in cxgb4 to get expansion rom version via ethtool
authorHariprasad Shenai <hariprasad@chelsio.com>
Mon, 9 Feb 2015 06:37:30 +0000 (12:07 +0530)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Feb 2015 22:07:54 +0000 (14:07 -0800)
Add support to get option/expansion rom version flashed in the adapter via
ethtool getdrvinfo function.

Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h

index 0fe3a52fb0b8f5daf3315d1e1e4b498260670bd4..d6cda17efe6ef475a5579d8248e01a3158bbc272 100644 (file)
@@ -1121,6 +1121,7 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
 unsigned int t4_flash_cfg_addr(struct adapter *adapter);
 int t4_get_fw_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_prep_fw(struct adapter *adap, struct fw_info *fw_info,
               const u8 *fw_data, unsigned int fw_size,
               struct fw_hdr *card_fw, enum dev_state state, int *reset);
index 5db5b4f7b94d7ff29f86ba478cbdc7f75bf2e0e5..a22cf932ca3536920798ef50241fd9b43c26857a 100644 (file)
@@ -1419,6 +1419,7 @@ static int get_eeprom_len(struct net_device *dev)
 static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
        struct adapter *adapter = netdev2adap(dev);
+       u32 exprom_vers;
 
        strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
        strlcpy(info->version, DRV_VERSION, sizeof(info->version));
@@ -1436,6 +1437,14 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
                        FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers),
                        FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers),
                        FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers));
+
+       if (!t4_get_exprom_version(adapter, &exprom_vers))
+               snprintf(info->erom_version, sizeof(info->erom_version),
+                        "%u.%u.%u.%u",
+                        FW_HDR_FW_VER_MAJOR_G(exprom_vers),
+                        FW_HDR_FW_VER_MINOR_G(exprom_vers),
+                        FW_HDR_FW_VER_MICRO_G(exprom_vers),
+                        FW_HDR_FW_VER_BUILD_G(exprom_vers));
 }
 
 static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
index 2c13e8005319c2f244b6634db6a785d6a493d790..4d643b65265e8ee0ad12ed886cbb2b77b9d2557b 100644 (file)
@@ -948,6 +948,43 @@ int t4_get_tp_version(struct adapter *adapter, u32 *vers)
                             1, vers, 0);
 }
 
+/**
+ *     t4_get_exprom_version - return the Expansion ROM version (if any)
+ *     @adapter: the adapter
+ *     @vers: where to place the version
+ *
+ *     Reads the Expansion ROM header from FLASH and returns the version
+ *     number (if present) through the @vers return value pointer.  We return
+ *     this in the Firmware Version Format since it's convenient.  Return
+ *     0 on success, -ENOENT if no Expansion ROM is present.
+ */
+int t4_get_exprom_version(struct adapter *adap, u32 *vers)
+{
+       struct exprom_header {
+               unsigned char hdr_arr[16];      /* must start with 0x55aa */
+               unsigned char hdr_ver[4];       /* Expansion ROM version */
+       } *hdr;
+       u32 exprom_header_buf[DIV_ROUND_UP(sizeof(struct exprom_header),
+                                          sizeof(u32))];
+       int ret;
+
+       ret = t4_read_flash(adap, FLASH_EXP_ROM_START,
+                           ARRAY_SIZE(exprom_header_buf), exprom_header_buf,
+                           0);
+       if (ret)
+               return ret;
+
+       hdr = (struct exprom_header *)exprom_header_buf;
+       if (hdr->hdr_arr[0] != 0x55 || hdr->hdr_arr[1] != 0xaa)
+               return -ENOENT;
+
+       *vers = (FW_HDR_FW_VER_MAJOR_V(hdr->hdr_ver[0]) |
+                FW_HDR_FW_VER_MINOR_V(hdr->hdr_ver[1]) |
+                FW_HDR_FW_VER_MICRO_V(hdr->hdr_ver[2]) |
+                FW_HDR_FW_VER_BUILD_V(hdr->hdr_ver[3]));
+       return 0;
+}
+
 /* Is the given firmware API compatible with the one the driver was compiled
  * with?
  */
index 95fc425375c45815b9f9b789d4124c01f3eafab2..9b353a88cbdab13a7ce85456e393edf197dd1740 100644 (file)
@@ -3018,21 +3018,29 @@ enum fw_hdr_chip {
 
 #define FW_HDR_FW_VER_MAJOR_S  24
 #define FW_HDR_FW_VER_MAJOR_M  0xff
+#define FW_HDR_FW_VER_MAJOR_V(x) \
+       ((x) << FW_HDR_FW_VER_MAJOR_S)
 #define FW_HDR_FW_VER_MAJOR_G(x) \
        (((x) >> FW_HDR_FW_VER_MAJOR_S) & FW_HDR_FW_VER_MAJOR_M)
 
 #define FW_HDR_FW_VER_MINOR_S  16
 #define FW_HDR_FW_VER_MINOR_M  0xff
+#define FW_HDR_FW_VER_MINOR_V(x) \
+       ((x) << FW_HDR_FW_VER_MINOR_S)
 #define FW_HDR_FW_VER_MINOR_G(x) \
        (((x) >> FW_HDR_FW_VER_MINOR_S) & FW_HDR_FW_VER_MINOR_M)
 
 #define FW_HDR_FW_VER_MICRO_S  8
 #define FW_HDR_FW_VER_MICRO_M  0xff
+#define FW_HDR_FW_VER_MICRO_V(x) \
+       ((x) << FW_HDR_FW_VER_MICRO_S)
 #define FW_HDR_FW_VER_MICRO_G(x) \
        (((x) >> FW_HDR_FW_VER_MICRO_S) & FW_HDR_FW_VER_MICRO_M)
 
 #define FW_HDR_FW_VER_BUILD_S  0
 #define FW_HDR_FW_VER_BUILD_M  0xff
+#define FW_HDR_FW_VER_BUILD_V(x) \
+       ((x) << FW_HDR_FW_VER_BUILD_S)
 #define FW_HDR_FW_VER_BUILD_G(x) \
        (((x) >> FW_HDR_FW_VER_BUILD_S) & FW_HDR_FW_VER_BUILD_M)