aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuval Mintz <yuvalmin@broadcom.com>2012-06-20 15:05:21 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-22 20:20:32 -0400
commita351d497f3367461fc96bf4cb9749bdb163c897e (patch)
tree0c3dd589c1b019f319dad49a0260e9d8b7909037
parent1440090111ad626c8ab3d3c10076254ab7d98777 (diff)
bnx2x: revised link register access
This is a semantic change, cleaning some sections in which the bnx2x handles the phy's registers. Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com> Signed-off-by: Yaniv Rosner <yaniv.rosner@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c238
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h5
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h1
3 files changed, 100 insertions, 144 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
index d38d269824fc..23ca0b642a8e 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
@@ -3754,44 +3754,35 @@ static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
3754static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, 3754static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3755 struct link_params *params, 3755 struct link_params *params,
3756 struct link_vars *vars) { 3756 struct link_vars *vars) {
3757 u16 val16 = 0, lane, bam37 = 0; 3757 u16 val16 = 0, lane, i;
3758 struct bnx2x *bp = params->bp; 3758 struct bnx2x *bp = params->bp;
3759 static struct bnx2x_reg_set reg_set[] = {
3760 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7},
3761 {MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0},
3762 {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0},
3763 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff},
3764 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555},
3765 {MDIO_PMA_DEVAD, MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0},
3766 {MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415},
3767 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190},
3768 /* Disable Autoneg: re-enable it after adv is done. */
3769 {MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0}
3770 };
3759 DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n"); 3771 DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n");
3760 /* Set to default registers that may be overriden by 10G force */ 3772 /* Set to default registers that may be overriden by 10G force */
3761 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3773 for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++)
3762 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7); 3774 bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,
3763 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3775 reg_set[i].val);
3764 MDIO_WC_REG_PAR_DET_10G_CTRL, 0);
3765 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3766 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0);
3767 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3768 MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff);
3769 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3770 MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555);
3771 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD,
3772 MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0);
3773 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3774 MDIO_WC_REG_RX66_CONTROL, 0x7415);
3775 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3776 MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190);
3777 /* Disable Autoneg: re-enable it after adv is done. */
3778 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3779 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0);
3780 3776
3781 /* Check adding advertisement for 1G KX */ 3777 /* Check adding advertisement for 1G KX */
3782 if (((vars->line_speed == SPEED_AUTO_NEG) && 3778 if (((vars->line_speed == SPEED_AUTO_NEG) &&
3783 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || 3779 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||
3784 (vars->line_speed == SPEED_1000)) { 3780 (vars->line_speed == SPEED_1000)) {
3785 u16 sd_digital; 3781 u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2;
3786 val16 |= (1<<5); 3782 val16 |= (1<<5);
3787 3783
3788 /* Enable CL37 1G Parallel Detect */ 3784 /* Enable CL37 1G Parallel Detect */
3789 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3785 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, addr, 0x1);
3790 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, &sd_digital);
3791 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3792 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2,
3793 (sd_digital | 0x1));
3794
3795 DP(NETIF_MSG_LINK, "Advertize 1G\n"); 3786 DP(NETIF_MSG_LINK, "Advertize 1G\n");
3796 } 3787 }
3797 if (((vars->line_speed == SPEED_AUTO_NEG) && 3788 if (((vars->line_speed == SPEED_AUTO_NEG) &&
@@ -3801,7 +3792,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3801 val16 |= (1<<7); 3792 val16 |= (1<<7);
3802 /* Enable 10G Parallel Detect */ 3793 /* Enable 10G Parallel Detect */
3803 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3794 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3804 MDIO_WC_REG_PAR_DET_10G_CTRL, 1); 3795 MDIO_WC_REG_PAR_DET_10G_CTRL, 1);
3805 3796
3806 DP(NETIF_MSG_LINK, "Advertize 10G\n"); 3797 DP(NETIF_MSG_LINK, "Advertize 10G\n");
3807 } 3798 }
@@ -3835,10 +3826,9 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3835 offsetof(struct shmem_region, dev_info. 3826 offsetof(struct shmem_region, dev_info.
3836 port_hw_config[params->port].default_cfg)) & 3827 port_hw_config[params->port].default_cfg)) &
3837 PORT_HW_CFG_ENABLE_BAM_ON_KR_ENABLED) { 3828 PORT_HW_CFG_ENABLE_BAM_ON_KR_ENABLED) {
3838 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3829 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
3839 MDIO_WC_REG_DIGITAL6_MP5_NEXTPAGECTRL, &bam37); 3830 MDIO_WC_REG_DIGITAL6_MP5_NEXTPAGECTRL,
3840 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3831 1);
3841 MDIO_WC_REG_DIGITAL6_MP5_NEXTPAGECTRL, bam37 | 1);
3842 DP(NETIF_MSG_LINK, "Enable CL37 BAM on KR\n"); 3832 DP(NETIF_MSG_LINK, "Enable CL37 BAM on KR\n");
3843 } 3833 }
3844 3834
@@ -3852,11 +3842,8 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3852 DP(NETIF_MSG_LINK, "Enable AN KR work-around\n"); 3842 DP(NETIF_MSG_LINK, "Enable AN KR work-around\n");
3853 vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY; 3843 vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY;
3854 } 3844 }
3855 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3845 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
3856 MDIO_WC_REG_DIGITAL5_MISC7, &val16); 3846 MDIO_WC_REG_DIGITAL5_MISC7, 0x100);
3857
3858 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3859 MDIO_WC_REG_DIGITAL5_MISC7, val16 | 0x100);
3860 3847
3861 /* Over 1G - AN local device user page 1 */ 3848 /* Over 1G - AN local device user page 1 */
3862 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3849 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
@@ -3873,50 +3860,35 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,
3873 struct link_vars *vars) 3860 struct link_vars *vars)
3874{ 3861{
3875 struct bnx2x *bp = params->bp; 3862 struct bnx2x *bp = params->bp;
3876 u16 val; 3863 u16 i;
3877 3864 static struct bnx2x_reg_set reg_set[] = {
3878 /* Disable Autoneg */ 3865 /* Disable Autoneg */
3879 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3866 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7},
3880 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7); 3867 {MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0},
3881 3868 {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL,
3882 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3869 0x3f00},
3883 MDIO_WC_REG_PAR_DET_10G_CTRL, 0); 3870 {MDIO_AN_DEVAD, MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0},
3884 3871 {MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0},
3885 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3872 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1},
3886 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0x3f00); 3873 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa},
3887 3874 /* Disable CL36 PCS Tx */
3888 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3875 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0x0},
3889 MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0); 3876 /* Double Wide Single Data Rate @ pll rate */
3890 3877 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0xFFFF},
3891 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3878 /* Leave cl72 training enable, needed for KR */
3892 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0); 3879 {MDIO_PMA_DEVAD,
3893
3894 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3895 MDIO_WC_REG_DIGITAL3_UP1, 0x1);
3896
3897 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3898 MDIO_WC_REG_DIGITAL5_MISC7, 0xa);
3899
3900 /* Disable CL36 PCS Tx */
3901 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3902 MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0x0);
3903
3904 /* Double Wide Single Data Rate @ pll rate */
3905 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3906 MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0xFFFF);
3907
3908 /* Leave cl72 training enable, needed for KR */
3909 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD,
3910 MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150, 3880 MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150,
3911 0x2); 3881 0x2}
3882 };
3883
3884 for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++)
3885 bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,
3886 reg_set[i].val);
3912 3887
3913 /* Leave CL72 enabled */ 3888 /* Leave CL72 enabled */
3914 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3889 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
3915 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 3890 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL,
3916 &val); 3891 0x3800);
3917 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3918 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL,
3919 val | 0x3800);
3920 3892
3921 /* Set speed via PMA/PMD register */ 3893 /* Set speed via PMA/PMD register */
3922 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 3894 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD,
@@ -3952,16 +3924,12 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,
3952 struct bnx2x *bp = params->bp; 3924 struct bnx2x *bp = params->bp;
3953 u16 misc1_val, tap_val, tx_driver_val, lane, val; 3925 u16 misc1_val, tap_val, tx_driver_val, lane, val;
3954 /* Hold rxSeqStart */ 3926 /* Hold rxSeqStart */
3955 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3927 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
3956 MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, &val); 3928 MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, 0x8000);
3957 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3958 MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, (val | 0x8000));
3959 3929
3960 /* Hold tx_fifo_reset */ 3930 /* Hold tx_fifo_reset */
3961 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3931 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
3962 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, &val); 3932 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, 0x1);
3963 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3964 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, (val | 0x1));
3965 3933
3966 /* Disable CL73 AN */ 3934 /* Disable CL73 AN */
3967 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0); 3935 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0);
@@ -3973,10 +3941,8 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,
3973 MDIO_WC_REG_FX100_CTRL1, (val & 0xFFFA)); 3941 MDIO_WC_REG_FX100_CTRL1, (val & 0xFFFA));
3974 3942
3975 /* Disable 100FX Idle detect */ 3943 /* Disable 100FX Idle detect */
3976 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3944 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
3977 MDIO_WC_REG_FX100_CTRL3, &val); 3945 MDIO_WC_REG_FX100_CTRL3, 0x0080);
3978 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3979 MDIO_WC_REG_FX100_CTRL3, (val | 0x0080));
3980 3946
3981 /* Set Block address to Remote PHY & Clear forced_speed[5] */ 3947 /* Set Block address to Remote PHY & Clear forced_speed[5] */
3982 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3948 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
@@ -4037,16 +4003,12 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,
4037 tx_driver_val); 4003 tx_driver_val);
4038 4004
4039 /* Enable fiber mode, enable and invert sig_det */ 4005 /* Enable fiber mode, enable and invert sig_det */
4040 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4006 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
4041 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, &val); 4007 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, 0xd);
4042 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4043 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, val | 0xd);
4044 4008
4045 /* Set Block address to Remote PHY & Set forced_speed[5], 40bit mode */ 4009 /* Set Block address to Remote PHY & Set forced_speed[5], 40bit mode */
4046 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4010 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
4047 MDIO_WC_REG_DIGITAL4_MISC3, &val); 4011 MDIO_WC_REG_DIGITAL4_MISC3, 0x8080);
4048 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4049 MDIO_WC_REG_DIGITAL4_MISC3, val | 0x8080);
4050 4012
4051 /* Enable LPI pass through */ 4013 /* Enable LPI pass through */
4052 DP(NETIF_MSG_LINK, "Configure WC for LPI pass through\n"); 4014 DP(NETIF_MSG_LINK, "Configure WC for LPI pass through\n");
@@ -4244,40 +4206,35 @@ static void bnx2x_warpcore_clear_regs(struct bnx2x_phy *phy,
4244 u16 lane) 4206 u16 lane)
4245{ 4207{
4246 struct bnx2x *bp = params->bp; 4208 struct bnx2x *bp = params->bp;
4247 u16 val16; 4209 u16 i;
4248 4210 static struct bnx2x_reg_set wc_regs[] = {
4211 {MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0},
4212 {MDIO_WC_DEVAD, MDIO_WC_REG_FX100_CTRL1, 0x014a},
4213 {MDIO_WC_DEVAD, MDIO_WC_REG_FX100_CTRL3, 0x0800},
4214 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL4_MISC3, 0x8008},
4215 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1,
4216 0x0195},
4217 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2,
4218 0x0007},
4219 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3,
4220 0x0002},
4221 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC1, 0x6000},
4222 {MDIO_WC_DEVAD, MDIO_WC_REG_TX_FIR_TAP, 0x0000},
4223 {MDIO_WC_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040},
4224 {MDIO_WC_DEVAD, MDIO_WC_REG_COMBO_IEEE0_MIICTRL, 0x0140}
4225 };
4249 /* Set XFI clock comp as default. */ 4226 /* Set XFI clock comp as default. */
4250 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4227 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
4251 MDIO_WC_REG_RX66_CONTROL, &val16); 4228 MDIO_WC_REG_RX66_CONTROL, (3<<13));
4252 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 4229
4253 MDIO_WC_REG_RX66_CONTROL, val16 | (3<<13)); 4230 for (i = 0; i < sizeof(wc_regs)/sizeof(struct bnx2x_reg_set); i++)
4231 bnx2x_cl45_write(bp, phy, wc_regs[i].devad, wc_regs[i].reg,
4232 wc_regs[i].val);
4254 4233
4255 bnx2x_warpcore_reset_lane(bp, phy, 1);
4256 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0);
4257 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4258 MDIO_WC_REG_FX100_CTRL1, 0x014a);
4259 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4260 MDIO_WC_REG_FX100_CTRL3, 0x0800);
4261 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4262 MDIO_WC_REG_DIGITAL4_MISC3, 0x8008);
4263 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4264 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, 0x0195);
4265 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4266 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x0007);
4267 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4268 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, 0x0002);
4269 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4270 MDIO_WC_REG_SERDESDIGITAL_MISC1, 0x6000);
4271 lane = bnx2x_get_warpcore_lane(phy, params); 4234 lane = bnx2x_get_warpcore_lane(phy, params);
4272 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 4235 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4273 MDIO_WC_REG_TX_FIR_TAP, 0x0000);
4274 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4275 MDIO_WC_REG_TX0_TX_DRIVER + 0x10*lane, 0x0990); 4236 MDIO_WC_REG_TX0_TX_DRIVER + 0x10*lane, 0x0990);
4276 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 4237
4277 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040);
4278 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4279 MDIO_WC_REG_COMBO_IEEE0_MIICTRL, 0x0140);
4280 bnx2x_warpcore_reset_lane(bp, phy, 0);
4281} 4238}
4282 4239
4283static int bnx2x_get_mod_abs_int_cfg(struct bnx2x *bp, 4240static int bnx2x_get_mod_abs_int_cfg(struct bnx2x *bp,
@@ -4605,12 +4562,9 @@ static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy,
4605 CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, 4562 CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK,
4606 MDIO_AER_BLOCK_AER_REG, 0); 4563 MDIO_AER_BLOCK_AER_REG, 0);
4607 /* Enable 1G MDIO (1-copy) */ 4564 /* Enable 1G MDIO (1-copy) */
4608 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4565 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
4609 MDIO_WC_REG_XGXSBLK0_XGXSCONTROL, 4566 MDIO_WC_REG_XGXSBLK0_XGXSCONTROL,
4610 &val16); 4567 0x10);
4611 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4612 MDIO_WC_REG_XGXSBLK0_XGXSCONTROL,
4613 val16 | 0x10);
4614 /* Set 1G loopback based on lane (1-copy) */ 4568 /* Set 1G loopback based on lane (1-copy) */
4615 lane = bnx2x_get_warpcore_lane(phy, params); 4569 lane = bnx2x_get_warpcore_lane(phy, params);
4616 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4570 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
@@ -4623,16 +4577,12 @@ static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy,
4623 bnx2x_set_aer_mmd(params, phy); 4577 bnx2x_set_aer_mmd(params, phy);
4624 } else { 4578 } else {
4625 /* 10G & 20G */ 4579 /* 10G & 20G */
4626 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4580 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
4627 MDIO_WC_REG_COMBO_IEEE0_MIICTRL, &val16); 4581 MDIO_WC_REG_COMBO_IEEE0_MIICTRL,
4628 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 4582 0x4000);
4629 MDIO_WC_REG_COMBO_IEEE0_MIICTRL, val16 |
4630 0x4000);
4631 4583
4632 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 4584 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
4633 MDIO_WC_REG_IEEE0BLK_MIICNTL, &val16); 4585 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1);
4634 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4635 MDIO_WC_REG_IEEE0BLK_MIICNTL, val16 | 0x1);
4636 } 4586 }
4637} 4587}
4638 4588
@@ -10819,7 +10769,7 @@ static u8 bnx2x_54618se_read_status(struct bnx2x_phy *phy,
10819 10769
10820 /* Get speed operation status */ 10770 /* Get speed operation status */
10821 bnx2x_cl22_read(bp, phy, 10771 bnx2x_cl22_read(bp, phy,
10822 0x19, 10772 MDIO_REG_GPHY_AUX_STATUS,
10823 &legacy_status); 10773 &legacy_status);
10824 DP(NETIF_MSG_LINK, "54618SE read_status: 0x%x\n", legacy_status); 10774 DP(NETIF_MSG_LINK, "54618SE read_status: 0x%x\n", legacy_status);
10825 10775
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
index cd1f2719b62d..7b6051bc4551 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
@@ -125,6 +125,11 @@ typedef void (*set_link_led_t)(struct bnx2x_phy *phy,
125 struct link_params *params, u8 mode); 125 struct link_params *params, u8 mode);
126typedef void (*phy_specific_func_t)(struct bnx2x_phy *phy, 126typedef void (*phy_specific_func_t)(struct bnx2x_phy *phy,
127 struct link_params *params, u32 action); 127 struct link_params *params, u32 action);
128struct bnx2x_reg_set {
129 u8 devad;
130 u16 reg;
131 u16 val;
132};
128 133
129struct bnx2x_phy { 134struct bnx2x_phy {
130 u32 type; 135 u32 type;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
index a78e35683b03..f371e3c06094 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
@@ -7160,6 +7160,7 @@ Theotherbitsarereservedandshouldbezero*/
7160#define MDIO_REG_GPHY_EEE_1G (0x1 << 2) 7160#define MDIO_REG_GPHY_EEE_1G (0x1 << 2)
7161#define MDIO_REG_GPHY_EEE_100 (0x1 << 1) 7161#define MDIO_REG_GPHY_EEE_100 (0x1 << 1)
7162#define MDIO_REG_GPHY_EEE_RESOLVED 0x803e 7162#define MDIO_REG_GPHY_EEE_RESOLVED 0x803e
7163#define MDIO_REG_GPHY_AUX_STATUS 0x19
7163#define MDIO_REG_INTR_STATUS 0x1a 7164#define MDIO_REG_INTR_STATUS 0x1a
7164#define MDIO_REG_INTR_MASK 0x1b 7165#define MDIO_REG_INTR_MASK 0x1b
7165#define MDIO_REG_INTR_MASK_LINK_STATUS (0x1 << 1) 7166#define MDIO_REG_INTR_MASK_LINK_STATUS (0x1 << 1)