aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-02-09 17:07:59 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-09 17:07:59 -0500
commitc4c655302c9134c75aa88f522ee33c493276f02c (patch)
tree6bf2ff90bfabc67fc37716e89d5ebc3d7df1ec00
parent46857b57710f7b2088186d4fdd378083799ba6a7 (diff)
parentba3f8cd55f2aaa734ba44d8dd8cfaa6503c83d63 (diff)
Merge branch 'expansion_rom'
Hariprasad Shenai says: ==================== Add support in ethtool to get expansion ROM version This series adds support to get expansion ROM version via ethtool getdrvinfo. PATCH 1/3 ("ethtool: rename reserved1 memeber in ethtool_drvinfo for expansion ROM version") is created against net-next tree. PATCH 2/3 ("cxgb4: Add support in cxgb4 to get expansion rom version via ethtool") is created against net-next tree. PATCH 3/3 ("ethtool: Add support to get expansion ROM version in ethtool getdrvinfo") is created against ethtool tree. We have included all the maintainers of respective trees. Kindly review the change and let us know in case of any review comments. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4.h1
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c9
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_hw.c37
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h8
-rw-r--r--include/uapi/linux/ethtool.h4
5 files changed, 58 insertions, 1 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 0fe3a52fb0b8..d6cda17efe6e 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -1121,6 +1121,7 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
1121unsigned int t4_flash_cfg_addr(struct adapter *adapter); 1121unsigned int t4_flash_cfg_addr(struct adapter *adapter);
1122int t4_get_fw_version(struct adapter *adapter, u32 *vers); 1122int t4_get_fw_version(struct adapter *adapter, u32 *vers);
1123int t4_get_tp_version(struct adapter *adapter, u32 *vers); 1123int t4_get_tp_version(struct adapter *adapter, u32 *vers);
1124int t4_get_exprom_version(struct adapter *adapter, u32 *vers);
1124int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info, 1125int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,
1125 const u8 *fw_data, unsigned int fw_size, 1126 const u8 *fw_data, unsigned int fw_size,
1126 struct fw_hdr *card_fw, enum dev_state state, int *reset); 1127 struct fw_hdr *card_fw, enum dev_state state, int *reset);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 5db5b4f7b94d..a22cf932ca35 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -1419,6 +1419,7 @@ static int get_eeprom_len(struct net_device *dev)
1419static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 1419static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1420{ 1420{
1421 struct adapter *adapter = netdev2adap(dev); 1421 struct adapter *adapter = netdev2adap(dev);
1422 u32 exprom_vers;
1422 1423
1423 strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver)); 1424 strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
1424 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 1425 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
@@ -1436,6 +1437,14 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1436 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers), 1437 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers),
1437 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers), 1438 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers),
1438 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers)); 1439 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers));
1440
1441 if (!t4_get_exprom_version(adapter, &exprom_vers))
1442 snprintf(info->erom_version, sizeof(info->erom_version),
1443 "%u.%u.%u.%u",
1444 FW_HDR_FW_VER_MAJOR_G(exprom_vers),
1445 FW_HDR_FW_VER_MINOR_G(exprom_vers),
1446 FW_HDR_FW_VER_MICRO_G(exprom_vers),
1447 FW_HDR_FW_VER_BUILD_G(exprom_vers));
1439} 1448}
1440 1449
1441static void get_strings(struct net_device *dev, u32 stringset, u8 *data) 1450static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
index 2c13e8005319..4d643b65265e 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
@@ -948,6 +948,43 @@ int t4_get_tp_version(struct adapter *adapter, u32 *vers)
948 1, vers, 0); 948 1, vers, 0);
949} 949}
950 950
951/**
952 * t4_get_exprom_version - return the Expansion ROM version (if any)
953 * @adapter: the adapter
954 * @vers: where to place the version
955 *
956 * Reads the Expansion ROM header from FLASH and returns the version
957 * number (if present) through the @vers return value pointer. We return
958 * this in the Firmware Version Format since it's convenient. Return
959 * 0 on success, -ENOENT if no Expansion ROM is present.
960 */
961int t4_get_exprom_version(struct adapter *adap, u32 *vers)
962{
963 struct exprom_header {
964 unsigned char hdr_arr[16]; /* must start with 0x55aa */
965 unsigned char hdr_ver[4]; /* Expansion ROM version */
966 } *hdr;
967 u32 exprom_header_buf[DIV_ROUND_UP(sizeof(struct exprom_header),
968 sizeof(u32))];
969 int ret;
970
971 ret = t4_read_flash(adap, FLASH_EXP_ROM_START,
972 ARRAY_SIZE(exprom_header_buf), exprom_header_buf,
973 0);
974 if (ret)
975 return ret;
976
977 hdr = (struct exprom_header *)exprom_header_buf;
978 if (hdr->hdr_arr[0] != 0x55 || hdr->hdr_arr[1] != 0xaa)
979 return -ENOENT;
980
981 *vers = (FW_HDR_FW_VER_MAJOR_V(hdr->hdr_ver[0]) |
982 FW_HDR_FW_VER_MINOR_V(hdr->hdr_ver[1]) |
983 FW_HDR_FW_VER_MICRO_V(hdr->hdr_ver[2]) |
984 FW_HDR_FW_VER_BUILD_V(hdr->hdr_ver[3]));
985 return 0;
986}
987
951/* Is the given firmware API compatible with the one the driver was compiled 988/* Is the given firmware API compatible with the one the driver was compiled
952 * with? 989 * with?
953 */ 990 */
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
index 95fc425375c4..9b353a88cbda 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
@@ -3018,21 +3018,29 @@ enum fw_hdr_chip {
3018 3018
3019#define FW_HDR_FW_VER_MAJOR_S 24 3019#define FW_HDR_FW_VER_MAJOR_S 24
3020#define FW_HDR_FW_VER_MAJOR_M 0xff 3020#define FW_HDR_FW_VER_MAJOR_M 0xff
3021#define FW_HDR_FW_VER_MAJOR_V(x) \
3022 ((x) << FW_HDR_FW_VER_MAJOR_S)
3021#define FW_HDR_FW_VER_MAJOR_G(x) \ 3023#define FW_HDR_FW_VER_MAJOR_G(x) \
3022 (((x) >> FW_HDR_FW_VER_MAJOR_S) & FW_HDR_FW_VER_MAJOR_M) 3024 (((x) >> FW_HDR_FW_VER_MAJOR_S) & FW_HDR_FW_VER_MAJOR_M)
3023 3025
3024#define FW_HDR_FW_VER_MINOR_S 16 3026#define FW_HDR_FW_VER_MINOR_S 16
3025#define FW_HDR_FW_VER_MINOR_M 0xff 3027#define FW_HDR_FW_VER_MINOR_M 0xff
3028#define FW_HDR_FW_VER_MINOR_V(x) \
3029 ((x) << FW_HDR_FW_VER_MINOR_S)
3026#define FW_HDR_FW_VER_MINOR_G(x) \ 3030#define FW_HDR_FW_VER_MINOR_G(x) \
3027 (((x) >> FW_HDR_FW_VER_MINOR_S) & FW_HDR_FW_VER_MINOR_M) 3031 (((x) >> FW_HDR_FW_VER_MINOR_S) & FW_HDR_FW_VER_MINOR_M)
3028 3032
3029#define FW_HDR_FW_VER_MICRO_S 8 3033#define FW_HDR_FW_VER_MICRO_S 8
3030#define FW_HDR_FW_VER_MICRO_M 0xff 3034#define FW_HDR_FW_VER_MICRO_M 0xff
3035#define FW_HDR_FW_VER_MICRO_V(x) \
3036 ((x) << FW_HDR_FW_VER_MICRO_S)
3031#define FW_HDR_FW_VER_MICRO_G(x) \ 3037#define FW_HDR_FW_VER_MICRO_G(x) \
3032 (((x) >> FW_HDR_FW_VER_MICRO_S) & FW_HDR_FW_VER_MICRO_M) 3038 (((x) >> FW_HDR_FW_VER_MICRO_S) & FW_HDR_FW_VER_MICRO_M)
3033 3039
3034#define FW_HDR_FW_VER_BUILD_S 0 3040#define FW_HDR_FW_VER_BUILD_S 0
3035#define FW_HDR_FW_VER_BUILD_M 0xff 3041#define FW_HDR_FW_VER_BUILD_M 0xff
3042#define FW_HDR_FW_VER_BUILD_V(x) \
3043 ((x) << FW_HDR_FW_VER_BUILD_S)
3036#define FW_HDR_FW_VER_BUILD_G(x) \ 3044#define FW_HDR_FW_VER_BUILD_G(x) \
3037 (((x) >> FW_HDR_FW_VER_BUILD_S) & FW_HDR_FW_VER_BUILD_M) 3045 (((x) >> FW_HDR_FW_VER_BUILD_S) & FW_HDR_FW_VER_BUILD_M)
3038 3046
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 5f66d9c2889d..2e49fc880d29 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -139,6 +139,7 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)
139 139
140#define ETHTOOL_FWVERS_LEN 32 140#define ETHTOOL_FWVERS_LEN 32
141#define ETHTOOL_BUSINFO_LEN 32 141#define ETHTOOL_BUSINFO_LEN 32
142#define ETHTOOL_EROMVERS_LEN 32
142 143
143/** 144/**
144 * struct ethtool_drvinfo - general driver and device information 145 * struct ethtool_drvinfo - general driver and device information
@@ -148,6 +149,7 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)
148 * not be an empty string. 149 * not be an empty string.
149 * @version: Driver version string; may be an empty string 150 * @version: Driver version string; may be an empty string
150 * @fw_version: Firmware version string; may be an empty string 151 * @fw_version: Firmware version string; may be an empty string
152 * @erom_version: Expansion ROM version string; may be an empty string
151 * @bus_info: Device bus address. This should match the dev_name() 153 * @bus_info: Device bus address. This should match the dev_name()
152 * string for the underlying bus device, if there is one. May be 154 * string for the underlying bus device, if there is one. May be
153 * an empty string. 155 * an empty string.
@@ -176,7 +178,7 @@ struct ethtool_drvinfo {
176 char version[32]; 178 char version[32];
177 char fw_version[ETHTOOL_FWVERS_LEN]; 179 char fw_version[ETHTOOL_FWVERS_LEN];
178 char bus_info[ETHTOOL_BUSINFO_LEN]; 180 char bus_info[ETHTOOL_BUSINFO_LEN];
179 char reserved1[32]; 181 char erom_version[ETHTOOL_EROMVERS_LEN];
180 char reserved2[12]; 182 char reserved2[12];
181 __u32 n_priv_flags; 183 __u32 n_priv_flags;
182 __u32 n_stats; 184 __u32 n_stats;