cxgb_ael1002.c revision 186282
1167514Skmacy/**************************************************************************
2167514Skmacy
3177340SkmacyCopyright (c) 2007-2008, 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 186282 2008-12-18 14:21:35Z gnn $");
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,
48167514Skmacy	AEL1002_PWR_DOWN_HI = 0xc011,
49167514Skmacy	AEL1002_PWR_DOWN_LO = 0xc012,
50167514Skmacy	AEL1002_XFI_EQL     = 0xc015,
51167514Skmacy	AEL1002_LB_EN       = 0xc017,
52180583Skmacy	AEL_OPT_SETTINGS    = 0xc017,
53181614Skmacy	AEL_I2C_CTRL        = 0xc30a,
54181614Skmacy	AEL_I2C_DATA        = 0xc30b,
55181614Skmacy	AEL_I2C_STAT        = 0xc30c,
56181614Skmacy	AEL2005_GPIO_CTRL   = 0xc214,
57181614Skmacy	AEL2005_GPIO_STAT   = 0xc215,
58180583Skmacy};
59167514Skmacy
60181614Skmacyenum { edc_none, edc_sr, edc_twinax };
61181614Skmacy
62181614Skmacy/* PHY module I2C device address */
63181614Skmacy#define MODULE_DEV_ADDR 0xa0
64181614Skmacy
65181614Skmacy#define AEL2005_MODDET_IRQ 4
66181614Skmacy
67180583Skmacystruct reg_val {
68180583Skmacy	unsigned short mmd_addr;
69180583Skmacy	unsigned short reg_addr;
70180583Skmacy	unsigned short clear_bits;
71180583Skmacy	unsigned short set_bits;
72167514Skmacy};
73167514Skmacy
74186282Sgnnstatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr);
75186282Sgnn
76186282Sgnnstatic int get_module_type (struct cphy *phy, int hint)
77186282Sgnn{
78186282Sgnn	int v;
79186282Sgnn
80186282Sgnn	v = hint ? hint : ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0);
81186282Sgnn	if (v < 0)
82186282Sgnn		return v;
83186282Sgnn
84186282Sgnn	if (v == 0x3) {
85186282Sgnn		/* SFP: see SFF-8472 for below */
86186282Sgnn		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3);
87186282Sgnn		if (v < 0)
88186282Sgnn			return v;
89186282Sgnn
90186282Sgnn		if (v == 0x1)
91186282Sgnn			return phy_modtype_twinax;
92186282Sgnn		if (v == 0x10)
93186282Sgnn			return phy_modtype_sr;
94186282Sgnn		if (v == 0x20)
95186282Sgnn			return phy_modtype_lr;
96186282Sgnn		if (v == 0x40)
97186282Sgnn			return phy_modtype_lrm;
98186282Sgnn
99186282Sgnn		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6);
100186282Sgnn		if (v < 0)
101186282Sgnn			return v;
102186282Sgnn		if (v != 4)
103186282Sgnn			return phy_modtype_unknown;
104186282Sgnn
105186282Sgnn		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10);
106186282Sgnn		if (v < 0)
107186282Sgnn			return v;
108186282Sgnn
109186282Sgnn		if (v & 0x80) {
110186282Sgnn			v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
111186282Sgnn			if (v < 0)
112186282Sgnn				return v;
113186282Sgnn			return v > 10 ? phy_modtype_twinax_long :
114186282Sgnn			    phy_modtype_twinax;
115186282Sgnn		}
116186282Sgnn	} else if (v == 0x6) {
117186282Sgnn		/* XFP: See INF-8077i for details. */
118186282Sgnn
119186282Sgnn		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 127);
120186282Sgnn		if (v < 0)
121186282Sgnn			return v;
122186282Sgnn
123186282Sgnn		if (v != 1) {
124186282Sgnn			/* XXX: set page select to table 1 yourself */
125186282Sgnn			return phy_modtype_unknown;
126186282Sgnn		}
127186282Sgnn
128186282Sgnn		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 131);
129186282Sgnn		if (v < 0)
130186282Sgnn			return v;
131186282Sgnn		if (v == 0x10)
132186282Sgnn			return phy_modtype_lrm;
133186282Sgnn		if (v == 0x40)
134186282Sgnn			return phy_modtype_lr;
135186282Sgnn		if (v == 0x80)
136186282Sgnn			return phy_modtype_sr;
137186282Sgnn	}
138186282Sgnn
139186282Sgnn	return phy_modtype_unknown;
140186282Sgnn}
141186282Sgnn
142180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv)
143180583Skmacy{
144180583Skmacy	int err;
145180583Skmacy
146180583Skmacy	for (err = 0; rv->mmd_addr && !err; rv++) {
147180583Skmacy		if (rv->clear_bits == 0xffff)
148180583Skmacy			err = mdio_write(phy, rv->mmd_addr, rv->reg_addr,
149180583Skmacy					 rv->set_bits);
150180583Skmacy		else
151180583Skmacy			err = t3_mdio_change_bits(phy, rv->mmd_addr,
152180583Skmacy						  rv->reg_addr, rv->clear_bits,
153180583Skmacy						  rv->set_bits);
154180583Skmacy	}
155180583Skmacy	return err;
156180583Skmacy}
157180583Skmacy
158167514Skmacystatic void ael100x_txon(struct cphy *phy)
159167514Skmacy{
160167514Skmacy	int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL;
161167514Skmacy
162176472Skmacy	msleep(100);
163167514Skmacy	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio);
164176472Skmacy	msleep(30);
165167514Skmacy}
166167514Skmacy
167167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable)
168167514Skmacy{
169167514Skmacy	int err;
170167514Skmacy
171167514Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable);
172167514Skmacy	if (!err)
173167514Skmacy		err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
174167514Skmacy					  BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
175167514Skmacy	return err;
176167514Skmacy}
177167514Skmacy
178186282Sgnnstatic int ael1002_get_module_type(struct cphy *phy, int delay_ms)
179186282Sgnn{
180186282Sgnn	int v;
181186282Sgnn
182186282Sgnn	if (delay_ms)
183186282Sgnn		msleep(delay_ms);
184186282Sgnn
185186282Sgnn	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0);
186186282Sgnn
187186282Sgnn	return v == -ETIMEDOUT ? phy_modtype_none : get_module_type(phy, v);
188186282Sgnn}
189186282Sgnn
190167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait)
191167514Skmacy{
192167514Skmacy	int err;
193167514Skmacy
194167514Skmacy	if ((err = ael1002_power_down(phy, 0)) ||
195167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) ||
196167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) ||
197167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) ||
198167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) ||
199167514Skmacy	    (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN,
200167514Skmacy				       0, 1 << 5)))
201167514Skmacy		return err;
202186282Sgnn
203186282Sgnn	err = ael1002_get_module_type(phy, 300);
204186282Sgnn	if (err >= 0)
205186282Sgnn		phy->modtype = err;
206186282Sgnn
207167514Skmacy	return 0;
208167514Skmacy}
209167514Skmacy
210167514Skmacystatic int ael1002_intr_noop(struct cphy *phy)
211167514Skmacy{
212167514Skmacy	return 0;
213167514Skmacy}
214167514Skmacy
215181614Skmacy/*
216181614Skmacy * Get link status for a 10GBASE-R device.
217181614Skmacy */
218181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed,
219181614Skmacy			     int *duplex, int *fc)
220167514Skmacy{
221167514Skmacy	if (link_ok) {
222181614Skmacy		unsigned int stat0, stat1, stat2;
223181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
224167514Skmacy
225181614Skmacy		if (!err)
226181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1);
227181614Skmacy		if (!err)
228181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
229167514Skmacy		if (err)
230167514Skmacy			return err;
231181614Skmacy		*link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1;
232167514Skmacy	}
233167514Skmacy	if (speed)
234167514Skmacy		*speed = SPEED_10000;
235167514Skmacy	if (duplex)
236167514Skmacy		*duplex = DUPLEX_FULL;
237167514Skmacy	return 0;
238167514Skmacy}
239167514Skmacy
240167514Skmacy#ifdef C99_NOT_SUPPORTED
241167514Skmacystatic struct cphy_ops ael1002_ops = {
242167514Skmacy	ael1002_reset,
243167514Skmacy	ael1002_intr_noop,
244167514Skmacy	ael1002_intr_noop,
245167514Skmacy	ael1002_intr_noop,
246167514Skmacy	ael1002_intr_noop,
247167514Skmacy	NULL,
248167514Skmacy	NULL,
249167514Skmacy	NULL,
250167514Skmacy	NULL,
251167514Skmacy	NULL,
252181614Skmacy	get_link_status_r,
253167514Skmacy	ael1002_power_down,
254167514Skmacy};
255167514Skmacy#else
256167514Skmacystatic struct cphy_ops ael1002_ops = {
257167514Skmacy	.reset           = ael1002_reset,
258167514Skmacy	.intr_enable     = ael1002_intr_noop,
259167514Skmacy	.intr_disable    = ael1002_intr_noop,
260167514Skmacy	.intr_clear      = ael1002_intr_noop,
261167514Skmacy	.intr_handler    = ael1002_intr_noop,
262181614Skmacy	.get_link_status = get_link_status_r,
263167514Skmacy	.power_down      = ael1002_power_down,
264167514Skmacy};
265167514Skmacy#endif
266167514Skmacy
267176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
268176472Skmacy			const struct mdio_ops *mdio_ops)
269167514Skmacy{
270186282Sgnn	int err;
271186282Sgnn
272176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops,
273176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
274177340Skmacy		  "10GBASE-R");
275167514Skmacy	ael100x_txon(phy);
276186282Sgnn
277186282Sgnn	err = ael1002_get_module_type(phy, 0);
278186282Sgnn	if (err >= 0)
279186282Sgnn		phy->modtype = err;
280186282Sgnn
281176472Skmacy	return 0;
282167514Skmacy}
283167514Skmacy
284167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait)
285167514Skmacy{
286185157Sgnn	u32 gpio_out;
287185157Sgnn	t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
288185157Sgnn	/* Hack to reset the phy correctly */
289185157Sgnn	/* Read out the current value */
290185157Sgnn	gpio_out = t3_read_reg(phy->adapter, A_T3DBG_GPIO_EN);
291185157Sgnn	/* Reset the phy */
292185157Sgnn	gpio_out &= ~F_GPIO6_OUT_VAL;
293185157Sgnn	t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out);
294185157Sgnn	msleep(125);
295185157Sgnn	/* Take the phy out of reset */
296185157Sgnn	gpio_out |= F_GPIO6_OUT_VAL;
297185157Sgnn	t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out);
298185157Sgnn	msleep(125);
299185157Sgnn	t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
300185620Sgnn
301185620Sgnn       /* Phy loopback work around for ael1006 */
302185620Sgnn       /* Soft reset phy by toggling loopback  */
303185620Sgnn       msleep(125);
304185620Sgnn       /* Put phy into local loopback */
305185620Sgnn       t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 0, 1);
306185620Sgnn       msleep(125);
307185620Sgnn       /* Take phy out of local loopback */
308185620Sgnn       t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0);
309185620Sgnn
310185157Sgnn	return 0;
311167514Skmacy}
312167514Skmacy
313167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable)
314167514Skmacy{
315167514Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
316167514Skmacy				   BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
317167514Skmacy}
318167514Skmacy
319167514Skmacy#ifdef C99_NOT_SUPPORTED
320167514Skmacystatic struct cphy_ops ael1006_ops = {
321167514Skmacy	ael1006_reset,
322180583Skmacy	t3_phy_lasi_intr_enable,
323180583Skmacy	t3_phy_lasi_intr_disable,
324180583Skmacy	t3_phy_lasi_intr_clear,
325180583Skmacy	t3_phy_lasi_intr_handler,
326167514Skmacy	NULL,
327167514Skmacy	NULL,
328167514Skmacy	NULL,
329167514Skmacy	NULL,
330167514Skmacy	NULL,
331181614Skmacy	get_link_status_r,
332167514Skmacy	ael1006_power_down,
333167514Skmacy};
334167514Skmacy#else
335167514Skmacystatic struct cphy_ops ael1006_ops = {
336167514Skmacy	.reset           = ael1006_reset,
337180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
338180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
339180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
340180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
341181614Skmacy	.get_link_status = get_link_status_r,
342167514Skmacy	.power_down      = ael1006_power_down,
343167514Skmacy};
344167514Skmacy#endif
345167514Skmacy
346176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
347176472Skmacy			const struct mdio_ops *mdio_ops)
348167514Skmacy{
349176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops,
350176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
351176472Skmacy		  "10GBASE-SR");
352167514Skmacy	ael100x_txon(phy);
353176472Skmacy	return 0;
354167514Skmacy}
355167514Skmacy
356180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
357180583Skmacy{
358181614Skmacy	static struct reg_val regs[] = {
359181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
360181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
361181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
362181614Skmacy		{ 0, 0, 0, 0 }
363181614Skmacy	};
364180583Skmacy	static u16 sr_edc[] = {
365180583Skmacy		0xcc00, 0x2ff4,
366180583Skmacy		0xcc01, 0x3cd4,
367180583Skmacy		0xcc02, 0x2015,
368180583Skmacy		0xcc03, 0x3105,
369180583Skmacy		0xcc04, 0x6524,
370180583Skmacy		0xcc05, 0x27ff,
371180583Skmacy		0xcc06, 0x300f,
372180583Skmacy		0xcc07, 0x2c8b,
373180583Skmacy		0xcc08, 0x300b,
374180583Skmacy		0xcc09, 0x4009,
375180583Skmacy		0xcc0a, 0x400e,
376180583Skmacy		0xcc0b, 0x2f72,
377180583Skmacy		0xcc0c, 0x3002,
378180583Skmacy		0xcc0d, 0x1002,
379180583Skmacy		0xcc0e, 0x2172,
380180583Skmacy		0xcc0f, 0x3012,
381180583Skmacy		0xcc10, 0x1002,
382180583Skmacy		0xcc11, 0x25d2,
383180583Skmacy		0xcc12, 0x3012,
384180583Skmacy		0xcc13, 0x1002,
385180583Skmacy		0xcc14, 0xd01e,
386180583Skmacy		0xcc15, 0x27d2,
387180583Skmacy		0xcc16, 0x3012,
388180583Skmacy		0xcc17, 0x1002,
389180583Skmacy		0xcc18, 0x2004,
390180583Skmacy		0xcc19, 0x3c84,
391180583Skmacy		0xcc1a, 0x6436,
392180583Skmacy		0xcc1b, 0x2007,
393180583Skmacy		0xcc1c, 0x3f87,
394180583Skmacy		0xcc1d, 0x8676,
395180583Skmacy		0xcc1e, 0x40b7,
396180583Skmacy		0xcc1f, 0xa746,
397180583Skmacy		0xcc20, 0x4047,
398180583Skmacy		0xcc21, 0x5673,
399180583Skmacy		0xcc22, 0x2982,
400180583Skmacy		0xcc23, 0x3002,
401180583Skmacy		0xcc24, 0x13d2,
402180583Skmacy		0xcc25, 0x8bbd,
403180583Skmacy		0xcc26, 0x2862,
404180583Skmacy		0xcc27, 0x3012,
405180583Skmacy		0xcc28, 0x1002,
406180583Skmacy		0xcc29, 0x2092,
407180583Skmacy		0xcc2a, 0x3012,
408180583Skmacy		0xcc2b, 0x1002,
409180583Skmacy		0xcc2c, 0x5cc3,
410180583Skmacy		0xcc2d, 0x314,
411180583Skmacy		0xcc2e, 0x2942,
412180583Skmacy		0xcc2f, 0x3002,
413180583Skmacy		0xcc30, 0x1002,
414180583Skmacy		0xcc31, 0xd019,
415180583Skmacy		0xcc32, 0x2032,
416180583Skmacy		0xcc33, 0x3012,
417180583Skmacy		0xcc34, 0x1002,
418180583Skmacy		0xcc35, 0x2a04,
419180583Skmacy		0xcc36, 0x3c74,
420180583Skmacy		0xcc37, 0x6435,
421180583Skmacy		0xcc38, 0x2fa4,
422180583Skmacy		0xcc39, 0x3cd4,
423180583Skmacy		0xcc3a, 0x6624,
424180583Skmacy		0xcc3b, 0x5563,
425180583Skmacy		0xcc3c, 0x2d42,
426180583Skmacy		0xcc3d, 0x3002,
427180583Skmacy		0xcc3e, 0x13d2,
428180583Skmacy		0xcc3f, 0x464d,
429180583Skmacy		0xcc40, 0x2862,
430180583Skmacy		0xcc41, 0x3012,
431180583Skmacy		0xcc42, 0x1002,
432180583Skmacy		0xcc43, 0x2032,
433180583Skmacy		0xcc44, 0x3012,
434180583Skmacy		0xcc45, 0x1002,
435180583Skmacy		0xcc46, 0x2fb4,
436180583Skmacy		0xcc47, 0x3cd4,
437180583Skmacy		0xcc48, 0x6624,
438180583Skmacy		0xcc49, 0x5563,
439180583Skmacy		0xcc4a, 0x2d42,
440180583Skmacy		0xcc4b, 0x3002,
441180583Skmacy		0xcc4c, 0x13d2,
442180583Skmacy		0xcc4d, 0x2ed2,
443180583Skmacy		0xcc4e, 0x3002,
444180583Skmacy		0xcc4f, 0x1002,
445180583Skmacy		0xcc50, 0x2fd2,
446180583Skmacy		0xcc51, 0x3002,
447180583Skmacy		0xcc52, 0x1002,
448180583Skmacy		0xcc53, 0x004,
449180583Skmacy		0xcc54, 0x2942,
450180583Skmacy		0xcc55, 0x3002,
451180583Skmacy		0xcc56, 0x1002,
452180583Skmacy		0xcc57, 0x2092,
453180583Skmacy		0xcc58, 0x3012,
454180583Skmacy		0xcc59, 0x1002,
455180583Skmacy		0xcc5a, 0x5cc3,
456180583Skmacy		0xcc5b, 0x317,
457180583Skmacy		0xcc5c, 0x2f72,
458180583Skmacy		0xcc5d, 0x3002,
459180583Skmacy		0xcc5e, 0x1002,
460180583Skmacy		0xcc5f, 0x2942,
461180583Skmacy		0xcc60, 0x3002,
462180583Skmacy		0xcc61, 0x1002,
463180583Skmacy		0xcc62, 0x22cd,
464180583Skmacy		0xcc63, 0x301d,
465180583Skmacy		0xcc64, 0x2862,
466180583Skmacy		0xcc65, 0x3012,
467180583Skmacy		0xcc66, 0x1002,
468180583Skmacy		0xcc67, 0x2ed2,
469180583Skmacy		0xcc68, 0x3002,
470180583Skmacy		0xcc69, 0x1002,
471180583Skmacy		0xcc6a, 0x2d72,
472180583Skmacy		0xcc6b, 0x3002,
473180583Skmacy		0xcc6c, 0x1002,
474180583Skmacy		0xcc6d, 0x628f,
475180583Skmacy		0xcc6e, 0x2112,
476180583Skmacy		0xcc6f, 0x3012,
477180583Skmacy		0xcc70, 0x1002,
478180583Skmacy		0xcc71, 0x5aa3,
479180583Skmacy		0xcc72, 0x2dc2,
480180583Skmacy		0xcc73, 0x3002,
481180583Skmacy		0xcc74, 0x1312,
482180583Skmacy		0xcc75, 0x6f72,
483180583Skmacy		0xcc76, 0x1002,
484180583Skmacy		0xcc77, 0x2807,
485180583Skmacy		0xcc78, 0x31a7,
486180583Skmacy		0xcc79, 0x20c4,
487180583Skmacy		0xcc7a, 0x3c24,
488180583Skmacy		0xcc7b, 0x6724,
489180583Skmacy		0xcc7c, 0x1002,
490180583Skmacy		0xcc7d, 0x2807,
491180583Skmacy		0xcc7e, 0x3187,
492180583Skmacy		0xcc7f, 0x20c4,
493180583Skmacy		0xcc80, 0x3c24,
494180583Skmacy		0xcc81, 0x6724,
495180583Skmacy		0xcc82, 0x1002,
496180583Skmacy		0xcc83, 0x2514,
497180583Skmacy		0xcc84, 0x3c64,
498180583Skmacy		0xcc85, 0x6436,
499180583Skmacy		0xcc86, 0xdff4,
500180583Skmacy		0xcc87, 0x6436,
501180583Skmacy		0xcc88, 0x1002,
502180583Skmacy		0xcc89, 0x40a4,
503180583Skmacy		0xcc8a, 0x643c,
504180583Skmacy		0xcc8b, 0x4016,
505180583Skmacy		0xcc8c, 0x8c6c,
506180583Skmacy		0xcc8d, 0x2b24,
507180583Skmacy		0xcc8e, 0x3c24,
508180583Skmacy		0xcc8f, 0x6435,
509180583Skmacy		0xcc90, 0x1002,
510180583Skmacy		0xcc91, 0x2b24,
511180583Skmacy		0xcc92, 0x3c24,
512180583Skmacy		0xcc93, 0x643a,
513180583Skmacy		0xcc94, 0x4025,
514180583Skmacy		0xcc95, 0x8a5a,
515180583Skmacy		0xcc96, 0x1002,
516180583Skmacy		0xcc97, 0x2731,
517180583Skmacy		0xcc98, 0x3011,
518180583Skmacy		0xcc99, 0x1001,
519180583Skmacy		0xcc9a, 0xc7a0,
520180583Skmacy		0xcc9b, 0x100,
521180583Skmacy		0xcc9c, 0xc502,
522180583Skmacy		0xcc9d, 0x53ac,
523180583Skmacy		0xcc9e, 0xc503,
524180583Skmacy		0xcc9f, 0xd5d5,
525180583Skmacy		0xcca0, 0xc600,
526180583Skmacy		0xcca1, 0x2a6d,
527180583Skmacy		0xcca2, 0xc601,
528180583Skmacy		0xcca3, 0x2a4c,
529180583Skmacy		0xcca4, 0xc602,
530180583Skmacy		0xcca5, 0x111,
531180583Skmacy		0xcca6, 0xc60c,
532180583Skmacy		0xcca7, 0x5900,
533180583Skmacy		0xcca8, 0xc710,
534180583Skmacy		0xcca9, 0x700,
535180583Skmacy		0xccaa, 0xc718,
536180583Skmacy		0xccab, 0x700,
537180583Skmacy		0xccac, 0xc720,
538180583Skmacy		0xccad, 0x4700,
539180583Skmacy		0xccae, 0xc801,
540180583Skmacy		0xccaf, 0x7f50,
541180583Skmacy		0xccb0, 0xc802,
542180583Skmacy		0xccb1, 0x7760,
543180583Skmacy		0xccb2, 0xc803,
544180583Skmacy		0xccb3, 0x7fce,
545180583Skmacy		0xccb4, 0xc804,
546180583Skmacy		0xccb5, 0x5700,
547180583Skmacy		0xccb6, 0xc805,
548180583Skmacy		0xccb7, 0x5f11,
549180583Skmacy		0xccb8, 0xc806,
550180583Skmacy		0xccb9, 0x4751,
551180583Skmacy		0xccba, 0xc807,
552180583Skmacy		0xccbb, 0x57e1,
553180583Skmacy		0xccbc, 0xc808,
554180583Skmacy		0xccbd, 0x2700,
555180583Skmacy		0xccbe, 0xc809,
556180583Skmacy		0xccbf, 0x000,
557180583Skmacy		0xccc0, 0xc821,
558180583Skmacy		0xccc1, 0x002,
559180583Skmacy		0xccc2, 0xc822,
560180583Skmacy		0xccc3, 0x014,
561180583Skmacy		0xccc4, 0xc832,
562180583Skmacy		0xccc5, 0x1186,
563180583Skmacy		0xccc6, 0xc847,
564180583Skmacy		0xccc7, 0x1e02,
565180583Skmacy		0xccc8, 0xc013,
566180583Skmacy		0xccc9, 0xf341,
567180583Skmacy		0xccca, 0xc01a,
568180583Skmacy		0xcccb, 0x446,
569180583Skmacy		0xcccc, 0xc024,
570180583Skmacy		0xcccd, 0x1000,
571180583Skmacy		0xccce, 0xc025,
572180583Skmacy		0xcccf, 0xa00,
573180583Skmacy		0xccd0, 0xc026,
574180583Skmacy		0xccd1, 0xc0c,
575180583Skmacy		0xccd2, 0xc027,
576180583Skmacy		0xccd3, 0xc0c,
577180583Skmacy		0xccd4, 0xc029,
578180583Skmacy		0xccd5, 0x0a0,
579180583Skmacy		0xccd6, 0xc030,
580180583Skmacy		0xccd7, 0xa00,
581180583Skmacy		0xccd8, 0xc03c,
582180583Skmacy		0xccd9, 0x01c,
583180583Skmacy		0xccda, 0xc005,
584180583Skmacy		0xccdb, 0x7a06,
585180583Skmacy		0xccdc, 0x000,
586180583Skmacy		0xccdd, 0x2731,
587180583Skmacy		0xccde, 0x3011,
588180583Skmacy		0xccdf, 0x1001,
589180583Skmacy		0xcce0, 0xc620,
590180583Skmacy		0xcce1, 0x000,
591180583Skmacy		0xcce2, 0xc621,
592180583Skmacy		0xcce3, 0x03f,
593180583Skmacy		0xcce4, 0xc622,
594180583Skmacy		0xcce5, 0x000,
595180583Skmacy		0xcce6, 0xc623,
596180583Skmacy		0xcce7, 0x000,
597180583Skmacy		0xcce8, 0xc624,
598180583Skmacy		0xcce9, 0x000,
599180583Skmacy		0xccea, 0xc625,
600180583Skmacy		0xcceb, 0x000,
601180583Skmacy		0xccec, 0xc627,
602180583Skmacy		0xcced, 0x000,
603180583Skmacy		0xccee, 0xc628,
604180583Skmacy		0xccef, 0x000,
605180583Skmacy		0xccf0, 0xc62c,
606180583Skmacy		0xccf1, 0x000,
607180583Skmacy		0xccf2, 0x000,
608180583Skmacy		0xccf3, 0x2806,
609180583Skmacy		0xccf4, 0x3cb6,
610180583Skmacy		0xccf5, 0xc161,
611180583Skmacy		0xccf6, 0x6134,
612180583Skmacy		0xccf7, 0x6135,
613180583Skmacy		0xccf8, 0x5443,
614180583Skmacy		0xccf9, 0x303,
615180583Skmacy		0xccfa, 0x6524,
616180583Skmacy		0xccfb, 0x00b,
617180583Skmacy		0xccfc, 0x1002,
618180583Skmacy		0xccfd, 0x2104,
619180583Skmacy		0xccfe, 0x3c24,
620180583Skmacy		0xccff, 0x2105,
621180583Skmacy		0xcd00, 0x3805,
622180583Skmacy		0xcd01, 0x6524,
623180583Skmacy		0xcd02, 0xdff4,
624180583Skmacy		0xcd03, 0x4005,
625180583Skmacy		0xcd04, 0x6524,
626180583Skmacy		0xcd05, 0x1002,
627180583Skmacy		0xcd06, 0x5dd3,
628180583Skmacy		0xcd07, 0x306,
629180583Skmacy		0xcd08, 0x2ff7,
630180583Skmacy		0xcd09, 0x38f7,
631180583Skmacy		0xcd0a, 0x60b7,
632180583Skmacy		0xcd0b, 0xdffd,
633180583Skmacy		0xcd0c, 0x00a,
634180583Skmacy		0xcd0d, 0x1002,
635180583Skmacy		0xcd0e, 0
636180583Skmacy	};
637180583Skmacy	int i, err;
638180583Skmacy
639181614Skmacy	err = set_phy_regs(phy, regs);
640181614Skmacy	if (err)
641181614Skmacy		return err;
642181614Skmacy
643181614Skmacy	msleep(50);
644181614Skmacy
645181614Skmacy	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
646180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
647180583Skmacy				 sr_edc[i + 1]);
648181614Skmacy	if (!err)
649181614Skmacy		phy->priv = edc_sr;
650180583Skmacy	return err;
651180583Skmacy}
652180583Skmacy
653181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
654181614Skmacy{
655181614Skmacy	static struct reg_val regs[] = {
656181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
657181614Skmacy		{ 0, 0, 0, 0 }
658181614Skmacy	};
659181614Skmacy	static struct reg_val preemphasis[] = {
660181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
661181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
662181614Skmacy		{ 0, 0, 0, 0 }
663181614Skmacy	};
664181614Skmacy	static u16 twinax_edc[] = {
665181614Skmacy		0xcc00, 0x4009,
666181614Skmacy		0xcc01, 0x27ff,
667181614Skmacy		0xcc02, 0x300f,
668181614Skmacy		0xcc03, 0x40aa,
669181614Skmacy		0xcc04, 0x401c,
670181614Skmacy		0xcc05, 0x401e,
671181614Skmacy		0xcc06, 0x2ff4,
672181614Skmacy		0xcc07, 0x3cd4,
673181614Skmacy		0xcc08, 0x2035,
674181614Skmacy		0xcc09, 0x3145,
675181614Skmacy		0xcc0a, 0x6524,
676181614Skmacy		0xcc0b, 0x26a2,
677181614Skmacy		0xcc0c, 0x3012,
678181614Skmacy		0xcc0d, 0x1002,
679181614Skmacy		0xcc0e, 0x29c2,
680181614Skmacy		0xcc0f, 0x3002,
681181614Skmacy		0xcc10, 0x1002,
682181614Skmacy		0xcc11, 0x2072,
683181614Skmacy		0xcc12, 0x3012,
684181614Skmacy		0xcc13, 0x1002,
685181614Skmacy		0xcc14, 0x22cd,
686181614Skmacy		0xcc15, 0x301d,
687181614Skmacy		0xcc16, 0x2e52,
688181614Skmacy		0xcc17, 0x3012,
689181614Skmacy		0xcc18, 0x1002,
690181614Skmacy		0xcc19, 0x28e2,
691181614Skmacy		0xcc1a, 0x3002,
692181614Skmacy		0xcc1b, 0x1002,
693181614Skmacy		0xcc1c, 0x628f,
694181614Skmacy		0xcc1d, 0x2ac2,
695181614Skmacy		0xcc1e, 0x3012,
696181614Skmacy		0xcc1f, 0x1002,
697181614Skmacy		0xcc20, 0x5553,
698181614Skmacy		0xcc21, 0x2ae2,
699181614Skmacy		0xcc22, 0x3002,
700181614Skmacy		0xcc23, 0x1302,
701181614Skmacy		0xcc24, 0x401e,
702181614Skmacy		0xcc25, 0x2be2,
703181614Skmacy		0xcc26, 0x3012,
704181614Skmacy		0xcc27, 0x1002,
705181614Skmacy		0xcc28, 0x2da2,
706181614Skmacy		0xcc29, 0x3012,
707181614Skmacy		0xcc2a, 0x1002,
708181614Skmacy		0xcc2b, 0x2ba2,
709181614Skmacy		0xcc2c, 0x3002,
710181614Skmacy		0xcc2d, 0x1002,
711181614Skmacy		0xcc2e, 0x5ee3,
712181614Skmacy		0xcc2f, 0x305,
713181614Skmacy		0xcc30, 0x400e,
714181614Skmacy		0xcc31, 0x2bc2,
715181614Skmacy		0xcc32, 0x3002,
716181614Skmacy		0xcc33, 0x1002,
717181614Skmacy		0xcc34, 0x2b82,
718181614Skmacy		0xcc35, 0x3012,
719181614Skmacy		0xcc36, 0x1002,
720181614Skmacy		0xcc37, 0x5663,
721181614Skmacy		0xcc38, 0x302,
722181614Skmacy		0xcc39, 0x401e,
723181614Skmacy		0xcc3a, 0x6f72,
724181614Skmacy		0xcc3b, 0x1002,
725181614Skmacy		0xcc3c, 0x628f,
726181614Skmacy		0xcc3d, 0x2be2,
727181614Skmacy		0xcc3e, 0x3012,
728181614Skmacy		0xcc3f, 0x1002,
729181614Skmacy		0xcc40, 0x22cd,
730181614Skmacy		0xcc41, 0x301d,
731181614Skmacy		0xcc42, 0x2e52,
732181614Skmacy		0xcc43, 0x3012,
733181614Skmacy		0xcc44, 0x1002,
734181614Skmacy		0xcc45, 0x2522,
735181614Skmacy		0xcc46, 0x3012,
736181614Skmacy		0xcc47, 0x1002,
737181614Skmacy		0xcc48, 0x2da2,
738181614Skmacy		0xcc49, 0x3012,
739181614Skmacy		0xcc4a, 0x1002,
740181614Skmacy		0xcc4b, 0x2ca2,
741181614Skmacy		0xcc4c, 0x3012,
742181614Skmacy		0xcc4d, 0x1002,
743181614Skmacy		0xcc4e, 0x2fa4,
744181614Skmacy		0xcc4f, 0x3cd4,
745181614Skmacy		0xcc50, 0x6624,
746181614Skmacy		0xcc51, 0x410b,
747181614Skmacy		0xcc52, 0x56b3,
748181614Skmacy		0xcc53, 0x3c4,
749181614Skmacy		0xcc54, 0x2fb2,
750181614Skmacy		0xcc55, 0x3002,
751181614Skmacy		0xcc56, 0x1002,
752181614Skmacy		0xcc57, 0x220b,
753181614Skmacy		0xcc58, 0x303b,
754181614Skmacy		0xcc59, 0x56b3,
755181614Skmacy		0xcc5a, 0x3c3,
756181614Skmacy		0xcc5b, 0x866b,
757181614Skmacy		0xcc5c, 0x400c,
758181614Skmacy		0xcc5d, 0x23a2,
759181614Skmacy		0xcc5e, 0x3012,
760181614Skmacy		0xcc5f, 0x1002,
761181614Skmacy		0xcc60, 0x2da2,
762181614Skmacy		0xcc61, 0x3012,
763181614Skmacy		0xcc62, 0x1002,
764181614Skmacy		0xcc63, 0x2ca2,
765181614Skmacy		0xcc64, 0x3012,
766181614Skmacy		0xcc65, 0x1002,
767181614Skmacy		0xcc66, 0x2fb4,
768181614Skmacy		0xcc67, 0x3cd4,
769181614Skmacy		0xcc68, 0x6624,
770181614Skmacy		0xcc69, 0x56b3,
771181614Skmacy		0xcc6a, 0x3c3,
772181614Skmacy		0xcc6b, 0x866b,
773181614Skmacy		0xcc6c, 0x401c,
774181614Skmacy		0xcc6d, 0x2205,
775181614Skmacy		0xcc6e, 0x3035,
776181614Skmacy		0xcc6f, 0x5b53,
777181614Skmacy		0xcc70, 0x2c52,
778181614Skmacy		0xcc71, 0x3002,
779181614Skmacy		0xcc72, 0x13c2,
780181614Skmacy		0xcc73, 0x5cc3,
781181614Skmacy		0xcc74, 0x317,
782181614Skmacy		0xcc75, 0x2522,
783181614Skmacy		0xcc76, 0x3012,
784181614Skmacy		0xcc77, 0x1002,
785181614Skmacy		0xcc78, 0x2da2,
786181614Skmacy		0xcc79, 0x3012,
787181614Skmacy		0xcc7a, 0x1002,
788181614Skmacy		0xcc7b, 0x2b82,
789181614Skmacy		0xcc7c, 0x3012,
790181614Skmacy		0xcc7d, 0x1002,
791181614Skmacy		0xcc7e, 0x5663,
792181614Skmacy		0xcc7f, 0x303,
793181614Skmacy		0xcc80, 0x401e,
794181614Skmacy		0xcc81, 0x004,
795181614Skmacy		0xcc82, 0x2c42,
796181614Skmacy		0xcc83, 0x3012,
797181614Skmacy		0xcc84, 0x1002,
798181614Skmacy		0xcc85, 0x6f72,
799181614Skmacy		0xcc86, 0x1002,
800181614Skmacy		0xcc87, 0x628f,
801181614Skmacy		0xcc88, 0x2304,
802181614Skmacy		0xcc89, 0x3c84,
803181614Skmacy		0xcc8a, 0x6436,
804181614Skmacy		0xcc8b, 0xdff4,
805181614Skmacy		0xcc8c, 0x6436,
806181614Skmacy		0xcc8d, 0x2ff5,
807181614Skmacy		0xcc8e, 0x3005,
808181614Skmacy		0xcc8f, 0x8656,
809181614Skmacy		0xcc90, 0xdfba,
810181614Skmacy		0xcc91, 0x56a3,
811181614Skmacy		0xcc92, 0xd05a,
812181614Skmacy		0xcc93, 0x21c2,
813181614Skmacy		0xcc94, 0x3012,
814181614Skmacy		0xcc95, 0x1392,
815181614Skmacy		0xcc96, 0xd05a,
816181614Skmacy		0xcc97, 0x56a3,
817181614Skmacy		0xcc98, 0xdfba,
818181614Skmacy		0xcc99, 0x383,
819181614Skmacy		0xcc9a, 0x6f72,
820181614Skmacy		0xcc9b, 0x1002,
821181614Skmacy		0xcc9c, 0x28c5,
822181614Skmacy		0xcc9d, 0x3005,
823181614Skmacy		0xcc9e, 0x4178,
824181614Skmacy		0xcc9f, 0x5653,
825181614Skmacy		0xcca0, 0x384,
826181614Skmacy		0xcca1, 0x22b2,
827181614Skmacy		0xcca2, 0x3012,
828181614Skmacy		0xcca3, 0x1002,
829181614Skmacy		0xcca4, 0x2be5,
830181614Skmacy		0xcca5, 0x3005,
831181614Skmacy		0xcca6, 0x41e8,
832181614Skmacy		0xcca7, 0x5653,
833181614Skmacy		0xcca8, 0x382,
834181614Skmacy		0xcca9, 0x002,
835181614Skmacy		0xccaa, 0x4258,
836181614Skmacy		0xccab, 0x2474,
837181614Skmacy		0xccac, 0x3c84,
838181614Skmacy		0xccad, 0x6437,
839181614Skmacy		0xccae, 0xdff4,
840181614Skmacy		0xccaf, 0x6437,
841181614Skmacy		0xccb0, 0x2ff5,
842181614Skmacy		0xccb1, 0x3c05,
843181614Skmacy		0xccb2, 0x8757,
844181614Skmacy		0xccb3, 0xb888,
845181614Skmacy		0xccb4, 0x9787,
846181614Skmacy		0xccb5, 0xdff4,
847181614Skmacy		0xccb6, 0x6724,
848181614Skmacy		0xccb7, 0x866a,
849181614Skmacy		0xccb8, 0x6f72,
850181614Skmacy		0xccb9, 0x1002,
851181614Skmacy		0xccba, 0x2d01,
852181614Skmacy		0xccbb, 0x3011,
853181614Skmacy		0xccbc, 0x1001,
854181614Skmacy		0xccbd, 0xc620,
855181614Skmacy		0xccbe, 0x14e5,
856181614Skmacy		0xccbf, 0xc621,
857181614Skmacy		0xccc0, 0xc53d,
858181614Skmacy		0xccc1, 0xc622,
859181614Skmacy		0xccc2, 0x3cbe,
860181614Skmacy		0xccc3, 0xc623,
861181614Skmacy		0xccc4, 0x4452,
862181614Skmacy		0xccc5, 0xc624,
863181614Skmacy		0xccc6, 0xc5c5,
864181614Skmacy		0xccc7, 0xc625,
865181614Skmacy		0xccc8, 0xe01e,
866181614Skmacy		0xccc9, 0xc627,
867181614Skmacy		0xccca, 0x000,
868181614Skmacy		0xcccb, 0xc628,
869181614Skmacy		0xcccc, 0x000,
870181614Skmacy		0xcccd, 0xc62b,
871181614Skmacy		0xccce, 0x000,
872181614Skmacy		0xcccf, 0xc62c,
873181614Skmacy		0xccd0, 0x000,
874181614Skmacy		0xccd1, 0x000,
875181614Skmacy		0xccd2, 0x2d01,
876181614Skmacy		0xccd3, 0x3011,
877181614Skmacy		0xccd4, 0x1001,
878181614Skmacy		0xccd5, 0xc620,
879181614Skmacy		0xccd6, 0x000,
880181614Skmacy		0xccd7, 0xc621,
881181614Skmacy		0xccd8, 0x000,
882181614Skmacy		0xccd9, 0xc622,
883181614Skmacy		0xccda, 0x0ce,
884181614Skmacy		0xccdb, 0xc623,
885181614Skmacy		0xccdc, 0x07f,
886181614Skmacy		0xccdd, 0xc624,
887181614Skmacy		0xccde, 0x032,
888181614Skmacy		0xccdf, 0xc625,
889181614Skmacy		0xcce0, 0x000,
890181614Skmacy		0xcce1, 0xc627,
891181614Skmacy		0xcce2, 0x000,
892181614Skmacy		0xcce3, 0xc628,
893181614Skmacy		0xcce4, 0x000,
894181614Skmacy		0xcce5, 0xc62b,
895181614Skmacy		0xcce6, 0x000,
896181614Skmacy		0xcce7, 0xc62c,
897181614Skmacy		0xcce8, 0x000,
898181614Skmacy		0xcce9, 0x000,
899181614Skmacy		0xccea, 0x2d01,
900181614Skmacy		0xcceb, 0x3011,
901181614Skmacy		0xccec, 0x1001,
902181614Skmacy		0xcced, 0xc502,
903181614Skmacy		0xccee, 0x609f,
904181614Skmacy		0xccef, 0xc600,
905181614Skmacy		0xccf0, 0x2a6e,
906181614Skmacy		0xccf1, 0xc601,
907181614Skmacy		0xccf2, 0x2a2c,
908181614Skmacy		0xccf3, 0xc60c,
909181614Skmacy		0xccf4, 0x5400,
910181614Skmacy		0xccf5, 0xc710,
911181614Skmacy		0xccf6, 0x700,
912181614Skmacy		0xccf7, 0xc718,
913181614Skmacy		0xccf8, 0x700,
914181614Skmacy		0xccf9, 0xc720,
915181614Skmacy		0xccfa, 0x4700,
916181614Skmacy		0xccfb, 0xc728,
917181614Skmacy		0xccfc, 0x700,
918181614Skmacy		0xccfd, 0xc729,
919181614Skmacy		0xccfe, 0x1207,
920181614Skmacy		0xccff, 0xc801,
921181614Skmacy		0xcd00, 0x7f50,
922181614Skmacy		0xcd01, 0xc802,
923181614Skmacy		0xcd02, 0x7760,
924181614Skmacy		0xcd03, 0xc803,
925181614Skmacy		0xcd04, 0x7fce,
926181614Skmacy		0xcd05, 0xc804,
927181614Skmacy		0xcd06, 0x520e,
928181614Skmacy		0xcd07, 0xc805,
929181614Skmacy		0xcd08, 0x5c11,
930181614Skmacy		0xcd09, 0xc806,
931181614Skmacy		0xcd0a, 0x3c51,
932181614Skmacy		0xcd0b, 0xc807,
933181614Skmacy		0xcd0c, 0x4061,
934181614Skmacy		0xcd0d, 0xc808,
935181614Skmacy		0xcd0e, 0x49c1,
936181614Skmacy		0xcd0f, 0xc809,
937181614Skmacy		0xcd10, 0x3840,
938181614Skmacy		0xcd11, 0xc80a,
939181614Skmacy		0xcd12, 0x000,
940181614Skmacy		0xcd13, 0xc821,
941181614Skmacy		0xcd14, 0x002,
942181614Skmacy		0xcd15, 0xc822,
943181614Skmacy		0xcd16, 0x046,
944181614Skmacy		0xcd17, 0xc844,
945181614Skmacy		0xcd18, 0x182f,
946181614Skmacy		0xcd19, 0xc013,
947181614Skmacy		0xcd1a, 0xf341,
948181614Skmacy		0xcd1b, 0xc01a,
949181614Skmacy		0xcd1c, 0x446,
950181614Skmacy		0xcd1d, 0xc024,
951181614Skmacy		0xcd1e, 0x1000,
952181614Skmacy		0xcd1f, 0xc025,
953181614Skmacy		0xcd20, 0xa00,
954181614Skmacy		0xcd21, 0xc026,
955181614Skmacy		0xcd22, 0xc0c,
956181614Skmacy		0xcd23, 0xc027,
957181614Skmacy		0xcd24, 0xc0c,
958181614Skmacy		0xcd25, 0xc029,
959181614Skmacy		0xcd26, 0x0a0,
960181614Skmacy		0xcd27, 0xc030,
961181614Skmacy		0xcd28, 0xa00,
962181614Skmacy		0xcd29, 0xc03c,
963181614Skmacy		0xcd2a, 0x01c,
964181614Skmacy		0xcd2b, 0x000,
965181614Skmacy		0xcd2c, 0x2b84,
966181614Skmacy		0xcd2d, 0x3c74,
967181614Skmacy		0xcd2e, 0x6435,
968181614Skmacy		0xcd2f, 0xdff4,
969181614Skmacy		0xcd30, 0x6435,
970181614Skmacy		0xcd31, 0x2806,
971181614Skmacy		0xcd32, 0x3006,
972181614Skmacy		0xcd33, 0x8565,
973181614Skmacy		0xcd34, 0x2b24,
974181614Skmacy		0xcd35, 0x3c24,
975181614Skmacy		0xcd36, 0x6436,
976181614Skmacy		0xcd37, 0x1002,
977181614Skmacy		0xcd38, 0x2b24,
978181614Skmacy		0xcd39, 0x3c24,
979181614Skmacy		0xcd3a, 0x6436,
980181614Skmacy		0xcd3b, 0x4045,
981181614Skmacy		0xcd3c, 0x8656,
982181614Skmacy		0xcd3d, 0x1002,
983181614Skmacy		0xcd3e, 0x2807,
984181614Skmacy		0xcd3f, 0x31a7,
985181614Skmacy		0xcd40, 0x20c4,
986181614Skmacy		0xcd41, 0x3c24,
987181614Skmacy		0xcd42, 0x6724,
988181614Skmacy		0xcd43, 0x1002,
989181614Skmacy		0xcd44, 0x2807,
990181614Skmacy		0xcd45, 0x3187,
991181614Skmacy		0xcd46, 0x20c4,
992181614Skmacy		0xcd47, 0x3c24,
993181614Skmacy		0xcd48, 0x6724,
994181614Skmacy		0xcd49, 0x1002,
995181614Skmacy		0xcd4a, 0x2514,
996181614Skmacy		0xcd4b, 0x3c64,
997181614Skmacy		0xcd4c, 0x6436,
998181614Skmacy		0xcd4d, 0xdff4,
999181614Skmacy		0xcd4e, 0x6436,
1000181614Skmacy		0xcd4f, 0x1002,
1001181614Skmacy		0xcd50, 0x2806,
1002181614Skmacy		0xcd51, 0x3cb6,
1003181614Skmacy		0xcd52, 0xc161,
1004181614Skmacy		0xcd53, 0x6134,
1005181614Skmacy		0xcd54, 0x6135,
1006181614Skmacy		0xcd55, 0x5443,
1007181614Skmacy		0xcd56, 0x303,
1008181614Skmacy		0xcd57, 0x6524,
1009181614Skmacy		0xcd58, 0x00b,
1010181614Skmacy		0xcd59, 0x1002,
1011181614Skmacy		0xcd5a, 0xd019,
1012181614Skmacy		0xcd5b, 0x2104,
1013181614Skmacy		0xcd5c, 0x3c24,
1014181614Skmacy		0xcd5d, 0x2105,
1015181614Skmacy		0xcd5e, 0x3805,
1016181614Skmacy		0xcd5f, 0x6524,
1017181614Skmacy		0xcd60, 0xdff4,
1018181614Skmacy		0xcd61, 0x4005,
1019181614Skmacy		0xcd62, 0x6524,
1020181614Skmacy		0xcd63, 0x2e8d,
1021181614Skmacy		0xcd64, 0x303d,
1022181614Skmacy		0xcd65, 0x5dd3,
1023181614Skmacy		0xcd66, 0x306,
1024181614Skmacy		0xcd67, 0x2ff7,
1025181614Skmacy		0xcd68, 0x38f7,
1026181614Skmacy		0xcd69, 0x60b7,
1027181614Skmacy		0xcd6a, 0xdffd,
1028181614Skmacy		0xcd6b, 0x00a,
1029181614Skmacy		0xcd6c, 0x1002,
1030181614Skmacy		0xcd6d, 0
1031181614Skmacy	};
1032181614Skmacy	int i, err;
1033181614Skmacy
1034181614Skmacy	err = set_phy_regs(phy, regs);
1035181614Skmacy	if (!err && modtype == phy_modtype_twinax_long)
1036181614Skmacy		err = set_phy_regs(phy, preemphasis);
1037181614Skmacy	if (err)
1038181614Skmacy		return err;
1039181614Skmacy
1040181614Skmacy	msleep(50);
1041181614Skmacy
1042181614Skmacy	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
1043181614Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
1044181614Skmacy				 twinax_edc[i + 1]);
1045181614Skmacy	if (!err)
1046181614Skmacy		phy->priv = edc_twinax;
1047181614Skmacy	return err;
1048181614Skmacy}
1049181614Skmacy
1050181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr)
1051181614Skmacy{
1052181614Skmacy	int i, err;
1053181614Skmacy	unsigned int stat, data;
1054181614Skmacy
1055181614Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
1056181614Skmacy			 (dev_addr << 8) | (1 << 8) | word_addr);
1057181614Skmacy	if (err)
1058181614Skmacy		return err;
1059181614Skmacy
1060181614Skmacy	for (i = 0; i < 5; i++) {
1061181614Skmacy		msleep(1);
1062181614Skmacy		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
1063181614Skmacy		if (err)
1064181614Skmacy			return err;
1065181614Skmacy		if ((stat & 3) == 1) {
1066181614Skmacy			err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA,
1067181614Skmacy					&data);
1068181614Skmacy			if (err)
1069181614Skmacy				return err;
1070181614Skmacy			return data >> 8;
1071181614Skmacy		}
1072181614Skmacy	}
1073181614Skmacy	CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n",
1074181614Skmacy		phy->addr, word_addr);
1075181614Skmacy	return -ETIMEDOUT;
1076181614Skmacy}
1077181614Skmacy
1078186282Sgnnstatic int ael2005_get_module_type(struct cphy *phy, int delay_ms)
1079181614Skmacy{
1080181614Skmacy	int v;
1081181614Skmacy	unsigned int stat;
1082181614Skmacy
1083181614Skmacy	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
1084181614Skmacy	if (v)
1085181614Skmacy		return v;
1086181614Skmacy
1087181614Skmacy	if (stat & (1 << 8))			/* module absent */
1088181614Skmacy		return phy_modtype_none;
1089181614Skmacy
1090181614Skmacy	if (delay_ms)
1091181614Skmacy		msleep(delay_ms);
1092181614Skmacy
1093186282Sgnn	return get_module_type(phy, 0);
1094181614Skmacy
1095181614Skmacy}
1096181614Skmacy
1097181614Skmacystatic int ael2005_intr_enable(struct cphy *phy)
1098181614Skmacy{
1099181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
1100181614Skmacy	return err ? err : t3_phy_lasi_intr_enable(phy);
1101181614Skmacy}
1102181614Skmacy
1103181614Skmacystatic int ael2005_intr_disable(struct cphy *phy)
1104181614Skmacy{
1105181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
1106181614Skmacy	return err ? err : t3_phy_lasi_intr_disable(phy);
1107181614Skmacy}
1108181614Skmacy
1109181614Skmacystatic int ael2005_intr_clear(struct cphy *phy)
1110181614Skmacy{
1111181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
1112181614Skmacy	return err ? err : t3_phy_lasi_intr_clear(phy);
1113181614Skmacy}
1114181614Skmacy
1115180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
1116180583Skmacy{
1117180583Skmacy	static struct reg_val regs0[] = {
1118180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
1119180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
1120180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
1121180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1122180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
1123180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1124180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
1125180583Skmacy		{ 0, 0, 0, 0 }
1126180583Skmacy	};
1127180583Skmacy	static struct reg_val regs1[] = {
1128180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
1129180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
1130180583Skmacy		{ 0, 0, 0, 0 }
1131180583Skmacy	};
1132180583Skmacy
1133181614Skmacy	int err, lasi_ctrl;
1134180583Skmacy
1135181614Skmacy	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
1136181614Skmacy	if (err)
1137181614Skmacy		return err;
1138181614Skmacy
1139180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
1140180583Skmacy	if (err)
1141180583Skmacy		return err;
1142180583Skmacy
1143180583Skmacy	msleep(125);
1144181614Skmacy	phy->priv = edc_none;
1145180583Skmacy	err = set_phy_regs(phy, regs0);
1146180583Skmacy	if (err)
1147180583Skmacy		return err;
1148180583Skmacy
1149180583Skmacy	msleep(50);
1150181614Skmacy
1151186282Sgnn	err = ael2005_get_module_type(phy, 0);
1152181614Skmacy	if (err < 0)
1153181614Skmacy		return err;
1154181614Skmacy	phy->modtype = (u8)err;
1155181614Skmacy
1156181614Skmacy	if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
1157181614Skmacy		err = ael2005_setup_twinax_edc(phy, err);
1158181614Skmacy	else
1159181614Skmacy		err = ael2005_setup_sr_edc(phy);
1160180583Skmacy	if (err)
1161180583Skmacy		return err;
1162180583Skmacy
1163181614Skmacy	err = set_phy_regs(phy, regs1);
1164180583Skmacy	if (err)
1165180583Skmacy		return err;
1166180583Skmacy
1167181614Skmacy	/* reset wipes out interrupts, reenable them if they were on */
1168181614Skmacy	if (lasi_ctrl & 1)
1169181614Skmacy		err = ael2005_intr_enable(phy);
1170181614Skmacy	return err;
1171180583Skmacy}
1172180583Skmacy
1173181614Skmacystatic int ael2005_intr_handler(struct cphy *phy)
1174181614Skmacy{
1175181614Skmacy	unsigned int stat;
1176181614Skmacy	int ret, edc_needed, cause = 0;
1177181614Skmacy
1178181614Skmacy	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
1179181614Skmacy	if (ret)
1180181614Skmacy		return ret;
1181181614Skmacy
1182181614Skmacy	if (stat & AEL2005_MODDET_IRQ) {
1183181614Skmacy		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
1184181614Skmacy				 0xd00);
1185181614Skmacy		if (ret)
1186181614Skmacy			return ret;
1187181614Skmacy
1188181614Skmacy		/* modules have max 300 ms init time after hot plug */
1189186282Sgnn		ret = ael2005_get_module_type(phy, 300);
1190181614Skmacy		if (ret < 0)
1191181614Skmacy			return ret;
1192181614Skmacy
1193181614Skmacy		phy->modtype = (u8)ret;
1194181614Skmacy		if (ret == phy_modtype_none)
1195181614Skmacy			edc_needed = phy->priv;       /* on unplug retain EDC */
1196181614Skmacy		else if (ret == phy_modtype_twinax ||
1197181614Skmacy			 ret == phy_modtype_twinax_long)
1198181614Skmacy			edc_needed = edc_twinax;
1199181614Skmacy		else
1200181614Skmacy			edc_needed = edc_sr;
1201181614Skmacy
1202181614Skmacy		if (edc_needed != phy->priv) {
1203181614Skmacy			ret = ael2005_reset(phy, 0);
1204181614Skmacy			return ret ? ret : cphy_cause_module_change;
1205181614Skmacy		}
1206181614Skmacy		cause = cphy_cause_module_change;
1207181614Skmacy	}
1208181614Skmacy
1209181614Skmacy	ret = t3_phy_lasi_intr_handler(phy);
1210181614Skmacy	return ret < 0 ? ret : ret + cause;
1211181614Skmacy}
1212181614Skmacy
1213167514Skmacy#ifdef C99_NOT_SUPPORTED
1214180583Skmacystatic struct cphy_ops ael2005_ops = {
1215180583Skmacy	ael2005_reset,
1216181614Skmacy	ael2005_intr_enable,
1217181614Skmacy	ael2005_intr_disable,
1218181614Skmacy	ael2005_intr_clear,
1219181614Skmacy	ael2005_intr_handler,
1220180583Skmacy	NULL,
1221180583Skmacy	NULL,
1222180583Skmacy	NULL,
1223180583Skmacy	NULL,
1224180583Skmacy	NULL,
1225181614Skmacy	get_link_status_r,
1226180583Skmacy	ael1002_power_down,
1227180583Skmacy};
1228180583Skmacy#else
1229180583Skmacystatic struct cphy_ops ael2005_ops = {
1230180583Skmacy	.reset           = ael2005_reset,
1231181614Skmacy	.intr_enable     = ael2005_intr_enable,
1232181614Skmacy	.intr_disable    = ael2005_intr_disable,
1233181614Skmacy	.intr_clear      = ael2005_intr_clear,
1234181614Skmacy	.intr_handler    = ael2005_intr_handler,
1235181614Skmacy	.get_link_status = get_link_status_r,
1236180583Skmacy	.power_down      = ael1002_power_down,
1237180583Skmacy};
1238180583Skmacy#endif
1239180583Skmacy
1240180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1241180583Skmacy			const struct mdio_ops *mdio_ops)
1242180583Skmacy{
1243186282Sgnn	int err;
1244180583Skmacy	cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops,
1245181614Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
1246181614Skmacy		  SUPPORTED_IRQ, "10GBASE-R");
1247180583Skmacy	msleep(125);
1248186282Sgnn
1249186282Sgnn	err = ael2005_get_module_type(phy, 0);
1250186282Sgnn	if (err >= 0)
1251186282Sgnn		phy->modtype = err;
1252186282Sgnn
1253180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
1254180583Skmacy				   1 << 5);
1255180583Skmacy}
1256180583Skmacy
1257181614Skmacy/*
1258181614Skmacy * Get link status for a 10GBASE-X device.
1259181614Skmacy */
1260181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed,
1261181614Skmacy			     int *duplex, int *fc)
1262181614Skmacy{
1263181614Skmacy	if (link_ok) {
1264181614Skmacy		unsigned int stat0, stat1, stat2;
1265181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
1266181614Skmacy
1267181614Skmacy		if (!err)
1268181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
1269181614Skmacy		if (!err)
1270181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
1271181614Skmacy		if (err)
1272181614Skmacy			return err;
1273181614Skmacy		*link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1;
1274181614Skmacy	}
1275181614Skmacy	if (speed)
1276181614Skmacy		*speed = SPEED_10000;
1277181614Skmacy	if (duplex)
1278181614Skmacy		*duplex = DUPLEX_FULL;
1279181614Skmacy	return 0;
1280181614Skmacy}
1281181614Skmacy
1282180583Skmacy#ifdef C99_NOT_SUPPORTED
1283167514Skmacystatic struct cphy_ops qt2045_ops = {
1284167514Skmacy	ael1006_reset,
1285180583Skmacy	t3_phy_lasi_intr_enable,
1286180583Skmacy	t3_phy_lasi_intr_disable,
1287180583Skmacy	t3_phy_lasi_intr_clear,
1288180583Skmacy	t3_phy_lasi_intr_handler,
1289167514Skmacy	NULL,
1290167514Skmacy	NULL,
1291167514Skmacy	NULL,
1292167514Skmacy	NULL,
1293167514Skmacy	NULL,
1294181614Skmacy	get_link_status_x,
1295167514Skmacy	ael1006_power_down,
1296167514Skmacy};
1297167514Skmacy#else
1298167514Skmacystatic struct cphy_ops qt2045_ops = {
1299167514Skmacy	.reset           = ael1006_reset,
1300180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
1301180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
1302180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
1303180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
1304181614Skmacy	.get_link_status = get_link_status_x,
1305167514Skmacy	.power_down      = ael1006_power_down,
1306167514Skmacy};
1307167514Skmacy#endif
1308167514Skmacy
1309176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1310176472Skmacy		       const struct mdio_ops *mdio_ops)
1311167514Skmacy{
1312167514Skmacy	unsigned int stat;
1313167514Skmacy
1314176472Skmacy	cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops,
1315176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1316176472Skmacy		  "10GBASE-CX4");
1317167514Skmacy
1318167514Skmacy	/*
1319167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
1320167514Skmacy	 * have it at 1.
1321167514Skmacy	 */
1322167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
1323167514Skmacy	    stat == 0xffff)
1324167514Skmacy		phy->addr = 1;
1325176472Skmacy	return 0;
1326167514Skmacy}
1327167514Skmacy
1328167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
1329167514Skmacy{
1330167514Skmacy	return 0;
1331167514Skmacy}
1332167514Skmacy
1333167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
1334167514Skmacy				       int *speed, int *duplex, int *fc)
1335167514Skmacy{
1336167514Skmacy	if (link_ok) {
1337167514Skmacy		unsigned int status;
1338167514Skmacy
1339167514Skmacy		status = t3_read_reg(phy->adapter,
1340170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
1341170654Skmacy			 t3_read_reg(phy->adapter,
1342170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
1343170654Skmacy			 t3_read_reg(phy->adapter,
1344170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
1345170654Skmacy			 t3_read_reg(phy->adapter,
1346170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
1347167514Skmacy		*link_ok = !(status & F_LOWSIG0);
1348167514Skmacy	}
1349167514Skmacy	if (speed)
1350167514Skmacy		*speed = SPEED_10000;
1351167514Skmacy	if (duplex)
1352167514Skmacy		*duplex = DUPLEX_FULL;
1353167514Skmacy	return 0;
1354167514Skmacy}
1355167514Skmacy
1356167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
1357167514Skmacy{
1358167514Skmacy	return 0;
1359167514Skmacy}
1360167514Skmacy
1361167514Skmacy#ifdef C99_NOT_SUPPORTED
1362167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1363167514Skmacy	xaui_direct_reset,
1364167514Skmacy	ael1002_intr_noop,
1365167514Skmacy	ael1002_intr_noop,
1366167514Skmacy	ael1002_intr_noop,
1367167514Skmacy	ael1002_intr_noop,
1368167514Skmacy	NULL,
1369167514Skmacy	NULL,
1370167514Skmacy	NULL,
1371167514Skmacy	NULL,
1372167514Skmacy	NULL,
1373167514Skmacy	xaui_direct_get_link_status,
1374167514Skmacy	xaui_direct_power_down,
1375167514Skmacy};
1376167514Skmacy#else
1377167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1378167514Skmacy	.reset           = xaui_direct_reset,
1379167514Skmacy	.intr_enable     = ael1002_intr_noop,
1380167514Skmacy	.intr_disable    = ael1002_intr_noop,
1381167514Skmacy	.intr_clear      = ael1002_intr_noop,
1382167514Skmacy	.intr_handler    = ael1002_intr_noop,
1383167514Skmacy	.get_link_status = xaui_direct_get_link_status,
1384167514Skmacy	.power_down      = xaui_direct_power_down,
1385167514Skmacy};
1386167514Skmacy#endif
1387167514Skmacy
1388176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1389176472Skmacy			    const struct mdio_ops *mdio_ops)
1390167514Skmacy{
1391176472Skmacy	cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops,
1392176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1393176472Skmacy		  "10GBASE-CX4");
1394176472Skmacy	return 0;
1395167514Skmacy}
1396