cxgb_ael1002.c revision 185620
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 185620 2008-12-04 20:32:53Z 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);
208185620Sgnn
209185620Sgnn       /* Phy loopback work around for ael1006 */
210185620Sgnn       /* Soft reset phy by toggling loopback  */
211185620Sgnn       msleep(125);
212185620Sgnn       /* Put phy into local loopback */
213185620Sgnn       t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 0, 1);
214185620Sgnn       msleep(125);
215185620Sgnn       /* Take phy out of local loopback */
216185620Sgnn       t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0);
217185620Sgnn
218185157Sgnn	return 0;
219167514Skmacy}
220167514Skmacy
221167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable)
222167514Skmacy{
223167514Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
224167514Skmacy				   BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
225167514Skmacy}
226167514Skmacy
227167514Skmacy#ifdef C99_NOT_SUPPORTED
228167514Skmacystatic struct cphy_ops ael1006_ops = {
229167514Skmacy	ael1006_reset,
230180583Skmacy	t3_phy_lasi_intr_enable,
231180583Skmacy	t3_phy_lasi_intr_disable,
232180583Skmacy	t3_phy_lasi_intr_clear,
233180583Skmacy	t3_phy_lasi_intr_handler,
234167514Skmacy	NULL,
235167514Skmacy	NULL,
236167514Skmacy	NULL,
237167514Skmacy	NULL,
238167514Skmacy	NULL,
239181614Skmacy	get_link_status_r,
240167514Skmacy	ael1006_power_down,
241167514Skmacy};
242167514Skmacy#else
243167514Skmacystatic struct cphy_ops ael1006_ops = {
244167514Skmacy	.reset           = ael1006_reset,
245180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
246180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
247180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
248180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
249181614Skmacy	.get_link_status = get_link_status_r,
250167514Skmacy	.power_down      = ael1006_power_down,
251167514Skmacy};
252167514Skmacy#endif
253167514Skmacy
254176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
255176472Skmacy			const struct mdio_ops *mdio_ops)
256167514Skmacy{
257176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops,
258176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
259176472Skmacy		  "10GBASE-SR");
260167514Skmacy	ael100x_txon(phy);
261176472Skmacy	return 0;
262167514Skmacy}
263167514Skmacy
264180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
265180583Skmacy{
266181614Skmacy	static struct reg_val regs[] = {
267181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
268181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
269181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
270181614Skmacy		{ 0, 0, 0, 0 }
271181614Skmacy	};
272180583Skmacy	static u16 sr_edc[] = {
273180583Skmacy		0xcc00, 0x2ff4,
274180583Skmacy		0xcc01, 0x3cd4,
275180583Skmacy		0xcc02, 0x2015,
276180583Skmacy		0xcc03, 0x3105,
277180583Skmacy		0xcc04, 0x6524,
278180583Skmacy		0xcc05, 0x27ff,
279180583Skmacy		0xcc06, 0x300f,
280180583Skmacy		0xcc07, 0x2c8b,
281180583Skmacy		0xcc08, 0x300b,
282180583Skmacy		0xcc09, 0x4009,
283180583Skmacy		0xcc0a, 0x400e,
284180583Skmacy		0xcc0b, 0x2f72,
285180583Skmacy		0xcc0c, 0x3002,
286180583Skmacy		0xcc0d, 0x1002,
287180583Skmacy		0xcc0e, 0x2172,
288180583Skmacy		0xcc0f, 0x3012,
289180583Skmacy		0xcc10, 0x1002,
290180583Skmacy		0xcc11, 0x25d2,
291180583Skmacy		0xcc12, 0x3012,
292180583Skmacy		0xcc13, 0x1002,
293180583Skmacy		0xcc14, 0xd01e,
294180583Skmacy		0xcc15, 0x27d2,
295180583Skmacy		0xcc16, 0x3012,
296180583Skmacy		0xcc17, 0x1002,
297180583Skmacy		0xcc18, 0x2004,
298180583Skmacy		0xcc19, 0x3c84,
299180583Skmacy		0xcc1a, 0x6436,
300180583Skmacy		0xcc1b, 0x2007,
301180583Skmacy		0xcc1c, 0x3f87,
302180583Skmacy		0xcc1d, 0x8676,
303180583Skmacy		0xcc1e, 0x40b7,
304180583Skmacy		0xcc1f, 0xa746,
305180583Skmacy		0xcc20, 0x4047,
306180583Skmacy		0xcc21, 0x5673,
307180583Skmacy		0xcc22, 0x2982,
308180583Skmacy		0xcc23, 0x3002,
309180583Skmacy		0xcc24, 0x13d2,
310180583Skmacy		0xcc25, 0x8bbd,
311180583Skmacy		0xcc26, 0x2862,
312180583Skmacy		0xcc27, 0x3012,
313180583Skmacy		0xcc28, 0x1002,
314180583Skmacy		0xcc29, 0x2092,
315180583Skmacy		0xcc2a, 0x3012,
316180583Skmacy		0xcc2b, 0x1002,
317180583Skmacy		0xcc2c, 0x5cc3,
318180583Skmacy		0xcc2d, 0x314,
319180583Skmacy		0xcc2e, 0x2942,
320180583Skmacy		0xcc2f, 0x3002,
321180583Skmacy		0xcc30, 0x1002,
322180583Skmacy		0xcc31, 0xd019,
323180583Skmacy		0xcc32, 0x2032,
324180583Skmacy		0xcc33, 0x3012,
325180583Skmacy		0xcc34, 0x1002,
326180583Skmacy		0xcc35, 0x2a04,
327180583Skmacy		0xcc36, 0x3c74,
328180583Skmacy		0xcc37, 0x6435,
329180583Skmacy		0xcc38, 0x2fa4,
330180583Skmacy		0xcc39, 0x3cd4,
331180583Skmacy		0xcc3a, 0x6624,
332180583Skmacy		0xcc3b, 0x5563,
333180583Skmacy		0xcc3c, 0x2d42,
334180583Skmacy		0xcc3d, 0x3002,
335180583Skmacy		0xcc3e, 0x13d2,
336180583Skmacy		0xcc3f, 0x464d,
337180583Skmacy		0xcc40, 0x2862,
338180583Skmacy		0xcc41, 0x3012,
339180583Skmacy		0xcc42, 0x1002,
340180583Skmacy		0xcc43, 0x2032,
341180583Skmacy		0xcc44, 0x3012,
342180583Skmacy		0xcc45, 0x1002,
343180583Skmacy		0xcc46, 0x2fb4,
344180583Skmacy		0xcc47, 0x3cd4,
345180583Skmacy		0xcc48, 0x6624,
346180583Skmacy		0xcc49, 0x5563,
347180583Skmacy		0xcc4a, 0x2d42,
348180583Skmacy		0xcc4b, 0x3002,
349180583Skmacy		0xcc4c, 0x13d2,
350180583Skmacy		0xcc4d, 0x2ed2,
351180583Skmacy		0xcc4e, 0x3002,
352180583Skmacy		0xcc4f, 0x1002,
353180583Skmacy		0xcc50, 0x2fd2,
354180583Skmacy		0xcc51, 0x3002,
355180583Skmacy		0xcc52, 0x1002,
356180583Skmacy		0xcc53, 0x004,
357180583Skmacy		0xcc54, 0x2942,
358180583Skmacy		0xcc55, 0x3002,
359180583Skmacy		0xcc56, 0x1002,
360180583Skmacy		0xcc57, 0x2092,
361180583Skmacy		0xcc58, 0x3012,
362180583Skmacy		0xcc59, 0x1002,
363180583Skmacy		0xcc5a, 0x5cc3,
364180583Skmacy		0xcc5b, 0x317,
365180583Skmacy		0xcc5c, 0x2f72,
366180583Skmacy		0xcc5d, 0x3002,
367180583Skmacy		0xcc5e, 0x1002,
368180583Skmacy		0xcc5f, 0x2942,
369180583Skmacy		0xcc60, 0x3002,
370180583Skmacy		0xcc61, 0x1002,
371180583Skmacy		0xcc62, 0x22cd,
372180583Skmacy		0xcc63, 0x301d,
373180583Skmacy		0xcc64, 0x2862,
374180583Skmacy		0xcc65, 0x3012,
375180583Skmacy		0xcc66, 0x1002,
376180583Skmacy		0xcc67, 0x2ed2,
377180583Skmacy		0xcc68, 0x3002,
378180583Skmacy		0xcc69, 0x1002,
379180583Skmacy		0xcc6a, 0x2d72,
380180583Skmacy		0xcc6b, 0x3002,
381180583Skmacy		0xcc6c, 0x1002,
382180583Skmacy		0xcc6d, 0x628f,
383180583Skmacy		0xcc6e, 0x2112,
384180583Skmacy		0xcc6f, 0x3012,
385180583Skmacy		0xcc70, 0x1002,
386180583Skmacy		0xcc71, 0x5aa3,
387180583Skmacy		0xcc72, 0x2dc2,
388180583Skmacy		0xcc73, 0x3002,
389180583Skmacy		0xcc74, 0x1312,
390180583Skmacy		0xcc75, 0x6f72,
391180583Skmacy		0xcc76, 0x1002,
392180583Skmacy		0xcc77, 0x2807,
393180583Skmacy		0xcc78, 0x31a7,
394180583Skmacy		0xcc79, 0x20c4,
395180583Skmacy		0xcc7a, 0x3c24,
396180583Skmacy		0xcc7b, 0x6724,
397180583Skmacy		0xcc7c, 0x1002,
398180583Skmacy		0xcc7d, 0x2807,
399180583Skmacy		0xcc7e, 0x3187,
400180583Skmacy		0xcc7f, 0x20c4,
401180583Skmacy		0xcc80, 0x3c24,
402180583Skmacy		0xcc81, 0x6724,
403180583Skmacy		0xcc82, 0x1002,
404180583Skmacy		0xcc83, 0x2514,
405180583Skmacy		0xcc84, 0x3c64,
406180583Skmacy		0xcc85, 0x6436,
407180583Skmacy		0xcc86, 0xdff4,
408180583Skmacy		0xcc87, 0x6436,
409180583Skmacy		0xcc88, 0x1002,
410180583Skmacy		0xcc89, 0x40a4,
411180583Skmacy		0xcc8a, 0x643c,
412180583Skmacy		0xcc8b, 0x4016,
413180583Skmacy		0xcc8c, 0x8c6c,
414180583Skmacy		0xcc8d, 0x2b24,
415180583Skmacy		0xcc8e, 0x3c24,
416180583Skmacy		0xcc8f, 0x6435,
417180583Skmacy		0xcc90, 0x1002,
418180583Skmacy		0xcc91, 0x2b24,
419180583Skmacy		0xcc92, 0x3c24,
420180583Skmacy		0xcc93, 0x643a,
421180583Skmacy		0xcc94, 0x4025,
422180583Skmacy		0xcc95, 0x8a5a,
423180583Skmacy		0xcc96, 0x1002,
424180583Skmacy		0xcc97, 0x2731,
425180583Skmacy		0xcc98, 0x3011,
426180583Skmacy		0xcc99, 0x1001,
427180583Skmacy		0xcc9a, 0xc7a0,
428180583Skmacy		0xcc9b, 0x100,
429180583Skmacy		0xcc9c, 0xc502,
430180583Skmacy		0xcc9d, 0x53ac,
431180583Skmacy		0xcc9e, 0xc503,
432180583Skmacy		0xcc9f, 0xd5d5,
433180583Skmacy		0xcca0, 0xc600,
434180583Skmacy		0xcca1, 0x2a6d,
435180583Skmacy		0xcca2, 0xc601,
436180583Skmacy		0xcca3, 0x2a4c,
437180583Skmacy		0xcca4, 0xc602,
438180583Skmacy		0xcca5, 0x111,
439180583Skmacy		0xcca6, 0xc60c,
440180583Skmacy		0xcca7, 0x5900,
441180583Skmacy		0xcca8, 0xc710,
442180583Skmacy		0xcca9, 0x700,
443180583Skmacy		0xccaa, 0xc718,
444180583Skmacy		0xccab, 0x700,
445180583Skmacy		0xccac, 0xc720,
446180583Skmacy		0xccad, 0x4700,
447180583Skmacy		0xccae, 0xc801,
448180583Skmacy		0xccaf, 0x7f50,
449180583Skmacy		0xccb0, 0xc802,
450180583Skmacy		0xccb1, 0x7760,
451180583Skmacy		0xccb2, 0xc803,
452180583Skmacy		0xccb3, 0x7fce,
453180583Skmacy		0xccb4, 0xc804,
454180583Skmacy		0xccb5, 0x5700,
455180583Skmacy		0xccb6, 0xc805,
456180583Skmacy		0xccb7, 0x5f11,
457180583Skmacy		0xccb8, 0xc806,
458180583Skmacy		0xccb9, 0x4751,
459180583Skmacy		0xccba, 0xc807,
460180583Skmacy		0xccbb, 0x57e1,
461180583Skmacy		0xccbc, 0xc808,
462180583Skmacy		0xccbd, 0x2700,
463180583Skmacy		0xccbe, 0xc809,
464180583Skmacy		0xccbf, 0x000,
465180583Skmacy		0xccc0, 0xc821,
466180583Skmacy		0xccc1, 0x002,
467180583Skmacy		0xccc2, 0xc822,
468180583Skmacy		0xccc3, 0x014,
469180583Skmacy		0xccc4, 0xc832,
470180583Skmacy		0xccc5, 0x1186,
471180583Skmacy		0xccc6, 0xc847,
472180583Skmacy		0xccc7, 0x1e02,
473180583Skmacy		0xccc8, 0xc013,
474180583Skmacy		0xccc9, 0xf341,
475180583Skmacy		0xccca, 0xc01a,
476180583Skmacy		0xcccb, 0x446,
477180583Skmacy		0xcccc, 0xc024,
478180583Skmacy		0xcccd, 0x1000,
479180583Skmacy		0xccce, 0xc025,
480180583Skmacy		0xcccf, 0xa00,
481180583Skmacy		0xccd0, 0xc026,
482180583Skmacy		0xccd1, 0xc0c,
483180583Skmacy		0xccd2, 0xc027,
484180583Skmacy		0xccd3, 0xc0c,
485180583Skmacy		0xccd4, 0xc029,
486180583Skmacy		0xccd5, 0x0a0,
487180583Skmacy		0xccd6, 0xc030,
488180583Skmacy		0xccd7, 0xa00,
489180583Skmacy		0xccd8, 0xc03c,
490180583Skmacy		0xccd9, 0x01c,
491180583Skmacy		0xccda, 0xc005,
492180583Skmacy		0xccdb, 0x7a06,
493180583Skmacy		0xccdc, 0x000,
494180583Skmacy		0xccdd, 0x2731,
495180583Skmacy		0xccde, 0x3011,
496180583Skmacy		0xccdf, 0x1001,
497180583Skmacy		0xcce0, 0xc620,
498180583Skmacy		0xcce1, 0x000,
499180583Skmacy		0xcce2, 0xc621,
500180583Skmacy		0xcce3, 0x03f,
501180583Skmacy		0xcce4, 0xc622,
502180583Skmacy		0xcce5, 0x000,
503180583Skmacy		0xcce6, 0xc623,
504180583Skmacy		0xcce7, 0x000,
505180583Skmacy		0xcce8, 0xc624,
506180583Skmacy		0xcce9, 0x000,
507180583Skmacy		0xccea, 0xc625,
508180583Skmacy		0xcceb, 0x000,
509180583Skmacy		0xccec, 0xc627,
510180583Skmacy		0xcced, 0x000,
511180583Skmacy		0xccee, 0xc628,
512180583Skmacy		0xccef, 0x000,
513180583Skmacy		0xccf0, 0xc62c,
514180583Skmacy		0xccf1, 0x000,
515180583Skmacy		0xccf2, 0x000,
516180583Skmacy		0xccf3, 0x2806,
517180583Skmacy		0xccf4, 0x3cb6,
518180583Skmacy		0xccf5, 0xc161,
519180583Skmacy		0xccf6, 0x6134,
520180583Skmacy		0xccf7, 0x6135,
521180583Skmacy		0xccf8, 0x5443,
522180583Skmacy		0xccf9, 0x303,
523180583Skmacy		0xccfa, 0x6524,
524180583Skmacy		0xccfb, 0x00b,
525180583Skmacy		0xccfc, 0x1002,
526180583Skmacy		0xccfd, 0x2104,
527180583Skmacy		0xccfe, 0x3c24,
528180583Skmacy		0xccff, 0x2105,
529180583Skmacy		0xcd00, 0x3805,
530180583Skmacy		0xcd01, 0x6524,
531180583Skmacy		0xcd02, 0xdff4,
532180583Skmacy		0xcd03, 0x4005,
533180583Skmacy		0xcd04, 0x6524,
534180583Skmacy		0xcd05, 0x1002,
535180583Skmacy		0xcd06, 0x5dd3,
536180583Skmacy		0xcd07, 0x306,
537180583Skmacy		0xcd08, 0x2ff7,
538180583Skmacy		0xcd09, 0x38f7,
539180583Skmacy		0xcd0a, 0x60b7,
540180583Skmacy		0xcd0b, 0xdffd,
541180583Skmacy		0xcd0c, 0x00a,
542180583Skmacy		0xcd0d, 0x1002,
543180583Skmacy		0xcd0e, 0
544180583Skmacy	};
545180583Skmacy	int i, err;
546180583Skmacy
547181614Skmacy	err = set_phy_regs(phy, regs);
548181614Skmacy	if (err)
549181614Skmacy		return err;
550181614Skmacy
551181614Skmacy	msleep(50);
552181614Skmacy
553181614Skmacy	for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
554180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
555180583Skmacy				 sr_edc[i + 1]);
556181614Skmacy	if (!err)
557181614Skmacy		phy->priv = edc_sr;
558180583Skmacy	return err;
559180583Skmacy}
560180583Skmacy
561181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype)
562181614Skmacy{
563181614Skmacy	static struct reg_val regs[] = {
564181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 },
565181614Skmacy		{ 0, 0, 0, 0 }
566181614Skmacy	};
567181614Skmacy	static struct reg_val preemphasis[] = {
568181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 },
569181614Skmacy		{ MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 },
570181614Skmacy		{ 0, 0, 0, 0 }
571181614Skmacy	};
572181614Skmacy	static u16 twinax_edc[] = {
573181614Skmacy		0xcc00, 0x4009,
574181614Skmacy		0xcc01, 0x27ff,
575181614Skmacy		0xcc02, 0x300f,
576181614Skmacy		0xcc03, 0x40aa,
577181614Skmacy		0xcc04, 0x401c,
578181614Skmacy		0xcc05, 0x401e,
579181614Skmacy		0xcc06, 0x2ff4,
580181614Skmacy		0xcc07, 0x3cd4,
581181614Skmacy		0xcc08, 0x2035,
582181614Skmacy		0xcc09, 0x3145,
583181614Skmacy		0xcc0a, 0x6524,
584181614Skmacy		0xcc0b, 0x26a2,
585181614Skmacy		0xcc0c, 0x3012,
586181614Skmacy		0xcc0d, 0x1002,
587181614Skmacy		0xcc0e, 0x29c2,
588181614Skmacy		0xcc0f, 0x3002,
589181614Skmacy		0xcc10, 0x1002,
590181614Skmacy		0xcc11, 0x2072,
591181614Skmacy		0xcc12, 0x3012,
592181614Skmacy		0xcc13, 0x1002,
593181614Skmacy		0xcc14, 0x22cd,
594181614Skmacy		0xcc15, 0x301d,
595181614Skmacy		0xcc16, 0x2e52,
596181614Skmacy		0xcc17, 0x3012,
597181614Skmacy		0xcc18, 0x1002,
598181614Skmacy		0xcc19, 0x28e2,
599181614Skmacy		0xcc1a, 0x3002,
600181614Skmacy		0xcc1b, 0x1002,
601181614Skmacy		0xcc1c, 0x628f,
602181614Skmacy		0xcc1d, 0x2ac2,
603181614Skmacy		0xcc1e, 0x3012,
604181614Skmacy		0xcc1f, 0x1002,
605181614Skmacy		0xcc20, 0x5553,
606181614Skmacy		0xcc21, 0x2ae2,
607181614Skmacy		0xcc22, 0x3002,
608181614Skmacy		0xcc23, 0x1302,
609181614Skmacy		0xcc24, 0x401e,
610181614Skmacy		0xcc25, 0x2be2,
611181614Skmacy		0xcc26, 0x3012,
612181614Skmacy		0xcc27, 0x1002,
613181614Skmacy		0xcc28, 0x2da2,
614181614Skmacy		0xcc29, 0x3012,
615181614Skmacy		0xcc2a, 0x1002,
616181614Skmacy		0xcc2b, 0x2ba2,
617181614Skmacy		0xcc2c, 0x3002,
618181614Skmacy		0xcc2d, 0x1002,
619181614Skmacy		0xcc2e, 0x5ee3,
620181614Skmacy		0xcc2f, 0x305,
621181614Skmacy		0xcc30, 0x400e,
622181614Skmacy		0xcc31, 0x2bc2,
623181614Skmacy		0xcc32, 0x3002,
624181614Skmacy		0xcc33, 0x1002,
625181614Skmacy		0xcc34, 0x2b82,
626181614Skmacy		0xcc35, 0x3012,
627181614Skmacy		0xcc36, 0x1002,
628181614Skmacy		0xcc37, 0x5663,
629181614Skmacy		0xcc38, 0x302,
630181614Skmacy		0xcc39, 0x401e,
631181614Skmacy		0xcc3a, 0x6f72,
632181614Skmacy		0xcc3b, 0x1002,
633181614Skmacy		0xcc3c, 0x628f,
634181614Skmacy		0xcc3d, 0x2be2,
635181614Skmacy		0xcc3e, 0x3012,
636181614Skmacy		0xcc3f, 0x1002,
637181614Skmacy		0xcc40, 0x22cd,
638181614Skmacy		0xcc41, 0x301d,
639181614Skmacy		0xcc42, 0x2e52,
640181614Skmacy		0xcc43, 0x3012,
641181614Skmacy		0xcc44, 0x1002,
642181614Skmacy		0xcc45, 0x2522,
643181614Skmacy		0xcc46, 0x3012,
644181614Skmacy		0xcc47, 0x1002,
645181614Skmacy		0xcc48, 0x2da2,
646181614Skmacy		0xcc49, 0x3012,
647181614Skmacy		0xcc4a, 0x1002,
648181614Skmacy		0xcc4b, 0x2ca2,
649181614Skmacy		0xcc4c, 0x3012,
650181614Skmacy		0xcc4d, 0x1002,
651181614Skmacy		0xcc4e, 0x2fa4,
652181614Skmacy		0xcc4f, 0x3cd4,
653181614Skmacy		0xcc50, 0x6624,
654181614Skmacy		0xcc51, 0x410b,
655181614Skmacy		0xcc52, 0x56b3,
656181614Skmacy		0xcc53, 0x3c4,
657181614Skmacy		0xcc54, 0x2fb2,
658181614Skmacy		0xcc55, 0x3002,
659181614Skmacy		0xcc56, 0x1002,
660181614Skmacy		0xcc57, 0x220b,
661181614Skmacy		0xcc58, 0x303b,
662181614Skmacy		0xcc59, 0x56b3,
663181614Skmacy		0xcc5a, 0x3c3,
664181614Skmacy		0xcc5b, 0x866b,
665181614Skmacy		0xcc5c, 0x400c,
666181614Skmacy		0xcc5d, 0x23a2,
667181614Skmacy		0xcc5e, 0x3012,
668181614Skmacy		0xcc5f, 0x1002,
669181614Skmacy		0xcc60, 0x2da2,
670181614Skmacy		0xcc61, 0x3012,
671181614Skmacy		0xcc62, 0x1002,
672181614Skmacy		0xcc63, 0x2ca2,
673181614Skmacy		0xcc64, 0x3012,
674181614Skmacy		0xcc65, 0x1002,
675181614Skmacy		0xcc66, 0x2fb4,
676181614Skmacy		0xcc67, 0x3cd4,
677181614Skmacy		0xcc68, 0x6624,
678181614Skmacy		0xcc69, 0x56b3,
679181614Skmacy		0xcc6a, 0x3c3,
680181614Skmacy		0xcc6b, 0x866b,
681181614Skmacy		0xcc6c, 0x401c,
682181614Skmacy		0xcc6d, 0x2205,
683181614Skmacy		0xcc6e, 0x3035,
684181614Skmacy		0xcc6f, 0x5b53,
685181614Skmacy		0xcc70, 0x2c52,
686181614Skmacy		0xcc71, 0x3002,
687181614Skmacy		0xcc72, 0x13c2,
688181614Skmacy		0xcc73, 0x5cc3,
689181614Skmacy		0xcc74, 0x317,
690181614Skmacy		0xcc75, 0x2522,
691181614Skmacy		0xcc76, 0x3012,
692181614Skmacy		0xcc77, 0x1002,
693181614Skmacy		0xcc78, 0x2da2,
694181614Skmacy		0xcc79, 0x3012,
695181614Skmacy		0xcc7a, 0x1002,
696181614Skmacy		0xcc7b, 0x2b82,
697181614Skmacy		0xcc7c, 0x3012,
698181614Skmacy		0xcc7d, 0x1002,
699181614Skmacy		0xcc7e, 0x5663,
700181614Skmacy		0xcc7f, 0x303,
701181614Skmacy		0xcc80, 0x401e,
702181614Skmacy		0xcc81, 0x004,
703181614Skmacy		0xcc82, 0x2c42,
704181614Skmacy		0xcc83, 0x3012,
705181614Skmacy		0xcc84, 0x1002,
706181614Skmacy		0xcc85, 0x6f72,
707181614Skmacy		0xcc86, 0x1002,
708181614Skmacy		0xcc87, 0x628f,
709181614Skmacy		0xcc88, 0x2304,
710181614Skmacy		0xcc89, 0x3c84,
711181614Skmacy		0xcc8a, 0x6436,
712181614Skmacy		0xcc8b, 0xdff4,
713181614Skmacy		0xcc8c, 0x6436,
714181614Skmacy		0xcc8d, 0x2ff5,
715181614Skmacy		0xcc8e, 0x3005,
716181614Skmacy		0xcc8f, 0x8656,
717181614Skmacy		0xcc90, 0xdfba,
718181614Skmacy		0xcc91, 0x56a3,
719181614Skmacy		0xcc92, 0xd05a,
720181614Skmacy		0xcc93, 0x21c2,
721181614Skmacy		0xcc94, 0x3012,
722181614Skmacy		0xcc95, 0x1392,
723181614Skmacy		0xcc96, 0xd05a,
724181614Skmacy		0xcc97, 0x56a3,
725181614Skmacy		0xcc98, 0xdfba,
726181614Skmacy		0xcc99, 0x383,
727181614Skmacy		0xcc9a, 0x6f72,
728181614Skmacy		0xcc9b, 0x1002,
729181614Skmacy		0xcc9c, 0x28c5,
730181614Skmacy		0xcc9d, 0x3005,
731181614Skmacy		0xcc9e, 0x4178,
732181614Skmacy		0xcc9f, 0x5653,
733181614Skmacy		0xcca0, 0x384,
734181614Skmacy		0xcca1, 0x22b2,
735181614Skmacy		0xcca2, 0x3012,
736181614Skmacy		0xcca3, 0x1002,
737181614Skmacy		0xcca4, 0x2be5,
738181614Skmacy		0xcca5, 0x3005,
739181614Skmacy		0xcca6, 0x41e8,
740181614Skmacy		0xcca7, 0x5653,
741181614Skmacy		0xcca8, 0x382,
742181614Skmacy		0xcca9, 0x002,
743181614Skmacy		0xccaa, 0x4258,
744181614Skmacy		0xccab, 0x2474,
745181614Skmacy		0xccac, 0x3c84,
746181614Skmacy		0xccad, 0x6437,
747181614Skmacy		0xccae, 0xdff4,
748181614Skmacy		0xccaf, 0x6437,
749181614Skmacy		0xccb0, 0x2ff5,
750181614Skmacy		0xccb1, 0x3c05,
751181614Skmacy		0xccb2, 0x8757,
752181614Skmacy		0xccb3, 0xb888,
753181614Skmacy		0xccb4, 0x9787,
754181614Skmacy		0xccb5, 0xdff4,
755181614Skmacy		0xccb6, 0x6724,
756181614Skmacy		0xccb7, 0x866a,
757181614Skmacy		0xccb8, 0x6f72,
758181614Skmacy		0xccb9, 0x1002,
759181614Skmacy		0xccba, 0x2d01,
760181614Skmacy		0xccbb, 0x3011,
761181614Skmacy		0xccbc, 0x1001,
762181614Skmacy		0xccbd, 0xc620,
763181614Skmacy		0xccbe, 0x14e5,
764181614Skmacy		0xccbf, 0xc621,
765181614Skmacy		0xccc0, 0xc53d,
766181614Skmacy		0xccc1, 0xc622,
767181614Skmacy		0xccc2, 0x3cbe,
768181614Skmacy		0xccc3, 0xc623,
769181614Skmacy		0xccc4, 0x4452,
770181614Skmacy		0xccc5, 0xc624,
771181614Skmacy		0xccc6, 0xc5c5,
772181614Skmacy		0xccc7, 0xc625,
773181614Skmacy		0xccc8, 0xe01e,
774181614Skmacy		0xccc9, 0xc627,
775181614Skmacy		0xccca, 0x000,
776181614Skmacy		0xcccb, 0xc628,
777181614Skmacy		0xcccc, 0x000,
778181614Skmacy		0xcccd, 0xc62b,
779181614Skmacy		0xccce, 0x000,
780181614Skmacy		0xcccf, 0xc62c,
781181614Skmacy		0xccd0, 0x000,
782181614Skmacy		0xccd1, 0x000,
783181614Skmacy		0xccd2, 0x2d01,
784181614Skmacy		0xccd3, 0x3011,
785181614Skmacy		0xccd4, 0x1001,
786181614Skmacy		0xccd5, 0xc620,
787181614Skmacy		0xccd6, 0x000,
788181614Skmacy		0xccd7, 0xc621,
789181614Skmacy		0xccd8, 0x000,
790181614Skmacy		0xccd9, 0xc622,
791181614Skmacy		0xccda, 0x0ce,
792181614Skmacy		0xccdb, 0xc623,
793181614Skmacy		0xccdc, 0x07f,
794181614Skmacy		0xccdd, 0xc624,
795181614Skmacy		0xccde, 0x032,
796181614Skmacy		0xccdf, 0xc625,
797181614Skmacy		0xcce0, 0x000,
798181614Skmacy		0xcce1, 0xc627,
799181614Skmacy		0xcce2, 0x000,
800181614Skmacy		0xcce3, 0xc628,
801181614Skmacy		0xcce4, 0x000,
802181614Skmacy		0xcce5, 0xc62b,
803181614Skmacy		0xcce6, 0x000,
804181614Skmacy		0xcce7, 0xc62c,
805181614Skmacy		0xcce8, 0x000,
806181614Skmacy		0xcce9, 0x000,
807181614Skmacy		0xccea, 0x2d01,
808181614Skmacy		0xcceb, 0x3011,
809181614Skmacy		0xccec, 0x1001,
810181614Skmacy		0xcced, 0xc502,
811181614Skmacy		0xccee, 0x609f,
812181614Skmacy		0xccef, 0xc600,
813181614Skmacy		0xccf0, 0x2a6e,
814181614Skmacy		0xccf1, 0xc601,
815181614Skmacy		0xccf2, 0x2a2c,
816181614Skmacy		0xccf3, 0xc60c,
817181614Skmacy		0xccf4, 0x5400,
818181614Skmacy		0xccf5, 0xc710,
819181614Skmacy		0xccf6, 0x700,
820181614Skmacy		0xccf7, 0xc718,
821181614Skmacy		0xccf8, 0x700,
822181614Skmacy		0xccf9, 0xc720,
823181614Skmacy		0xccfa, 0x4700,
824181614Skmacy		0xccfb, 0xc728,
825181614Skmacy		0xccfc, 0x700,
826181614Skmacy		0xccfd, 0xc729,
827181614Skmacy		0xccfe, 0x1207,
828181614Skmacy		0xccff, 0xc801,
829181614Skmacy		0xcd00, 0x7f50,
830181614Skmacy		0xcd01, 0xc802,
831181614Skmacy		0xcd02, 0x7760,
832181614Skmacy		0xcd03, 0xc803,
833181614Skmacy		0xcd04, 0x7fce,
834181614Skmacy		0xcd05, 0xc804,
835181614Skmacy		0xcd06, 0x520e,
836181614Skmacy		0xcd07, 0xc805,
837181614Skmacy		0xcd08, 0x5c11,
838181614Skmacy		0xcd09, 0xc806,
839181614Skmacy		0xcd0a, 0x3c51,
840181614Skmacy		0xcd0b, 0xc807,
841181614Skmacy		0xcd0c, 0x4061,
842181614Skmacy		0xcd0d, 0xc808,
843181614Skmacy		0xcd0e, 0x49c1,
844181614Skmacy		0xcd0f, 0xc809,
845181614Skmacy		0xcd10, 0x3840,
846181614Skmacy		0xcd11, 0xc80a,
847181614Skmacy		0xcd12, 0x000,
848181614Skmacy		0xcd13, 0xc821,
849181614Skmacy		0xcd14, 0x002,
850181614Skmacy		0xcd15, 0xc822,
851181614Skmacy		0xcd16, 0x046,
852181614Skmacy		0xcd17, 0xc844,
853181614Skmacy		0xcd18, 0x182f,
854181614Skmacy		0xcd19, 0xc013,
855181614Skmacy		0xcd1a, 0xf341,
856181614Skmacy		0xcd1b, 0xc01a,
857181614Skmacy		0xcd1c, 0x446,
858181614Skmacy		0xcd1d, 0xc024,
859181614Skmacy		0xcd1e, 0x1000,
860181614Skmacy		0xcd1f, 0xc025,
861181614Skmacy		0xcd20, 0xa00,
862181614Skmacy		0xcd21, 0xc026,
863181614Skmacy		0xcd22, 0xc0c,
864181614Skmacy		0xcd23, 0xc027,
865181614Skmacy		0xcd24, 0xc0c,
866181614Skmacy		0xcd25, 0xc029,
867181614Skmacy		0xcd26, 0x0a0,
868181614Skmacy		0xcd27, 0xc030,
869181614Skmacy		0xcd28, 0xa00,
870181614Skmacy		0xcd29, 0xc03c,
871181614Skmacy		0xcd2a, 0x01c,
872181614Skmacy		0xcd2b, 0x000,
873181614Skmacy		0xcd2c, 0x2b84,
874181614Skmacy		0xcd2d, 0x3c74,
875181614Skmacy		0xcd2e, 0x6435,
876181614Skmacy		0xcd2f, 0xdff4,
877181614Skmacy		0xcd30, 0x6435,
878181614Skmacy		0xcd31, 0x2806,
879181614Skmacy		0xcd32, 0x3006,
880181614Skmacy		0xcd33, 0x8565,
881181614Skmacy		0xcd34, 0x2b24,
882181614Skmacy		0xcd35, 0x3c24,
883181614Skmacy		0xcd36, 0x6436,
884181614Skmacy		0xcd37, 0x1002,
885181614Skmacy		0xcd38, 0x2b24,
886181614Skmacy		0xcd39, 0x3c24,
887181614Skmacy		0xcd3a, 0x6436,
888181614Skmacy		0xcd3b, 0x4045,
889181614Skmacy		0xcd3c, 0x8656,
890181614Skmacy		0xcd3d, 0x1002,
891181614Skmacy		0xcd3e, 0x2807,
892181614Skmacy		0xcd3f, 0x31a7,
893181614Skmacy		0xcd40, 0x20c4,
894181614Skmacy		0xcd41, 0x3c24,
895181614Skmacy		0xcd42, 0x6724,
896181614Skmacy		0xcd43, 0x1002,
897181614Skmacy		0xcd44, 0x2807,
898181614Skmacy		0xcd45, 0x3187,
899181614Skmacy		0xcd46, 0x20c4,
900181614Skmacy		0xcd47, 0x3c24,
901181614Skmacy		0xcd48, 0x6724,
902181614Skmacy		0xcd49, 0x1002,
903181614Skmacy		0xcd4a, 0x2514,
904181614Skmacy		0xcd4b, 0x3c64,
905181614Skmacy		0xcd4c, 0x6436,
906181614Skmacy		0xcd4d, 0xdff4,
907181614Skmacy		0xcd4e, 0x6436,
908181614Skmacy		0xcd4f, 0x1002,
909181614Skmacy		0xcd50, 0x2806,
910181614Skmacy		0xcd51, 0x3cb6,
911181614Skmacy		0xcd52, 0xc161,
912181614Skmacy		0xcd53, 0x6134,
913181614Skmacy		0xcd54, 0x6135,
914181614Skmacy		0xcd55, 0x5443,
915181614Skmacy		0xcd56, 0x303,
916181614Skmacy		0xcd57, 0x6524,
917181614Skmacy		0xcd58, 0x00b,
918181614Skmacy		0xcd59, 0x1002,
919181614Skmacy		0xcd5a, 0xd019,
920181614Skmacy		0xcd5b, 0x2104,
921181614Skmacy		0xcd5c, 0x3c24,
922181614Skmacy		0xcd5d, 0x2105,
923181614Skmacy		0xcd5e, 0x3805,
924181614Skmacy		0xcd5f, 0x6524,
925181614Skmacy		0xcd60, 0xdff4,
926181614Skmacy		0xcd61, 0x4005,
927181614Skmacy		0xcd62, 0x6524,
928181614Skmacy		0xcd63, 0x2e8d,
929181614Skmacy		0xcd64, 0x303d,
930181614Skmacy		0xcd65, 0x5dd3,
931181614Skmacy		0xcd66, 0x306,
932181614Skmacy		0xcd67, 0x2ff7,
933181614Skmacy		0xcd68, 0x38f7,
934181614Skmacy		0xcd69, 0x60b7,
935181614Skmacy		0xcd6a, 0xdffd,
936181614Skmacy		0xcd6b, 0x00a,
937181614Skmacy		0xcd6c, 0x1002,
938181614Skmacy		0xcd6d, 0
939181614Skmacy	};
940181614Skmacy	int i, err;
941181614Skmacy
942181614Skmacy	err = set_phy_regs(phy, regs);
943181614Skmacy	if (!err && modtype == phy_modtype_twinax_long)
944181614Skmacy		err = set_phy_regs(phy, preemphasis);
945181614Skmacy	if (err)
946181614Skmacy		return err;
947181614Skmacy
948181614Skmacy	msleep(50);
949181614Skmacy
950181614Skmacy	for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2)
951181614Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i],
952181614Skmacy				 twinax_edc[i + 1]);
953181614Skmacy	if (!err)
954181614Skmacy		phy->priv = edc_twinax;
955181614Skmacy	return err;
956181614Skmacy}
957181614Skmacy
958181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr)
959181614Skmacy{
960181614Skmacy	int i, err;
961181614Skmacy	unsigned int stat, data;
962181614Skmacy
963181614Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL,
964181614Skmacy			 (dev_addr << 8) | (1 << 8) | word_addr);
965181614Skmacy	if (err)
966181614Skmacy		return err;
967181614Skmacy
968181614Skmacy	for (i = 0; i < 5; i++) {
969181614Skmacy		msleep(1);
970181614Skmacy		err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat);
971181614Skmacy		if (err)
972181614Skmacy			return err;
973181614Skmacy		if ((stat & 3) == 1) {
974181614Skmacy			err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA,
975181614Skmacy					&data);
976181614Skmacy			if (err)
977181614Skmacy				return err;
978181614Skmacy			return data >> 8;
979181614Skmacy		}
980181614Skmacy	}
981181614Skmacy	CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n",
982181614Skmacy		phy->addr, word_addr);
983181614Skmacy	return -ETIMEDOUT;
984181614Skmacy}
985181614Skmacy
986181614Skmacystatic int get_module_type(struct cphy *phy, int delay_ms)
987181614Skmacy{
988181614Skmacy	int v;
989181614Skmacy	unsigned int stat;
990181614Skmacy
991181614Skmacy	v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat);
992181614Skmacy	if (v)
993181614Skmacy		return v;
994181614Skmacy
995181614Skmacy	if (stat & (1 << 8))			/* module absent */
996181614Skmacy		return phy_modtype_none;
997181614Skmacy
998181614Skmacy	if (delay_ms)
999181614Skmacy		msleep(delay_ms);
1000181614Skmacy
1001181614Skmacy	/* see SFF-8472 for below */
1002181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3);
1003181614Skmacy	if (v < 0)
1004181614Skmacy		return v;
1005181614Skmacy
1006181614Skmacy	if (v == 0x10)
1007181614Skmacy		return phy_modtype_sr;
1008181614Skmacy	if (v == 0x20)
1009181614Skmacy		return phy_modtype_lr;
1010181614Skmacy	if (v == 0x40)
1011181614Skmacy		return phy_modtype_lrm;
1012181614Skmacy
1013181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6);
1014181614Skmacy	if (v < 0)
1015181614Skmacy		return v;
1016181614Skmacy	if (v != 4)
1017181614Skmacy		goto unknown;
1018181614Skmacy
1019181614Skmacy	v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10);
1020181614Skmacy	if (v < 0)
1021181614Skmacy		return v;
1022181614Skmacy
1023181614Skmacy	if (v & 0x80) {
1024181614Skmacy		v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12);
1025181614Skmacy		if (v < 0)
1026181614Skmacy			return v;
1027181614Skmacy		return v > 10 ? phy_modtype_twinax_long : phy_modtype_twinax;
1028181614Skmacy	}
1029181614Skmacyunknown:
1030181614Skmacy	return phy_modtype_unknown;
1031181614Skmacy}
1032181614Skmacy
1033181614Skmacystatic int ael2005_intr_enable(struct cphy *phy)
1034181614Skmacy{
1035181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200);
1036181614Skmacy	return err ? err : t3_phy_lasi_intr_enable(phy);
1037181614Skmacy}
1038181614Skmacy
1039181614Skmacystatic int ael2005_intr_disable(struct cphy *phy)
1040181614Skmacy{
1041181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100);
1042181614Skmacy	return err ? err : t3_phy_lasi_intr_disable(phy);
1043181614Skmacy}
1044181614Skmacy
1045181614Skmacystatic int ael2005_intr_clear(struct cphy *phy)
1046181614Skmacy{
1047181614Skmacy	int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00);
1048181614Skmacy	return err ? err : t3_phy_lasi_intr_clear(phy);
1049181614Skmacy}
1050181614Skmacy
1051180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
1052180583Skmacy{
1053180583Skmacy	static struct reg_val regs0[] = {
1054180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
1055180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
1056180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
1057180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1058180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
1059180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
1060180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
1061180583Skmacy		{ 0, 0, 0, 0 }
1062180583Skmacy	};
1063180583Skmacy	static struct reg_val regs1[] = {
1064180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
1065180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
1066180583Skmacy		{ 0, 0, 0, 0 }
1067180583Skmacy	};
1068180583Skmacy
1069181614Skmacy	int err, lasi_ctrl;
1070180583Skmacy
1071181614Skmacy	err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl);
1072181614Skmacy	if (err)
1073181614Skmacy		return err;
1074181614Skmacy
1075180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
1076180583Skmacy	if (err)
1077180583Skmacy		return err;
1078180583Skmacy
1079180583Skmacy	msleep(125);
1080181614Skmacy	phy->priv = edc_none;
1081180583Skmacy	err = set_phy_regs(phy, regs0);
1082180583Skmacy	if (err)
1083180583Skmacy		return err;
1084180583Skmacy
1085180583Skmacy	msleep(50);
1086181614Skmacy
1087181614Skmacy	err = get_module_type(phy, 0);
1088181614Skmacy	if (err < 0)
1089181614Skmacy		return err;
1090181614Skmacy	phy->modtype = (u8)err;
1091181614Skmacy
1092181614Skmacy	if (err == phy_modtype_twinax || err == phy_modtype_twinax_long)
1093181614Skmacy		err = ael2005_setup_twinax_edc(phy, err);
1094181614Skmacy	else
1095181614Skmacy		err = ael2005_setup_sr_edc(phy);
1096180583Skmacy	if (err)
1097180583Skmacy		return err;
1098180583Skmacy
1099181614Skmacy	err = set_phy_regs(phy, regs1);
1100180583Skmacy	if (err)
1101180583Skmacy		return err;
1102180583Skmacy
1103181614Skmacy	/* reset wipes out interrupts, reenable them if they were on */
1104181614Skmacy	if (lasi_ctrl & 1)
1105181614Skmacy		err = ael2005_intr_enable(phy);
1106181614Skmacy	return err;
1107180583Skmacy}
1108180583Skmacy
1109181614Skmacystatic int ael2005_intr_handler(struct cphy *phy)
1110181614Skmacy{
1111181614Skmacy	unsigned int stat;
1112181614Skmacy	int ret, edc_needed, cause = 0;
1113181614Skmacy
1114181614Skmacy	ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat);
1115181614Skmacy	if (ret)
1116181614Skmacy		return ret;
1117181614Skmacy
1118181614Skmacy	if (stat & AEL2005_MODDET_IRQ) {
1119181614Skmacy		ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL,
1120181614Skmacy				 0xd00);
1121181614Skmacy		if (ret)
1122181614Skmacy			return ret;
1123181614Skmacy
1124181614Skmacy		/* modules have max 300 ms init time after hot plug */
1125181614Skmacy		ret = get_module_type(phy, 300);
1126181614Skmacy		if (ret < 0)
1127181614Skmacy			return ret;
1128181614Skmacy
1129181614Skmacy		phy->modtype = (u8)ret;
1130181614Skmacy		if (ret == phy_modtype_none)
1131181614Skmacy			edc_needed = phy->priv;       /* on unplug retain EDC */
1132181614Skmacy		else if (ret == phy_modtype_twinax ||
1133181614Skmacy			 ret == phy_modtype_twinax_long)
1134181614Skmacy			edc_needed = edc_twinax;
1135181614Skmacy		else
1136181614Skmacy			edc_needed = edc_sr;
1137181614Skmacy
1138181614Skmacy		if (edc_needed != phy->priv) {
1139181614Skmacy			ret = ael2005_reset(phy, 0);
1140181614Skmacy			return ret ? ret : cphy_cause_module_change;
1141181614Skmacy		}
1142181614Skmacy		cause = cphy_cause_module_change;
1143181614Skmacy	}
1144181614Skmacy
1145181614Skmacy	ret = t3_phy_lasi_intr_handler(phy);
1146181614Skmacy	return ret < 0 ? ret : ret + cause;
1147181614Skmacy}
1148181614Skmacy
1149167514Skmacy#ifdef C99_NOT_SUPPORTED
1150180583Skmacystatic struct cphy_ops ael2005_ops = {
1151180583Skmacy	ael2005_reset,
1152181614Skmacy	ael2005_intr_enable,
1153181614Skmacy	ael2005_intr_disable,
1154181614Skmacy	ael2005_intr_clear,
1155181614Skmacy	ael2005_intr_handler,
1156180583Skmacy	NULL,
1157180583Skmacy	NULL,
1158180583Skmacy	NULL,
1159180583Skmacy	NULL,
1160180583Skmacy	NULL,
1161181614Skmacy	get_link_status_r,
1162180583Skmacy	ael1002_power_down,
1163180583Skmacy};
1164180583Skmacy#else
1165180583Skmacystatic struct cphy_ops ael2005_ops = {
1166180583Skmacy	.reset           = ael2005_reset,
1167181614Skmacy	.intr_enable     = ael2005_intr_enable,
1168181614Skmacy	.intr_disable    = ael2005_intr_disable,
1169181614Skmacy	.intr_clear      = ael2005_intr_clear,
1170181614Skmacy	.intr_handler    = ael2005_intr_handler,
1171181614Skmacy	.get_link_status = get_link_status_r,
1172180583Skmacy	.power_down      = ael1002_power_down,
1173180583Skmacy};
1174180583Skmacy#endif
1175180583Skmacy
1176180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1177180583Skmacy			const struct mdio_ops *mdio_ops)
1178180583Skmacy{
1179180583Skmacy	cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops,
1180181614Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE |
1181181614Skmacy		  SUPPORTED_IRQ, "10GBASE-R");
1182180583Skmacy	msleep(125);
1183180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
1184180583Skmacy				   1 << 5);
1185180583Skmacy}
1186180583Skmacy
1187181614Skmacy/*
1188181614Skmacy * Get link status for a 10GBASE-X device.
1189181614Skmacy */
1190181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed,
1191181614Skmacy			     int *duplex, int *fc)
1192181614Skmacy{
1193181614Skmacy	if (link_ok) {
1194181614Skmacy		unsigned int stat0, stat1, stat2;
1195181614Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0);
1196181614Skmacy
1197181614Skmacy		if (!err)
1198181614Skmacy			err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1);
1199181614Skmacy		if (!err)
1200181614Skmacy			err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2);
1201181614Skmacy		if (err)
1202181614Skmacy			return err;
1203181614Skmacy		*link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1;
1204181614Skmacy	}
1205181614Skmacy	if (speed)
1206181614Skmacy		*speed = SPEED_10000;
1207181614Skmacy	if (duplex)
1208181614Skmacy		*duplex = DUPLEX_FULL;
1209181614Skmacy	return 0;
1210181614Skmacy}
1211181614Skmacy
1212180583Skmacy#ifdef C99_NOT_SUPPORTED
1213167514Skmacystatic struct cphy_ops qt2045_ops = {
1214167514Skmacy	ael1006_reset,
1215180583Skmacy	t3_phy_lasi_intr_enable,
1216180583Skmacy	t3_phy_lasi_intr_disable,
1217180583Skmacy	t3_phy_lasi_intr_clear,
1218180583Skmacy	t3_phy_lasi_intr_handler,
1219167514Skmacy	NULL,
1220167514Skmacy	NULL,
1221167514Skmacy	NULL,
1222167514Skmacy	NULL,
1223167514Skmacy	NULL,
1224181614Skmacy	get_link_status_x,
1225167514Skmacy	ael1006_power_down,
1226167514Skmacy};
1227167514Skmacy#else
1228167514Skmacystatic struct cphy_ops qt2045_ops = {
1229167514Skmacy	.reset           = ael1006_reset,
1230180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
1231180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
1232180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
1233180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
1234181614Skmacy	.get_link_status = get_link_status_x,
1235167514Skmacy	.power_down      = ael1006_power_down,
1236167514Skmacy};
1237167514Skmacy#endif
1238167514Skmacy
1239176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1240176472Skmacy		       const struct mdio_ops *mdio_ops)
1241167514Skmacy{
1242167514Skmacy	unsigned int stat;
1243167514Skmacy
1244176472Skmacy	cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops,
1245176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1246176472Skmacy		  "10GBASE-CX4");
1247167514Skmacy
1248167514Skmacy	/*
1249167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
1250167514Skmacy	 * have it at 1.
1251167514Skmacy	 */
1252167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
1253167514Skmacy	    stat == 0xffff)
1254167514Skmacy		phy->addr = 1;
1255176472Skmacy	return 0;
1256167514Skmacy}
1257167514Skmacy
1258167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
1259167514Skmacy{
1260167514Skmacy	return 0;
1261167514Skmacy}
1262167514Skmacy
1263167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
1264167514Skmacy				       int *speed, int *duplex, int *fc)
1265167514Skmacy{
1266167514Skmacy	if (link_ok) {
1267167514Skmacy		unsigned int status;
1268167514Skmacy
1269167514Skmacy		status = t3_read_reg(phy->adapter,
1270170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
1271170654Skmacy			 t3_read_reg(phy->adapter,
1272170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
1273170654Skmacy			 t3_read_reg(phy->adapter,
1274170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
1275170654Skmacy			 t3_read_reg(phy->adapter,
1276170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
1277167514Skmacy		*link_ok = !(status & F_LOWSIG0);
1278167514Skmacy	}
1279167514Skmacy	if (speed)
1280167514Skmacy		*speed = SPEED_10000;
1281167514Skmacy	if (duplex)
1282167514Skmacy		*duplex = DUPLEX_FULL;
1283167514Skmacy	return 0;
1284167514Skmacy}
1285167514Skmacy
1286167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
1287167514Skmacy{
1288167514Skmacy	return 0;
1289167514Skmacy}
1290167514Skmacy
1291167514Skmacy#ifdef C99_NOT_SUPPORTED
1292167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1293167514Skmacy	xaui_direct_reset,
1294167514Skmacy	ael1002_intr_noop,
1295167514Skmacy	ael1002_intr_noop,
1296167514Skmacy	ael1002_intr_noop,
1297167514Skmacy	ael1002_intr_noop,
1298167514Skmacy	NULL,
1299167514Skmacy	NULL,
1300167514Skmacy	NULL,
1301167514Skmacy	NULL,
1302167514Skmacy	NULL,
1303167514Skmacy	xaui_direct_get_link_status,
1304167514Skmacy	xaui_direct_power_down,
1305167514Skmacy};
1306167514Skmacy#else
1307167514Skmacystatic struct cphy_ops xaui_direct_ops = {
1308167514Skmacy	.reset           = xaui_direct_reset,
1309167514Skmacy	.intr_enable     = ael1002_intr_noop,
1310167514Skmacy	.intr_disable    = ael1002_intr_noop,
1311167514Skmacy	.intr_clear      = ael1002_intr_noop,
1312167514Skmacy	.intr_handler    = ael1002_intr_noop,
1313167514Skmacy	.get_link_status = xaui_direct_get_link_status,
1314167514Skmacy	.power_down      = xaui_direct_power_down,
1315167514Skmacy};
1316167514Skmacy#endif
1317167514Skmacy
1318176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
1319176472Skmacy			    const struct mdio_ops *mdio_ops)
1320167514Skmacy{
1321176472Skmacy	cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops,
1322176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
1323176472Skmacy		  "10GBASE-CX4");
1324176472Skmacy	return 0;
1325167514Skmacy}
1326