cxgb_ael1002.c revision 205945
1167514Skmacy/**************************************************************************
2167514Skmacy
3189643SgnnCopyright (c) 2007-2009, Chelsio Inc.
4167514SkmacyAll rights reserved.
5167514Skmacy
6167514SkmacyRedistribution and use in source and binary forms, with or without
7167514Skmacymodification, are permitted provided that the following conditions are met:
8167514Skmacy
9167514Skmacy 1. Redistributions of source code must retain the above copyright notice,
10167514Skmacy    this list of conditions and the following disclaimer.
11167514Skmacy
12170076Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its
13167514Skmacy    contributors may be used to endorse or promote products derived from
14167514Skmacy    this software without specific prior written permission.
15167514Skmacy
16167514SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17167514SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18167514SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19167514SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20167514SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21167514SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22167514SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23167514SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24167514SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25167514SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26167514SkmacyPOSSIBILITY OF SUCH DAMAGE.
27167514Skmacy
28167514Skmacy***************************************************************************/
29167514Skmacy
30167514Skmacy#include <sys/cdefs.h>
31167514Skmacy__FBSDID("$FreeBSD: head/sys/dev/cxgb/common/cxgb_ael1002.c 205945 2010-03-31 00:21:56Z np $");
32167514Skmacy
33170076Skmacy#include <cxgb_include.h>
34167514Skmacy
35176472Skmacy#undef msleep
36176472Skmacy#define msleep t3_os_sleep
37176472Skmacy
38167514Skmacyenum {
39181614Skmacy	PMD_RSD     = 10,   /* PMA/PMD receive signal detect register */
40181614Skmacy	PCS_STAT1_X = 24,   /* 10GBASE-X PCS status 1 register */
41181614Skmacy	PCS_STAT1_R = 32,   /* 10GBASE-R PCS status 1 register */
42181614Skmacy	XS_LN_STAT  = 24    /* XS lane status register */
43181614Skmacy};
44181614Skmacy
45181614Skmacyenum {
46167514Skmacy	AEL100X_TX_DISABLE  = 9,
47167514Skmacy	AEL100X_TX_CONFIG1  = 0xc002,
48197791Snp
49167514Skmacy	AEL1002_PWR_DOWN_HI = 0xc011,
50167514Skmacy	AEL1002_PWR_DOWN_LO = 0xc012,
51167514Skmacy	AEL1002_XFI_EQL     = 0xc015,
52167514Skmacy	AEL1002_LB_EN       = 0xc017,
53197791Snp
54180583Skmacy	AEL_OPT_SETTINGS    = 0xc017,
55181614Skmacy	AEL_I2C_CTRL        = 0xc30a,
56181614Skmacy	AEL_I2C_DATA        = 0xc30b,
57181614Skmacy	AEL_I2C_STAT        = 0xc30c,
58197791Snp
59181614Skmacy	AEL2005_GPIO_CTRL   = 0xc214,
60181614Skmacy	AEL2005_GPIO_STAT   = 0xc215,
61197791Snp
62197791Snp	AEL2020_GPIO_INTR   = 0xc103,
63197791Snp	AEL2020_GPIO_CTRL   = 0xc108,
64197791Snp	AEL2020_GPIO_STAT   = 0xc10c,
65197791Snp	AEL2020_GPIO_CFG    = 0xc110,
66197791Snp
67197791Snp	AEL2020_GPIO_SDA    = 0,
68197791Snp	AEL2020_GPIO_MODDET = 1,
69197791Snp	AEL2020_GPIO_0      = 3,
70197791Snp	AEL2020_GPIO_1      = 2,
71197791Snp	AEL2020_GPIO_LSTAT  = AEL2020_GPIO_1,
72180583Skmacy};
73167514Skmacy
74181614Skmacyenum { edc_none, edc_sr, edc_twinax };
75181614Skmacy
76181614Skmacy/* PHY module I2C device address */
77189643Sgnnenum {
78189643Sgnn	MODULE_DEV_ADDR	= 0xa0,
79189643Sgnn	SFF_DEV_ADDR	= 0xa2,
80189643Sgnn};
81181614Skmacy
82189643Sgnn/* PHY transceiver type */
83189643Sgnnenum {
84189643Sgnn	phy_transtype_unknown = 0,
85189643Sgnn	phy_transtype_sfp     = 3,
86189643Sgnn	phy_transtype_xfp     = 6,
87189643Sgnn};
88189643Sgnn
89181614Skmacy#define AEL2005_MODDET_IRQ 4
90181614Skmacy
91180583Skmacystruct reg_val {
92180583Skmacy	unsigned short mmd_addr;
93180583Skmacy	unsigned short reg_addr;
94180583Skmacy	unsigned short clear_bits;
95180583Skmacy	unsigned short set_bits;
96167514Skmacy};
97167514Skmacy
98197791Snpstatic int ael2xxx_get_module_type(struct cphy *phy, int delay_ms);
99186282Sgnn
100180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv)
101180583Skmacy{
102180583Skmacy	int err;
103180583Skmacy
104180583Skmacy	for (err = 0; rv->mmd_addr && !err; rv++) {
105180583Skmacy		if (rv->clear_bits == 0xffff)
106180583Skmacy			err = mdio_write(phy, rv->mmd_addr, rv->reg_addr,
107180583Skmacy					 rv->set_bits);
108180583Skmacy		else
109180583Skmacy			err = t3_mdio_change_bits(phy, rv->mmd_addr,
110180583Skmacy						  rv->reg_addr, rv->clear_bits,
111180583Skmacy						  rv->set_bits);
112180583Skmacy	}
113180583Skmacy	return err;
114180583Skmacy}
115180583Skmacy
116167514Skmacystatic void ael100x_txon(struct cphy *phy)
117167514Skmacy{
118167514Skmacy	int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL;
119167514Skmacy
120176472Skmacy	msleep(100);
121167514Skmacy	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio);
122176472Skmacy	msleep(30);
123167514Skmacy}
124167514Skmacy
125197791Snp/*
126197791Snp * Read an 8-bit word from a device attached to the PHY's i2c bus.
127197791Snp */
128189643Sgnnstatic int ael_i2c_rd(struct cphy *phy, int dev_addr, int word_addr)
129189643Sgnn{
130189643Sgnn	int i, err;
131189643Sgnn	unsigned int stat, data;
132189643Sgnn
133189643Sgnn	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
134189643Sgnn			 (dev_addr << 8) | (1 << 8) | word_addr);
135189643Sgnn	if (err)
136189643Sgnn		return err;
137189643Sgnn
138189643Sgnn	for (i = 0; i < 200; i++) {
139189643Sgnn		msleep(1);
140189643Sgnn		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
141189643Sgnn		if (err)
142189643Sgnn			return err;
143189643Sgnn		if ((stat & 3) == 1) {
144189643Sgnn			err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA,
145189643Sgnn					&data);
146189643Sgnn			if (err)
147189643Sgnn				return err;
148189643Sgnn			return data >> 8;
149189643Sgnn		}
150189643Sgnn	}
151197791Snp	CH_WARN(phy->adapter, "PHY %u i2c read of dev.addr %x.%x timed out\n",
152197791Snp		phy->addr, dev_addr, word_addr);
153189643Sgnn	return -ETIMEDOUT;
154189643Sgnn}
155189643Sgnn
156197791Snp/*
157197791Snp * Write an 8-bit word to a device attached to the PHY's i2c bus.
158197791Snp */
159189643Sgnnstatic int ael_i2c_wr(struct cphy *phy, int dev_addr, int word_addr, int data)
160189643Sgnn{
161189643Sgnn	int i, err;
162189643Sgnn	unsigned int stat;
163189643Sgnn
164189643Sgnn	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, data);
165189643Sgnn	if (err)
166189643Sgnn		return err;
167189643Sgnn
168189643Sgnn	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
169189643Sgnn			 (dev_addr << 8) | word_addr);
170189643Sgnn	if (err)
171189643Sgnn		return err;
172189643Sgnn
173189643Sgnn	for (i = 0; i < 200; i++) {
174189643Sgnn		msleep(1);
175189643Sgnn		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
176189643Sgnn		if (err)
177189643Sgnn			return err;
178189643Sgnn		if ((stat & 3) == 1)
179189643Sgnn			return 0;
180189643Sgnn	}
181197791Snp	CH_WARN(phy->adapter, "PHY %u i2c Write of dev.addr %x.%x = %#x timed out\n",
182197791Snp		phy->addr, dev_addr, word_addr, data);
183189643Sgnn	return -ETIMEDOUT;
184189643Sgnn}
185189643Sgnn
186189643Sgnnstatic int get_phytrans_type(struct cphy *phy)
187189643Sgnn{
188189643Sgnn	int v;
189189643Sgnn
190189643Sgnn	v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0);
191189643Sgnn	if (v < 0)
192189643Sgnn		return phy_transtype_unknown;
193189643Sgnn
194189643Sgnn	return v;
195189643Sgnn}
196189643Sgnn
197189643Sgnnstatic int ael_laser_down(struct cphy *phy, int enable)
198189643Sgnn{
199189643Sgnn	int v, dev_addr;
200189643Sgnn
201189643Sgnn	v = get_phytrans_type(phy);
202189643Sgnn	if (v < 0)
203189643Sgnn		return v;
204189643Sgnn
205189643Sgnn	if (v == phy_transtype_sfp) {
206189643Sgnn		/* Check SFF Soft TX disable is supported */
207189643Sgnn		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 93);
208189643Sgnn		if (v < 0)
209189643Sgnn			return v;
210189643Sgnn
211189643Sgnn		v &= 0x40;
212189643Sgnn		if (!v)
213189643Sgnn			return v;
214189643Sgnn
215189643Sgnn		dev_addr = SFF_DEV_ADDR;
216189643Sgnn	} else if (v == phy_transtype_xfp)
217189643Sgnn		dev_addr = MODULE_DEV_ADDR;
218189643Sgnn	else
219189643Sgnn		return v;
220189643Sgnn
221189643Sgnn	v = ael_i2c_rd(phy, dev_addr, 110);
222189643Sgnn	if (v < 0)
223189643Sgnn		return v;
224189643Sgnn
225189643Sgnn	if (enable)
226189643Sgnn		v |= 0x40;
227189643Sgnn	else
228189643Sgnn		v &= ~0x40;
229189643Sgnn
230189643Sgnn	v = ael_i2c_wr(phy, dev_addr, 110, v);
231189643Sgnn
232189643Sgnn	return v;
233189643Sgnn}
234189643Sgnn
235167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable)
236167514Skmacy{
237167514Skmacy	int err;
238167514Skmacy
239167514Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable);
240167514Skmacy	if (!err)
241167514Skmacy		err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
242167514Skmacy					  BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
243167514Skmacy	return err;
244167514Skmacy}
245167514Skmacy
246186282Sgnnstatic int ael1002_get_module_type(struct cphy *phy, int delay_ms)
247186282Sgnn{
248186282Sgnn	int v;
249186282Sgnn
250186282Sgnn	if (delay_ms)
251186282Sgnn		msleep(delay_ms);
252186282Sgnn
253197791Snp	v = ael2xxx_get_module_type(phy, delay_ms);
254186282Sgnn
255197791Snp	return (v == -ETIMEDOUT ? phy_modtype_none : v);
256186282Sgnn}
257186282Sgnn
258167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait)
259167514Skmacy{
260167514Skmacy	int err;
261167514Skmacy
262167514Skmacy	if ((err = ael1002_power_down(phy, 0)) ||
263167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) ||
264167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) ||
265167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) ||
266167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) ||
267167514Skmacy	    (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN,
268167514Skmacy				       0, 1 << 5)))
269167514Skmacy		return err;
270186282Sgnn
271186282Sgnn	err = ael1002_get_module_type(phy, 300);
272186282Sgnn	if (err >= 0)
273186282Sgnn		phy->modtype = err;
274186282Sgnn
275167514Skmacy	return 0;
276167514Skmacy}
277167514Skmacy
278167514Skmacystatic int ael1002_intr_noop(struct cphy *phy)
279167514Skmacy{
280167514Skmacy	return 0;
281167514Skmacy}
282167514Skmacy
283181614Skmacy/*
284181614Skmacy * Get link status for a 10GBASE-R device.
285181614Skmacy */
286181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed,
287181614Skmacy			     int *duplex, int *fc)
288167514Skmacy{
289167514Skmacy	if (link_ok) {
290181614Skmacy		unsigned int stat0, stat1, stat2;
291181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
292167514Skmacy
293181614Skmacy		if (!err)
294181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1);
295181614Skmacy		if (!err)
296181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
297167514Skmacy		if (err)
298167514Skmacy			return err;
299181614Skmacy		*link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1;
300167514Skmacy	}
301167514Skmacy	if (speed)
302167514Skmacy		*speed = SPEED_10000;
303167514Skmacy	if (duplex)
304167514Skmacy		*duplex = DUPLEX_FULL;
305167514Skmacy	return 0;
306167514Skmacy}
307167514Skmacy
308167514Skmacy#ifdef C99_NOT_SUPPORTED
309167514Skmacystatic struct cphy_ops ael1002_ops = {
310167514Skmacy	ael1002_reset,
311167514Skmacy	ael1002_intr_noop,
312167514Skmacy	ael1002_intr_noop,
313167514Skmacy	ael1002_intr_noop,
314167514Skmacy	ael1002_intr_noop,
315167514Skmacy	NULL,
316167514Skmacy	NULL,
317167514Skmacy	NULL,
318167514Skmacy	NULL,
319167514Skmacy	NULL,
320181614Skmacy	get_link_status_r,
321167514Skmacy	ael1002_power_down,
322167514Skmacy};
323167514Skmacy#else
324167514Skmacystatic struct cphy_ops ael1002_ops = {
325167514Skmacy	.reset           = ael1002_reset,
326167514Skmacy	.intr_enable     = ael1002_intr_noop,
327167514Skmacy	.intr_disable    = ael1002_intr_noop,
328167514Skmacy	.intr_clear      = ael1002_intr_noop,
329167514Skmacy	.intr_handler    = ael1002_intr_noop,
330181614Skmacy	.get_link_status = get_link_status_r,
331167514Skmacy	.power_down      = ael1002_power_down,
332167514Skmacy};
333167514Skmacy#endif
334167514Skmacy
335197791Snpint t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr,
336176472Skmacy			const struct mdio_ops *mdio_ops)
337167514Skmacy{
338186282Sgnn	int err;
339197791Snp	struct cphy *phy = &pinfo->phy;
340186282Sgnn
341197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1002_ops, mdio_ops,
342176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
343177340Skmacy		  "10GBASE-R");
344167514Skmacy	ael100x_txon(phy);
345189643Sgnn	ael_laser_down(phy, 0);
346186282Sgnn
347186282Sgnn	err = ael1002_get_module_type(phy, 0);
348186282Sgnn	if (err >= 0)
349186282Sgnn		phy->modtype = err;
350186282Sgnn
351176472Skmacy	return 0;
352167514Skmacy}
353167514Skmacy
354167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait)
355167514Skmacy{
356189643Sgnn	int err;
357189643Sgnn
358189643Sgnn	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
359189643Sgnn	if (err)
360189643Sgnn		return err;
361189643Sgnn
362189643Sgnn	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN,
363189643Sgnn			 F_GPIO6_OUT_VAL, 0);
364189643Sgnn
365185157Sgnn	msleep(125);
366189643Sgnn
367189643Sgnn	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN,
368189643Sgnn			 F_GPIO6_OUT_VAL, F_GPIO6_OUT_VAL);
369189643Sgnn
370185157Sgnn	msleep(125);
371185620Sgnn
372189643Sgnn	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
373189643Sgnn	if (err)
374189643Sgnn		return err;
375185620Sgnn
376189643Sgnn	msleep(125);
377189643Sgnn
378189643Sgnn	err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 1);
379189643Sgnn	if (err)
380189643Sgnn		return err;
381189643Sgnn
382189643Sgnn	msleep(125);
383189643Sgnn
384189643Sgnn	err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0);
385189643Sgnn
386189643Sgnn	return err;
387189643Sgnn
388167514Skmacy}
389167514Skmacy
390167514Skmacy#ifdef C99_NOT_SUPPORTED
391167514Skmacystatic struct cphy_ops ael1006_ops = {
392167514Skmacy	ael1006_reset,
393180583Skmacy	t3_phy_lasi_intr_enable,
394180583Skmacy	t3_phy_lasi_intr_disable,
395180583Skmacy	t3_phy_lasi_intr_clear,
396180583Skmacy	t3_phy_lasi_intr_handler,
397167514Skmacy	NULL,
398167514Skmacy	NULL,
399167514Skmacy	NULL,
400167514Skmacy	NULL,
401167514Skmacy	NULL,
402181614Skmacy	get_link_status_r,
403197791Snp	ael1002_power_down,
404167514Skmacy};
405167514Skmacy#else
406167514Skmacystatic struct cphy_ops ael1006_ops = {
407167514Skmacy	.reset           = ael1006_reset,
408180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
409180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
410180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
411180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
412181614Skmacy	.get_link_status = get_link_status_r,
413197791Snp	.power_down      = ael1002_power_down,
414167514Skmacy};
415167514Skmacy#endif
416167514Skmacy
417197791Snpint t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr,
418176472Skmacy			const struct mdio_ops *mdio_ops)
419167514Skmacy{
420197791Snp	struct cphy *phy = &pinfo->phy;
421197791Snp
422197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1006_ops, mdio_ops,
423176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
424176472Skmacy		  "10GBASE-SR");
425197791Snp	phy->modtype = phy_modtype_sr;
426167514Skmacy	ael100x_txon(phy);
427176472Skmacy	return 0;
428167514Skmacy}
429167514Skmacy
430197791Snp/*
431197791Snp * Decode our module type.
432197791Snp */
433197791Snpstatic int ael2xxx_get_module_type(struct cphy *phy, int delay_ms)
434197791Snp{
435197791Snp	int v;
436197791Snp
437197791Snp	if (delay_ms)
438197791Snp		msleep(delay_ms);
439197791Snp
440197791Snp	v = get_phytrans_type(phy);
441197791Snp	if (v == phy_transtype_sfp) {
442197791Snp		/* SFP: see SFF-8472 for below */
443197791Snp
444197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3);
445197791Snp		if (v < 0)
446197791Snp			return v;
447197791Snp
448197791Snp		if (v == 0x1)
449204921Snp			goto twinax;
450197791Snp		if (v == 0x10)
451197791Snp			return phy_modtype_sr;
452197791Snp		if (v == 0x20)
453197791Snp			return phy_modtype_lr;
454197791Snp		if (v == 0x40)
455197791Snp			return phy_modtype_lrm;
456197791Snp
457204921Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 8);
458204921Snp		if (v < 0)
459204921Snp			return v;
460204921Snp		if (v == 4) {
461204921Snp			v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 60);
462204921Snp			if (v < 0)
463204921Snp				return v;
464204921Snp			if (v & 0x1)
465204921Snp				goto twinax;
466204921Snp		}
467204921Snp
468197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6);
469197791Snp		if (v < 0)
470197791Snp			return v;
471197791Snp		if (v != 4)
472197791Snp			return phy_modtype_unknown;
473197791Snp
474197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10);
475197791Snp		if (v < 0)
476197791Snp			return v;
477197791Snp
478197791Snp		if (v & 0x80) {
479204921Snptwinax:
480197791Snp			v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
481197791Snp			if (v < 0)
482197791Snp				return v;
483197791Snp			return v > 10 ? phy_modtype_twinax_long :
484197791Snp			    phy_modtype_twinax;
485197791Snp		}
486197791Snp	} else if (v == phy_transtype_xfp) {
487197791Snp		/* XFP: See INF-8077i for details. */
488197791Snp
489197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127);
490197791Snp		if (v < 0)
491197791Snp			return v;
492197791Snp
493197791Snp		if (v != 1) {
494197791Snp			/* XXX: set page select to table 1 yourself */
495197791Snp			return phy_modtype_unknown;
496197791Snp		}
497197791Snp
498197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131);
499197791Snp		if (v < 0)
500197791Snp			return v;
501197791Snp		v &= 0xf0;
502197791Snp		if (v == 0x10)
503197791Snp			return phy_modtype_lrm;
504197791Snp		if (v == 0x40)
505197791Snp			return phy_modtype_lr;
506197791Snp		if (v == 0x80)
507197791Snp			return phy_modtype_sr;
508197791Snp	}
509197791Snp
510197791Snp	return phy_modtype_unknown;
511197791Snp}
512197791Snp
513197791Snp/*
514197791Snp * Code to support the Aeluros/NetLogic 2005 10Gb PHY.
515197791Snp */
516180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
517180583Skmacy{
518181614Skmacy	static struct reg_val regs[] = {
519181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
520181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
521181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
522181614Skmacy		{ 0, 0, 0, 0 }
523181614Skmacy	};
524180583Skmacy	static u16 sr_edc[] = {
525180583Skmacy		0xcc00, 0x2ff4,
526180583Skmacy		0xcc01, 0x3cd4,
527180583Skmacy		0xcc02, 0x2015,
528180583Skmacy		0xcc03, 0x3105,
529180583Skmacy		0xcc04, 0x6524,
530180583Skmacy		0xcc05, 0x27ff,
531180583Skmacy		0xcc06, 0x300f,
532180583Skmacy		0xcc07, 0x2c8b,
533180583Skmacy		0xcc08, 0x300b,
534180583Skmacy		0xcc09, 0x4009,
535180583Skmacy		0xcc0a, 0x400e,
536180583Skmacy		0xcc0b, 0x2f72,
537180583Skmacy		0xcc0c, 0x3002,
538180583Skmacy		0xcc0d, 0x1002,
539180583Skmacy		0xcc0e, 0x2172,
540180583Skmacy		0xcc0f, 0x3012,
541180583Skmacy		0xcc10, 0x1002,
542180583Skmacy		0xcc11, 0x25d2,
543180583Skmacy		0xcc12, 0x3012,
544180583Skmacy		0xcc13, 0x1002,
545180583Skmacy		0xcc14, 0xd01e,
546180583Skmacy		0xcc15, 0x27d2,
547180583Skmacy		0xcc16, 0x3012,
548180583Skmacy		0xcc17, 0x1002,
549180583Skmacy		0xcc18, 0x2004,
550180583Skmacy		0xcc19, 0x3c84,
551180583Skmacy		0xcc1a, 0x6436,
552180583Skmacy		0xcc1b, 0x2007,
553180583Skmacy		0xcc1c, 0x3f87,
554180583Skmacy		0xcc1d, 0x8676,
555180583Skmacy		0xcc1e, 0x40b7,
556180583Skmacy		0xcc1f, 0xa746,
557180583Skmacy		0xcc20, 0x4047,
558180583Skmacy		0xcc21, 0x5673,
559180583Skmacy		0xcc22, 0x2982,
560180583Skmacy		0xcc23, 0x3002,
561180583Skmacy		0xcc24, 0x13d2,
562180583Skmacy		0xcc25, 0x8bbd,
563180583Skmacy		0xcc26, 0x2862,
564180583Skmacy		0xcc27, 0x3012,
565180583Skmacy		0xcc28, 0x1002,
566180583Skmacy		0xcc29, 0x2092,
567180583Skmacy		0xcc2a, 0x3012,
568180583Skmacy		0xcc2b, 0x1002,
569180583Skmacy		0xcc2c, 0x5cc3,
570180583Skmacy		0xcc2d, 0x314,
571180583Skmacy		0xcc2e, 0x2942,
572180583Skmacy		0xcc2f, 0x3002,
573180583Skmacy		0xcc30, 0x1002,
574180583Skmacy		0xcc31, 0xd019,
575180583Skmacy		0xcc32, 0x2032,
576180583Skmacy		0xcc33, 0x3012,
577180583Skmacy		0xcc34, 0x1002,
578180583Skmacy		0xcc35, 0x2a04,
579180583Skmacy		0xcc36, 0x3c74,
580180583Skmacy		0xcc37, 0x6435,
581180583Skmacy		0xcc38, 0x2fa4,
582180583Skmacy		0xcc39, 0x3cd4,
583180583Skmacy		0xcc3a, 0x6624,
584180583Skmacy		0xcc3b, 0x5563,
585180583Skmacy		0xcc3c, 0x2d42,
586180583Skmacy		0xcc3d, 0x3002,
587180583Skmacy		0xcc3e, 0x13d2,
588180583Skmacy		0xcc3f, 0x464d,
589180583Skmacy		0xcc40, 0x2862,
590180583Skmacy		0xcc41, 0x3012,
591180583Skmacy		0xcc42, 0x1002,
592180583Skmacy		0xcc43, 0x2032,
593180583Skmacy		0xcc44, 0x3012,
594180583Skmacy		0xcc45, 0x1002,
595180583Skmacy		0xcc46, 0x2fb4,
596180583Skmacy		0xcc47, 0x3cd4,
597180583Skmacy		0xcc48, 0x6624,
598180583Skmacy		0xcc49, 0x5563,
599180583Skmacy		0xcc4a, 0x2d42,
600180583Skmacy		0xcc4b, 0x3002,
601180583Skmacy		0xcc4c, 0x13d2,
602180583Skmacy		0xcc4d, 0x2ed2,
603180583Skmacy		0xcc4e, 0x3002,
604180583Skmacy		0xcc4f, 0x1002,
605180583Skmacy		0xcc50, 0x2fd2,
606180583Skmacy		0xcc51, 0x3002,
607180583Skmacy		0xcc52, 0x1002,
608180583Skmacy		0xcc53, 0x004,
609180583Skmacy		0xcc54, 0x2942,
610180583Skmacy		0xcc55, 0x3002,
611180583Skmacy		0xcc56, 0x1002,
612180583Skmacy		0xcc57, 0x2092,
613180583Skmacy		0xcc58, 0x3012,
614180583Skmacy		0xcc59, 0x1002,
615180583Skmacy		0xcc5a, 0x5cc3,
616180583Skmacy		0xcc5b, 0x317,
617180583Skmacy		0xcc5c, 0x2f72,
618180583Skmacy		0xcc5d, 0x3002,
619180583Skmacy		0xcc5e, 0x1002,
620180583Skmacy		0xcc5f, 0x2942,
621180583Skmacy		0xcc60, 0x3002,
622180583Skmacy		0xcc61, 0x1002,
623180583Skmacy		0xcc62, 0x22cd,
624180583Skmacy		0xcc63, 0x301d,
625180583Skmacy		0xcc64, 0x2862,
626180583Skmacy		0xcc65, 0x3012,
627180583Skmacy		0xcc66, 0x1002,
628180583Skmacy		0xcc67, 0x2ed2,
629180583Skmacy		0xcc68, 0x3002,
630180583Skmacy		0xcc69, 0x1002,
631180583Skmacy		0xcc6a, 0x2d72,
632180583Skmacy		0xcc6b, 0x3002,
633180583Skmacy		0xcc6c, 0x1002,
634180583Skmacy		0xcc6d, 0x628f,
635180583Skmacy		0xcc6e, 0x2112,
636180583Skmacy		0xcc6f, 0x3012,
637180583Skmacy		0xcc70, 0x1002,
638180583Skmacy		0xcc71, 0x5aa3,
639180583Skmacy		0xcc72, 0x2dc2,
640180583Skmacy		0xcc73, 0x3002,
641180583Skmacy		0xcc74, 0x1312,
642180583Skmacy		0xcc75, 0x6f72,
643180583Skmacy		0xcc76, 0x1002,
644180583Skmacy		0xcc77, 0x2807,
645180583Skmacy		0xcc78, 0x31a7,
646180583Skmacy		0xcc79, 0x20c4,
647180583Skmacy		0xcc7a, 0x3c24,
648180583Skmacy		0xcc7b, 0x6724,
649180583Skmacy		0xcc7c, 0x1002,
650180583Skmacy		0xcc7d, 0x2807,
651180583Skmacy		0xcc7e, 0x3187,
652180583Skmacy		0xcc7f, 0x20c4,
653180583Skmacy		0xcc80, 0x3c24,
654180583Skmacy		0xcc81, 0x6724,
655180583Skmacy		0xcc82, 0x1002,
656180583Skmacy		0xcc83, 0x2514,
657180583Skmacy		0xcc84, 0x3c64,
658180583Skmacy		0xcc85, 0x6436,
659180583Skmacy		0xcc86, 0xdff4,
660180583Skmacy		0xcc87, 0x6436,
661180583Skmacy		0xcc88, 0x1002,
662180583Skmacy		0xcc89, 0x40a4,
663180583Skmacy		0xcc8a, 0x643c,
664180583Skmacy		0xcc8b, 0x4016,
665180583Skmacy		0xcc8c, 0x8c6c,
666180583Skmacy		0xcc8d, 0x2b24,
667180583Skmacy		0xcc8e, 0x3c24,
668180583Skmacy		0xcc8f, 0x6435,
669180583Skmacy		0xcc90, 0x1002,
670180583Skmacy		0xcc91, 0x2b24,
671180583Skmacy		0xcc92, 0x3c24,
672180583Skmacy		0xcc93, 0x643a,
673180583Skmacy		0xcc94, 0x4025,
674180583Skmacy		0xcc95, 0x8a5a,
675180583Skmacy		0xcc96, 0x1002,
676180583Skmacy		0xcc97, 0x2731,
677180583Skmacy		0xcc98, 0x3011,
678180583Skmacy		0xcc99, 0x1001,
679180583Skmacy		0xcc9a, 0xc7a0,
680180583Skmacy		0xcc9b, 0x100,
681180583Skmacy		0xcc9c, 0xc502,
682180583Skmacy		0xcc9d, 0x53ac,
683180583Skmacy		0xcc9e, 0xc503,
684180583Skmacy		0xcc9f, 0xd5d5,
685180583Skmacy		0xcca0, 0xc600,
686180583Skmacy		0xcca1, 0x2a6d,
687180583Skmacy		0xcca2, 0xc601,
688180583Skmacy		0xcca3, 0x2a4c,
689180583Skmacy		0xcca4, 0xc602,
690180583Skmacy		0xcca5, 0x111,
691180583Skmacy		0xcca6, 0xc60c,
692180583Skmacy		0xcca7, 0x5900,
693180583Skmacy		0xcca8, 0xc710,
694180583Skmacy		0xcca9, 0x700,
695180583Skmacy		0xccaa, 0xc718,
696180583Skmacy		0xccab, 0x700,
697180583Skmacy		0xccac, 0xc720,
698180583Skmacy		0xccad, 0x4700,
699180583Skmacy		0xccae, 0xc801,
700180583Skmacy		0xccaf, 0x7f50,
701180583Skmacy		0xccb0, 0xc802,
702180583Skmacy		0xccb1, 0x7760,
703180583Skmacy		0xccb2, 0xc803,
704180583Skmacy		0xccb3, 0x7fce,
705180583Skmacy		0xccb4, 0xc804,
706180583Skmacy		0xccb5, 0x5700,
707180583Skmacy		0xccb6, 0xc805,
708180583Skmacy		0xccb7, 0x5f11,
709180583Skmacy		0xccb8, 0xc806,
710180583Skmacy		0xccb9, 0x4751,
711180583Skmacy		0xccba, 0xc807,
712180583Skmacy		0xccbb, 0x57e1,
713180583Skmacy		0xccbc, 0xc808,
714180583Skmacy		0xccbd, 0x2700,
715180583Skmacy		0xccbe, 0xc809,
716180583Skmacy		0xccbf, 0x000,
717180583Skmacy		0xccc0, 0xc821,
718180583Skmacy		0xccc1, 0x002,
719180583Skmacy		0xccc2, 0xc822,
720180583Skmacy		0xccc3, 0x014,
721180583Skmacy		0xccc4, 0xc832,
722180583Skmacy		0xccc5, 0x1186,
723180583Skmacy		0xccc6, 0xc847,
724180583Skmacy		0xccc7, 0x1e02,
725180583Skmacy		0xccc8, 0xc013,
726180583Skmacy		0xccc9, 0xf341,
727180583Skmacy		0xccca, 0xc01a,
728180583Skmacy		0xcccb, 0x446,
729180583Skmacy		0xcccc, 0xc024,
730180583Skmacy		0xcccd, 0x1000,
731180583Skmacy		0xccce, 0xc025,
732180583Skmacy		0xcccf, 0xa00,
733180583Skmacy		0xccd0, 0xc026,
734180583Skmacy		0xccd1, 0xc0c,
735180583Skmacy		0xccd2, 0xc027,
736180583Skmacy		0xccd3, 0xc0c,
737180583Skmacy		0xccd4, 0xc029,
738180583Skmacy		0xccd5, 0x0a0,
739180583Skmacy		0xccd6, 0xc030,
740180583Skmacy		0xccd7, 0xa00,
741180583Skmacy		0xccd8, 0xc03c,
742180583Skmacy		0xccd9, 0x01c,
743180583Skmacy		0xccda, 0xc005,
744180583Skmacy		0xccdb, 0x7a06,
745180583Skmacy		0xccdc, 0x000,
746180583Skmacy		0xccdd, 0x2731,
747180583Skmacy		0xccde, 0x3011,
748180583Skmacy		0xccdf, 0x1001,
749180583Skmacy		0xcce0, 0xc620,
750180583Skmacy		0xcce1, 0x000,
751180583Skmacy		0xcce2, 0xc621,
752180583Skmacy		0xcce3, 0x03f,
753180583Skmacy		0xcce4, 0xc622,
754180583Skmacy		0xcce5, 0x000,
755180583Skmacy		0xcce6, 0xc623,
756180583Skmacy		0xcce7, 0x000,
757180583Skmacy		0xcce8, 0xc624,
758180583Skmacy		0xcce9, 0x000,
759180583Skmacy		0xccea, 0xc625,
760180583Skmacy		0xcceb, 0x000,
761180583Skmacy		0xccec, 0xc627,
762180583Skmacy		0xcced, 0x000,
763180583Skmacy		0xccee, 0xc628,
764180583Skmacy		0xccef, 0x000,
765180583Skmacy		0xccf0, 0xc62c,
766180583Skmacy		0xccf1, 0x000,
767180583Skmacy		0xccf2, 0x000,
768180583Skmacy		0xccf3, 0x2806,
769180583Skmacy		0xccf4, 0x3cb6,
770180583Skmacy		0xccf5, 0xc161,
771180583Skmacy		0xccf6, 0x6134,
772180583Skmacy		0xccf7, 0x6135,
773180583Skmacy		0xccf8, 0x5443,
774180583Skmacy		0xccf9, 0x303,
775180583Skmacy		0xccfa, 0x6524,
776180583Skmacy		0xccfb, 0x00b,
777180583Skmacy		0xccfc, 0x1002,
778180583Skmacy		0xccfd, 0x2104,
779180583Skmacy		0xccfe, 0x3c24,
780180583Skmacy		0xccff, 0x2105,
781180583Skmacy		0xcd00, 0x3805,
782180583Skmacy		0xcd01, 0x6524,
783180583Skmacy		0xcd02, 0xdff4,
784180583Skmacy		0xcd03, 0x4005,
785180583Skmacy		0xcd04, 0x6524,
786180583Skmacy		0xcd05, 0x1002,
787180583Skmacy		0xcd06, 0x5dd3,
788180583Skmacy		0xcd07, 0x306,
789180583Skmacy		0xcd08, 0x2ff7,
790180583Skmacy		0xcd09, 0x38f7,
791180583Skmacy		0xcd0a, 0x60b7,
792180583Skmacy		0xcd0b, 0xdffd,
793180583Skmacy		0xcd0c, 0x00a,
794180583Skmacy		0xcd0d, 0x1002,
795180583Skmacy		0xcd0e, 0
796180583Skmacy	};
797180583Skmacy	int i, err;
798180583Skmacy
799181614Skmacy	err = set_phy_regs(phy, regs);
800181614Skmacy	if (err)
801181614Skmacy		return err;
802181614Skmacy
803181614Skmacy	msleep(50);
804181614Skmacy
805181614Skmacy	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
806180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
807180583Skmacy				 sr_edc[i + 1]);
808181614Skmacy	if (!err)
809181614Skmacy		phy->priv = edc_sr;
810180583Skmacy	return err;
811180583Skmacy}
812180583Skmacy
813181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
814181614Skmacy{
815181614Skmacy	static struct reg_val regs[] = {
816181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
817181614Skmacy		{ 0, 0, 0, 0 }
818181614Skmacy	};
819181614Skmacy	static struct reg_val preemphasis[] = {
820181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
821181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
822181614Skmacy		{ 0, 0, 0, 0 }
823181614Skmacy	};
824181614Skmacy	static u16 twinax_edc[] = {
825181614Skmacy		0xcc00, 0x4009,
826181614Skmacy		0xcc01, 0x27ff,
827181614Skmacy		0xcc02, 0x300f,
828181614Skmacy		0xcc03, 0x40aa,
829181614Skmacy		0xcc04, 0x401c,
830181614Skmacy		0xcc05, 0x401e,
831181614Skmacy		0xcc06, 0x2ff4,
832181614Skmacy		0xcc07, 0x3cd4,
833181614Skmacy		0xcc08, 0x2035,
834181614Skmacy		0xcc09, 0x3145,
835181614Skmacy		0xcc0a, 0x6524,
836181614Skmacy		0xcc0b, 0x26a2,
837181614Skmacy		0xcc0c, 0x3012,
838181614Skmacy		0xcc0d, 0x1002,
839181614Skmacy		0xcc0e, 0x29c2,
840181614Skmacy		0xcc0f, 0x3002,
841181614Skmacy		0xcc10, 0x1002,
842181614Skmacy		0xcc11, 0x2072,
843181614Skmacy		0xcc12, 0x3012,
844181614Skmacy		0xcc13, 0x1002,
845181614Skmacy		0xcc14, 0x22cd,
846181614Skmacy		0xcc15, 0x301d,
847181614Skmacy		0xcc16, 0x2e52,
848181614Skmacy		0xcc17, 0x3012,
849181614Skmacy		0xcc18, 0x1002,
850181614Skmacy		0xcc19, 0x28e2,
851181614Skmacy		0xcc1a, 0x3002,
852181614Skmacy		0xcc1b, 0x1002,
853181614Skmacy		0xcc1c, 0x628f,
854181614Skmacy		0xcc1d, 0x2ac2,
855181614Skmacy		0xcc1e, 0x3012,
856181614Skmacy		0xcc1f, 0x1002,
857181614Skmacy		0xcc20, 0x5553,
858181614Skmacy		0xcc21, 0x2ae2,
859181614Skmacy		0xcc22, 0x3002,
860181614Skmacy		0xcc23, 0x1302,
861181614Skmacy		0xcc24, 0x401e,
862181614Skmacy		0xcc25, 0x2be2,
863181614Skmacy		0xcc26, 0x3012,
864181614Skmacy		0xcc27, 0x1002,
865181614Skmacy		0xcc28, 0x2da2,
866181614Skmacy		0xcc29, 0x3012,
867181614Skmacy		0xcc2a, 0x1002,
868181614Skmacy		0xcc2b, 0x2ba2,
869181614Skmacy		0xcc2c, 0x3002,
870181614Skmacy		0xcc2d, 0x1002,
871181614Skmacy		0xcc2e, 0x5ee3,
872181614Skmacy		0xcc2f, 0x305,
873181614Skmacy		0xcc30, 0x400e,
874181614Skmacy		0xcc31, 0x2bc2,
875181614Skmacy		0xcc32, 0x3002,
876181614Skmacy		0xcc33, 0x1002,
877181614Skmacy		0xcc34, 0x2b82,
878181614Skmacy		0xcc35, 0x3012,
879181614Skmacy		0xcc36, 0x1002,
880181614Skmacy		0xcc37, 0x5663,
881181614Skmacy		0xcc38, 0x302,
882181614Skmacy		0xcc39, 0x401e,
883181614Skmacy		0xcc3a, 0x6f72,
884181614Skmacy		0xcc3b, 0x1002,
885181614Skmacy		0xcc3c, 0x628f,
886181614Skmacy		0xcc3d, 0x2be2,
887181614Skmacy		0xcc3e, 0x3012,
888181614Skmacy		0xcc3f, 0x1002,
889181614Skmacy		0xcc40, 0x22cd,
890181614Skmacy		0xcc41, 0x301d,
891181614Skmacy		0xcc42, 0x2e52,
892181614Skmacy		0xcc43, 0x3012,
893181614Skmacy		0xcc44, 0x1002,
894181614Skmacy		0xcc45, 0x2522,
895181614Skmacy		0xcc46, 0x3012,
896181614Skmacy		0xcc47, 0x1002,
897181614Skmacy		0xcc48, 0x2da2,
898181614Skmacy		0xcc49, 0x3012,
899181614Skmacy		0xcc4a, 0x1002,
900181614Skmacy		0xcc4b, 0x2ca2,
901181614Skmacy		0xcc4c, 0x3012,
902181614Skmacy		0xcc4d, 0x1002,
903181614Skmacy		0xcc4e, 0x2fa4,
904181614Skmacy		0xcc4f, 0x3cd4,
905181614Skmacy		0xcc50, 0x6624,
906181614Skmacy		0xcc51, 0x410b,
907181614Skmacy		0xcc52, 0x56b3,
908181614Skmacy		0xcc53, 0x3c4,
909181614Skmacy		0xcc54, 0x2fb2,
910181614Skmacy		0xcc55, 0x3002,
911181614Skmacy		0xcc56, 0x1002,
912181614Skmacy		0xcc57, 0x220b,
913181614Skmacy		0xcc58, 0x303b,
914181614Skmacy		0xcc59, 0x56b3,
915181614Skmacy		0xcc5a, 0x3c3,
916181614Skmacy		0xcc5b, 0x866b,
917181614Skmacy		0xcc5c, 0x400c,
918181614Skmacy		0xcc5d, 0x23a2,
919181614Skmacy		0xcc5e, 0x3012,
920181614Skmacy		0xcc5f, 0x1002,
921181614Skmacy		0xcc60, 0x2da2,
922181614Skmacy		0xcc61, 0x3012,
923181614Skmacy		0xcc62, 0x1002,
924181614Skmacy		0xcc63, 0x2ca2,
925181614Skmacy		0xcc64, 0x3012,
926181614Skmacy		0xcc65, 0x1002,
927181614Skmacy		0xcc66, 0x2fb4,
928181614Skmacy		0xcc67, 0x3cd4,
929181614Skmacy		0xcc68, 0x6624,
930181614Skmacy		0xcc69, 0x56b3,
931181614Skmacy		0xcc6a, 0x3c3,
932181614Skmacy		0xcc6b, 0x866b,
933181614Skmacy		0xcc6c, 0x401c,
934181614Skmacy		0xcc6d, 0x2205,
935181614Skmacy		0xcc6e, 0x3035,
936181614Skmacy		0xcc6f, 0x5b53,
937181614Skmacy		0xcc70, 0x2c52,
938181614Skmacy		0xcc71, 0x3002,
939181614Skmacy		0xcc72, 0x13c2,
940181614Skmacy		0xcc73, 0x5cc3,
941181614Skmacy		0xcc74, 0x317,
942181614Skmacy		0xcc75, 0x2522,
943181614Skmacy		0xcc76, 0x3012,
944181614Skmacy		0xcc77, 0x1002,
945181614Skmacy		0xcc78, 0x2da2,
946181614Skmacy		0xcc79, 0x3012,
947181614Skmacy		0xcc7a, 0x1002,
948181614Skmacy		0xcc7b, 0x2b82,
949181614Skmacy		0xcc7c, 0x3012,
950181614Skmacy		0xcc7d, 0x1002,
951181614Skmacy		0xcc7e, 0x5663,
952181614Skmacy		0xcc7f, 0x303,
953181614Skmacy		0xcc80, 0x401e,
954181614Skmacy		0xcc81, 0x004,
955181614Skmacy		0xcc82, 0x2c42,
956181614Skmacy		0xcc83, 0x3012,
957181614Skmacy		0xcc84, 0x1002,
958181614Skmacy		0xcc85, 0x6f72,
959181614Skmacy		0xcc86, 0x1002,
960181614Skmacy		0xcc87, 0x628f,
961181614Skmacy		0xcc88, 0x2304,
962181614Skmacy		0xcc89, 0x3c84,
963181614Skmacy		0xcc8a, 0x6436,
964181614Skmacy		0xcc8b, 0xdff4,
965181614Skmacy		0xcc8c, 0x6436,
966181614Skmacy		0xcc8d, 0x2ff5,
967181614Skmacy		0xcc8e, 0x3005,
968181614Skmacy		0xcc8f, 0x8656,
969181614Skmacy		0xcc90, 0xdfba,
970181614Skmacy		0xcc91, 0x56a3,
971181614Skmacy		0xcc92, 0xd05a,
972181614Skmacy		0xcc93, 0x21c2,
973181614Skmacy		0xcc94, 0x3012,
974181614Skmacy		0xcc95, 0x1392,
975181614Skmacy		0xcc96, 0xd05a,
976181614Skmacy		0xcc97, 0x56a3,
977181614Skmacy		0xcc98, 0xdfba,
978181614Skmacy		0xcc99, 0x383,
979181614Skmacy		0xcc9a, 0x6f72,
980181614Skmacy		0xcc9b, 0x1002,
981181614Skmacy		0xcc9c, 0x28c5,
982181614Skmacy		0xcc9d, 0x3005,
983181614Skmacy		0xcc9e, 0x4178,
984181614Skmacy		0xcc9f, 0x5653,
985181614Skmacy		0xcca0, 0x384,
986181614Skmacy		0xcca1, 0x22b2,
987181614Skmacy		0xcca2, 0x3012,
988181614Skmacy		0xcca3, 0x1002,
989181614Skmacy		0xcca4, 0x2be5,
990181614Skmacy		0xcca5, 0x3005,
991181614Skmacy		0xcca6, 0x41e8,
992181614Skmacy		0xcca7, 0x5653,
993181614Skmacy		0xcca8, 0x382,
994181614Skmacy		0xcca9, 0x002,
995181614Skmacy		0xccaa, 0x4258,
996181614Skmacy		0xccab, 0x2474,
997181614Skmacy		0xccac, 0x3c84,
998181614Skmacy		0xccad, 0x6437,
999181614Skmacy		0xccae, 0xdff4,
1000181614Skmacy		0xccaf, 0x6437,
1001181614Skmacy		0xccb0, 0x2ff5,
1002181614Skmacy		0xccb1, 0x3c05,
1003181614Skmacy		0xccb2, 0x8757,
1004181614Skmacy		0xccb3, 0xb888,
1005181614Skmacy		0xccb4, 0x9787,
1006181614Skmacy		0xccb5, 0xdff4,
1007181614Skmacy		0xccb6, 0x6724,
1008181614Skmacy		0xccb7, 0x866a,
1009181614Skmacy		0xccb8, 0x6f72,
1010181614Skmacy		0xccb9, 0x1002,
1011181614Skmacy		0xccba, 0x2d01,
1012181614Skmacy		0xccbb, 0x3011,
1013181614Skmacy		0xccbc, 0x1001,
1014181614Skmacy		0xccbd, 0xc620,
1015181614Skmacy		0xccbe, 0x14e5,
1016181614Skmacy		0xccbf, 0xc621,
1017181614Skmacy		0xccc0, 0xc53d,
1018181614Skmacy		0xccc1, 0xc622,
1019181614Skmacy		0xccc2, 0x3cbe,
1020181614Skmacy		0xccc3, 0xc623,
1021181614Skmacy		0xccc4, 0x4452,
1022181614Skmacy		0xccc5, 0xc624,
1023181614Skmacy		0xccc6, 0xc5c5,
1024181614Skmacy		0xccc7, 0xc625,
1025181614Skmacy		0xccc8, 0xe01e,
1026181614Skmacy		0xccc9, 0xc627,
1027181614Skmacy		0xccca, 0x000,
1028181614Skmacy		0xcccb, 0xc628,
1029181614Skmacy		0xcccc, 0x000,
1030181614Skmacy		0xcccd, 0xc62b,
1031181614Skmacy		0xccce, 0x000,
1032181614Skmacy		0xcccf, 0xc62c,
1033181614Skmacy		0xccd0, 0x000,
1034181614Skmacy		0xccd1, 0x000,
1035181614Skmacy		0xccd2, 0x2d01,
1036181614Skmacy		0xccd3, 0x3011,
1037181614Skmacy		0xccd4, 0x1001,
1038181614Skmacy		0xccd5, 0xc620,
1039181614Skmacy		0xccd6, 0x000,
1040181614Skmacy		0xccd7, 0xc621,
1041181614Skmacy		0xccd8, 0x000,
1042181614Skmacy		0xccd9, 0xc622,
1043181614Skmacy		0xccda, 0x0ce,
1044181614Skmacy		0xccdb, 0xc623,
1045181614Skmacy		0xccdc, 0x07f,
1046181614Skmacy		0xccdd, 0xc624,
1047181614Skmacy		0xccde, 0x032,
1048181614Skmacy		0xccdf, 0xc625,
1049181614Skmacy		0xcce0, 0x000,
1050181614Skmacy		0xcce1, 0xc627,
1051181614Skmacy		0xcce2, 0x000,
1052181614Skmacy		0xcce3, 0xc628,
1053181614Skmacy		0xcce4, 0x000,
1054181614Skmacy		0xcce5, 0xc62b,
1055181614Skmacy		0xcce6, 0x000,
1056181614Skmacy		0xcce7, 0xc62c,
1057181614Skmacy		0xcce8, 0x000,
1058181614Skmacy		0xcce9, 0x000,
1059181614Skmacy		0xccea, 0x2d01,
1060181614Skmacy		0xcceb, 0x3011,
1061181614Skmacy		0xccec, 0x1001,
1062181614Skmacy		0xcced, 0xc502,
1063181614Skmacy		0xccee, 0x609f,
1064181614Skmacy		0xccef, 0xc600,
1065181614Skmacy		0xccf0, 0x2a6e,
1066181614Skmacy		0xccf1, 0xc601,
1067181614Skmacy		0xccf2, 0x2a2c,
1068181614Skmacy		0xccf3, 0xc60c,
1069181614Skmacy		0xccf4, 0x5400,
1070181614Skmacy		0xccf5, 0xc710,
1071181614Skmacy		0xccf6, 0x700,
1072181614Skmacy		0xccf7, 0xc718,
1073181614Skmacy		0xccf8, 0x700,
1074181614Skmacy		0xccf9, 0xc720,
1075181614Skmacy		0xccfa, 0x4700,
1076181614Skmacy		0xccfb, 0xc728,
1077181614Skmacy		0xccfc, 0x700,
1078181614Skmacy		0xccfd, 0xc729,
1079181614Skmacy		0xccfe, 0x1207,
1080181614Skmacy		0xccff, 0xc801,
1081181614Skmacy		0xcd00, 0x7f50,
1082181614Skmacy		0xcd01, 0xc802,
1083181614Skmacy		0xcd02, 0x7760,
1084181614Skmacy		0xcd03, 0xc803,
1085181614Skmacy		0xcd04, 0x7fce,
1086181614Skmacy		0xcd05, 0xc804,
1087181614Skmacy		0xcd06, 0x520e,
1088181614Skmacy		0xcd07, 0xc805,
1089181614Skmacy		0xcd08, 0x5c11,
1090181614Skmacy		0xcd09, 0xc806,
1091181614Skmacy		0xcd0a, 0x3c51,
1092181614Skmacy		0xcd0b, 0xc807,
1093181614Skmacy		0xcd0c, 0x4061,
1094181614Skmacy		0xcd0d, 0xc808,
1095181614Skmacy		0xcd0e, 0x49c1,
1096181614Skmacy		0xcd0f, 0xc809,
1097181614Skmacy		0xcd10, 0x3840,
1098181614Skmacy		0xcd11, 0xc80a,
1099181614Skmacy		0xcd12, 0x000,
1100181614Skmacy		0xcd13, 0xc821,
1101181614Skmacy		0xcd14, 0x002,
1102181614Skmacy		0xcd15, 0xc822,
1103181614Skmacy		0xcd16, 0x046,
1104181614Skmacy		0xcd17, 0xc844,
1105181614Skmacy		0xcd18, 0x182f,
1106181614Skmacy		0xcd19, 0xc013,
1107181614Skmacy		0xcd1a, 0xf341,
1108181614Skmacy		0xcd1b, 0xc01a,
1109181614Skmacy		0xcd1c, 0x446,
1110181614Skmacy		0xcd1d, 0xc024,
1111181614Skmacy		0xcd1e, 0x1000,
1112181614Skmacy		0xcd1f, 0xc025,
1113181614Skmacy		0xcd20, 0xa00,
1114181614Skmacy		0xcd21, 0xc026,
1115181614Skmacy		0xcd22, 0xc0c,
1116181614Skmacy		0xcd23, 0xc027,
1117181614Skmacy		0xcd24, 0xc0c,
1118181614Skmacy		0xcd25, 0xc029,
1119181614Skmacy		0xcd26, 0x0a0,
1120181614Skmacy		0xcd27, 0xc030,
1121181614Skmacy		0xcd28, 0xa00,
1122181614Skmacy		0xcd29, 0xc03c,
1123181614Skmacy		0xcd2a, 0x01c,
1124181614Skmacy		0xcd2b, 0x000,
1125181614Skmacy		0xcd2c, 0x2b84,
1126181614Skmacy		0xcd2d, 0x3c74,
1127181614Skmacy		0xcd2e, 0x6435,
1128181614Skmacy		0xcd2f, 0xdff4,
1129181614Skmacy		0xcd30, 0x6435,
1130181614Skmacy		0xcd31, 0x2806,
1131181614Skmacy		0xcd32, 0x3006,
1132181614Skmacy		0xcd33, 0x8565,
1133181614Skmacy		0xcd34, 0x2b24,
1134181614Skmacy		0xcd35, 0x3c24,
1135181614Skmacy		0xcd36, 0x6436,
1136181614Skmacy		0xcd37, 0x1002,
1137181614Skmacy		0xcd38, 0x2b24,
1138181614Skmacy		0xcd39, 0x3c24,
1139181614Skmacy		0xcd3a, 0x6436,
1140181614Skmacy		0xcd3b, 0x4045,
1141181614Skmacy		0xcd3c, 0x8656,
1142181614Skmacy		0xcd3d, 0x1002,
1143181614Skmacy		0xcd3e, 0x2807,
1144181614Skmacy		0xcd3f, 0x31a7,
1145181614Skmacy		0xcd40, 0x20c4,
1146181614Skmacy		0xcd41, 0x3c24,
1147181614Skmacy		0xcd42, 0x6724,
1148181614Skmacy		0xcd43, 0x1002,
1149181614Skmacy		0xcd44, 0x2807,
1150181614Skmacy		0xcd45, 0x3187,
1151181614Skmacy		0xcd46, 0x20c4,
1152181614Skmacy		0xcd47, 0x3c24,
1153181614Skmacy		0xcd48, 0x6724,
1154181614Skmacy		0xcd49, 0x1002,
1155181614Skmacy		0xcd4a, 0x2514,
1156181614Skmacy		0xcd4b, 0x3c64,
1157181614Skmacy		0xcd4c, 0x6436,
1158181614Skmacy		0xcd4d, 0xdff4,
1159181614Skmacy		0xcd4e, 0x6436,
1160181614Skmacy		0xcd4f, 0x1002,
1161181614Skmacy		0xcd50, 0x2806,
1162181614Skmacy		0xcd51, 0x3cb6,
1163181614Skmacy		0xcd52, 0xc161,
1164181614Skmacy		0xcd53, 0x6134,
1165181614Skmacy		0xcd54, 0x6135,
1166181614Skmacy		0xcd55, 0x5443,
1167181614Skmacy		0xcd56, 0x303,
1168181614Skmacy		0xcd57, 0x6524,
1169181614Skmacy		0xcd58, 0x00b,
1170181614Skmacy		0xcd59, 0x1002,
1171181614Skmacy		0xcd5a, 0xd019,
1172181614Skmacy		0xcd5b, 0x2104,
1173181614Skmacy		0xcd5c, 0x3c24,
1174181614Skmacy		0xcd5d, 0x2105,
1175181614Skmacy		0xcd5e, 0x3805,
1176181614Skmacy		0xcd5f, 0x6524,
1177181614Skmacy		0xcd60, 0xdff4,
1178181614Skmacy		0xcd61, 0x4005,
1179181614Skmacy		0xcd62, 0x6524,
1180181614Skmacy		0xcd63, 0x2e8d,
1181181614Skmacy		0xcd64, 0x303d,
1182181614Skmacy		0xcd65, 0x5dd3,
1183181614Skmacy		0xcd66, 0x306,
1184181614Skmacy		0xcd67, 0x2ff7,
1185181614Skmacy		0xcd68, 0x38f7,
1186181614Skmacy		0xcd69, 0x60b7,
1187181614Skmacy		0xcd6a, 0xdffd,
1188181614Skmacy		0xcd6b, 0x00a,
1189181614Skmacy		0xcd6c, 0x1002,
1190181614Skmacy		0xcd6d, 0
1191181614Skmacy	};
1192181614Skmacy	int i, err;
1193181614Skmacy
1194181614Skmacy	err = set_phy_regs(phy, regs);
1195181614Skmacy	if (!err && modtype == phy_modtype_twinax_long)
1196181614Skmacy		err = set_phy_regs(phy, preemphasis);
1197181614Skmacy	if (err)
1198181614Skmacy		return err;
1199181614Skmacy
1200181614Skmacy	msleep(50);
1201181614Skmacy
1202181614Skmacy	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
1203181614Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
1204181614Skmacy				 twinax_edc[i + 1]);
1205181614Skmacy	if (!err)
1206181614Skmacy		phy->priv = edc_twinax;
1207181614Skmacy	return err;
1208181614Skmacy}
1209181614Skmacy
1210197791Snpstatic int ael2005_get_module_type(struct cphy *phy, int delay_ms)
1211181614Skmacy{
1212189643Sgnn	int v;
1213197791Snp	unsigned int stat;
1214181614Skmacy
1215197791Snp	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
1216197791Snp	if (v)
1217197791Snp		return v;
1218181614Skmacy
1219197791Snp	if (stat & (1 << 8))			/* module absent */
1220197791Snp		return phy_modtype_none;
1221181614Skmacy
1222197791Snp	return ael2xxx_get_module_type(phy, delay_ms);
1223181614Skmacy}
1224181614Skmacy
1225181614Skmacystatic int ael2005_intr_enable(struct cphy *phy)
1226181614Skmacy{
1227181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
1228181614Skmacy	return err ? err : t3_phy_lasi_intr_enable(phy);
1229181614Skmacy}
1230181614Skmacy
1231181614Skmacystatic int ael2005_intr_disable(struct cphy *phy)
1232181614Skmacy{
1233181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
1234181614Skmacy	return err ? err : t3_phy_lasi_intr_disable(phy);
1235181614Skmacy}
1236181614Skmacy
1237181614Skmacystatic int ael2005_intr_clear(struct cphy *phy)
1238181614Skmacy{
1239181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
1240181614Skmacy	return err ? err : t3_phy_lasi_intr_clear(phy);
1241181614Skmacy}
1242181614Skmacy
1243180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
1244180583Skmacy{
1245180583Skmacy	static struct reg_val regs0[] = {
1246180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
1247180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
1248180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
1249180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1250180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
1251180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1252180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
1253180583Skmacy		{ 0, 0, 0, 0 }
1254180583Skmacy	};
1255180583Skmacy	static struct reg_val regs1[] = {
1256180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
1257180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
1258180583Skmacy		{ 0, 0, 0, 0 }
1259180583Skmacy	};
1260180583Skmacy
1261197791Snp	int err;
1262197791Snp	unsigned int lasi_ctrl;
1263180583Skmacy
1264181614Skmacy	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
1265181614Skmacy	if (err)
1266181614Skmacy		return err;
1267181614Skmacy
1268180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
1269180583Skmacy	if (err)
1270180583Skmacy		return err;
1271180583Skmacy
1272180583Skmacy	msleep(125);
1273181614Skmacy	phy->priv = edc_none;
1274180583Skmacy	err = set_phy_regs(phy, regs0);
1275180583Skmacy	if (err)
1276180583Skmacy		return err;
1277180583Skmacy
1278180583Skmacy	msleep(50);
1279181614Skmacy
1280186282Sgnn	err = ael2005_get_module_type(phy, 0);
1281181614Skmacy	if (err < 0)
1282181614Skmacy		return err;
1283181614Skmacy	phy->modtype = (u8)err;
1284181614Skmacy
1285199238Snp	if (err == phy_modtype_none)
1286192540Sgnn		err = 0;
1287192540Sgnn	else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
1288181614Skmacy		err = ael2005_setup_twinax_edc(phy, err);
1289181614Skmacy	else
1290181614Skmacy		err = ael2005_setup_sr_edc(phy);
1291180583Skmacy	if (err)
1292180583Skmacy		return err;
1293180583Skmacy
1294181614Skmacy	err = set_phy_regs(phy, regs1);
1295180583Skmacy	if (err)
1296180583Skmacy		return err;
1297180583Skmacy
1298181614Skmacy	/* reset wipes out interrupts, reenable them if they were on */
1299181614Skmacy	if (lasi_ctrl & 1)
1300181614Skmacy		err = ael2005_intr_enable(phy);
1301181614Skmacy	return err;
1302180583Skmacy}
1303180583Skmacy
1304181614Skmacystatic int ael2005_intr_handler(struct cphy *phy)
1305181614Skmacy{
1306181614Skmacy	unsigned int stat;
1307181614Skmacy	int ret, edc_needed, cause = 0;
1308181614Skmacy
1309181614Skmacy	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
1310181614Skmacy	if (ret)
1311181614Skmacy		return ret;
1312181614Skmacy
1313181614Skmacy	if (stat & AEL2005_MODDET_IRQ) {
1314181614Skmacy		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
1315181614Skmacy				 0xd00);
1316181614Skmacy		if (ret)
1317181614Skmacy			return ret;
1318181614Skmacy
1319181614Skmacy		/* modules have max 300 ms init time after hot plug */
1320186282Sgnn		ret = ael2005_get_module_type(phy, 300);
1321181614Skmacy		if (ret < 0)
1322181614Skmacy			return ret;
1323181614Skmacy
1324181614Skmacy		phy->modtype = (u8)ret;
1325181614Skmacy		if (ret == phy_modtype_none)
1326181614Skmacy			edc_needed = phy->priv;       /* on unplug retain EDC */
1327181614Skmacy		else if (ret == phy_modtype_twinax ||
1328181614Skmacy			 ret == phy_modtype_twinax_long)
1329181614Skmacy			edc_needed = edc_twinax;
1330181614Skmacy		else
1331181614Skmacy			edc_needed = edc_sr;
1332181614Skmacy
1333181614Skmacy		if (edc_needed != phy->priv) {
1334181614Skmacy			ret = ael2005_reset(phy, 0);
1335181614Skmacy			return ret ? ret : cphy_cause_module_change;
1336181614Skmacy		}
1337181614Skmacy		cause = cphy_cause_module_change;
1338181614Skmacy	}
1339181614Skmacy
1340181614Skmacy	ret = t3_phy_lasi_intr_handler(phy);
1341189643Sgnn	if (ret < 0)
1342189643Sgnn		return ret;
1343189643Sgnn
1344189643Sgnn	ret |= cause;
1345189643Sgnn	if (!ret)
1346189643Sgnn		ret |= cphy_cause_link_change;
1347189643Sgnn	return ret;
1348181614Skmacy}
1349181614Skmacy
1350197791Snpstatic struct cphy_ops ael2005_ops = {
1351167514Skmacy#ifdef C99_NOT_SUPPORTED
1352180583Skmacy	ael2005_reset,
1353181614Skmacy	ael2005_intr_enable,
1354181614Skmacy	ael2005_intr_disable,
1355181614Skmacy	ael2005_intr_clear,
1356181614Skmacy	ael2005_intr_handler,
1357180583Skmacy	NULL,
1358180583Skmacy	NULL,
1359180583Skmacy	NULL,
1360180583Skmacy	NULL,
1361180583Skmacy	NULL,
1362181614Skmacy	get_link_status_r,
1363180583Skmacy	ael1002_power_down,
1364180583Skmacy#else
1365180583Skmacy	.reset           = ael2005_reset,
1366181614Skmacy	.intr_enable     = ael2005_intr_enable,
1367181614Skmacy	.intr_disable    = ael2005_intr_disable,
1368181614Skmacy	.intr_clear      = ael2005_intr_clear,
1369181614Skmacy	.intr_handler    = ael2005_intr_handler,
1370181614Skmacy	.get_link_status = get_link_status_r,
1371180583Skmacy	.power_down      = ael1002_power_down,
1372197791Snp#endif
1373180583Skmacy};
1374180583Skmacy
1375197791Snpint t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr,
1376180583Skmacy			const struct mdio_ops *mdio_ops)
1377180583Skmacy{
1378186282Sgnn	int err;
1379197791Snp	struct cphy *phy = &pinfo->phy;
1380197791Snp
1381197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2005_ops, mdio_ops,
1382181614Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
1383181614Skmacy		  SUPPORTED_IRQ, "10GBASE-R");
1384180583Skmacy	msleep(125);
1385189643Sgnn	ael_laser_down(phy, 0);
1386186282Sgnn
1387186282Sgnn	err = ael2005_get_module_type(phy, 0);
1388186282Sgnn	if (err >= 0)
1389186282Sgnn		phy->modtype = err;
1390186282Sgnn
1391180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
1392180583Skmacy				   1 << 5);
1393180583Skmacy}
1394180583Skmacy
1395181614Skmacy/*
1396197791Snp * Setup EDC and other parameters for operation with an optical module.
1397197791Snp */
1398197791Snpstatic int ael2020_setup_sr_edc(struct cphy *phy)
1399197791Snp{
1400197791Snp	static struct reg_val regs[] = {
1401197791Snp		{ MDIO_DEV_PMA_PMD, 0xcc01, 0xffff, 0x488a },
1402197791Snp
1403197791Snp		{ MDIO_DEV_PMA_PMD, 0xcb1b, 0xffff, 0x0200 },
1404197791Snp		{ MDIO_DEV_PMA_PMD, 0xcb1c, 0xffff, 0x00f0 },
1405197791Snp		{ MDIO_DEV_PMA_PMD, 0xcc06, 0xffff, 0x00e0 },
1406197791Snp
1407197791Snp		/* end */
1408197791Snp		{ 0, 0, 0, 0 }
1409197791Snp	};
1410197791Snp	int err;
1411197791Snp
1412197791Snp	err = set_phy_regs(phy, regs);
1413197791Snp	msleep(50);
1414197791Snp	if (err)
1415197791Snp		return err;
1416197791Snp
1417197791Snp	phy->priv = edc_sr;
1418197791Snp	return 0;
1419197791Snp}
1420197791Snp
1421197791Snp/*
1422197791Snp * Setup EDC and other parameters for operation with an TWINAX module.
1423197791Snp */
1424197791Snpstatic int ael2020_setup_twinax_edc(struct cphy *phy, int modtype)
1425197791Snp{
1426197791Snp	static struct reg_val uCclock40MHz[] = {
1427197791Snp		{ MDIO_DEV_PMA_PMD, 0xff28, 0xffff, 0x4001 },
1428197791Snp		{ MDIO_DEV_PMA_PMD, 0xff2a, 0xffff, 0x0002 },
1429197791Snp		{ 0, 0, 0, 0 }
1430197791Snp	};
1431197791Snp
1432197791Snp	static struct reg_val uCclockActivate[] = {
1433197791Snp		{ MDIO_DEV_PMA_PMD, 0xd000, 0xffff, 0x5200 },
1434197791Snp		{ 0, 0, 0, 0 }
1435197791Snp	};
1436197791Snp
1437197791Snp	static struct reg_val uCactivate[] = {
1438197791Snp		{ MDIO_DEV_PMA_PMD, 0xd080, 0xffff, 0x0100 },
1439197791Snp		{ MDIO_DEV_PMA_PMD, 0xd092, 0xffff, 0x0000 },
1440197791Snp		{ 0, 0, 0, 0 }
1441197791Snp	};
1442197791Snp
1443197791Snp	static u16 twinax_edc[] = {
1444197791Snp		0xd800, 0x4009,
1445197791Snp		0xd801, 0x2fff,
1446197791Snp		0xd802, 0x300f,
1447197791Snp		0xd803, 0x40aa,
1448197791Snp		0xd804, 0x401c,
1449197791Snp		0xd805, 0x401e,
1450205945Snp		0xd806, 0x20c5,
1451205945Snp		0xd807, 0x3c05,
1452205945Snp		0xd808, 0x6536,
1453205945Snp		0xd809, 0x2fe4,
1454205945Snp		0xd80a, 0x3dc4,
1455205945Snp		0xd80b, 0x6624,
1456205945Snp		0xd80c, 0x2ff4,
1457205945Snp		0xd80d, 0x3dc4,
1458205945Snp		0xd80e, 0x2035,
1459205945Snp		0xd80f, 0x30a5,
1460205945Snp		0xd810, 0x6524,
1461205945Snp		0xd811, 0x2ca2,
1462205945Snp		0xd812, 0x3012,
1463197791Snp		0xd813, 0x1002,
1464205945Snp		0xd814, 0x27e2,
1465205945Snp		0xd815, 0x3022,
1466197791Snp		0xd816, 0x1002,
1467205945Snp		0xd817, 0x28d2,
1468197791Snp		0xd818, 0x3022,
1469197791Snp		0xd819, 0x1002,
1470205945Snp		0xd81a, 0x2892,
1471197791Snp		0xd81b, 0x3012,
1472197791Snp		0xd81c, 0x1002,
1473205945Snp		0xd81d, 0x24e2,
1474197791Snp		0xd81e, 0x3022,
1475197791Snp		0xd81f, 0x1002,
1476205945Snp		0xd820, 0x27e2,
1477205945Snp		0xd821, 0x3012,
1478205945Snp		0xd822, 0x1002,
1479205945Snp		0xd823, 0x2422,
1480205945Snp		0xd824, 0x3022,
1481205945Snp		0xd825, 0x1002,
1482205945Snp		0xd826, 0x22cd,
1483205945Snp		0xd827, 0x301d,
1484205945Snp		0xd828, 0x28f2,
1485205945Snp		0xd829, 0x3022,
1486205945Snp		0xd82a, 0x1002,
1487205945Snp		0xd82b, 0x5553,
1488205945Snp		0xd82c, 0x0307,
1489205945Snp		0xd82d, 0x2572,
1490205945Snp		0xd82e, 0x3022,
1491205945Snp		0xd82f, 0x1002,
1492205945Snp		0xd830, 0x21a2,
1493197791Snp		0xd831, 0x3012,
1494197791Snp		0xd832, 0x1002,
1495205945Snp		0xd833, 0x4016,
1496205945Snp		0xd834, 0x5e63,
1497205945Snp		0xd835, 0x0344,
1498205945Snp		0xd836, 0x21a2,
1499205945Snp		0xd837, 0x3012,
1500205945Snp		0xd838, 0x1002,
1501205945Snp		0xd839, 0x400e,
1502205945Snp		0xd83a, 0x2572,
1503197791Snp		0xd83b, 0x3022,
1504197791Snp		0xd83c, 0x1002,
1505205945Snp		0xd83d, 0x2b22,
1506205945Snp		0xd83e, 0x3012,
1507197791Snp		0xd83f, 0x1002,
1508205945Snp		0xd840, 0x2842,
1509205945Snp		0xd841, 0x3022,
1510205945Snp		0xd842, 0x1002,
1511205945Snp		0xd843, 0x26e2,
1512205945Snp		0xd844, 0x3022,
1513205945Snp		0xd845, 0x1002,
1514205945Snp		0xd846, 0x2fa4,
1515205945Snp		0xd847, 0x3dc4,
1516205945Snp		0xd848, 0x6624,
1517205945Snp		0xd849, 0x2e8b,
1518205945Snp		0xd84a, 0x303b,
1519205945Snp		0xd84b, 0x56b3,
1520205945Snp		0xd84c, 0x03c6,
1521205945Snp		0xd84d, 0x866b,
1522205945Snp		0xd84e, 0x400c,
1523205945Snp		0xd84f, 0x2782,
1524205945Snp		0xd850, 0x3012,
1525205945Snp		0xd851, 0x1002,
1526205945Snp		0xd852, 0x2c4b,
1527205945Snp		0xd853, 0x309b,
1528205945Snp		0xd854, 0x56b3,
1529205945Snp		0xd855, 0x03c3,
1530205945Snp		0xd856, 0x866b,
1531205945Snp		0xd857, 0x400c,
1532205945Snp		0xd858, 0x22a2,
1533205945Snp		0xd859, 0x3022,
1534205945Snp		0xd85a, 0x1002,
1535205945Snp		0xd85b, 0x2842,
1536205945Snp		0xd85c, 0x3022,
1537205945Snp		0xd85d, 0x1002,
1538205945Snp		0xd85e, 0x26e2,
1539205945Snp		0xd85f, 0x3022,
1540205945Snp		0xd860, 0x1002,
1541205945Snp		0xd861, 0x2fb4,
1542205945Snp		0xd862, 0x3dc4,
1543205945Snp		0xd863, 0x6624,
1544205945Snp		0xd864, 0x56b3,
1545205945Snp		0xd865, 0x03c3,
1546205945Snp		0xd866, 0x866b,
1547205945Snp		0xd867, 0x401c,
1548205945Snp		0xd868, 0x2c45,
1549205945Snp		0xd869, 0x3095,
1550205945Snp		0xd86a, 0x5b53,
1551205945Snp		0xd86b, 0x23d2,
1552197791Snp		0xd86c, 0x3012,
1553205945Snp		0xd86d, 0x13c2,
1554205945Snp		0xd86e, 0x5cc3,
1555205945Snp		0xd86f, 0x2782,
1556205945Snp		0xd870, 0x3012,
1557205945Snp		0xd871, 0x1312,
1558205945Snp		0xd872, 0x2b22,
1559205945Snp		0xd873, 0x3012,
1560205945Snp		0xd874, 0x1002,
1561205945Snp		0xd875, 0x2842,
1562205945Snp		0xd876, 0x3022,
1563205945Snp		0xd877, 0x1002,
1564205945Snp		0xd878, 0x2622,
1565205945Snp		0xd879, 0x3022,
1566205945Snp		0xd87a, 0x1002,
1567205945Snp		0xd87b, 0x21a2,
1568205945Snp		0xd87c, 0x3012,
1569205945Snp		0xd87d, 0x1002,
1570205945Snp		0xd87e, 0x628f,
1571205945Snp		0xd87f, 0x2985,
1572205945Snp		0xd880, 0x33a5,
1573205945Snp		0xd881, 0x26e2,
1574205945Snp		0xd882, 0x3022,
1575205945Snp		0xd883, 0x1002,
1576205945Snp		0xd884, 0x5653,
1577205945Snp		0xd885, 0x03d2,
1578205945Snp		0xd886, 0x401e,
1579205945Snp		0xd887, 0x6f72,
1580205945Snp		0xd888, 0x1002,
1581205945Snp		0xd889, 0x628f,
1582205945Snp		0xd88a, 0x2304,
1583205945Snp		0xd88b, 0x3c84,
1584205945Snp		0xd88c, 0x6436,
1585205945Snp		0xd88d, 0xdff4,
1586205945Snp		0xd88e, 0x6436,
1587205945Snp		0xd88f, 0x2ff5,
1588205945Snp		0xd890, 0x3005,
1589205945Snp		0xd891, 0x8656,
1590205945Snp		0xd892, 0xdfba,
1591205945Snp		0xd893, 0x56a3,
1592205945Snp		0xd894, 0xd05a,
1593205945Snp		0xd895, 0x29e2,
1594205945Snp		0xd896, 0x3012,
1595205945Snp		0xd897, 0x1392,
1596205945Snp		0xd898, 0xd05a,
1597205945Snp		0xd899, 0x56a3,
1598205945Snp		0xd89a, 0xdfba,
1599205945Snp		0xd89b, 0x0383,
1600205945Snp		0xd89c, 0x6f72,
1601205945Snp		0xd89d, 0x1002,
1602205945Snp		0xd89e, 0x2a64,
1603205945Snp		0xd89f, 0x3014,
1604205945Snp		0xd8a0, 0x2005,
1605205945Snp		0xd8a1, 0x3d75,
1606205945Snp		0xd8a2, 0xc451,
1607205945Snp		0xd8a3, 0x29a2,
1608205945Snp		0xd8a4, 0x3022,
1609205945Snp		0xd8a5, 0x1002,
1610205945Snp		0xd8a6, 0x178c,
1611205945Snp		0xd8a7, 0x1898,
1612205945Snp		0xd8a8, 0x19a4,
1613205945Snp		0xd8a9, 0x1ab0,
1614205945Snp		0xd8aa, 0x1bbc,
1615205945Snp		0xd8ab, 0x1cc8,
1616205945Snp		0xd8ac, 0x1dd3,
1617205945Snp		0xd8ad, 0x1ede,
1618205945Snp		0xd8ae, 0x1fe9,
1619205945Snp		0xd8af, 0x20f4,
1620205945Snp		0xd8b0, 0x21ff,
1621205945Snp		0xd8b1, 0x0000,
1622205945Snp		0xd8b2, 0x2741,
1623205945Snp		0xd8b3, 0x3021,
1624205945Snp		0xd8b4, 0x1001,
1625205945Snp		0xd8b5, 0xc620,
1626205945Snp		0xd8b6, 0x0000,
1627205945Snp		0xd8b7, 0xc621,
1628205945Snp		0xd8b8, 0x0000,
1629205945Snp		0xd8b9, 0xc622,
1630205945Snp		0xd8ba, 0x00e2,
1631205945Snp		0xd8bb, 0xc623,
1632205945Snp		0xd8bc, 0x007f,
1633205945Snp		0xd8bd, 0xc624,
1634205945Snp		0xd8be, 0x00ce,
1635205945Snp		0xd8bf, 0xc625,
1636205945Snp		0xd8c0, 0x0000,
1637205945Snp		0xd8c1, 0xc627,
1638205945Snp		0xd8c2, 0x0000,
1639205945Snp		0xd8c3, 0xc628,
1640205945Snp		0xd8c4, 0x0000,
1641205945Snp		0xd8c5, 0xc90a,
1642205945Snp		0xd8c6, 0x3a7c,
1643205945Snp		0xd8c7, 0xc62c,
1644205945Snp		0xd8c8, 0x0000,
1645197791Snp		0xd8c9, 0x0000,
1646205945Snp		0xd8ca, 0x2741,
1647205945Snp		0xd8cb, 0x3021,
1648205945Snp		0xd8cc, 0x1001,
1649205945Snp		0xd8cd, 0xc502,
1650205945Snp		0xd8ce, 0x53ac,
1651205945Snp		0xd8cf, 0xc503,
1652205945Snp		0xd8d0, 0x2cd3,
1653205945Snp		0xd8d1, 0xc600,
1654205945Snp		0xd8d2, 0x2a6e,
1655205945Snp		0xd8d3, 0xc601,
1656205945Snp		0xd8d4, 0x2a2c,
1657205945Snp		0xd8d5, 0xc605,
1658205945Snp		0xd8d6, 0x5557,
1659205945Snp		0xd8d7, 0xc60c,
1660205945Snp		0xd8d8, 0x5400,
1661205945Snp		0xd8d9, 0xc710,
1662205945Snp		0xd8da, 0x0700,
1663205945Snp		0xd8db, 0xc711,
1664205945Snp		0xd8dc, 0x0f06,
1665205945Snp		0xd8dd, 0xc718,
1666205945Snp		0xd8de, 0x700,
1667205945Snp		0xd8df, 0xc719,
1668205945Snp		0xd8e0, 0x0f06,
1669205945Snp		0xd8e1, 0xc720,
1670205945Snp		0xd8e2, 0x4700,
1671205945Snp		0xd8e3, 0xc721,
1672205945Snp		0xd8e4, 0x0f06,
1673205945Snp		0xd8e5, 0xc728,
1674205945Snp		0xd8e6, 0x0700,
1675205945Snp		0xd8e7, 0xc729,
1676205945Snp		0xd8e8, 0x1207,
1677205945Snp		0xd8e9, 0xc801,
1678205945Snp		0xd8ea, 0x7f50,
1679205945Snp		0xd8eb, 0xc802,
1680205945Snp		0xd8ec, 0x7760,
1681205945Snp		0xd8ed, 0xc803,
1682205945Snp		0xd8ee, 0x7fce,
1683205945Snp		0xd8ef, 0xc804,
1684205945Snp		0xd8f0, 0x520e,
1685205945Snp		0xd8f1, 0xc805,
1686205945Snp		0xd8f2, 0x5c11,
1687205945Snp		0xd8f3, 0xc806,
1688205945Snp		0xd8f4, 0x3c51,
1689205945Snp		0xd8f5, 0xc807,
1690205945Snp		0xd8f6, 0x4061,
1691205945Snp		0xd8f7, 0xc808,
1692205945Snp		0xd8f8, 0x49c1,
1693205945Snp		0xd8f9, 0xc809,
1694205945Snp		0xd8fa, 0x3840,
1695205945Snp		0xd8fb, 0xc80a,
1696205945Snp		0xd8fc, 0x0000,
1697205945Snp		0xd8fd, 0xc821,
1698205945Snp		0xd8fe, 0x0002,
1699205945Snp		0xd8ff, 0xc822,
1700205945Snp		0xd900, 0x0046,
1701205945Snp		0xd901, 0xc844,
1702205945Snp		0xd902, 0x182f,
1703205945Snp		0xd903, 0xc849,
1704205945Snp		0xd904, 0x0400,
1705205945Snp		0xd905, 0xc84a,
1706205945Snp		0xd906, 0x0002,
1707205945Snp		0xd907, 0xc013,
1708205945Snp		0xd908, 0xf341,
1709205945Snp		0xd909, 0xc084,
1710205945Snp		0xd90a, 0x0030,
1711205945Snp		0xd90b, 0xc904,
1712205945Snp		0xd90c, 0x1401,
1713205945Snp		0xd90d, 0xcb0c,
1714205945Snp		0xd90e, 0x0004,
1715205945Snp		0xd90f, 0xcb0e,
1716205945Snp		0xd910, 0xa00a,
1717205945Snp		0xd911, 0xcb0f,
1718205945Snp		0xd912, 0xc0c0,
1719205945Snp		0xd913, 0xcb10,
1720205945Snp		0xd914, 0xc0c0,
1721205945Snp		0xd915, 0xcb11,
1722205945Snp		0xd916, 0x00a0,
1723205945Snp		0xd917, 0xcb12,
1724205945Snp		0xd918, 0x0007,
1725205945Snp		0xd919, 0xc241,
1726205945Snp		0xd91a, 0xa000,
1727205945Snp		0xd91b, 0xc243,
1728205945Snp		0xd91c, 0x7fe0,
1729205945Snp		0xd91d, 0xc604,
1730205945Snp		0xd91e, 0x000e,
1731205945Snp		0xd91f, 0xc609,
1732205945Snp		0xd920, 0x00f5,
1733205945Snp		0xd921, 0xc611,
1734205945Snp		0xd922, 0x000e,
1735205945Snp		0xd923, 0xc660,
1736205945Snp		0xd924, 0x9600,
1737205945Snp		0xd925, 0xc687,
1738205945Snp		0xd926, 0x0004,
1739205945Snp		0xd927, 0xc60a,
1740205945Snp		0xd928, 0x04f5,
1741205945Snp		0xd929, 0x0000,
1742205945Snp		0xd92a, 0x2741,
1743205945Snp		0xd92b, 0x3021,
1744205945Snp		0xd92c, 0x1001,
1745205945Snp		0xd92d, 0xc620,
1746205945Snp		0xd92e, 0x14e5,
1747205945Snp		0xd92f, 0xc621,
1748205945Snp		0xd930, 0xc53d,
1749205945Snp		0xd931, 0xc622,
1750205945Snp		0xd932, 0x3cbe,
1751205945Snp		0xd933, 0xc623,
1752205945Snp		0xd934, 0x4452,
1753205945Snp		0xd935, 0xc624,
1754205945Snp		0xd936, 0xc5c5,
1755205945Snp		0xd937, 0xc625,
1756205945Snp		0xd938, 0xe01e,
1757205945Snp		0xd939, 0xc627,
1758205945Snp		0xd93a, 0x0000,
1759205945Snp		0xd93b, 0xc628,
1760197791Snp		0xd93c, 0x0000,
1761205945Snp		0xd93d, 0xc62c,
1762205945Snp		0xd93e, 0x0000,
1763205945Snp		0xd93f, 0xc90a,
1764205945Snp		0xd940, 0x3a7c,
1765205945Snp		0xd941, 0x0000,
1766205945Snp		0xd942, 0x2b84,
1767205945Snp		0xd943, 0x3c74,
1768205945Snp		0xd944, 0x6435,
1769205945Snp		0xd945, 0xdff4,
1770205945Snp		0xd946, 0x6435,
1771205945Snp		0xd947, 0x2806,
1772205945Snp		0xd948, 0x3006,
1773205945Snp		0xd949, 0x8565,
1774205945Snp		0xd94a, 0x2b24,
1775205945Snp		0xd94b, 0x3c24,
1776205945Snp		0xd94c, 0x6436,
1777205945Snp		0xd94d, 0x1002,
1778205945Snp		0xd94e, 0x2b24,
1779205945Snp		0xd94f, 0x3c24,
1780205945Snp		0xd950, 0x6436,
1781205945Snp		0xd951, 0x4045,
1782205945Snp		0xd952, 0x8656,
1783205945Snp		0xd953, 0x5663,
1784205945Snp		0xd954, 0x0302,
1785205945Snp		0xd955, 0x401e,
1786205945Snp		0xd956, 0x1002,
1787205945Snp		0xd957, 0x2807,
1788205945Snp		0xd958, 0x31a7,
1789205945Snp		0xd959, 0x20c4,
1790205945Snp		0xd95a, 0x3c24,
1791205945Snp		0xd95b, 0x6724,
1792205945Snp		0xd95c, 0x2ff7,
1793205945Snp		0xd95d, 0x30f7,
1794205945Snp		0xd95e, 0x20c4,
1795205945Snp		0xd95f, 0x3c04,
1796205945Snp		0xd960, 0x6724,
1797205945Snp		0xd961, 0x1002,
1798205945Snp		0xd962, 0x2807,
1799205945Snp		0xd963, 0x3187,
1800205945Snp		0xd964, 0x20c4,
1801205945Snp		0xd965, 0x3c24,
1802205945Snp		0xd966, 0x6724,
1803205945Snp		0xd967, 0x2fe4,
1804205945Snp		0xd968, 0x3dc4,
1805205945Snp		0xd969, 0x6437,
1806205945Snp		0xd96a, 0x20c4,
1807205945Snp		0xd96b, 0x3c04,
1808205945Snp		0xd96c, 0x6724,
1809197791Snp		0xd96d, 0x1002,
1810205945Snp		0xd96e, 0x24f4,
1811205945Snp		0xd96f, 0x3c64,
1812205945Snp		0xd970, 0x6436,
1813205945Snp		0xd971, 0xdff4,
1814205945Snp		0xd972, 0x6436,
1815197791Snp		0xd973, 0x1002,
1816205945Snp		0xd974, 0x2006,
1817205945Snp		0xd975, 0x3d76,
1818205945Snp		0xd976, 0xc161,
1819205945Snp		0xd977, 0x6134,
1820205945Snp		0xd978, 0x6135,
1821205945Snp		0xd979, 0x5443,
1822205945Snp		0xd97a, 0x0303,
1823205945Snp		0xd97b, 0x6524,
1824205945Snp		0xd97c, 0x00fb,
1825205945Snp		0xd97d, 0x1002,
1826205945Snp		0xd97e, 0x20d4,
1827205945Snp		0xd97f, 0x3c24,
1828205945Snp		0xd980, 0x2025,
1829205945Snp		0xd981, 0x3005,
1830205945Snp		0xd982, 0x6524,
1831205945Snp		0xd983, 0x1002,
1832205945Snp		0xd984, 0xd019,
1833205945Snp		0xd985, 0x2104,
1834205945Snp		0xd986, 0x3c24,
1835205945Snp		0xd987, 0x2105,
1836205945Snp		0xd988, 0x3805,
1837205945Snp		0xd989, 0x6524,
1838205945Snp		0xd98a, 0xdff4,
1839205945Snp		0xd98b, 0x4005,
1840205945Snp		0xd98c, 0x6524,
1841205945Snp		0xd98d, 0x2e8d,
1842205945Snp		0xd98e, 0x303d,
1843205945Snp		0xd98f, 0x2408,
1844205945Snp		0xd990, 0x35d8,
1845205945Snp		0xd991, 0x5dd3,
1846205945Snp		0xd992, 0x0307,
1847205945Snp		0xd993, 0x8887,
1848205945Snp		0xd994, 0x63a7,
1849205945Snp		0xd995, 0x8887,
1850205945Snp		0xd996, 0x63a7,
1851205945Snp		0xd997, 0xdffd,
1852205945Snp		0xd998, 0x00f9,
1853205945Snp		0xd999, 0x1002,
1854205945Snp		0xd99a, 0x866a,
1855205945Snp		0xd99b, 0x6138,
1856205945Snp		0xd99c, 0x5883,
1857205945Snp		0xd99d, 0x2aa2,
1858205945Snp		0xd99e, 0x3022,
1859205945Snp		0xd99f, 0x1302,
1860205945Snp		0xd9a0, 0x2ff7,
1861205945Snp		0xd9a1, 0x3007,
1862205945Snp		0xd9a2, 0x8785,
1863205945Snp		0xd9a3, 0xb887,
1864205945Snp		0xd9a4, 0x8786,
1865205945Snp		0xd9a5, 0xb8c6,
1866205945Snp		0xd9a6, 0x5a53,
1867205945Snp		0xd9a7, 0x29b2,
1868205945Snp		0xd9a8, 0x3022,
1869205945Snp		0xd9a9, 0x13c2,
1870205945Snp		0xd9aa, 0x2474,
1871205945Snp		0xd9ab, 0x3c84,
1872205945Snp		0xd9ac, 0x64d7,
1873205945Snp		0xd9ad, 0x64d7,
1874205945Snp		0xd9ae, 0x2ff5,
1875205945Snp		0xd9af, 0x3c05,
1876205945Snp		0xd9b0, 0x8757,
1877205945Snp		0xd9b1, 0xb886,
1878205945Snp		0xd9b2, 0x9767,
1879205945Snp		0xd9b3, 0x67c4,
1880205945Snp		0xd9b4, 0x6f72,
1881205945Snp		0xd9b5, 0x1002,
1882205945Snp		0xd9b6, 0x0000,
1883197791Snp	};
1884197791Snp	int i, err;
1885197791Snp
1886197791Snp	/* set uC clock and activate it */
1887197791Snp	err = set_phy_regs(phy, uCclock40MHz);
1888197791Snp	msleep(500);
1889197791Snp	if (err)
1890197791Snp		return err;
1891197791Snp	err = set_phy_regs(phy, uCclockActivate);
1892197791Snp	msleep(500);
1893197791Snp	if (err)
1894197791Snp		return err;
1895197791Snp
1896197791Snp	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
1897197791Snp		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
1898197791Snp				 twinax_edc[i + 1]);
1899197791Snp	/* activate uC */
1900197791Snp	err = set_phy_regs(phy, uCactivate);
1901197791Snp	if (!err)
1902197791Snp		phy->priv = edc_twinax;
1903197791Snp	return err;
1904197791Snp}
1905197791Snp
1906197791Snp/*
1907197791Snp * Return Module Type.
1908197791Snp */
1909197791Snpstatic int ael2020_get_module_type(struct cphy *phy, int delay_ms)
1910197791Snp{
1911197791Snp	int v;
1912197791Snp	unsigned int stat;
1913197791Snp
1914197791Snp	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_STAT, &stat);
1915197791Snp	if (v)
1916197791Snp		return v;
1917197791Snp
1918197791Snp	if (stat & (0x1 << (AEL2020_GPIO_MODDET*4))) {
1919197791Snp		/* module absent */
1920197791Snp		return phy_modtype_none;
1921197791Snp	}
1922197791Snp
1923197791Snp	return ael2xxx_get_module_type(phy, delay_ms);
1924197791Snp}
1925197791Snp
1926197791Snp/*
1927197791Snp * Enable PHY interrupts.  We enable "Module Detection" interrupts (on any
1928197791Snp * state transition) and then generic Link Alarm Status Interrupt (LASI).
1929197791Snp */
1930197791Snpstatic int ael2020_intr_enable(struct cphy *phy)
1931197791Snp{
1932197791Snp	struct reg_val regs[] = {
1933197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CFG+AEL2020_GPIO_LSTAT,
1934197791Snp			0xffff, 0x4 },
1935197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1936197791Snp			0xffff, 0x8 << (AEL2020_GPIO_LSTAT*4) },
1937197791Snp
1938197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1939197791Snp			0xffff, 0x2 << (AEL2020_GPIO_MODDET*4) },
1940197791Snp
1941197791Snp		/* end */
1942197791Snp		{ 0, 0, 0, 0 }
1943197791Snp	};
1944197791Snp	int err;
1945197791Snp
1946197791Snp	err = set_phy_regs(phy, regs);
1947197791Snp	if (err)
1948197791Snp		return err;
1949197791Snp
1950197791Snp	phy->caps |= POLL_LINK_1ST_TIME;
1951197791Snp
1952197791Snp	/* enable standard Link Alarm Status Interrupts */
1953197791Snp	err = t3_phy_lasi_intr_enable(phy);
1954197791Snp	if (err)
1955197791Snp		return err;
1956197791Snp
1957197791Snp	return 0;
1958197791Snp}
1959197791Snp
1960197791Snp/*
1961197791Snp * Disable PHY interrupts.  The mirror of the above ...
1962197791Snp */
1963197791Snpstatic int ael2020_intr_disable(struct cphy *phy)
1964197791Snp{
1965197791Snp	struct reg_val regs[] = {
1966197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1967197791Snp			0xffff, 0xb << (AEL2020_GPIO_LSTAT*4) },
1968197791Snp
1969197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1970197791Snp			0xffff, 0x1 << (AEL2020_GPIO_MODDET*4) },
1971197791Snp
1972197791Snp		/* end */
1973197791Snp		{ 0, 0, 0, 0 }
1974197791Snp	};
1975197791Snp	int err;
1976197791Snp
1977197791Snp	err = set_phy_regs(phy, regs);
1978197791Snp	if (err)
1979197791Snp		return err;
1980197791Snp
1981197791Snp	/* disable standard Link Alarm Status Interrupts */
1982197791Snp	return t3_phy_lasi_intr_disable(phy);
1983197791Snp}
1984197791Snp
1985197791Snp/*
1986197791Snp * Clear PHY interrupt state.
1987197791Snp */
1988197791Snpstatic int ael2020_intr_clear(struct cphy *phy)
1989197791Snp{
1990197791Snp	unsigned int stat;
1991197791Snp	int err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat);
1992197791Snp	return err ? err : t3_phy_lasi_intr_clear(phy);
1993197791Snp}
1994197791Snp
1995197791Snp/*
1996197791Snp * Common register settings for the AEL2020 when it comes out of reset.
1997197791Snp */
1998197791Snpstatic struct reg_val ael2020_reset_regs[] = {
1999197791Snp	{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x3101 },
2000197791Snp
2001197791Snp	{ MDIO_DEV_PMA_PMD, 0xcd40, 0xffff, 0x0001 },
2002197791Snp
2003205945Snp	{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0x0100 },
2004205945Snp	{ MDIO_DEV_PMA_PMD, 0xca22, 0xffff, 0x0100 },
2005205945Snp	{ MDIO_DEV_PMA_PMD, 0xca42, 0xffff, 0x0100 },
2006197791Snp	{ MDIO_DEV_PMA_PMD, 0xff02, 0xffff, 0x0023 },
2007197791Snp	{ MDIO_DEV_PMA_PMD, 0xff03, 0xffff, 0x0000 },
2008197791Snp	{ MDIO_DEV_PMA_PMD, 0xff04, 0xffff, 0x0000 },
2009197791Snp
2010205945Snp	{ MDIO_DEV_PMA_PMD, 0xc20d, 0xffff, 0x0002 },
2011197791Snp	/* end */
2012197791Snp	{ 0, 0, 0, 0 }
2013197791Snp};
2014197791Snp
2015197791Snp/*
2016197791Snp * Reset the PHY and put it into a canonical operating state.
2017197791Snp */
2018197791Snpstatic int ael2020_reset(struct cphy *phy, int wait)
2019197791Snp{
2020197791Snp	int err;
2021197791Snp	unsigned int lasi_ctrl;
2022197791Snp
2023197791Snp	/* grab current interrupt state */
2024197791Snp	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
2025197791Snp	if (err)
2026197791Snp		return err;
2027197791Snp
2028197791Snp	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 125);
2029197791Snp	if (err)
2030197791Snp		return err;
2031197791Snp	msleep(100);
2032197791Snp
2033197791Snp	/* basic initialization for all module types */
2034197791Snp	phy->priv = edc_none;
2035197791Snp	err = set_phy_regs(phy, ael2020_reset_regs);
2036197791Snp	if (err)
2037197791Snp		return err;
2038205945Snp	msleep(100);
2039197791Snp
2040197791Snp	/* determine module type and perform appropriate initialization */
2041197791Snp	err = ael2020_get_module_type(phy, 0);
2042197791Snp	if (err < 0)
2043197791Snp		return err;
2044197791Snp	phy->modtype = (u8)err;
2045199238Snp	if (err == phy_modtype_none)
2046197791Snp		err = 0;
2047197791Snp	else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
2048197791Snp		err = ael2020_setup_twinax_edc(phy, err);
2049197791Snp	else
2050197791Snp		err = ael2020_setup_sr_edc(phy);
2051197791Snp	if (err)
2052197791Snp		return err;
2053197791Snp
2054197791Snp	/* reset wipes out interrupts, reenable them if they were on */
2055197791Snp	if (lasi_ctrl & 1)
2056197791Snp		err = ael2020_intr_enable(phy);
2057197791Snp	return err;
2058197791Snp}
2059197791Snp
2060197791Snp/*
2061197791Snp * Handle a PHY interrupt.
2062197791Snp */
2063197791Snpstatic int ael2020_intr_handler(struct cphy *phy)
2064197791Snp{
2065197791Snp	unsigned int stat;
2066197791Snp	int ret, edc_needed, cause = 0;
2067197791Snp
2068197791Snp	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat);
2069197791Snp	if (ret)
2070197791Snp		return ret;
2071197791Snp
2072197791Snp	if (stat & (0x1 << AEL2020_GPIO_MODDET)) {
2073197791Snp		/* modules have max 300 ms init time after hot plug */
2074197791Snp		ret = ael2020_get_module_type(phy, 300);
2075197791Snp		if (ret < 0)
2076197791Snp			return ret;
2077197791Snp
2078197791Snp		phy->modtype = (u8)ret;
2079197791Snp		if (ret == phy_modtype_none)
2080197791Snp			edc_needed = phy->priv;       /* on unplug retain EDC */
2081197791Snp		else if (ret == phy_modtype_twinax ||
2082197791Snp			 ret == phy_modtype_twinax_long)
2083197791Snp			edc_needed = edc_twinax;
2084197791Snp		else
2085197791Snp			edc_needed = edc_sr;
2086197791Snp
2087197791Snp		if (edc_needed != phy->priv) {
2088197791Snp			ret = ael2020_reset(phy, 0);
2089197791Snp			return ret ? ret : cphy_cause_module_change;
2090197791Snp		}
2091197791Snp		cause = cphy_cause_module_change;
2092197791Snp	}
2093197791Snp
2094197791Snp	ret = t3_phy_lasi_intr_handler(phy);
2095197791Snp	if (ret < 0)
2096197791Snp		return ret;
2097197791Snp
2098197791Snp	ret |= cause;
2099197791Snp	if (!ret)
2100197791Snp		ret |= cphy_cause_link_change;
2101197791Snp	return ret;
2102197791Snp}
2103197791Snp
2104197791Snpstatic struct cphy_ops ael2020_ops = {
2105197791Snp#ifdef C99_NOT_SUPPORTED
2106197791Snp	ael2020_reset,
2107197791Snp	ael2020_intr_enable,
2108197791Snp	ael2020_intr_disable,
2109197791Snp	ael2020_intr_clear,
2110197791Snp	ael2020_intr_handler,
2111197791Snp	NULL,
2112197791Snp	NULL,
2113197791Snp	NULL,
2114197791Snp	NULL,
2115197791Snp	NULL,
2116197791Snp	get_link_status_r,
2117197791Snp	ael1002_power_down,
2118197791Snp#else
2119197791Snp	.reset           = ael2020_reset,
2120197791Snp	.intr_enable     = ael2020_intr_enable,
2121197791Snp	.intr_disable    = ael2020_intr_disable,
2122197791Snp	.intr_clear      = ael2020_intr_clear,
2123197791Snp	.intr_handler    = ael2020_intr_handler,
2124197791Snp	.get_link_status = get_link_status_r,
2125197791Snp	.power_down      = ael1002_power_down,
2126197791Snp#endif
2127197791Snp};
2128197791Snp
2129197791Snpint t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr,
2130197791Snp			const struct mdio_ops *mdio_ops)
2131197791Snp{
2132197791Snp	int err;
2133197791Snp	struct cphy *phy = &pinfo->phy;
2134197791Snp
2135197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2020_ops, mdio_ops,
2136197791Snp		SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
2137197791Snp		  SUPPORTED_IRQ, "10GBASE-R");
2138197791Snp	msleep(125);
2139197791Snp
2140197791Snp	err = set_phy_regs(phy, ael2020_reset_regs);
2141197791Snp	if (err)
2142197791Snp		return err;
2143205945Snp	msleep(100);
2144205945Snp
2145197791Snp	err = ael2020_get_module_type(phy, 0);
2146197791Snp	if (err >= 0)
2147197791Snp		phy->modtype = err;
2148197791Snp
2149197791Snp	ael_laser_down(phy, 0);
2150197791Snp	return 0;
2151197791Snp}
2152197791Snp
2153197791Snp/*
2154181614Skmacy * Get link status for a 10GBASE-X device.
2155181614Skmacy */
2156181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed,
2157181614Skmacy			     int *duplex, int *fc)
2158181614Skmacy{
2159181614Skmacy	if (link_ok) {
2160181614Skmacy		unsigned int stat0, stat1, stat2;
2161181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
2162181614Skmacy
2163181614Skmacy		if (!err)
2164181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
2165181614Skmacy		if (!err)
2166181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
2167181614Skmacy		if (err)
2168181614Skmacy			return err;
2169181614Skmacy		*link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1;
2170181614Skmacy	}
2171181614Skmacy	if (speed)
2172181614Skmacy		*speed = SPEED_10000;
2173181614Skmacy	if (duplex)
2174181614Skmacy		*duplex = DUPLEX_FULL;
2175181614Skmacy	return 0;
2176181614Skmacy}
2177181614Skmacy
2178180583Skmacy#ifdef C99_NOT_SUPPORTED
2179167514Skmacystatic struct cphy_ops qt2045_ops = {
2180167514Skmacy	ael1006_reset,
2181180583Skmacy	t3_phy_lasi_intr_enable,
2182180583Skmacy	t3_phy_lasi_intr_disable,
2183180583Skmacy	t3_phy_lasi_intr_clear,
2184180583Skmacy	t3_phy_lasi_intr_handler,
2185167514Skmacy	NULL,
2186167514Skmacy	NULL,
2187167514Skmacy	NULL,
2188167514Skmacy	NULL,
2189167514Skmacy	NULL,
2190181614Skmacy	get_link_status_x,
2191197791Snp	ael1002_power_down,
2192167514Skmacy};
2193167514Skmacy#else
2194167514Skmacystatic struct cphy_ops qt2045_ops = {
2195167514Skmacy	.reset           = ael1006_reset,
2196180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
2197180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
2198180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
2199180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
2200181614Skmacy	.get_link_status = get_link_status_x,
2201197791Snp	.power_down      = ael1002_power_down,
2202167514Skmacy};
2203167514Skmacy#endif
2204167514Skmacy
2205197791Snpint t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr,
2206176472Skmacy		       const struct mdio_ops *mdio_ops)
2207167514Skmacy{
2208167514Skmacy	unsigned int stat;
2209197791Snp	struct cphy *phy = &pinfo->phy;
2210167514Skmacy
2211197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &qt2045_ops, mdio_ops,
2212176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
2213176472Skmacy		  "10GBASE-CX4");
2214167514Skmacy
2215167514Skmacy	/*
2216167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
2217167514Skmacy	 * have it at 1.
2218167514Skmacy	 */
2219167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
2220167514Skmacy	    stat == 0xffff)
2221167514Skmacy		phy->addr = 1;
2222176472Skmacy	return 0;
2223167514Skmacy}
2224167514Skmacy
2225167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
2226167514Skmacy{
2227167514Skmacy	return 0;
2228167514Skmacy}
2229167514Skmacy
2230167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
2231167514Skmacy				       int *speed, int *duplex, int *fc)
2232167514Skmacy{
2233167514Skmacy	if (link_ok) {
2234167514Skmacy		unsigned int status;
2235197791Snp		adapter_t *adapter = phy->adapter;
2236189643Sgnn
2237197791Snp		status = t3_read_reg(adapter,
2238170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
2239197791Snp			 t3_read_reg(adapter,
2240170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
2241197791Snp			 t3_read_reg(adapter,
2242170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
2243197791Snp			 t3_read_reg(adapter,
2244170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
2245167514Skmacy		*link_ok = !(status & F_LOWSIG0);
2246167514Skmacy	}
2247167514Skmacy	if (speed)
2248167514Skmacy		*speed = SPEED_10000;
2249167514Skmacy	if (duplex)
2250167514Skmacy		*duplex = DUPLEX_FULL;
2251167514Skmacy	return 0;
2252167514Skmacy}
2253167514Skmacy
2254167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
2255167514Skmacy{
2256167514Skmacy	return 0;
2257167514Skmacy}
2258167514Skmacy
2259167514Skmacy#ifdef C99_NOT_SUPPORTED
2260167514Skmacystatic struct cphy_ops xaui_direct_ops = {
2261167514Skmacy	xaui_direct_reset,
2262167514Skmacy	ael1002_intr_noop,
2263167514Skmacy	ael1002_intr_noop,
2264167514Skmacy	ael1002_intr_noop,
2265167514Skmacy	ael1002_intr_noop,
2266167514Skmacy	NULL,
2267167514Skmacy	NULL,
2268167514Skmacy	NULL,
2269167514Skmacy	NULL,
2270167514Skmacy	NULL,
2271167514Skmacy	xaui_direct_get_link_status,
2272167514Skmacy	xaui_direct_power_down,
2273167514Skmacy};
2274167514Skmacy#else
2275167514Skmacystatic struct cphy_ops xaui_direct_ops = {
2276167514Skmacy	.reset           = xaui_direct_reset,
2277167514Skmacy	.intr_enable     = ael1002_intr_noop,
2278167514Skmacy	.intr_disable    = ael1002_intr_noop,
2279167514Skmacy	.intr_clear      = ael1002_intr_noop,
2280167514Skmacy	.intr_handler    = ael1002_intr_noop,
2281167514Skmacy	.get_link_status = xaui_direct_get_link_status,
2282167514Skmacy	.power_down      = xaui_direct_power_down,
2283167514Skmacy};
2284167514Skmacy#endif
2285167514Skmacy
2286197791Snpint t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr,
2287176472Skmacy			    const struct mdio_ops *mdio_ops)
2288167514Skmacy{
2289197791Snp	cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &xaui_direct_ops, mdio_ops,
2290176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
2291176472Skmacy		  "10GBASE-CX4");
2292176472Skmacy	return 0;
2293167514Skmacy}
2294