cxgb_ael1002.c revision 180583
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 180583 2008-07-18 06:12:31Z 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 {
43167514Skmacy	AEL100X_TX_DISABLE  = 9,
44167514Skmacy	AEL100X_TX_CONFIG1  = 0xc002,
45167514Skmacy	AEL1002_PWR_DOWN_HI = 0xc011,
46167514Skmacy	AEL1002_PWR_DOWN_LO = 0xc012,
47167514Skmacy	AEL1002_XFI_EQL     = 0xc015,
48167514Skmacy	AEL1002_LB_EN       = 0xc017,
49180583Skmacy	AEL_OPT_SETTINGS    = 0xc017,
50180583Skmacy};
51167514Skmacy
52180583Skmacystruct reg_val {
53180583Skmacy	unsigned short mmd_addr;
54180583Skmacy	unsigned short reg_addr;
55180583Skmacy	unsigned short clear_bits;
56180583Skmacy	unsigned short set_bits;
57167514Skmacy};
58167514Skmacy
59180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv)
60180583Skmacy{
61180583Skmacy	int err;
62180583Skmacy
63180583Skmacy	for (err = 0; rv->mmd_addr && !err; rv++) {
64180583Skmacy		if (rv->clear_bits == 0xffff)
65180583Skmacy			err = mdio_write(phy, rv->mmd_addr, rv->reg_addr,
66180583Skmacy					 rv->set_bits);
67180583Skmacy		else
68180583Skmacy			err = t3_mdio_change_bits(phy, rv->mmd_addr,
69180583Skmacy						  rv->reg_addr, rv->clear_bits,
70180583Skmacy						  rv->set_bits);
71180583Skmacy	}
72180583Skmacy	return err;
73180583Skmacy}
74180583Skmacy
75167514Skmacystatic void ael100x_txon(struct cphy *phy)
76167514Skmacy{
77167514Skmacy	int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL;
78167514Skmacy
79176472Skmacy	msleep(100);
80167514Skmacy	t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio);
81176472Skmacy	msleep(30);
82167514Skmacy}
83167514Skmacy
84167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable)
85167514Skmacy{
86167514Skmacy	int err;
87167514Skmacy
88167514Skmacy	err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable);
89167514Skmacy	if (!err)
90167514Skmacy		err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
91167514Skmacy					  BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
92167514Skmacy	return err;
93167514Skmacy}
94167514Skmacy
95167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait)
96167514Skmacy{
97167514Skmacy	int err;
98167514Skmacy
99167514Skmacy	if ((err = ael1002_power_down(phy, 0)) ||
100167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) ||
101167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) ||
102167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) ||
103167514Skmacy	    (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) ||
104167514Skmacy	    (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN,
105167514Skmacy				       0, 1 << 5)))
106167514Skmacy		return err;
107167514Skmacy	return 0;
108167514Skmacy}
109167514Skmacy
110167514Skmacystatic int ael1002_intr_noop(struct cphy *phy)
111167514Skmacy{
112167514Skmacy	return 0;
113167514Skmacy}
114167514Skmacy
115167514Skmacystatic int ael100x_get_link_status(struct cphy *phy, int *link_ok,
116167514Skmacy				   int *speed, int *duplex, int *fc)
117167514Skmacy{
118167514Skmacy	if (link_ok) {
119167514Skmacy		unsigned int status;
120167514Skmacy		int err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &status);
121167514Skmacy
122167514Skmacy		/*
123167514Skmacy		 * BMSR_LSTATUS is latch-low, so if it is 0 we need to read it
124167514Skmacy		 * once more to get the current link state.
125167514Skmacy		 */
126167514Skmacy		if (!err && !(status & BMSR_LSTATUS))
127167514Skmacy			err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR,
128167514Skmacy					&status);
129167514Skmacy		if (err)
130167514Skmacy			return err;
131167514Skmacy		*link_ok = !!(status & BMSR_LSTATUS);
132167514Skmacy	}
133167514Skmacy	if (speed)
134167514Skmacy		*speed = SPEED_10000;
135167514Skmacy	if (duplex)
136167514Skmacy		*duplex = DUPLEX_FULL;
137167514Skmacy	return 0;
138167514Skmacy}
139167514Skmacy
140167514Skmacy#ifdef C99_NOT_SUPPORTED
141167514Skmacystatic struct cphy_ops ael1002_ops = {
142167514Skmacy	ael1002_reset,
143167514Skmacy	ael1002_intr_noop,
144167514Skmacy	ael1002_intr_noop,
145167514Skmacy	ael1002_intr_noop,
146167514Skmacy	ael1002_intr_noop,
147167514Skmacy	NULL,
148167514Skmacy	NULL,
149167514Skmacy	NULL,
150167514Skmacy	NULL,
151167514Skmacy	NULL,
152167514Skmacy	ael100x_get_link_status,
153167514Skmacy	ael1002_power_down,
154167514Skmacy};
155167514Skmacy#else
156167514Skmacystatic struct cphy_ops ael1002_ops = {
157167514Skmacy	.reset           = ael1002_reset,
158167514Skmacy	.intr_enable     = ael1002_intr_noop,
159167514Skmacy	.intr_disable    = ael1002_intr_noop,
160167514Skmacy	.intr_clear      = ael1002_intr_noop,
161167514Skmacy	.intr_handler    = ael1002_intr_noop,
162167514Skmacy	.get_link_status = ael100x_get_link_status,
163167514Skmacy	.power_down      = ael1002_power_down,
164167514Skmacy};
165167514Skmacy#endif
166167514Skmacy
167176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
168176472Skmacy			const struct mdio_ops *mdio_ops)
169167514Skmacy{
170176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops,
171176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
172177340Skmacy		  "10GBASE-R");
173167514Skmacy	ael100x_txon(phy);
174176472Skmacy	return 0;
175167514Skmacy}
176167514Skmacy
177167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait)
178167514Skmacy{
179167514Skmacy	return t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
180167514Skmacy}
181167514Skmacy
182167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable)
183167514Skmacy{
184167514Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR,
185167514Skmacy				   BMCR_PDOWN, enable ? BMCR_PDOWN : 0);
186167514Skmacy}
187167514Skmacy
188167514Skmacy#ifdef C99_NOT_SUPPORTED
189167514Skmacystatic struct cphy_ops ael1006_ops = {
190167514Skmacy	ael1006_reset,
191180583Skmacy	t3_phy_lasi_intr_enable,
192180583Skmacy	t3_phy_lasi_intr_disable,
193180583Skmacy	t3_phy_lasi_intr_clear,
194180583Skmacy	t3_phy_lasi_intr_handler,
195167514Skmacy	NULL,
196167514Skmacy	NULL,
197167514Skmacy	NULL,
198167514Skmacy	NULL,
199167514Skmacy	NULL,
200167514Skmacy	ael100x_get_link_status,
201167514Skmacy	ael1006_power_down,
202167514Skmacy};
203167514Skmacy#else
204167514Skmacystatic struct cphy_ops ael1006_ops = {
205167514Skmacy	.reset           = ael1006_reset,
206180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
207180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
208180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
209180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
210167514Skmacy	.get_link_status = ael100x_get_link_status,
211167514Skmacy	.power_down      = ael1006_power_down,
212167514Skmacy};
213167514Skmacy#endif
214167514Skmacy
215176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
216176472Skmacy			const struct mdio_ops *mdio_ops)
217167514Skmacy{
218176472Skmacy	cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops,
219176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
220176472Skmacy		  "10GBASE-SR");
221167514Skmacy	ael100x_txon(phy);
222176472Skmacy	return 0;
223167514Skmacy}
224167514Skmacy
225180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy)
226180583Skmacy{
227180583Skmacy	static u16 sr_edc[] = {
228180583Skmacy		0xcc00, 0x2ff4,
229180583Skmacy		0xcc01, 0x3cd4,
230180583Skmacy		0xcc02, 0x2015,
231180583Skmacy		0xcc03, 0x3105,
232180583Skmacy		0xcc04, 0x6524,
233180583Skmacy		0xcc05, 0x27ff,
234180583Skmacy		0xcc06, 0x300f,
235180583Skmacy		0xcc07, 0x2c8b,
236180583Skmacy		0xcc08, 0x300b,
237180583Skmacy		0xcc09, 0x4009,
238180583Skmacy		0xcc0a, 0x400e,
239180583Skmacy		0xcc0b, 0x2f72,
240180583Skmacy		0xcc0c, 0x3002,
241180583Skmacy		0xcc0d, 0x1002,
242180583Skmacy		0xcc0e, 0x2172,
243180583Skmacy		0xcc0f, 0x3012,
244180583Skmacy		0xcc10, 0x1002,
245180583Skmacy		0xcc11, 0x25d2,
246180583Skmacy		0xcc12, 0x3012,
247180583Skmacy		0xcc13, 0x1002,
248180583Skmacy		0xcc14, 0xd01e,
249180583Skmacy		0xcc15, 0x27d2,
250180583Skmacy		0xcc16, 0x3012,
251180583Skmacy		0xcc17, 0x1002,
252180583Skmacy		0xcc18, 0x2004,
253180583Skmacy		0xcc19, 0x3c84,
254180583Skmacy		0xcc1a, 0x6436,
255180583Skmacy		0xcc1b, 0x2007,
256180583Skmacy		0xcc1c, 0x3f87,
257180583Skmacy		0xcc1d, 0x8676,
258180583Skmacy		0xcc1e, 0x40b7,
259180583Skmacy		0xcc1f, 0xa746,
260180583Skmacy		0xcc20, 0x4047,
261180583Skmacy		0xcc21, 0x5673,
262180583Skmacy		0xcc22, 0x2982,
263180583Skmacy		0xcc23, 0x3002,
264180583Skmacy		0xcc24, 0x13d2,
265180583Skmacy		0xcc25, 0x8bbd,
266180583Skmacy		0xcc26, 0x2862,
267180583Skmacy		0xcc27, 0x3012,
268180583Skmacy		0xcc28, 0x1002,
269180583Skmacy		0xcc29, 0x2092,
270180583Skmacy		0xcc2a, 0x3012,
271180583Skmacy		0xcc2b, 0x1002,
272180583Skmacy		0xcc2c, 0x5cc3,
273180583Skmacy		0xcc2d, 0x314,
274180583Skmacy		0xcc2e, 0x2942,
275180583Skmacy		0xcc2f, 0x3002,
276180583Skmacy		0xcc30, 0x1002,
277180583Skmacy		0xcc31, 0xd019,
278180583Skmacy		0xcc32, 0x2032,
279180583Skmacy		0xcc33, 0x3012,
280180583Skmacy		0xcc34, 0x1002,
281180583Skmacy		0xcc35, 0x2a04,
282180583Skmacy		0xcc36, 0x3c74,
283180583Skmacy		0xcc37, 0x6435,
284180583Skmacy		0xcc38, 0x2fa4,
285180583Skmacy		0xcc39, 0x3cd4,
286180583Skmacy		0xcc3a, 0x6624,
287180583Skmacy		0xcc3b, 0x5563,
288180583Skmacy		0xcc3c, 0x2d42,
289180583Skmacy		0xcc3d, 0x3002,
290180583Skmacy		0xcc3e, 0x13d2,
291180583Skmacy		0xcc3f, 0x464d,
292180583Skmacy		0xcc40, 0x2862,
293180583Skmacy		0xcc41, 0x3012,
294180583Skmacy		0xcc42, 0x1002,
295180583Skmacy		0xcc43, 0x2032,
296180583Skmacy		0xcc44, 0x3012,
297180583Skmacy		0xcc45, 0x1002,
298180583Skmacy		0xcc46, 0x2fb4,
299180583Skmacy		0xcc47, 0x3cd4,
300180583Skmacy		0xcc48, 0x6624,
301180583Skmacy		0xcc49, 0x5563,
302180583Skmacy		0xcc4a, 0x2d42,
303180583Skmacy		0xcc4b, 0x3002,
304180583Skmacy		0xcc4c, 0x13d2,
305180583Skmacy		0xcc4d, 0x2ed2,
306180583Skmacy		0xcc4e, 0x3002,
307180583Skmacy		0xcc4f, 0x1002,
308180583Skmacy		0xcc50, 0x2fd2,
309180583Skmacy		0xcc51, 0x3002,
310180583Skmacy		0xcc52, 0x1002,
311180583Skmacy		0xcc53, 0x004,
312180583Skmacy		0xcc54, 0x2942,
313180583Skmacy		0xcc55, 0x3002,
314180583Skmacy		0xcc56, 0x1002,
315180583Skmacy		0xcc57, 0x2092,
316180583Skmacy		0xcc58, 0x3012,
317180583Skmacy		0xcc59, 0x1002,
318180583Skmacy		0xcc5a, 0x5cc3,
319180583Skmacy		0xcc5b, 0x317,
320180583Skmacy		0xcc5c, 0x2f72,
321180583Skmacy		0xcc5d, 0x3002,
322180583Skmacy		0xcc5e, 0x1002,
323180583Skmacy		0xcc5f, 0x2942,
324180583Skmacy		0xcc60, 0x3002,
325180583Skmacy		0xcc61, 0x1002,
326180583Skmacy		0xcc62, 0x22cd,
327180583Skmacy		0xcc63, 0x301d,
328180583Skmacy		0xcc64, 0x2862,
329180583Skmacy		0xcc65, 0x3012,
330180583Skmacy		0xcc66, 0x1002,
331180583Skmacy		0xcc67, 0x2ed2,
332180583Skmacy		0xcc68, 0x3002,
333180583Skmacy		0xcc69, 0x1002,
334180583Skmacy		0xcc6a, 0x2d72,
335180583Skmacy		0xcc6b, 0x3002,
336180583Skmacy		0xcc6c, 0x1002,
337180583Skmacy		0xcc6d, 0x628f,
338180583Skmacy		0xcc6e, 0x2112,
339180583Skmacy		0xcc6f, 0x3012,
340180583Skmacy		0xcc70, 0x1002,
341180583Skmacy		0xcc71, 0x5aa3,
342180583Skmacy		0xcc72, 0x2dc2,
343180583Skmacy		0xcc73, 0x3002,
344180583Skmacy		0xcc74, 0x1312,
345180583Skmacy		0xcc75, 0x6f72,
346180583Skmacy		0xcc76, 0x1002,
347180583Skmacy		0xcc77, 0x2807,
348180583Skmacy		0xcc78, 0x31a7,
349180583Skmacy		0xcc79, 0x20c4,
350180583Skmacy		0xcc7a, 0x3c24,
351180583Skmacy		0xcc7b, 0x6724,
352180583Skmacy		0xcc7c, 0x1002,
353180583Skmacy		0xcc7d, 0x2807,
354180583Skmacy		0xcc7e, 0x3187,
355180583Skmacy		0xcc7f, 0x20c4,
356180583Skmacy		0xcc80, 0x3c24,
357180583Skmacy		0xcc81, 0x6724,
358180583Skmacy		0xcc82, 0x1002,
359180583Skmacy		0xcc83, 0x2514,
360180583Skmacy		0xcc84, 0x3c64,
361180583Skmacy		0xcc85, 0x6436,
362180583Skmacy		0xcc86, 0xdff4,
363180583Skmacy		0xcc87, 0x6436,
364180583Skmacy		0xcc88, 0x1002,
365180583Skmacy		0xcc89, 0x40a4,
366180583Skmacy		0xcc8a, 0x643c,
367180583Skmacy		0xcc8b, 0x4016,
368180583Skmacy		0xcc8c, 0x8c6c,
369180583Skmacy		0xcc8d, 0x2b24,
370180583Skmacy		0xcc8e, 0x3c24,
371180583Skmacy		0xcc8f, 0x6435,
372180583Skmacy		0xcc90, 0x1002,
373180583Skmacy		0xcc91, 0x2b24,
374180583Skmacy		0xcc92, 0x3c24,
375180583Skmacy		0xcc93, 0x643a,
376180583Skmacy		0xcc94, 0x4025,
377180583Skmacy		0xcc95, 0x8a5a,
378180583Skmacy		0xcc96, 0x1002,
379180583Skmacy		0xcc97, 0x2731,
380180583Skmacy		0xcc98, 0x3011,
381180583Skmacy		0xcc99, 0x1001,
382180583Skmacy		0xcc9a, 0xc7a0,
383180583Skmacy		0xcc9b, 0x100,
384180583Skmacy		0xcc9c, 0xc502,
385180583Skmacy		0xcc9d, 0x53ac,
386180583Skmacy		0xcc9e, 0xc503,
387180583Skmacy		0xcc9f, 0xd5d5,
388180583Skmacy		0xcca0, 0xc600,
389180583Skmacy		0xcca1, 0x2a6d,
390180583Skmacy		0xcca2, 0xc601,
391180583Skmacy		0xcca3, 0x2a4c,
392180583Skmacy		0xcca4, 0xc602,
393180583Skmacy		0xcca5, 0x111,
394180583Skmacy		0xcca6, 0xc60c,
395180583Skmacy		0xcca7, 0x5900,
396180583Skmacy		0xcca8, 0xc710,
397180583Skmacy		0xcca9, 0x700,
398180583Skmacy		0xccaa, 0xc718,
399180583Skmacy		0xccab, 0x700,
400180583Skmacy		0xccac, 0xc720,
401180583Skmacy		0xccad, 0x4700,
402180583Skmacy		0xccae, 0xc801,
403180583Skmacy		0xccaf, 0x7f50,
404180583Skmacy		0xccb0, 0xc802,
405180583Skmacy		0xccb1, 0x7760,
406180583Skmacy		0xccb2, 0xc803,
407180583Skmacy		0xccb3, 0x7fce,
408180583Skmacy		0xccb4, 0xc804,
409180583Skmacy		0xccb5, 0x5700,
410180583Skmacy		0xccb6, 0xc805,
411180583Skmacy		0xccb7, 0x5f11,
412180583Skmacy		0xccb8, 0xc806,
413180583Skmacy		0xccb9, 0x4751,
414180583Skmacy		0xccba, 0xc807,
415180583Skmacy		0xccbb, 0x57e1,
416180583Skmacy		0xccbc, 0xc808,
417180583Skmacy		0xccbd, 0x2700,
418180583Skmacy		0xccbe, 0xc809,
419180583Skmacy		0xccbf, 0x000,
420180583Skmacy		0xccc0, 0xc821,
421180583Skmacy		0xccc1, 0x002,
422180583Skmacy		0xccc2, 0xc822,
423180583Skmacy		0xccc3, 0x014,
424180583Skmacy		0xccc4, 0xc832,
425180583Skmacy		0xccc5, 0x1186,
426180583Skmacy		0xccc6, 0xc847,
427180583Skmacy		0xccc7, 0x1e02,
428180583Skmacy		0xccc8, 0xc013,
429180583Skmacy		0xccc9, 0xf341,
430180583Skmacy		0xccca, 0xc01a,
431180583Skmacy		0xcccb, 0x446,
432180583Skmacy		0xcccc, 0xc024,
433180583Skmacy		0xcccd, 0x1000,
434180583Skmacy		0xccce, 0xc025,
435180583Skmacy		0xcccf, 0xa00,
436180583Skmacy		0xccd0, 0xc026,
437180583Skmacy		0xccd1, 0xc0c,
438180583Skmacy		0xccd2, 0xc027,
439180583Skmacy		0xccd3, 0xc0c,
440180583Skmacy		0xccd4, 0xc029,
441180583Skmacy		0xccd5, 0x0a0,
442180583Skmacy		0xccd6, 0xc030,
443180583Skmacy		0xccd7, 0xa00,
444180583Skmacy		0xccd8, 0xc03c,
445180583Skmacy		0xccd9, 0x01c,
446180583Skmacy		0xccda, 0xc005,
447180583Skmacy		0xccdb, 0x7a06,
448180583Skmacy		0xccdc, 0x000,
449180583Skmacy		0xccdd, 0x2731,
450180583Skmacy		0xccde, 0x3011,
451180583Skmacy		0xccdf, 0x1001,
452180583Skmacy		0xcce0, 0xc620,
453180583Skmacy		0xcce1, 0x000,
454180583Skmacy		0xcce2, 0xc621,
455180583Skmacy		0xcce3, 0x03f,
456180583Skmacy		0xcce4, 0xc622,
457180583Skmacy		0xcce5, 0x000,
458180583Skmacy		0xcce6, 0xc623,
459180583Skmacy		0xcce7, 0x000,
460180583Skmacy		0xcce8, 0xc624,
461180583Skmacy		0xcce9, 0x000,
462180583Skmacy		0xccea, 0xc625,
463180583Skmacy		0xcceb, 0x000,
464180583Skmacy		0xccec, 0xc627,
465180583Skmacy		0xcced, 0x000,
466180583Skmacy		0xccee, 0xc628,
467180583Skmacy		0xccef, 0x000,
468180583Skmacy		0xccf0, 0xc62c,
469180583Skmacy		0xccf1, 0x000,
470180583Skmacy		0xccf2, 0x000,
471180583Skmacy		0xccf3, 0x2806,
472180583Skmacy		0xccf4, 0x3cb6,
473180583Skmacy		0xccf5, 0xc161,
474180583Skmacy		0xccf6, 0x6134,
475180583Skmacy		0xccf7, 0x6135,
476180583Skmacy		0xccf8, 0x5443,
477180583Skmacy		0xccf9, 0x303,
478180583Skmacy		0xccfa, 0x6524,
479180583Skmacy		0xccfb, 0x00b,
480180583Skmacy		0xccfc, 0x1002,
481180583Skmacy		0xccfd, 0x2104,
482180583Skmacy		0xccfe, 0x3c24,
483180583Skmacy		0xccff, 0x2105,
484180583Skmacy		0xcd00, 0x3805,
485180583Skmacy		0xcd01, 0x6524,
486180583Skmacy		0xcd02, 0xdff4,
487180583Skmacy		0xcd03, 0x4005,
488180583Skmacy		0xcd04, 0x6524,
489180583Skmacy		0xcd05, 0x1002,
490180583Skmacy		0xcd06, 0x5dd3,
491180583Skmacy		0xcd07, 0x306,
492180583Skmacy		0xcd08, 0x2ff7,
493180583Skmacy		0xcd09, 0x38f7,
494180583Skmacy		0xcd0a, 0x60b7,
495180583Skmacy		0xcd0b, 0xdffd,
496180583Skmacy		0xcd0c, 0x00a,
497180583Skmacy		0xcd0d, 0x1002,
498180583Skmacy		0xcd0e, 0
499180583Skmacy	};
500180583Skmacy	int i, err;
501180583Skmacy
502180583Skmacy	for (err = i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2)
503180583Skmacy		err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i],
504180583Skmacy				 sr_edc[i + 1]);
505180583Skmacy	return err;
506180583Skmacy}
507180583Skmacy
508180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait)
509180583Skmacy{
510180583Skmacy	static struct reg_val regs0[] = {
511180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 },
512180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 },
513180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 },
514180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
515180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 },
516180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 },
517180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 },
518180583Skmacy		{ 0, 0, 0, 0 }
519180583Skmacy	};
520180583Skmacy	static struct reg_val regs1[] = {
521180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 },
522180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a },
523180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 },
524180583Skmacy		{ 0, 0, 0, 0 }
525180583Skmacy	};
526180583Skmacy	static struct reg_val regs2[] = {
527180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 },
528180583Skmacy		{ MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 },
529180583Skmacy		{ 0, 0, 0, 0 }
530180583Skmacy	};
531180583Skmacy
532180583Skmacy	int err;
533180583Skmacy
534180583Skmacy	err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0);
535180583Skmacy	if (err)
536180583Skmacy		return err;
537180583Skmacy
538180583Skmacy	msleep(125);
539180583Skmacy	err = set_phy_regs(phy, regs0);
540180583Skmacy	if (err)
541180583Skmacy		return err;
542180583Skmacy
543180583Skmacy	msleep(50);
544180583Skmacy	err = set_phy_regs(phy, regs1);
545180583Skmacy	if (err)
546180583Skmacy		return err;
547180583Skmacy
548180583Skmacy	msleep(50);
549180583Skmacy	err = ael2005_setup_sr_edc(phy);
550180583Skmacy	if (err)
551180583Skmacy		return err;
552180583Skmacy
553180583Skmacy	return set_phy_regs(phy, regs2);
554180583Skmacy}
555180583Skmacy
556167514Skmacy#ifdef C99_NOT_SUPPORTED
557180583Skmacystatic struct cphy_ops ael2005_ops = {
558180583Skmacy	ael2005_reset,
559180583Skmacy	t3_phy_lasi_intr_enable,
560180583Skmacy	t3_phy_lasi_intr_disable,
561180583Skmacy	t3_phy_lasi_intr_clear,
562180583Skmacy	t3_phy_lasi_intr_handler,
563180583Skmacy	NULL,
564180583Skmacy	NULL,
565180583Skmacy	NULL,
566180583Skmacy	NULL,
567180583Skmacy	NULL,
568180583Skmacy	ael100x_get_link_status,
569180583Skmacy	ael1002_power_down,
570180583Skmacy};
571180583Skmacy#else
572180583Skmacystatic struct cphy_ops ael2005_ops = {
573180583Skmacy	.reset           = ael2005_reset,
574180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
575180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
576180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
577180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
578180583Skmacy	.get_link_status = ael100x_get_link_status,
579180583Skmacy	.power_down      = ael1002_power_down,
580180583Skmacy};
581180583Skmacy#endif
582180583Skmacy
583180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
584180583Skmacy			const struct mdio_ops *mdio_ops)
585180583Skmacy{
586180583Skmacy	cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops,
587180583Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
588180583Skmacy		  "10GBASE-R");
589180583Skmacy	msleep(125);
590180583Skmacy	return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0,
591180583Skmacy				   1 << 5);
592180583Skmacy}
593180583Skmacy
594180583Skmacy#ifdef C99_NOT_SUPPORTED
595167514Skmacystatic struct cphy_ops qt2045_ops = {
596167514Skmacy	ael1006_reset,
597180583Skmacy	t3_phy_lasi_intr_enable,
598180583Skmacy	t3_phy_lasi_intr_disable,
599180583Skmacy	t3_phy_lasi_intr_clear,
600180583Skmacy	t3_phy_lasi_intr_handler,
601167514Skmacy	NULL,
602167514Skmacy	NULL,
603167514Skmacy	NULL,
604167514Skmacy	NULL,
605167514Skmacy	NULL,
606167514Skmacy	ael100x_get_link_status,
607167514Skmacy	ael1006_power_down,
608167514Skmacy};
609167514Skmacy#else
610167514Skmacystatic struct cphy_ops qt2045_ops = {
611167514Skmacy	.reset           = ael1006_reset,
612180583Skmacy	.intr_enable     = t3_phy_lasi_intr_enable,
613180583Skmacy	.intr_disable    = t3_phy_lasi_intr_disable,
614180583Skmacy	.intr_clear      = t3_phy_lasi_intr_clear,
615180583Skmacy	.intr_handler    = t3_phy_lasi_intr_handler,
616167514Skmacy	.get_link_status = ael100x_get_link_status,
617167514Skmacy	.power_down      = ael1006_power_down,
618167514Skmacy};
619167514Skmacy#endif
620167514Skmacy
621176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
622176472Skmacy		       const struct mdio_ops *mdio_ops)
623167514Skmacy{
624167514Skmacy	unsigned int stat;
625167514Skmacy
626176472Skmacy	cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops,
627176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
628176472Skmacy		  "10GBASE-CX4");
629167514Skmacy
630167514Skmacy	/*
631167514Skmacy	 * Some cards where the PHY is supposed to be at address 0 actually
632167514Skmacy	 * have it at 1.
633167514Skmacy	 */
634167514Skmacy	if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
635167514Skmacy	    stat == 0xffff)
636167514Skmacy		phy->addr = 1;
637176472Skmacy	return 0;
638167514Skmacy}
639167514Skmacy
640167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait)
641167514Skmacy{
642167514Skmacy	return 0;
643167514Skmacy}
644167514Skmacy
645167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
646167514Skmacy				       int *speed, int *duplex, int *fc)
647167514Skmacy{
648167514Skmacy	if (link_ok) {
649167514Skmacy		unsigned int status;
650167514Skmacy
651167514Skmacy		status = t3_read_reg(phy->adapter,
652170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
653170654Skmacy			 t3_read_reg(phy->adapter,
654170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
655170654Skmacy			 t3_read_reg(phy->adapter,
656170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
657170654Skmacy			 t3_read_reg(phy->adapter,
658170654Skmacy				     XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
659167514Skmacy		*link_ok = !(status & F_LOWSIG0);
660167514Skmacy	}
661167514Skmacy	if (speed)
662167514Skmacy		*speed = SPEED_10000;
663167514Skmacy	if (duplex)
664167514Skmacy		*duplex = DUPLEX_FULL;
665167514Skmacy	return 0;
666167514Skmacy}
667167514Skmacy
668167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable)
669167514Skmacy{
670167514Skmacy	return 0;
671167514Skmacy}
672167514Skmacy
673167514Skmacy#ifdef C99_NOT_SUPPORTED
674167514Skmacystatic struct cphy_ops xaui_direct_ops = {
675167514Skmacy	xaui_direct_reset,
676167514Skmacy	ael1002_intr_noop,
677167514Skmacy	ael1002_intr_noop,
678167514Skmacy	ael1002_intr_noop,
679167514Skmacy	ael1002_intr_noop,
680167514Skmacy	NULL,
681167514Skmacy	NULL,
682167514Skmacy	NULL,
683167514Skmacy	NULL,
684167514Skmacy	NULL,
685167514Skmacy	xaui_direct_get_link_status,
686167514Skmacy	xaui_direct_power_down,
687167514Skmacy};
688167514Skmacy#else
689167514Skmacystatic struct cphy_ops xaui_direct_ops = {
690167514Skmacy	.reset           = xaui_direct_reset,
691167514Skmacy	.intr_enable     = ael1002_intr_noop,
692167514Skmacy	.intr_disable    = ael1002_intr_noop,
693167514Skmacy	.intr_clear      = ael1002_intr_noop,
694167514Skmacy	.intr_handler    = ael1002_intr_noop,
695167514Skmacy	.get_link_status = xaui_direct_get_link_status,
696167514Skmacy	.power_down      = xaui_direct_power_down,
697167514Skmacy};
698167514Skmacy#endif
699167514Skmacy
700176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
701176472Skmacy			    const struct mdio_ops *mdio_ops)
702167514Skmacy{
703176472Skmacy	cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops,
704176472Skmacy		  SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP,
705176472Skmacy		  "10GBASE-CX4");
706176472Skmacy	return 0;
707167514Skmacy}
708