cxgb_ael1002.c revision 185157
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 185157 2008-11-21 19:22:25Z 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
74180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv)
75180583Skmacy{
76180583Skmacy	int err;
77180583Skmacy
78180583Skmacy	for (err = 0; rv->mmd_addr && !err; rv++) {
79180583Skmacy		if (rv->clear_bits == 0xffff)
80180583Skmacy			err = mdio_write(phy, rv->mmd_addr, rv->reg_addr,
81180583Skmacy					 rv->set_bits);
82180583Skmacy		else
83180583Skmacy			err = t3_mdio_change_bits(phy, rv->mmd_addr,
84180583Skmacy						  rv->reg_addr, rv->clear_bits,
85180583Skmacy						  rv->set_bits);
86180583Skmacy	}
87180583Skmacy	return err;
88180583Skmacy}
89180583Skmacy
90167514Skmacystatic void ael100x_txon(struct cphy *phy)
91167514Skmacy{
92167514Skmacy	int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL;
93167514Skmacy
94176472Skmacy	msleep(100);
95167514Skmacy	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio);
96176472Skmacy	msleep(30);
97167514Skmacy}
98167514Skmacy
99167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable)
100167514Skmacy{
101167514Skmacy	int err;
102167514Skmacy
103167514Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable);
104167514Skmacy	if (!err)
105167514Skmacy		err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
106167514Skmacy					  BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
107167514Skmacy	return err;
108167514Skmacy}
109167514Skmacy
110167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait)
111167514Skmacy{
112167514Skmacy	int err;
113167514Skmacy
114167514Skmacy	if ((err = ael1002_power_down(phy, 0)) ||
115167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) ||
116167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) ||
117167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) ||
118167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) ||
119167514Skmacy	    (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN,
120167514Skmacy				       0, 1 << 5)))
121167514Skmacy		return err;
122167514Skmacy	return 0;
123167514Skmacy}
124167514Skmacy
125167514Skmacystatic int ael1002_intr_noop(struct cphy *phy)
126167514Skmacy{
127167514Skmacy	return 0;
128167514Skmacy}
129167514Skmacy
130181614Skmacy/*
131181614Skmacy * Get link status for a 10GBASE-R device.
132181614Skmacy */
133181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed,
134181614Skmacy			     int *duplex, int *fc)
135167514Skmacy{
136167514Skmacy	if (link_ok) {
137181614Skmacy		unsigned int stat0, stat1, stat2;
138181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
139167514Skmacy
140181614Skmacy		if (!err)
141181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1);
142181614Skmacy		if (!err)
143181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
144167514Skmacy		if (err)
145167514Skmacy			return err;
146181614Skmacy		*link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1;
147167514Skmacy	}
148167514Skmacy	if (speed)
149167514Skmacy		*speed = SPEED_10000;
150167514Skmacy	if (duplex)
151167514Skmacy		*duplex = DUPLEX_FULL;
152167514Skmacy	return 0;
153167514Skmacy}
154167514Skmacy
155167514Skmacy#ifdef C99_NOT_SUPPORTED
156167514Skmacystatic struct cphy_ops ael1002_ops = {
157167514Skmacy	ael1002_reset,
158167514Skmacy	ael1002_intr_noop,
159167514Skmacy	ael1002_intr_noop,
160167514Skmacy	ael1002_intr_noop,
161167514Skmacy	ael1002_intr_noop,
162167514Skmacy	NULL,
163167514Skmacy	NULL,
164167514Skmacy	NULL,
165167514Skmacy	NULL,
166167514Skmacy	NULL,
167181614Skmacy	get_link_status_r,
168167514Skmacy	ael1002_power_down,
169167514Skmacy};
170167514Skmacy#else
171167514Skmacystatic struct cphy_ops ael1002_ops = {
172167514Skmacy	.reset           = ael1002_reset,
173167514Skmacy	.intr_enable     = ael1002_intr_noop,
174167514Skmacy	.intr_disable    = ael1002_intr_noop,
175167514Skmacy	.intr_clear      = ael1002_intr_noop,
176167514Skmacy	.intr_handler    = ael1002_intr_noop,
177181614Skmacy	.get_link_status = get_link_status_r,
178167514Skmacy	.power_down      = ael1002_power_down,
179167514Skmacy};
180167514Skmacy#endif
181167514Skmacy
182176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
183176472Skmacy			const struct mdio_ops *mdio_ops)
184167514Skmacy{
185176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops,
186176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
187177340Skmacy		  "10GBASE-R");
188167514Skmacy	ael100x_txon(phy);
189176472Skmacy	return 0;
190167514Skmacy}
191167514Skmacy
192167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait)
193167514Skmacy{
194185157Sgnn	u32 gpio_out;
195185157Sgnn	t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
196185157Sgnn	/* Hack to reset the phy correctly */
197185157Sgnn	/* Read out the current value */
198185157Sgnn	gpio_out = t3_read_reg(phy->adapter, A_T3DBG_GPIO_EN);
199185157Sgnn	/* Reset the phy */
200185157Sgnn	gpio_out &= ~F_GPIO6_OUT_VAL;
201185157Sgnn	t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out);
202185157Sgnn	msleep(125);
203185157Sgnn	/* Take the phy out of reset */
204185157Sgnn	gpio_out |= F_GPIO6_OUT_VAL;
205185157Sgnn	t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out);
206185157Sgnn	msleep(125);
207185157Sgnn	t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
208185157Sgnn	return 0;
209167514Skmacy}
210167514Skmacy
211167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable)
212167514Skmacy{
213167514Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
214167514Skmacy				   BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
215167514Skmacy}
216167514Skmacy
217167514Skmacy#ifdef C99_NOT_SUPPORTED
218167514Skmacystatic struct cphy_ops ael1006_ops = {
219167514Skmacy	ael1006_reset,
220180583Skmacy	t3_phy_lasi_intr_enable,
221180583Skmacy	t3_phy_lasi_intr_disable,
222180583Skmacy	t3_phy_lasi_intr_clear,
223180583Skmacy	t3_phy_lasi_intr_handler,
224167514Skmacy	NULL,
225167514Skmacy	NULL,
226167514Skmacy	NULL,
227167514Skmacy	NULL,
228167514Skmacy	NULL,
229181614Skmacy	get_link_status_r,
230167514Skmacy	ael1006_power_down,
231167514Skmacy};
232167514Skmacy#else
233167514Skmacystatic struct cphy_ops ael1006_ops = {
234167514Skmacy	.reset           = ael1006_reset,
235180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
236180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
237180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
238180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
239181614Skmacy	.get_link_status = get_link_status_r,
240167514Skmacy	.power_down      = ael1006_power_down,
241167514Skmacy};
242167514Skmacy#endif
243167514Skmacy
244176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
245176472Skmacy			const struct mdio_ops *mdio_ops)
246167514Skmacy{
247176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops,
248176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
249176472Skmacy		  "10GBASE-SR");
250167514Skmacy	ael100x_txon(phy);
251176472Skmacy	return 0;
252167514Skmacy}
253167514Skmacy
254180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
255180583Skmacy{
256181614Skmacy	static struct reg_val regs[] = {
257181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
258181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
259181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
260181614Skmacy		{ 0, 0, 0, 0 }
261181614Skmacy	};
262180583Skmacy	static u16 sr_edc[] = {
263180583Skmacy		0xcc00, 0x2ff4,
264180583Skmacy		0xcc01, 0x3cd4,
265180583Skmacy		0xcc02, 0x2015,
266180583Skmacy		0xcc03, 0x3105,
267180583Skmacy		0xcc04, 0x6524,
268180583Skmacy		0xcc05, 0x27ff,
269180583Skmacy		0xcc06, 0x300f,
270180583Skmacy		0xcc07, 0x2c8b,
271180583Skmacy		0xcc08, 0x300b,
272180583Skmacy		0xcc09, 0x4009,
273180583Skmacy		0xcc0a, 0x400e,
274180583Skmacy		0xcc0b, 0x2f72,
275180583Skmacy		0xcc0c, 0x3002,
276180583Skmacy		0xcc0d, 0x1002,
277180583Skmacy		0xcc0e, 0x2172,
278180583Skmacy		0xcc0f, 0x3012,
279180583Skmacy		0xcc10, 0x1002,
280180583Skmacy		0xcc11, 0x25d2,
281180583Skmacy		0xcc12, 0x3012,
282180583Skmacy		0xcc13, 0x1002,
283180583Skmacy		0xcc14, 0xd01e,
284180583Skmacy		0xcc15, 0x27d2,
285180583Skmacy		0xcc16, 0x3012,
286180583Skmacy		0xcc17, 0x1002,
287180583Skmacy		0xcc18, 0x2004,
288180583Skmacy		0xcc19, 0x3c84,
289180583Skmacy		0xcc1a, 0x6436,
290180583Skmacy		0xcc1b, 0x2007,
291180583Skmacy		0xcc1c, 0x3f87,
292180583Skmacy		0xcc1d, 0x8676,
293180583Skmacy		0xcc1e, 0x40b7,
294180583Skmacy		0xcc1f, 0xa746,
295180583Skmacy		0xcc20, 0x4047,
296180583Skmacy		0xcc21, 0x5673,
297180583Skmacy		0xcc22, 0x2982,
298180583Skmacy		0xcc23, 0x3002,
299180583Skmacy		0xcc24, 0x13d2,
300180583Skmacy		0xcc25, 0x8bbd,
301180583Skmacy		0xcc26, 0x2862,
302180583Skmacy		0xcc27, 0x3012,
303180583Skmacy		0xcc28, 0x1002,
304180583Skmacy		0xcc29, 0x2092,
305180583Skmacy		0xcc2a, 0x3012,
306180583Skmacy		0xcc2b, 0x1002,
307180583Skmacy		0xcc2c, 0x5cc3,
308180583Skmacy		0xcc2d, 0x314,
309180583Skmacy		0xcc2e, 0x2942,
310180583Skmacy		0xcc2f, 0x3002,
311180583Skmacy		0xcc30, 0x1002,
312180583Skmacy		0xcc31, 0xd019,
313180583Skmacy		0xcc32, 0x2032,
314180583Skmacy		0xcc33, 0x3012,
315180583Skmacy		0xcc34, 0x1002,
316180583Skmacy		0xcc35, 0x2a04,
317180583Skmacy		0xcc36, 0x3c74,
318180583Skmacy		0xcc37, 0x6435,
319180583Skmacy		0xcc38, 0x2fa4,
320180583Skmacy		0xcc39, 0x3cd4,
321180583Skmacy		0xcc3a, 0x6624,
322180583Skmacy		0xcc3b, 0x5563,
323180583Skmacy		0xcc3c, 0x2d42,
324180583Skmacy		0xcc3d, 0x3002,
325180583Skmacy		0xcc3e, 0x13d2,
326180583Skmacy		0xcc3f, 0x464d,
327180583Skmacy		0xcc40, 0x2862,
328180583Skmacy		0xcc41, 0x3012,
329180583Skmacy		0xcc42, 0x1002,
330180583Skmacy		0xcc43, 0x2032,
331180583Skmacy		0xcc44, 0x3012,
332180583Skmacy		0xcc45, 0x1002,
333180583Skmacy		0xcc46, 0x2fb4,
334180583Skmacy		0xcc47, 0x3cd4,
335180583Skmacy		0xcc48, 0x6624,
336180583Skmacy		0xcc49, 0x5563,
337180583Skmacy		0xcc4a, 0x2d42,
338180583Skmacy		0xcc4b, 0x3002,
339180583Skmacy		0xcc4c, 0x13d2,
340180583Skmacy		0xcc4d, 0x2ed2,
341180583Skmacy		0xcc4e, 0x3002,
342180583Skmacy		0xcc4f, 0x1002,
343180583Skmacy		0xcc50, 0x2fd2,
344180583Skmacy		0xcc51, 0x3002,
345180583Skmacy		0xcc52, 0x1002,
346180583Skmacy		0xcc53, 0x004,
347180583Skmacy		0xcc54, 0x2942,
348180583Skmacy		0xcc55, 0x3002,
349180583Skmacy		0xcc56, 0x1002,
350180583Skmacy		0xcc57, 0x2092,
351180583Skmacy		0xcc58, 0x3012,
352180583Skmacy		0xcc59, 0x1002,
353180583Skmacy		0xcc5a, 0x5cc3,
354180583Skmacy		0xcc5b, 0x317,
355180583Skmacy		0xcc5c, 0x2f72,
356180583Skmacy		0xcc5d, 0x3002,
357180583Skmacy		0xcc5e, 0x1002,
358180583Skmacy		0xcc5f, 0x2942,
359180583Skmacy		0xcc60, 0x3002,
360180583Skmacy		0xcc61, 0x1002,
361180583Skmacy		0xcc62, 0x22cd,
362180583Skmacy		0xcc63, 0x301d,
363180583Skmacy		0xcc64, 0x2862,
364180583Skmacy		0xcc65, 0x3012,
365180583Skmacy		0xcc66, 0x1002,
366180583Skmacy		0xcc67, 0x2ed2,
367180583Skmacy		0xcc68, 0x3002,
368180583Skmacy		0xcc69, 0x1002,
369180583Skmacy		0xcc6a, 0x2d72,
370180583Skmacy		0xcc6b, 0x3002,
371180583Skmacy		0xcc6c, 0x1002,
372180583Skmacy		0xcc6d, 0x628f,
373180583Skmacy		0xcc6e, 0x2112,
374180583Skmacy		0xcc6f, 0x3012,
375180583Skmacy		0xcc70, 0x1002,
376180583Skmacy		0xcc71, 0x5aa3,
377180583Skmacy		0xcc72, 0x2dc2,
378180583Skmacy		0xcc73, 0x3002,
379180583Skmacy		0xcc74, 0x1312,
380180583Skmacy		0xcc75, 0x6f72,
381180583Skmacy		0xcc76, 0x1002,
382180583Skmacy		0xcc77, 0x2807,
383180583Skmacy		0xcc78, 0x31a7,
384180583Skmacy		0xcc79, 0x20c4,
385180583Skmacy		0xcc7a, 0x3c24,
386180583Skmacy		0xcc7b, 0x6724,
387180583Skmacy		0xcc7c, 0x1002,
388180583Skmacy		0xcc7d, 0x2807,
389180583Skmacy		0xcc7e, 0x3187,
390180583Skmacy		0xcc7f, 0x20c4,
391180583Skmacy		0xcc80, 0x3c24,
392180583Skmacy		0xcc81, 0x6724,
393180583Skmacy		0xcc82, 0x1002,
394180583Skmacy		0xcc83, 0x2514,
395180583Skmacy		0xcc84, 0x3c64,
396180583Skmacy		0xcc85, 0x6436,
397180583Skmacy		0xcc86, 0xdff4,
398180583Skmacy		0xcc87, 0x6436,
399180583Skmacy		0xcc88, 0x1002,
400180583Skmacy		0xcc89, 0x40a4,
401180583Skmacy		0xcc8a, 0x643c,
402180583Skmacy		0xcc8b, 0x4016,
403180583Skmacy		0xcc8c, 0x8c6c,
404180583Skmacy		0xcc8d, 0x2b24,
405180583Skmacy		0xcc8e, 0x3c24,
406180583Skmacy		0xcc8f, 0x6435,
407180583Skmacy		0xcc90, 0x1002,
408180583Skmacy		0xcc91, 0x2b24,
409180583Skmacy		0xcc92, 0x3c24,
410180583Skmacy		0xcc93, 0x643a,
411180583Skmacy		0xcc94, 0x4025,
412180583Skmacy		0xcc95, 0x8a5a,
413180583Skmacy		0xcc96, 0x1002,
414180583Skmacy		0xcc97, 0x2731,
415180583Skmacy		0xcc98, 0x3011,
416180583Skmacy		0xcc99, 0x1001,
417180583Skmacy		0xcc9a, 0xc7a0,
418180583Skmacy		0xcc9b, 0x100,
419180583Skmacy		0xcc9c, 0xc502,
420180583Skmacy		0xcc9d, 0x53ac,
421180583Skmacy		0xcc9e, 0xc503,
422180583Skmacy		0xcc9f, 0xd5d5,
423180583Skmacy		0xcca0, 0xc600,
424180583Skmacy		0xcca1, 0x2a6d,
425180583Skmacy		0xcca2, 0xc601,
426180583Skmacy		0xcca3, 0x2a4c,
427180583Skmacy		0xcca4, 0xc602,
428180583Skmacy		0xcca5, 0x111,
429180583Skmacy		0xcca6, 0xc60c,
430180583Skmacy		0xcca7, 0x5900,
431180583Skmacy		0xcca8, 0xc710,
432180583Skmacy		0xcca9, 0x700,
433180583Skmacy		0xccaa, 0xc718,
434180583Skmacy		0xccab, 0x700,
435180583Skmacy		0xccac, 0xc720,
436180583Skmacy		0xccad, 0x4700,
437180583Skmacy		0xccae, 0xc801,
438180583Skmacy		0xccaf, 0x7f50,
439180583Skmacy		0xccb0, 0xc802,
440180583Skmacy		0xccb1, 0x7760,
441180583Skmacy		0xccb2, 0xc803,
442180583Skmacy		0xccb3, 0x7fce,
443180583Skmacy		0xccb4, 0xc804,
444180583Skmacy		0xccb5, 0x5700,
445180583Skmacy		0xccb6, 0xc805,
446180583Skmacy		0xccb7, 0x5f11,
447180583Skmacy		0xccb8, 0xc806,
448180583Skmacy		0xccb9, 0x4751,
449180583Skmacy		0xccba, 0xc807,
450180583Skmacy		0xccbb, 0x57e1,
451180583Skmacy		0xccbc, 0xc808,
452180583Skmacy		0xccbd, 0x2700,
453180583Skmacy		0xccbe, 0xc809,
454180583Skmacy		0xccbf, 0x000,
455180583Skmacy		0xccc0, 0xc821,
456180583Skmacy		0xccc1, 0x002,
457180583Skmacy		0xccc2, 0xc822,
458180583Skmacy		0xccc3, 0x014,
459180583Skmacy		0xccc4, 0xc832,
460180583Skmacy		0xccc5, 0x1186,
461180583Skmacy		0xccc6, 0xc847,
462180583Skmacy		0xccc7, 0x1e02,
463180583Skmacy		0xccc8, 0xc013,
464180583Skmacy		0xccc9, 0xf341,
465180583Skmacy		0xccca, 0xc01a,
466180583Skmacy		0xcccb, 0x446,
467180583Skmacy		0xcccc, 0xc024,
468180583Skmacy		0xcccd, 0x1000,
469180583Skmacy		0xccce, 0xc025,
470180583Skmacy		0xcccf, 0xa00,
471180583Skmacy		0xccd0, 0xc026,
472180583Skmacy		0xccd1, 0xc0c,
473180583Skmacy		0xccd2, 0xc027,
474180583Skmacy		0xccd3, 0xc0c,
475180583Skmacy		0xccd4, 0xc029,
476180583Skmacy		0xccd5, 0x0a0,
477180583Skmacy		0xccd6, 0xc030,
478180583Skmacy		0xccd7, 0xa00,
479180583Skmacy		0xccd8, 0xc03c,
480180583Skmacy		0xccd9, 0x01c,
481180583Skmacy		0xccda, 0xc005,
482180583Skmacy		0xccdb, 0x7a06,
483180583Skmacy		0xccdc, 0x000,
484180583Skmacy		0xccdd, 0x2731,
485180583Skmacy		0xccde, 0x3011,
486180583Skmacy		0xccdf, 0x1001,
487180583Skmacy		0xcce0, 0xc620,
488180583Skmacy		0xcce1, 0x000,
489180583Skmacy		0xcce2, 0xc621,
490180583Skmacy		0xcce3, 0x03f,
491180583Skmacy		0xcce4, 0xc622,
492180583Skmacy		0xcce5, 0x000,
493180583Skmacy		0xcce6, 0xc623,
494180583Skmacy		0xcce7, 0x000,
495180583Skmacy		0xcce8, 0xc624,
496180583Skmacy		0xcce9, 0x000,
497180583Skmacy		0xccea, 0xc625,
498180583Skmacy		0xcceb, 0x000,
499180583Skmacy		0xccec, 0xc627,
500180583Skmacy		0xcced, 0x000,
501180583Skmacy		0xccee, 0xc628,
502180583Skmacy		0xccef, 0x000,
503180583Skmacy		0xccf0, 0xc62c,
504180583Skmacy		0xccf1, 0x000,
505180583Skmacy		0xccf2, 0x000,
506180583Skmacy		0xccf3, 0x2806,
507180583Skmacy		0xccf4, 0x3cb6,
508180583Skmacy		0xccf5, 0xc161,
509180583Skmacy		0xccf6, 0x6134,
510180583Skmacy		0xccf7, 0x6135,
511180583Skmacy		0xccf8, 0x5443,
512180583Skmacy		0xccf9, 0x303,
513180583Skmacy		0xccfa, 0x6524,
514180583Skmacy		0xccfb, 0x00b,
515180583Skmacy		0xccfc, 0x1002,
516180583Skmacy		0xccfd, 0x2104,
517180583Skmacy		0xccfe, 0x3c24,
518180583Skmacy		0xccff, 0x2105,
519180583Skmacy		0xcd00, 0x3805,
520180583Skmacy		0xcd01, 0x6524,
521180583Skmacy		0xcd02, 0xdff4,
522180583Skmacy		0xcd03, 0x4005,
523180583Skmacy		0xcd04, 0x6524,
524180583Skmacy		0xcd05, 0x1002,
525180583Skmacy		0xcd06, 0x5dd3,
526180583Skmacy		0xcd07, 0x306,
527180583Skmacy		0xcd08, 0x2ff7,
528180583Skmacy		0xcd09, 0x38f7,
529180583Skmacy		0xcd0a, 0x60b7,
530180583Skmacy		0xcd0b, 0xdffd,
531180583Skmacy		0xcd0c, 0x00a,
532180583Skmacy		0xcd0d, 0x1002,
533180583Skmacy		0xcd0e, 0
534180583Skmacy	};
535180583Skmacy	int i, err;
536180583Skmacy
537181614Skmacy	err = set_phy_regs(phy, regs);
538181614Skmacy	if (err)
539181614Skmacy		return err;
540181614Skmacy
541181614Skmacy	msleep(50);
542181614Skmacy
543181614Skmacy	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
544180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
545180583Skmacy				 sr_edc[i + 1]);
546181614Skmacy	if (!err)
547181614Skmacy		phy->priv = edc_sr;
548180583Skmacy	return err;
549180583Skmacy}
550180583Skmacy
551181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
552181614Skmacy{
553181614Skmacy	static struct reg_val regs[] = {
554181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
555181614Skmacy		{ 0, 0, 0, 0 }
556181614Skmacy	};
557181614Skmacy	static struct reg_val preemphasis[] = {
558181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
559181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
560181614Skmacy		{ 0, 0, 0, 0 }
561181614Skmacy	};
562181614Skmacy	static u16 twinax_edc[] = {
563181614Skmacy		0xcc00, 0x4009,
564181614Skmacy		0xcc01, 0x27ff,
565181614Skmacy		0xcc02, 0x300f,
566181614Skmacy		0xcc03, 0x40aa,
567181614Skmacy		0xcc04, 0x401c,
568181614Skmacy		0xcc05, 0x401e,
569181614Skmacy		0xcc06, 0x2ff4,
570181614Skmacy		0xcc07, 0x3cd4,
571181614Skmacy		0xcc08, 0x2035,
572181614Skmacy		0xcc09, 0x3145,
573181614Skmacy		0xcc0a, 0x6524,
574181614Skmacy		0xcc0b, 0x26a2,
575181614Skmacy		0xcc0c, 0x3012,
576181614Skmacy		0xcc0d, 0x1002,
577181614Skmacy		0xcc0e, 0x29c2,
578181614Skmacy		0xcc0f, 0x3002,
579181614Skmacy		0xcc10, 0x1002,
580181614Skmacy		0xcc11, 0x2072,
581181614Skmacy		0xcc12, 0x3012,
582181614Skmacy		0xcc13, 0x1002,
583181614Skmacy		0xcc14, 0x22cd,
584181614Skmacy		0xcc15, 0x301d,
585181614Skmacy		0xcc16, 0x2e52,
586181614Skmacy		0xcc17, 0x3012,
587181614Skmacy		0xcc18, 0x1002,
588181614Skmacy		0xcc19, 0x28e2,
589181614Skmacy		0xcc1a, 0x3002,
590181614Skmacy		0xcc1b, 0x1002,
591181614Skmacy		0xcc1c, 0x628f,
592181614Skmacy		0xcc1d, 0x2ac2,
593181614Skmacy		0xcc1e, 0x3012,
594181614Skmacy		0xcc1f, 0x1002,
595181614Skmacy		0xcc20, 0x5553,
596181614Skmacy		0xcc21, 0x2ae2,
597181614Skmacy		0xcc22, 0x3002,
598181614Skmacy		0xcc23, 0x1302,
599181614Skmacy		0xcc24, 0x401e,
600181614Skmacy		0xcc25, 0x2be2,
601181614Skmacy		0xcc26, 0x3012,
602181614Skmacy		0xcc27, 0x1002,
603181614Skmacy		0xcc28, 0x2da2,
604181614Skmacy		0xcc29, 0x3012,
605181614Skmacy		0xcc2a, 0x1002,
606181614Skmacy		0xcc2b, 0x2ba2,
607181614Skmacy		0xcc2c, 0x3002,
608181614Skmacy		0xcc2d, 0x1002,
609181614Skmacy		0xcc2e, 0x5ee3,
610181614Skmacy		0xcc2f, 0x305,
611181614Skmacy		0xcc30, 0x400e,
612181614Skmacy		0xcc31, 0x2bc2,
613181614Skmacy		0xcc32, 0x3002,
614181614Skmacy		0xcc33, 0x1002,
615181614Skmacy		0xcc34, 0x2b82,
616181614Skmacy		0xcc35, 0x3012,
617181614Skmacy		0xcc36, 0x1002,
618181614Skmacy		0xcc37, 0x5663,
619181614Skmacy		0xcc38, 0x302,
620181614Skmacy		0xcc39, 0x401e,
621181614Skmacy		0xcc3a, 0x6f72,
622181614Skmacy		0xcc3b, 0x1002,
623181614Skmacy		0xcc3c, 0x628f,
624181614Skmacy		0xcc3d, 0x2be2,
625181614Skmacy		0xcc3e, 0x3012,
626181614Skmacy		0xcc3f, 0x1002,
627181614Skmacy		0xcc40, 0x22cd,
628181614Skmacy		0xcc41, 0x301d,
629181614Skmacy		0xcc42, 0x2e52,
630181614Skmacy		0xcc43, 0x3012,
631181614Skmacy		0xcc44, 0x1002,
632181614Skmacy		0xcc45, 0x2522,
633181614Skmacy		0xcc46, 0x3012,
634181614Skmacy		0xcc47, 0x1002,
635181614Skmacy		0xcc48, 0x2da2,
636181614Skmacy		0xcc49, 0x3012,
637181614Skmacy		0xcc4a, 0x1002,
638181614Skmacy		0xcc4b, 0x2ca2,
639181614Skmacy		0xcc4c, 0x3012,
640181614Skmacy		0xcc4d, 0x1002,
641181614Skmacy		0xcc4e, 0x2fa4,
642181614Skmacy		0xcc4f, 0x3cd4,
643181614Skmacy		0xcc50, 0x6624,
644181614Skmacy		0xcc51, 0x410b,
645181614Skmacy		0xcc52, 0x56b3,
646181614Skmacy		0xcc53, 0x3c4,
647181614Skmacy		0xcc54, 0x2fb2,
648181614Skmacy		0xcc55, 0x3002,
649181614Skmacy		0xcc56, 0x1002,
650181614Skmacy		0xcc57, 0x220b,
651181614Skmacy		0xcc58, 0x303b,
652181614Skmacy		0xcc59, 0x56b3,
653181614Skmacy		0xcc5a, 0x3c3,
654181614Skmacy		0xcc5b, 0x866b,
655181614Skmacy		0xcc5c, 0x400c,
656181614Skmacy		0xcc5d, 0x23a2,
657181614Skmacy		0xcc5e, 0x3012,
658181614Skmacy		0xcc5f, 0x1002,
659181614Skmacy		0xcc60, 0x2da2,
660181614Skmacy		0xcc61, 0x3012,
661181614Skmacy		0xcc62, 0x1002,
662181614Skmacy		0xcc63, 0x2ca2,
663181614Skmacy		0xcc64, 0x3012,
664181614Skmacy		0xcc65, 0x1002,
665181614Skmacy		0xcc66, 0x2fb4,
666181614Skmacy		0xcc67, 0x3cd4,
667181614Skmacy		0xcc68, 0x6624,
668181614Skmacy		0xcc69, 0x56b3,
669181614Skmacy		0xcc6a, 0x3c3,
670181614Skmacy		0xcc6b, 0x866b,
671181614Skmacy		0xcc6c, 0x401c,
672181614Skmacy		0xcc6d, 0x2205,
673181614Skmacy		0xcc6e, 0x3035,
674181614Skmacy		0xcc6f, 0x5b53,
675181614Skmacy		0xcc70, 0x2c52,
676181614Skmacy		0xcc71, 0x3002,
677181614Skmacy		0xcc72, 0x13c2,
678181614Skmacy		0xcc73, 0x5cc3,
679181614Skmacy		0xcc74, 0x317,
680181614Skmacy		0xcc75, 0x2522,
681181614Skmacy		0xcc76, 0x3012,
682181614Skmacy		0xcc77, 0x1002,
683181614Skmacy		0xcc78, 0x2da2,
684181614Skmacy		0xcc79, 0x3012,
685181614Skmacy		0xcc7a, 0x1002,
686181614Skmacy		0xcc7b, 0x2b82,
687181614Skmacy		0xcc7c, 0x3012,
688181614Skmacy		0xcc7d, 0x1002,
689181614Skmacy		0xcc7e, 0x5663,
690181614Skmacy		0xcc7f, 0x303,
691181614Skmacy		0xcc80, 0x401e,
692181614Skmacy		0xcc81, 0x004,
693181614Skmacy		0xcc82, 0x2c42,
694181614Skmacy		0xcc83, 0x3012,
695181614Skmacy		0xcc84, 0x1002,
696181614Skmacy		0xcc85, 0x6f72,
697181614Skmacy		0xcc86, 0x1002,
698181614Skmacy		0xcc87, 0x628f,
699181614Skmacy		0xcc88, 0x2304,
700181614Skmacy		0xcc89, 0x3c84,
701181614Skmacy		0xcc8a, 0x6436,
702181614Skmacy		0xcc8b, 0xdff4,
703181614Skmacy		0xcc8c, 0x6436,
704181614Skmacy		0xcc8d, 0x2ff5,
705181614Skmacy		0xcc8e, 0x3005,
706181614Skmacy		0xcc8f, 0x8656,
707181614Skmacy		0xcc90, 0xdfba,
708181614Skmacy		0xcc91, 0x56a3,
709181614Skmacy		0xcc92, 0xd05a,
710181614Skmacy		0xcc93, 0x21c2,
711181614Skmacy		0xcc94, 0x3012,
712181614Skmacy		0xcc95, 0x1392,
713181614Skmacy		0xcc96, 0xd05a,
714181614Skmacy		0xcc97, 0x56a3,
715181614Skmacy		0xcc98, 0xdfba,
716181614Skmacy		0xcc99, 0x383,
717181614Skmacy		0xcc9a, 0x6f72,
718181614Skmacy		0xcc9b, 0x1002,
719181614Skmacy		0xcc9c, 0x28c5,
720181614Skmacy		0xcc9d, 0x3005,
721181614Skmacy		0xcc9e, 0x4178,
722181614Skmacy		0xcc9f, 0x5653,
723181614Skmacy		0xcca0, 0x384,
724181614Skmacy		0xcca1, 0x22b2,
725181614Skmacy		0xcca2, 0x3012,
726181614Skmacy		0xcca3, 0x1002,
727181614Skmacy		0xcca4, 0x2be5,
728181614Skmacy		0xcca5, 0x3005,
729181614Skmacy		0xcca6, 0x41e8,
730181614Skmacy		0xcca7, 0x5653,
731181614Skmacy		0xcca8, 0x382,
732181614Skmacy		0xcca9, 0x002,
733181614Skmacy		0xccaa, 0x4258,
734181614Skmacy		0xccab, 0x2474,
735181614Skmacy		0xccac, 0x3c84,
736181614Skmacy		0xccad, 0x6437,
737181614Skmacy		0xccae, 0xdff4,
738181614Skmacy		0xccaf, 0x6437,
739181614Skmacy		0xccb0, 0x2ff5,
740181614Skmacy		0xccb1, 0x3c05,
741181614Skmacy		0xccb2, 0x8757,
742181614Skmacy		0xccb3, 0xb888,
743181614Skmacy		0xccb4, 0x9787,
744181614Skmacy		0xccb5, 0xdff4,
745181614Skmacy		0xccb6, 0x6724,
746181614Skmacy		0xccb7, 0x866a,
747181614Skmacy		0xccb8, 0x6f72,
748181614Skmacy		0xccb9, 0x1002,
749181614Skmacy		0xccba, 0x2d01,
750181614Skmacy		0xccbb, 0x3011,
751181614Skmacy		0xccbc, 0x1001,
752181614Skmacy		0xccbd, 0xc620,
753181614Skmacy		0xccbe, 0x14e5,
754181614Skmacy		0xccbf, 0xc621,
755181614Skmacy		0xccc0, 0xc53d,
756181614Skmacy		0xccc1, 0xc622,
757181614Skmacy		0xccc2, 0x3cbe,
758181614Skmacy		0xccc3, 0xc623,
759181614Skmacy		0xccc4, 0x4452,
760181614Skmacy		0xccc5, 0xc624,
761181614Skmacy		0xccc6, 0xc5c5,
762181614Skmacy		0xccc7, 0xc625,
763181614Skmacy		0xccc8, 0xe01e,
764181614Skmacy		0xccc9, 0xc627,
765181614Skmacy		0xccca, 0x000,
766181614Skmacy		0xcccb, 0xc628,
767181614Skmacy		0xcccc, 0x000,
768181614Skmacy		0xcccd, 0xc62b,
769181614Skmacy		0xccce, 0x000,
770181614Skmacy		0xcccf, 0xc62c,
771181614Skmacy		0xccd0, 0x000,
772181614Skmacy		0xccd1, 0x000,
773181614Skmacy		0xccd2, 0x2d01,
774181614Skmacy		0xccd3, 0x3011,
775181614Skmacy		0xccd4, 0x1001,
776181614Skmacy		0xccd5, 0xc620,
777181614Skmacy		0xccd6, 0x000,
778181614Skmacy		0xccd7, 0xc621,
779181614Skmacy		0xccd8, 0x000,
780181614Skmacy		0xccd9, 0xc622,
781181614Skmacy		0xccda, 0x0ce,
782181614Skmacy		0xccdb, 0xc623,
783181614Skmacy		0xccdc, 0x07f,
784181614Skmacy		0xccdd, 0xc624,
785181614Skmacy		0xccde, 0x032,
786181614Skmacy		0xccdf, 0xc625,
787181614Skmacy		0xcce0, 0x000,
788181614Skmacy		0xcce1, 0xc627,
789181614Skmacy		0xcce2, 0x000,
790181614Skmacy		0xcce3, 0xc628,
791181614Skmacy		0xcce4, 0x000,
792181614Skmacy		0xcce5, 0xc62b,
793181614Skmacy		0xcce6, 0x000,
794181614Skmacy		0xcce7, 0xc62c,
795181614Skmacy		0xcce8, 0x000,
796181614Skmacy		0xcce9, 0x000,
797181614Skmacy		0xccea, 0x2d01,
798181614Skmacy		0xcceb, 0x3011,
799181614Skmacy		0xccec, 0x1001,
800181614Skmacy		0xcced, 0xc502,
801181614Skmacy		0xccee, 0x609f,
802181614Skmacy		0xccef, 0xc600,
803181614Skmacy		0xccf0, 0x2a6e,
804181614Skmacy		0xccf1, 0xc601,
805181614Skmacy		0xccf2, 0x2a2c,
806181614Skmacy		0xccf3, 0xc60c,
807181614Skmacy		0xccf4, 0x5400,
808181614Skmacy		0xccf5, 0xc710,
809181614Skmacy		0xccf6, 0x700,
810181614Skmacy		0xccf7, 0xc718,
811181614Skmacy		0xccf8, 0x700,
812181614Skmacy		0xccf9, 0xc720,
813181614Skmacy		0xccfa, 0x4700,
814181614Skmacy		0xccfb, 0xc728,
815181614Skmacy		0xccfc, 0x700,
816181614Skmacy		0xccfd, 0xc729,
817181614Skmacy		0xccfe, 0x1207,
818181614Skmacy		0xccff, 0xc801,
819181614Skmacy		0xcd00, 0x7f50,
820181614Skmacy		0xcd01, 0xc802,
821181614Skmacy		0xcd02, 0x7760,
822181614Skmacy		0xcd03, 0xc803,
823181614Skmacy		0xcd04, 0x7fce,
824181614Skmacy		0xcd05, 0xc804,
825181614Skmacy		0xcd06, 0x520e,
826181614Skmacy		0xcd07, 0xc805,
827181614Skmacy		0xcd08, 0x5c11,
828181614Skmacy		0xcd09, 0xc806,
829181614Skmacy		0xcd0a, 0x3c51,
830181614Skmacy		0xcd0b, 0xc807,
831181614Skmacy		0xcd0c, 0x4061,
832181614Skmacy		0xcd0d, 0xc808,
833181614Skmacy		0xcd0e, 0x49c1,
834181614Skmacy		0xcd0f, 0xc809,
835181614Skmacy		0xcd10, 0x3840,
836181614Skmacy		0xcd11, 0xc80a,
837181614Skmacy		0xcd12, 0x000,
838181614Skmacy		0xcd13, 0xc821,
839181614Skmacy		0xcd14, 0x002,
840181614Skmacy		0xcd15, 0xc822,
841181614Skmacy		0xcd16, 0x046,
842181614Skmacy		0xcd17, 0xc844,
843181614Skmacy		0xcd18, 0x182f,
844181614Skmacy		0xcd19, 0xc013,
845181614Skmacy		0xcd1a, 0xf341,
846181614Skmacy		0xcd1b, 0xc01a,
847181614Skmacy		0xcd1c, 0x446,
848181614Skmacy		0xcd1d, 0xc024,
849181614Skmacy		0xcd1e, 0x1000,
850181614Skmacy		0xcd1f, 0xc025,
851181614Skmacy		0xcd20, 0xa00,
852181614Skmacy		0xcd21, 0xc026,
853181614Skmacy		0xcd22, 0xc0c,
854181614Skmacy		0xcd23, 0xc027,
855181614Skmacy		0xcd24, 0xc0c,
856181614Skmacy		0xcd25, 0xc029,
857181614Skmacy		0xcd26, 0x0a0,
858181614Skmacy		0xcd27, 0xc030,
859181614Skmacy		0xcd28, 0xa00,
860181614Skmacy		0xcd29, 0xc03c,
861181614Skmacy		0xcd2a, 0x01c,
862181614Skmacy		0xcd2b, 0x000,
863181614Skmacy		0xcd2c, 0x2b84,
864181614Skmacy		0xcd2d, 0x3c74,
865181614Skmacy		0xcd2e, 0x6435,
866181614Skmacy		0xcd2f, 0xdff4,
867181614Skmacy		0xcd30, 0x6435,
868181614Skmacy		0xcd31, 0x2806,
869181614Skmacy		0xcd32, 0x3006,
870181614Skmacy		0xcd33, 0x8565,
871181614Skmacy		0xcd34, 0x2b24,
872181614Skmacy		0xcd35, 0x3c24,
873181614Skmacy		0xcd36, 0x6436,
874181614Skmacy		0xcd37, 0x1002,
875181614Skmacy		0xcd38, 0x2b24,
876181614Skmacy		0xcd39, 0x3c24,
877181614Skmacy		0xcd3a, 0x6436,
878181614Skmacy		0xcd3b, 0x4045,
879181614Skmacy		0xcd3c, 0x8656,
880181614Skmacy		0xcd3d, 0x1002,
881181614Skmacy		0xcd3e, 0x2807,
882181614Skmacy		0xcd3f, 0x31a7,
883181614Skmacy		0xcd40, 0x20c4,
884181614Skmacy		0xcd41, 0x3c24,
885181614Skmacy		0xcd42, 0x6724,
886181614Skmacy		0xcd43, 0x1002,
887181614Skmacy		0xcd44, 0x2807,
888181614Skmacy		0xcd45, 0x3187,
889181614Skmacy		0xcd46, 0x20c4,
890181614Skmacy		0xcd47, 0x3c24,
891181614Skmacy		0xcd48, 0x6724,
892181614Skmacy		0xcd49, 0x1002,
893181614Skmacy		0xcd4a, 0x2514,
894181614Skmacy		0xcd4b, 0x3c64,
895181614Skmacy		0xcd4c, 0x6436,
896181614Skmacy		0xcd4d, 0xdff4,
897181614Skmacy		0xcd4e, 0x6436,
898181614Skmacy		0xcd4f, 0x1002,
899181614Skmacy		0xcd50, 0x2806,
900181614Skmacy		0xcd51, 0x3cb6,
901181614Skmacy		0xcd52, 0xc161,
902181614Skmacy		0xcd53, 0x6134,
903181614Skmacy		0xcd54, 0x6135,
904181614Skmacy		0xcd55, 0x5443,
905181614Skmacy		0xcd56, 0x303,
906181614Skmacy		0xcd57, 0x6524,
907181614Skmacy		0xcd58, 0x00b,
908181614Skmacy		0xcd59, 0x1002,
909181614Skmacy		0xcd5a, 0xd019,
910181614Skmacy		0xcd5b, 0x2104,
911181614Skmacy		0xcd5c, 0x3c24,
912181614Skmacy		0xcd5d, 0x2105,
913181614Skmacy		0xcd5e, 0x3805,
914181614Skmacy		0xcd5f, 0x6524,
915181614Skmacy		0xcd60, 0xdff4,
916181614Skmacy		0xcd61, 0x4005,
917181614Skmacy		0xcd62, 0x6524,
918181614Skmacy		0xcd63, 0x2e8d,
919181614Skmacy		0xcd64, 0x303d,
920181614Skmacy		0xcd65, 0x5dd3,
921181614Skmacy		0xcd66, 0x306,
922181614Skmacy		0xcd67, 0x2ff7,
923181614Skmacy		0xcd68, 0x38f7,
924181614Skmacy		0xcd69, 0x60b7,
925181614Skmacy		0xcd6a, 0xdffd,
926181614Skmacy		0xcd6b, 0x00a,
927181614Skmacy		0xcd6c, 0x1002,
928181614Skmacy		0xcd6d, 0
929181614Skmacy	};
930181614Skmacy	int i, err;
931181614Skmacy
932181614Skmacy	err = set_phy_regs(phy, regs);
933181614Skmacy	if (!err && modtype == phy_modtype_twinax_long)
934181614Skmacy		err = set_phy_regs(phy, preemphasis);
935181614Skmacy	if (err)
936181614Skmacy		return err;
937181614Skmacy
938181614Skmacy	msleep(50);
939181614Skmacy
940181614Skmacy	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
941181614Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
942181614Skmacy				 twinax_edc[i + 1]);
943181614Skmacy	if (!err)
944181614Skmacy		phy->priv = edc_twinax;
945181614Skmacy	return err;
946181614Skmacy}
947181614Skmacy
948181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr)
949181614Skmacy{
950181614Skmacy	int i, err;
951181614Skmacy	unsigned int stat, data;
952181614Skmacy
953181614Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
954181614Skmacy			 (dev_addr << 8) | (1 << 8) | word_addr);
955181614Skmacy	if (err)
956181614Skmacy		return err;
957181614Skmacy
958181614Skmacy	for (i = 0; i < 5; i++) {
959181614Skmacy		msleep(1);
960181614Skmacy		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
961181614Skmacy		if (err)
962181614Skmacy			return err;
963181614Skmacy		if ((stat & 3) == 1) {
964181614Skmacy			err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA,
965181614Skmacy					&data);
966181614Skmacy			if (err)
967181614Skmacy				return err;
968181614Skmacy			return data >> 8;
969181614Skmacy		}
970181614Skmacy	}
971181614Skmacy	CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n",
972181614Skmacy		phy->addr, word_addr);
973181614Skmacy	return -ETIMEDOUT;
974181614Skmacy}
975181614Skmacy
976181614Skmacystatic int get_module_type(struct cphy *phy, int delay_ms)
977181614Skmacy{
978181614Skmacy	int v;
979181614Skmacy	unsigned int stat;
980181614Skmacy
981181614Skmacy	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
982181614Skmacy	if (v)
983181614Skmacy		return v;
984181614Skmacy
985181614Skmacy	if (stat & (1 << 8))			/* module absent */
986181614Skmacy		return phy_modtype_none;
987181614Skmacy
988181614Skmacy	if (delay_ms)
989181614Skmacy		msleep(delay_ms);
990181614Skmacy
991181614Skmacy	/* see SFF-8472 for below */
992181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3);
993181614Skmacy	if (v < 0)
994181614Skmacy		return v;
995181614Skmacy
996181614Skmacy	if (v == 0x10)
997181614Skmacy		return phy_modtype_sr;
998181614Skmacy	if (v == 0x20)
999181614Skmacy		return phy_modtype_lr;
1000181614Skmacy	if (v == 0x40)
1001181614Skmacy		return phy_modtype_lrm;
1002181614Skmacy
1003181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6);
1004181614Skmacy	if (v < 0)
1005181614Skmacy		return v;
1006181614Skmacy	if (v != 4)
1007181614Skmacy		goto unknown;
1008181614Skmacy
1009181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10);
1010181614Skmacy	if (v < 0)
1011181614Skmacy		return v;
1012181614Skmacy
1013181614Skmacy	if (v & 0x80) {
1014181614Skmacy		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
1015181614Skmacy		if (v < 0)
1016181614Skmacy			return v;
1017181614Skmacy		return v > 10 ? phy_modtype_twinax_long : phy_modtype_twinax;
1018181614Skmacy	}
1019181614Skmacyunknown:
1020181614Skmacy	return phy_modtype_unknown;
1021181614Skmacy}
1022181614Skmacy
1023181614Skmacystatic int ael2005_intr_enable(struct cphy *phy)
1024181614Skmacy{
1025181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
1026181614Skmacy	return err ? err : t3_phy_lasi_intr_enable(phy);
1027181614Skmacy}
1028181614Skmacy
1029181614Skmacystatic int ael2005_intr_disable(struct cphy *phy)
1030181614Skmacy{
1031181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
1032181614Skmacy	return err ? err : t3_phy_lasi_intr_disable(phy);
1033181614Skmacy}
1034181614Skmacy
1035181614Skmacystatic int ael2005_intr_clear(struct cphy *phy)
1036181614Skmacy{
1037181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
1038181614Skmacy	return err ? err : t3_phy_lasi_intr_clear(phy);
1039181614Skmacy}
1040181614Skmacy
1041180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
1042180583Skmacy{
1043180583Skmacy	static struct reg_val regs0[] = {
1044180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
1045180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
1046180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
1047180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1048180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
1049180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1050180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
1051180583Skmacy		{ 0, 0, 0, 0 }
1052180583Skmacy	};
1053180583Skmacy	static struct reg_val regs1[] = {
1054180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
1055180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
1056180583Skmacy		{ 0, 0, 0, 0 }
1057180583Skmacy	};
1058180583Skmacy
1059181614Skmacy	int err, lasi_ctrl;
1060180583Skmacy
1061181614Skmacy	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
1062181614Skmacy	if (err)
1063181614Skmacy		return err;
1064181614Skmacy
1065180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
1066180583Skmacy	if (err)
1067180583Skmacy		return err;
1068180583Skmacy
1069180583Skmacy	msleep(125);
1070181614Skmacy	phy->priv = edc_none;
1071180583Skmacy	err = set_phy_regs(phy, regs0);
1072180583Skmacy	if (err)
1073180583Skmacy		return err;
1074180583Skmacy
1075180583Skmacy	msleep(50);
1076181614Skmacy
1077181614Skmacy	err = get_module_type(phy, 0);
1078181614Skmacy	if (err < 0)
1079181614Skmacy		return err;
1080181614Skmacy	phy->modtype = (u8)err;
1081181614Skmacy
1082181614Skmacy	if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
1083181614Skmacy		err = ael2005_setup_twinax_edc(phy, err);
1084181614Skmacy	else
1085181614Skmacy		err = ael2005_setup_sr_edc(phy);
1086180583Skmacy	if (err)
1087180583Skmacy		return err;
1088180583Skmacy
1089181614Skmacy	err = set_phy_regs(phy, regs1);
1090180583Skmacy	if (err)
1091180583Skmacy		return err;
1092180583Skmacy
1093181614Skmacy	/* reset wipes out interrupts, reenable them if they were on */
1094181614Skmacy	if (lasi_ctrl & 1)
1095181614Skmacy		err = ael2005_intr_enable(phy);
1096181614Skmacy	return err;
1097180583Skmacy}
1098180583Skmacy
1099181614Skmacystatic int ael2005_intr_handler(struct cphy *phy)
1100181614Skmacy{
1101181614Skmacy	unsigned int stat;
1102181614Skmacy	int ret, edc_needed, cause = 0;
1103181614Skmacy
1104181614Skmacy	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
1105181614Skmacy	if (ret)
1106181614Skmacy		return ret;
1107181614Skmacy
1108181614Skmacy	if (stat & AEL2005_MODDET_IRQ) {
1109181614Skmacy		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
1110181614Skmacy				 0xd00);
1111181614Skmacy		if (ret)
1112181614Skmacy			return ret;
1113181614Skmacy
1114181614Skmacy		/* modules have max 300 ms init time after hot plug */
1115181614Skmacy		ret = get_module_type(phy, 300);
1116181614Skmacy		if (ret < 0)
1117181614Skmacy			return ret;
1118181614Skmacy
1119181614Skmacy		phy->modtype = (u8)ret;
1120181614Skmacy		if (ret == phy_modtype_none)
1121181614Skmacy			edc_needed = phy->priv;       /* on unplug retain EDC */
1122181614Skmacy		else if (ret == phy_modtype_twinax ||
1123181614Skmacy			 ret == phy_modtype_twinax_long)
1124181614Skmacy			edc_needed = edc_twinax;
1125181614Skmacy		else
1126181614Skmacy			edc_needed = edc_sr;
1127181614Skmacy
1128181614Skmacy		if (edc_needed != phy->priv) {
1129181614Skmacy			ret = ael2005_reset(phy, 0);
1130181614Skmacy			return ret ? ret : cphy_cause_module_change;
1131181614Skmacy		}
1132181614Skmacy		cause = cphy_cause_module_change;
1133181614Skmacy	}
1134181614Skmacy
1135181614Skmacy	ret = t3_phy_lasi_intr_handler(phy);
1136181614Skmacy	return ret < 0 ? ret : ret + cause;
1137181614Skmacy}
1138181614Skmacy
1139167514Skmacy#ifdef C99_NOT_SUPPORTED
1140180583Skmacystatic struct cphy_ops ael2005_ops = {
1141180583Skmacy	ael2005_reset,
1142181614Skmacy	ael2005_intr_enable,
1143181614Skmacy	ael2005_intr_disable,
1144181614Skmacy	ael2005_intr_clear,
1145181614Skmacy	ael2005_intr_handler,
1146180583Skmacy	NULL,
1147180583Skmacy	NULL,
1148180583Skmacy	NULL,
1149180583Skmacy	NULL,
1150180583Skmacy	NULL,
1151181614Skmacy	get_link_status_r,
1152180583Skmacy	ael1002_power_down,
1153180583Skmacy};
1154180583Skmacy#else
1155180583Skmacystatic struct cphy_ops ael2005_ops = {
1156180583Skmacy	.reset           = ael2005_reset,
1157181614Skmacy	.intr_enable     = ael2005_intr_enable,
1158181614Skmacy	.intr_disable    = ael2005_intr_disable,
1159181614Skmacy	.intr_clear      = ael2005_intr_clear,
1160181614Skmacy	.intr_handler    = ael2005_intr_handler,
1161181614Skmacy	.get_link_status = get_link_status_r,
1162180583Skmacy	.power_down      = ael1002_power_down,
1163180583Skmacy};
1164180583Skmacy#endif
1165180583Skmacy
1166180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1167180583Skmacy			const struct mdio_ops *mdio_ops)
1168180583Skmacy{
1169180583Skmacy	cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops,
1170181614Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
1171181614Skmacy		  SUPPORTED_IRQ, "10GBASE-R");
1172180583Skmacy	msleep(125);
1173180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
1174180583Skmacy				   1 << 5);
1175180583Skmacy}
1176180583Skmacy
1177181614Skmacy/*
1178181614Skmacy * Get link status for a 10GBASE-X device.
1179181614Skmacy */
1180181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed,
1181181614Skmacy			     int *duplex, int *fc)
1182181614Skmacy{
1183181614Skmacy	if (link_ok) {
1184181614Skmacy		unsigned int stat0, stat1, stat2;
1185181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
1186181614Skmacy
1187181614Skmacy		if (!err)
1188181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
1189181614Skmacy		if (!err)
1190181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
1191181614Skmacy		if (err)
1192181614Skmacy			return err;
1193181614Skmacy		*link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1;
1194181614Skmacy	}
1195181614Skmacy	if (speed)
1196181614Skmacy		*speed = SPEED_10000;
1197181614Skmacy	if (duplex)
1198181614Skmacy		*duplex = DUPLEX_FULL;
1199181614Skmacy	return 0;
1200181614Skmacy}
1201181614Skmacy
1202180583Skmacy#ifdef C99_NOT_SUPPORTED
1203167514Skmacystatic struct cphy_ops qt2045_ops = {
1204167514Skmacy	ael1006_reset,
1205180583Skmacy	t3_phy_lasi_intr_enable,
1206180583Skmacy	t3_phy_lasi_intr_disable,
1207180583Skmacy	t3_phy_lasi_intr_clear,
1208180583Skmacy	t3_phy_lasi_intr_handler,
1209167514Skmacy	NULL,
1210167514Skmacy	NULL,
1211167514Skmacy	NULL,
1212167514Skmacy	NULL,
1213167514Skmacy	NULL,
1214181614Skmacy	get_link_status_x,
1215167514Skmacy	ael1006_power_down,
1216167514Skmacy};
1217167514Skmacy#else
1218167514Skmacystatic struct cphy_ops qt2045_ops = {
1219167514Skmacy	.reset           = ael1006_reset,
1220180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
1221180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
1222180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
1223180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
1224181614Skmacy	.get_link_status = get_link_status_x,
1225167514Skmacy	.power_down      = ael1006_power_down,
1226167514Skmacy};
1227167514Skmacy#endif
1228167514Skmacy
1229176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1230176472Skmacy		       const struct mdio_ops *mdio_ops)
1231167514Skmacy{
1232167514Skmacy	unsigned int stat;
1233167514Skmacy
1234176472Skmacy	cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops,
1235176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1236176472Skmacy		  "10GBASE-CX4");
1237167514Skmacy
1238167514Skmacy	/*
1239167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
1240167514Skmacy	 * have it at 1.
1241167514Skmacy	 */
1242167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
1243167514Skmacy	    stat == 0xffff)
1244167514Skmacy		phy->addr = 1;
1245176472Skmacy	return 0;
1246167514Skmacy}
1247167514Skmacy
1248167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
1249167514Skmacy{
1250167514Skmacy	return 0;
1251167514Skmacy}
1252167514Skmacy
1253167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
1254167514Skmacy				       int *speed, int *duplex, int *fc)
1255167514Skmacy{
1256167514Skmacy	if (link_ok) {
1257167514Skmacy		unsigned int status;
1258167514Skmacy
1259167514Skmacy		status = t3_read_reg(phy->adapter,
1260170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
1261170654Skmacy			 t3_read_reg(phy->adapter,
1262170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
1263170654Skmacy			 t3_read_reg(phy->adapter,
1264170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
1265170654Skmacy			 t3_read_reg(phy->adapter,
1266170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
1267167514Skmacy		*link_ok = !(status & F_LOWSIG0);
1268167514Skmacy	}
1269167514Skmacy	if (speed)
1270167514Skmacy		*speed = SPEED_10000;
1271167514Skmacy	if (duplex)
1272167514Skmacy		*duplex = DUPLEX_FULL;
1273167514Skmacy	return 0;
1274167514Skmacy}
1275167514Skmacy
1276167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
1277167514Skmacy{
1278167514Skmacy	return 0;
1279167514Skmacy}
1280167514Skmacy
1281167514Skmacy#ifdef C99_NOT_SUPPORTED
1282167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1283167514Skmacy	xaui_direct_reset,
1284167514Skmacy	ael1002_intr_noop,
1285167514Skmacy	ael1002_intr_noop,
1286167514Skmacy	ael1002_intr_noop,
1287167514Skmacy	ael1002_intr_noop,
1288167514Skmacy	NULL,
1289167514Skmacy	NULL,
1290167514Skmacy	NULL,
1291167514Skmacy	NULL,
1292167514Skmacy	NULL,
1293167514Skmacy	xaui_direct_get_link_status,
1294167514Skmacy	xaui_direct_power_down,
1295167514Skmacy};
1296167514Skmacy#else
1297167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1298167514Skmacy	.reset           = xaui_direct_reset,
1299167514Skmacy	.intr_enable     = ael1002_intr_noop,
1300167514Skmacy	.intr_disable    = ael1002_intr_noop,
1301167514Skmacy	.intr_clear      = ael1002_intr_noop,
1302167514Skmacy	.intr_handler    = ael1002_intr_noop,
1303167514Skmacy	.get_link_status = xaui_direct_get_link_status,
1304167514Skmacy	.power_down      = xaui_direct_power_down,
1305167514Skmacy};
1306167514Skmacy#endif
1307167514Skmacy
1308176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1309176472Skmacy			    const struct mdio_ops *mdio_ops)
1310167514Skmacy{
1311176472Skmacy	cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops,
1312176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1313176472Skmacy		  "10GBASE-CX4");
1314176472Skmacy	return 0;
1315167514Skmacy}
1316