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: releng/10.2/sys/dev/cxgb/common/cxgb_ael1002.c 277343 2015-01-18 20:38:38Z 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 */
286277343Snpstatic int get_link_status_r(struct cphy *phy, int *link_state, int *speed,
287181614Skmacy			     int *duplex, int *fc)
288167514Skmacy{
289277343Snp	if (link_state) {
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;
299209841Snp
300277343Snp		stat0 &= 1;
301277343Snp		stat1 &= 1;
302277343Snp		stat2 = (stat2 >> 12) & 1;
303277343Snp		if (stat0 & stat1 & stat2)
304277343Snp			*link_state = PHY_LINK_UP;
305277343Snp		else if (stat0 == 1 && stat1 == 0 && stat2 == 1)
306277343Snp			*link_state = PHY_LINK_PARTIAL;
307277343Snp		else
308277343Snp			*link_state = PHY_LINK_DOWN;
309167514Skmacy	}
310167514Skmacy	if (speed)
311167514Skmacy		*speed = SPEED_10000;
312167514Skmacy	if (duplex)
313167514Skmacy		*duplex = DUPLEX_FULL;
314167514Skmacy	return 0;
315167514Skmacy}
316167514Skmacy
317167514Skmacy#ifdef C99_NOT_SUPPORTED
318167514Skmacystatic struct cphy_ops ael1002_ops = {
319167514Skmacy	ael1002_reset,
320167514Skmacy	ael1002_intr_noop,
321167514Skmacy	ael1002_intr_noop,
322167514Skmacy	ael1002_intr_noop,
323167514Skmacy	ael1002_intr_noop,
324167514Skmacy	NULL,
325167514Skmacy	NULL,
326167514Skmacy	NULL,
327167514Skmacy	NULL,
328167514Skmacy	NULL,
329181614Skmacy	get_link_status_r,
330167514Skmacy	ael1002_power_down,
331167514Skmacy};
332167514Skmacy#else
333167514Skmacystatic struct cphy_ops ael1002_ops = {
334167514Skmacy	.reset           = ael1002_reset,
335167514Skmacy	.intr_enable     = ael1002_intr_noop,
336167514Skmacy	.intr_disable    = ael1002_intr_noop,
337167514Skmacy	.intr_clear      = ael1002_intr_noop,
338167514Skmacy	.intr_handler    = ael1002_intr_noop,
339181614Skmacy	.get_link_status = get_link_status_r,
340167514Skmacy	.power_down      = ael1002_power_down,
341167514Skmacy};
342167514Skmacy#endif
343167514Skmacy
344197791Snpint t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr,
345176472Skmacy			const struct mdio_ops *mdio_ops)
346167514Skmacy{
347186282Sgnn	int err;
348197791Snp	struct cphy *phy = &pinfo->phy;
349186282Sgnn
350197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1002_ops, mdio_ops,
351176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
352177340Skmacy		  "10GBASE-R");
353167514Skmacy	ael100x_txon(phy);
354189643Sgnn	ael_laser_down(phy, 0);
355186282Sgnn
356186282Sgnn	err = ael1002_get_module_type(phy, 0);
357186282Sgnn	if (err >= 0)
358186282Sgnn		phy->modtype = err;
359186282Sgnn
360176472Skmacy	return 0;
361167514Skmacy}
362167514Skmacy
363167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait)
364167514Skmacy{
365189643Sgnn	int err;
366189643Sgnn
367189643Sgnn	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
368189643Sgnn	if (err)
369189643Sgnn		return err;
370189643Sgnn
371189643Sgnn	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN,
372189643Sgnn			 F_GPIO6_OUT_VAL, 0);
373189643Sgnn
374185157Sgnn	msleep(125);
375189643Sgnn
376189643Sgnn	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN,
377189643Sgnn			 F_GPIO6_OUT_VAL, F_GPIO6_OUT_VAL);
378189643Sgnn
379185157Sgnn	msleep(125);
380185620Sgnn
381189643Sgnn	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
382189643Sgnn	if (err)
383189643Sgnn		return err;
384185620Sgnn
385189643Sgnn	msleep(125);
386189643Sgnn
387189643Sgnn	err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 1);
388189643Sgnn	if (err)
389189643Sgnn		return err;
390189643Sgnn
391189643Sgnn	msleep(125);
392189643Sgnn
393189643Sgnn	err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0);
394189643Sgnn
395189643Sgnn	return err;
396189643Sgnn
397167514Skmacy}
398167514Skmacy
399167514Skmacy#ifdef C99_NOT_SUPPORTED
400167514Skmacystatic struct cphy_ops ael1006_ops = {
401167514Skmacy	ael1006_reset,
402180583Skmacy	t3_phy_lasi_intr_enable,
403180583Skmacy	t3_phy_lasi_intr_disable,
404180583Skmacy	t3_phy_lasi_intr_clear,
405180583Skmacy	t3_phy_lasi_intr_handler,
406167514Skmacy	NULL,
407167514Skmacy	NULL,
408167514Skmacy	NULL,
409167514Skmacy	NULL,
410167514Skmacy	NULL,
411181614Skmacy	get_link_status_r,
412197791Snp	ael1002_power_down,
413167514Skmacy};
414167514Skmacy#else
415167514Skmacystatic struct cphy_ops ael1006_ops = {
416167514Skmacy	.reset           = ael1006_reset,
417180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
418180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
419180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
420180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
421181614Skmacy	.get_link_status = get_link_status_r,
422197791Snp	.power_down      = ael1002_power_down,
423167514Skmacy};
424167514Skmacy#endif
425167514Skmacy
426197791Snpint t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr,
427176472Skmacy			const struct mdio_ops *mdio_ops)
428167514Skmacy{
429197791Snp	struct cphy *phy = &pinfo->phy;
430197791Snp
431197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1006_ops, mdio_ops,
432176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
433176472Skmacy		  "10GBASE-SR");
434197791Snp	phy->modtype = phy_modtype_sr;
435167514Skmacy	ael100x_txon(phy);
436176472Skmacy	return 0;
437167514Skmacy}
438167514Skmacy
439197791Snp/*
440197791Snp * Decode our module type.
441197791Snp */
442197791Snpstatic int ael2xxx_get_module_type(struct cphy *phy, int delay_ms)
443197791Snp{
444197791Snp	int v;
445197791Snp
446197791Snp	if (delay_ms)
447197791Snp		msleep(delay_ms);
448197791Snp
449197791Snp	v = get_phytrans_type(phy);
450197791Snp	if (v == phy_transtype_sfp) {
451197791Snp		/* SFP: see SFF-8472 for below */
452197791Snp
453197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3);
454197791Snp		if (v < 0)
455197791Snp			return v;
456197791Snp
457197791Snp		if (v == 0x1)
458204921Snp			goto twinax;
459197791Snp		if (v == 0x10)
460197791Snp			return phy_modtype_sr;
461197791Snp		if (v == 0x20)
462197791Snp			return phy_modtype_lr;
463197791Snp		if (v == 0x40)
464197791Snp			return phy_modtype_lrm;
465197791Snp
466204921Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 8);
467204921Snp		if (v < 0)
468204921Snp			return v;
469204921Snp		if (v == 4) {
470204921Snp			v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 60);
471204921Snp			if (v < 0)
472204921Snp				return v;
473204921Snp			if (v & 0x1)
474204921Snp				goto twinax;
475204921Snp		}
476204921Snp
477197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6);
478197791Snp		if (v < 0)
479197791Snp			return v;
480197791Snp		if (v != 4)
481197791Snp			return phy_modtype_unknown;
482197791Snp
483197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10);
484197791Snp		if (v < 0)
485197791Snp			return v;
486197791Snp
487197791Snp		if (v & 0x80) {
488204921Snptwinax:
489197791Snp			v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
490197791Snp			if (v < 0)
491197791Snp				return v;
492197791Snp			return v > 10 ? phy_modtype_twinax_long :
493197791Snp			    phy_modtype_twinax;
494197791Snp		}
495197791Snp	} else if (v == phy_transtype_xfp) {
496197791Snp		/* XFP: See INF-8077i for details. */
497197791Snp
498197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127);
499197791Snp		if (v < 0)
500197791Snp			return v;
501197791Snp
502197791Snp		if (v != 1) {
503197791Snp			/* XXX: set page select to table 1 yourself */
504197791Snp			return phy_modtype_unknown;
505197791Snp		}
506197791Snp
507197791Snp		v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131);
508197791Snp		if (v < 0)
509197791Snp			return v;
510197791Snp		v &= 0xf0;
511197791Snp		if (v == 0x10)
512197791Snp			return phy_modtype_lrm;
513197791Snp		if (v == 0x40)
514197791Snp			return phy_modtype_lr;
515197791Snp		if (v == 0x80)
516197791Snp			return phy_modtype_sr;
517197791Snp	}
518197791Snp
519197791Snp	return phy_modtype_unknown;
520197791Snp}
521197791Snp
522197791Snp/*
523197791Snp * Code to support the Aeluros/NetLogic 2005 10Gb PHY.
524197791Snp */
525180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
526180583Skmacy{
527181614Skmacy	static struct reg_val regs[] = {
528181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
529181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
530181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
531181614Skmacy		{ 0, 0, 0, 0 }
532181614Skmacy	};
533180583Skmacy	static u16 sr_edc[] = {
534180583Skmacy		0xcc00, 0x2ff4,
535180583Skmacy		0xcc01, 0x3cd4,
536180583Skmacy		0xcc02, 0x2015,
537180583Skmacy		0xcc03, 0x3105,
538180583Skmacy		0xcc04, 0x6524,
539180583Skmacy		0xcc05, 0x27ff,
540180583Skmacy		0xcc06, 0x300f,
541180583Skmacy		0xcc07, 0x2c8b,
542180583Skmacy		0xcc08, 0x300b,
543180583Skmacy		0xcc09, 0x4009,
544180583Skmacy		0xcc0a, 0x400e,
545180583Skmacy		0xcc0b, 0x2f72,
546180583Skmacy		0xcc0c, 0x3002,
547180583Skmacy		0xcc0d, 0x1002,
548180583Skmacy		0xcc0e, 0x2172,
549180583Skmacy		0xcc0f, 0x3012,
550180583Skmacy		0xcc10, 0x1002,
551180583Skmacy		0xcc11, 0x25d2,
552180583Skmacy		0xcc12, 0x3012,
553180583Skmacy		0xcc13, 0x1002,
554180583Skmacy		0xcc14, 0xd01e,
555180583Skmacy		0xcc15, 0x27d2,
556180583Skmacy		0xcc16, 0x3012,
557180583Skmacy		0xcc17, 0x1002,
558180583Skmacy		0xcc18, 0x2004,
559180583Skmacy		0xcc19, 0x3c84,
560180583Skmacy		0xcc1a, 0x6436,
561180583Skmacy		0xcc1b, 0x2007,
562180583Skmacy		0xcc1c, 0x3f87,
563180583Skmacy		0xcc1d, 0x8676,
564180583Skmacy		0xcc1e, 0x40b7,
565180583Skmacy		0xcc1f, 0xa746,
566180583Skmacy		0xcc20, 0x4047,
567180583Skmacy		0xcc21, 0x5673,
568180583Skmacy		0xcc22, 0x2982,
569180583Skmacy		0xcc23, 0x3002,
570180583Skmacy		0xcc24, 0x13d2,
571180583Skmacy		0xcc25, 0x8bbd,
572180583Skmacy		0xcc26, 0x2862,
573180583Skmacy		0xcc27, 0x3012,
574180583Skmacy		0xcc28, 0x1002,
575180583Skmacy		0xcc29, 0x2092,
576180583Skmacy		0xcc2a, 0x3012,
577180583Skmacy		0xcc2b, 0x1002,
578180583Skmacy		0xcc2c, 0x5cc3,
579180583Skmacy		0xcc2d, 0x314,
580180583Skmacy		0xcc2e, 0x2942,
581180583Skmacy		0xcc2f, 0x3002,
582180583Skmacy		0xcc30, 0x1002,
583180583Skmacy		0xcc31, 0xd019,
584180583Skmacy		0xcc32, 0x2032,
585180583Skmacy		0xcc33, 0x3012,
586180583Skmacy		0xcc34, 0x1002,
587180583Skmacy		0xcc35, 0x2a04,
588180583Skmacy		0xcc36, 0x3c74,
589180583Skmacy		0xcc37, 0x6435,
590180583Skmacy		0xcc38, 0x2fa4,
591180583Skmacy		0xcc39, 0x3cd4,
592180583Skmacy		0xcc3a, 0x6624,
593180583Skmacy		0xcc3b, 0x5563,
594180583Skmacy		0xcc3c, 0x2d42,
595180583Skmacy		0xcc3d, 0x3002,
596180583Skmacy		0xcc3e, 0x13d2,
597180583Skmacy		0xcc3f, 0x464d,
598180583Skmacy		0xcc40, 0x2862,
599180583Skmacy		0xcc41, 0x3012,
600180583Skmacy		0xcc42, 0x1002,
601180583Skmacy		0xcc43, 0x2032,
602180583Skmacy		0xcc44, 0x3012,
603180583Skmacy		0xcc45, 0x1002,
604180583Skmacy		0xcc46, 0x2fb4,
605180583Skmacy		0xcc47, 0x3cd4,
606180583Skmacy		0xcc48, 0x6624,
607180583Skmacy		0xcc49, 0x5563,
608180583Skmacy		0xcc4a, 0x2d42,
609180583Skmacy		0xcc4b, 0x3002,
610180583Skmacy		0xcc4c, 0x13d2,
611180583Skmacy		0xcc4d, 0x2ed2,
612180583Skmacy		0xcc4e, 0x3002,
613180583Skmacy		0xcc4f, 0x1002,
614180583Skmacy		0xcc50, 0x2fd2,
615180583Skmacy		0xcc51, 0x3002,
616180583Skmacy		0xcc52, 0x1002,
617180583Skmacy		0xcc53, 0x004,
618180583Skmacy		0xcc54, 0x2942,
619180583Skmacy		0xcc55, 0x3002,
620180583Skmacy		0xcc56, 0x1002,
621180583Skmacy		0xcc57, 0x2092,
622180583Skmacy		0xcc58, 0x3012,
623180583Skmacy		0xcc59, 0x1002,
624180583Skmacy		0xcc5a, 0x5cc3,
625180583Skmacy		0xcc5b, 0x317,
626180583Skmacy		0xcc5c, 0x2f72,
627180583Skmacy		0xcc5d, 0x3002,
628180583Skmacy		0xcc5e, 0x1002,
629180583Skmacy		0xcc5f, 0x2942,
630180583Skmacy		0xcc60, 0x3002,
631180583Skmacy		0xcc61, 0x1002,
632180583Skmacy		0xcc62, 0x22cd,
633180583Skmacy		0xcc63, 0x301d,
634180583Skmacy		0xcc64, 0x2862,
635180583Skmacy		0xcc65, 0x3012,
636180583Skmacy		0xcc66, 0x1002,
637180583Skmacy		0xcc67, 0x2ed2,
638180583Skmacy		0xcc68, 0x3002,
639180583Skmacy		0xcc69, 0x1002,
640180583Skmacy		0xcc6a, 0x2d72,
641180583Skmacy		0xcc6b, 0x3002,
642180583Skmacy		0xcc6c, 0x1002,
643180583Skmacy		0xcc6d, 0x628f,
644180583Skmacy		0xcc6e, 0x2112,
645180583Skmacy		0xcc6f, 0x3012,
646180583Skmacy		0xcc70, 0x1002,
647180583Skmacy		0xcc71, 0x5aa3,
648180583Skmacy		0xcc72, 0x2dc2,
649180583Skmacy		0xcc73, 0x3002,
650180583Skmacy		0xcc74, 0x1312,
651180583Skmacy		0xcc75, 0x6f72,
652180583Skmacy		0xcc76, 0x1002,
653180583Skmacy		0xcc77, 0x2807,
654180583Skmacy		0xcc78, 0x31a7,
655180583Skmacy		0xcc79, 0x20c4,
656180583Skmacy		0xcc7a, 0x3c24,
657180583Skmacy		0xcc7b, 0x6724,
658180583Skmacy		0xcc7c, 0x1002,
659180583Skmacy		0xcc7d, 0x2807,
660180583Skmacy		0xcc7e, 0x3187,
661180583Skmacy		0xcc7f, 0x20c4,
662180583Skmacy		0xcc80, 0x3c24,
663180583Skmacy		0xcc81, 0x6724,
664180583Skmacy		0xcc82, 0x1002,
665180583Skmacy		0xcc83, 0x2514,
666180583Skmacy		0xcc84, 0x3c64,
667180583Skmacy		0xcc85, 0x6436,
668180583Skmacy		0xcc86, 0xdff4,
669180583Skmacy		0xcc87, 0x6436,
670180583Skmacy		0xcc88, 0x1002,
671180583Skmacy		0xcc89, 0x40a4,
672180583Skmacy		0xcc8a, 0x643c,
673180583Skmacy		0xcc8b, 0x4016,
674180583Skmacy		0xcc8c, 0x8c6c,
675180583Skmacy		0xcc8d, 0x2b24,
676180583Skmacy		0xcc8e, 0x3c24,
677180583Skmacy		0xcc8f, 0x6435,
678180583Skmacy		0xcc90, 0x1002,
679180583Skmacy		0xcc91, 0x2b24,
680180583Skmacy		0xcc92, 0x3c24,
681180583Skmacy		0xcc93, 0x643a,
682180583Skmacy		0xcc94, 0x4025,
683180583Skmacy		0xcc95, 0x8a5a,
684180583Skmacy		0xcc96, 0x1002,
685180583Skmacy		0xcc97, 0x2731,
686180583Skmacy		0xcc98, 0x3011,
687180583Skmacy		0xcc99, 0x1001,
688180583Skmacy		0xcc9a, 0xc7a0,
689180583Skmacy		0xcc9b, 0x100,
690180583Skmacy		0xcc9c, 0xc502,
691180583Skmacy		0xcc9d, 0x53ac,
692180583Skmacy		0xcc9e, 0xc503,
693180583Skmacy		0xcc9f, 0xd5d5,
694180583Skmacy		0xcca0, 0xc600,
695180583Skmacy		0xcca1, 0x2a6d,
696180583Skmacy		0xcca2, 0xc601,
697180583Skmacy		0xcca3, 0x2a4c,
698180583Skmacy		0xcca4, 0xc602,
699180583Skmacy		0xcca5, 0x111,
700180583Skmacy		0xcca6, 0xc60c,
701180583Skmacy		0xcca7, 0x5900,
702180583Skmacy		0xcca8, 0xc710,
703180583Skmacy		0xcca9, 0x700,
704180583Skmacy		0xccaa, 0xc718,
705180583Skmacy		0xccab, 0x700,
706180583Skmacy		0xccac, 0xc720,
707180583Skmacy		0xccad, 0x4700,
708180583Skmacy		0xccae, 0xc801,
709180583Skmacy		0xccaf, 0x7f50,
710180583Skmacy		0xccb0, 0xc802,
711180583Skmacy		0xccb1, 0x7760,
712180583Skmacy		0xccb2, 0xc803,
713180583Skmacy		0xccb3, 0x7fce,
714180583Skmacy		0xccb4, 0xc804,
715180583Skmacy		0xccb5, 0x5700,
716180583Skmacy		0xccb6, 0xc805,
717180583Skmacy		0xccb7, 0x5f11,
718180583Skmacy		0xccb8, 0xc806,
719180583Skmacy		0xccb9, 0x4751,
720180583Skmacy		0xccba, 0xc807,
721180583Skmacy		0xccbb, 0x57e1,
722180583Skmacy		0xccbc, 0xc808,
723180583Skmacy		0xccbd, 0x2700,
724180583Skmacy		0xccbe, 0xc809,
725180583Skmacy		0xccbf, 0x000,
726180583Skmacy		0xccc0, 0xc821,
727180583Skmacy		0xccc1, 0x002,
728180583Skmacy		0xccc2, 0xc822,
729180583Skmacy		0xccc3, 0x014,
730180583Skmacy		0xccc4, 0xc832,
731180583Skmacy		0xccc5, 0x1186,
732180583Skmacy		0xccc6, 0xc847,
733180583Skmacy		0xccc7, 0x1e02,
734180583Skmacy		0xccc8, 0xc013,
735180583Skmacy		0xccc9, 0xf341,
736180583Skmacy		0xccca, 0xc01a,
737180583Skmacy		0xcccb, 0x446,
738180583Skmacy		0xcccc, 0xc024,
739180583Skmacy		0xcccd, 0x1000,
740180583Skmacy		0xccce, 0xc025,
741180583Skmacy		0xcccf, 0xa00,
742180583Skmacy		0xccd0, 0xc026,
743180583Skmacy		0xccd1, 0xc0c,
744180583Skmacy		0xccd2, 0xc027,
745180583Skmacy		0xccd3, 0xc0c,
746180583Skmacy		0xccd4, 0xc029,
747180583Skmacy		0xccd5, 0x0a0,
748180583Skmacy		0xccd6, 0xc030,
749180583Skmacy		0xccd7, 0xa00,
750180583Skmacy		0xccd8, 0xc03c,
751180583Skmacy		0xccd9, 0x01c,
752180583Skmacy		0xccda, 0xc005,
753180583Skmacy		0xccdb, 0x7a06,
754180583Skmacy		0xccdc, 0x000,
755180583Skmacy		0xccdd, 0x2731,
756180583Skmacy		0xccde, 0x3011,
757180583Skmacy		0xccdf, 0x1001,
758180583Skmacy		0xcce0, 0xc620,
759180583Skmacy		0xcce1, 0x000,
760180583Skmacy		0xcce2, 0xc621,
761180583Skmacy		0xcce3, 0x03f,
762180583Skmacy		0xcce4, 0xc622,
763180583Skmacy		0xcce5, 0x000,
764180583Skmacy		0xcce6, 0xc623,
765180583Skmacy		0xcce7, 0x000,
766180583Skmacy		0xcce8, 0xc624,
767180583Skmacy		0xcce9, 0x000,
768180583Skmacy		0xccea, 0xc625,
769180583Skmacy		0xcceb, 0x000,
770180583Skmacy		0xccec, 0xc627,
771180583Skmacy		0xcced, 0x000,
772180583Skmacy		0xccee, 0xc628,
773180583Skmacy		0xccef, 0x000,
774180583Skmacy		0xccf0, 0xc62c,
775180583Skmacy		0xccf1, 0x000,
776180583Skmacy		0xccf2, 0x000,
777180583Skmacy		0xccf3, 0x2806,
778180583Skmacy		0xccf4, 0x3cb6,
779180583Skmacy		0xccf5, 0xc161,
780180583Skmacy		0xccf6, 0x6134,
781180583Skmacy		0xccf7, 0x6135,
782180583Skmacy		0xccf8, 0x5443,
783180583Skmacy		0xccf9, 0x303,
784180583Skmacy		0xccfa, 0x6524,
785180583Skmacy		0xccfb, 0x00b,
786180583Skmacy		0xccfc, 0x1002,
787180583Skmacy		0xccfd, 0x2104,
788180583Skmacy		0xccfe, 0x3c24,
789180583Skmacy		0xccff, 0x2105,
790180583Skmacy		0xcd00, 0x3805,
791180583Skmacy		0xcd01, 0x6524,
792180583Skmacy		0xcd02, 0xdff4,
793180583Skmacy		0xcd03, 0x4005,
794180583Skmacy		0xcd04, 0x6524,
795180583Skmacy		0xcd05, 0x1002,
796180583Skmacy		0xcd06, 0x5dd3,
797180583Skmacy		0xcd07, 0x306,
798180583Skmacy		0xcd08, 0x2ff7,
799180583Skmacy		0xcd09, 0x38f7,
800180583Skmacy		0xcd0a, 0x60b7,
801180583Skmacy		0xcd0b, 0xdffd,
802180583Skmacy		0xcd0c, 0x00a,
803180583Skmacy		0xcd0d, 0x1002,
804180583Skmacy		0xcd0e, 0
805180583Skmacy	};
806180583Skmacy	int i, err;
807180583Skmacy
808181614Skmacy	err = set_phy_regs(phy, regs);
809181614Skmacy	if (err)
810181614Skmacy		return err;
811181614Skmacy
812181614Skmacy	msleep(50);
813181614Skmacy
814181614Skmacy	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
815180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
816180583Skmacy				 sr_edc[i + 1]);
817181614Skmacy	if (!err)
818181614Skmacy		phy->priv = edc_sr;
819180583Skmacy	return err;
820180583Skmacy}
821180583Skmacy
822181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
823181614Skmacy{
824181614Skmacy	static struct reg_val regs[] = {
825181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
826181614Skmacy		{ 0, 0, 0, 0 }
827181614Skmacy	};
828181614Skmacy	static struct reg_val preemphasis[] = {
829181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
830181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
831181614Skmacy		{ 0, 0, 0, 0 }
832181614Skmacy	};
833181614Skmacy	static u16 twinax_edc[] = {
834181614Skmacy		0xcc00, 0x4009,
835181614Skmacy		0xcc01, 0x27ff,
836181614Skmacy		0xcc02, 0x300f,
837181614Skmacy		0xcc03, 0x40aa,
838181614Skmacy		0xcc04, 0x401c,
839181614Skmacy		0xcc05, 0x401e,
840181614Skmacy		0xcc06, 0x2ff4,
841181614Skmacy		0xcc07, 0x3cd4,
842181614Skmacy		0xcc08, 0x2035,
843181614Skmacy		0xcc09, 0x3145,
844181614Skmacy		0xcc0a, 0x6524,
845181614Skmacy		0xcc0b, 0x26a2,
846181614Skmacy		0xcc0c, 0x3012,
847181614Skmacy		0xcc0d, 0x1002,
848181614Skmacy		0xcc0e, 0x29c2,
849181614Skmacy		0xcc0f, 0x3002,
850181614Skmacy		0xcc10, 0x1002,
851181614Skmacy		0xcc11, 0x2072,
852181614Skmacy		0xcc12, 0x3012,
853181614Skmacy		0xcc13, 0x1002,
854181614Skmacy		0xcc14, 0x22cd,
855181614Skmacy		0xcc15, 0x301d,
856181614Skmacy		0xcc16, 0x2e52,
857181614Skmacy		0xcc17, 0x3012,
858181614Skmacy		0xcc18, 0x1002,
859181614Skmacy		0xcc19, 0x28e2,
860181614Skmacy		0xcc1a, 0x3002,
861181614Skmacy		0xcc1b, 0x1002,
862181614Skmacy		0xcc1c, 0x628f,
863181614Skmacy		0xcc1d, 0x2ac2,
864181614Skmacy		0xcc1e, 0x3012,
865181614Skmacy		0xcc1f, 0x1002,
866181614Skmacy		0xcc20, 0x5553,
867181614Skmacy		0xcc21, 0x2ae2,
868181614Skmacy		0xcc22, 0x3002,
869181614Skmacy		0xcc23, 0x1302,
870181614Skmacy		0xcc24, 0x401e,
871181614Skmacy		0xcc25, 0x2be2,
872181614Skmacy		0xcc26, 0x3012,
873181614Skmacy		0xcc27, 0x1002,
874181614Skmacy		0xcc28, 0x2da2,
875181614Skmacy		0xcc29, 0x3012,
876181614Skmacy		0xcc2a, 0x1002,
877181614Skmacy		0xcc2b, 0x2ba2,
878181614Skmacy		0xcc2c, 0x3002,
879181614Skmacy		0xcc2d, 0x1002,
880181614Skmacy		0xcc2e, 0x5ee3,
881181614Skmacy		0xcc2f, 0x305,
882181614Skmacy		0xcc30, 0x400e,
883181614Skmacy		0xcc31, 0x2bc2,
884181614Skmacy		0xcc32, 0x3002,
885181614Skmacy		0xcc33, 0x1002,
886181614Skmacy		0xcc34, 0x2b82,
887181614Skmacy		0xcc35, 0x3012,
888181614Skmacy		0xcc36, 0x1002,
889181614Skmacy		0xcc37, 0x5663,
890181614Skmacy		0xcc38, 0x302,
891181614Skmacy		0xcc39, 0x401e,
892181614Skmacy		0xcc3a, 0x6f72,
893181614Skmacy		0xcc3b, 0x1002,
894181614Skmacy		0xcc3c, 0x628f,
895181614Skmacy		0xcc3d, 0x2be2,
896181614Skmacy		0xcc3e, 0x3012,
897181614Skmacy		0xcc3f, 0x1002,
898181614Skmacy		0xcc40, 0x22cd,
899181614Skmacy		0xcc41, 0x301d,
900181614Skmacy		0xcc42, 0x2e52,
901181614Skmacy		0xcc43, 0x3012,
902181614Skmacy		0xcc44, 0x1002,
903181614Skmacy		0xcc45, 0x2522,
904181614Skmacy		0xcc46, 0x3012,
905181614Skmacy		0xcc47, 0x1002,
906181614Skmacy		0xcc48, 0x2da2,
907181614Skmacy		0xcc49, 0x3012,
908181614Skmacy		0xcc4a, 0x1002,
909181614Skmacy		0xcc4b, 0x2ca2,
910181614Skmacy		0xcc4c, 0x3012,
911181614Skmacy		0xcc4d, 0x1002,
912181614Skmacy		0xcc4e, 0x2fa4,
913181614Skmacy		0xcc4f, 0x3cd4,
914181614Skmacy		0xcc50, 0x6624,
915181614Skmacy		0xcc51, 0x410b,
916181614Skmacy		0xcc52, 0x56b3,
917181614Skmacy		0xcc53, 0x3c4,
918181614Skmacy		0xcc54, 0x2fb2,
919181614Skmacy		0xcc55, 0x3002,
920181614Skmacy		0xcc56, 0x1002,
921181614Skmacy		0xcc57, 0x220b,
922181614Skmacy		0xcc58, 0x303b,
923181614Skmacy		0xcc59, 0x56b3,
924181614Skmacy		0xcc5a, 0x3c3,
925181614Skmacy		0xcc5b, 0x866b,
926181614Skmacy		0xcc5c, 0x400c,
927181614Skmacy		0xcc5d, 0x23a2,
928181614Skmacy		0xcc5e, 0x3012,
929181614Skmacy		0xcc5f, 0x1002,
930181614Skmacy		0xcc60, 0x2da2,
931181614Skmacy		0xcc61, 0x3012,
932181614Skmacy		0xcc62, 0x1002,
933181614Skmacy		0xcc63, 0x2ca2,
934181614Skmacy		0xcc64, 0x3012,
935181614Skmacy		0xcc65, 0x1002,
936181614Skmacy		0xcc66, 0x2fb4,
937181614Skmacy		0xcc67, 0x3cd4,
938181614Skmacy		0xcc68, 0x6624,
939181614Skmacy		0xcc69, 0x56b3,
940181614Skmacy		0xcc6a, 0x3c3,
941181614Skmacy		0xcc6b, 0x866b,
942181614Skmacy		0xcc6c, 0x401c,
943181614Skmacy		0xcc6d, 0x2205,
944181614Skmacy		0xcc6e, 0x3035,
945181614Skmacy		0xcc6f, 0x5b53,
946181614Skmacy		0xcc70, 0x2c52,
947181614Skmacy		0xcc71, 0x3002,
948181614Skmacy		0xcc72, 0x13c2,
949181614Skmacy		0xcc73, 0x5cc3,
950181614Skmacy		0xcc74, 0x317,
951181614Skmacy		0xcc75, 0x2522,
952181614Skmacy		0xcc76, 0x3012,
953181614Skmacy		0xcc77, 0x1002,
954181614Skmacy		0xcc78, 0x2da2,
955181614Skmacy		0xcc79, 0x3012,
956181614Skmacy		0xcc7a, 0x1002,
957181614Skmacy		0xcc7b, 0x2b82,
958181614Skmacy		0xcc7c, 0x3012,
959181614Skmacy		0xcc7d, 0x1002,
960181614Skmacy		0xcc7e, 0x5663,
961181614Skmacy		0xcc7f, 0x303,
962181614Skmacy		0xcc80, 0x401e,
963181614Skmacy		0xcc81, 0x004,
964181614Skmacy		0xcc82, 0x2c42,
965181614Skmacy		0xcc83, 0x3012,
966181614Skmacy		0xcc84, 0x1002,
967181614Skmacy		0xcc85, 0x6f72,
968181614Skmacy		0xcc86, 0x1002,
969181614Skmacy		0xcc87, 0x628f,
970181614Skmacy		0xcc88, 0x2304,
971181614Skmacy		0xcc89, 0x3c84,
972181614Skmacy		0xcc8a, 0x6436,
973181614Skmacy		0xcc8b, 0xdff4,
974181614Skmacy		0xcc8c, 0x6436,
975181614Skmacy		0xcc8d, 0x2ff5,
976181614Skmacy		0xcc8e, 0x3005,
977181614Skmacy		0xcc8f, 0x8656,
978181614Skmacy		0xcc90, 0xdfba,
979181614Skmacy		0xcc91, 0x56a3,
980181614Skmacy		0xcc92, 0xd05a,
981181614Skmacy		0xcc93, 0x21c2,
982181614Skmacy		0xcc94, 0x3012,
983181614Skmacy		0xcc95, 0x1392,
984181614Skmacy		0xcc96, 0xd05a,
985181614Skmacy		0xcc97, 0x56a3,
986181614Skmacy		0xcc98, 0xdfba,
987181614Skmacy		0xcc99, 0x383,
988181614Skmacy		0xcc9a, 0x6f72,
989181614Skmacy		0xcc9b, 0x1002,
990181614Skmacy		0xcc9c, 0x28c5,
991181614Skmacy		0xcc9d, 0x3005,
992181614Skmacy		0xcc9e, 0x4178,
993181614Skmacy		0xcc9f, 0x5653,
994181614Skmacy		0xcca0, 0x384,
995181614Skmacy		0xcca1, 0x22b2,
996181614Skmacy		0xcca2, 0x3012,
997181614Skmacy		0xcca3, 0x1002,
998181614Skmacy		0xcca4, 0x2be5,
999181614Skmacy		0xcca5, 0x3005,
1000181614Skmacy		0xcca6, 0x41e8,
1001181614Skmacy		0xcca7, 0x5653,
1002181614Skmacy		0xcca8, 0x382,
1003181614Skmacy		0xcca9, 0x002,
1004181614Skmacy		0xccaa, 0x4258,
1005181614Skmacy		0xccab, 0x2474,
1006181614Skmacy		0xccac, 0x3c84,
1007181614Skmacy		0xccad, 0x6437,
1008181614Skmacy		0xccae, 0xdff4,
1009181614Skmacy		0xccaf, 0x6437,
1010181614Skmacy		0xccb0, 0x2ff5,
1011181614Skmacy		0xccb1, 0x3c05,
1012181614Skmacy		0xccb2, 0x8757,
1013181614Skmacy		0xccb3, 0xb888,
1014181614Skmacy		0xccb4, 0x9787,
1015181614Skmacy		0xccb5, 0xdff4,
1016181614Skmacy		0xccb6, 0x6724,
1017181614Skmacy		0xccb7, 0x866a,
1018181614Skmacy		0xccb8, 0x6f72,
1019181614Skmacy		0xccb9, 0x1002,
1020181614Skmacy		0xccba, 0x2d01,
1021181614Skmacy		0xccbb, 0x3011,
1022181614Skmacy		0xccbc, 0x1001,
1023181614Skmacy		0xccbd, 0xc620,
1024181614Skmacy		0xccbe, 0x14e5,
1025181614Skmacy		0xccbf, 0xc621,
1026181614Skmacy		0xccc0, 0xc53d,
1027181614Skmacy		0xccc1, 0xc622,
1028181614Skmacy		0xccc2, 0x3cbe,
1029181614Skmacy		0xccc3, 0xc623,
1030181614Skmacy		0xccc4, 0x4452,
1031181614Skmacy		0xccc5, 0xc624,
1032181614Skmacy		0xccc6, 0xc5c5,
1033181614Skmacy		0xccc7, 0xc625,
1034181614Skmacy		0xccc8, 0xe01e,
1035181614Skmacy		0xccc9, 0xc627,
1036181614Skmacy		0xccca, 0x000,
1037181614Skmacy		0xcccb, 0xc628,
1038181614Skmacy		0xcccc, 0x000,
1039181614Skmacy		0xcccd, 0xc62b,
1040181614Skmacy		0xccce, 0x000,
1041181614Skmacy		0xcccf, 0xc62c,
1042181614Skmacy		0xccd0, 0x000,
1043181614Skmacy		0xccd1, 0x000,
1044181614Skmacy		0xccd2, 0x2d01,
1045181614Skmacy		0xccd3, 0x3011,
1046181614Skmacy		0xccd4, 0x1001,
1047181614Skmacy		0xccd5, 0xc620,
1048181614Skmacy		0xccd6, 0x000,
1049181614Skmacy		0xccd7, 0xc621,
1050181614Skmacy		0xccd8, 0x000,
1051181614Skmacy		0xccd9, 0xc622,
1052181614Skmacy		0xccda, 0x0ce,
1053181614Skmacy		0xccdb, 0xc623,
1054181614Skmacy		0xccdc, 0x07f,
1055181614Skmacy		0xccdd, 0xc624,
1056181614Skmacy		0xccde, 0x032,
1057181614Skmacy		0xccdf, 0xc625,
1058181614Skmacy		0xcce0, 0x000,
1059181614Skmacy		0xcce1, 0xc627,
1060181614Skmacy		0xcce2, 0x000,
1061181614Skmacy		0xcce3, 0xc628,
1062181614Skmacy		0xcce4, 0x000,
1063181614Skmacy		0xcce5, 0xc62b,
1064181614Skmacy		0xcce6, 0x000,
1065181614Skmacy		0xcce7, 0xc62c,
1066181614Skmacy		0xcce8, 0x000,
1067181614Skmacy		0xcce9, 0x000,
1068181614Skmacy		0xccea, 0x2d01,
1069181614Skmacy		0xcceb, 0x3011,
1070181614Skmacy		0xccec, 0x1001,
1071181614Skmacy		0xcced, 0xc502,
1072181614Skmacy		0xccee, 0x609f,
1073181614Skmacy		0xccef, 0xc600,
1074181614Skmacy		0xccf0, 0x2a6e,
1075181614Skmacy		0xccf1, 0xc601,
1076181614Skmacy		0xccf2, 0x2a2c,
1077181614Skmacy		0xccf3, 0xc60c,
1078181614Skmacy		0xccf4, 0x5400,
1079181614Skmacy		0xccf5, 0xc710,
1080181614Skmacy		0xccf6, 0x700,
1081181614Skmacy		0xccf7, 0xc718,
1082181614Skmacy		0xccf8, 0x700,
1083181614Skmacy		0xccf9, 0xc720,
1084181614Skmacy		0xccfa, 0x4700,
1085181614Skmacy		0xccfb, 0xc728,
1086181614Skmacy		0xccfc, 0x700,
1087181614Skmacy		0xccfd, 0xc729,
1088181614Skmacy		0xccfe, 0x1207,
1089181614Skmacy		0xccff, 0xc801,
1090181614Skmacy		0xcd00, 0x7f50,
1091181614Skmacy		0xcd01, 0xc802,
1092181614Skmacy		0xcd02, 0x7760,
1093181614Skmacy		0xcd03, 0xc803,
1094181614Skmacy		0xcd04, 0x7fce,
1095181614Skmacy		0xcd05, 0xc804,
1096181614Skmacy		0xcd06, 0x520e,
1097181614Skmacy		0xcd07, 0xc805,
1098181614Skmacy		0xcd08, 0x5c11,
1099181614Skmacy		0xcd09, 0xc806,
1100181614Skmacy		0xcd0a, 0x3c51,
1101181614Skmacy		0xcd0b, 0xc807,
1102181614Skmacy		0xcd0c, 0x4061,
1103181614Skmacy		0xcd0d, 0xc808,
1104181614Skmacy		0xcd0e, 0x49c1,
1105181614Skmacy		0xcd0f, 0xc809,
1106181614Skmacy		0xcd10, 0x3840,
1107181614Skmacy		0xcd11, 0xc80a,
1108181614Skmacy		0xcd12, 0x000,
1109181614Skmacy		0xcd13, 0xc821,
1110181614Skmacy		0xcd14, 0x002,
1111181614Skmacy		0xcd15, 0xc822,
1112181614Skmacy		0xcd16, 0x046,
1113181614Skmacy		0xcd17, 0xc844,
1114181614Skmacy		0xcd18, 0x182f,
1115181614Skmacy		0xcd19, 0xc013,
1116181614Skmacy		0xcd1a, 0xf341,
1117181614Skmacy		0xcd1b, 0xc01a,
1118181614Skmacy		0xcd1c, 0x446,
1119181614Skmacy		0xcd1d, 0xc024,
1120181614Skmacy		0xcd1e, 0x1000,
1121181614Skmacy		0xcd1f, 0xc025,
1122181614Skmacy		0xcd20, 0xa00,
1123181614Skmacy		0xcd21, 0xc026,
1124181614Skmacy		0xcd22, 0xc0c,
1125181614Skmacy		0xcd23, 0xc027,
1126181614Skmacy		0xcd24, 0xc0c,
1127181614Skmacy		0xcd25, 0xc029,
1128181614Skmacy		0xcd26, 0x0a0,
1129181614Skmacy		0xcd27, 0xc030,
1130181614Skmacy		0xcd28, 0xa00,
1131181614Skmacy		0xcd29, 0xc03c,
1132181614Skmacy		0xcd2a, 0x01c,
1133181614Skmacy		0xcd2b, 0x000,
1134181614Skmacy		0xcd2c, 0x2b84,
1135181614Skmacy		0xcd2d, 0x3c74,
1136181614Skmacy		0xcd2e, 0x6435,
1137181614Skmacy		0xcd2f, 0xdff4,
1138181614Skmacy		0xcd30, 0x6435,
1139181614Skmacy		0xcd31, 0x2806,
1140181614Skmacy		0xcd32, 0x3006,
1141181614Skmacy		0xcd33, 0x8565,
1142181614Skmacy		0xcd34, 0x2b24,
1143181614Skmacy		0xcd35, 0x3c24,
1144181614Skmacy		0xcd36, 0x6436,
1145181614Skmacy		0xcd37, 0x1002,
1146181614Skmacy		0xcd38, 0x2b24,
1147181614Skmacy		0xcd39, 0x3c24,
1148181614Skmacy		0xcd3a, 0x6436,
1149181614Skmacy		0xcd3b, 0x4045,
1150181614Skmacy		0xcd3c, 0x8656,
1151181614Skmacy		0xcd3d, 0x1002,
1152181614Skmacy		0xcd3e, 0x2807,
1153181614Skmacy		0xcd3f, 0x31a7,
1154181614Skmacy		0xcd40, 0x20c4,
1155181614Skmacy		0xcd41, 0x3c24,
1156181614Skmacy		0xcd42, 0x6724,
1157181614Skmacy		0xcd43, 0x1002,
1158181614Skmacy		0xcd44, 0x2807,
1159181614Skmacy		0xcd45, 0x3187,
1160181614Skmacy		0xcd46, 0x20c4,
1161181614Skmacy		0xcd47, 0x3c24,
1162181614Skmacy		0xcd48, 0x6724,
1163181614Skmacy		0xcd49, 0x1002,
1164181614Skmacy		0xcd4a, 0x2514,
1165181614Skmacy		0xcd4b, 0x3c64,
1166181614Skmacy		0xcd4c, 0x6436,
1167181614Skmacy		0xcd4d, 0xdff4,
1168181614Skmacy		0xcd4e, 0x6436,
1169181614Skmacy		0xcd4f, 0x1002,
1170181614Skmacy		0xcd50, 0x2806,
1171181614Skmacy		0xcd51, 0x3cb6,
1172181614Skmacy		0xcd52, 0xc161,
1173181614Skmacy		0xcd53, 0x6134,
1174181614Skmacy		0xcd54, 0x6135,
1175181614Skmacy		0xcd55, 0x5443,
1176181614Skmacy		0xcd56, 0x303,
1177181614Skmacy		0xcd57, 0x6524,
1178181614Skmacy		0xcd58, 0x00b,
1179181614Skmacy		0xcd59, 0x1002,
1180181614Skmacy		0xcd5a, 0xd019,
1181181614Skmacy		0xcd5b, 0x2104,
1182181614Skmacy		0xcd5c, 0x3c24,
1183181614Skmacy		0xcd5d, 0x2105,
1184181614Skmacy		0xcd5e, 0x3805,
1185181614Skmacy		0xcd5f, 0x6524,
1186181614Skmacy		0xcd60, 0xdff4,
1187181614Skmacy		0xcd61, 0x4005,
1188181614Skmacy		0xcd62, 0x6524,
1189181614Skmacy		0xcd63, 0x2e8d,
1190181614Skmacy		0xcd64, 0x303d,
1191181614Skmacy		0xcd65, 0x5dd3,
1192181614Skmacy		0xcd66, 0x306,
1193181614Skmacy		0xcd67, 0x2ff7,
1194181614Skmacy		0xcd68, 0x38f7,
1195181614Skmacy		0xcd69, 0x60b7,
1196181614Skmacy		0xcd6a, 0xdffd,
1197181614Skmacy		0xcd6b, 0x00a,
1198181614Skmacy		0xcd6c, 0x1002,
1199181614Skmacy		0xcd6d, 0
1200181614Skmacy	};
1201181614Skmacy	int i, err;
1202181614Skmacy
1203181614Skmacy	err = set_phy_regs(phy, regs);
1204181614Skmacy	if (!err && modtype == phy_modtype_twinax_long)
1205181614Skmacy		err = set_phy_regs(phy, preemphasis);
1206181614Skmacy	if (err)
1207181614Skmacy		return err;
1208181614Skmacy
1209181614Skmacy	msleep(50);
1210181614Skmacy
1211181614Skmacy	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
1212181614Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
1213181614Skmacy				 twinax_edc[i + 1]);
1214181614Skmacy	if (!err)
1215181614Skmacy		phy->priv = edc_twinax;
1216181614Skmacy	return err;
1217181614Skmacy}
1218181614Skmacy
1219197791Snpstatic int ael2005_get_module_type(struct cphy *phy, int delay_ms)
1220181614Skmacy{
1221189643Sgnn	int v;
1222197791Snp	unsigned int stat;
1223181614Skmacy
1224197791Snp	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
1225197791Snp	if (v)
1226197791Snp		return v;
1227181614Skmacy
1228197791Snp	if (stat & (1 << 8))			/* module absent */
1229197791Snp		return phy_modtype_none;
1230181614Skmacy
1231197791Snp	return ael2xxx_get_module_type(phy, delay_ms);
1232181614Skmacy}
1233181614Skmacy
1234181614Skmacystatic int ael2005_intr_enable(struct cphy *phy)
1235181614Skmacy{
1236181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
1237181614Skmacy	return err ? err : t3_phy_lasi_intr_enable(phy);
1238181614Skmacy}
1239181614Skmacy
1240181614Skmacystatic int ael2005_intr_disable(struct cphy *phy)
1241181614Skmacy{
1242181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
1243181614Skmacy	return err ? err : t3_phy_lasi_intr_disable(phy);
1244181614Skmacy}
1245181614Skmacy
1246181614Skmacystatic int ael2005_intr_clear(struct cphy *phy)
1247181614Skmacy{
1248181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
1249181614Skmacy	return err ? err : t3_phy_lasi_intr_clear(phy);
1250181614Skmacy}
1251181614Skmacy
1252180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
1253180583Skmacy{
1254180583Skmacy	static struct reg_val regs0[] = {
1255180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
1256180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
1257180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
1258180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1259180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
1260180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1261180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
1262180583Skmacy		{ 0, 0, 0, 0 }
1263180583Skmacy	};
1264180583Skmacy	static struct reg_val regs1[] = {
1265180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
1266180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
1267180583Skmacy		{ 0, 0, 0, 0 }
1268180583Skmacy	};
1269180583Skmacy
1270197791Snp	int err;
1271197791Snp	unsigned int lasi_ctrl;
1272180583Skmacy
1273181614Skmacy	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
1274181614Skmacy	if (err)
1275181614Skmacy		return err;
1276181614Skmacy
1277180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
1278180583Skmacy	if (err)
1279180583Skmacy		return err;
1280180583Skmacy
1281180583Skmacy	msleep(125);
1282181614Skmacy	phy->priv = edc_none;
1283180583Skmacy	err = set_phy_regs(phy, regs0);
1284180583Skmacy	if (err)
1285180583Skmacy		return err;
1286180583Skmacy
1287180583Skmacy	msleep(50);
1288181614Skmacy
1289186282Sgnn	err = ael2005_get_module_type(phy, 0);
1290181614Skmacy	if (err < 0)
1291181614Skmacy		return err;
1292181614Skmacy	phy->modtype = (u8)err;
1293181614Skmacy
1294199238Snp	if (err == phy_modtype_none)
1295192540Sgnn		err = 0;
1296192540Sgnn	else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
1297181614Skmacy		err = ael2005_setup_twinax_edc(phy, err);
1298181614Skmacy	else
1299181614Skmacy		err = ael2005_setup_sr_edc(phy);
1300180583Skmacy	if (err)
1301180583Skmacy		return err;
1302180583Skmacy
1303181614Skmacy	err = set_phy_regs(phy, regs1);
1304180583Skmacy	if (err)
1305180583Skmacy		return err;
1306180583Skmacy
1307181614Skmacy	/* reset wipes out interrupts, reenable them if they were on */
1308181614Skmacy	if (lasi_ctrl & 1)
1309181614Skmacy		err = ael2005_intr_enable(phy);
1310181614Skmacy	return err;
1311180583Skmacy}
1312180583Skmacy
1313181614Skmacystatic int ael2005_intr_handler(struct cphy *phy)
1314181614Skmacy{
1315181614Skmacy	unsigned int stat;
1316181614Skmacy	int ret, edc_needed, cause = 0;
1317181614Skmacy
1318181614Skmacy	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
1319181614Skmacy	if (ret)
1320181614Skmacy		return ret;
1321181614Skmacy
1322181614Skmacy	if (stat & AEL2005_MODDET_IRQ) {
1323181614Skmacy		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
1324181614Skmacy				 0xd00);
1325181614Skmacy		if (ret)
1326181614Skmacy			return ret;
1327181614Skmacy
1328181614Skmacy		/* modules have max 300 ms init time after hot plug */
1329186282Sgnn		ret = ael2005_get_module_type(phy, 300);
1330181614Skmacy		if (ret < 0)
1331181614Skmacy			return ret;
1332181614Skmacy
1333181614Skmacy		phy->modtype = (u8)ret;
1334181614Skmacy		if (ret == phy_modtype_none)
1335181614Skmacy			edc_needed = phy->priv;       /* on unplug retain EDC */
1336181614Skmacy		else if (ret == phy_modtype_twinax ||
1337181614Skmacy			 ret == phy_modtype_twinax_long)
1338181614Skmacy			edc_needed = edc_twinax;
1339181614Skmacy		else
1340181614Skmacy			edc_needed = edc_sr;
1341181614Skmacy
1342181614Skmacy		if (edc_needed != phy->priv) {
1343181614Skmacy			ret = ael2005_reset(phy, 0);
1344181614Skmacy			return ret ? ret : cphy_cause_module_change;
1345181614Skmacy		}
1346181614Skmacy		cause = cphy_cause_module_change;
1347181614Skmacy	}
1348181614Skmacy
1349181614Skmacy	ret = t3_phy_lasi_intr_handler(phy);
1350189643Sgnn	if (ret < 0)
1351189643Sgnn		return ret;
1352189643Sgnn
1353189643Sgnn	ret |= cause;
1354277343Snp	if (!ret)
1355189643Sgnn		ret |= cphy_cause_link_change;
1356189643Sgnn	return ret;
1357181614Skmacy}
1358181614Skmacy
1359197791Snpstatic struct cphy_ops ael2005_ops = {
1360167514Skmacy#ifdef C99_NOT_SUPPORTED
1361180583Skmacy	ael2005_reset,
1362181614Skmacy	ael2005_intr_enable,
1363181614Skmacy	ael2005_intr_disable,
1364181614Skmacy	ael2005_intr_clear,
1365181614Skmacy	ael2005_intr_handler,
1366180583Skmacy	NULL,
1367180583Skmacy	NULL,
1368180583Skmacy	NULL,
1369180583Skmacy	NULL,
1370180583Skmacy	NULL,
1371181614Skmacy	get_link_status_r,
1372180583Skmacy	ael1002_power_down,
1373180583Skmacy#else
1374180583Skmacy	.reset           = ael2005_reset,
1375181614Skmacy	.intr_enable     = ael2005_intr_enable,
1376181614Skmacy	.intr_disable    = ael2005_intr_disable,
1377181614Skmacy	.intr_clear      = ael2005_intr_clear,
1378181614Skmacy	.intr_handler    = ael2005_intr_handler,
1379181614Skmacy	.get_link_status = get_link_status_r,
1380180583Skmacy	.power_down      = ael1002_power_down,
1381197791Snp#endif
1382180583Skmacy};
1383180583Skmacy
1384197791Snpint t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr,
1385180583Skmacy			const struct mdio_ops *mdio_ops)
1386180583Skmacy{
1387186282Sgnn	int err;
1388197791Snp	struct cphy *phy = &pinfo->phy;
1389197791Snp
1390197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2005_ops, mdio_ops,
1391181614Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
1392181614Skmacy		  SUPPORTED_IRQ, "10GBASE-R");
1393180583Skmacy	msleep(125);
1394189643Sgnn	ael_laser_down(phy, 0);
1395186282Sgnn
1396186282Sgnn	err = ael2005_get_module_type(phy, 0);
1397186282Sgnn	if (err >= 0)
1398186282Sgnn		phy->modtype = err;
1399186282Sgnn
1400180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
1401180583Skmacy				   1 << 5);
1402180583Skmacy}
1403180583Skmacy
1404181614Skmacy/*
1405197791Snp * Setup EDC and other parameters for operation with an optical module.
1406197791Snp */
1407197791Snpstatic int ael2020_setup_sr_edc(struct cphy *phy)
1408197791Snp{
1409197791Snp	static struct reg_val regs[] = {
1410197791Snp		{ MDIO_DEV_PMA_PMD, 0xcc01, 0xffff, 0x488a },
1411197791Snp
1412197791Snp		{ MDIO_DEV_PMA_PMD, 0xcb1b, 0xffff, 0x0200 },
1413197791Snp		{ MDIO_DEV_PMA_PMD, 0xcb1c, 0xffff, 0x00f0 },
1414197791Snp		{ MDIO_DEV_PMA_PMD, 0xcc06, 0xffff, 0x00e0 },
1415197791Snp
1416197791Snp		/* end */
1417197791Snp		{ 0, 0, 0, 0 }
1418197791Snp	};
1419197791Snp	int err;
1420197791Snp
1421197791Snp	err = set_phy_regs(phy, regs);
1422197791Snp	msleep(50);
1423197791Snp	if (err)
1424197791Snp		return err;
1425197791Snp
1426197791Snp	phy->priv = edc_sr;
1427197791Snp	return 0;
1428197791Snp}
1429197791Snp
1430197791Snp/*
1431197791Snp * Setup EDC and other parameters for operation with an TWINAX module.
1432197791Snp */
1433197791Snpstatic int ael2020_setup_twinax_edc(struct cphy *phy, int modtype)
1434197791Snp{
1435197791Snp	static struct reg_val uCclock40MHz[] = {
1436197791Snp		{ MDIO_DEV_PMA_PMD, 0xff28, 0xffff, 0x4001 },
1437197791Snp		{ MDIO_DEV_PMA_PMD, 0xff2a, 0xffff, 0x0002 },
1438197791Snp		{ 0, 0, 0, 0 }
1439197791Snp	};
1440197791Snp
1441197791Snp	static struct reg_val uCclockActivate[] = {
1442197791Snp		{ MDIO_DEV_PMA_PMD, 0xd000, 0xffff, 0x5200 },
1443197791Snp		{ 0, 0, 0, 0 }
1444197791Snp	};
1445197791Snp
1446197791Snp	static struct reg_val uCactivate[] = {
1447197791Snp		{ MDIO_DEV_PMA_PMD, 0xd080, 0xffff, 0x0100 },
1448197791Snp		{ MDIO_DEV_PMA_PMD, 0xd092, 0xffff, 0x0000 },
1449197791Snp		{ 0, 0, 0, 0 }
1450197791Snp	};
1451197791Snp
1452197791Snp	static u16 twinax_edc[] = {
1453197791Snp		0xd800, 0x4009,
1454197791Snp		0xd801, 0x2fff,
1455197791Snp		0xd802, 0x300f,
1456197791Snp		0xd803, 0x40aa,
1457197791Snp		0xd804, 0x401c,
1458197791Snp		0xd805, 0x401e,
1459205945Snp		0xd806, 0x20c5,
1460205945Snp		0xd807, 0x3c05,
1461205945Snp		0xd808, 0x6536,
1462205945Snp		0xd809, 0x2fe4,
1463205945Snp		0xd80a, 0x3dc4,
1464205945Snp		0xd80b, 0x6624,
1465205945Snp		0xd80c, 0x2ff4,
1466205945Snp		0xd80d, 0x3dc4,
1467205945Snp		0xd80e, 0x2035,
1468205945Snp		0xd80f, 0x30a5,
1469205945Snp		0xd810, 0x6524,
1470205945Snp		0xd811, 0x2ca2,
1471205945Snp		0xd812, 0x3012,
1472197791Snp		0xd813, 0x1002,
1473205945Snp		0xd814, 0x27e2,
1474205945Snp		0xd815, 0x3022,
1475197791Snp		0xd816, 0x1002,
1476205945Snp		0xd817, 0x28d2,
1477197791Snp		0xd818, 0x3022,
1478197791Snp		0xd819, 0x1002,
1479205945Snp		0xd81a, 0x2892,
1480197791Snp		0xd81b, 0x3012,
1481197791Snp		0xd81c, 0x1002,
1482205945Snp		0xd81d, 0x24e2,
1483197791Snp		0xd81e, 0x3022,
1484197791Snp		0xd81f, 0x1002,
1485205945Snp		0xd820, 0x27e2,
1486205945Snp		0xd821, 0x3012,
1487205945Snp		0xd822, 0x1002,
1488205945Snp		0xd823, 0x2422,
1489205945Snp		0xd824, 0x3022,
1490205945Snp		0xd825, 0x1002,
1491205945Snp		0xd826, 0x22cd,
1492205945Snp		0xd827, 0x301d,
1493205945Snp		0xd828, 0x28f2,
1494205945Snp		0xd829, 0x3022,
1495205945Snp		0xd82a, 0x1002,
1496205945Snp		0xd82b, 0x5553,
1497205945Snp		0xd82c, 0x0307,
1498205945Snp		0xd82d, 0x2572,
1499205945Snp		0xd82e, 0x3022,
1500205945Snp		0xd82f, 0x1002,
1501205945Snp		0xd830, 0x21a2,
1502197791Snp		0xd831, 0x3012,
1503197791Snp		0xd832, 0x1002,
1504205945Snp		0xd833, 0x4016,
1505205945Snp		0xd834, 0x5e63,
1506205945Snp		0xd835, 0x0344,
1507205945Snp		0xd836, 0x21a2,
1508205945Snp		0xd837, 0x3012,
1509205945Snp		0xd838, 0x1002,
1510205945Snp		0xd839, 0x400e,
1511205945Snp		0xd83a, 0x2572,
1512197791Snp		0xd83b, 0x3022,
1513197791Snp		0xd83c, 0x1002,
1514205945Snp		0xd83d, 0x2b22,
1515205945Snp		0xd83e, 0x3012,
1516197791Snp		0xd83f, 0x1002,
1517205945Snp		0xd840, 0x2842,
1518205945Snp		0xd841, 0x3022,
1519205945Snp		0xd842, 0x1002,
1520205945Snp		0xd843, 0x26e2,
1521205945Snp		0xd844, 0x3022,
1522205945Snp		0xd845, 0x1002,
1523205945Snp		0xd846, 0x2fa4,
1524205945Snp		0xd847, 0x3dc4,
1525205945Snp		0xd848, 0x6624,
1526205945Snp		0xd849, 0x2e8b,
1527205945Snp		0xd84a, 0x303b,
1528205945Snp		0xd84b, 0x56b3,
1529205945Snp		0xd84c, 0x03c6,
1530205945Snp		0xd84d, 0x866b,
1531205945Snp		0xd84e, 0x400c,
1532205945Snp		0xd84f, 0x2782,
1533205945Snp		0xd850, 0x3012,
1534205945Snp		0xd851, 0x1002,
1535205945Snp		0xd852, 0x2c4b,
1536205945Snp		0xd853, 0x309b,
1537205945Snp		0xd854, 0x56b3,
1538205945Snp		0xd855, 0x03c3,
1539205945Snp		0xd856, 0x866b,
1540205945Snp		0xd857, 0x400c,
1541205945Snp		0xd858, 0x22a2,
1542205945Snp		0xd859, 0x3022,
1543205945Snp		0xd85a, 0x1002,
1544205945Snp		0xd85b, 0x2842,
1545205945Snp		0xd85c, 0x3022,
1546205945Snp		0xd85d, 0x1002,
1547205945Snp		0xd85e, 0x26e2,
1548205945Snp		0xd85f, 0x3022,
1549205945Snp		0xd860, 0x1002,
1550205945Snp		0xd861, 0x2fb4,
1551205945Snp		0xd862, 0x3dc4,
1552205945Snp		0xd863, 0x6624,
1553205945Snp		0xd864, 0x56b3,
1554205945Snp		0xd865, 0x03c3,
1555205945Snp		0xd866, 0x866b,
1556205945Snp		0xd867, 0x401c,
1557205945Snp		0xd868, 0x2c45,
1558205945Snp		0xd869, 0x3095,
1559205945Snp		0xd86a, 0x5b53,
1560205945Snp		0xd86b, 0x23d2,
1561197791Snp		0xd86c, 0x3012,
1562205945Snp		0xd86d, 0x13c2,
1563205945Snp		0xd86e, 0x5cc3,
1564205945Snp		0xd86f, 0x2782,
1565205945Snp		0xd870, 0x3012,
1566205945Snp		0xd871, 0x1312,
1567205945Snp		0xd872, 0x2b22,
1568205945Snp		0xd873, 0x3012,
1569205945Snp		0xd874, 0x1002,
1570205945Snp		0xd875, 0x2842,
1571205945Snp		0xd876, 0x3022,
1572205945Snp		0xd877, 0x1002,
1573205945Snp		0xd878, 0x2622,
1574205945Snp		0xd879, 0x3022,
1575205945Snp		0xd87a, 0x1002,
1576205945Snp		0xd87b, 0x21a2,
1577205945Snp		0xd87c, 0x3012,
1578205945Snp		0xd87d, 0x1002,
1579205945Snp		0xd87e, 0x628f,
1580205945Snp		0xd87f, 0x2985,
1581205945Snp		0xd880, 0x33a5,
1582205945Snp		0xd881, 0x26e2,
1583205945Snp		0xd882, 0x3022,
1584205945Snp		0xd883, 0x1002,
1585205945Snp		0xd884, 0x5653,
1586205945Snp		0xd885, 0x03d2,
1587205945Snp		0xd886, 0x401e,
1588205945Snp		0xd887, 0x6f72,
1589205945Snp		0xd888, 0x1002,
1590205945Snp		0xd889, 0x628f,
1591205945Snp		0xd88a, 0x2304,
1592205945Snp		0xd88b, 0x3c84,
1593205945Snp		0xd88c, 0x6436,
1594205945Snp		0xd88d, 0xdff4,
1595205945Snp		0xd88e, 0x6436,
1596205945Snp		0xd88f, 0x2ff5,
1597205945Snp		0xd890, 0x3005,
1598205945Snp		0xd891, 0x8656,
1599205945Snp		0xd892, 0xdfba,
1600205945Snp		0xd893, 0x56a3,
1601205945Snp		0xd894, 0xd05a,
1602205945Snp		0xd895, 0x29e2,
1603205945Snp		0xd896, 0x3012,
1604205945Snp		0xd897, 0x1392,
1605205945Snp		0xd898, 0xd05a,
1606205945Snp		0xd899, 0x56a3,
1607205945Snp		0xd89a, 0xdfba,
1608205945Snp		0xd89b, 0x0383,
1609205945Snp		0xd89c, 0x6f72,
1610205945Snp		0xd89d, 0x1002,
1611205945Snp		0xd89e, 0x2a64,
1612205945Snp		0xd89f, 0x3014,
1613205945Snp		0xd8a0, 0x2005,
1614205945Snp		0xd8a1, 0x3d75,
1615205945Snp		0xd8a2, 0xc451,
1616205945Snp		0xd8a3, 0x29a2,
1617205945Snp		0xd8a4, 0x3022,
1618205945Snp		0xd8a5, 0x1002,
1619205945Snp		0xd8a6, 0x178c,
1620205945Snp		0xd8a7, 0x1898,
1621205945Snp		0xd8a8, 0x19a4,
1622205945Snp		0xd8a9, 0x1ab0,
1623205945Snp		0xd8aa, 0x1bbc,
1624205945Snp		0xd8ab, 0x1cc8,
1625205945Snp		0xd8ac, 0x1dd3,
1626205945Snp		0xd8ad, 0x1ede,
1627205945Snp		0xd8ae, 0x1fe9,
1628205945Snp		0xd8af, 0x20f4,
1629205945Snp		0xd8b0, 0x21ff,
1630205945Snp		0xd8b1, 0x0000,
1631205945Snp		0xd8b2, 0x2741,
1632205945Snp		0xd8b3, 0x3021,
1633205945Snp		0xd8b4, 0x1001,
1634205945Snp		0xd8b5, 0xc620,
1635205945Snp		0xd8b6, 0x0000,
1636205945Snp		0xd8b7, 0xc621,
1637205945Snp		0xd8b8, 0x0000,
1638205945Snp		0xd8b9, 0xc622,
1639205945Snp		0xd8ba, 0x00e2,
1640205945Snp		0xd8bb, 0xc623,
1641205945Snp		0xd8bc, 0x007f,
1642205945Snp		0xd8bd, 0xc624,
1643205945Snp		0xd8be, 0x00ce,
1644205945Snp		0xd8bf, 0xc625,
1645205945Snp		0xd8c0, 0x0000,
1646205945Snp		0xd8c1, 0xc627,
1647205945Snp		0xd8c2, 0x0000,
1648205945Snp		0xd8c3, 0xc628,
1649205945Snp		0xd8c4, 0x0000,
1650205945Snp		0xd8c5, 0xc90a,
1651205945Snp		0xd8c6, 0x3a7c,
1652205945Snp		0xd8c7, 0xc62c,
1653205945Snp		0xd8c8, 0x0000,
1654197791Snp		0xd8c9, 0x0000,
1655205945Snp		0xd8ca, 0x2741,
1656205945Snp		0xd8cb, 0x3021,
1657205945Snp		0xd8cc, 0x1001,
1658205945Snp		0xd8cd, 0xc502,
1659205945Snp		0xd8ce, 0x53ac,
1660205945Snp		0xd8cf, 0xc503,
1661205945Snp		0xd8d0, 0x2cd3,
1662205945Snp		0xd8d1, 0xc600,
1663205945Snp		0xd8d2, 0x2a6e,
1664205945Snp		0xd8d3, 0xc601,
1665205945Snp		0xd8d4, 0x2a2c,
1666205945Snp		0xd8d5, 0xc605,
1667205945Snp		0xd8d6, 0x5557,
1668205945Snp		0xd8d7, 0xc60c,
1669205945Snp		0xd8d8, 0x5400,
1670205945Snp		0xd8d9, 0xc710,
1671205945Snp		0xd8da, 0x0700,
1672205945Snp		0xd8db, 0xc711,
1673205945Snp		0xd8dc, 0x0f06,
1674205945Snp		0xd8dd, 0xc718,
1675205945Snp		0xd8de, 0x700,
1676205945Snp		0xd8df, 0xc719,
1677205945Snp		0xd8e0, 0x0f06,
1678205945Snp		0xd8e1, 0xc720,
1679205945Snp		0xd8e2, 0x4700,
1680205945Snp		0xd8e3, 0xc721,
1681205945Snp		0xd8e4, 0x0f06,
1682205945Snp		0xd8e5, 0xc728,
1683205945Snp		0xd8e6, 0x0700,
1684205945Snp		0xd8e7, 0xc729,
1685205945Snp		0xd8e8, 0x1207,
1686205945Snp		0xd8e9, 0xc801,
1687205945Snp		0xd8ea, 0x7f50,
1688205945Snp		0xd8eb, 0xc802,
1689205945Snp		0xd8ec, 0x7760,
1690205945Snp		0xd8ed, 0xc803,
1691205945Snp		0xd8ee, 0x7fce,
1692205945Snp		0xd8ef, 0xc804,
1693205945Snp		0xd8f0, 0x520e,
1694205945Snp		0xd8f1, 0xc805,
1695205945Snp		0xd8f2, 0x5c11,
1696205945Snp		0xd8f3, 0xc806,
1697205945Snp		0xd8f4, 0x3c51,
1698205945Snp		0xd8f5, 0xc807,
1699205945Snp		0xd8f6, 0x4061,
1700205945Snp		0xd8f7, 0xc808,
1701205945Snp		0xd8f8, 0x49c1,
1702205945Snp		0xd8f9, 0xc809,
1703205945Snp		0xd8fa, 0x3840,
1704205945Snp		0xd8fb, 0xc80a,
1705205945Snp		0xd8fc, 0x0000,
1706205945Snp		0xd8fd, 0xc821,
1707205945Snp		0xd8fe, 0x0002,
1708205945Snp		0xd8ff, 0xc822,
1709205945Snp		0xd900, 0x0046,
1710205945Snp		0xd901, 0xc844,
1711205945Snp		0xd902, 0x182f,
1712205945Snp		0xd903, 0xc849,
1713205945Snp		0xd904, 0x0400,
1714205945Snp		0xd905, 0xc84a,
1715205945Snp		0xd906, 0x0002,
1716205945Snp		0xd907, 0xc013,
1717205945Snp		0xd908, 0xf341,
1718205945Snp		0xd909, 0xc084,
1719205945Snp		0xd90a, 0x0030,
1720205945Snp		0xd90b, 0xc904,
1721205945Snp		0xd90c, 0x1401,
1722205945Snp		0xd90d, 0xcb0c,
1723205945Snp		0xd90e, 0x0004,
1724205945Snp		0xd90f, 0xcb0e,
1725205945Snp		0xd910, 0xa00a,
1726205945Snp		0xd911, 0xcb0f,
1727205945Snp		0xd912, 0xc0c0,
1728205945Snp		0xd913, 0xcb10,
1729205945Snp		0xd914, 0xc0c0,
1730205945Snp		0xd915, 0xcb11,
1731205945Snp		0xd916, 0x00a0,
1732205945Snp		0xd917, 0xcb12,
1733205945Snp		0xd918, 0x0007,
1734205945Snp		0xd919, 0xc241,
1735205945Snp		0xd91a, 0xa000,
1736205945Snp		0xd91b, 0xc243,
1737205945Snp		0xd91c, 0x7fe0,
1738205945Snp		0xd91d, 0xc604,
1739205945Snp		0xd91e, 0x000e,
1740205945Snp		0xd91f, 0xc609,
1741205945Snp		0xd920, 0x00f5,
1742205945Snp		0xd921, 0xc611,
1743205945Snp		0xd922, 0x000e,
1744205945Snp		0xd923, 0xc660,
1745205945Snp		0xd924, 0x9600,
1746205945Snp		0xd925, 0xc687,
1747205945Snp		0xd926, 0x0004,
1748205945Snp		0xd927, 0xc60a,
1749205945Snp		0xd928, 0x04f5,
1750205945Snp		0xd929, 0x0000,
1751205945Snp		0xd92a, 0x2741,
1752205945Snp		0xd92b, 0x3021,
1753205945Snp		0xd92c, 0x1001,
1754205945Snp		0xd92d, 0xc620,
1755205945Snp		0xd92e, 0x14e5,
1756205945Snp		0xd92f, 0xc621,
1757205945Snp		0xd930, 0xc53d,
1758205945Snp		0xd931, 0xc622,
1759205945Snp		0xd932, 0x3cbe,
1760205945Snp		0xd933, 0xc623,
1761205945Snp		0xd934, 0x4452,
1762205945Snp		0xd935, 0xc624,
1763205945Snp		0xd936, 0xc5c5,
1764205945Snp		0xd937, 0xc625,
1765205945Snp		0xd938, 0xe01e,
1766205945Snp		0xd939, 0xc627,
1767205945Snp		0xd93a, 0x0000,
1768205945Snp		0xd93b, 0xc628,
1769197791Snp		0xd93c, 0x0000,
1770205945Snp		0xd93d, 0xc62c,
1771205945Snp		0xd93e, 0x0000,
1772205945Snp		0xd93f, 0xc90a,
1773205945Snp		0xd940, 0x3a7c,
1774205945Snp		0xd941, 0x0000,
1775205945Snp		0xd942, 0x2b84,
1776205945Snp		0xd943, 0x3c74,
1777205945Snp		0xd944, 0x6435,
1778205945Snp		0xd945, 0xdff4,
1779205945Snp		0xd946, 0x6435,
1780205945Snp		0xd947, 0x2806,
1781205945Snp		0xd948, 0x3006,
1782205945Snp		0xd949, 0x8565,
1783205945Snp		0xd94a, 0x2b24,
1784205945Snp		0xd94b, 0x3c24,
1785205945Snp		0xd94c, 0x6436,
1786205945Snp		0xd94d, 0x1002,
1787205945Snp		0xd94e, 0x2b24,
1788205945Snp		0xd94f, 0x3c24,
1789205945Snp		0xd950, 0x6436,
1790205945Snp		0xd951, 0x4045,
1791205945Snp		0xd952, 0x8656,
1792205945Snp		0xd953, 0x5663,
1793205945Snp		0xd954, 0x0302,
1794205945Snp		0xd955, 0x401e,
1795205945Snp		0xd956, 0x1002,
1796205945Snp		0xd957, 0x2807,
1797205945Snp		0xd958, 0x31a7,
1798205945Snp		0xd959, 0x20c4,
1799205945Snp		0xd95a, 0x3c24,
1800205945Snp		0xd95b, 0x6724,
1801205945Snp		0xd95c, 0x2ff7,
1802205945Snp		0xd95d, 0x30f7,
1803205945Snp		0xd95e, 0x20c4,
1804205945Snp		0xd95f, 0x3c04,
1805205945Snp		0xd960, 0x6724,
1806205945Snp		0xd961, 0x1002,
1807205945Snp		0xd962, 0x2807,
1808205945Snp		0xd963, 0x3187,
1809205945Snp		0xd964, 0x20c4,
1810205945Snp		0xd965, 0x3c24,
1811205945Snp		0xd966, 0x6724,
1812205945Snp		0xd967, 0x2fe4,
1813205945Snp		0xd968, 0x3dc4,
1814205945Snp		0xd969, 0x6437,
1815205945Snp		0xd96a, 0x20c4,
1816205945Snp		0xd96b, 0x3c04,
1817205945Snp		0xd96c, 0x6724,
1818197791Snp		0xd96d, 0x1002,
1819205945Snp		0xd96e, 0x24f4,
1820205945Snp		0xd96f, 0x3c64,
1821205945Snp		0xd970, 0x6436,
1822205945Snp		0xd971, 0xdff4,
1823205945Snp		0xd972, 0x6436,
1824197791Snp		0xd973, 0x1002,
1825205945Snp		0xd974, 0x2006,
1826205945Snp		0xd975, 0x3d76,
1827205945Snp		0xd976, 0xc161,
1828205945Snp		0xd977, 0x6134,
1829205945Snp		0xd978, 0x6135,
1830205945Snp		0xd979, 0x5443,
1831205945Snp		0xd97a, 0x0303,
1832205945Snp		0xd97b, 0x6524,
1833205945Snp		0xd97c, 0x00fb,
1834205945Snp		0xd97d, 0x1002,
1835205945Snp		0xd97e, 0x20d4,
1836205945Snp		0xd97f, 0x3c24,
1837205945Snp		0xd980, 0x2025,
1838205945Snp		0xd981, 0x3005,
1839205945Snp		0xd982, 0x6524,
1840205945Snp		0xd983, 0x1002,
1841205945Snp		0xd984, 0xd019,
1842205945Snp		0xd985, 0x2104,
1843205945Snp		0xd986, 0x3c24,
1844205945Snp		0xd987, 0x2105,
1845205945Snp		0xd988, 0x3805,
1846205945Snp		0xd989, 0x6524,
1847205945Snp		0xd98a, 0xdff4,
1848205945Snp		0xd98b, 0x4005,
1849205945Snp		0xd98c, 0x6524,
1850205945Snp		0xd98d, 0x2e8d,
1851205945Snp		0xd98e, 0x303d,
1852205945Snp		0xd98f, 0x2408,
1853205945Snp		0xd990, 0x35d8,
1854205945Snp		0xd991, 0x5dd3,
1855205945Snp		0xd992, 0x0307,
1856205945Snp		0xd993, 0x8887,
1857205945Snp		0xd994, 0x63a7,
1858205945Snp		0xd995, 0x8887,
1859205945Snp		0xd996, 0x63a7,
1860205945Snp		0xd997, 0xdffd,
1861205945Snp		0xd998, 0x00f9,
1862205945Snp		0xd999, 0x1002,
1863205945Snp		0xd99a, 0x866a,
1864205945Snp		0xd99b, 0x6138,
1865205945Snp		0xd99c, 0x5883,
1866205945Snp		0xd99d, 0x2aa2,
1867205945Snp		0xd99e, 0x3022,
1868205945Snp		0xd99f, 0x1302,
1869205945Snp		0xd9a0, 0x2ff7,
1870205945Snp		0xd9a1, 0x3007,
1871205945Snp		0xd9a2, 0x8785,
1872205945Snp		0xd9a3, 0xb887,
1873205945Snp		0xd9a4, 0x8786,
1874205945Snp		0xd9a5, 0xb8c6,
1875205945Snp		0xd9a6, 0x5a53,
1876205945Snp		0xd9a7, 0x29b2,
1877205945Snp		0xd9a8, 0x3022,
1878205945Snp		0xd9a9, 0x13c2,
1879205945Snp		0xd9aa, 0x2474,
1880205945Snp		0xd9ab, 0x3c84,
1881205945Snp		0xd9ac, 0x64d7,
1882205945Snp		0xd9ad, 0x64d7,
1883205945Snp		0xd9ae, 0x2ff5,
1884205945Snp		0xd9af, 0x3c05,
1885205945Snp		0xd9b0, 0x8757,
1886205945Snp		0xd9b1, 0xb886,
1887205945Snp		0xd9b2, 0x9767,
1888205945Snp		0xd9b3, 0x67c4,
1889205945Snp		0xd9b4, 0x6f72,
1890205945Snp		0xd9b5, 0x1002,
1891205945Snp		0xd9b6, 0x0000,
1892197791Snp	};
1893197791Snp	int i, err;
1894197791Snp
1895197791Snp	/* set uC clock and activate it */
1896197791Snp	err = set_phy_regs(phy, uCclock40MHz);
1897197791Snp	msleep(500);
1898197791Snp	if (err)
1899197791Snp		return err;
1900197791Snp	err = set_phy_regs(phy, uCclockActivate);
1901197791Snp	msleep(500);
1902197791Snp	if (err)
1903197791Snp		return err;
1904197791Snp
1905197791Snp	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
1906197791Snp		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
1907197791Snp				 twinax_edc[i + 1]);
1908197791Snp	/* activate uC */
1909197791Snp	err = set_phy_regs(phy, uCactivate);
1910197791Snp	if (!err)
1911197791Snp		phy->priv = edc_twinax;
1912197791Snp	return err;
1913197791Snp}
1914197791Snp
1915197791Snp/*
1916197791Snp * Return Module Type.
1917197791Snp */
1918197791Snpstatic int ael2020_get_module_type(struct cphy *phy, int delay_ms)
1919197791Snp{
1920197791Snp	int v;
1921197791Snp	unsigned int stat;
1922197791Snp
1923197791Snp	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_STAT, &stat);
1924197791Snp	if (v)
1925197791Snp		return v;
1926197791Snp
1927197791Snp	if (stat & (0x1 << (AEL2020_GPIO_MODDET*4))) {
1928197791Snp		/* module absent */
1929197791Snp		return phy_modtype_none;
1930197791Snp	}
1931197791Snp
1932197791Snp	return ael2xxx_get_module_type(phy, delay_ms);
1933197791Snp}
1934197791Snp
1935197791Snp/*
1936197791Snp * Enable PHY interrupts.  We enable "Module Detection" interrupts (on any
1937197791Snp * state transition) and then generic Link Alarm Status Interrupt (LASI).
1938197791Snp */
1939197791Snpstatic int ael2020_intr_enable(struct cphy *phy)
1940197791Snp{
1941197791Snp	struct reg_val regs[] = {
1942197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CFG+AEL2020_GPIO_LSTAT,
1943197791Snp			0xffff, 0x4 },
1944197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1945197791Snp			0xffff, 0x8 << (AEL2020_GPIO_LSTAT*4) },
1946197791Snp
1947197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1948197791Snp			0xffff, 0x2 << (AEL2020_GPIO_MODDET*4) },
1949197791Snp
1950197791Snp		/* end */
1951197791Snp		{ 0, 0, 0, 0 }
1952197791Snp	};
1953197791Snp	int err;
1954197791Snp
1955197791Snp	err = set_phy_regs(phy, regs);
1956197791Snp	if (err)
1957197791Snp		return err;
1958197791Snp
1959197791Snp	/* enable standard Link Alarm Status Interrupts */
1960197791Snp	err = t3_phy_lasi_intr_enable(phy);
1961197791Snp	if (err)
1962197791Snp		return err;
1963197791Snp
1964197791Snp	return 0;
1965197791Snp}
1966197791Snp
1967197791Snp/*
1968197791Snp * Disable PHY interrupts.  The mirror of the above ...
1969197791Snp */
1970197791Snpstatic int ael2020_intr_disable(struct cphy *phy)
1971197791Snp{
1972197791Snp	struct reg_val regs[] = {
1973197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1974197791Snp			0xffff, 0xb << (AEL2020_GPIO_LSTAT*4) },
1975197791Snp
1976197791Snp		{ MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL,
1977197791Snp			0xffff, 0x1 << (AEL2020_GPIO_MODDET*4) },
1978197791Snp
1979197791Snp		/* end */
1980197791Snp		{ 0, 0, 0, 0 }
1981197791Snp	};
1982197791Snp	int err;
1983197791Snp
1984197791Snp	err = set_phy_regs(phy, regs);
1985197791Snp	if (err)
1986197791Snp		return err;
1987197791Snp
1988197791Snp	/* disable standard Link Alarm Status Interrupts */
1989197791Snp	return t3_phy_lasi_intr_disable(phy);
1990197791Snp}
1991197791Snp
1992197791Snp/*
1993197791Snp * Clear PHY interrupt state.
1994197791Snp */
1995197791Snpstatic int ael2020_intr_clear(struct cphy *phy)
1996197791Snp{
1997197791Snp	unsigned int stat;
1998197791Snp	int err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat);
1999197791Snp	return err ? err : t3_phy_lasi_intr_clear(phy);
2000197791Snp}
2001197791Snp
2002197791Snp/*
2003197791Snp * Common register settings for the AEL2020 when it comes out of reset.
2004197791Snp */
2005197791Snpstatic struct reg_val ael2020_reset_regs[] = {
2006197791Snp	{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x3101 },
2007197791Snp
2008197791Snp	{ MDIO_DEV_PMA_PMD, 0xcd40, 0xffff, 0x0001 },
2009197791Snp
2010205945Snp	{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0x0100 },
2011205945Snp	{ MDIO_DEV_PMA_PMD, 0xca22, 0xffff, 0x0100 },
2012205945Snp	{ MDIO_DEV_PMA_PMD, 0xca42, 0xffff, 0x0100 },
2013197791Snp	{ MDIO_DEV_PMA_PMD, 0xff02, 0xffff, 0x0023 },
2014197791Snp	{ MDIO_DEV_PMA_PMD, 0xff03, 0xffff, 0x0000 },
2015197791Snp	{ MDIO_DEV_PMA_PMD, 0xff04, 0xffff, 0x0000 },
2016197791Snp
2017205945Snp	{ MDIO_DEV_PMA_PMD, 0xc20d, 0xffff, 0x0002 },
2018197791Snp	/* end */
2019197791Snp	{ 0, 0, 0, 0 }
2020197791Snp};
2021197791Snp
2022197791Snp/*
2023197791Snp * Reset the PHY and put it into a canonical operating state.
2024197791Snp */
2025197791Snpstatic int ael2020_reset(struct cphy *phy, int wait)
2026197791Snp{
2027197791Snp	int err;
2028197791Snp	unsigned int lasi_ctrl;
2029197791Snp
2030197791Snp	/* grab current interrupt state */
2031197791Snp	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
2032197791Snp	if (err)
2033197791Snp		return err;
2034197791Snp
2035197791Snp	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 125);
2036197791Snp	if (err)
2037197791Snp		return err;
2038197791Snp	msleep(100);
2039197791Snp
2040197791Snp	/* basic initialization for all module types */
2041197791Snp	phy->priv = edc_none;
2042197791Snp	err = set_phy_regs(phy, ael2020_reset_regs);
2043197791Snp	if (err)
2044197791Snp		return err;
2045205945Snp	msleep(100);
2046197791Snp
2047197791Snp	/* determine module type and perform appropriate initialization */
2048197791Snp	err = ael2020_get_module_type(phy, 0);
2049197791Snp	if (err < 0)
2050197791Snp		return err;
2051197791Snp	phy->modtype = (u8)err;
2052199238Snp	if (err == phy_modtype_none)
2053197791Snp		err = 0;
2054197791Snp	else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
2055197791Snp		err = ael2020_setup_twinax_edc(phy, err);
2056197791Snp	else
2057197791Snp		err = ael2020_setup_sr_edc(phy);
2058197791Snp	if (err)
2059197791Snp		return err;
2060197791Snp
2061197791Snp	/* reset wipes out interrupts, reenable them if they were on */
2062197791Snp	if (lasi_ctrl & 1)
2063197791Snp		err = ael2020_intr_enable(phy);
2064197791Snp	return err;
2065197791Snp}
2066197791Snp
2067197791Snp/*
2068197791Snp * Handle a PHY interrupt.
2069197791Snp */
2070197791Snpstatic int ael2020_intr_handler(struct cphy *phy)
2071197791Snp{
2072197791Snp	unsigned int stat;
2073197791Snp	int ret, edc_needed, cause = 0;
2074197791Snp
2075197791Snp	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat);
2076197791Snp	if (ret)
2077197791Snp		return ret;
2078197791Snp
2079197791Snp	if (stat & (0x1 << AEL2020_GPIO_MODDET)) {
2080197791Snp		/* modules have max 300 ms init time after hot plug */
2081197791Snp		ret = ael2020_get_module_type(phy, 300);
2082197791Snp		if (ret < 0)
2083197791Snp			return ret;
2084197791Snp
2085197791Snp		phy->modtype = (u8)ret;
2086197791Snp		if (ret == phy_modtype_none)
2087197791Snp			edc_needed = phy->priv;       /* on unplug retain EDC */
2088197791Snp		else if (ret == phy_modtype_twinax ||
2089197791Snp			 ret == phy_modtype_twinax_long)
2090197791Snp			edc_needed = edc_twinax;
2091197791Snp		else
2092197791Snp			edc_needed = edc_sr;
2093197791Snp
2094197791Snp		if (edc_needed != phy->priv) {
2095197791Snp			ret = ael2020_reset(phy, 0);
2096197791Snp			return ret ? ret : cphy_cause_module_change;
2097197791Snp		}
2098197791Snp		cause = cphy_cause_module_change;
2099197791Snp	}
2100197791Snp
2101197791Snp	ret = t3_phy_lasi_intr_handler(phy);
2102197791Snp	if (ret < 0)
2103197791Snp		return ret;
2104197791Snp
2105197791Snp	ret |= cause;
2106197791Snp	if (!ret)
2107197791Snp		ret |= cphy_cause_link_change;
2108197791Snp	return ret;
2109197791Snp}
2110197791Snp
2111197791Snpstatic struct cphy_ops ael2020_ops = {
2112197791Snp#ifdef C99_NOT_SUPPORTED
2113197791Snp	ael2020_reset,
2114197791Snp	ael2020_intr_enable,
2115197791Snp	ael2020_intr_disable,
2116197791Snp	ael2020_intr_clear,
2117197791Snp	ael2020_intr_handler,
2118197791Snp	NULL,
2119197791Snp	NULL,
2120197791Snp	NULL,
2121197791Snp	NULL,
2122197791Snp	NULL,
2123197791Snp	get_link_status_r,
2124197791Snp	ael1002_power_down,
2125197791Snp#else
2126197791Snp	.reset           = ael2020_reset,
2127197791Snp	.intr_enable     = ael2020_intr_enable,
2128197791Snp	.intr_disable    = ael2020_intr_disable,
2129197791Snp	.intr_clear      = ael2020_intr_clear,
2130197791Snp	.intr_handler    = ael2020_intr_handler,
2131197791Snp	.get_link_status = get_link_status_r,
2132197791Snp	.power_down      = ael1002_power_down,
2133197791Snp#endif
2134197791Snp};
2135197791Snp
2136197791Snpint t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr,
2137197791Snp			const struct mdio_ops *mdio_ops)
2138197791Snp{
2139197791Snp	int err;
2140197791Snp	struct cphy *phy = &pinfo->phy;
2141197791Snp
2142197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2020_ops, mdio_ops,
2143197791Snp		SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
2144197791Snp		  SUPPORTED_IRQ, "10GBASE-R");
2145197791Snp	msleep(125);
2146197791Snp
2147197791Snp	err = set_phy_regs(phy, ael2020_reset_regs);
2148197791Snp	if (err)
2149197791Snp		return err;
2150205945Snp	msleep(100);
2151205945Snp
2152197791Snp	err = ael2020_get_module_type(phy, 0);
2153197791Snp	if (err >= 0)
2154197791Snp		phy->modtype = err;
2155197791Snp
2156197791Snp	ael_laser_down(phy, 0);
2157197791Snp	return 0;
2158197791Snp}
2159197791Snp
2160197791Snp/*
2161181614Skmacy * Get link status for a 10GBASE-X device.
2162181614Skmacy */
2163277343Snpstatic int get_link_status_x(struct cphy *phy, int *link_state, int *speed,
2164181614Skmacy			     int *duplex, int *fc)
2165181614Skmacy{
2166277343Snp	if (link_state) {
2167181614Skmacy		unsigned int stat0, stat1, stat2;
2168181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
2169181614Skmacy
2170181614Skmacy		if (!err)
2171181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
2172181614Skmacy		if (!err)
2173181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
2174181614Skmacy		if (err)
2175181614Skmacy			return err;
2176277343Snp		if ((stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1)
2177277343Snp			*link_state = PHY_LINK_UP;
2178277343Snp		else
2179277343Snp			*link_state = PHY_LINK_DOWN;
2180181614Skmacy	}
2181181614Skmacy	if (speed)
2182181614Skmacy		*speed = SPEED_10000;
2183181614Skmacy	if (duplex)
2184181614Skmacy		*duplex = DUPLEX_FULL;
2185181614Skmacy	return 0;
2186181614Skmacy}
2187181614Skmacy
2188180583Skmacy#ifdef C99_NOT_SUPPORTED
2189167514Skmacystatic struct cphy_ops qt2045_ops = {
2190167514Skmacy	ael1006_reset,
2191180583Skmacy	t3_phy_lasi_intr_enable,
2192180583Skmacy	t3_phy_lasi_intr_disable,
2193180583Skmacy	t3_phy_lasi_intr_clear,
2194180583Skmacy	t3_phy_lasi_intr_handler,
2195167514Skmacy	NULL,
2196167514Skmacy	NULL,
2197167514Skmacy	NULL,
2198167514Skmacy	NULL,
2199167514Skmacy	NULL,
2200181614Skmacy	get_link_status_x,
2201197791Snp	ael1002_power_down,
2202167514Skmacy};
2203167514Skmacy#else
2204167514Skmacystatic struct cphy_ops qt2045_ops = {
2205167514Skmacy	.reset           = ael1006_reset,
2206180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
2207180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
2208180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
2209180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
2210181614Skmacy	.get_link_status = get_link_status_x,
2211197791Snp	.power_down      = ael1002_power_down,
2212167514Skmacy};
2213167514Skmacy#endif
2214167514Skmacy
2215197791Snpint t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr,
2216176472Skmacy		       const struct mdio_ops *mdio_ops)
2217167514Skmacy{
2218167514Skmacy	unsigned int stat;
2219197791Snp	struct cphy *phy = &pinfo->phy;
2220167514Skmacy
2221197791Snp	cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &qt2045_ops, mdio_ops,
2222176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
2223176472Skmacy		  "10GBASE-CX4");
2224167514Skmacy
2225167514Skmacy	/*
2226167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
2227167514Skmacy	 * have it at 1.
2228167514Skmacy	 */
2229167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
2230167514Skmacy	    stat == 0xffff)
2231167514Skmacy		phy->addr = 1;
2232176472Skmacy	return 0;
2233167514Skmacy}
2234167514Skmacy
2235167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
2236167514Skmacy{
2237167514Skmacy	return 0;
2238167514Skmacy}
2239167514Skmacy
2240277343Snpstatic int xaui_direct_get_link_status(struct cphy *phy, int *link_state,
2241167514Skmacy				       int *speed, int *duplex, int *fc)
2242167514Skmacy{
2243277343Snp	if (link_state) {
2244167514Skmacy		unsigned int status;
2245197791Snp		adapter_t *adapter = phy->adapter;
2246189643Sgnn
2247197791Snp		status = t3_read_reg(adapter,
2248170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
2249197791Snp			 t3_read_reg(adapter,
2250170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
2251197791Snp			 t3_read_reg(adapter,
2252170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
2253197791Snp			 t3_read_reg(adapter,
2254170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
2255277343Snp		*link_state = status & F_LOWSIG0 ? PHY_LINK_DOWN : PHY_LINK_UP;
2256167514Skmacy	}
2257167514Skmacy	if (speed)
2258167514Skmacy		*speed = SPEED_10000;
2259167514Skmacy	if (duplex)
2260167514Skmacy		*duplex = DUPLEX_FULL;
2261167514Skmacy	return 0;
2262167514Skmacy}
2263167514Skmacy
2264167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
2265167514Skmacy{
2266167514Skmacy	return 0;
2267167514Skmacy}
2268167514Skmacy
2269167514Skmacy#ifdef C99_NOT_SUPPORTED
2270167514Skmacystatic struct cphy_ops xaui_direct_ops = {
2271167514Skmacy	xaui_direct_reset,
2272167514Skmacy	ael1002_intr_noop,
2273167514Skmacy	ael1002_intr_noop,
2274167514Skmacy	ael1002_intr_noop,
2275167514Skmacy	ael1002_intr_noop,
2276167514Skmacy	NULL,
2277167514Skmacy	NULL,
2278167514Skmacy	NULL,
2279167514Skmacy	NULL,
2280167514Skmacy	NULL,
2281167514Skmacy	xaui_direct_get_link_status,
2282167514Skmacy	xaui_direct_power_down,
2283167514Skmacy};
2284167514Skmacy#else
2285167514Skmacystatic struct cphy_ops xaui_direct_ops = {
2286167514Skmacy	.reset           = xaui_direct_reset,
2287167514Skmacy	.intr_enable     = ael1002_intr_noop,
2288167514Skmacy	.intr_disable    = ael1002_intr_noop,
2289167514Skmacy	.intr_clear      = ael1002_intr_noop,
2290167514Skmacy	.intr_handler    = ael1002_intr_noop,
2291167514Skmacy	.get_link_status = xaui_direct_get_link_status,
2292167514Skmacy	.power_down      = xaui_direct_power_down,
2293167514Skmacy};
2294167514Skmacy#endif
2295167514Skmacy
2296197791Snpint t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr,
2297176472Skmacy			    const struct mdio_ops *mdio_ops)
2298167514Skmacy{
2299197791Snp	cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &xaui_direct_ops, mdio_ops,
2300176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
2301176472Skmacy		  "10GBASE-CX4");
2302176472Skmacy	return 0;
2303167514Skmacy}
2304