aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2014-11-11 17:55:13 -0500
committerDavid S. Miller <davem@davemloft.net>2014-11-12 13:58:06 -0500
commita490631fa61795638c0a0df1bc1ac7185cd41c3b (patch)
tree0f57f447aada1894251cd8e5cd72e8d1c8dbdada
parent9c41f2baa90b95c13007fd9617d5a0251b68968b (diff)
net: phy: bcm7xxx: add PHY revision D0 workaround sequence
PHY revision D0 requires a specific workaround sequence which needs to be applied to get the HW to behave properly in all corner cases conditions. Do this based on the revision we just read out of the HW using a specific function. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/bcm7xxx.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c
index 0ac78d0db9b5..095cfc92326e 100644
--- a/drivers/net/phy/bcm7xxx.c
+++ b/drivers/net/phy/bcm7xxx.c
@@ -39,8 +39,11 @@
39 39
40#define AFE_RXCONFIG_0 MISC_ADDR(0x38, 0) 40#define AFE_RXCONFIG_0 MISC_ADDR(0x38, 0)
41#define AFE_RXCONFIG_1 MISC_ADDR(0x38, 1) 41#define AFE_RXCONFIG_1 MISC_ADDR(0x38, 1)
42#define AFE_RXCONFIG_2 MISC_ADDR(0x38, 2)
42#define AFE_RX_LP_COUNTER MISC_ADDR(0x38, 3) 43#define AFE_RX_LP_COUNTER MISC_ADDR(0x38, 3)
43#define AFE_TX_CONFIG MISC_ADDR(0x39, 0) 44#define AFE_TX_CONFIG MISC_ADDR(0x39, 0)
45#define AFE_VDCA_ICTRL_0 MISC_ADDR(0x39, 1)
46#define AFE_VDAC_OTHERS_0 MISC_ADDR(0x39, 3)
44#define AFE_HPF_TRIM_OTHERS MISC_ADDR(0x3a, 0) 47#define AFE_HPF_TRIM_OTHERS MISC_ADDR(0x3a, 0)
45 48
46#define CORE_EXPB0 0xb0 49#define CORE_EXPB0 0xb0
@@ -119,6 +122,46 @@ static int bcm7xxx_28nm_b0_afe_config_init(struct phy_device *phydev)
119 return 0; 122 return 0;
120} 123}
121 124
125static int bcm7xxx_28nm_d0_afe_config_init(struct phy_device *phydev)
126{
127 /* AFE_RXCONFIG_0 */
128 phy_write_misc(phydev, AFE_RXCONFIG_0, 0xeb15);
129
130 /* AFE_RXCONFIG_1 */
131 phy_write_misc(phydev, AFE_RXCONFIG_1, 0x9b2f);
132
133 /* AFE_RXCONFIG_2, set rCal offset for HT=0 code and LT=-2 code */
134 phy_write_misc(phydev, AFE_RXCONFIG_2, 0x2003);
135
136 /* AFE_RX_LP_COUNTER, set RX bandwidth to maximum */
137 phy_write_misc(phydev, AFE_RX_LP_COUNTER, 0x7fc0);
138
139 /* AFE_TX_CONFIG, set 1000BT Cfeed=110 for all ports */
140 phy_write_misc(phydev, AFE_TX_CONFIG, 0x0061);
141
142 /* AFE_VDCA_ICTRL_0, set Iq=1101 instead of 0111 for AB symmetry */
143 phy_write_misc(phydev, AFE_VDCA_ICTRL_0, 0xa7da);
144
145 /* AFE_VDAC_OTHERS_0, set 1000BT Cidac=010 for all ports */
146 phy_write_misc(phydev, AFE_VDAC_OTHERS_0, 0xa020);
147
148 /* AFE_HPF_TRIM_OTHERS, set 100Tx/10BT to -4.5% swing and set rCal
149 * offset for HT=0 code
150 */
151 phy_write_misc(phydev, AFE_HPF_TRIM_OTHERS, 0x00e3);
152
153 /* CORE_BASE1E, force trim to overwrite and set I_ext trim to 0000 */
154 phy_write(phydev, MII_BCM7XXX_CORE_BASE1E, 0x0010);
155
156 /* DSP_TAP10, adjust bias current trim (+0% swing, +0 tick) */
157 phy_write_misc(phydev, DSP_TAP10, 0x011b);
158
159 /* Reset R_CAL/RC_CAL engine */
160 r_rc_cal_reset(phydev);
161
162 return 0;
163}
164
122static int bcm7xxx_apd_enable(struct phy_device *phydev) 165static int bcm7xxx_apd_enable(struct phy_device *phydev)
123{ 166{
124 int val; 167 int val;
@@ -179,6 +222,9 @@ static int bcm7xxx_28nm_config_init(struct phy_device *phydev)
179 case 0xb0: 222 case 0xb0:
180 ret = bcm7xxx_28nm_b0_afe_config_init(phydev); 223 ret = bcm7xxx_28nm_b0_afe_config_init(phydev);
181 break; 224 break;
225 case 0xd0:
226 ret = bcm7xxx_28nm_d0_afe_config_init(phydev);
227 break;
182 default: 228 default:
183 break; 229 break;
184 } 230 }