diff options
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_cmn.h | 2 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_ethtool.c | 6 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 23 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_reg.h | 1 |
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 | */ |
| 364 | void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value); | 364 | void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value); |
| 365 | 365 | ||
| 366 | void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl); | ||
| 367 | |||
| 366 | /* dev_close main block */ | 368 | /* dev_close main block */ |
| 367 | int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); | 369 | int 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 | ||
| 711 | static int bnx2x_nway_reset(struct net_device *dev) | 715 | static 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 | ||
| 836 | static void bnx2x_fw_dump(struct bnx2x *bp) | 836 | void 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 | |||
| 882 | static inline void bnx2x_fw_dump(struct bnx2x *bp) | ||
| 883 | { | ||
| 884 | bnx2x_fw_dump_lvl(bp, KERN_ERR); | ||
| 872 | } | 885 | } |
| 873 | 886 | ||
| 874 | void bnx2x_panic_dump(struct bnx2x *bp) | 887 | void 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 |
