diff options
author | Ron Mercer <ron.mercer@qlogic.com> | 2010-11-10 04:29:45 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-10 15:07:08 -0500 |
commit | 673483c7d3a25c43d1208bb07e3888bc5136e8cf (patch) | |
tree | 1035533779c2e9c16c02d37c26d769ff38de8803 /drivers/net | |
parent | 2af6fd8b18ceed416c9dfa675287c765aabf7d43 (diff) |
qlge: Add firmware info to ethtool get regs.
By default we add firmware information to ethtool get regs.
Optionally firmware info can instead be sent to log.
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/qlge/qlge.h | 2 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_dbg.c | 21 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_ethtool.c | 19 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_mpi.c | 2 |
4 files changed, 39 insertions, 5 deletions
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 22821398fc63..b1e815127cde 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
@@ -2221,6 +2221,7 @@ int ql_write_mpi_reg(struct ql_adapter *qdev, u32 reg, u32 data); | |||
2221 | int ql_unpause_mpi_risc(struct ql_adapter *qdev); | 2221 | int ql_unpause_mpi_risc(struct ql_adapter *qdev); |
2222 | int ql_pause_mpi_risc(struct ql_adapter *qdev); | 2222 | int ql_pause_mpi_risc(struct ql_adapter *qdev); |
2223 | int ql_hard_reset_mpi_risc(struct ql_adapter *qdev); | 2223 | int ql_hard_reset_mpi_risc(struct ql_adapter *qdev); |
2224 | int ql_soft_reset_mpi_risc(struct ql_adapter *qdev); | ||
2224 | int ql_dump_risc_ram_area(struct ql_adapter *qdev, void *buf, | 2225 | int ql_dump_risc_ram_area(struct ql_adapter *qdev, void *buf, |
2225 | u32 ram_addr, int word_count); | 2226 | u32 ram_addr, int word_count); |
2226 | int ql_core_dump(struct ql_adapter *qdev, | 2227 | int ql_core_dump(struct ql_adapter *qdev, |
@@ -2236,6 +2237,7 @@ int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control); | |||
2236 | int ql_mb_get_port_cfg(struct ql_adapter *qdev); | 2237 | int ql_mb_get_port_cfg(struct ql_adapter *qdev); |
2237 | int ql_mb_set_port_cfg(struct ql_adapter *qdev); | 2238 | int ql_mb_set_port_cfg(struct ql_adapter *qdev); |
2238 | int ql_wait_fifo_empty(struct ql_adapter *qdev); | 2239 | int ql_wait_fifo_empty(struct ql_adapter *qdev); |
2240 | void ql_get_dump(struct ql_adapter *qdev, void *buff); | ||
2239 | void ql_gen_reg_dump(struct ql_adapter *qdev, | 2241 | void ql_gen_reg_dump(struct ql_adapter *qdev, |
2240 | struct ql_reg_dump *mpi_coredump); | 2242 | struct ql_reg_dump *mpi_coredump); |
2241 | netdev_tx_t ql_lb_send(struct sk_buff *skb, struct net_device *ndev); | 2243 | netdev_tx_t ql_lb_send(struct sk_buff *skb, struct net_device *ndev); |
diff --git a/drivers/net/qlge/qlge_dbg.c b/drivers/net/qlge/qlge_dbg.c index 4747492935ef..fca804f36d61 100644 --- a/drivers/net/qlge/qlge_dbg.c +++ b/drivers/net/qlge/qlge_dbg.c | |||
@@ -1317,9 +1317,28 @@ void ql_gen_reg_dump(struct ql_adapter *qdev, | |||
1317 | status = ql_get_ets_regs(qdev, &mpi_coredump->ets[0]); | 1317 | status = ql_get_ets_regs(qdev, &mpi_coredump->ets[0]); |
1318 | if (status) | 1318 | if (status) |
1319 | return; | 1319 | return; |
1320 | } | ||
1321 | |||
1322 | void ql_get_dump(struct ql_adapter *qdev, void *buff) | ||
1323 | { | ||
1324 | /* | ||
1325 | * If the dump has already been taken and is stored | ||
1326 | * in our internal buffer and if force dump is set then | ||
1327 | * just start the spool to dump it to the log file | ||
1328 | * and also, take a snapshot of the general regs to | ||
1329 | * to the user's buffer or else take complete dump | ||
1330 | * to the user's buffer if force is not set. | ||
1331 | */ | ||
1320 | 1332 | ||
1321 | if (test_bit(QL_FRC_COREDUMP, &qdev->flags)) | 1333 | if (!test_bit(QL_FRC_COREDUMP, &qdev->flags)) { |
1334 | if (!ql_core_dump(qdev, buff)) | ||
1335 | ql_soft_reset_mpi_risc(qdev); | ||
1336 | else | ||
1337 | netif_err(qdev, drv, qdev->ndev, "coredump failed!\n"); | ||
1338 | } else { | ||
1339 | ql_gen_reg_dump(qdev, buff); | ||
1322 | ql_get_core_dump(qdev); | 1340 | ql_get_core_dump(qdev); |
1341 | } | ||
1323 | } | 1342 | } |
1324 | 1343 | ||
1325 | /* Coredump to messages log file using separate worker thread */ | 1344 | /* Coredump to messages log file using separate worker thread */ |
diff --git a/drivers/net/qlge/qlge_ethtool.c b/drivers/net/qlge/qlge_ethtool.c index 4892d64f4e05..8149cc9de4ca 100644 --- a/drivers/net/qlge/qlge_ethtool.c +++ b/drivers/net/qlge/qlge_ethtool.c | |||
@@ -375,7 +375,10 @@ static void ql_get_drvinfo(struct net_device *ndev, | |||
375 | strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32); | 375 | strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32); |
376 | drvinfo->n_stats = 0; | 376 | drvinfo->n_stats = 0; |
377 | drvinfo->testinfo_len = 0; | 377 | drvinfo->testinfo_len = 0; |
378 | drvinfo->regdump_len = 0; | 378 | if (!test_bit(QL_FRC_COREDUMP, &qdev->flags)) |
379 | drvinfo->regdump_len = sizeof(struct ql_mpi_coredump); | ||
380 | else | ||
381 | drvinfo->regdump_len = sizeof(struct ql_reg_dump); | ||
379 | drvinfo->eedump_len = 0; | 382 | drvinfo->eedump_len = 0; |
380 | } | 383 | } |
381 | 384 | ||
@@ -547,7 +550,12 @@ static void ql_self_test(struct net_device *ndev, | |||
547 | 550 | ||
548 | static int ql_get_regs_len(struct net_device *ndev) | 551 | static int ql_get_regs_len(struct net_device *ndev) |
549 | { | 552 | { |
550 | return sizeof(struct ql_reg_dump); | 553 | struct ql_adapter *qdev = netdev_priv(ndev); |
554 | |||
555 | if (!test_bit(QL_FRC_COREDUMP, &qdev->flags)) | ||
556 | return sizeof(struct ql_mpi_coredump); | ||
557 | else | ||
558 | return sizeof(struct ql_reg_dump); | ||
551 | } | 559 | } |
552 | 560 | ||
553 | static void ql_get_regs(struct net_device *ndev, | 561 | static void ql_get_regs(struct net_device *ndev, |
@@ -555,7 +563,12 @@ static void ql_get_regs(struct net_device *ndev, | |||
555 | { | 563 | { |
556 | struct ql_adapter *qdev = netdev_priv(ndev); | 564 | struct ql_adapter *qdev = netdev_priv(ndev); |
557 | 565 | ||
558 | ql_gen_reg_dump(qdev, p); | 566 | ql_get_dump(qdev, p); |
567 | qdev->core_is_dumped = 0; | ||
568 | if (!test_bit(QL_FRC_COREDUMP, &qdev->flags)) | ||
569 | regs->len = sizeof(struct ql_mpi_coredump); | ||
570 | else | ||
571 | regs->len = sizeof(struct ql_reg_dump); | ||
559 | } | 572 | } |
560 | 573 | ||
561 | static int ql_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) | 574 | static int ql_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) |
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index 0e7c7c7ee164..100a462cc916 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
@@ -87,7 +87,7 @@ exit: | |||
87 | return status; | 87 | return status; |
88 | } | 88 | } |
89 | 89 | ||
90 | static int ql_soft_reset_mpi_risc(struct ql_adapter *qdev) | 90 | int ql_soft_reset_mpi_risc(struct ql_adapter *qdev) |
91 | { | 91 | { |
92 | int status; | 92 | int status; |
93 | status = ql_write_mpi_reg(qdev, 0x00001010, 1); | 93 | status = ql_write_mpi_reg(qdev, 0x00001010, 1); |