aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet/be_ethtool.c
diff options
context:
space:
mode:
authorVenkat Duvvuru <venkatkumar.duvvuru@avagotech.com>2015-12-30 01:29:04 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-30 16:33:35 -0500
commitfd7ff6f06a4eda894e309bf21c6f11fc86f08841 (patch)
treeb054226c3a4a6bce08583bffc3aa022cd619d760 /drivers/net/ethernet/emulex/benet/be_ethtool.c
parent980df249bdab2adc8522d2178bfffceba79c5e6b (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.c82
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
253static 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
253static int lancer_cmd_read_file(struct be_adapter *adapter, u8 *file_name, 266static 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
294static int be_get_reg_len(struct net_device *netdev) 307static 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
312static void 312 if (lancer_chip(adapter))
313be_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
327static int be_get_coalesce(struct net_device *netdev, 321static 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
911static int
912be_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
925static int
926be_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
917static int be_get_eeprom_len(struct net_device *netdev) 939static 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,