xref: /freebsd/sys/dev/cxgb/common/cxgb_ael1002.c (revision bd1a9fba)
1b6d90eb7SKip Macy /**************************************************************************
2b6d90eb7SKip Macy 
3f2d8ff04SGeorge V. Neville-Neil Copyright (c) 2007-2009, Chelsio Inc.
4b6d90eb7SKip Macy All rights reserved.
5b6d90eb7SKip Macy 
6b6d90eb7SKip Macy Redistribution and use in source and binary forms, with or without
7b6d90eb7SKip Macy modification, are permitted provided that the following conditions are met:
8b6d90eb7SKip Macy 
9b6d90eb7SKip Macy  1. Redistributions of source code must retain the above copyright notice,
10b6d90eb7SKip Macy     this list of conditions and the following disclaimer.
11b6d90eb7SKip Macy 
1210faa568SKip Macy  2. Neither the name of the Chelsio Corporation nor the names of its
13b6d90eb7SKip Macy     contributors may be used to endorse or promote products derived from
14b6d90eb7SKip Macy     this software without specific prior written permission.
15b6d90eb7SKip Macy 
16b6d90eb7SKip Macy THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17b6d90eb7SKip Macy AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18b6d90eb7SKip Macy IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19b6d90eb7SKip Macy ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20b6d90eb7SKip Macy LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21b6d90eb7SKip Macy CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22b6d90eb7SKip Macy SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23b6d90eb7SKip Macy INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24b6d90eb7SKip Macy CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25b6d90eb7SKip Macy ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26b6d90eb7SKip Macy POSSIBILITY OF SUCH DAMAGE.
27b6d90eb7SKip Macy 
28b6d90eb7SKip Macy ***************************************************************************/
29b6d90eb7SKip Macy 
30b6d90eb7SKip Macy #include <sys/cdefs.h>
31b6d90eb7SKip Macy __FBSDID("$FreeBSD$");
32b6d90eb7SKip Macy 
3310faa568SKip Macy #include <cxgb_include.h>
34b6d90eb7SKip Macy 
358e10660fSKip Macy #undef msleep
368e10660fSKip Macy #define msleep t3_os_sleep
378e10660fSKip Macy 
38b6d90eb7SKip Macy enum {
399b4de886SKip Macy 	PMD_RSD     = 10,   /* PMA/PMD receive signal detect register */
409b4de886SKip Macy 	PCS_STAT1_X = 24,   /* 10GBASE-X PCS status 1 register */
419b4de886SKip Macy 	PCS_STAT1_R = 32,   /* 10GBASE-R PCS status 1 register */
429b4de886SKip Macy 	XS_LN_STAT  = 24    /* XS lane status register */
439b4de886SKip Macy };
449b4de886SKip Macy 
459b4de886SKip Macy enum {
46b6d90eb7SKip Macy 	AEL100X_TX_DISABLE  = 9,
47b6d90eb7SKip Macy 	AEL100X_TX_CONFIG1  = 0xc002,
48c01f2b83SNavdeep Parhar 
49b6d90eb7SKip Macy 	AEL1002_PWR_DOWN_HI = 0xc011,
50b6d90eb7SKip Macy 	AEL1002_PWR_DOWN_LO = 0xc012,
51b6d90eb7SKip Macy 	AEL1002_XFI_EQL     = 0xc015,
52b6d90eb7SKip Macy 	AEL1002_LB_EN       = 0xc017,
53c01f2b83SNavdeep Parhar 
544af83c8cSKip Macy 	AEL_OPT_SETTINGS    = 0xc017,
559b4de886SKip Macy 	AEL_I2C_CTRL        = 0xc30a,
569b4de886SKip Macy 	AEL_I2C_DATA        = 0xc30b,
579b4de886SKip Macy 	AEL_I2C_STAT        = 0xc30c,
58c01f2b83SNavdeep Parhar 
599b4de886SKip Macy 	AEL2005_GPIO_CTRL   = 0xc214,
609b4de886SKip Macy 	AEL2005_GPIO_STAT   = 0xc215,
61c01f2b83SNavdeep Parhar 
62c01f2b83SNavdeep Parhar 	AEL2020_GPIO_INTR   = 0xc103,
63c01f2b83SNavdeep Parhar 	AEL2020_GPIO_CTRL   = 0xc108,
64c01f2b83SNavdeep Parhar 	AEL2020_GPIO_STAT   = 0xc10c,
65c01f2b83SNavdeep Parhar 	AEL2020_GPIO_CFG    = 0xc110,
66c01f2b83SNavdeep Parhar 
67c01f2b83SNavdeep Parhar 	AEL2020_GPIO_SDA    = 0,
68c01f2b83SNavdeep Parhar 	AEL2020_GPIO_MODDET = 1,
69c01f2b83SNavdeep Parhar 	AEL2020_GPIO_0      = 3,
70c01f2b83SNavdeep Parhar 	AEL2020_GPIO_1      = 2,
71c01f2b83SNavdeep Parhar 	AEL2020_GPIO_LSTAT  = AEL2020_GPIO_1,
72b6d90eb7SKip Macy };
73b6d90eb7SKip Macy 
749b4de886SKip Macy enum { edc_none, edc_sr, edc_twinax };
759b4de886SKip Macy 
769b4de886SKip Macy /* PHY module I2C device address */
77f2d8ff04SGeorge V. Neville-Neil enum {
78f2d8ff04SGeorge V. Neville-Neil 	MODULE_DEV_ADDR	= 0xa0,
79f2d8ff04SGeorge V. Neville-Neil 	SFF_DEV_ADDR	= 0xa2,
80f2d8ff04SGeorge V. Neville-Neil };
81f2d8ff04SGeorge V. Neville-Neil 
82f2d8ff04SGeorge V. Neville-Neil /* PHY transceiver type */
83f2d8ff04SGeorge V. Neville-Neil enum {
84f2d8ff04SGeorge V. Neville-Neil 	phy_transtype_unknown = 0,
85f2d8ff04SGeorge V. Neville-Neil 	phy_transtype_sfp     = 3,
86f2d8ff04SGeorge V. Neville-Neil 	phy_transtype_xfp     = 6,
87f2d8ff04SGeorge V. Neville-Neil };
889b4de886SKip Macy 
899b4de886SKip Macy #define AEL2005_MODDET_IRQ 4
909b4de886SKip Macy 
914af83c8cSKip Macy struct reg_val {
924af83c8cSKip Macy 	unsigned short mmd_addr;
934af83c8cSKip Macy 	unsigned short reg_addr;
944af83c8cSKip Macy 	unsigned short clear_bits;
954af83c8cSKip Macy 	unsigned short set_bits;
964af83c8cSKip Macy };
974af83c8cSKip Macy 
98c01f2b83SNavdeep Parhar static int ael2xxx_get_module_type(struct cphy *phy, int delay_ms);
99837f41b0SGeorge V. Neville-Neil 
1004af83c8cSKip Macy static int set_phy_regs(struct cphy *phy, const struct reg_val *rv)
1014af83c8cSKip Macy {
1024af83c8cSKip Macy 	int err;
1034af83c8cSKip Macy 
1044af83c8cSKip Macy 	for (err = 0; rv->mmd_addr && !err; rv++) {
1054af83c8cSKip Macy 		if (rv->clear_bits == 0xffff)
1064af83c8cSKip Macy 			err = mdio_write(phy, rv->mmd_addr, rv->reg_addr,
1074af83c8cSKip Macy 					 rv->set_bits);
1084af83c8cSKip Macy 		else
1094af83c8cSKip Macy 			err = t3_mdio_change_bits(phy, rv->mmd_addr,
1104af83c8cSKip Macy 						  rv->reg_addr, rv->clear_bits,
1114af83c8cSKip Macy 						  rv->set_bits);
1124af83c8cSKip Macy 	}
1134af83c8cSKip Macy 	return err;
1144af83c8cSKip Macy }
1154af83c8cSKip Macy 
116b6d90eb7SKip Macy static void ael100x_txon(struct cphy *phy)
117b6d90eb7SKip Macy {
118b6d90eb7SKip Macy 	int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL;
119b6d90eb7SKip Macy 
1208e10660fSKip Macy 	msleep(100);
121b6d90eb7SKip Macy 	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio);
1228e10660fSKip Macy 	msleep(30);
123b6d90eb7SKip Macy }
124b6d90eb7SKip Macy 
125c01f2b83SNavdeep Parhar /*
126c01f2b83SNavdeep Parhar  * Read an 8-bit word from a device attached to the PHY's i2c bus.
127c01f2b83SNavdeep Parhar  */
128f2d8ff04SGeorge V. Neville-Neil static int ael_i2c_rd(struct cphy *phy, int dev_addr, int word_addr)
129f2d8ff04SGeorge V. Neville-Neil {
130f2d8ff04SGeorge V. Neville-Neil 	int i, err;
131f2d8ff04SGeorge V. Neville-Neil 	unsigned int stat, data;
132f2d8ff04SGeorge V. Neville-Neil 
133f2d8ff04SGeorge V. Neville-Neil 	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
134f2d8ff04SGeorge V. Neville-Neil 			 (dev_addr << 8) | (1 << 8) | word_addr);
135f2d8ff04SGeorge V. Neville-Neil 	if (err)
136f2d8ff04SGeorge V. Neville-Neil 		return err;
137f2d8ff04SGeorge V. Neville-Neil 
138f2d8ff04SGeorge V. Neville-Neil 	for (i = 0; i < 200; i++) {
139f2d8ff04SGeorge V. Neville-Neil 		msleep(1);
140f2d8ff04SGeorge V. Neville-Neil 		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
141f2d8ff04SGeorge V. Neville-Neil 		if (err)
142f2d8ff04SGeorge V. Neville-Neil 			return err;
143f2d8ff04SGeorge V. Neville-Neil 		if ((stat & 3) == 1) {
144f2d8ff04SGeorge V. Neville-Neil 			err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA,
145f2d8ff04SGeorge V. Neville-Neil 					&data);
146f2d8ff04SGeorge V. Neville-Neil 			if (err)
147f2d8ff04SGeorge V. Neville-Neil 				return err;
148f2d8ff04SGeorge V. Neville-Neil 			return data >> 8;
149f2d8ff04SGeorge V. Neville-Neil 		}
150f2d8ff04SGeorge V. Neville-Neil 	}
151c01f2b83SNavdeep Parhar 	CH_WARN(phy->adapter, "PHY %u i2c read of dev.addr %x.%x timed out\n",
152c01f2b83SNavdeep Parhar 		phy->addr, dev_addr, word_addr);
153f2d8ff04SGeorge V. Neville-Neil 	return -ETIMEDOUT;
154f2d8ff04SGeorge V. Neville-Neil }
155f2d8ff04SGeorge V. Neville-Neil 
156c01f2b83SNavdeep Parhar /*
157c01f2b83SNavdeep Parhar  * Write an 8-bit word to a device attached to the PHY's i2c bus.
158c01f2b83SNavdeep Parhar  */
159f2d8ff04SGeorge V. Neville-Neil static int ael_i2c_wr(struct cphy *phy, int dev_addr, int word_addr, int data)
160f2d8ff04SGeorge V. Neville-Neil {
161f2d8ff04SGeorge V. Neville-Neil 	int i, err;
162f2d8ff04SGeorge V. Neville-Neil 	unsigned int stat;
163f2d8ff04SGeorge V. Neville-Neil 
164f2d8ff04SGeorge V. Neville-Neil 	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, data);
165f2d8ff04SGeorge V. Neville-Neil 	if (err)
166f2d8ff04SGeorge V. Neville-Neil 		return err;
167f2d8ff04SGeorge V. Neville-Neil 
168f2d8ff04SGeorge V. Neville-Neil 	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
169f2d8ff04SGeorge V. Neville-Neil 			 (dev_addr << 8) | word_addr);
170f2d8ff04SGeorge V. Neville-Neil 	if (err)
171f2d8ff04SGeorge V. Neville-Neil 		return err;
172f2d8ff04SGeorge V. Neville-Neil 
173f2d8ff04SGeorge V. Neville-Neil 	for (i = 0; i < 200; i++) {
174f2d8ff04SGeorge V. Neville-Neil 		msleep(1);
175f2d8ff04SGeorge V. Neville-Neil 		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
176f2d8ff04SGeorge V. Neville-Neil 		if (err)
177f2d8ff04SGeorge V. Neville-Neil 			return err;
178f2d8ff04SGeorge V. Neville-Neil 		if ((stat & 3) == 1)
179f2d8ff04SGeorge V. Neville-Neil 			return 0;
180f2d8ff04SGeorge V. Neville-Neil 	}
181c01f2b83SNavdeep Parhar 	CH_WARN(phy->adapter, "PHY %u i2c Write of dev.addr %x.%x = %#x timed out\n",
182c01f2b83SNavdeep Parhar 		phy->addr, dev_addr, word_addr, data);
183f2d8ff04SGeorge V. Neville-Neil 	return -ETIMEDOUT;
184f2d8ff04SGeorge V. Neville-Neil }
185f2d8ff04SGeorge V. Neville-Neil 
186f2d8ff04SGeorge V. Neville-Neil static int get_phytrans_type(struct cphy *phy)
187f2d8ff04SGeorge V. Neville-Neil {
188f2d8ff04SGeorge V. Neville-Neil 	int v;
189f2d8ff04SGeorge V. Neville-Neil 
190f2d8ff04SGeorge V. Neville-Neil 	v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0);
191f2d8ff04SGeorge V. Neville-Neil 	if (v < 0)
192f2d8ff04SGeorge V. Neville-Neil 		return phy_transtype_unknown;
193f2d8ff04SGeorge V. Neville-Neil 
194f2d8ff04SGeorge V. Neville-Neil 	return v;
195f2d8ff04SGeorge V. Neville-Neil }
196f2d8ff04SGeorge V. Neville-Neil 
197f2d8ff04SGeorge V. Neville-Neil static int ael_laser_down(struct cphy *phy, int enable)
198f2d8ff04SGeorge V. Neville-Neil {
199f2d8ff04SGeorge V. Neville-Neil 	int v, dev_addr;
200f2d8ff04SGeorge V. Neville-Neil 
201f2d8ff04SGeorge V. Neville-Neil 	v = get_phytrans_type(phy);
202f2d8ff04SGeorge V. Neville-Neil 	if (v < 0)
203f2d8ff04SGeorge V. Neville-Neil 		return v;
204f2d8ff04SGeorge V. Neville-Neil 
205f2d8ff04SGeorge V. Neville-Neil 	if (v == phy_transtype_sfp) {
206f2d8ff04SGeorge V. Neville-Neil 		/* Check SFF Soft TX disable is supported */
207f2d8ff04SGeorge V. Neville-Neil 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 93);
208f2d8ff04SGeorge V. Neville-Neil 		if (v < 0)
209f2d8ff04SGeorge V. Neville-Neil 			return v;
210f2d8ff04SGeorge V. Neville-Neil 
211f2d8ff04SGeorge V. Neville-Neil 		v &= 0x40;
212f2d8ff04SGeorge V. Neville-Neil 		if (!v)
213f2d8ff04SGeorge V. Neville-Neil 			return v;
214f2d8ff04SGeorge V. Neville-Neil 
215f2d8ff04SGeorge V. Neville-Neil 		dev_addr = SFF_DEV_ADDR;
216f2d8ff04SGeorge V. Neville-Neil 	} else if (v == phy_transtype_xfp)
217f2d8ff04SGeorge V. Neville-Neil 		dev_addr = MODULE_DEV_ADDR;
218f2d8ff04SGeorge V. Neville-Neil 	else
219f2d8ff04SGeorge V. Neville-Neil 		return v;
220f2d8ff04SGeorge V. Neville-Neil 
221f2d8ff04SGeorge V. Neville-Neil 	v = ael_i2c_rd(phy, dev_addr, 110);
222f2d8ff04SGeorge V. Neville-Neil 	if (v < 0)
223f2d8ff04SGeorge V. Neville-Neil 		return v;
224f2d8ff04SGeorge V. Neville-Neil 
225f2d8ff04SGeorge V. Neville-Neil 	if (enable)
226f2d8ff04SGeorge V. Neville-Neil 		v |= 0x40;
227f2d8ff04SGeorge V. Neville-Neil 	else
228f2d8ff04SGeorge V. Neville-Neil 		v &= ~0x40;
229f2d8ff04SGeorge V. Neville-Neil 
230f2d8ff04SGeorge V. Neville-Neil 	v = ael_i2c_wr(phy, dev_addr, 110, v);
231f2d8ff04SGeorge V. Neville-Neil 
232f2d8ff04SGeorge V. Neville-Neil 	return v;
233f2d8ff04SGeorge V. Neville-Neil }
234f2d8ff04SGeorge V. Neville-Neil 
235b6d90eb7SKip Macy static int ael1002_power_down(struct cphy *phy, int enable)
236b6d90eb7SKip Macy {
237b6d90eb7SKip Macy 	int err;
238b6d90eb7SKip Macy 
239b6d90eb7SKip Macy 	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable);
240b6d90eb7SKip Macy 	if (!err)
241b6d90eb7SKip Macy 		err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
242b6d90eb7SKip Macy 					  BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
243b6d90eb7SKip Macy 	return err;
244b6d90eb7SKip Macy }
245b6d90eb7SKip Macy 
246837f41b0SGeorge V. Neville-Neil static int ael1002_get_module_type(struct cphy *phy, int delay_ms)
247837f41b0SGeorge V. Neville-Neil {
248837f41b0SGeorge V. Neville-Neil 	int v;
249837f41b0SGeorge V. Neville-Neil 
250837f41b0SGeorge V. Neville-Neil 	if (delay_ms)
251837f41b0SGeorge V. Neville-Neil 		msleep(delay_ms);
252837f41b0SGeorge V. Neville-Neil 
253c01f2b83SNavdeep Parhar 	v = ael2xxx_get_module_type(phy, delay_ms);
254837f41b0SGeorge V. Neville-Neil 
255c01f2b83SNavdeep Parhar 	return (v == -ETIMEDOUT ? phy_modtype_none : v);
256837f41b0SGeorge V. Neville-Neil }
257837f41b0SGeorge V. Neville-Neil 
258b6d90eb7SKip Macy static int ael1002_reset(struct cphy *phy, int wait)
259b6d90eb7SKip Macy {
260b6d90eb7SKip Macy 	int err;
261b6d90eb7SKip Macy 
262b6d90eb7SKip Macy 	if ((err = ael1002_power_down(phy, 0)) ||
263b6d90eb7SKip Macy 	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) ||
264b6d90eb7SKip Macy 	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) ||
265b6d90eb7SKip Macy 	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) ||
266b6d90eb7SKip Macy 	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) ||
267b6d90eb7SKip Macy 	    (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN,
268b6d90eb7SKip Macy 				       0, 1 << 5)))
269b6d90eb7SKip Macy 		return err;
270837f41b0SGeorge V. Neville-Neil 
271837f41b0SGeorge V. Neville-Neil 	err = ael1002_get_module_type(phy, 300);
272837f41b0SGeorge V. Neville-Neil 	if (err >= 0)
273837f41b0SGeorge V. Neville-Neil 		phy->modtype = err;
274837f41b0SGeorge V. Neville-Neil 
275b6d90eb7SKip Macy 	return 0;
276b6d90eb7SKip Macy }
277b6d90eb7SKip Macy 
278b6d90eb7SKip Macy static int ael1002_intr_noop(struct cphy *phy)
279b6d90eb7SKip Macy {
280b6d90eb7SKip Macy 	return 0;
281b6d90eb7SKip Macy }
282b6d90eb7SKip Macy 
2839b4de886SKip Macy /*
2849b4de886SKip Macy  * Get link status for a 10GBASE-R device.
2859b4de886SKip Macy  */
2869b4de886SKip Macy static int get_link_status_r(struct cphy *phy, int *link_ok, int *speed,
2879b4de886SKip Macy 			     int *duplex, int *fc)
288b6d90eb7SKip Macy {
289b6d90eb7SKip Macy 	if (link_ok) {
2909b4de886SKip Macy 		unsigned int stat0, stat1, stat2;
2919b4de886SKip Macy 		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
292b6d90eb7SKip Macy 
2939b4de886SKip Macy 		if (!err)
2949b4de886SKip Macy 			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1);
2959b4de886SKip Macy 		if (!err)
2969b4de886SKip Macy 			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
297b6d90eb7SKip Macy 		if (err)
298b6d90eb7SKip Macy 			return err;
2999b4de886SKip Macy 		*link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1;
300bd1a9fbaSNavdeep Parhar 
301bd1a9fbaSNavdeep Parhar 		if (*link_ok == 0)
302bd1a9fbaSNavdeep Parhar 			return (0);
303b6d90eb7SKip Macy 	}
304b6d90eb7SKip Macy 	if (speed)
305b6d90eb7SKip Macy 		*speed = SPEED_10000;
306b6d90eb7SKip Macy 	if (duplex)
307b6d90eb7SKip Macy 		*duplex = DUPLEX_FULL;
308b6d90eb7SKip Macy 	return 0;
309b6d90eb7SKip Macy }
310b6d90eb7SKip Macy 
311b6d90eb7SKip Macy #ifdef C99_NOT_SUPPORTED
312b6d90eb7SKip Macy static struct cphy_ops ael1002_ops = {
313b6d90eb7SKip Macy 	ael1002_reset,
314b6d90eb7SKip Macy 	ael1002_intr_noop,
315b6d90eb7SKip Macy 	ael1002_intr_noop,
316b6d90eb7SKip Macy 	ael1002_intr_noop,
317b6d90eb7SKip Macy 	ael1002_intr_noop,
318b6d90eb7SKip Macy 	NULL,
319b6d90eb7SKip Macy 	NULL,
320b6d90eb7SKip Macy 	NULL,
321b6d90eb7SKip Macy 	NULL,
322b6d90eb7SKip Macy 	NULL,
3239b4de886SKip Macy 	get_link_status_r,
324b6d90eb7SKip Macy 	ael1002_power_down,
325b6d90eb7SKip Macy };
326b6d90eb7SKip Macy #else
327b6d90eb7SKip Macy static struct cphy_ops ael1002_ops = {
328b6d90eb7SKip Macy 	.reset           = ael1002_reset,
329b6d90eb7SKip Macy 	.intr_enable     = ael1002_intr_noop,
330b6d90eb7SKip Macy 	.intr_disable    = ael1002_intr_noop,
331b6d90eb7SKip Macy 	.intr_clear      = ael1002_intr_noop,
332b6d90eb7SKip Macy 	.intr_handler    = ael1002_intr_noop,
3339b4de886SKip Macy 	.get_link_status = get_link_status_r,
334b6d90eb7SKip Macy 	.power_down      = ael1002_power_down,
335b6d90eb7SKip Macy };
336b6d90eb7SKip Macy #endif
337b6d90eb7SKip Macy 
338c01f2b83SNavdeep Parhar int t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr,
339b6d90eb7SKip Macy 			const struct mdio_ops *mdio_ops)
340b6d90eb7SKip Macy {
341837f41b0SGeorge V. Neville-Neil 	int err;
342c01f2b83SNavdeep Parhar 	struct cphy *phy = &pinfo->phy;
343837f41b0SGeorge V. Neville-Neil 
344c01f2b83SNavdeep Parhar 	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1002_ops, mdio_ops,
3458e10660fSKip Macy 		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
34619905d6dSKip Macy 		  "10GBASE-R");
347b6d90eb7SKip Macy 	ael100x_txon(phy);
348f2d8ff04SGeorge V. Neville-Neil 	ael_laser_down(phy, 0);
349837f41b0SGeorge V. Neville-Neil 
350837f41b0SGeorge V. Neville-Neil 	err = ael1002_get_module_type(phy, 0);
351837f41b0SGeorge V. Neville-Neil 	if (err >= 0)
352837f41b0SGeorge V. Neville-Neil 		phy->modtype = err;
353837f41b0SGeorge V. Neville-Neil 
3548e10660fSKip Macy 	return 0;
355b6d90eb7SKip Macy }
356b6d90eb7SKip Macy 
357b6d90eb7SKip Macy static int ael1006_reset(struct cphy *phy, int wait)
358b6d90eb7SKip Macy {
359f2d8ff04SGeorge V. Neville-Neil 	int err;
36090362409SGeorge V. Neville-Neil 
361f2d8ff04SGeorge V. Neville-Neil 	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
362f2d8ff04SGeorge V. Neville-Neil 	if (err)
363f2d8ff04SGeorge V. Neville-Neil 		return err;
36490362409SGeorge V. Neville-Neil 
365f2d8ff04SGeorge V. Neville-Neil 	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN,
366f2d8ff04SGeorge V. Neville-Neil 			 F_GPIO6_OUT_VAL, 0);
367f2d8ff04SGeorge V. Neville-Neil 
368f2d8ff04SGeorge V. Neville-Neil 	msleep(125);
369f2d8ff04SGeorge V. Neville-Neil 
370f2d8ff04SGeorge V. Neville-Neil 	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN,
371f2d8ff04SGeorge V. Neville-Neil 			 F_GPIO6_OUT_VAL, F_GPIO6_OUT_VAL);
372f2d8ff04SGeorge V. Neville-Neil 
373f2d8ff04SGeorge V. Neville-Neil 	msleep(125);
374f2d8ff04SGeorge V. Neville-Neil 
375f2d8ff04SGeorge V. Neville-Neil 	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
376f2d8ff04SGeorge V. Neville-Neil 	if (err)
377f2d8ff04SGeorge V. Neville-Neil 		return err;
378f2d8ff04SGeorge V. Neville-Neil 
379f2d8ff04SGeorge V. Neville-Neil 	msleep(125);
380f2d8ff04SGeorge V. Neville-Neil 
381f2d8ff04SGeorge V. Neville-Neil 	err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 1);
382f2d8ff04SGeorge V. Neville-Neil 	if (err)
383f2d8ff04SGeorge V. Neville-Neil 		return err;
384f2d8ff04SGeorge V. Neville-Neil 
385f2d8ff04SGeorge V. Neville-Neil 	msleep(125);
386f2d8ff04SGeorge V. Neville-Neil 
387f2d8ff04SGeorge V. Neville-Neil 	err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0);
388f2d8ff04SGeorge V. Neville-Neil 
389f2d8ff04SGeorge V. Neville-Neil 	return err;
390f2d8ff04SGeorge V. Neville-Neil 
391b6d90eb7SKip Macy }
392b6d90eb7SKip Macy 
393b6d90eb7SKip Macy #ifdef C99_NOT_SUPPORTED
394b6d90eb7SKip Macy static struct cphy_ops ael1006_ops = {
395b6d90eb7SKip Macy 	ael1006_reset,
3964af83c8cSKip Macy 	t3_phy_lasi_intr_enable,
3974af83c8cSKip Macy 	t3_phy_lasi_intr_disable,
3984af83c8cSKip Macy 	t3_phy_lasi_intr_clear,
3994af83c8cSKip Macy 	t3_phy_lasi_intr_handler,
400b6d90eb7SKip Macy 	NULL,
401b6d90eb7SKip Macy 	NULL,
402b6d90eb7SKip Macy 	NULL,
403b6d90eb7SKip Macy 	NULL,
404b6d90eb7SKip Macy 	NULL,
4059b4de886SKip Macy 	get_link_status_r,
406c01f2b83SNavdeep Parhar 	ael1002_power_down,
407b6d90eb7SKip Macy };
408b6d90eb7SKip Macy #else
409b6d90eb7SKip Macy static struct cphy_ops ael1006_ops = {
410b6d90eb7SKip Macy 	.reset           = ael1006_reset,
4114af83c8cSKip Macy 	.intr_enable     = t3_phy_lasi_intr_enable,
4124af83c8cSKip Macy 	.intr_disable    = t3_phy_lasi_intr_disable,
4134af83c8cSKip Macy 	.intr_clear      = t3_phy_lasi_intr_clear,
4144af83c8cSKip Macy 	.intr_handler    = t3_phy_lasi_intr_handler,
4159b4de886SKip Macy 	.get_link_status = get_link_status_r,
416c01f2b83SNavdeep Parhar 	.power_down      = ael1002_power_down,
417b6d90eb7SKip Macy };
418b6d90eb7SKip Macy #endif
419b6d90eb7SKip Macy 
420c01f2b83SNavdeep Parhar int t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr,
421b6d90eb7SKip Macy 			const struct mdio_ops *mdio_ops)
422b6d90eb7SKip Macy {
423c01f2b83SNavdeep Parhar 	struct cphy *phy = &pinfo->phy;
424c01f2b83SNavdeep Parhar 
425c01f2b83SNavdeep Parhar 	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1006_ops, mdio_ops,
4268e10660fSKip Macy 		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
4278e10660fSKip Macy 		  "10GBASE-SR");
428c01f2b83SNavdeep Parhar 	phy->modtype = phy_modtype_sr;
429b6d90eb7SKip Macy 	ael100x_txon(phy);
4308e10660fSKip Macy 	return 0;
431b6d90eb7SKip Macy }
432b6d90eb7SKip Macy 
433c01f2b83SNavdeep Parhar /*
434c01f2b83SNavdeep Parhar  * Decode our module type.
435c01f2b83SNavdeep Parhar  */
436c01f2b83SNavdeep Parhar static int ael2xxx_get_module_type(struct cphy *phy, int delay_ms)
437c01f2b83SNavdeep Parhar {
438c01f2b83SNavdeep Parhar 	int v;
439c01f2b83SNavdeep Parhar 
440c01f2b83SNavdeep Parhar 	if (delay_ms)
441c01f2b83SNavdeep Parhar 		msleep(delay_ms);
442c01f2b83SNavdeep Parhar 
443c01f2b83SNavdeep Parhar 	v = get_phytrans_type(phy);
444c01f2b83SNavdeep Parhar 	if (v == phy_transtype_sfp) {
445c01f2b83SNavdeep Parhar 		/* SFP: see SFF-8472 for below */
446c01f2b83SNavdeep Parhar 
447c01f2b83SNavdeep Parhar 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3);
448c01f2b83SNavdeep Parhar 		if (v < 0)
449c01f2b83SNavdeep Parhar 			return v;
450c01f2b83SNavdeep Parhar 
451c01f2b83SNavdeep Parhar 		if (v == 0x1)
452cd5c70b2SNavdeep Parhar 			goto twinax;
453c01f2b83SNavdeep Parhar 		if (v == 0x10)
454c01f2b83SNavdeep Parhar 			return phy_modtype_sr;
455c01f2b83SNavdeep Parhar 		if (v == 0x20)
456c01f2b83SNavdeep Parhar 			return phy_modtype_lr;
457c01f2b83SNavdeep Parhar 		if (v == 0x40)
458c01f2b83SNavdeep Parhar 			return phy_modtype_lrm;
459c01f2b83SNavdeep Parhar 
460cd5c70b2SNavdeep Parhar 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 8);
461cd5c70b2SNavdeep Parhar 		if (v < 0)
462cd5c70b2SNavdeep Parhar 			return v;
463cd5c70b2SNavdeep Parhar 		if (v == 4) {
464cd5c70b2SNavdeep Parhar 			v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 60);
465cd5c70b2SNavdeep Parhar 			if (v < 0)
466cd5c70b2SNavdeep Parhar 				return v;
467cd5c70b2SNavdeep Parhar 			if (v & 0x1)
468cd5c70b2SNavdeep Parhar 				goto twinax;
469cd5c70b2SNavdeep Parhar 		}
470cd5c70b2SNavdeep Parhar 
471c01f2b83SNavdeep Parhar 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6);
472c01f2b83SNavdeep Parhar 		if (v < 0)
473c01f2b83SNavdeep Parhar 			return v;
474c01f2b83SNavdeep Parhar 		if (v != 4)
475c01f2b83SNavdeep Parhar 			return phy_modtype_unknown;
476c01f2b83SNavdeep Parhar 
477c01f2b83SNavdeep Parhar 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10);
478c01f2b83SNavdeep Parhar 		if (v < 0)
479c01f2b83SNavdeep Parhar 			return v;
480c01f2b83SNavdeep Parhar 
481c01f2b83SNavdeep Parhar 		if (v & 0x80) {
482cd5c70b2SNavdeep Parhar twinax:
483c01f2b83SNavdeep Parhar 			v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
484c01f2b83SNavdeep Parhar 			if (v < 0)
485c01f2b83SNavdeep Parhar 				return v;
486c01f2b83SNavdeep Parhar 			return v > 10 ? phy_modtype_twinax_long :
487c01f2b83SNavdeep Parhar 			    phy_modtype_twinax;
488c01f2b83SNavdeep Parhar 		}
489c01f2b83SNavdeep Parhar 	} else if (v == phy_transtype_xfp) {
490c01f2b83SNavdeep Parhar 		/* XFP: See INF-8077i for details. */
491c01f2b83SNavdeep Parhar 
492c01f2b83SNavdeep Parhar 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127);
493c01f2b83SNavdeep Parhar 		if (v < 0)
494c01f2b83SNavdeep Parhar 			return v;
495c01f2b83SNavdeep Parhar 
496c01f2b83SNavdeep Parhar 		if (v != 1) {
497c01f2b83SNavdeep Parhar 			/* XXX: set page select to table 1 yourself */
498c01f2b83SNavdeep Parhar 			return phy_modtype_unknown;
499c01f2b83SNavdeep Parhar 		}
500c01f2b83SNavdeep Parhar 
501c01f2b83SNavdeep Parhar 		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131);
502c01f2b83SNavdeep Parhar 		if (v < 0)
503c01f2b83SNavdeep Parhar 			return v;
504c01f2b83SNavdeep Parhar 		v &= 0xf0;
505c01f2b83SNavdeep Parhar 		if (v == 0x10)
506c01f2b83SNavdeep Parhar 			return phy_modtype_lrm;
507c01f2b83SNavdeep Parhar 		if (v == 0x40)
508c01f2b83SNavdeep Parhar 			return phy_modtype_lr;
509c01f2b83SNavdeep Parhar 		if (v == 0x80)
510c01f2b83SNavdeep Parhar 			return phy_modtype_sr;
511c01f2b83SNavdeep Parhar 	}
512c01f2b83SNavdeep Parhar 
513c01f2b83SNavdeep Parhar 	return phy_modtype_unknown;
514c01f2b83SNavdeep Parhar }
515c01f2b83SNavdeep Parhar 
516c01f2b83SNavdeep Parhar /*
517c01f2b83SNavdeep Parhar  * Code to support the Aeluros/NetLogic 2005 10Gb PHY.
518c01f2b83SNavdeep Parhar  */
5194af83c8cSKip Macy static int ael2005_setup_sr_edc(struct cphy *phy)
5204af83c8cSKip Macy {
5219b4de886SKip Macy 	static struct reg_val regs[] = {
5229b4de886SKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
5239b4de886SKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
5249b4de886SKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
5259b4de886SKip Macy 		{ 0, 0, 0, 0 }
5269b4de886SKip Macy 	};
5274af83c8cSKip Macy 	static u16 sr_edc[] = {
5284af83c8cSKip Macy 		0xcc00, 0x2ff4,
5294af83c8cSKip Macy 		0xcc01, 0x3cd4,
5304af83c8cSKip Macy 		0xcc02, 0x2015,
5314af83c8cSKip Macy 		0xcc03, 0x3105,
5324af83c8cSKip Macy 		0xcc04, 0x6524,
5334af83c8cSKip Macy 		0xcc05, 0x27ff,
5344af83c8cSKip Macy 		0xcc06, 0x300f,
5354af83c8cSKip Macy 		0xcc07, 0x2c8b,
5364af83c8cSKip Macy 		0xcc08, 0x300b,
5374af83c8cSKip Macy 		0xcc09, 0x4009,
5384af83c8cSKip Macy 		0xcc0a, 0x400e,
5394af83c8cSKip Macy 		0xcc0b, 0x2f72,
5404af83c8cSKip Macy 		0xcc0c, 0x3002,
5414af83c8cSKip Macy 		0xcc0d, 0x1002,
5424af83c8cSKip Macy 		0xcc0e, 0x2172,
5434af83c8cSKip Macy 		0xcc0f, 0x3012,
5444af83c8cSKip Macy 		0xcc10, 0x1002,
5454af83c8cSKip Macy 		0xcc11, 0x25d2,
5464af83c8cSKip Macy 		0xcc12, 0x3012,
5474af83c8cSKip Macy 		0xcc13, 0x1002,
5484af83c8cSKip Macy 		0xcc14, 0xd01e,
5494af83c8cSKip Macy 		0xcc15, 0x27d2,
5504af83c8cSKip Macy 		0xcc16, 0x3012,
5514af83c8cSKip Macy 		0xcc17, 0x1002,
5524af83c8cSKip Macy 		0xcc18, 0x2004,
5534af83c8cSKip Macy 		0xcc19, 0x3c84,
5544af83c8cSKip Macy 		0xcc1a, 0x6436,
5554af83c8cSKip Macy 		0xcc1b, 0x2007,
5564af83c8cSKip Macy 		0xcc1c, 0x3f87,
5574af83c8cSKip Macy 		0xcc1d, 0x8676,
5584af83c8cSKip Macy 		0xcc1e, 0x40b7,
5594af83c8cSKip Macy 		0xcc1f, 0xa746,
5604af83c8cSKip Macy 		0xcc20, 0x4047,
5614af83c8cSKip Macy 		0xcc21, 0x5673,
5624af83c8cSKip Macy 		0xcc22, 0x2982,
5634af83c8cSKip Macy 		0xcc23, 0x3002,
5644af83c8cSKip Macy 		0xcc24, 0x13d2,
5654af83c8cSKip Macy 		0xcc25, 0x8bbd,
5664af83c8cSKip Macy 		0xcc26, 0x2862,
5674af83c8cSKip Macy 		0xcc27, 0x3012,
5684af83c8cSKip Macy 		0xcc28, 0x1002,
5694af83c8cSKip Macy 		0xcc29, 0x2092,
5704af83c8cSKip Macy 		0xcc2a, 0x3012,
5714af83c8cSKip Macy 		0xcc2b, 0x1002,
5724af83c8cSKip Macy 		0xcc2c, 0x5cc3,
5734af83c8cSKip Macy 		0xcc2d, 0x314,
5744af83c8cSKip Macy 		0xcc2e, 0x2942,
5754af83c8cSKip Macy 		0xcc2f, 0x3002,
5764af83c8cSKip Macy 		0xcc30, 0x1002,
5774af83c8cSKip Macy 		0xcc31, 0xd019,
5784af83c8cSKip Macy 		0xcc32, 0x2032,
5794af83c8cSKip Macy 		0xcc33, 0x3012,
5804af83c8cSKip Macy 		0xcc34, 0x1002,
5814af83c8cSKip Macy 		0xcc35, 0x2a04,
5824af83c8cSKip Macy 		0xcc36, 0x3c74,
5834af83c8cSKip Macy 		0xcc37, 0x6435,
5844af83c8cSKip Macy 		0xcc38, 0x2fa4,
5854af83c8cSKip Macy 		0xcc39, 0x3cd4,
5864af83c8cSKip Macy 		0xcc3a, 0x6624,
5874af83c8cSKip Macy 		0xcc3b, 0x5563,
5884af83c8cSKip Macy 		0xcc3c, 0x2d42,
5894af83c8cSKip Macy 		0xcc3d, 0x3002,
5904af83c8cSKip Macy 		0xcc3e, 0x13d2,
5914af83c8cSKip Macy 		0xcc3f, 0x464d,
5924af83c8cSKip Macy 		0xcc40, 0x2862,
5934af83c8cSKip Macy 		0xcc41, 0x3012,
5944af83c8cSKip Macy 		0xcc42, 0x1002,
5954af83c8cSKip Macy 		0xcc43, 0x2032,
5964af83c8cSKip Macy 		0xcc44, 0x3012,
5974af83c8cSKip Macy 		0xcc45, 0x1002,
5984af83c8cSKip Macy 		0xcc46, 0x2fb4,
5994af83c8cSKip Macy 		0xcc47, 0x3cd4,
6004af83c8cSKip Macy 		0xcc48, 0x6624,
6014af83c8cSKip Macy 		0xcc49, 0x5563,
6024af83c8cSKip Macy 		0xcc4a, 0x2d42,
6034af83c8cSKip Macy 		0xcc4b, 0x3002,
6044af83c8cSKip Macy 		0xcc4c, 0x13d2,
6054af83c8cSKip Macy 		0xcc4d, 0x2ed2,
6064af83c8cSKip Macy 		0xcc4e, 0x3002,
6074af83c8cSKip Macy 		0xcc4f, 0x1002,
6084af83c8cSKip Macy 		0xcc50, 0x2fd2,
6094af83c8cSKip Macy 		0xcc51, 0x3002,
6104af83c8cSKip Macy 		0xcc52, 0x1002,
6114af83c8cSKip Macy 		0xcc53, 0x004,
6124af83c8cSKip Macy 		0xcc54, 0x2942,
6134af83c8cSKip Macy 		0xcc55, 0x3002,
6144af83c8cSKip Macy 		0xcc56, 0x1002,
6154af83c8cSKip Macy 		0xcc57, 0x2092,
6164af83c8cSKip Macy 		0xcc58, 0x3012,
6174af83c8cSKip Macy 		0xcc59, 0x1002,
6184af83c8cSKip Macy 		0xcc5a, 0x5cc3,
6194af83c8cSKip Macy 		0xcc5b, 0x317,
6204af83c8cSKip Macy 		0xcc5c, 0x2f72,
6214af83c8cSKip Macy 		0xcc5d, 0x3002,
6224af83c8cSKip Macy 		0xcc5e, 0x1002,
6234af83c8cSKip Macy 		0xcc5f, 0x2942,
6244af83c8cSKip Macy 		0xcc60, 0x3002,
6254af83c8cSKip Macy 		0xcc61, 0x1002,
6264af83c8cSKip Macy 		0xcc62, 0x22cd,
6274af83c8cSKip Macy 		0xcc63, 0x301d,
6284af83c8cSKip Macy 		0xcc64, 0x2862,
6294af83c8cSKip Macy 		0xcc65, 0x3012,
6304af83c8cSKip Macy 		0xcc66, 0x1002,
6314af83c8cSKip Macy 		0xcc67, 0x2ed2,
6324af83c8cSKip Macy 		0xcc68, 0x3002,
6334af83c8cSKip Macy 		0xcc69, 0x1002,
6344af83c8cSKip Macy 		0xcc6a, 0x2d72,
6354af83c8cSKip Macy 		0xcc6b, 0x3002,
6364af83c8cSKip Macy 		0xcc6c, 0x1002,
6374af83c8cSKip Macy 		0xcc6d, 0x628f,
6384af83c8cSKip Macy 		0xcc6e, 0x2112,
6394af83c8cSKip Macy 		0xcc6f, 0x3012,
6404af83c8cSKip Macy 		0xcc70, 0x1002,
6414af83c8cSKip Macy 		0xcc71, 0x5aa3,
6424af83c8cSKip Macy 		0xcc72, 0x2dc2,
6434af83c8cSKip Macy 		0xcc73, 0x3002,
6444af83c8cSKip Macy 		0xcc74, 0x1312,
6454af83c8cSKip Macy 		0xcc75, 0x6f72,
6464af83c8cSKip Macy 		0xcc76, 0x1002,
6474af83c8cSKip Macy 		0xcc77, 0x2807,
6484af83c8cSKip Macy 		0xcc78, 0x31a7,
6494af83c8cSKip Macy 		0xcc79, 0x20c4,
6504af83c8cSKip Macy 		0xcc7a, 0x3c24,
6514af83c8cSKip Macy 		0xcc7b, 0x6724,
6524af83c8cSKip Macy 		0xcc7c, 0x1002,
6534af83c8cSKip Macy 		0xcc7d, 0x2807,
6544af83c8cSKip Macy 		0xcc7e, 0x3187,
6554af83c8cSKip Macy 		0xcc7f, 0x20c4,
6564af83c8cSKip Macy 		0xcc80, 0x3c24,
6574af83c8cSKip Macy 		0xcc81, 0x6724,
6584af83c8cSKip Macy 		0xcc82, 0x1002,
6594af83c8cSKip Macy 		0xcc83, 0x2514,
6604af83c8cSKip Macy 		0xcc84, 0x3c64,
6614af83c8cSKip Macy 		0xcc85, 0x6436,
6624af83c8cSKip Macy 		0xcc86, 0xdff4,
6634af83c8cSKip Macy 		0xcc87, 0x6436,
6644af83c8cSKip Macy 		0xcc88, 0x1002,
6654af83c8cSKip Macy 		0xcc89, 0x40a4,
6664af83c8cSKip Macy 		0xcc8a, 0x643c,
6674af83c8cSKip Macy 		0xcc8b, 0x4016,
6684af83c8cSKip Macy 		0xcc8c, 0x8c6c,
6694af83c8cSKip Macy 		0xcc8d, 0x2b24,
6704af83c8cSKip Macy 		0xcc8e, 0x3c24,
6714af83c8cSKip Macy 		0xcc8f, 0x6435,
6724af83c8cSKip Macy 		0xcc90, 0x1002,
6734af83c8cSKip Macy 		0xcc91, 0x2b24,
6744af83c8cSKip Macy 		0xcc92, 0x3c24,
6754af83c8cSKip Macy 		0xcc93, 0x643a,
6764af83c8cSKip Macy 		0xcc94, 0x4025,
6774af83c8cSKip Macy 		0xcc95, 0x8a5a,
6784af83c8cSKip Macy 		0xcc96, 0x1002,
6794af83c8cSKip Macy 		0xcc97, 0x2731,
6804af83c8cSKip Macy 		0xcc98, 0x3011,
6814af83c8cSKip Macy 		0xcc99, 0x1001,
6824af83c8cSKip Macy 		0xcc9a, 0xc7a0,
6834af83c8cSKip Macy 		0xcc9b, 0x100,
6844af83c8cSKip Macy 		0xcc9c, 0xc502,
6854af83c8cSKip Macy 		0xcc9d, 0x53ac,
6864af83c8cSKip Macy 		0xcc9e, 0xc503,
6874af83c8cSKip Macy 		0xcc9f, 0xd5d5,
6884af83c8cSKip Macy 		0xcca0, 0xc600,
6894af83c8cSKip Macy 		0xcca1, 0x2a6d,
6904af83c8cSKip Macy 		0xcca2, 0xc601,
6914af83c8cSKip Macy 		0xcca3, 0x2a4c,
6924af83c8cSKip Macy 		0xcca4, 0xc602,
6934af83c8cSKip Macy 		0xcca5, 0x111,
6944af83c8cSKip Macy 		0xcca6, 0xc60c,
6954af83c8cSKip Macy 		0xcca7, 0x5900,
6964af83c8cSKip Macy 		0xcca8, 0xc710,
6974af83c8cSKip Macy 		0xcca9, 0x700,
6984af83c8cSKip Macy 		0xccaa, 0xc718,
6994af83c8cSKip Macy 		0xccab, 0x700,
7004af83c8cSKip Macy 		0xccac, 0xc720,
7014af83c8cSKip Macy 		0xccad, 0x4700,
7024af83c8cSKip Macy 		0xccae, 0xc801,
7034af83c8cSKip Macy 		0xccaf, 0x7f50,
7044af83c8cSKip Macy 		0xccb0, 0xc802,
7054af83c8cSKip Macy 		0xccb1, 0x7760,
7064af83c8cSKip Macy 		0xccb2, 0xc803,
7074af83c8cSKip Macy 		0xccb3, 0x7fce,
7084af83c8cSKip Macy 		0xccb4, 0xc804,
7094af83c8cSKip Macy 		0xccb5, 0x5700,
7104af83c8cSKip Macy 		0xccb6, 0xc805,
7114af83c8cSKip Macy 		0xccb7, 0x5f11,
7124af83c8cSKip Macy 		0xccb8, 0xc806,
7134af83c8cSKip Macy 		0xccb9, 0x4751,
7144af83c8cSKip Macy 		0xccba, 0xc807,
7154af83c8cSKip Macy 		0xccbb, 0x57e1,
7164af83c8cSKip Macy 		0xccbc, 0xc808,
7174af83c8cSKip Macy 		0xccbd, 0x2700,
7184af83c8cSKip Macy 		0xccbe, 0xc809,
7194af83c8cSKip Macy 		0xccbf, 0x000,
7204af83c8cSKip Macy 		0xccc0, 0xc821,
7214af83c8cSKip Macy 		0xccc1, 0x002,
7224af83c8cSKip Macy 		0xccc2, 0xc822,
7234af83c8cSKip Macy 		0xccc3, 0x014,
7244af83c8cSKip Macy 		0xccc4, 0xc832,
7254af83c8cSKip Macy 		0xccc5, 0x1186,
7264af83c8cSKip Macy 		0xccc6, 0xc847,
7274af83c8cSKip Macy 		0xccc7, 0x1e02,
7284af83c8cSKip Macy 		0xccc8, 0xc013,
7294af83c8cSKip Macy 		0xccc9, 0xf341,
7304af83c8cSKip Macy 		0xccca, 0xc01a,
7314af83c8cSKip Macy 		0xcccb, 0x446,
7324af83c8cSKip Macy 		0xcccc, 0xc024,
7334af83c8cSKip Macy 		0xcccd, 0x1000,
7344af83c8cSKip Macy 		0xccce, 0xc025,
7354af83c8cSKip Macy 		0xcccf, 0xa00,
7364af83c8cSKip Macy 		0xccd0, 0xc026,
7374af83c8cSKip Macy 		0xccd1, 0xc0c,
7384af83c8cSKip Macy 		0xccd2, 0xc027,
7394af83c8cSKip Macy 		0xccd3, 0xc0c,
7404af83c8cSKip Macy 		0xccd4, 0xc029,
7414af83c8cSKip Macy 		0xccd5, 0x0a0,
7424af83c8cSKip Macy 		0xccd6, 0xc030,
7434af83c8cSKip Macy 		0xccd7, 0xa00,
7444af83c8cSKip Macy 		0xccd8, 0xc03c,
7454af83c8cSKip Macy 		0xccd9, 0x01c,
7464af83c8cSKip Macy 		0xccda, 0xc005,
7474af83c8cSKip Macy 		0xccdb, 0x7a06,
7484af83c8cSKip Macy 		0xccdc, 0x000,
7494af83c8cSKip Macy 		0xccdd, 0x2731,
7504af83c8cSKip Macy 		0xccde, 0x3011,
7514af83c8cSKip Macy 		0xccdf, 0x1001,
7524af83c8cSKip Macy 		0xcce0, 0xc620,
7534af83c8cSKip Macy 		0xcce1, 0x000,
7544af83c8cSKip Macy 		0xcce2, 0xc621,
7554af83c8cSKip Macy 		0xcce3, 0x03f,
7564af83c8cSKip Macy 		0xcce4, 0xc622,
7574af83c8cSKip Macy 		0xcce5, 0x000,
7584af83c8cSKip Macy 		0xcce6, 0xc623,
7594af83c8cSKip Macy 		0xcce7, 0x000,
7604af83c8cSKip Macy 		0xcce8, 0xc624,
7614af83c8cSKip Macy 		0xcce9, 0x000,
7624af83c8cSKip Macy 		0xccea, 0xc625,
7634af83c8cSKip Macy 		0xcceb, 0x000,
7644af83c8cSKip Macy 		0xccec, 0xc627,
7654af83c8cSKip Macy 		0xcced, 0x000,
7664af83c8cSKip Macy 		0xccee, 0xc628,
7674af83c8cSKip Macy 		0xccef, 0x000,
7684af83c8cSKip Macy 		0xccf0, 0xc62c,
7694af83c8cSKip Macy 		0xccf1, 0x000,
7704af83c8cSKip Macy 		0xccf2, 0x000,
7714af83c8cSKip Macy 		0xccf3, 0x2806,
7724af83c8cSKip Macy 		0xccf4, 0x3cb6,
7734af83c8cSKip Macy 		0xccf5, 0xc161,
7744af83c8cSKip Macy 		0xccf6, 0x6134,
7754af83c8cSKip Macy 		0xccf7, 0x6135,
7764af83c8cSKip Macy 		0xccf8, 0x5443,
7774af83c8cSKip Macy 		0xccf9, 0x303,
7784af83c8cSKip Macy 		0xccfa, 0x6524,
7794af83c8cSKip Macy 		0xccfb, 0x00b,
7804af83c8cSKip Macy 		0xccfc, 0x1002,
7814af83c8cSKip Macy 		0xccfd, 0x2104,
7824af83c8cSKip Macy 		0xccfe, 0x3c24,
7834af83c8cSKip Macy 		0xccff, 0x2105,
7844af83c8cSKip Macy 		0xcd00, 0x3805,
7854af83c8cSKip Macy 		0xcd01, 0x6524,
7864af83c8cSKip Macy 		0xcd02, 0xdff4,
7874af83c8cSKip Macy 		0xcd03, 0x4005,
7884af83c8cSKip Macy 		0xcd04, 0x6524,
7894af83c8cSKip Macy 		0xcd05, 0x1002,
7904af83c8cSKip Macy 		0xcd06, 0x5dd3,
7914af83c8cSKip Macy 		0xcd07, 0x306,
7924af83c8cSKip Macy 		0xcd08, 0x2ff7,
7934af83c8cSKip Macy 		0xcd09, 0x38f7,
7944af83c8cSKip Macy 		0xcd0a, 0x60b7,
7954af83c8cSKip Macy 		0xcd0b, 0xdffd,
7964af83c8cSKip Macy 		0xcd0c, 0x00a,
7974af83c8cSKip Macy 		0xcd0d, 0x1002,
7984af83c8cSKip Macy 		0xcd0e, 0
7994af83c8cSKip Macy 	};
8004af83c8cSKip Macy 	int i, err;
8014af83c8cSKip Macy 
8029b4de886SKip Macy 	err = set_phy_regs(phy, regs);
8039b4de886SKip Macy 	if (err)
8049b4de886SKip Macy 		return err;
8059b4de886SKip Macy 
8069b4de886SKip Macy 	msleep(50);
8079b4de886SKip Macy 
8089b4de886SKip Macy 	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
8094af83c8cSKip Macy 		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
8104af83c8cSKip Macy 				 sr_edc[i + 1]);
8119b4de886SKip Macy 	if (!err)
8129b4de886SKip Macy 		phy->priv = edc_sr;
8134af83c8cSKip Macy 	return err;
8144af83c8cSKip Macy }
8154af83c8cSKip Macy 
8169b4de886SKip Macy static int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
8179b4de886SKip Macy {
8189b4de886SKip Macy 	static struct reg_val regs[] = {
8199b4de886SKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
8209b4de886SKip Macy 		{ 0, 0, 0, 0 }
8219b4de886SKip Macy 	};
8229b4de886SKip Macy 	static struct reg_val preemphasis[] = {
8239b4de886SKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
8249b4de886SKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
8259b4de886SKip Macy 		{ 0, 0, 0, 0 }
8269b4de886SKip Macy 	};
8279b4de886SKip Macy 	static u16 twinax_edc[] = {
8289b4de886SKip Macy 		0xcc00, 0x4009,
8299b4de886SKip Macy 		0xcc01, 0x27ff,
8309b4de886SKip Macy 		0xcc02, 0x300f,
8319b4de886SKip Macy 		0xcc03, 0x40aa,
8329b4de886SKip Macy 		0xcc04, 0x401c,
8339b4de886SKip Macy 		0xcc05, 0x401e,
8349b4de886SKip Macy 		0xcc06, 0x2ff4,
8359b4de886SKip Macy 		0xcc07, 0x3cd4,
8369b4de886SKip Macy 		0xcc08, 0x2035,
8379b4de886SKip Macy 		0xcc09, 0x3145,
8389b4de886SKip Macy 		0xcc0a, 0x6524,
8399b4de886SKip Macy 		0xcc0b, 0x26a2,
8409b4de886SKip Macy 		0xcc0c, 0x3012,
8419b4de886SKip Macy 		0xcc0d, 0x1002,
8429b4de886SKip Macy 		0xcc0e, 0x29c2,
8439b4de886SKip Macy 		0xcc0f, 0x3002,
8449b4de886SKip Macy 		0xcc10, 0x1002,
8459b4de886SKip Macy 		0xcc11, 0x2072,
8469b4de886SKip Macy 		0xcc12, 0x3012,
8479b4de886SKip Macy 		0xcc13, 0x1002,
8489b4de886SKip Macy 		0xcc14, 0x22cd,
8499b4de886SKip Macy 		0xcc15, 0x301d,
8509b4de886SKip Macy 		0xcc16, 0x2e52,
8519b4de886SKip Macy 		0xcc17, 0x3012,
8529b4de886SKip Macy 		0xcc18, 0x1002,
8539b4de886SKip Macy 		0xcc19, 0x28e2,
8549b4de886SKip Macy 		0xcc1a, 0x3002,
8559b4de886SKip Macy 		0xcc1b, 0x1002,
8569b4de886SKip Macy 		0xcc1c, 0x628f,
8579b4de886SKip Macy 		0xcc1d, 0x2ac2,
8589b4de886SKip Macy 		0xcc1e, 0x3012,
8599b4de886SKip Macy 		0xcc1f, 0x1002,
8609b4de886SKip Macy 		0xcc20, 0x5553,
8619b4de886SKip Macy 		0xcc21, 0x2ae2,
8629b4de886SKip Macy 		0xcc22, 0x3002,
8639b4de886SKip Macy 		0xcc23, 0x1302,
8649b4de886SKip Macy 		0xcc24, 0x401e,
8659b4de886SKip Macy 		0xcc25, 0x2be2,
8669b4de886SKip Macy 		0xcc26, 0x3012,
8679b4de886SKip Macy 		0xcc27, 0x1002,
8689b4de886SKip Macy 		0xcc28, 0x2da2,
8699b4de886SKip Macy 		0xcc29, 0x3012,
8709b4de886SKip Macy 		0xcc2a, 0x1002,
8719b4de886SKip Macy 		0xcc2b, 0x2ba2,
8729b4de886SKip Macy 		0xcc2c, 0x3002,
8739b4de886SKip Macy 		0xcc2d, 0x1002,
8749b4de886SKip Macy 		0xcc2e, 0x5ee3,
8759b4de886SKip Macy 		0xcc2f, 0x305,
8769b4de886SKip Macy 		0xcc30, 0x400e,
8779b4de886SKip Macy 		0xcc31, 0x2bc2,
8789b4de886SKip Macy 		0xcc32, 0x3002,
8799b4de886SKip Macy 		0xcc33, 0x1002,
8809b4de886SKip Macy 		0xcc34, 0x2b82,
8819b4de886SKip Macy 		0xcc35, 0x3012,
8829b4de886SKip Macy 		0xcc36, 0x1002,
8839b4de886SKip Macy 		0xcc37, 0x5663,
8849b4de886SKip Macy 		0xcc38, 0x302,
8859b4de886SKip Macy 		0xcc39, 0x401e,
8869b4de886SKip Macy 		0xcc3a, 0x6f72,
8879b4de886SKip Macy 		0xcc3b, 0x1002,
8889b4de886SKip Macy 		0xcc3c, 0x628f,
8899b4de886SKip Macy 		0xcc3d, 0x2be2,
8909b4de886SKip Macy 		0xcc3e, 0x3012,
8919b4de886SKip Macy 		0xcc3f, 0x1002,
8929b4de886SKip Macy 		0xcc40, 0x22cd,
8939b4de886SKip Macy 		0xcc41, 0x301d,
8949b4de886SKip Macy 		0xcc42, 0x2e52,
8959b4de886SKip Macy 		0xcc43, 0x3012,
8969b4de886SKip Macy 		0xcc44, 0x1002,
8979b4de886SKip Macy 		0xcc45, 0x2522,
8989b4de886SKip Macy 		0xcc46, 0x3012,
8999b4de886SKip Macy 		0xcc47, 0x1002,
9009b4de886SKip Macy 		0xcc48, 0x2da2,
9019b4de886SKip Macy 		0xcc49, 0x3012,
9029b4de886SKip Macy 		0xcc4a, 0x1002,
9039b4de886SKip Macy 		0xcc4b, 0x2ca2,
9049b4de886SKip Macy 		0xcc4c, 0x3012,
9059b4de886SKip Macy 		0xcc4d, 0x1002,
9069b4de886SKip Macy 		0xcc4e, 0x2fa4,
9079b4de886SKip Macy 		0xcc4f, 0x3cd4,
9089b4de886SKip Macy 		0xcc50, 0x6624,
9099b4de886SKip Macy 		0xcc51, 0x410b,
9109b4de886SKip Macy 		0xcc52, 0x56b3,
9119b4de886SKip Macy 		0xcc53, 0x3c4,
9129b4de886SKip Macy 		0xcc54, 0x2fb2,
9139b4de886SKip Macy 		0xcc55, 0x3002,
9149b4de886SKip Macy 		0xcc56, 0x1002,
9159b4de886SKip Macy 		0xcc57, 0x220b,
9169b4de886SKip Macy 		0xcc58, 0x303b,
9179b4de886SKip Macy 		0xcc59, 0x56b3,
9189b4de886SKip Macy 		0xcc5a, 0x3c3,
9199b4de886SKip Macy 		0xcc5b, 0x866b,
9209b4de886SKip Macy 		0xcc5c, 0x400c,
9219b4de886SKip Macy 		0xcc5d, 0x23a2,
9229b4de886SKip Macy 		0xcc5e, 0x3012,
9239b4de886SKip Macy 		0xcc5f, 0x1002,
9249b4de886SKip Macy 		0xcc60, 0x2da2,
9259b4de886SKip Macy 		0xcc61, 0x3012,
9269b4de886SKip Macy 		0xcc62, 0x1002,
9279b4de886SKip Macy 		0xcc63, 0x2ca2,
9289b4de886SKip Macy 		0xcc64, 0x3012,
9299b4de886SKip Macy 		0xcc65, 0x1002,
9309b4de886SKip Macy 		0xcc66, 0x2fb4,
9319b4de886SKip Macy 		0xcc67, 0x3cd4,
9329b4de886SKip Macy 		0xcc68, 0x6624,
9339b4de886SKip Macy 		0xcc69, 0x56b3,
9349b4de886SKip Macy 		0xcc6a, 0x3c3,
9359b4de886SKip Macy 		0xcc6b, 0x866b,
9369b4de886SKip Macy 		0xcc6c, 0x401c,
9379b4de886SKip Macy 		0xcc6d, 0x2205,
9389b4de886SKip Macy 		0xcc6e, 0x3035,
9399b4de886SKip Macy 		0xcc6f, 0x5b53,
9409b4de886SKip Macy 		0xcc70, 0x2c52,
9419b4de886SKip Macy 		0xcc71, 0x3002,
9429b4de886SKip Macy 		0xcc72, 0x13c2,
9439b4de886SKip Macy 		0xcc73, 0x5cc3,
9449b4de886SKip Macy 		0xcc74, 0x317,
9459b4de886SKip Macy 		0xcc75, 0x2522,
9469b4de886SKip Macy 		0xcc76, 0x3012,
9479b4de886SKip Macy 		0xcc77, 0x1002,
9489b4de886SKip Macy 		0xcc78, 0x2da2,
9499b4de886SKip Macy 		0xcc79, 0x3012,
9509b4de886SKip Macy 		0xcc7a, 0x1002,
9519b4de886SKip Macy 		0xcc7b, 0x2b82,
9529b4de886SKip Macy 		0xcc7c, 0x3012,
9539b4de886SKip Macy 		0xcc7d, 0x1002,
9549b4de886SKip Macy 		0xcc7e, 0x5663,
9559b4de886SKip Macy 		0xcc7f, 0x303,
9569b4de886SKip Macy 		0xcc80, 0x401e,
9579b4de886SKip Macy 		0xcc81, 0x004,
9589b4de886SKip Macy 		0xcc82, 0x2c42,
9599b4de886SKip Macy 		0xcc83, 0x3012,
9609b4de886SKip Macy 		0xcc84, 0x1002,
9619b4de886SKip Macy 		0xcc85, 0x6f72,
9629b4de886SKip Macy 		0xcc86, 0x1002,
9639b4de886SKip Macy 		0xcc87, 0x628f,
9649b4de886SKip Macy 		0xcc88, 0x2304,
9659b4de886SKip Macy 		0xcc89, 0x3c84,
9669b4de886SKip Macy 		0xcc8a, 0x6436,
9679b4de886SKip Macy 		0xcc8b, 0xdff4,
9689b4de886SKip Macy 		0xcc8c, 0x6436,
9699b4de886SKip Macy 		0xcc8d, 0x2ff5,
9709b4de886SKip Macy 		0xcc8e, 0x3005,
9719b4de886SKip Macy 		0xcc8f, 0x8656,
9729b4de886SKip Macy 		0xcc90, 0xdfba,
9739b4de886SKip Macy 		0xcc91, 0x56a3,
9749b4de886SKip Macy 		0xcc92, 0xd05a,
9759b4de886SKip Macy 		0xcc93, 0x21c2,
9769b4de886SKip Macy 		0xcc94, 0x3012,
9779b4de886SKip Macy 		0xcc95, 0x1392,
9789b4de886SKip Macy 		0xcc96, 0xd05a,
9799b4de886SKip Macy 		0xcc97, 0x56a3,
9809b4de886SKip Macy 		0xcc98, 0xdfba,
9819b4de886SKip Macy 		0xcc99, 0x383,
9829b4de886SKip Macy 		0xcc9a, 0x6f72,
9839b4de886SKip Macy 		0xcc9b, 0x1002,
9849b4de886SKip Macy 		0xcc9c, 0x28c5,
9859b4de886SKip Macy 		0xcc9d, 0x3005,
9869b4de886SKip Macy 		0xcc9e, 0x4178,
9879b4de886SKip Macy 		0xcc9f, 0x5653,
9889b4de886SKip Macy 		0xcca0, 0x384,
9899b4de886SKip Macy 		0xcca1, 0x22b2,
9909b4de886SKip Macy 		0xcca2, 0x3012,
9919b4de886SKip Macy 		0xcca3, 0x1002,
9929b4de886SKip Macy 		0xcca4, 0x2be5,
9939b4de886SKip Macy 		0xcca5, 0x3005,
9949b4de886SKip Macy 		0xcca6, 0x41e8,
9959b4de886SKip Macy 		0xcca7, 0x5653,
9969b4de886SKip Macy 		0xcca8, 0x382,
9979b4de886SKip Macy 		0xcca9, 0x002,
9989b4de886SKip Macy 		0xccaa, 0x4258,
9999b4de886SKip Macy 		0xccab, 0x2474,
10009b4de886SKip Macy 		0xccac, 0x3c84,
10019b4de886SKip Macy 		0xccad, 0x6437,
10029b4de886SKip Macy 		0xccae, 0xdff4,
10039b4de886SKip Macy 		0xccaf, 0x6437,
10049b4de886SKip Macy 		0xccb0, 0x2ff5,
10059b4de886SKip Macy 		0xccb1, 0x3c05,
10069b4de886SKip Macy 		0xccb2, 0x8757,
10079b4de886SKip Macy 		0xccb3, 0xb888,
10089b4de886SKip Macy 		0xccb4, 0x9787,
10099b4de886SKip Macy 		0xccb5, 0xdff4,
10109b4de886SKip Macy 		0xccb6, 0x6724,
10119b4de886SKip Macy 		0xccb7, 0x866a,
10129b4de886SKip Macy 		0xccb8, 0x6f72,
10139b4de886SKip Macy 		0xccb9, 0x1002,
10149b4de886SKip Macy 		0xccba, 0x2d01,
10159b4de886SKip Macy 		0xccbb, 0x3011,
10169b4de886SKip Macy 		0xccbc, 0x1001,
10179b4de886SKip Macy 		0xccbd, 0xc620,
10189b4de886SKip Macy 		0xccbe, 0x14e5,
10199b4de886SKip Macy 		0xccbf, 0xc621,
10209b4de886SKip Macy 		0xccc0, 0xc53d,
10219b4de886SKip Macy 		0xccc1, 0xc622,
10229b4de886SKip Macy 		0xccc2, 0x3cbe,
10239b4de886SKip Macy 		0xccc3, 0xc623,
10249b4de886SKip Macy 		0xccc4, 0x4452,
10259b4de886SKip Macy 		0xccc5, 0xc624,
10269b4de886SKip Macy 		0xccc6, 0xc5c5,
10279b4de886SKip Macy 		0xccc7, 0xc625,
10289b4de886SKip Macy 		0xccc8, 0xe01e,
10299b4de886SKip Macy 		0xccc9, 0xc627,
10309b4de886SKip Macy 		0xccca, 0x000,
10319b4de886SKip Macy 		0xcccb, 0xc628,
10329b4de886SKip Macy 		0xcccc, 0x000,
10339b4de886SKip Macy 		0xcccd, 0xc62b,
10349b4de886SKip Macy 		0xccce, 0x000,
10359b4de886SKip Macy 		0xcccf, 0xc62c,
10369b4de886SKip Macy 		0xccd0, 0x000,
10379b4de886SKip Macy 		0xccd1, 0x000,
10389b4de886SKip Macy 		0xccd2, 0x2d01,
10399b4de886SKip Macy 		0xccd3, 0x3011,
10409b4de886SKip Macy 		0xccd4, 0x1001,
10419b4de886SKip Macy 		0xccd5, 0xc620,
10429b4de886SKip Macy 		0xccd6, 0x000,
10439b4de886SKip Macy 		0xccd7, 0xc621,
10449b4de886SKip Macy 		0xccd8, 0x000,
10459b4de886SKip Macy 		0xccd9, 0xc622,
10469b4de886SKip Macy 		0xccda, 0x0ce,
10479b4de886SKip Macy 		0xccdb, 0xc623,
10489b4de886SKip Macy 		0xccdc, 0x07f,
10499b4de886SKip Macy 		0xccdd, 0xc624,
10509b4de886SKip Macy 		0xccde, 0x032,
10519b4de886SKip Macy 		0xccdf, 0xc625,
10529b4de886SKip Macy 		0xcce0, 0x000,
10539b4de886SKip Macy 		0xcce1, 0xc627,
10549b4de886SKip Macy 		0xcce2, 0x000,
10559b4de886SKip Macy 		0xcce3, 0xc628,
10569b4de886SKip Macy 		0xcce4, 0x000,
10579b4de886SKip Macy 		0xcce5, 0xc62b,
10589b4de886SKip Macy 		0xcce6, 0x000,
10599b4de886SKip Macy 		0xcce7, 0xc62c,
10609b4de886SKip Macy 		0xcce8, 0x000,
10619b4de886SKip Macy 		0xcce9, 0x000,
10629b4de886SKip Macy 		0xccea, 0x2d01,
10639b4de886SKip Macy 		0xcceb, 0x3011,
10649b4de886SKip Macy 		0xccec, 0x1001,
10659b4de886SKip Macy 		0xcced, 0xc502,
10669b4de886SKip Macy 		0xccee, 0x609f,
10679b4de886SKip Macy 		0xccef, 0xc600,
10689b4de886SKip Macy 		0xccf0, 0x2a6e,
10699b4de886SKip Macy 		0xccf1, 0xc601,
10709b4de886SKip Macy 		0xccf2, 0x2a2c,
10719b4de886SKip Macy 		0xccf3, 0xc60c,
10729b4de886SKip Macy 		0xccf4, 0x5400,
10739b4de886SKip Macy 		0xccf5, 0xc710,
10749b4de886SKip Macy 		0xccf6, 0x700,
10759b4de886SKip Macy 		0xccf7, 0xc718,
10769b4de886SKip Macy 		0xccf8, 0x700,
10779b4de886SKip Macy 		0xccf9, 0xc720,
10789b4de886SKip Macy 		0xccfa, 0x4700,
10799b4de886SKip Macy 		0xccfb, 0xc728,
10809b4de886SKip Macy 		0xccfc, 0x700,
10819b4de886SKip Macy 		0xccfd, 0xc729,
10829b4de886SKip Macy 		0xccfe, 0x1207,
10839b4de886SKip Macy 		0xccff, 0xc801,
10849b4de886SKip Macy 		0xcd00, 0x7f50,
10859b4de886SKip Macy 		0xcd01, 0xc802,
10869b4de886SKip Macy 		0xcd02, 0x7760,
10879b4de886SKip Macy 		0xcd03, 0xc803,
10889b4de886SKip Macy 		0xcd04, 0x7fce,
10899b4de886SKip Macy 		0xcd05, 0xc804,
10909b4de886SKip Macy 		0xcd06, 0x520e,
10919b4de886SKip Macy 		0xcd07, 0xc805,
10929b4de886SKip Macy 		0xcd08, 0x5c11,
10939b4de886SKip Macy 		0xcd09, 0xc806,
10949b4de886SKip Macy 		0xcd0a, 0x3c51,
10959b4de886SKip Macy 		0xcd0b, 0xc807,
10969b4de886SKip Macy 		0xcd0c, 0x4061,
10979b4de886SKip Macy 		0xcd0d, 0xc808,
10989b4de886SKip Macy 		0xcd0e, 0x49c1,
10999b4de886SKip Macy 		0xcd0f, 0xc809,
11009b4de886SKip Macy 		0xcd10, 0x3840,
11019b4de886SKip Macy 		0xcd11, 0xc80a,
11029b4de886SKip Macy 		0xcd12, 0x000,
11039b4de886SKip Macy 		0xcd13, 0xc821,
11049b4de886SKip Macy 		0xcd14, 0x002,
11059b4de886SKip Macy 		0xcd15, 0xc822,
11069b4de886SKip Macy 		0xcd16, 0x046,
11079b4de886SKip Macy 		0xcd17, 0xc844,
11089b4de886SKip Macy 		0xcd18, 0x182f,
11099b4de886SKip Macy 		0xcd19, 0xc013,
11109b4de886SKip Macy 		0xcd1a, 0xf341,
11119b4de886SKip Macy 		0xcd1b, 0xc01a,
11129b4de886SKip Macy 		0xcd1c, 0x446,
11139b4de886SKip Macy 		0xcd1d, 0xc024,
11149b4de886SKip Macy 		0xcd1e, 0x1000,
11159b4de886SKip Macy 		0xcd1f, 0xc025,
11169b4de886SKip Macy 		0xcd20, 0xa00,
11179b4de886SKip Macy 		0xcd21, 0xc026,
11189b4de886SKip Macy 		0xcd22, 0xc0c,
11199b4de886SKip Macy 		0xcd23, 0xc027,
11209b4de886SKip Macy 		0xcd24, 0xc0c,
11219b4de886SKip Macy 		0xcd25, 0xc029,
11229b4de886SKip Macy 		0xcd26, 0x0a0,
11239b4de886SKip Macy 		0xcd27, 0xc030,
11249b4de886SKip Macy 		0xcd28, 0xa00,
11259b4de886SKip Macy 		0xcd29, 0xc03c,
11269b4de886SKip Macy 		0xcd2a, 0x01c,
11279b4de886SKip Macy 		0xcd2b, 0x000,
11289b4de886SKip Macy 		0xcd2c, 0x2b84,
11299b4de886SKip Macy 		0xcd2d, 0x3c74,
11309b4de886SKip Macy 		0xcd2e, 0x6435,
11319b4de886SKip Macy 		0xcd2f, 0xdff4,
11329b4de886SKip Macy 		0xcd30, 0x6435,
11339b4de886SKip Macy 		0xcd31, 0x2806,
11349b4de886SKip Macy 		0xcd32, 0x3006,
11359b4de886SKip Macy 		0xcd33, 0x8565,
11369b4de886SKip Macy 		0xcd34, 0x2b24,
11379b4de886SKip Macy 		0xcd35, 0x3c24,
11389b4de886SKip Macy 		0xcd36, 0x6436,
11399b4de886SKip Macy 		0xcd37, 0x1002,
11409b4de886SKip Macy 		0xcd38, 0x2b24,
11419b4de886SKip Macy 		0xcd39, 0x3c24,
11429b4de886SKip Macy 		0xcd3a, 0x6436,
11439b4de886SKip Macy 		0xcd3b, 0x4045,
11449b4de886SKip Macy 		0xcd3c, 0x8656,
11459b4de886SKip Macy 		0xcd3d, 0x1002,
11469b4de886SKip Macy 		0xcd3e, 0x2807,
11479b4de886SKip Macy 		0xcd3f, 0x31a7,
11489b4de886SKip Macy 		0xcd40, 0x20c4,
11499b4de886SKip Macy 		0xcd41, 0x3c24,
11509b4de886SKip Macy 		0xcd42, 0x6724,
11519b4de886SKip Macy 		0xcd43, 0x1002,
11529b4de886SKip Macy 		0xcd44, 0x2807,
11539b4de886SKip Macy 		0xcd45, 0x3187,
11549b4de886SKip Macy 		0xcd46, 0x20c4,
11559b4de886SKip Macy 		0xcd47, 0x3c24,
11569b4de886SKip Macy 		0xcd48, 0x6724,
11579b4de886SKip Macy 		0xcd49, 0x1002,
11589b4de886SKip Macy 		0xcd4a, 0x2514,
11599b4de886SKip Macy 		0xcd4b, 0x3c64,
11609b4de886SKip Macy 		0xcd4c, 0x6436,
11619b4de886SKip Macy 		0xcd4d, 0xdff4,
11629b4de886SKip Macy 		0xcd4e, 0x6436,
11639b4de886SKip Macy 		0xcd4f, 0x1002,
11649b4de886SKip Macy 		0xcd50, 0x2806,
11659b4de886SKip Macy 		0xcd51, 0x3cb6,
11669b4de886SKip Macy 		0xcd52, 0xc161,
11679b4de886SKip Macy 		0xcd53, 0x6134,
11689b4de886SKip Macy 		0xcd54, 0x6135,
11699b4de886SKip Macy 		0xcd55, 0x5443,
11709b4de886SKip Macy 		0xcd56, 0x303,
11719b4de886SKip Macy 		0xcd57, 0x6524,
11729b4de886SKip Macy 		0xcd58, 0x00b,
11739b4de886SKip Macy 		0xcd59, 0x1002,
11749b4de886SKip Macy 		0xcd5a, 0xd019,
11759b4de886SKip Macy 		0xcd5b, 0x2104,
11769b4de886SKip Macy 		0xcd5c, 0x3c24,
11779b4de886SKip Macy 		0xcd5d, 0x2105,
11789b4de886SKip Macy 		0xcd5e, 0x3805,
11799b4de886SKip Macy 		0xcd5f, 0x6524,
11809b4de886SKip Macy 		0xcd60, 0xdff4,
11819b4de886SKip Macy 		0xcd61, 0x4005,
11829b4de886SKip Macy 		0xcd62, 0x6524,
11839b4de886SKip Macy 		0xcd63, 0x2e8d,
11849b4de886SKip Macy 		0xcd64, 0x303d,
11859b4de886SKip Macy 		0xcd65, 0x5dd3,
11869b4de886SKip Macy 		0xcd66, 0x306,
11879b4de886SKip Macy 		0xcd67, 0x2ff7,
11889b4de886SKip Macy 		0xcd68, 0x38f7,
11899b4de886SKip Macy 		0xcd69, 0x60b7,
11909b4de886SKip Macy 		0xcd6a, 0xdffd,
11919b4de886SKip Macy 		0xcd6b, 0x00a,
11929b4de886SKip Macy 		0xcd6c, 0x1002,
11939b4de886SKip Macy 		0xcd6d, 0
11949b4de886SKip Macy 	};
11959b4de886SKip Macy 	int i, err;
11969b4de886SKip Macy 
11979b4de886SKip Macy 	err = set_phy_regs(phy, regs);
11989b4de886SKip Macy 	if (!err && modtype == phy_modtype_twinax_long)
11999b4de886SKip Macy 		err = set_phy_regs(phy, preemphasis);
12009b4de886SKip Macy 	if (err)
12019b4de886SKip Macy 		return err;
12029b4de886SKip Macy 
12039b4de886SKip Macy 	msleep(50);
12049b4de886SKip Macy 
12059b4de886SKip Macy 	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
12069b4de886SKip Macy 		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
12079b4de886SKip Macy 				 twinax_edc[i + 1]);
12089b4de886SKip Macy 	if (!err)
12099b4de886SKip Macy 		phy->priv = edc_twinax;
12109b4de886SKip Macy 	return err;
12119b4de886SKip Macy }
12129b4de886SKip Macy 
1213c01f2b83SNavdeep Parhar static int ael2005_get_module_type(struct cphy *phy, int delay_ms)
12149b4de886SKip Macy {
12159b4de886SKip Macy 	int v;
1216c01f2b83SNavdeep Parhar 	unsigned int stat;
12179b4de886SKip Macy 
1218c01f2b83SNavdeep Parhar 	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
1219c01f2b83SNavdeep Parhar 	if (v)
12209b4de886SKip Macy 		return v;
12219b4de886SKip Macy 
1222c01f2b83SNavdeep Parhar 	if (stat & (1 << 8))			/* module absent */
1223c01f2b83SNavdeep Parhar 		return phy_modtype_none;
12249b4de886SKip Macy 
1225c01f2b83SNavdeep Parhar 	return ael2xxx_get_module_type(phy, delay_ms);
12269b4de886SKip Macy }
12279b4de886SKip Macy 
12289b4de886SKip Macy static int ael2005_intr_enable(struct cphy *phy)
12299b4de886SKip Macy {
12309b4de886SKip Macy 	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
12319b4de886SKip Macy 	return err ? err : t3_phy_lasi_intr_enable(phy);
12329b4de886SKip Macy }
12339b4de886SKip Macy 
12349b4de886SKip Macy static int ael2005_intr_disable(struct cphy *phy)
12359b4de886SKip Macy {
12369b4de886SKip Macy 	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
12379b4de886SKip Macy 	return err ? err : t3_phy_lasi_intr_disable(phy);
12389b4de886SKip Macy }
12399b4de886SKip Macy 
12409b4de886SKip Macy static int ael2005_intr_clear(struct cphy *phy)
12419b4de886SKip Macy {
12429b4de886SKip Macy 	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
12439b4de886SKip Macy 	return err ? err : t3_phy_lasi_intr_clear(phy);
12449b4de886SKip Macy }
12459b4de886SKip Macy 
12464af83c8cSKip Macy static int ael2005_reset(struct cphy *phy, int wait)
12474af83c8cSKip Macy {
12484af83c8cSKip Macy 	static struct reg_val regs0[] = {
12494af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
12504af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
12514af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
12524af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
12534af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
12544af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
12554af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
12564af83c8cSKip Macy 		{ 0, 0, 0, 0 }
12574af83c8cSKip Macy 	};
12584af83c8cSKip Macy 	static struct reg_val regs1[] = {
12594af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
12604af83c8cSKip Macy 		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
12614af83c8cSKip Macy 		{ 0, 0, 0, 0 }
12624af83c8cSKip Macy 	};
12634af83c8cSKip Macy 
1264c01f2b83SNavdeep Parhar 	int err;
1265c01f2b83SNavdeep Parhar 	unsigned int lasi_ctrl;
12669b4de886SKip Macy 
12679b4de886SKip Macy 	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
12689b4de886SKip Macy 	if (err)
12699b4de886SKip Macy 		return err;
12704af83c8cSKip Macy 
12714af83c8cSKip Macy 	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
12724af83c8cSKip Macy 	if (err)
12734af83c8cSKip Macy 		return err;
12744af83c8cSKip Macy 
12754af83c8cSKip Macy 	msleep(125);
12769b4de886SKip Macy 	phy->priv = edc_none;
12774af83c8cSKip Macy 	err = set_phy_regs(phy, regs0);
12784af83c8cSKip Macy 	if (err)
12794af83c8cSKip Macy 		return err;
12804af83c8cSKip Macy 
12814af83c8cSKip Macy 	msleep(50);
12824af83c8cSKip Macy 
1283837f41b0SGeorge V. Neville-Neil 	err = ael2005_get_module_type(phy, 0);
12849b4de886SKip Macy 	if (err < 0)
12859b4de886SKip Macy 		return err;
12869b4de886SKip Macy 	phy->modtype = (u8)err;
12879b4de886SKip Macy 
12881fa10c92SNavdeep Parhar 	if (err == phy_modtype_none)
12890bbdea77SGeorge V. Neville-Neil 		err = 0;
12900bbdea77SGeorge V. Neville-Neil 	else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
12919b4de886SKip Macy 		err = ael2005_setup_twinax_edc(phy, err);
12929b4de886SKip Macy 	else
12934af83c8cSKip Macy 		err = ael2005_setup_sr_edc(phy);
12944af83c8cSKip Macy 	if (err)
12954af83c8cSKip Macy 		return err;
12964af83c8cSKip Macy 
12979b4de886SKip Macy 	err = set_phy_regs(phy, regs1);
12989b4de886SKip Macy 	if (err)
12999b4de886SKip Macy 		return err;
13009b4de886SKip Macy 
13019b4de886SKip Macy 	/* reset wipes out interrupts, reenable them if they were on */
13029b4de886SKip Macy 	if (lasi_ctrl & 1)
13039b4de886SKip Macy 		err = ael2005_intr_enable(phy);
13049b4de886SKip Macy 	return err;
13059b4de886SKip Macy }
13069b4de886SKip Macy 
13079b4de886SKip Macy static int ael2005_intr_handler(struct cphy *phy)
13089b4de886SKip Macy {
13099b4de886SKip Macy 	unsigned int stat;
13109b4de886SKip Macy 	int ret, edc_needed, cause = 0;
13119b4de886SKip Macy 
13129b4de886SKip Macy 	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
13139b4de886SKip Macy 	if (ret)
13149b4de886SKip Macy 		return ret;
13159b4de886SKip Macy 
13169b4de886SKip Macy 	if (stat & AEL2005_MODDET_IRQ) {
13179b4de886SKip Macy 		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
13189b4de886SKip Macy 				 0xd00);
13199b4de886SKip Macy 		if (ret)
13209b4de886SKip Macy 			return ret;
13219b4de886SKip Macy 
13229b4de886SKip Macy 		/* modules have max 300 ms init time after hot plug */
1323837f41b0SGeorge V. Neville-Neil 		ret = ael2005_get_module_type(phy, 300);
13249b4de886SKip Macy 		if (ret < 0)
13259b4de886SKip Macy 			return ret;
13269b4de886SKip Macy 
13279b4de886SKip Macy 		phy->modtype = (u8)ret;
13289b4de886SKip Macy 		if (ret == phy_modtype_none)
13299b4de886SKip Macy 			edc_needed = phy->priv;       /* on unplug retain EDC */
13309b4de886SKip Macy 		else if (ret == phy_modtype_twinax ||
13319b4de886SKip Macy 			 ret == phy_modtype_twinax_long)
13329b4de886SKip Macy 			edc_needed = edc_twinax;
13339b4de886SKip Macy 		else
13349b4de886SKip Macy 			edc_needed = edc_sr;
13359b4de886SKip Macy 
13369b4de886SKip Macy 		if (edc_needed != phy->priv) {
13379b4de886SKip Macy 			ret = ael2005_reset(phy, 0);
13389b4de886SKip Macy 			return ret ? ret : cphy_cause_module_change;
13399b4de886SKip Macy 		}
13409b4de886SKip Macy 		cause = cphy_cause_module_change;
13419b4de886SKip Macy 	}
13429b4de886SKip Macy 
13439b4de886SKip Macy 	ret = t3_phy_lasi_intr_handler(phy);
1344f2d8ff04SGeorge V. Neville-Neil 	if (ret < 0)
1345f2d8ff04SGeorge V. Neville-Neil 		return ret;
1346f2d8ff04SGeorge V. Neville-Neil 
1347f2d8ff04SGeorge V. Neville-Neil 	ret |= cause;
1348f2d8ff04SGeorge V. Neville-Neil 	if (!ret)
1349f2d8ff04SGeorge V. Neville-Neil 		ret |= cphy_cause_link_change;
1350f2d8ff04SGeorge V. Neville-Neil 	return ret;
13514af83c8cSKip Macy }
13524af83c8cSKip Macy 
13534af83c8cSKip Macy static struct cphy_ops ael2005_ops = {
1354c01f2b83SNavdeep Parhar #ifdef C99_NOT_SUPPORTED
13554af83c8cSKip Macy 	ael2005_reset,
13569b4de886SKip Macy 	ael2005_intr_enable,
13579b4de886SKip Macy 	ael2005_intr_disable,
13589b4de886SKip Macy 	ael2005_intr_clear,
13599b4de886SKip Macy 	ael2005_intr_handler,
13604af83c8cSKip Macy 	NULL,
13614af83c8cSKip Macy 	NULL,
13624af83c8cSKip Macy 	NULL,
13634af83c8cSKip Macy 	NULL,
13644af83c8cSKip Macy 	NULL,
13659b4de886SKip Macy 	get_link_status_r,
13664af83c8cSKip Macy 	ael1002_power_down,
13674af83c8cSKip Macy #else
13684af83c8cSKip Macy 	.reset           = ael2005_reset,
13699b4de886SKip Macy 	.intr_enable     = ael2005_intr_enable,
13709b4de886SKip Macy 	.intr_disable    = ael2005_intr_disable,
13719b4de886SKip Macy 	.intr_clear      = ael2005_intr_clear,
13729b4de886SKip Macy 	.intr_handler    = ael2005_intr_handler,
13739b4de886SKip Macy 	.get_link_status = get_link_status_r,
13744af83c8cSKip Macy 	.power_down      = ael1002_power_down,
13754af83c8cSKip Macy #endif
1376c01f2b83SNavdeep Parhar };
13774af83c8cSKip Macy 
1378c01f2b83SNavdeep Parhar int t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr,
13794af83c8cSKip Macy 			const struct mdio_ops *mdio_ops)
13804af83c8cSKip Macy {
1381837f41b0SGeorge V. Neville-Neil 	int err;
1382c01f2b83SNavdeep Parhar 	struct cphy *phy = &pinfo->phy;
1383c01f2b83SNavdeep Parhar 
1384c01f2b83SNavdeep Parhar 	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2005_ops, mdio_ops,
13859b4de886SKip Macy 		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
13869b4de886SKip Macy 		  SUPPORTED_IRQ, "10GBASE-R");
13874af83c8cSKip Macy 	msleep(125);
1388f2d8ff04SGeorge V. Neville-Neil 	ael_laser_down(phy, 0);
1389837f41b0SGeorge V. Neville-Neil 
1390837f41b0SGeorge V. Neville-Neil 	err = ael2005_get_module_type(phy, 0);
1391837f41b0SGeorge V. Neville-Neil 	if (err >= 0)
1392837f41b0SGeorge V. Neville-Neil 		phy->modtype = err;
1393837f41b0SGeorge V. Neville-Neil 
13944af83c8cSKip Macy 	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
13954af83c8cSKip Macy 				   1 << 5);
13964af83c8cSKip Macy }
13974af83c8cSKip Macy 
13989b4de886SKip Macy /*
1399c01f2b83SNavdeep Parhar  * Setup EDC and other parameters for operation with an optical module.
1400c01f2b83SNavdeep Parhar  */
1401c01f2b83SNavdeep Parhar static int ael2020_setup_sr_edc(struct cphy *phy)
1402c01f2b83SNavdeep Parhar {
1403c01f2b83SNavdeep Parhar 	static struct reg_val regs[] = {
1404c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xcc01, 0xffff, 0x488a },
1405c01f2b83SNavdeep Parhar 
1406c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xcb1b, 0xffff, 0x0200 },
1407c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xcb1c, 0xffff, 0x00f0 },
1408c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xcc06, 0xffff, 0x00e0 },
1409c01f2b83SNavdeep Parhar 
1410c01f2b83SNavdeep Parhar 		/* end */
1411c01f2b83SNavdeep Parhar 		{ 0, 0, 0, 0 }
1412c01f2b83SNavdeep Parhar 	};
1413c01f2b83SNavdeep Parhar 	int err;
1414c01f2b83SNavdeep Parhar 
1415c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, regs);
1416c01f2b83SNavdeep Parhar 	msleep(50);
1417c01f2b83SNavdeep Parhar 	if (err)
1418c01f2b83SNavdeep Parhar 		return err;
1419c01f2b83SNavdeep Parhar 
1420c01f2b83SNavdeep Parhar 	phy->priv = edc_sr;
1421c01f2b83SNavdeep Parhar 	return 0;
1422c01f2b83SNavdeep Parhar }
1423c01f2b83SNavdeep Parhar 
1424c01f2b83SNavdeep Parhar /*
1425c01f2b83SNavdeep Parhar  * Setup EDC and other parameters for operation with an TWINAX module.
1426c01f2b83SNavdeep Parhar  */
1427c01f2b83SNavdeep Parhar static int ael2020_setup_twinax_edc(struct cphy *phy, int modtype)
1428c01f2b83SNavdeep Parhar {
1429c01f2b83SNavdeep Parhar 	static struct reg_val uCclock40MHz[] = {
1430c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xff28, 0xffff, 0x4001 },
1431c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xff2a, 0xffff, 0x0002 },
1432c01f2b83SNavdeep Parhar 		{ 0, 0, 0, 0 }
1433c01f2b83SNavdeep Parhar 	};
1434c01f2b83SNavdeep Parhar 
1435c01f2b83SNavdeep Parhar 	static struct reg_val uCclockActivate[] = {
1436c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xd000, 0xffff, 0x5200 },
1437c01f2b83SNavdeep Parhar 		{ 0, 0, 0, 0 }
1438c01f2b83SNavdeep Parhar 	};
1439c01f2b83SNavdeep Parhar 
1440c01f2b83SNavdeep Parhar 	static struct reg_val uCactivate[] = {
1441c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xd080, 0xffff, 0x0100 },
1442c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, 0xd092, 0xffff, 0x0000 },
1443c01f2b83SNavdeep Parhar 		{ 0, 0, 0, 0 }
1444c01f2b83SNavdeep Parhar 	};
1445c01f2b83SNavdeep Parhar 
1446c01f2b83SNavdeep Parhar 	static u16 twinax_edc[] = {
1447c01f2b83SNavdeep Parhar 		0xd800, 0x4009,
1448c01f2b83SNavdeep Parhar 		0xd801, 0x2fff,
1449c01f2b83SNavdeep Parhar 		0xd802, 0x300f,
1450c01f2b83SNavdeep Parhar 		0xd803, 0x40aa,
1451c01f2b83SNavdeep Parhar 		0xd804, 0x401c,
1452c01f2b83SNavdeep Parhar 		0xd805, 0x401e,
145383179d39SNavdeep Parhar 		0xd806, 0x20c5,
145483179d39SNavdeep Parhar 		0xd807, 0x3c05,
145583179d39SNavdeep Parhar 		0xd808, 0x6536,
145683179d39SNavdeep Parhar 		0xd809, 0x2fe4,
145783179d39SNavdeep Parhar 		0xd80a, 0x3dc4,
145883179d39SNavdeep Parhar 		0xd80b, 0x6624,
145983179d39SNavdeep Parhar 		0xd80c, 0x2ff4,
146083179d39SNavdeep Parhar 		0xd80d, 0x3dc4,
146183179d39SNavdeep Parhar 		0xd80e, 0x2035,
146283179d39SNavdeep Parhar 		0xd80f, 0x30a5,
146383179d39SNavdeep Parhar 		0xd810, 0x6524,
146483179d39SNavdeep Parhar 		0xd811, 0x2ca2,
146583179d39SNavdeep Parhar 		0xd812, 0x3012,
1466c01f2b83SNavdeep Parhar 		0xd813, 0x1002,
146783179d39SNavdeep Parhar 		0xd814, 0x27e2,
146883179d39SNavdeep Parhar 		0xd815, 0x3022,
1469c01f2b83SNavdeep Parhar 		0xd816, 0x1002,
147083179d39SNavdeep Parhar 		0xd817, 0x28d2,
1471c01f2b83SNavdeep Parhar 		0xd818, 0x3022,
1472c01f2b83SNavdeep Parhar 		0xd819, 0x1002,
147383179d39SNavdeep Parhar 		0xd81a, 0x2892,
1474c01f2b83SNavdeep Parhar 		0xd81b, 0x3012,
1475c01f2b83SNavdeep Parhar 		0xd81c, 0x1002,
147683179d39SNavdeep Parhar 		0xd81d, 0x24e2,
1477c01f2b83SNavdeep Parhar 		0xd81e, 0x3022,
1478c01f2b83SNavdeep Parhar 		0xd81f, 0x1002,
147983179d39SNavdeep Parhar 		0xd820, 0x27e2,
148083179d39SNavdeep Parhar 		0xd821, 0x3012,
148183179d39SNavdeep Parhar 		0xd822, 0x1002,
148283179d39SNavdeep Parhar 		0xd823, 0x2422,
148383179d39SNavdeep Parhar 		0xd824, 0x3022,
148483179d39SNavdeep Parhar 		0xd825, 0x1002,
148583179d39SNavdeep Parhar 		0xd826, 0x22cd,
148683179d39SNavdeep Parhar 		0xd827, 0x301d,
148783179d39SNavdeep Parhar 		0xd828, 0x28f2,
148883179d39SNavdeep Parhar 		0xd829, 0x3022,
148983179d39SNavdeep Parhar 		0xd82a, 0x1002,
149083179d39SNavdeep Parhar 		0xd82b, 0x5553,
149183179d39SNavdeep Parhar 		0xd82c, 0x0307,
149283179d39SNavdeep Parhar 		0xd82d, 0x2572,
149383179d39SNavdeep Parhar 		0xd82e, 0x3022,
149483179d39SNavdeep Parhar 		0xd82f, 0x1002,
149583179d39SNavdeep Parhar 		0xd830, 0x21a2,
1496c01f2b83SNavdeep Parhar 		0xd831, 0x3012,
1497c01f2b83SNavdeep Parhar 		0xd832, 0x1002,
149883179d39SNavdeep Parhar 		0xd833, 0x4016,
149983179d39SNavdeep Parhar 		0xd834, 0x5e63,
150083179d39SNavdeep Parhar 		0xd835, 0x0344,
150183179d39SNavdeep Parhar 		0xd836, 0x21a2,
150283179d39SNavdeep Parhar 		0xd837, 0x3012,
150383179d39SNavdeep Parhar 		0xd838, 0x1002,
150483179d39SNavdeep Parhar 		0xd839, 0x400e,
150583179d39SNavdeep Parhar 		0xd83a, 0x2572,
1506c01f2b83SNavdeep Parhar 		0xd83b, 0x3022,
1507c01f2b83SNavdeep Parhar 		0xd83c, 0x1002,
150883179d39SNavdeep Parhar 		0xd83d, 0x2b22,
150983179d39SNavdeep Parhar 		0xd83e, 0x3012,
1510c01f2b83SNavdeep Parhar 		0xd83f, 0x1002,
151183179d39SNavdeep Parhar 		0xd840, 0x2842,
151283179d39SNavdeep Parhar 		0xd841, 0x3022,
151383179d39SNavdeep Parhar 		0xd842, 0x1002,
151483179d39SNavdeep Parhar 		0xd843, 0x26e2,
151583179d39SNavdeep Parhar 		0xd844, 0x3022,
151683179d39SNavdeep Parhar 		0xd845, 0x1002,
151783179d39SNavdeep Parhar 		0xd846, 0x2fa4,
151883179d39SNavdeep Parhar 		0xd847, 0x3dc4,
151983179d39SNavdeep Parhar 		0xd848, 0x6624,
152083179d39SNavdeep Parhar 		0xd849, 0x2e8b,
152183179d39SNavdeep Parhar 		0xd84a, 0x303b,
152283179d39SNavdeep Parhar 		0xd84b, 0x56b3,
152383179d39SNavdeep Parhar 		0xd84c, 0x03c6,
152483179d39SNavdeep Parhar 		0xd84d, 0x866b,
152583179d39SNavdeep Parhar 		0xd84e, 0x400c,
152683179d39SNavdeep Parhar 		0xd84f, 0x2782,
152783179d39SNavdeep Parhar 		0xd850, 0x3012,
152883179d39SNavdeep Parhar 		0xd851, 0x1002,
152983179d39SNavdeep Parhar 		0xd852, 0x2c4b,
153083179d39SNavdeep Parhar 		0xd853, 0x309b,
153183179d39SNavdeep Parhar 		0xd854, 0x56b3,
153283179d39SNavdeep Parhar 		0xd855, 0x03c3,
153383179d39SNavdeep Parhar 		0xd856, 0x866b,
153483179d39SNavdeep Parhar 		0xd857, 0x400c,
153583179d39SNavdeep Parhar 		0xd858, 0x22a2,
153683179d39SNavdeep Parhar 		0xd859, 0x3022,
153783179d39SNavdeep Parhar 		0xd85a, 0x1002,
153883179d39SNavdeep Parhar 		0xd85b, 0x2842,
153983179d39SNavdeep Parhar 		0xd85c, 0x3022,
154083179d39SNavdeep Parhar 		0xd85d, 0x1002,
154183179d39SNavdeep Parhar 		0xd85e, 0x26e2,
154283179d39SNavdeep Parhar 		0xd85f, 0x3022,
154383179d39SNavdeep Parhar 		0xd860, 0x1002,
154483179d39SNavdeep Parhar 		0xd861, 0x2fb4,
154583179d39SNavdeep Parhar 		0xd862, 0x3dc4,
154683179d39SNavdeep Parhar 		0xd863, 0x6624,
154783179d39SNavdeep Parhar 		0xd864, 0x56b3,
154883179d39SNavdeep Parhar 		0xd865, 0x03c3,
154983179d39SNavdeep Parhar 		0xd866, 0x866b,
155083179d39SNavdeep Parhar 		0xd867, 0x401c,
155183179d39SNavdeep Parhar 		0xd868, 0x2c45,
155283179d39SNavdeep Parhar 		0xd869, 0x3095,
155383179d39SNavdeep Parhar 		0xd86a, 0x5b53,
155483179d39SNavdeep Parhar 		0xd86b, 0x23d2,
1555c01f2b83SNavdeep Parhar 		0xd86c, 0x3012,
155683179d39SNavdeep Parhar 		0xd86d, 0x13c2,
155783179d39SNavdeep Parhar 		0xd86e, 0x5cc3,
155883179d39SNavdeep Parhar 		0xd86f, 0x2782,
155983179d39SNavdeep Parhar 		0xd870, 0x3012,
156083179d39SNavdeep Parhar 		0xd871, 0x1312,
156183179d39SNavdeep Parhar 		0xd872, 0x2b22,
156283179d39SNavdeep Parhar 		0xd873, 0x3012,
156383179d39SNavdeep Parhar 		0xd874, 0x1002,
156483179d39SNavdeep Parhar 		0xd875, 0x2842,
156583179d39SNavdeep Parhar 		0xd876, 0x3022,
156683179d39SNavdeep Parhar 		0xd877, 0x1002,
156783179d39SNavdeep Parhar 		0xd878, 0x2622,
156883179d39SNavdeep Parhar 		0xd879, 0x3022,
156983179d39SNavdeep Parhar 		0xd87a, 0x1002,
157083179d39SNavdeep Parhar 		0xd87b, 0x21a2,
157183179d39SNavdeep Parhar 		0xd87c, 0x3012,
157283179d39SNavdeep Parhar 		0xd87d, 0x1002,
157383179d39SNavdeep Parhar 		0xd87e, 0x628f,
157483179d39SNavdeep Parhar 		0xd87f, 0x2985,
157583179d39SNavdeep Parhar 		0xd880, 0x33a5,
157683179d39SNavdeep Parhar 		0xd881, 0x26e2,
157783179d39SNavdeep Parhar 		0xd882, 0x3022,
157883179d39SNavdeep Parhar 		0xd883, 0x1002,
157983179d39SNavdeep Parhar 		0xd884, 0x5653,
158083179d39SNavdeep Parhar 		0xd885, 0x03d2,
158183179d39SNavdeep Parhar 		0xd886, 0x401e,
158283179d39SNavdeep Parhar 		0xd887, 0x6f72,
158383179d39SNavdeep Parhar 		0xd888, 0x1002,
158483179d39SNavdeep Parhar 		0xd889, 0x628f,
158583179d39SNavdeep Parhar 		0xd88a, 0x2304,
158683179d39SNavdeep Parhar 		0xd88b, 0x3c84,
158783179d39SNavdeep Parhar 		0xd88c, 0x6436,
158883179d39SNavdeep Parhar 		0xd88d, 0xdff4,
158983179d39SNavdeep Parhar 		0xd88e, 0x6436,
159083179d39SNavdeep Parhar 		0xd88f, 0x2ff5,
159183179d39SNavdeep Parhar 		0xd890, 0x3005,
159283179d39SNavdeep Parhar 		0xd891, 0x8656,
159383179d39SNavdeep Parhar 		0xd892, 0xdfba,
159483179d39SNavdeep Parhar 		0xd893, 0x56a3,
159583179d39SNavdeep Parhar 		0xd894, 0xd05a,
159683179d39SNavdeep Parhar 		0xd895, 0x29e2,
159783179d39SNavdeep Parhar 		0xd896, 0x3012,
159883179d39SNavdeep Parhar 		0xd897, 0x1392,
159983179d39SNavdeep Parhar 		0xd898, 0xd05a,
160083179d39SNavdeep Parhar 		0xd899, 0x56a3,
160183179d39SNavdeep Parhar 		0xd89a, 0xdfba,
160283179d39SNavdeep Parhar 		0xd89b, 0x0383,
160383179d39SNavdeep Parhar 		0xd89c, 0x6f72,
160483179d39SNavdeep Parhar 		0xd89d, 0x1002,
160583179d39SNavdeep Parhar 		0xd89e, 0x2a64,
160683179d39SNavdeep Parhar 		0xd89f, 0x3014,
160783179d39SNavdeep Parhar 		0xd8a0, 0x2005,
160883179d39SNavdeep Parhar 		0xd8a1, 0x3d75,
160983179d39SNavdeep Parhar 		0xd8a2, 0xc451,
161083179d39SNavdeep Parhar 		0xd8a3, 0x29a2,
161183179d39SNavdeep Parhar 		0xd8a4, 0x3022,
161283179d39SNavdeep Parhar 		0xd8a5, 0x1002,
161383179d39SNavdeep Parhar 		0xd8a6, 0x178c,
161483179d39SNavdeep Parhar 		0xd8a7, 0x1898,
161583179d39SNavdeep Parhar 		0xd8a8, 0x19a4,
161683179d39SNavdeep Parhar 		0xd8a9, 0x1ab0,
161783179d39SNavdeep Parhar 		0xd8aa, 0x1bbc,
161883179d39SNavdeep Parhar 		0xd8ab, 0x1cc8,
161983179d39SNavdeep Parhar 		0xd8ac, 0x1dd3,
162083179d39SNavdeep Parhar 		0xd8ad, 0x1ede,
162183179d39SNavdeep Parhar 		0xd8ae, 0x1fe9,
162283179d39SNavdeep Parhar 		0xd8af, 0x20f4,
162383179d39SNavdeep Parhar 		0xd8b0, 0x21ff,
162483179d39SNavdeep Parhar 		0xd8b1, 0x0000,
162583179d39SNavdeep Parhar 		0xd8b2, 0x2741,
162683179d39SNavdeep Parhar 		0xd8b3, 0x3021,
162783179d39SNavdeep Parhar 		0xd8b4, 0x1001,
162883179d39SNavdeep Parhar 		0xd8b5, 0xc620,
162983179d39SNavdeep Parhar 		0xd8b6, 0x0000,
163083179d39SNavdeep Parhar 		0xd8b7, 0xc621,
163183179d39SNavdeep Parhar 		0xd8b8, 0x0000,
163283179d39SNavdeep Parhar 		0xd8b9, 0xc622,
163383179d39SNavdeep Parhar 		0xd8ba, 0x00e2,
163483179d39SNavdeep Parhar 		0xd8bb, 0xc623,
163583179d39SNavdeep Parhar 		0xd8bc, 0x007f,
163683179d39SNavdeep Parhar 		0xd8bd, 0xc624,
163783179d39SNavdeep Parhar 		0xd8be, 0x00ce,
163883179d39SNavdeep Parhar 		0xd8bf, 0xc625,
163983179d39SNavdeep Parhar 		0xd8c0, 0x0000,
164083179d39SNavdeep Parhar 		0xd8c1, 0xc627,
164183179d39SNavdeep Parhar 		0xd8c2, 0x0000,
164283179d39SNavdeep Parhar 		0xd8c3, 0xc628,
164383179d39SNavdeep Parhar 		0xd8c4, 0x0000,
164483179d39SNavdeep Parhar 		0xd8c5, 0xc90a,
164583179d39SNavdeep Parhar 		0xd8c6, 0x3a7c,
164683179d39SNavdeep Parhar 		0xd8c7, 0xc62c,
164783179d39SNavdeep Parhar 		0xd8c8, 0x0000,
1648c01f2b83SNavdeep Parhar 		0xd8c9, 0x0000,
164983179d39SNavdeep Parhar 		0xd8ca, 0x2741,
165083179d39SNavdeep Parhar 		0xd8cb, 0x3021,
165183179d39SNavdeep Parhar 		0xd8cc, 0x1001,
165283179d39SNavdeep Parhar 		0xd8cd, 0xc502,
165383179d39SNavdeep Parhar 		0xd8ce, 0x53ac,
165483179d39SNavdeep Parhar 		0xd8cf, 0xc503,
165583179d39SNavdeep Parhar 		0xd8d0, 0x2cd3,
165683179d39SNavdeep Parhar 		0xd8d1, 0xc600,
165783179d39SNavdeep Parhar 		0xd8d2, 0x2a6e,
165883179d39SNavdeep Parhar 		0xd8d3, 0xc601,
165983179d39SNavdeep Parhar 		0xd8d4, 0x2a2c,
166083179d39SNavdeep Parhar 		0xd8d5, 0xc605,
166183179d39SNavdeep Parhar 		0xd8d6, 0x5557,
166283179d39SNavdeep Parhar 		0xd8d7, 0xc60c,
166383179d39SNavdeep Parhar 		0xd8d8, 0x5400,
166483179d39SNavdeep Parhar 		0xd8d9, 0xc710,
166583179d39SNavdeep Parhar 		0xd8da, 0x0700,
166683179d39SNavdeep Parhar 		0xd8db, 0xc711,
166783179d39SNavdeep Parhar 		0xd8dc, 0x0f06,
166883179d39SNavdeep Parhar 		0xd8dd, 0xc718,
166983179d39SNavdeep Parhar 		0xd8de, 0x700,
167083179d39SNavdeep Parhar 		0xd8df, 0xc719,
167183179d39SNavdeep Parhar 		0xd8e0, 0x0f06,
167283179d39SNavdeep Parhar 		0xd8e1, 0xc720,
167383179d39SNavdeep Parhar 		0xd8e2, 0x4700,
167483179d39SNavdeep Parhar 		0xd8e3, 0xc721,
167583179d39SNavdeep Parhar 		0xd8e4, 0x0f06,
167683179d39SNavdeep Parhar 		0xd8e5, 0xc728,
167783179d39SNavdeep Parhar 		0xd8e6, 0x0700,
167883179d39SNavdeep Parhar 		0xd8e7, 0xc729,
167983179d39SNavdeep Parhar 		0xd8e8, 0x1207,
168083179d39SNavdeep Parhar 		0xd8e9, 0xc801,
168183179d39SNavdeep Parhar 		0xd8ea, 0x7f50,
168283179d39SNavdeep Parhar 		0xd8eb, 0xc802,
168383179d39SNavdeep Parhar 		0xd8ec, 0x7760,
168483179d39SNavdeep Parhar 		0xd8ed, 0xc803,
168583179d39SNavdeep Parhar 		0xd8ee, 0x7fce,
168683179d39SNavdeep Parhar 		0xd8ef, 0xc804,
168783179d39SNavdeep Parhar 		0xd8f0, 0x520e,
168883179d39SNavdeep Parhar 		0xd8f1, 0xc805,
168983179d39SNavdeep Parhar 		0xd8f2, 0x5c11,
169083179d39SNavdeep Parhar 		0xd8f3, 0xc806,
169183179d39SNavdeep Parhar 		0xd8f4, 0x3c51,
169283179d39SNavdeep Parhar 		0xd8f5, 0xc807,
169383179d39SNavdeep Parhar 		0xd8f6, 0x4061,
169483179d39SNavdeep Parhar 		0xd8f7, 0xc808,
169583179d39SNavdeep Parhar 		0xd8f8, 0x49c1,
169683179d39SNavdeep Parhar 		0xd8f9, 0xc809,
169783179d39SNavdeep Parhar 		0xd8fa, 0x3840,
169883179d39SNavdeep Parhar 		0xd8fb, 0xc80a,
169983179d39SNavdeep Parhar 		0xd8fc, 0x0000,
170083179d39SNavdeep Parhar 		0xd8fd, 0xc821,
170183179d39SNavdeep Parhar 		0xd8fe, 0x0002,
170283179d39SNavdeep Parhar 		0xd8ff, 0xc822,
170383179d39SNavdeep Parhar 		0xd900, 0x0046,
170483179d39SNavdeep Parhar 		0xd901, 0xc844,
170583179d39SNavdeep Parhar 		0xd902, 0x182f,
170683179d39SNavdeep Parhar 		0xd903, 0xc849,
170783179d39SNavdeep Parhar 		0xd904, 0x0400,
170883179d39SNavdeep Parhar 		0xd905, 0xc84a,
170983179d39SNavdeep Parhar 		0xd906, 0x0002,
171083179d39SNavdeep Parhar 		0xd907, 0xc013,
171183179d39SNavdeep Parhar 		0xd908, 0xf341,
171283179d39SNavdeep Parhar 		0xd909, 0xc084,
171383179d39SNavdeep Parhar 		0xd90a, 0x0030,
171483179d39SNavdeep Parhar 		0xd90b, 0xc904,
171583179d39SNavdeep Parhar 		0xd90c, 0x1401,
171683179d39SNavdeep Parhar 		0xd90d, 0xcb0c,
171783179d39SNavdeep Parhar 		0xd90e, 0x0004,
171883179d39SNavdeep Parhar 		0xd90f, 0xcb0e,
171983179d39SNavdeep Parhar 		0xd910, 0xa00a,
172083179d39SNavdeep Parhar 		0xd911, 0xcb0f,
172183179d39SNavdeep Parhar 		0xd912, 0xc0c0,
172283179d39SNavdeep Parhar 		0xd913, 0xcb10,
172383179d39SNavdeep Parhar 		0xd914, 0xc0c0,
172483179d39SNavdeep Parhar 		0xd915, 0xcb11,
172583179d39SNavdeep Parhar 		0xd916, 0x00a0,
172683179d39SNavdeep Parhar 		0xd917, 0xcb12,
172783179d39SNavdeep Parhar 		0xd918, 0x0007,
172883179d39SNavdeep Parhar 		0xd919, 0xc241,
172983179d39SNavdeep Parhar 		0xd91a, 0xa000,
173083179d39SNavdeep Parhar 		0xd91b, 0xc243,
173183179d39SNavdeep Parhar 		0xd91c, 0x7fe0,
173283179d39SNavdeep Parhar 		0xd91d, 0xc604,
173383179d39SNavdeep Parhar 		0xd91e, 0x000e,
173483179d39SNavdeep Parhar 		0xd91f, 0xc609,
173583179d39SNavdeep Parhar 		0xd920, 0x00f5,
173683179d39SNavdeep Parhar 		0xd921, 0xc611,
173783179d39SNavdeep Parhar 		0xd922, 0x000e,
173883179d39SNavdeep Parhar 		0xd923, 0xc660,
173983179d39SNavdeep Parhar 		0xd924, 0x9600,
174083179d39SNavdeep Parhar 		0xd925, 0xc687,
174183179d39SNavdeep Parhar 		0xd926, 0x0004,
174283179d39SNavdeep Parhar 		0xd927, 0xc60a,
174383179d39SNavdeep Parhar 		0xd928, 0x04f5,
174483179d39SNavdeep Parhar 		0xd929, 0x0000,
174583179d39SNavdeep Parhar 		0xd92a, 0x2741,
174683179d39SNavdeep Parhar 		0xd92b, 0x3021,
174783179d39SNavdeep Parhar 		0xd92c, 0x1001,
174883179d39SNavdeep Parhar 		0xd92d, 0xc620,
174983179d39SNavdeep Parhar 		0xd92e, 0x14e5,
175083179d39SNavdeep Parhar 		0xd92f, 0xc621,
175183179d39SNavdeep Parhar 		0xd930, 0xc53d,
175283179d39SNavdeep Parhar 		0xd931, 0xc622,
175383179d39SNavdeep Parhar 		0xd932, 0x3cbe,
175483179d39SNavdeep Parhar 		0xd933, 0xc623,
175583179d39SNavdeep Parhar 		0xd934, 0x4452,
175683179d39SNavdeep Parhar 		0xd935, 0xc624,
175783179d39SNavdeep Parhar 		0xd936, 0xc5c5,
175883179d39SNavdeep Parhar 		0xd937, 0xc625,
175983179d39SNavdeep Parhar 		0xd938, 0xe01e,
176083179d39SNavdeep Parhar 		0xd939, 0xc627,
176183179d39SNavdeep Parhar 		0xd93a, 0x0000,
176283179d39SNavdeep Parhar 		0xd93b, 0xc628,
1763c01f2b83SNavdeep Parhar 		0xd93c, 0x0000,
176483179d39SNavdeep Parhar 		0xd93d, 0xc62c,
176583179d39SNavdeep Parhar 		0xd93e, 0x0000,
176683179d39SNavdeep Parhar 		0xd93f, 0xc90a,
176783179d39SNavdeep Parhar 		0xd940, 0x3a7c,
176883179d39SNavdeep Parhar 		0xd941, 0x0000,
176983179d39SNavdeep Parhar 		0xd942, 0x2b84,
177083179d39SNavdeep Parhar 		0xd943, 0x3c74,
177183179d39SNavdeep Parhar 		0xd944, 0x6435,
177283179d39SNavdeep Parhar 		0xd945, 0xdff4,
177383179d39SNavdeep Parhar 		0xd946, 0x6435,
177483179d39SNavdeep Parhar 		0xd947, 0x2806,
177583179d39SNavdeep Parhar 		0xd948, 0x3006,
177683179d39SNavdeep Parhar 		0xd949, 0x8565,
177783179d39SNavdeep Parhar 		0xd94a, 0x2b24,
177883179d39SNavdeep Parhar 		0xd94b, 0x3c24,
177983179d39SNavdeep Parhar 		0xd94c, 0x6436,
178083179d39SNavdeep Parhar 		0xd94d, 0x1002,
178183179d39SNavdeep Parhar 		0xd94e, 0x2b24,
178283179d39SNavdeep Parhar 		0xd94f, 0x3c24,
178383179d39SNavdeep Parhar 		0xd950, 0x6436,
178483179d39SNavdeep Parhar 		0xd951, 0x4045,
178583179d39SNavdeep Parhar 		0xd952, 0x8656,
178683179d39SNavdeep Parhar 		0xd953, 0x5663,
178783179d39SNavdeep Parhar 		0xd954, 0x0302,
178883179d39SNavdeep Parhar 		0xd955, 0x401e,
178983179d39SNavdeep Parhar 		0xd956, 0x1002,
179083179d39SNavdeep Parhar 		0xd957, 0x2807,
179183179d39SNavdeep Parhar 		0xd958, 0x31a7,
179283179d39SNavdeep Parhar 		0xd959, 0x20c4,
179383179d39SNavdeep Parhar 		0xd95a, 0x3c24,
179483179d39SNavdeep Parhar 		0xd95b, 0x6724,
179583179d39SNavdeep Parhar 		0xd95c, 0x2ff7,
179683179d39SNavdeep Parhar 		0xd95d, 0x30f7,
179783179d39SNavdeep Parhar 		0xd95e, 0x20c4,
179883179d39SNavdeep Parhar 		0xd95f, 0x3c04,
179983179d39SNavdeep Parhar 		0xd960, 0x6724,
180083179d39SNavdeep Parhar 		0xd961, 0x1002,
180183179d39SNavdeep Parhar 		0xd962, 0x2807,
180283179d39SNavdeep Parhar 		0xd963, 0x3187,
180383179d39SNavdeep Parhar 		0xd964, 0x20c4,
180483179d39SNavdeep Parhar 		0xd965, 0x3c24,
180583179d39SNavdeep Parhar 		0xd966, 0x6724,
180683179d39SNavdeep Parhar 		0xd967, 0x2fe4,
180783179d39SNavdeep Parhar 		0xd968, 0x3dc4,
180883179d39SNavdeep Parhar 		0xd969, 0x6437,
180983179d39SNavdeep Parhar 		0xd96a, 0x20c4,
181083179d39SNavdeep Parhar 		0xd96b, 0x3c04,
181183179d39SNavdeep Parhar 		0xd96c, 0x6724,
1812c01f2b83SNavdeep Parhar 		0xd96d, 0x1002,
181383179d39SNavdeep Parhar 		0xd96e, 0x24f4,
181483179d39SNavdeep Parhar 		0xd96f, 0x3c64,
181583179d39SNavdeep Parhar 		0xd970, 0x6436,
181683179d39SNavdeep Parhar 		0xd971, 0xdff4,
181783179d39SNavdeep Parhar 		0xd972, 0x6436,
1818c01f2b83SNavdeep Parhar 		0xd973, 0x1002,
181983179d39SNavdeep Parhar 		0xd974, 0x2006,
182083179d39SNavdeep Parhar 		0xd975, 0x3d76,
182183179d39SNavdeep Parhar 		0xd976, 0xc161,
182283179d39SNavdeep Parhar 		0xd977, 0x6134,
182383179d39SNavdeep Parhar 		0xd978, 0x6135,
182483179d39SNavdeep Parhar 		0xd979, 0x5443,
182583179d39SNavdeep Parhar 		0xd97a, 0x0303,
182683179d39SNavdeep Parhar 		0xd97b, 0x6524,
182783179d39SNavdeep Parhar 		0xd97c, 0x00fb,
182883179d39SNavdeep Parhar 		0xd97d, 0x1002,
182983179d39SNavdeep Parhar 		0xd97e, 0x20d4,
183083179d39SNavdeep Parhar 		0xd97f, 0x3c24,
183183179d39SNavdeep Parhar 		0xd980, 0x2025,
183283179d39SNavdeep Parhar 		0xd981, 0x3005,
183383179d39SNavdeep Parhar 		0xd982, 0x6524,
183483179d39SNavdeep Parhar 		0xd983, 0x1002,
183583179d39SNavdeep Parhar 		0xd984, 0xd019,
183683179d39SNavdeep Parhar 		0xd985, 0x2104,
183783179d39SNavdeep Parhar 		0xd986, 0x3c24,
183883179d39SNavdeep Parhar 		0xd987, 0x2105,
183983179d39SNavdeep Parhar 		0xd988, 0x3805,
184083179d39SNavdeep Parhar 		0xd989, 0x6524,
184183179d39SNavdeep Parhar 		0xd98a, 0xdff4,
184283179d39SNavdeep Parhar 		0xd98b, 0x4005,
184383179d39SNavdeep Parhar 		0xd98c, 0x6524,
184483179d39SNavdeep Parhar 		0xd98d, 0x2e8d,
184583179d39SNavdeep Parhar 		0xd98e, 0x303d,
184683179d39SNavdeep Parhar 		0xd98f, 0x2408,
184783179d39SNavdeep Parhar 		0xd990, 0x35d8,
184883179d39SNavdeep Parhar 		0xd991, 0x5dd3,
184983179d39SNavdeep Parhar 		0xd992, 0x0307,
185083179d39SNavdeep Parhar 		0xd993, 0x8887,
185183179d39SNavdeep Parhar 		0xd994, 0x63a7,
185283179d39SNavdeep Parhar 		0xd995, 0x8887,
185383179d39SNavdeep Parhar 		0xd996, 0x63a7,
185483179d39SNavdeep Parhar 		0xd997, 0xdffd,
185583179d39SNavdeep Parhar 		0xd998, 0x00f9,
185683179d39SNavdeep Parhar 		0xd999, 0x1002,
185783179d39SNavdeep Parhar 		0xd99a, 0x866a,
185883179d39SNavdeep Parhar 		0xd99b, 0x6138,
185983179d39SNavdeep Parhar 		0xd99c, 0x5883,
186083179d39SNavdeep Parhar 		0xd99d, 0x2aa2,
186183179d39SNavdeep Parhar 		0xd99e, 0x3022,
186283179d39SNavdeep Parhar 		0xd99f, 0x1302,
186383179d39SNavdeep Parhar 		0xd9a0, 0x2ff7,
186483179d39SNavdeep Parhar 		0xd9a1, 0x3007,
186583179d39SNavdeep Parhar 		0xd9a2, 0x8785,
186683179d39SNavdeep Parhar 		0xd9a3, 0xb887,
186783179d39SNavdeep Parhar 		0xd9a4, 0x8786,
186883179d39SNavdeep Parhar 		0xd9a5, 0xb8c6,
186983179d39SNavdeep Parhar 		0xd9a6, 0x5a53,
187083179d39SNavdeep Parhar 		0xd9a7, 0x29b2,
187183179d39SNavdeep Parhar 		0xd9a8, 0x3022,
187283179d39SNavdeep Parhar 		0xd9a9, 0x13c2,
187383179d39SNavdeep Parhar 		0xd9aa, 0x2474,
187483179d39SNavdeep Parhar 		0xd9ab, 0x3c84,
187583179d39SNavdeep Parhar 		0xd9ac, 0x64d7,
187683179d39SNavdeep Parhar 		0xd9ad, 0x64d7,
187783179d39SNavdeep Parhar 		0xd9ae, 0x2ff5,
187883179d39SNavdeep Parhar 		0xd9af, 0x3c05,
187983179d39SNavdeep Parhar 		0xd9b0, 0x8757,
188083179d39SNavdeep Parhar 		0xd9b1, 0xb886,
188183179d39SNavdeep Parhar 		0xd9b2, 0x9767,
188283179d39SNavdeep Parhar 		0xd9b3, 0x67c4,
188383179d39SNavdeep Parhar 		0xd9b4, 0x6f72,
188483179d39SNavdeep Parhar 		0xd9b5, 0x1002,
188583179d39SNavdeep Parhar 		0xd9b6, 0x0000,
1886c01f2b83SNavdeep Parhar 	};
1887c01f2b83SNavdeep Parhar 	int i, err;
1888c01f2b83SNavdeep Parhar 
1889c01f2b83SNavdeep Parhar 	/* set uC clock and activate it */
1890c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, uCclock40MHz);
1891c01f2b83SNavdeep Parhar 	msleep(500);
1892c01f2b83SNavdeep Parhar 	if (err)
1893c01f2b83SNavdeep Parhar 		return err;
1894c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, uCclockActivate);
1895c01f2b83SNavdeep Parhar 	msleep(500);
1896c01f2b83SNavdeep Parhar 	if (err)
1897c01f2b83SNavdeep Parhar 		return err;
1898c01f2b83SNavdeep Parhar 
1899c01f2b83SNavdeep Parhar 	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
1900c01f2b83SNavdeep Parhar 		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
1901c01f2b83SNavdeep Parhar 				 twinax_edc[i + 1]);
1902c01f2b83SNavdeep Parhar 	/* activate uC */
1903c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, uCactivate);
1904c01f2b83SNavdeep Parhar 	if (!err)
1905c01f2b83SNavdeep Parhar 		phy->priv = edc_twinax;
1906c01f2b83SNavdeep Parhar 	return err;
1907c01f2b83SNavdeep Parhar }
1908c01f2b83SNavdeep Parhar 
1909c01f2b83SNavdeep Parhar /*
1910c01f2b83SNavdeep Parhar  * Return Module Type.
1911c01f2b83SNavdeep Parhar  */
1912c01f2b83SNavdeep Parhar static int ael2020_get_module_type(struct cphy *phy, int delay_ms)
1913c01f2b83SNavdeep Parhar {
1914c01f2b83SNavdeep Parhar 	int v;
1915c01f2b83SNavdeep Parhar 	unsigned int stat;
1916c01f2b83SNavdeep Parhar 
1917c01f2b83SNavdeep Parhar 	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_STAT, &stat);
1918c01f2b83SNavdeep Parhar 	if (v)
1919c01f2b83SNavdeep Parhar 		return v;
1920c01f2b83SNavdeep Parhar 
1921c01f2b83SNavdeep Parhar 	if (stat & (0x1 << (AEL2020_GPIO_MODDET*4))) {
1922c01f2b83SNavdeep Parhar 		/* module absent */
1923c01f2b83SNavdeep Parhar 		return phy_modtype_none;
1924c01f2b83SNavdeep Parhar 	}
1925c01f2b83SNavdeep Parhar 
1926c01f2b83SNavdeep Parhar 	return ael2xxx_get_module_type(phy, delay_ms);
1927c01f2b83SNavdeep Parhar }
1928c01f2b83SNavdeep Parhar 
1929c01f2b83SNavdeep Parhar /*
1930c01f2b83SNavdeep Parhar  * Enable PHY interrupts.  We enable "Module Detection" interrupts (on any
1931c01f2b83SNavdeep Parhar  * state transition) and then generic Link Alarm Status Interrupt (LASI).
1932c01f2b83SNavdeep Parhar  */
1933c01f2b83SNavdeep Parhar static int ael2020_intr_enable(struct cphy *phy)
1934c01f2b83SNavdeep Parhar {
1935c01f2b83SNavdeep Parhar 	struct reg_val regs[] = {
1936c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CFG+AEL2020_GPIO_LSTAT,
1937c01f2b83SNavdeep Parhar 			0xffff, 0x4 },
1938c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1939c01f2b83SNavdeep Parhar 			0xffff, 0x8 << (AEL2020_GPIO_LSTAT*4) },
1940c01f2b83SNavdeep Parhar 
1941c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1942c01f2b83SNavdeep Parhar 			0xffff, 0x2 << (AEL2020_GPIO_MODDET*4) },
1943c01f2b83SNavdeep Parhar 
1944c01f2b83SNavdeep Parhar 		/* end */
1945c01f2b83SNavdeep Parhar 		{ 0, 0, 0, 0 }
1946c01f2b83SNavdeep Parhar 	};
1947c01f2b83SNavdeep Parhar 	int err;
1948c01f2b83SNavdeep Parhar 
1949c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, regs);
1950c01f2b83SNavdeep Parhar 	if (err)
1951c01f2b83SNavdeep Parhar 		return err;
1952c01f2b83SNavdeep Parhar 
1953c01f2b83SNavdeep Parhar 	/* enable standard Link Alarm Status Interrupts */
1954c01f2b83SNavdeep Parhar 	err = t3_phy_lasi_intr_enable(phy);
1955c01f2b83SNavdeep Parhar 	if (err)
1956c01f2b83SNavdeep Parhar 		return err;
1957c01f2b83SNavdeep Parhar 
1958c01f2b83SNavdeep Parhar 	return 0;
1959c01f2b83SNavdeep Parhar }
1960c01f2b83SNavdeep Parhar 
1961c01f2b83SNavdeep Parhar /*
1962c01f2b83SNavdeep Parhar  * Disable PHY interrupts.  The mirror of the above ...
1963c01f2b83SNavdeep Parhar  */
1964c01f2b83SNavdeep Parhar static int ael2020_intr_disable(struct cphy *phy)
1965c01f2b83SNavdeep Parhar {
1966c01f2b83SNavdeep Parhar 	struct reg_val regs[] = {
1967c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1968c01f2b83SNavdeep Parhar 			0xffff, 0xb << (AEL2020_GPIO_LSTAT*4) },
1969c01f2b83SNavdeep Parhar 
1970c01f2b83SNavdeep Parhar 		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1971c01f2b83SNavdeep Parhar 			0xffff, 0x1 << (AEL2020_GPIO_MODDET*4) },
1972c01f2b83SNavdeep Parhar 
1973c01f2b83SNavdeep Parhar 		/* end */
1974c01f2b83SNavdeep Parhar 		{ 0, 0, 0, 0 }
1975c01f2b83SNavdeep Parhar 	};
1976c01f2b83SNavdeep Parhar 	int err;
1977c01f2b83SNavdeep Parhar 
1978c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, regs);
1979c01f2b83SNavdeep Parhar 	if (err)
1980c01f2b83SNavdeep Parhar 		return err;
1981c01f2b83SNavdeep Parhar 
1982c01f2b83SNavdeep Parhar 	/* disable standard Link Alarm Status Interrupts */
1983c01f2b83SNavdeep Parhar 	return t3_phy_lasi_intr_disable(phy);
1984c01f2b83SNavdeep Parhar }
1985c01f2b83SNavdeep Parhar 
1986c01f2b83SNavdeep Parhar /*
1987c01f2b83SNavdeep Parhar  * Clear PHY interrupt state.
1988c01f2b83SNavdeep Parhar  */
1989c01f2b83SNavdeep Parhar static int ael2020_intr_clear(struct cphy *phy)
1990c01f2b83SNavdeep Parhar {
1991c01f2b83SNavdeep Parhar 	unsigned int stat;
1992c01f2b83SNavdeep Parhar 	int err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat);
1993c01f2b83SNavdeep Parhar 	return err ? err : t3_phy_lasi_intr_clear(phy);
1994c01f2b83SNavdeep Parhar }
1995c01f2b83SNavdeep Parhar 
1996c01f2b83SNavdeep Parhar /*
1997c01f2b83SNavdeep Parhar  * Common register settings for the AEL2020 when it comes out of reset.
1998c01f2b83SNavdeep Parhar  */
1999c01f2b83SNavdeep Parhar static struct reg_val ael2020_reset_regs[] = {
2000c01f2b83SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x3101 },
2001c01f2b83SNavdeep Parhar 
2002c01f2b83SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xcd40, 0xffff, 0x0001 },
2003c01f2b83SNavdeep Parhar 
200483179d39SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0x0100 },
200583179d39SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xca22, 0xffff, 0x0100 },
200683179d39SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xca42, 0xffff, 0x0100 },
2007c01f2b83SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xff02, 0xffff, 0x0023 },
2008c01f2b83SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xff03, 0xffff, 0x0000 },
2009c01f2b83SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xff04, 0xffff, 0x0000 },
2010c01f2b83SNavdeep Parhar 
201183179d39SNavdeep Parhar 	{ MDIO_DEV_PMA_PMD, 0xc20d, 0xffff, 0x0002 },
2012c01f2b83SNavdeep Parhar 	/* end */
2013c01f2b83SNavdeep Parhar 	{ 0, 0, 0, 0 }
2014c01f2b83SNavdeep Parhar };
2015c01f2b83SNavdeep Parhar 
2016c01f2b83SNavdeep Parhar /*
2017c01f2b83SNavdeep Parhar  * Reset the PHY and put it into a canonical operating state.
2018c01f2b83SNavdeep Parhar  */
2019c01f2b83SNavdeep Parhar static int ael2020_reset(struct cphy *phy, int wait)
2020c01f2b83SNavdeep Parhar {
2021c01f2b83SNavdeep Parhar 	int err;
2022c01f2b83SNavdeep Parhar 	unsigned int lasi_ctrl;
2023c01f2b83SNavdeep Parhar 
2024c01f2b83SNavdeep Parhar 	/* grab current interrupt state */
2025c01f2b83SNavdeep Parhar 	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
2026c01f2b83SNavdeep Parhar 	if (err)
2027c01f2b83SNavdeep Parhar 		return err;
2028c01f2b83SNavdeep Parhar 
2029c01f2b83SNavdeep Parhar 	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 125);
2030c01f2b83SNavdeep Parhar 	if (err)
2031c01f2b83SNavdeep Parhar 		return err;
2032c01f2b83SNavdeep Parhar 	msleep(100);
2033c01f2b83SNavdeep Parhar 
2034c01f2b83SNavdeep Parhar 	/* basic initialization for all module types */
2035c01f2b83SNavdeep Parhar 	phy->priv = edc_none;
2036c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, ael2020_reset_regs);
2037c01f2b83SNavdeep Parhar 	if (err)
2038c01f2b83SNavdeep Parhar 		return err;
203983179d39SNavdeep Parhar 	msleep(100);
2040c01f2b83SNavdeep Parhar 
2041c01f2b83SNavdeep Parhar 	/* determine module type and perform appropriate initialization */
2042c01f2b83SNavdeep Parhar 	err = ael2020_get_module_type(phy, 0);
2043c01f2b83SNavdeep Parhar 	if (err < 0)
2044c01f2b83SNavdeep Parhar 		return err;
2045c01f2b83SNavdeep Parhar 	phy->modtype = (u8)err;
20461fa10c92SNavdeep Parhar 	if (err == phy_modtype_none)
2047c01f2b83SNavdeep Parhar 		err = 0;
2048c01f2b83SNavdeep Parhar 	else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
2049c01f2b83SNavdeep Parhar 		err = ael2020_setup_twinax_edc(phy, err);
2050c01f2b83SNavdeep Parhar 	else
2051c01f2b83SNavdeep Parhar 		err = ael2020_setup_sr_edc(phy);
2052c01f2b83SNavdeep Parhar 	if (err)
2053c01f2b83SNavdeep Parhar 		return err;
2054c01f2b83SNavdeep Parhar 
2055c01f2b83SNavdeep Parhar 	/* reset wipes out interrupts, reenable them if they were on */
2056c01f2b83SNavdeep Parhar 	if (lasi_ctrl & 1)
2057c01f2b83SNavdeep Parhar 		err = ael2020_intr_enable(phy);
2058c01f2b83SNavdeep Parhar 	return err;
2059c01f2b83SNavdeep Parhar }
2060c01f2b83SNavdeep Parhar 
2061c01f2b83SNavdeep Parhar /*
2062c01f2b83SNavdeep Parhar  * Handle a PHY interrupt.
2063c01f2b83SNavdeep Parhar  */
2064c01f2b83SNavdeep Parhar static int ael2020_intr_handler(struct cphy *phy)
2065c01f2b83SNavdeep Parhar {
2066c01f2b83SNavdeep Parhar 	unsigned int stat;
2067c01f2b83SNavdeep Parhar 	int ret, edc_needed, cause = 0;
2068c01f2b83SNavdeep Parhar 
2069c01f2b83SNavdeep Parhar 	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat);
2070c01f2b83SNavdeep Parhar 	if (ret)
2071c01f2b83SNavdeep Parhar 		return ret;
2072c01f2b83SNavdeep Parhar 
2073c01f2b83SNavdeep Parhar 	if (stat & (0x1 << AEL2020_GPIO_MODDET)) {
2074c01f2b83SNavdeep Parhar 		/* modules have max 300 ms init time after hot plug */
2075c01f2b83SNavdeep Parhar 		ret = ael2020_get_module_type(phy, 300);
2076c01f2b83SNavdeep Parhar 		if (ret < 0)
2077c01f2b83SNavdeep Parhar 			return ret;
2078c01f2b83SNavdeep Parhar 
2079c01f2b83SNavdeep Parhar 		phy->modtype = (u8)ret;
2080c01f2b83SNavdeep Parhar 		if (ret == phy_modtype_none)
2081c01f2b83SNavdeep Parhar 			edc_needed = phy->priv;       /* on unplug retain EDC */
2082c01f2b83SNavdeep Parhar 		else if (ret == phy_modtype_twinax ||
2083c01f2b83SNavdeep Parhar 			 ret == phy_modtype_twinax_long)
2084c01f2b83SNavdeep Parhar 			edc_needed = edc_twinax;
2085c01f2b83SNavdeep Parhar 		else
2086c01f2b83SNavdeep Parhar 			edc_needed = edc_sr;
2087c01f2b83SNavdeep Parhar 
2088c01f2b83SNavdeep Parhar 		if (edc_needed != phy->priv) {
2089c01f2b83SNavdeep Parhar 			ret = ael2020_reset(phy, 0);
2090c01f2b83SNavdeep Parhar 			return ret ? ret : cphy_cause_module_change;
2091c01f2b83SNavdeep Parhar 		}
2092c01f2b83SNavdeep Parhar 		cause = cphy_cause_module_change;
2093c01f2b83SNavdeep Parhar 	}
2094c01f2b83SNavdeep Parhar 
2095c01f2b83SNavdeep Parhar 	ret = t3_phy_lasi_intr_handler(phy);
2096c01f2b83SNavdeep Parhar 	if (ret < 0)
2097c01f2b83SNavdeep Parhar 		return ret;
2098c01f2b83SNavdeep Parhar 
2099c01f2b83SNavdeep Parhar 	ret |= cause;
2100c01f2b83SNavdeep Parhar 	if (!ret)
2101c01f2b83SNavdeep Parhar 		ret |= cphy_cause_link_change;
2102c01f2b83SNavdeep Parhar 	return ret;
2103c01f2b83SNavdeep Parhar }
2104c01f2b83SNavdeep Parhar 
2105c01f2b83SNavdeep Parhar static struct cphy_ops ael2020_ops = {
2106c01f2b83SNavdeep Parhar #ifdef C99_NOT_SUPPORTED
2107c01f2b83SNavdeep Parhar 	ael2020_reset,
2108c01f2b83SNavdeep Parhar 	ael2020_intr_enable,
2109c01f2b83SNavdeep Parhar 	ael2020_intr_disable,
2110c01f2b83SNavdeep Parhar 	ael2020_intr_clear,
2111c01f2b83SNavdeep Parhar 	ael2020_intr_handler,
2112c01f2b83SNavdeep Parhar 	NULL,
2113c01f2b83SNavdeep Parhar 	NULL,
2114c01f2b83SNavdeep Parhar 	NULL,
2115c01f2b83SNavdeep Parhar 	NULL,
2116c01f2b83SNavdeep Parhar 	NULL,
2117c01f2b83SNavdeep Parhar 	get_link_status_r,
2118c01f2b83SNavdeep Parhar 	ael1002_power_down,
2119c01f2b83SNavdeep Parhar #else
2120c01f2b83SNavdeep Parhar 	.reset           = ael2020_reset,
2121c01f2b83SNavdeep Parhar 	.intr_enable     = ael2020_intr_enable,
2122c01f2b83SNavdeep Parhar 	.intr_disable    = ael2020_intr_disable,
2123c01f2b83SNavdeep Parhar 	.intr_clear      = ael2020_intr_clear,
2124c01f2b83SNavdeep Parhar 	.intr_handler    = ael2020_intr_handler,
2125c01f2b83SNavdeep Parhar 	.get_link_status = get_link_status_r,
2126c01f2b83SNavdeep Parhar 	.power_down      = ael1002_power_down,
2127c01f2b83SNavdeep Parhar #endif
2128c01f2b83SNavdeep Parhar };
2129c01f2b83SNavdeep Parhar 
2130c01f2b83SNavdeep Parhar int t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr,
2131c01f2b83SNavdeep Parhar 			const struct mdio_ops *mdio_ops)
2132c01f2b83SNavdeep Parhar {
2133c01f2b83SNavdeep Parhar 	int err;
2134c01f2b83SNavdeep Parhar 	struct cphy *phy = &pinfo->phy;
2135c01f2b83SNavdeep Parhar 
2136c01f2b83SNavdeep Parhar 	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2020_ops, mdio_ops,
2137c01f2b83SNavdeep Parhar 		SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
2138c01f2b83SNavdeep Parhar 		  SUPPORTED_IRQ, "10GBASE-R");
2139c01f2b83SNavdeep Parhar 	msleep(125);
2140c01f2b83SNavdeep Parhar 
2141c01f2b83SNavdeep Parhar 	err = set_phy_regs(phy, ael2020_reset_regs);
2142c01f2b83SNavdeep Parhar 	if (err)
2143c01f2b83SNavdeep Parhar 		return err;
214483179d39SNavdeep Parhar 	msleep(100);
214583179d39SNavdeep Parhar 
2146c01f2b83SNavdeep Parhar 	err = ael2020_get_module_type(phy, 0);
2147c01f2b83SNavdeep Parhar 	if (err >= 0)
2148c01f2b83SNavdeep Parhar 		phy->modtype = err;
2149c01f2b83SNavdeep Parhar 
2150c01f2b83SNavdeep Parhar 	ael_laser_down(phy, 0);
2151c01f2b83SNavdeep Parhar 	return 0;
2152c01f2b83SNavdeep Parhar }
2153c01f2b83SNavdeep Parhar 
2154c01f2b83SNavdeep Parhar /*
21559b4de886SKip Macy  * Get link status for a 10GBASE-X device.
21569b4de886SKip Macy  */
21579b4de886SKip Macy static int get_link_status_x(struct cphy *phy, int *link_ok, int *speed,
21589b4de886SKip Macy 			     int *duplex, int *fc)
21599b4de886SKip Macy {
21609b4de886SKip Macy 	if (link_ok) {
21619b4de886SKip Macy 		unsigned int stat0, stat1, stat2;
21629b4de886SKip Macy 		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
21639b4de886SKip Macy 
21649b4de886SKip Macy 		if (!err)
21659b4de886SKip Macy 			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
21669b4de886SKip Macy 		if (!err)
21679b4de886SKip Macy 			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
21689b4de886SKip Macy 		if (err)
21699b4de886SKip Macy 			return err;
21709b4de886SKip Macy 		*link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1;
21719b4de886SKip Macy 	}
21729b4de886SKip Macy 	if (speed)
21739b4de886SKip Macy 		*speed = SPEED_10000;
21749b4de886SKip Macy 	if (duplex)
21759b4de886SKip Macy 		*duplex = DUPLEX_FULL;
21769b4de886SKip Macy 	return 0;
21779b4de886SKip Macy }
21789b4de886SKip Macy 
2179b6d90eb7SKip Macy #ifdef C99_NOT_SUPPORTED
2180b6d90eb7SKip Macy static struct cphy_ops qt2045_ops = {
2181b6d90eb7SKip Macy 	ael1006_reset,
21824af83c8cSKip Macy 	t3_phy_lasi_intr_enable,
21834af83c8cSKip Macy 	t3_phy_lasi_intr_disable,
21844af83c8cSKip Macy 	t3_phy_lasi_intr_clear,
21854af83c8cSKip Macy 	t3_phy_lasi_intr_handler,
2186b6d90eb7SKip Macy 	NULL,
2187b6d90eb7SKip Macy 	NULL,
2188b6d90eb7SKip Macy 	NULL,
2189b6d90eb7SKip Macy 	NULL,
2190b6d90eb7SKip Macy 	NULL,
21919b4de886SKip Macy 	get_link_status_x,
2192c01f2b83SNavdeep Parhar 	ael1002_power_down,
2193b6d90eb7SKip Macy };
2194b6d90eb7SKip Macy #else
2195b6d90eb7SKip Macy static struct cphy_ops qt2045_ops = {
2196b6d90eb7SKip Macy 	.reset           = ael1006_reset,
21974af83c8cSKip Macy 	.intr_enable     = t3_phy_lasi_intr_enable,
21984af83c8cSKip Macy 	.intr_disable    = t3_phy_lasi_intr_disable,
21994af83c8cSKip Macy 	.intr_clear      = t3_phy_lasi_intr_clear,
22004af83c8cSKip Macy 	.intr_handler    = t3_phy_lasi_intr_handler,
22019b4de886SKip Macy 	.get_link_status = get_link_status_x,
2202c01f2b83SNavdeep Parhar 	.power_down      = ael1002_power_down,
2203b6d90eb7SKip Macy };
2204b6d90eb7SKip Macy #endif
2205b6d90eb7SKip Macy 
2206c01f2b83SNavdeep Parhar int t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr,
2207b6d90eb7SKip Macy 		       const struct mdio_ops *mdio_ops)
2208b6d90eb7SKip Macy {
2209b6d90eb7SKip Macy 	unsigned int stat;
2210c01f2b83SNavdeep Parhar 	struct cphy *phy = &pinfo->phy;
2211b6d90eb7SKip Macy 
2212c01f2b83SNavdeep Parhar 	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &qt2045_ops, mdio_ops,
22138e10660fSKip Macy 		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
22148e10660fSKip Macy 		  "10GBASE-CX4");
2215b6d90eb7SKip Macy 
2216b6d90eb7SKip Macy 	/*
2217b6d90eb7SKip Macy 	 * Some cards where the PHY is supposed to be at address 0 actually
2218b6d90eb7SKip Macy 	 * have it at 1.
2219b6d90eb7SKip Macy 	 */
2220b6d90eb7SKip Macy 	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
2221b6d90eb7SKip Macy 	    stat == 0xffff)
2222b6d90eb7SKip Macy 		phy->addr = 1;
22238e10660fSKip Macy 	return 0;
2224b6d90eb7SKip Macy }
2225b6d90eb7SKip Macy 
2226b6d90eb7SKip Macy static int xaui_direct_reset(struct cphy *phy, int wait)
2227b6d90eb7SKip Macy {
2228b6d90eb7SKip Macy 	return 0;
2229b6d90eb7SKip Macy }
2230b6d90eb7SKip Macy 
2231b6d90eb7SKip Macy static int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
2232b6d90eb7SKip Macy 				       int *speed, int *duplex, int *fc)
2233b6d90eb7SKip Macy {
2234b6d90eb7SKip Macy 	if (link_ok) {
2235b6d90eb7SKip Macy 		unsigned int status;
2236c01f2b83SNavdeep Parhar 		adapter_t *adapter = phy->adapter;
2237b6d90eb7SKip Macy 
2238c01f2b83SNavdeep Parhar 		status = t3_read_reg(adapter,
2239ef72318fSKip Macy 				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
2240c01f2b83SNavdeep Parhar 			 t3_read_reg(adapter,
2241ef72318fSKip Macy 				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
2242c01f2b83SNavdeep Parhar 			 t3_read_reg(adapter,
2243ef72318fSKip Macy 				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
2244c01f2b83SNavdeep Parhar 			 t3_read_reg(adapter,
2245ef72318fSKip Macy 				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
2246b6d90eb7SKip Macy 		*link_ok = !(status & F_LOWSIG0);
2247b6d90eb7SKip Macy 	}
2248b6d90eb7SKip Macy 	if (speed)
2249b6d90eb7SKip Macy 		*speed = SPEED_10000;
2250b6d90eb7SKip Macy 	if (duplex)
2251b6d90eb7SKip Macy 		*duplex = DUPLEX_FULL;
2252b6d90eb7SKip Macy 	return 0;
2253b6d90eb7SKip Macy }
2254b6d90eb7SKip Macy 
2255b6d90eb7SKip Macy static int xaui_direct_power_down(struct cphy *phy, int enable)
2256b6d90eb7SKip Macy {
2257b6d90eb7SKip Macy 	return 0;
2258b6d90eb7SKip Macy }
2259b6d90eb7SKip Macy 
2260b6d90eb7SKip Macy #ifdef C99_NOT_SUPPORTED
2261b6d90eb7SKip Macy static struct cphy_ops xaui_direct_ops = {
2262b6d90eb7SKip Macy 	xaui_direct_reset,
2263b6d90eb7SKip Macy 	ael1002_intr_noop,
2264b6d90eb7SKip Macy 	ael1002_intr_noop,
2265b6d90eb7SKip Macy 	ael1002_intr_noop,
2266b6d90eb7SKip Macy 	ael1002_intr_noop,
2267b6d90eb7SKip Macy 	NULL,
2268b6d90eb7SKip Macy 	NULL,
2269b6d90eb7SKip Macy 	NULL,
2270b6d90eb7SKip Macy 	NULL,
2271b6d90eb7SKip Macy 	NULL,
2272b6d90eb7SKip Macy 	xaui_direct_get_link_status,
2273b6d90eb7SKip Macy 	xaui_direct_power_down,
2274b6d90eb7SKip Macy };
2275b6d90eb7SKip Macy #else
2276b6d90eb7SKip Macy static struct cphy_ops xaui_direct_ops = {
2277b6d90eb7SKip Macy 	.reset           = xaui_direct_reset,
2278b6d90eb7SKip Macy 	.intr_enable     = ael1002_intr_noop,
2279b6d90eb7SKip Macy 	.intr_disable    = ael1002_intr_noop,
2280b6d90eb7SKip Macy 	.intr_clear      = ael1002_intr_noop,
2281b6d90eb7SKip Macy 	.intr_handler    = ael1002_intr_noop,
2282b6d90eb7SKip Macy 	.get_link_status = xaui_direct_get_link_status,
2283b6d90eb7SKip Macy 	.power_down      = xaui_direct_power_down,
2284b6d90eb7SKip Macy };
2285b6d90eb7SKip Macy #endif
2286b6d90eb7SKip Macy 
2287c01f2b83SNavdeep Parhar int t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr,
2288b6d90eb7SKip Macy 			    const struct mdio_ops *mdio_ops)
2289b6d90eb7SKip Macy {
2290c01f2b83SNavdeep Parhar 	cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &xaui_direct_ops, mdio_ops,
22918e10660fSKip Macy 		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
22928e10660fSKip Macy 		  "10GBASE-CX4");
22938e10660fSKip Macy 	return 0;
2294b6d90eb7SKip Macy }
2295