diff options
author | Yuval Mintz <yuvalmin@broadcom.com> | 2012-06-20 15:05:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-22 20:20:32 -0400 |
commit | a351d497f3367461fc96bf4cb9749bdb163c897e (patch) | |
tree | 0c3dd589c1b019f319dad49a0260e9d8b7909037 | |
parent | 1440090111ad626c8ab3d3c10076254ab7d98777 (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.c | 238 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | 1 |
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, | |||
3754 | static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | 3754 | static 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 | ||
4283 | static int bnx2x_get_mod_abs_int_cfg(struct bnx2x *bp, | 4240 | static 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); |
126 | typedef void (*phy_specific_func_t)(struct bnx2x_phy *phy, | 126 | typedef void (*phy_specific_func_t)(struct bnx2x_phy *phy, |
127 | struct link_params *params, u32 action); | 127 | struct link_params *params, u32 action); |
128 | struct bnx2x_reg_set { | ||
129 | u8 devad; | ||
130 | u16 reg; | ||
131 | u16 val; | ||
132 | }; | ||
128 | 133 | ||
129 | struct bnx2x_phy { | 134 | struct 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) |