cxgb_ael1002.c revision 181614
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 181614 2008-08-11 23:01:34Z kmacy $");
32167514Skmacy
33170076Skmacy#ifdef CONFIG_DEFINED
34170076Skmacy#include <cxgb_include.h>
35170076Skmacy#else
36170076Skmacy#include <dev/cxgb/cxgb_include.h>
37170076Skmacy#endif
38167514Skmacy
39176472Skmacy#undef msleep
40176472Skmacy#define msleep t3_os_sleep
41176472Skmacy
42167514Skmacyenum {
43181614Skmacy	PMD_RSD     = 10,   /* PMA/PMD receive signal detect register */
44181614Skmacy	PCS_STAT1_X = 24,   /* 10GBASE-X PCS status 1 register */
45181614Skmacy	PCS_STAT1_R = 32,   /* 10GBASE-R PCS status 1 register */
46181614Skmacy	XS_LN_STAT  = 24    /* XS lane status register */
47181614Skmacy};
48181614Skmacy
49181614Skmacyenum {
50167514Skmacy	AEL100X_TX_DISABLE  = 9,
51167514Skmacy	AEL100X_TX_CONFIG1  = 0xc002,
52167514Skmacy	AEL1002_PWR_DOWN_HI = 0xc011,
53167514Skmacy	AEL1002_PWR_DOWN_LO = 0xc012,
54167514Skmacy	AEL1002_XFI_EQL     = 0xc015,
55167514Skmacy	AEL1002_LB_EN       = 0xc017,
56180583Skmacy	AEL_OPT_SETTINGS    = 0xc017,
57181614Skmacy	AEL_I2C_CTRL        = 0xc30a,
58181614Skmacy	AEL_I2C_DATA        = 0xc30b,
59181614Skmacy	AEL_I2C_STAT        = 0xc30c,
60181614Skmacy	AEL2005_GPIO_CTRL   = 0xc214,
61181614Skmacy	AEL2005_GPIO_STAT   = 0xc215,
62180583Skmacy};
63167514Skmacy
64181614Skmacyenum { edc_none, edc_sr, edc_twinax };
65181614Skmacy
66181614Skmacy/* PHY module I2C device address */
67181614Skmacy#define MODULE_DEV_ADDR 0xa0
68181614Skmacy
69181614Skmacy#define AEL2005_MODDET_IRQ 4
70181614Skmacy
71180583Skmacystruct reg_val {
72180583Skmacy	unsigned short mmd_addr;
73180583Skmacy	unsigned short reg_addr;
74180583Skmacy	unsigned short clear_bits;
75180583Skmacy	unsigned short set_bits;
76167514Skmacy};
77167514Skmacy
78180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv)
79180583Skmacy{
80180583Skmacy	int err;
81180583Skmacy
82180583Skmacy	for (err = 0; rv->mmd_addr && !err; rv++) {
83180583Skmacy		if (rv->clear_bits == 0xffff)
84180583Skmacy			err = mdio_write(phy, rv->mmd_addr, rv->reg_addr,
85180583Skmacy					 rv->set_bits);
86180583Skmacy		else
87180583Skmacy			err = t3_mdio_change_bits(phy, rv->mmd_addr,
88180583Skmacy						  rv->reg_addr, rv->clear_bits,
89180583Skmacy						  rv->set_bits);
90180583Skmacy	}
91180583Skmacy	return err;
92180583Skmacy}
93180583Skmacy
94167514Skmacystatic void ael100x_txon(struct cphy *phy)
95167514Skmacy{
96167514Skmacy	int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL;
97167514Skmacy
98176472Skmacy	msleep(100);
99167514Skmacy	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio);
100176472Skmacy	msleep(30);
101167514Skmacy}
102167514Skmacy
103167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable)
104167514Skmacy{
105167514Skmacy	int err;
106167514Skmacy
107167514Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable);
108167514Skmacy	if (!err)
109167514Skmacy		err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
110167514Skmacy					  BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
111167514Skmacy	return err;
112167514Skmacy}
113167514Skmacy
114167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait)
115167514Skmacy{
116167514Skmacy	int err;
117167514Skmacy
118167514Skmacy	if ((err = ael1002_power_down(phy, 0)) ||
119167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) ||
120167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) ||
121167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) ||
122167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) ||
123167514Skmacy	    (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN,
124167514Skmacy				       0, 1 << 5)))
125167514Skmacy		return err;
126167514Skmacy	return 0;
127167514Skmacy}
128167514Skmacy
129167514Skmacystatic int ael1002_intr_noop(struct cphy *phy)
130167514Skmacy{
131167514Skmacy	return 0;
132167514Skmacy}
133167514Skmacy
134181614Skmacy/*
135181614Skmacy * Get link status for a 10GBASE-R device.
136181614Skmacy */
137181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed,
138181614Skmacy			     int *duplex, int *fc)
139167514Skmacy{
140167514Skmacy	if (link_ok) {
141181614Skmacy		unsigned int stat0, stat1, stat2;
142181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
143167514Skmacy
144181614Skmacy		if (!err)
145181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1);
146181614Skmacy		if (!err)
147181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
148167514Skmacy		if (err)
149167514Skmacy			return err;
150181614Skmacy		*link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1;
151167514Skmacy	}
152167514Skmacy	if (speed)
153167514Skmacy		*speed = SPEED_10000;
154167514Skmacy	if (duplex)
155167514Skmacy		*duplex = DUPLEX_FULL;
156167514Skmacy	return 0;
157167514Skmacy}
158167514Skmacy
159167514Skmacy#ifdef C99_NOT_SUPPORTED
160167514Skmacystatic struct cphy_ops ael1002_ops = {
161167514Skmacy	ael1002_reset,
162167514Skmacy	ael1002_intr_noop,
163167514Skmacy	ael1002_intr_noop,
164167514Skmacy	ael1002_intr_noop,
165167514Skmacy	ael1002_intr_noop,
166167514Skmacy	NULL,
167167514Skmacy	NULL,
168167514Skmacy	NULL,
169167514Skmacy	NULL,
170167514Skmacy	NULL,
171181614Skmacy	get_link_status_r,
172167514Skmacy	ael1002_power_down,
173167514Skmacy};
174167514Skmacy#else
175167514Skmacystatic struct cphy_ops ael1002_ops = {
176167514Skmacy	.reset           = ael1002_reset,
177167514Skmacy	.intr_enable     = ael1002_intr_noop,
178167514Skmacy	.intr_disable    = ael1002_intr_noop,
179167514Skmacy	.intr_clear      = ael1002_intr_noop,
180167514Skmacy	.intr_handler    = ael1002_intr_noop,
181181614Skmacy	.get_link_status = get_link_status_r,
182167514Skmacy	.power_down      = ael1002_power_down,
183167514Skmacy};
184167514Skmacy#endif
185167514Skmacy
186176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
187176472Skmacy			const struct mdio_ops *mdio_ops)
188167514Skmacy{
189176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops,
190176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
191177340Skmacy		  "10GBASE-R");
192167514Skmacy	ael100x_txon(phy);
193176472Skmacy	return 0;
194167514Skmacy}
195167514Skmacy
196167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait)
197167514Skmacy{
198167514Skmacy	return t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
199167514Skmacy}
200167514Skmacy
201167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable)
202167514Skmacy{
203167514Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
204167514Skmacy				   BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
205167514Skmacy}
206167514Skmacy
207167514Skmacy#ifdef C99_NOT_SUPPORTED
208167514Skmacystatic struct cphy_ops ael1006_ops = {
209167514Skmacy	ael1006_reset,
210180583Skmacy	t3_phy_lasi_intr_enable,
211180583Skmacy	t3_phy_lasi_intr_disable,
212180583Skmacy	t3_phy_lasi_intr_clear,
213180583Skmacy	t3_phy_lasi_intr_handler,
214167514Skmacy	NULL,
215167514Skmacy	NULL,
216167514Skmacy	NULL,
217167514Skmacy	NULL,
218167514Skmacy	NULL,
219181614Skmacy	get_link_status_r,
220167514Skmacy	ael1006_power_down,
221167514Skmacy};
222167514Skmacy#else
223167514Skmacystatic struct cphy_ops ael1006_ops = {
224167514Skmacy	.reset           = ael1006_reset,
225180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
226180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
227180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
228180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
229181614Skmacy	.get_link_status = get_link_status_r,
230167514Skmacy	.power_down      = ael1006_power_down,
231167514Skmacy};
232167514Skmacy#endif
233167514Skmacy
234176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
235176472Skmacy			const struct mdio_ops *mdio_ops)
236167514Skmacy{
237176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops,
238176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
239176472Skmacy		  "10GBASE-SR");
240167514Skmacy	ael100x_txon(phy);
241176472Skmacy	return 0;
242167514Skmacy}
243167514Skmacy
244180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
245180583Skmacy{
246181614Skmacy	static struct reg_val regs[] = {
247181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
248181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
249181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
250181614Skmacy		{ 0, 0, 0, 0 }
251181614Skmacy	};
252180583Skmacy	static u16 sr_edc[] = {
253180583Skmacy		0xcc00, 0x2ff4,
254180583Skmacy		0xcc01, 0x3cd4,
255180583Skmacy		0xcc02, 0x2015,
256180583Skmacy		0xcc03, 0x3105,
257180583Skmacy		0xcc04, 0x6524,
258180583Skmacy		0xcc05, 0x27ff,
259180583Skmacy		0xcc06, 0x300f,
260180583Skmacy		0xcc07, 0x2c8b,
261180583Skmacy		0xcc08, 0x300b,
262180583Skmacy		0xcc09, 0x4009,
263180583Skmacy		0xcc0a, 0x400e,
264180583Skmacy		0xcc0b, 0x2f72,
265180583Skmacy		0xcc0c, 0x3002,
266180583Skmacy		0xcc0d, 0x1002,
267180583Skmacy		0xcc0e, 0x2172,
268180583Skmacy		0xcc0f, 0x3012,
269180583Skmacy		0xcc10, 0x1002,
270180583Skmacy		0xcc11, 0x25d2,
271180583Skmacy		0xcc12, 0x3012,
272180583Skmacy		0xcc13, 0x1002,
273180583Skmacy		0xcc14, 0xd01e,
274180583Skmacy		0xcc15, 0x27d2,
275180583Skmacy		0xcc16, 0x3012,
276180583Skmacy		0xcc17, 0x1002,
277180583Skmacy		0xcc18, 0x2004,
278180583Skmacy		0xcc19, 0x3c84,
279180583Skmacy		0xcc1a, 0x6436,
280180583Skmacy		0xcc1b, 0x2007,
281180583Skmacy		0xcc1c, 0x3f87,
282180583Skmacy		0xcc1d, 0x8676,
283180583Skmacy		0xcc1e, 0x40b7,
284180583Skmacy		0xcc1f, 0xa746,
285180583Skmacy		0xcc20, 0x4047,
286180583Skmacy		0xcc21, 0x5673,
287180583Skmacy		0xcc22, 0x2982,
288180583Skmacy		0xcc23, 0x3002,
289180583Skmacy		0xcc24, 0x13d2,
290180583Skmacy		0xcc25, 0x8bbd,
291180583Skmacy		0xcc26, 0x2862,
292180583Skmacy		0xcc27, 0x3012,
293180583Skmacy		0xcc28, 0x1002,
294180583Skmacy		0xcc29, 0x2092,
295180583Skmacy		0xcc2a, 0x3012,
296180583Skmacy		0xcc2b, 0x1002,
297180583Skmacy		0xcc2c, 0x5cc3,
298180583Skmacy		0xcc2d, 0x314,
299180583Skmacy		0xcc2e, 0x2942,
300180583Skmacy		0xcc2f, 0x3002,
301180583Skmacy		0xcc30, 0x1002,
302180583Skmacy		0xcc31, 0xd019,
303180583Skmacy		0xcc32, 0x2032,
304180583Skmacy		0xcc33, 0x3012,
305180583Skmacy		0xcc34, 0x1002,
306180583Skmacy		0xcc35, 0x2a04,
307180583Skmacy		0xcc36, 0x3c74,
308180583Skmacy		0xcc37, 0x6435,
309180583Skmacy		0xcc38, 0x2fa4,
310180583Skmacy		0xcc39, 0x3cd4,
311180583Skmacy		0xcc3a, 0x6624,
312180583Skmacy		0xcc3b, 0x5563,
313180583Skmacy		0xcc3c, 0x2d42,
314180583Skmacy		0xcc3d, 0x3002,
315180583Skmacy		0xcc3e, 0x13d2,
316180583Skmacy		0xcc3f, 0x464d,
317180583Skmacy		0xcc40, 0x2862,
318180583Skmacy		0xcc41, 0x3012,
319180583Skmacy		0xcc42, 0x1002,
320180583Skmacy		0xcc43, 0x2032,
321180583Skmacy		0xcc44, 0x3012,
322180583Skmacy		0xcc45, 0x1002,
323180583Skmacy		0xcc46, 0x2fb4,
324180583Skmacy		0xcc47, 0x3cd4,
325180583Skmacy		0xcc48, 0x6624,
326180583Skmacy		0xcc49, 0x5563,
327180583Skmacy		0xcc4a, 0x2d42,
328180583Skmacy		0xcc4b, 0x3002,
329180583Skmacy		0xcc4c, 0x13d2,
330180583Skmacy		0xcc4d, 0x2ed2,
331180583Skmacy		0xcc4e, 0x3002,
332180583Skmacy		0xcc4f, 0x1002,
333180583Skmacy		0xcc50, 0x2fd2,
334180583Skmacy		0xcc51, 0x3002,
335180583Skmacy		0xcc52, 0x1002,
336180583Skmacy		0xcc53, 0x004,
337180583Skmacy		0xcc54, 0x2942,
338180583Skmacy		0xcc55, 0x3002,
339180583Skmacy		0xcc56, 0x1002,
340180583Skmacy		0xcc57, 0x2092,
341180583Skmacy		0xcc58, 0x3012,
342180583Skmacy		0xcc59, 0x1002,
343180583Skmacy		0xcc5a, 0x5cc3,
344180583Skmacy		0xcc5b, 0x317,
345180583Skmacy		0xcc5c, 0x2f72,
346180583Skmacy		0xcc5d, 0x3002,
347180583Skmacy		0xcc5e, 0x1002,
348180583Skmacy		0xcc5f, 0x2942,
349180583Skmacy		0xcc60, 0x3002,
350180583Skmacy		0xcc61, 0x1002,
351180583Skmacy		0xcc62, 0x22cd,
352180583Skmacy		0xcc63, 0x301d,
353180583Skmacy		0xcc64, 0x2862,
354180583Skmacy		0xcc65, 0x3012,
355180583Skmacy		0xcc66, 0x1002,
356180583Skmacy		0xcc67, 0x2ed2,
357180583Skmacy		0xcc68, 0x3002,
358180583Skmacy		0xcc69, 0x1002,
359180583Skmacy		0xcc6a, 0x2d72,
360180583Skmacy		0xcc6b, 0x3002,
361180583Skmacy		0xcc6c, 0x1002,
362180583Skmacy		0xcc6d, 0x628f,
363180583Skmacy		0xcc6e, 0x2112,
364180583Skmacy		0xcc6f, 0x3012,
365180583Skmacy		0xcc70, 0x1002,
366180583Skmacy		0xcc71, 0x5aa3,
367180583Skmacy		0xcc72, 0x2dc2,
368180583Skmacy		0xcc73, 0x3002,
369180583Skmacy		0xcc74, 0x1312,
370180583Skmacy		0xcc75, 0x6f72,
371180583Skmacy		0xcc76, 0x1002,
372180583Skmacy		0xcc77, 0x2807,
373180583Skmacy		0xcc78, 0x31a7,
374180583Skmacy		0xcc79, 0x20c4,
375180583Skmacy		0xcc7a, 0x3c24,
376180583Skmacy		0xcc7b, 0x6724,
377180583Skmacy		0xcc7c, 0x1002,
378180583Skmacy		0xcc7d, 0x2807,
379180583Skmacy		0xcc7e, 0x3187,
380180583Skmacy		0xcc7f, 0x20c4,
381180583Skmacy		0xcc80, 0x3c24,
382180583Skmacy		0xcc81, 0x6724,
383180583Skmacy		0xcc82, 0x1002,
384180583Skmacy		0xcc83, 0x2514,
385180583Skmacy		0xcc84, 0x3c64,
386180583Skmacy		0xcc85, 0x6436,
387180583Skmacy		0xcc86, 0xdff4,
388180583Skmacy		0xcc87, 0x6436,
389180583Skmacy		0xcc88, 0x1002,
390180583Skmacy		0xcc89, 0x40a4,
391180583Skmacy		0xcc8a, 0x643c,
392180583Skmacy		0xcc8b, 0x4016,
393180583Skmacy		0xcc8c, 0x8c6c,
394180583Skmacy		0xcc8d, 0x2b24,
395180583Skmacy		0xcc8e, 0x3c24,
396180583Skmacy		0xcc8f, 0x6435,
397180583Skmacy		0xcc90, 0x1002,
398180583Skmacy		0xcc91, 0x2b24,
399180583Skmacy		0xcc92, 0x3c24,
400180583Skmacy		0xcc93, 0x643a,
401180583Skmacy		0xcc94, 0x4025,
402180583Skmacy		0xcc95, 0x8a5a,
403180583Skmacy		0xcc96, 0x1002,
404180583Skmacy		0xcc97, 0x2731,
405180583Skmacy		0xcc98, 0x3011,
406180583Skmacy		0xcc99, 0x1001,
407180583Skmacy		0xcc9a, 0xc7a0,
408180583Skmacy		0xcc9b, 0x100,
409180583Skmacy		0xcc9c, 0xc502,
410180583Skmacy		0xcc9d, 0x53ac,
411180583Skmacy		0xcc9e, 0xc503,
412180583Skmacy		0xcc9f, 0xd5d5,
413180583Skmacy		0xcca0, 0xc600,
414180583Skmacy		0xcca1, 0x2a6d,
415180583Skmacy		0xcca2, 0xc601,
416180583Skmacy		0xcca3, 0x2a4c,
417180583Skmacy		0xcca4, 0xc602,
418180583Skmacy		0xcca5, 0x111,
419180583Skmacy		0xcca6, 0xc60c,
420180583Skmacy		0xcca7, 0x5900,
421180583Skmacy		0xcca8, 0xc710,
422180583Skmacy		0xcca9, 0x700,
423180583Skmacy		0xccaa, 0xc718,
424180583Skmacy		0xccab, 0x700,
425180583Skmacy		0xccac, 0xc720,
426180583Skmacy		0xccad, 0x4700,
427180583Skmacy		0xccae, 0xc801,
428180583Skmacy		0xccaf, 0x7f50,
429180583Skmacy		0xccb0, 0xc802,
430180583Skmacy		0xccb1, 0x7760,
431180583Skmacy		0xccb2, 0xc803,
432180583Skmacy		0xccb3, 0x7fce,
433180583Skmacy		0xccb4, 0xc804,
434180583Skmacy		0xccb5, 0x5700,
435180583Skmacy		0xccb6, 0xc805,
436180583Skmacy		0xccb7, 0x5f11,
437180583Skmacy		0xccb8, 0xc806,
438180583Skmacy		0xccb9, 0x4751,
439180583Skmacy		0xccba, 0xc807,
440180583Skmacy		0xccbb, 0x57e1,
441180583Skmacy		0xccbc, 0xc808,
442180583Skmacy		0xccbd, 0x2700,
443180583Skmacy		0xccbe, 0xc809,
444180583Skmacy		0xccbf, 0x000,
445180583Skmacy		0xccc0, 0xc821,
446180583Skmacy		0xccc1, 0x002,
447180583Skmacy		0xccc2, 0xc822,
448180583Skmacy		0xccc3, 0x014,
449180583Skmacy		0xccc4, 0xc832,
450180583Skmacy		0xccc5, 0x1186,
451180583Skmacy		0xccc6, 0xc847,
452180583Skmacy		0xccc7, 0x1e02,
453180583Skmacy		0xccc8, 0xc013,
454180583Skmacy		0xccc9, 0xf341,
455180583Skmacy		0xccca, 0xc01a,
456180583Skmacy		0xcccb, 0x446,
457180583Skmacy		0xcccc, 0xc024,
458180583Skmacy		0xcccd, 0x1000,
459180583Skmacy		0xccce, 0xc025,
460180583Skmacy		0xcccf, 0xa00,
461180583Skmacy		0xccd0, 0xc026,
462180583Skmacy		0xccd1, 0xc0c,
463180583Skmacy		0xccd2, 0xc027,
464180583Skmacy		0xccd3, 0xc0c,
465180583Skmacy		0xccd4, 0xc029,
466180583Skmacy		0xccd5, 0x0a0,
467180583Skmacy		0xccd6, 0xc030,
468180583Skmacy		0xccd7, 0xa00,
469180583Skmacy		0xccd8, 0xc03c,
470180583Skmacy		0xccd9, 0x01c,
471180583Skmacy		0xccda, 0xc005,
472180583Skmacy		0xccdb, 0x7a06,
473180583Skmacy		0xccdc, 0x000,
474180583Skmacy		0xccdd, 0x2731,
475180583Skmacy		0xccde, 0x3011,
476180583Skmacy		0xccdf, 0x1001,
477180583Skmacy		0xcce0, 0xc620,
478180583Skmacy		0xcce1, 0x000,
479180583Skmacy		0xcce2, 0xc621,
480180583Skmacy		0xcce3, 0x03f,
481180583Skmacy		0xcce4, 0xc622,
482180583Skmacy		0xcce5, 0x000,
483180583Skmacy		0xcce6, 0xc623,
484180583Skmacy		0xcce7, 0x000,
485180583Skmacy		0xcce8, 0xc624,
486180583Skmacy		0xcce9, 0x000,
487180583Skmacy		0xccea, 0xc625,
488180583Skmacy		0xcceb, 0x000,
489180583Skmacy		0xccec, 0xc627,
490180583Skmacy		0xcced, 0x000,
491180583Skmacy		0xccee, 0xc628,
492180583Skmacy		0xccef, 0x000,
493180583Skmacy		0xccf0, 0xc62c,
494180583Skmacy		0xccf1, 0x000,
495180583Skmacy		0xccf2, 0x000,
496180583Skmacy		0xccf3, 0x2806,
497180583Skmacy		0xccf4, 0x3cb6,
498180583Skmacy		0xccf5, 0xc161,
499180583Skmacy		0xccf6, 0x6134,
500180583Skmacy		0xccf7, 0x6135,
501180583Skmacy		0xccf8, 0x5443,
502180583Skmacy		0xccf9, 0x303,
503180583Skmacy		0xccfa, 0x6524,
504180583Skmacy		0xccfb, 0x00b,
505180583Skmacy		0xccfc, 0x1002,
506180583Skmacy		0xccfd, 0x2104,
507180583Skmacy		0xccfe, 0x3c24,
508180583Skmacy		0xccff, 0x2105,
509180583Skmacy		0xcd00, 0x3805,
510180583Skmacy		0xcd01, 0x6524,
511180583Skmacy		0xcd02, 0xdff4,
512180583Skmacy		0xcd03, 0x4005,
513180583Skmacy		0xcd04, 0x6524,
514180583Skmacy		0xcd05, 0x1002,
515180583Skmacy		0xcd06, 0x5dd3,
516180583Skmacy		0xcd07, 0x306,
517180583Skmacy		0xcd08, 0x2ff7,
518180583Skmacy		0xcd09, 0x38f7,
519180583Skmacy		0xcd0a, 0x60b7,
520180583Skmacy		0xcd0b, 0xdffd,
521180583Skmacy		0xcd0c, 0x00a,
522180583Skmacy		0xcd0d, 0x1002,
523180583Skmacy		0xcd0e, 0
524180583Skmacy	};
525180583Skmacy	int i, err;
526180583Skmacy
527181614Skmacy	err = set_phy_regs(phy, regs);
528181614Skmacy	if (err)
529181614Skmacy		return err;
530181614Skmacy
531181614Skmacy	msleep(50);
532181614Skmacy
533181614Skmacy	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
534180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
535180583Skmacy				 sr_edc[i + 1]);
536181614Skmacy	if (!err)
537181614Skmacy		phy->priv = edc_sr;
538180583Skmacy	return err;
539180583Skmacy}
540180583Skmacy
541181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
542181614Skmacy{
543181614Skmacy	static struct reg_val regs[] = {
544181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
545181614Skmacy		{ 0, 0, 0, 0 }
546181614Skmacy	};
547181614Skmacy	static struct reg_val preemphasis[] = {
548181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
549181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
550181614Skmacy		{ 0, 0, 0, 0 }
551181614Skmacy	};
552181614Skmacy	static u16 twinax_edc[] = {
553181614Skmacy		0xcc00, 0x4009,
554181614Skmacy		0xcc01, 0x27ff,
555181614Skmacy		0xcc02, 0x300f,
556181614Skmacy		0xcc03, 0x40aa,
557181614Skmacy		0xcc04, 0x401c,
558181614Skmacy		0xcc05, 0x401e,
559181614Skmacy		0xcc06, 0x2ff4,
560181614Skmacy		0xcc07, 0x3cd4,
561181614Skmacy		0xcc08, 0x2035,
562181614Skmacy		0xcc09, 0x3145,
563181614Skmacy		0xcc0a, 0x6524,
564181614Skmacy		0xcc0b, 0x26a2,
565181614Skmacy		0xcc0c, 0x3012,
566181614Skmacy		0xcc0d, 0x1002,
567181614Skmacy		0xcc0e, 0x29c2,
568181614Skmacy		0xcc0f, 0x3002,
569181614Skmacy		0xcc10, 0x1002,
570181614Skmacy		0xcc11, 0x2072,
571181614Skmacy		0xcc12, 0x3012,
572181614Skmacy		0xcc13, 0x1002,
573181614Skmacy		0xcc14, 0x22cd,
574181614Skmacy		0xcc15, 0x301d,
575181614Skmacy		0xcc16, 0x2e52,
576181614Skmacy		0xcc17, 0x3012,
577181614Skmacy		0xcc18, 0x1002,
578181614Skmacy		0xcc19, 0x28e2,
579181614Skmacy		0xcc1a, 0x3002,
580181614Skmacy		0xcc1b, 0x1002,
581181614Skmacy		0xcc1c, 0x628f,
582181614Skmacy		0xcc1d, 0x2ac2,
583181614Skmacy		0xcc1e, 0x3012,
584181614Skmacy		0xcc1f, 0x1002,
585181614Skmacy		0xcc20, 0x5553,
586181614Skmacy		0xcc21, 0x2ae2,
587181614Skmacy		0xcc22, 0x3002,
588181614Skmacy		0xcc23, 0x1302,
589181614Skmacy		0xcc24, 0x401e,
590181614Skmacy		0xcc25, 0x2be2,
591181614Skmacy		0xcc26, 0x3012,
592181614Skmacy		0xcc27, 0x1002,
593181614Skmacy		0xcc28, 0x2da2,
594181614Skmacy		0xcc29, 0x3012,
595181614Skmacy		0xcc2a, 0x1002,
596181614Skmacy		0xcc2b, 0x2ba2,
597181614Skmacy		0xcc2c, 0x3002,
598181614Skmacy		0xcc2d, 0x1002,
599181614Skmacy		0xcc2e, 0x5ee3,
600181614Skmacy		0xcc2f, 0x305,
601181614Skmacy		0xcc30, 0x400e,
602181614Skmacy		0xcc31, 0x2bc2,
603181614Skmacy		0xcc32, 0x3002,
604181614Skmacy		0xcc33, 0x1002,
605181614Skmacy		0xcc34, 0x2b82,
606181614Skmacy		0xcc35, 0x3012,
607181614Skmacy		0xcc36, 0x1002,
608181614Skmacy		0xcc37, 0x5663,
609181614Skmacy		0xcc38, 0x302,
610181614Skmacy		0xcc39, 0x401e,
611181614Skmacy		0xcc3a, 0x6f72,
612181614Skmacy		0xcc3b, 0x1002,
613181614Skmacy		0xcc3c, 0x628f,
614181614Skmacy		0xcc3d, 0x2be2,
615181614Skmacy		0xcc3e, 0x3012,
616181614Skmacy		0xcc3f, 0x1002,
617181614Skmacy		0xcc40, 0x22cd,
618181614Skmacy		0xcc41, 0x301d,
619181614Skmacy		0xcc42, 0x2e52,
620181614Skmacy		0xcc43, 0x3012,
621181614Skmacy		0xcc44, 0x1002,
622181614Skmacy		0xcc45, 0x2522,
623181614Skmacy		0xcc46, 0x3012,
624181614Skmacy		0xcc47, 0x1002,
625181614Skmacy		0xcc48, 0x2da2,
626181614Skmacy		0xcc49, 0x3012,
627181614Skmacy		0xcc4a, 0x1002,
628181614Skmacy		0xcc4b, 0x2ca2,
629181614Skmacy		0xcc4c, 0x3012,
630181614Skmacy		0xcc4d, 0x1002,
631181614Skmacy		0xcc4e, 0x2fa4,
632181614Skmacy		0xcc4f, 0x3cd4,
633181614Skmacy		0xcc50, 0x6624,
634181614Skmacy		0xcc51, 0x410b,
635181614Skmacy		0xcc52, 0x56b3,
636181614Skmacy		0xcc53, 0x3c4,
637181614Skmacy		0xcc54, 0x2fb2,
638181614Skmacy		0xcc55, 0x3002,
639181614Skmacy		0xcc56, 0x1002,
640181614Skmacy		0xcc57, 0x220b,
641181614Skmacy		0xcc58, 0x303b,
642181614Skmacy		0xcc59, 0x56b3,
643181614Skmacy		0xcc5a, 0x3c3,
644181614Skmacy		0xcc5b, 0x866b,
645181614Skmacy		0xcc5c, 0x400c,
646181614Skmacy		0xcc5d, 0x23a2,
647181614Skmacy		0xcc5e, 0x3012,
648181614Skmacy		0xcc5f, 0x1002,
649181614Skmacy		0xcc60, 0x2da2,
650181614Skmacy		0xcc61, 0x3012,
651181614Skmacy		0xcc62, 0x1002,
652181614Skmacy		0xcc63, 0x2ca2,
653181614Skmacy		0xcc64, 0x3012,
654181614Skmacy		0xcc65, 0x1002,
655181614Skmacy		0xcc66, 0x2fb4,
656181614Skmacy		0xcc67, 0x3cd4,
657181614Skmacy		0xcc68, 0x6624,
658181614Skmacy		0xcc69, 0x56b3,
659181614Skmacy		0xcc6a, 0x3c3,
660181614Skmacy		0xcc6b, 0x866b,
661181614Skmacy		0xcc6c, 0x401c,
662181614Skmacy		0xcc6d, 0x2205,
663181614Skmacy		0xcc6e, 0x3035,
664181614Skmacy		0xcc6f, 0x5b53,
665181614Skmacy		0xcc70, 0x2c52,
666181614Skmacy		0xcc71, 0x3002,
667181614Skmacy		0xcc72, 0x13c2,
668181614Skmacy		0xcc73, 0x5cc3,
669181614Skmacy		0xcc74, 0x317,
670181614Skmacy		0xcc75, 0x2522,
671181614Skmacy		0xcc76, 0x3012,
672181614Skmacy		0xcc77, 0x1002,
673181614Skmacy		0xcc78, 0x2da2,
674181614Skmacy		0xcc79, 0x3012,
675181614Skmacy		0xcc7a, 0x1002,
676181614Skmacy		0xcc7b, 0x2b82,
677181614Skmacy		0xcc7c, 0x3012,
678181614Skmacy		0xcc7d, 0x1002,
679181614Skmacy		0xcc7e, 0x5663,
680181614Skmacy		0xcc7f, 0x303,
681181614Skmacy		0xcc80, 0x401e,
682181614Skmacy		0xcc81, 0x004,
683181614Skmacy		0xcc82, 0x2c42,
684181614Skmacy		0xcc83, 0x3012,
685181614Skmacy		0xcc84, 0x1002,
686181614Skmacy		0xcc85, 0x6f72,
687181614Skmacy		0xcc86, 0x1002,
688181614Skmacy		0xcc87, 0x628f,
689181614Skmacy		0xcc88, 0x2304,
690181614Skmacy		0xcc89, 0x3c84,
691181614Skmacy		0xcc8a, 0x6436,
692181614Skmacy		0xcc8b, 0xdff4,
693181614Skmacy		0xcc8c, 0x6436,
694181614Skmacy		0xcc8d, 0x2ff5,
695181614Skmacy		0xcc8e, 0x3005,
696181614Skmacy		0xcc8f, 0x8656,
697181614Skmacy		0xcc90, 0xdfba,
698181614Skmacy		0xcc91, 0x56a3,
699181614Skmacy		0xcc92, 0xd05a,
700181614Skmacy		0xcc93, 0x21c2,
701181614Skmacy		0xcc94, 0x3012,
702181614Skmacy		0xcc95, 0x1392,
703181614Skmacy		0xcc96, 0xd05a,
704181614Skmacy		0xcc97, 0x56a3,
705181614Skmacy		0xcc98, 0xdfba,
706181614Skmacy		0xcc99, 0x383,
707181614Skmacy		0xcc9a, 0x6f72,
708181614Skmacy		0xcc9b, 0x1002,
709181614Skmacy		0xcc9c, 0x28c5,
710181614Skmacy		0xcc9d, 0x3005,
711181614Skmacy		0xcc9e, 0x4178,
712181614Skmacy		0xcc9f, 0x5653,
713181614Skmacy		0xcca0, 0x384,
714181614Skmacy		0xcca1, 0x22b2,
715181614Skmacy		0xcca2, 0x3012,
716181614Skmacy		0xcca3, 0x1002,
717181614Skmacy		0xcca4, 0x2be5,
718181614Skmacy		0xcca5, 0x3005,
719181614Skmacy		0xcca6, 0x41e8,
720181614Skmacy		0xcca7, 0x5653,
721181614Skmacy		0xcca8, 0x382,
722181614Skmacy		0xcca9, 0x002,
723181614Skmacy		0xccaa, 0x4258,
724181614Skmacy		0xccab, 0x2474,
725181614Skmacy		0xccac, 0x3c84,
726181614Skmacy		0xccad, 0x6437,
727181614Skmacy		0xccae, 0xdff4,
728181614Skmacy		0xccaf, 0x6437,
729181614Skmacy		0xccb0, 0x2ff5,
730181614Skmacy		0xccb1, 0x3c05,
731181614Skmacy		0xccb2, 0x8757,
732181614Skmacy		0xccb3, 0xb888,
733181614Skmacy		0xccb4, 0x9787,
734181614Skmacy		0xccb5, 0xdff4,
735181614Skmacy		0xccb6, 0x6724,
736181614Skmacy		0xccb7, 0x866a,
737181614Skmacy		0xccb8, 0x6f72,
738181614Skmacy		0xccb9, 0x1002,
739181614Skmacy		0xccba, 0x2d01,
740181614Skmacy		0xccbb, 0x3011,
741181614Skmacy		0xccbc, 0x1001,
742181614Skmacy		0xccbd, 0xc620,
743181614Skmacy		0xccbe, 0x14e5,
744181614Skmacy		0xccbf, 0xc621,
745181614Skmacy		0xccc0, 0xc53d,
746181614Skmacy		0xccc1, 0xc622,
747181614Skmacy		0xccc2, 0x3cbe,
748181614Skmacy		0xccc3, 0xc623,
749181614Skmacy		0xccc4, 0x4452,
750181614Skmacy		0xccc5, 0xc624,
751181614Skmacy		0xccc6, 0xc5c5,
752181614Skmacy		0xccc7, 0xc625,
753181614Skmacy		0xccc8, 0xe01e,
754181614Skmacy		0xccc9, 0xc627,
755181614Skmacy		0xccca, 0x000,
756181614Skmacy		0xcccb, 0xc628,
757181614Skmacy		0xcccc, 0x000,
758181614Skmacy		0xcccd, 0xc62b,
759181614Skmacy		0xccce, 0x000,
760181614Skmacy		0xcccf, 0xc62c,
761181614Skmacy		0xccd0, 0x000,
762181614Skmacy		0xccd1, 0x000,
763181614Skmacy		0xccd2, 0x2d01,
764181614Skmacy		0xccd3, 0x3011,
765181614Skmacy		0xccd4, 0x1001,
766181614Skmacy		0xccd5, 0xc620,
767181614Skmacy		0xccd6, 0x000,
768181614Skmacy		0xccd7, 0xc621,
769181614Skmacy		0xccd8, 0x000,
770181614Skmacy		0xccd9, 0xc622,
771181614Skmacy		0xccda, 0x0ce,
772181614Skmacy		0xccdb, 0xc623,
773181614Skmacy		0xccdc, 0x07f,
774181614Skmacy		0xccdd, 0xc624,
775181614Skmacy		0xccde, 0x032,
776181614Skmacy		0xccdf, 0xc625,
777181614Skmacy		0xcce0, 0x000,
778181614Skmacy		0xcce1, 0xc627,
779181614Skmacy		0xcce2, 0x000,
780181614Skmacy		0xcce3, 0xc628,
781181614Skmacy		0xcce4, 0x000,
782181614Skmacy		0xcce5, 0xc62b,
783181614Skmacy		0xcce6, 0x000,
784181614Skmacy		0xcce7, 0xc62c,
785181614Skmacy		0xcce8, 0x000,
786181614Skmacy		0xcce9, 0x000,
787181614Skmacy		0xccea, 0x2d01,
788181614Skmacy		0xcceb, 0x3011,
789181614Skmacy		0xccec, 0x1001,
790181614Skmacy		0xcced, 0xc502,
791181614Skmacy		0xccee, 0x609f,
792181614Skmacy		0xccef, 0xc600,
793181614Skmacy		0xccf0, 0x2a6e,
794181614Skmacy		0xccf1, 0xc601,
795181614Skmacy		0xccf2, 0x2a2c,
796181614Skmacy		0xccf3, 0xc60c,
797181614Skmacy		0xccf4, 0x5400,
798181614Skmacy		0xccf5, 0xc710,
799181614Skmacy		0xccf6, 0x700,
800181614Skmacy		0xccf7, 0xc718,
801181614Skmacy		0xccf8, 0x700,
802181614Skmacy		0xccf9, 0xc720,
803181614Skmacy		0xccfa, 0x4700,
804181614Skmacy		0xccfb, 0xc728,
805181614Skmacy		0xccfc, 0x700,
806181614Skmacy		0xccfd, 0xc729,
807181614Skmacy		0xccfe, 0x1207,
808181614Skmacy		0xccff, 0xc801,
809181614Skmacy		0xcd00, 0x7f50,
810181614Skmacy		0xcd01, 0xc802,
811181614Skmacy		0xcd02, 0x7760,
812181614Skmacy		0xcd03, 0xc803,
813181614Skmacy		0xcd04, 0x7fce,
814181614Skmacy		0xcd05, 0xc804,
815181614Skmacy		0xcd06, 0x520e,
816181614Skmacy		0xcd07, 0xc805,
817181614Skmacy		0xcd08, 0x5c11,
818181614Skmacy		0xcd09, 0xc806,
819181614Skmacy		0xcd0a, 0x3c51,
820181614Skmacy		0xcd0b, 0xc807,
821181614Skmacy		0xcd0c, 0x4061,
822181614Skmacy		0xcd0d, 0xc808,
823181614Skmacy		0xcd0e, 0x49c1,
824181614Skmacy		0xcd0f, 0xc809,
825181614Skmacy		0xcd10, 0x3840,
826181614Skmacy		0xcd11, 0xc80a,
827181614Skmacy		0xcd12, 0x000,
828181614Skmacy		0xcd13, 0xc821,
829181614Skmacy		0xcd14, 0x002,
830181614Skmacy		0xcd15, 0xc822,
831181614Skmacy		0xcd16, 0x046,
832181614Skmacy		0xcd17, 0xc844,
833181614Skmacy		0xcd18, 0x182f,
834181614Skmacy		0xcd19, 0xc013,
835181614Skmacy		0xcd1a, 0xf341,
836181614Skmacy		0xcd1b, 0xc01a,
837181614Skmacy		0xcd1c, 0x446,
838181614Skmacy		0xcd1d, 0xc024,
839181614Skmacy		0xcd1e, 0x1000,
840181614Skmacy		0xcd1f, 0xc025,
841181614Skmacy		0xcd20, 0xa00,
842181614Skmacy		0xcd21, 0xc026,
843181614Skmacy		0xcd22, 0xc0c,
844181614Skmacy		0xcd23, 0xc027,
845181614Skmacy		0xcd24, 0xc0c,
846181614Skmacy		0xcd25, 0xc029,
847181614Skmacy		0xcd26, 0x0a0,
848181614Skmacy		0xcd27, 0xc030,
849181614Skmacy		0xcd28, 0xa00,
850181614Skmacy		0xcd29, 0xc03c,
851181614Skmacy		0xcd2a, 0x01c,
852181614Skmacy		0xcd2b, 0x000,
853181614Skmacy		0xcd2c, 0x2b84,
854181614Skmacy		0xcd2d, 0x3c74,
855181614Skmacy		0xcd2e, 0x6435,
856181614Skmacy		0xcd2f, 0xdff4,
857181614Skmacy		0xcd30, 0x6435,
858181614Skmacy		0xcd31, 0x2806,
859181614Skmacy		0xcd32, 0x3006,
860181614Skmacy		0xcd33, 0x8565,
861181614Skmacy		0xcd34, 0x2b24,
862181614Skmacy		0xcd35, 0x3c24,
863181614Skmacy		0xcd36, 0x6436,
864181614Skmacy		0xcd37, 0x1002,
865181614Skmacy		0xcd38, 0x2b24,
866181614Skmacy		0xcd39, 0x3c24,
867181614Skmacy		0xcd3a, 0x6436,
868181614Skmacy		0xcd3b, 0x4045,
869181614Skmacy		0xcd3c, 0x8656,
870181614Skmacy		0xcd3d, 0x1002,
871181614Skmacy		0xcd3e, 0x2807,
872181614Skmacy		0xcd3f, 0x31a7,
873181614Skmacy		0xcd40, 0x20c4,
874181614Skmacy		0xcd41, 0x3c24,
875181614Skmacy		0xcd42, 0x6724,
876181614Skmacy		0xcd43, 0x1002,
877181614Skmacy		0xcd44, 0x2807,
878181614Skmacy		0xcd45, 0x3187,
879181614Skmacy		0xcd46, 0x20c4,
880181614Skmacy		0xcd47, 0x3c24,
881181614Skmacy		0xcd48, 0x6724,
882181614Skmacy		0xcd49, 0x1002,
883181614Skmacy		0xcd4a, 0x2514,
884181614Skmacy		0xcd4b, 0x3c64,
885181614Skmacy		0xcd4c, 0x6436,
886181614Skmacy		0xcd4d, 0xdff4,
887181614Skmacy		0xcd4e, 0x6436,
888181614Skmacy		0xcd4f, 0x1002,
889181614Skmacy		0xcd50, 0x2806,
890181614Skmacy		0xcd51, 0x3cb6,
891181614Skmacy		0xcd52, 0xc161,
892181614Skmacy		0xcd53, 0x6134,
893181614Skmacy		0xcd54, 0x6135,
894181614Skmacy		0xcd55, 0x5443,
895181614Skmacy		0xcd56, 0x303,
896181614Skmacy		0xcd57, 0x6524,
897181614Skmacy		0xcd58, 0x00b,
898181614Skmacy		0xcd59, 0x1002,
899181614Skmacy		0xcd5a, 0xd019,
900181614Skmacy		0xcd5b, 0x2104,
901181614Skmacy		0xcd5c, 0x3c24,
902181614Skmacy		0xcd5d, 0x2105,
903181614Skmacy		0xcd5e, 0x3805,
904181614Skmacy		0xcd5f, 0x6524,
905181614Skmacy		0xcd60, 0xdff4,
906181614Skmacy		0xcd61, 0x4005,
907181614Skmacy		0xcd62, 0x6524,
908181614Skmacy		0xcd63, 0x2e8d,
909181614Skmacy		0xcd64, 0x303d,
910181614Skmacy		0xcd65, 0x5dd3,
911181614Skmacy		0xcd66, 0x306,
912181614Skmacy		0xcd67, 0x2ff7,
913181614Skmacy		0xcd68, 0x38f7,
914181614Skmacy		0xcd69, 0x60b7,
915181614Skmacy		0xcd6a, 0xdffd,
916181614Skmacy		0xcd6b, 0x00a,
917181614Skmacy		0xcd6c, 0x1002,
918181614Skmacy		0xcd6d, 0
919181614Skmacy	};
920181614Skmacy	int i, err;
921181614Skmacy
922181614Skmacy	err = set_phy_regs(phy, regs);
923181614Skmacy	if (!err && modtype == phy_modtype_twinax_long)
924181614Skmacy		err = set_phy_regs(phy, preemphasis);
925181614Skmacy	if (err)
926181614Skmacy		return err;
927181614Skmacy
928181614Skmacy	msleep(50);
929181614Skmacy
930181614Skmacy	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
931181614Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
932181614Skmacy				 twinax_edc[i + 1]);
933181614Skmacy	if (!err)
934181614Skmacy		phy->priv = edc_twinax;
935181614Skmacy	return err;
936181614Skmacy}
937181614Skmacy
938181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr)
939181614Skmacy{
940181614Skmacy	int i, err;
941181614Skmacy	unsigned int stat, data;
942181614Skmacy
943181614Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
944181614Skmacy			 (dev_addr << 8) | (1 << 8) | word_addr);
945181614Skmacy	if (err)
946181614Skmacy		return err;
947181614Skmacy
948181614Skmacy	for (i = 0; i < 5; i++) {
949181614Skmacy		msleep(1);
950181614Skmacy		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
951181614Skmacy		if (err)
952181614Skmacy			return err;
953181614Skmacy		if ((stat & 3) == 1) {
954181614Skmacy			err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA,
955181614Skmacy					&data);
956181614Skmacy			if (err)
957181614Skmacy				return err;
958181614Skmacy			return data >> 8;
959181614Skmacy		}
960181614Skmacy	}
961181614Skmacy	CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n",
962181614Skmacy		phy->addr, word_addr);
963181614Skmacy	return -ETIMEDOUT;
964181614Skmacy}
965181614Skmacy
966181614Skmacystatic int get_module_type(struct cphy *phy, int delay_ms)
967181614Skmacy{
968181614Skmacy	int v;
969181614Skmacy	unsigned int stat;
970181614Skmacy
971181614Skmacy	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
972181614Skmacy	if (v)
973181614Skmacy		return v;
974181614Skmacy
975181614Skmacy	if (stat & (1 << 8))			/* module absent */
976181614Skmacy		return phy_modtype_none;
977181614Skmacy
978181614Skmacy	if (delay_ms)
979181614Skmacy		msleep(delay_ms);
980181614Skmacy
981181614Skmacy	/* see SFF-8472 for below */
982181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3);
983181614Skmacy	if (v < 0)
984181614Skmacy		return v;
985181614Skmacy
986181614Skmacy	if (v == 0x10)
987181614Skmacy		return phy_modtype_sr;
988181614Skmacy	if (v == 0x20)
989181614Skmacy		return phy_modtype_lr;
990181614Skmacy	if (v == 0x40)
991181614Skmacy		return phy_modtype_lrm;
992181614Skmacy
993181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6);
994181614Skmacy	if (v < 0)
995181614Skmacy		return v;
996181614Skmacy	if (v != 4)
997181614Skmacy		goto unknown;
998181614Skmacy
999181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10);
1000181614Skmacy	if (v < 0)
1001181614Skmacy		return v;
1002181614Skmacy
1003181614Skmacy	if (v & 0x80) {
1004181614Skmacy		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
1005181614Skmacy		if (v < 0)
1006181614Skmacy			return v;
1007181614Skmacy		return v > 10 ? phy_modtype_twinax_long : phy_modtype_twinax;
1008181614Skmacy	}
1009181614Skmacyunknown:
1010181614Skmacy	return phy_modtype_unknown;
1011181614Skmacy}
1012181614Skmacy
1013181614Skmacystatic int ael2005_intr_enable(struct cphy *phy)
1014181614Skmacy{
1015181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
1016181614Skmacy	return err ? err : t3_phy_lasi_intr_enable(phy);
1017181614Skmacy}
1018181614Skmacy
1019181614Skmacystatic int ael2005_intr_disable(struct cphy *phy)
1020181614Skmacy{
1021181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
1022181614Skmacy	return err ? err : t3_phy_lasi_intr_disable(phy);
1023181614Skmacy}
1024181614Skmacy
1025181614Skmacystatic int ael2005_intr_clear(struct cphy *phy)
1026181614Skmacy{
1027181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
1028181614Skmacy	return err ? err : t3_phy_lasi_intr_clear(phy);
1029181614Skmacy}
1030181614Skmacy
1031180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
1032180583Skmacy{
1033180583Skmacy	static struct reg_val regs0[] = {
1034180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
1035180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
1036180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
1037180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1038180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
1039180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1040180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
1041180583Skmacy		{ 0, 0, 0, 0 }
1042180583Skmacy	};
1043180583Skmacy	static struct reg_val regs1[] = {
1044180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
1045180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
1046180583Skmacy		{ 0, 0, 0, 0 }
1047180583Skmacy	};
1048180583Skmacy
1049181614Skmacy	int err, lasi_ctrl;
1050180583Skmacy
1051181614Skmacy	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
1052181614Skmacy	if (err)
1053181614Skmacy		return err;
1054181614Skmacy
1055180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
1056180583Skmacy	if (err)
1057180583Skmacy		return err;
1058180583Skmacy
1059180583Skmacy	msleep(125);
1060181614Skmacy	phy->priv = edc_none;
1061180583Skmacy	err = set_phy_regs(phy, regs0);
1062180583Skmacy	if (err)
1063180583Skmacy		return err;
1064180583Skmacy
1065180583Skmacy	msleep(50);
1066181614Skmacy
1067181614Skmacy	err = get_module_type(phy, 0);
1068181614Skmacy	if (err < 0)
1069181614Skmacy		return err;
1070181614Skmacy	phy->modtype = (u8)err;
1071181614Skmacy
1072181614Skmacy	if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
1073181614Skmacy		err = ael2005_setup_twinax_edc(phy, err);
1074181614Skmacy	else
1075181614Skmacy		err = ael2005_setup_sr_edc(phy);
1076180583Skmacy	if (err)
1077180583Skmacy		return err;
1078180583Skmacy
1079181614Skmacy	err = set_phy_regs(phy, regs1);
1080180583Skmacy	if (err)
1081180583Skmacy		return err;
1082180583Skmacy
1083181614Skmacy	/* reset wipes out interrupts, reenable them if they were on */
1084181614Skmacy	if (lasi_ctrl & 1)
1085181614Skmacy		err = ael2005_intr_enable(phy);
1086181614Skmacy	return err;
1087180583Skmacy}
1088180583Skmacy
1089181614Skmacystatic int ael2005_intr_handler(struct cphy *phy)
1090181614Skmacy{
1091181614Skmacy	unsigned int stat;
1092181614Skmacy	int ret, edc_needed, cause = 0;
1093181614Skmacy
1094181614Skmacy	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
1095181614Skmacy	if (ret)
1096181614Skmacy		return ret;
1097181614Skmacy
1098181614Skmacy	if (stat & AEL2005_MODDET_IRQ) {
1099181614Skmacy		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
1100181614Skmacy				 0xd00);
1101181614Skmacy		if (ret)
1102181614Skmacy			return ret;
1103181614Skmacy
1104181614Skmacy		/* modules have max 300 ms init time after hot plug */
1105181614Skmacy		ret = get_module_type(phy, 300);
1106181614Skmacy		if (ret < 0)
1107181614Skmacy			return ret;
1108181614Skmacy
1109181614Skmacy		phy->modtype = (u8)ret;
1110181614Skmacy		if (ret == phy_modtype_none)
1111181614Skmacy			edc_needed = phy->priv;       /* on unplug retain EDC */
1112181614Skmacy		else if (ret == phy_modtype_twinax ||
1113181614Skmacy			 ret == phy_modtype_twinax_long)
1114181614Skmacy			edc_needed = edc_twinax;
1115181614Skmacy		else
1116181614Skmacy			edc_needed = edc_sr;
1117181614Skmacy
1118181614Skmacy		if (edc_needed != phy->priv) {
1119181614Skmacy			ret = ael2005_reset(phy, 0);
1120181614Skmacy			return ret ? ret : cphy_cause_module_change;
1121181614Skmacy		}
1122181614Skmacy		cause = cphy_cause_module_change;
1123181614Skmacy	}
1124181614Skmacy
1125181614Skmacy	ret = t3_phy_lasi_intr_handler(phy);
1126181614Skmacy	return ret < 0 ? ret : ret + cause;
1127181614Skmacy}
1128181614Skmacy
1129167514Skmacy#ifdef C99_NOT_SUPPORTED
1130180583Skmacystatic struct cphy_ops ael2005_ops = {
1131180583Skmacy	ael2005_reset,
1132181614Skmacy	ael2005_intr_enable,
1133181614Skmacy	ael2005_intr_disable,
1134181614Skmacy	ael2005_intr_clear,
1135181614Skmacy	ael2005_intr_handler,
1136180583Skmacy	NULL,
1137180583Skmacy	NULL,
1138180583Skmacy	NULL,
1139180583Skmacy	NULL,
1140180583Skmacy	NULL,
1141181614Skmacy	get_link_status_r,
1142180583Skmacy	ael1002_power_down,
1143180583Skmacy};
1144180583Skmacy#else
1145180583Skmacystatic struct cphy_ops ael2005_ops = {
1146180583Skmacy	.reset           = ael2005_reset,
1147181614Skmacy	.intr_enable     = ael2005_intr_enable,
1148181614Skmacy	.intr_disable    = ael2005_intr_disable,
1149181614Skmacy	.intr_clear      = ael2005_intr_clear,
1150181614Skmacy	.intr_handler    = ael2005_intr_handler,
1151181614Skmacy	.get_link_status = get_link_status_r,
1152180583Skmacy	.power_down      = ael1002_power_down,
1153180583Skmacy};
1154180583Skmacy#endif
1155180583Skmacy
1156180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1157180583Skmacy			const struct mdio_ops *mdio_ops)
1158180583Skmacy{
1159180583Skmacy	cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops,
1160181614Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
1161181614Skmacy		  SUPPORTED_IRQ, "10GBASE-R");
1162180583Skmacy	msleep(125);
1163180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
1164180583Skmacy				   1 << 5);
1165180583Skmacy}
1166180583Skmacy
1167181614Skmacy/*
1168181614Skmacy * Get link status for a 10GBASE-X device.
1169181614Skmacy */
1170181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed,
1171181614Skmacy			     int *duplex, int *fc)
1172181614Skmacy{
1173181614Skmacy	if (link_ok) {
1174181614Skmacy		unsigned int stat0, stat1, stat2;
1175181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
1176181614Skmacy
1177181614Skmacy		if (!err)
1178181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
1179181614Skmacy		if (!err)
1180181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
1181181614Skmacy		if (err)
1182181614Skmacy			return err;
1183181614Skmacy		*link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1;
1184181614Skmacy	}
1185181614Skmacy	if (speed)
1186181614Skmacy		*speed = SPEED_10000;
1187181614Skmacy	if (duplex)
1188181614Skmacy		*duplex = DUPLEX_FULL;
1189181614Skmacy	return 0;
1190181614Skmacy}
1191181614Skmacy
1192180583Skmacy#ifdef C99_NOT_SUPPORTED
1193167514Skmacystatic struct cphy_ops qt2045_ops = {
1194167514Skmacy	ael1006_reset,
1195180583Skmacy	t3_phy_lasi_intr_enable,
1196180583Skmacy	t3_phy_lasi_intr_disable,
1197180583Skmacy	t3_phy_lasi_intr_clear,
1198180583Skmacy	t3_phy_lasi_intr_handler,
1199167514Skmacy	NULL,
1200167514Skmacy	NULL,
1201167514Skmacy	NULL,
1202167514Skmacy	NULL,
1203167514Skmacy	NULL,
1204181614Skmacy	get_link_status_x,
1205167514Skmacy	ael1006_power_down,
1206167514Skmacy};
1207167514Skmacy#else
1208167514Skmacystatic struct cphy_ops qt2045_ops = {
1209167514Skmacy	.reset           = ael1006_reset,
1210180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
1211180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
1212180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
1213180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
1214181614Skmacy	.get_link_status = get_link_status_x,
1215167514Skmacy	.power_down      = ael1006_power_down,
1216167514Skmacy};
1217167514Skmacy#endif
1218167514Skmacy
1219176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1220176472Skmacy		       const struct mdio_ops *mdio_ops)
1221167514Skmacy{
1222167514Skmacy	unsigned int stat;
1223167514Skmacy
1224176472Skmacy	cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops,
1225176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1226176472Skmacy		  "10GBASE-CX4");
1227167514Skmacy
1228167514Skmacy	/*
1229167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
1230167514Skmacy	 * have it at 1.
1231167514Skmacy	 */
1232167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
1233167514Skmacy	    stat == 0xffff)
1234167514Skmacy		phy->addr = 1;
1235176472Skmacy	return 0;
1236167514Skmacy}
1237167514Skmacy
1238167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
1239167514Skmacy{
1240167514Skmacy	return 0;
1241167514Skmacy}
1242167514Skmacy
1243167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
1244167514Skmacy				       int *speed, int *duplex, int *fc)
1245167514Skmacy{
1246167514Skmacy	if (link_ok) {
1247167514Skmacy		unsigned int status;
1248167514Skmacy
1249167514Skmacy		status = t3_read_reg(phy->adapter,
1250170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
1251170654Skmacy			 t3_read_reg(phy->adapter,
1252170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
1253170654Skmacy			 t3_read_reg(phy->adapter,
1254170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
1255170654Skmacy			 t3_read_reg(phy->adapter,
1256170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
1257167514Skmacy		*link_ok = !(status & F_LOWSIG0);
1258167514Skmacy	}
1259167514Skmacy	if (speed)
1260167514Skmacy		*speed = SPEED_10000;
1261167514Skmacy	if (duplex)
1262167514Skmacy		*duplex = DUPLEX_FULL;
1263167514Skmacy	return 0;
1264167514Skmacy}
1265167514Skmacy
1266167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
1267167514Skmacy{
1268167514Skmacy	return 0;
1269167514Skmacy}
1270167514Skmacy
1271167514Skmacy#ifdef C99_NOT_SUPPORTED
1272167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1273167514Skmacy	xaui_direct_reset,
1274167514Skmacy	ael1002_intr_noop,
1275167514Skmacy	ael1002_intr_noop,
1276167514Skmacy	ael1002_intr_noop,
1277167514Skmacy	ael1002_intr_noop,
1278167514Skmacy	NULL,
1279167514Skmacy	NULL,
1280167514Skmacy	NULL,
1281167514Skmacy	NULL,
1282167514Skmacy	NULL,
1283167514Skmacy	xaui_direct_get_link_status,
1284167514Skmacy	xaui_direct_power_down,
1285167514Skmacy};
1286167514Skmacy#else
1287167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1288167514Skmacy	.reset           = xaui_direct_reset,
1289167514Skmacy	.intr_enable     = ael1002_intr_noop,
1290167514Skmacy	.intr_disable    = ael1002_intr_noop,
1291167514Skmacy	.intr_clear      = ael1002_intr_noop,
1292167514Skmacy	.intr_handler    = ael1002_intr_noop,
1293167514Skmacy	.get_link_status = xaui_direct_get_link_status,
1294167514Skmacy	.power_down      = xaui_direct_power_down,
1295167514Skmacy};
1296167514Skmacy#endif
1297167514Skmacy
1298176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1299176472Skmacy			    const struct mdio_ops *mdio_ops)
1300167514Skmacy{
1301176472Skmacy	cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops,
1302176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1303176472Skmacy		  "10GBASE-CX4");
1304176472Skmacy	return 0;
1305167514Skmacy}
1306