aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
diff options
context:
space:
mode:
authorBarak Witkowski <barak@broadcom.com>2012-12-01 23:05:46 -0500
committerDavid S. Miller <davem@davemloft.net>2012-12-02 20:22:59 -0500
commitc55e771b7e6274f7e12d5bcaa8e7dec8a1e41c42 (patch)
tree1da507481c9b49e630440787a41508d478b5e043 /drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
parentd6d99a3f7e9169ef351340b217b48accab78e849 (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.c33
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