diff options
author | Venkat Duvvuru <venkatkumar.duvvuru@avagotech.com> | 2015-12-30 01:29:04 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-12-30 16:33:35 -0500 |
commit | fd7ff6f06a4eda894e309bf21c6f11fc86f08841 (patch) | |
tree | b054226c3a4a6bce08583bffc3aa022cd619d760 /drivers/net/ethernet/emulex/benet/be_ethtool.c | |
parent | 980df249bdab2adc8522d2178bfffceba79c5e6b (diff) |
be2net: support ethtool get-dump option
This patch adds support for ethtool's --get-dump option in be2net,
to retrieve FW dump. In the past when this option was not yet available,
this feature was supported via the --register-dump option as a workaround.
This patch removes support for FW-dump via --register-dump option as it is
now available via --get-dump option. Even though the
"ethtool --register-dump" cmd which used to work earlier, will now fail
with ENOTSUPP error, we feel it is not an issue as this is used only
for diagnostics purpose.
Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@avagotech.com>
Signed-off-by: Sathya Perla <sathya.perla@avagotech.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_ethtool.c')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 82 |
1 files changed, 52 insertions, 30 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c index d2a5baf019ab..a19ac441336f 100644 --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c | |||
@@ -250,6 +250,19 @@ static u32 lancer_cmd_get_file_len(struct be_adapter *adapter, u8 *file_name) | |||
250 | return data_read; | 250 | return data_read; |
251 | } | 251 | } |
252 | 252 | ||
253 | static int be_get_dump_len(struct be_adapter *adapter) | ||
254 | { | ||
255 | u32 dump_size = 0; | ||
256 | |||
257 | if (lancer_chip(adapter)) | ||
258 | dump_size = lancer_cmd_get_file_len(adapter, | ||
259 | LANCER_FW_DUMP_FILE); | ||
260 | else | ||
261 | dump_size = adapter->fat_dump_len; | ||
262 | |||
263 | return dump_size; | ||
264 | } | ||
265 | |||
253 | static int lancer_cmd_read_file(struct be_adapter *adapter, u8 *file_name, | 266 | static int lancer_cmd_read_file(struct be_adapter *adapter, u8 *file_name, |
254 | u32 buf_len, void *buf) | 267 | u32 buf_len, void *buf) |
255 | { | 268 | { |
@@ -291,37 +304,18 @@ static int lancer_cmd_read_file(struct be_adapter *adapter, u8 *file_name, | |||
291 | return status; | 304 | return status; |
292 | } | 305 | } |
293 | 306 | ||
294 | static int be_get_reg_len(struct net_device *netdev) | 307 | static int be_read_dump_data(struct be_adapter *adapter, u32 dump_len, |
308 | void *buf) | ||
295 | { | 309 | { |
296 | struct be_adapter *adapter = netdev_priv(netdev); | 310 | int status = 0; |
297 | u32 log_size = 0; | ||
298 | |||
299 | if (!check_privilege(adapter, MAX_PRIVILEGES)) | ||
300 | return 0; | ||
301 | |||
302 | if (be_physfn(adapter)) { | ||
303 | if (lancer_chip(adapter)) | ||
304 | log_size = lancer_cmd_get_file_len(adapter, | ||
305 | LANCER_FW_DUMP_FILE); | ||
306 | else | ||
307 | be_cmd_get_reg_len(adapter, &log_size); | ||
308 | } | ||
309 | return log_size; | ||
310 | } | ||
311 | 311 | ||
312 | static void | 312 | if (lancer_chip(adapter)) |
313 | be_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *buf) | 313 | status = lancer_cmd_read_file(adapter, LANCER_FW_DUMP_FILE, |
314 | { | 314 | dump_len, buf); |
315 | struct be_adapter *adapter = netdev_priv(netdev); | 315 | else |
316 | status = be_cmd_get_fat_dump(adapter, dump_len, buf); | ||
316 | 317 | ||
317 | if (be_physfn(adapter)) { | 318 | return status; |
318 | memset(buf, 0, regs->len); | ||
319 | if (lancer_chip(adapter)) | ||
320 | lancer_cmd_read_file(adapter, LANCER_FW_DUMP_FILE, | ||
321 | regs->len, buf); | ||
322 | else | ||
323 | be_cmd_get_regs(adapter, regs->len, buf); | ||
324 | } | ||
325 | } | 319 | } |
326 | 320 | ||
327 | static int be_get_coalesce(struct net_device *netdev, | 321 | static int be_get_coalesce(struct net_device *netdev, |
@@ -914,6 +908,34 @@ static int be_do_flash(struct net_device *netdev, struct ethtool_flash *efl) | |||
914 | return be_load_fw(adapter, efl->data); | 908 | return be_load_fw(adapter, efl->data); |
915 | } | 909 | } |
916 | 910 | ||
911 | static int | ||
912 | be_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump) | ||
913 | { | ||
914 | struct be_adapter *adapter = netdev_priv(netdev); | ||
915 | |||
916 | if (!check_privilege(adapter, MAX_PRIVILEGES)) | ||
917 | return -EOPNOTSUPP; | ||
918 | |||
919 | dump->len = be_get_dump_len(adapter); | ||
920 | dump->version = 1; | ||
921 | dump->flag = 0x1; /* FW dump is enabled */ | ||
922 | return 0; | ||
923 | } | ||
924 | |||
925 | static int | ||
926 | be_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump, | ||
927 | void *buf) | ||
928 | { | ||
929 | struct be_adapter *adapter = netdev_priv(netdev); | ||
930 | int status; | ||
931 | |||
932 | if (!check_privilege(adapter, MAX_PRIVILEGES)) | ||
933 | return -EOPNOTSUPP; | ||
934 | |||
935 | status = be_read_dump_data(adapter, dump->len, buf); | ||
936 | return be_cmd_status(status); | ||
937 | } | ||
938 | |||
917 | static int be_get_eeprom_len(struct net_device *netdev) | 939 | static int be_get_eeprom_len(struct net_device *netdev) |
918 | { | 940 | { |
919 | struct be_adapter *adapter = netdev_priv(netdev); | 941 | struct be_adapter *adapter = netdev_priv(netdev); |
@@ -1311,8 +1333,6 @@ const struct ethtool_ops be_ethtool_ops = { | |||
1311 | .set_msglevel = be_set_msg_level, | 1333 | .set_msglevel = be_set_msg_level, |
1312 | .get_sset_count = be_get_sset_count, | 1334 | .get_sset_count = be_get_sset_count, |
1313 | .get_ethtool_stats = be_get_ethtool_stats, | 1335 | .get_ethtool_stats = be_get_ethtool_stats, |
1314 | .get_regs_len = be_get_reg_len, | ||
1315 | .get_regs = be_get_regs, | ||
1316 | .flash_device = be_do_flash, | 1336 | .flash_device = be_do_flash, |
1317 | .self_test = be_self_test, | 1337 | .self_test = be_self_test, |
1318 | .get_rxnfc = be_get_rxnfc, | 1338 | .get_rxnfc = be_get_rxnfc, |
@@ -1321,6 +1341,8 @@ const struct ethtool_ops be_ethtool_ops = { | |||
1321 | .get_rxfh_key_size = be_get_rxfh_key_size, | 1341 | .get_rxfh_key_size = be_get_rxfh_key_size, |
1322 | .get_rxfh = be_get_rxfh, | 1342 | .get_rxfh = be_get_rxfh, |
1323 | .set_rxfh = be_set_rxfh, | 1343 | .set_rxfh = be_set_rxfh, |
1344 | .get_dump_flag = be_get_dump_flag, | ||
1345 | .get_dump_data = be_get_dump_data, | ||
1324 | .get_channels = be_get_channels, | 1346 | .get_channels = be_get_channels, |
1325 | .set_channels = be_set_channels, | 1347 | .set_channels = be_set_channels, |
1326 | .get_module_info = be_get_module_info, | 1348 | .get_module_info = be_get_module_info, |