diff options
author | Barak Witkowski <barak@broadcom.com> | 2012-12-01 23:05:46 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-02 20:22:59 -0500 |
commit | c55e771b7e6274f7e12d5bcaa8e7dec8a1e41c42 (patch) | |
tree | 1da507481c9b49e630440787a41508d478b5e043 /drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |
parent | d6d99a3f7e9169ef351340b217b48accab78e849 (diff) |
bnx2x: parity recovery flow enhancement
Parity recovery was enhanced in order to handle a few more corner cases.
Signed-off-by: Barak Witkowski <barak@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 5a22e19d2d98..62fcf0f0e72a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -8720,7 +8720,8 @@ static void bnx2x_reset_mcp_prep(struct bnx2x *bp, u32 *magic_val) | |||
8720 | 8720 | ||
8721 | /* Get shmem offset */ | 8721 | /* Get shmem offset */ |
8722 | shmem = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR); | 8722 | shmem = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR); |
8723 | validity_offset = offsetof(struct shmem_region, validity_map[0]); | 8723 | validity_offset = |
8724 | offsetof(struct shmem_region, validity_map[BP_PORT(bp)]); | ||
8724 | 8725 | ||
8725 | /* Clear validity map flags */ | 8726 | /* Clear validity map flags */ |
8726 | if (shmem > 0) | 8727 | if (shmem > 0) |
@@ -8813,7 +8814,11 @@ static void bnx2x_process_kill_chip_reset(struct bnx2x *bp, bool global) | |||
8813 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_CMN_CPU | | 8814 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_CMN_CPU | |
8814 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_CMN_CORE; | 8815 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_CMN_CORE; |
8815 | 8816 | ||
8816 | /* Don't reset the following blocks */ | 8817 | /* Don't reset the following blocks. |
8818 | * Important: per port blocks (such as EMAC, BMAC, UMAC) can't be | ||
8819 | * reset, as in 4 port device they might still be owned | ||
8820 | * by the MCP (there is only one leader per path). | ||
8821 | */ | ||
8817 | not_reset_mask1 = | 8822 | not_reset_mask1 = |
8818 | MISC_REGISTERS_RESET_REG_1_RST_HC | | 8823 | MISC_REGISTERS_RESET_REG_1_RST_HC | |
8819 | MISC_REGISTERS_RESET_REG_1_RST_PXPV | | 8824 | MISC_REGISTERS_RESET_REG_1_RST_PXPV | |
@@ -8829,19 +8834,19 @@ static void bnx2x_process_kill_chip_reset(struct bnx2x *bp, bool global) | |||
8829 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_REG_HARD_CORE | | 8834 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_REG_HARD_CORE | |
8830 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_HARD_CORE_RST_B | | 8835 | MISC_REGISTERS_RESET_REG_2_RST_MCP_N_HARD_CORE_RST_B | |
8831 | MISC_REGISTERS_RESET_REG_2_RST_ATC | | 8836 | MISC_REGISTERS_RESET_REG_2_RST_ATC | |
8832 | MISC_REGISTERS_RESET_REG_2_PGLC; | 8837 | MISC_REGISTERS_RESET_REG_2_PGLC | |
8838 | MISC_REGISTERS_RESET_REG_2_RST_BMAC0 | | ||
8839 | MISC_REGISTERS_RESET_REG_2_RST_BMAC1 | | ||
8840 | MISC_REGISTERS_RESET_REG_2_RST_EMAC0 | | ||
8841 | MISC_REGISTERS_RESET_REG_2_RST_EMAC1 | | ||
8842 | MISC_REGISTERS_RESET_REG_2_UMAC0 | | ||
8843 | MISC_REGISTERS_RESET_REG_2_UMAC1; | ||
8833 | 8844 | ||
8834 | /* | 8845 | /* |
8835 | * Keep the following blocks in reset: | 8846 | * Keep the following blocks in reset: |
8836 | * - all xxMACs are handled by the bnx2x_link code. | 8847 | * - all xxMACs are handled by the bnx2x_link code. |
8837 | */ | 8848 | */ |
8838 | stay_reset2 = | 8849 | stay_reset2 = |
8839 | MISC_REGISTERS_RESET_REG_2_RST_BMAC0 | | ||
8840 | MISC_REGISTERS_RESET_REG_2_RST_BMAC1 | | ||
8841 | MISC_REGISTERS_RESET_REG_2_RST_EMAC0 | | ||
8842 | MISC_REGISTERS_RESET_REG_2_RST_EMAC1 | | ||
8843 | MISC_REGISTERS_RESET_REG_2_UMAC0 | | ||
8844 | MISC_REGISTERS_RESET_REG_2_UMAC1 | | ||
8845 | MISC_REGISTERS_RESET_REG_2_XMAC | | 8850 | MISC_REGISTERS_RESET_REG_2_XMAC | |
8846 | MISC_REGISTERS_RESET_REG_2_XMAC_SOFT; | 8851 | MISC_REGISTERS_RESET_REG_2_XMAC_SOFT; |
8847 | 8852 | ||
@@ -8931,6 +8936,7 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global) | |||
8931 | int cnt = 1000; | 8936 | int cnt = 1000; |
8932 | u32 val = 0; | 8937 | u32 val = 0; |
8933 | u32 sr_cnt, blk_cnt, port_is_idle_0, port_is_idle_1, pgl_exp_rom2; | 8938 | u32 sr_cnt, blk_cnt, port_is_idle_0, port_is_idle_1, pgl_exp_rom2; |
8939 | u32 tags_63_32 = 0; | ||
8934 | 8940 | ||
8935 | 8941 | ||
8936 | /* Empty the Tetris buffer, wait for 1s */ | 8942 | /* Empty the Tetris buffer, wait for 1s */ |
@@ -8940,10 +8946,14 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global) | |||
8940 | port_is_idle_0 = REG_RD(bp, PXP2_REG_RD_PORT_IS_IDLE_0); | 8946 | port_is_idle_0 = REG_RD(bp, PXP2_REG_RD_PORT_IS_IDLE_0); |
8941 | port_is_idle_1 = REG_RD(bp, PXP2_REG_RD_PORT_IS_IDLE_1); | 8947 | port_is_idle_1 = REG_RD(bp, PXP2_REG_RD_PORT_IS_IDLE_1); |
8942 | pgl_exp_rom2 = REG_RD(bp, PXP2_REG_PGL_EXP_ROM2); | 8948 | pgl_exp_rom2 = REG_RD(bp, PXP2_REG_PGL_EXP_ROM2); |
8949 | if (CHIP_IS_E3(bp)) | ||
8950 | tags_63_32 = REG_RD(bp, PGLUE_B_REG_TAGS_63_32); | ||
8951 | |||
8943 | if ((sr_cnt == 0x7e) && (blk_cnt == 0xa0) && | 8952 | if ((sr_cnt == 0x7e) && (blk_cnt == 0xa0) && |
8944 | ((port_is_idle_0 & 0x1) == 0x1) && | 8953 | ((port_is_idle_0 & 0x1) == 0x1) && |
8945 | ((port_is_idle_1 & 0x1) == 0x1) && | 8954 | ((port_is_idle_1 & 0x1) == 0x1) && |
8946 | (pgl_exp_rom2 == 0xffffffff)) | 8955 | (pgl_exp_rom2 == 0xffffffff) && |
8956 | (!CHIP_IS_E3(bp) || (tags_63_32 == 0xffffffff))) | ||
8947 | break; | 8957 | break; |
8948 | usleep_range(1000, 1000); | 8958 | usleep_range(1000, 1000); |
8949 | } while (cnt-- > 0); | 8959 | } while (cnt-- > 0); |
@@ -9000,9 +9010,6 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global) | |||
9000 | 9010 | ||
9001 | /* TBD: Add resetting the NO_MCP mode DB here */ | 9011 | /* TBD: Add resetting the NO_MCP mode DB here */ |
9002 | 9012 | ||
9003 | /* PXP */ | ||
9004 | bnx2x_pxp_prep(bp); | ||
9005 | |||
9006 | /* Open the gates #2, #3 and #4 */ | 9013 | /* Open the gates #2, #3 and #4 */ |
9007 | bnx2x_set_234_gates(bp, false); | 9014 | bnx2x_set_234_gates(bp, false); |
9008 | 9015 | ||