aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bnx2x
diff options
context:
space:
mode:
authorDmitry Kravkov <dmitry@broadcom.com>2011-06-13 21:33:25 -0400
committerDavid S. Miller <davem@conan.davemloft.net>2011-06-15 10:56:14 -0400
commit7a25cc7315e4d846cebbecd31bc4d79e7d2d6db3 (patch)
treede12b07dc43283ff94f29774a13a0f16bd5c0c94 /drivers/net/bnx2x
parent361c391e2339eb8d479feec9042ec6e822593350 (diff)
bnx2x: dump FW memory when appropriate msglvl is raised
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com> Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@conan.davemloft.net>
Diffstat (limited to 'drivers/net/bnx2x')
-rw-r--r--drivers/net/bnx2x/bnx2x_cmn.h2
-rw-r--r--drivers/net/bnx2x/bnx2x_ethtool.c6
-rw-r--r--drivers/net/bnx2x/bnx2x_main.c23
-rw-r--r--drivers/net/bnx2x/bnx2x_reg.h1
4 files changed, 26 insertions, 6 deletions
diff --git a/drivers/net/bnx2x/bnx2x_cmn.h b/drivers/net/bnx2x/bnx2x_cmn.h
index 19f8638ed516..ded8cf1e93fe 100644
--- a/drivers/net/bnx2x/bnx2x_cmn.h
+++ b/drivers/net/bnx2x/bnx2x_cmn.h
@@ -363,6 +363,8 @@ int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state);
363 */ 363 */
364void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value); 364void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value);
365 365
366void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl);
367
366/* dev_close main block */ 368/* dev_close main block */
367int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); 369int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode);
368 370
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c
index 2957353f7c2c..9526a320eaf2 100644
--- a/drivers/net/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/bnx2x/bnx2x_ethtool.c
@@ -704,8 +704,12 @@ static void bnx2x_set_msglevel(struct net_device *dev, u32 level)
704{ 704{
705 struct bnx2x *bp = netdev_priv(dev); 705 struct bnx2x *bp = netdev_priv(dev);
706 706
707 if (capable(CAP_NET_ADMIN)) 707 if (capable(CAP_NET_ADMIN)) {
708 /* dump MCP trace */
709 if (level & BNX2X_MSG_MCP)
710 bnx2x_fw_dump_lvl(bp, KERN_INFO);
708 bp->msg_enable = level; 711 bp->msg_enable = level;
712 }
709} 713}
710 714
711static int bnx2x_nway_reset(struct net_device *dev) 715static int bnx2x_nway_reset(struct net_device *dev)
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c
index 2b4b376a69fb..3c06b1400397 100644
--- a/drivers/net/bnx2x/bnx2x_main.c
+++ b/drivers/net/bnx2x/bnx2x_main.c
@@ -833,9 +833,9 @@ static int bnx2x_mc_assert(struct bnx2x *bp)
833 return rc; 833 return rc;
834} 834}
835 835
836static void bnx2x_fw_dump(struct bnx2x *bp) 836void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl)
837{ 837{
838 u32 addr; 838 u32 addr, val;
839 u32 mark, offset; 839 u32 mark, offset;
840 __be32 data[9]; 840 __be32 data[9];
841 int word; 841 int word;
@@ -844,6 +844,14 @@ static void bnx2x_fw_dump(struct bnx2x *bp)
844 BNX2X_ERR("NO MCP - can not dump\n"); 844 BNX2X_ERR("NO MCP - can not dump\n");
845 return; 845 return;
846 } 846 }
847 netdev_printk(lvl, bp->dev, "bc %d.%d.%d\n",
848 (bp->common.bc_ver & 0xff0000) >> 16,
849 (bp->common.bc_ver & 0xff00) >> 8,
850 (bp->common.bc_ver & 0xff));
851
852 val = REG_RD(bp, MCP_REG_MCPR_CPU_PROGRAM_COUNTER);
853 if (val == REG_RD(bp, MCP_REG_MCPR_CPU_PROGRAM_COUNTER))
854 printk("%s" "MCP PC at 0x%x\n", lvl, val);
847 855
848 if (BP_PATH(bp) == 0) 856 if (BP_PATH(bp) == 0)
849 trace_shmem_base = bp->common.shmem_base; 857 trace_shmem_base = bp->common.shmem_base;
@@ -853,9 +861,9 @@ static void bnx2x_fw_dump(struct bnx2x *bp)
853 mark = REG_RD(bp, addr); 861 mark = REG_RD(bp, addr);
854 mark = (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH) 862 mark = (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH)
855 + ((mark + 0x3) & ~0x3) - 0x08000000; 863 + ((mark + 0x3) & ~0x3) - 0x08000000;
856 pr_err("begin fw dump (mark 0x%x)\n", mark); 864 printk("%s" "begin fw dump (mark 0x%x)\n", lvl, mark);
857 865
858 pr_err(""); 866 printk("%s", lvl);
859 for (offset = mark; offset <= trace_shmem_base; offset += 0x8*4) { 867 for (offset = mark; offset <= trace_shmem_base; offset += 0x8*4) {
860 for (word = 0; word < 8; word++) 868 for (word = 0; word < 8; word++)
861 data[word] = htonl(REG_RD(bp, offset + 4*word)); 869 data[word] = htonl(REG_RD(bp, offset + 4*word));
@@ -868,7 +876,12 @@ static void bnx2x_fw_dump(struct bnx2x *bp)
868 data[8] = 0x0; 876 data[8] = 0x0;
869 pr_cont("%s", (char *)data); 877 pr_cont("%s", (char *)data);
870 } 878 }
871 pr_err("end of fw dump\n"); 879 printk("%s" "end of fw dump\n", lvl);
880}
881
882static inline void bnx2x_fw_dump(struct bnx2x *bp)
883{
884 bnx2x_fw_dump_lvl(bp, KERN_ERR);
872} 885}
873 886
874void bnx2x_panic_dump(struct bnx2x *bp) 887void bnx2x_panic_dump(struct bnx2x *bp)
diff --git a/drivers/net/bnx2x/bnx2x_reg.h b/drivers/net/bnx2x/bnx2x_reg.h
index 949e8bd73188..18ac2ab08f3d 100644
--- a/drivers/net/bnx2x/bnx2x_reg.h
+++ b/drivers/net/bnx2x/bnx2x_reg.h
@@ -933,6 +933,7 @@
933 * clear; 1 = set. Data valid only in addresses 0-4. all the rest are zero. */ 933 * clear; 1 = set. Data valid only in addresses 0-4. all the rest are zero. */
934#define IGU_REG_WRITE_DONE_PENDING 0x130480 934#define IGU_REG_WRITE_DONE_PENDING 0x130480
935#define MCP_A_REG_MCPR_SCRATCH 0x3a0000 935#define MCP_A_REG_MCPR_SCRATCH 0x3a0000
936#define MCP_REG_MCPR_CPU_PROGRAM_COUNTER 0x8501c
936#define MCP_REG_MCPR_NVM_ACCESS_ENABLE 0x86424 937#define MCP_REG_MCPR_NVM_ACCESS_ENABLE 0x86424
937#define MCP_REG_MCPR_NVM_ADDR 0x8640c 938#define MCP_REG_MCPR_NVM_ADDR 0x8640c
938#define MCP_REG_MCPR_NVM_CFG4 0x8642c 939#define MCP_REG_MCPR_NVM_CFG4 0x8642c