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 | |
| 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')
| -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); |
