1 /*
2  * AMD 10Gb Ethernet driver
3  *
4  * This file is available to you under your choice of the following two
5  * licenses:
6  *
7  * License 1: GPLv2
8  *
9  * Copyright (c) 2014 Advanced Micro Devices, Inc.
10  *
11  * This file is free software; you may copy, redistribute and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 2 of the License, or (at
14  * your option) any later version.
15  *
16  * This file is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23  *
24  * This file incorporates work covered by the following copyright and
25  * permission notice:
26  *     The Synopsys DWC ETHER XGMAC Software Driver and documentation
27  *     (hereinafter "Software") is an unsupported proprietary work of Synopsys,
28  *     Inc. unless otherwise expressly agreed to in writing between Synopsys
29  *     and you.
30  *
31  *     The Software IS NOT an item of Licensed Software or Licensed Product
32  *     under any End User Software License Agreement or Agreement for Licensed
33  *     Product with Synopsys or any supplement thereto.  Permission is hereby
34  *     granted, free of charge, to any person obtaining a copy of this software
35  *     annotated with this license and the Software, to deal in the Software
36  *     without restriction, including without limitation the rights to use,
37  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
38  *     of the Software, and to permit persons to whom the Software is furnished
39  *     to do so, subject to the following conditions:
40  *
41  *     The above copyright notice and this permission notice shall be included
42  *     in all copies or substantial portions of the Software.
43  *
44  *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
45  *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
46  *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
47  *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
48  *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
49  *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
50  *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
51  *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
52  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
53  *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
54  *     THE POSSIBILITY OF SUCH DAMAGE.
55  *
56  *
57  * License 2: Modified BSD
58  *
59  * Copyright (c) 2014 Advanced Micro Devices, Inc.
60  * All rights reserved.
61  *
62  * Redistribution and use in source and binary forms, with or without
63  * modification, are permitted provided that the following conditions are met:
64  *     * Redistributions of source code must retain the above copyright
65  *       notice, this list of conditions and the following disclaimer.
66  *     * Redistributions in binary form must reproduce the above copyright
67  *       notice, this list of conditions and the following disclaimer in the
68  *       documentation and/or other materials provided with the distribution.
69  *     * Neither the name of Advanced Micro Devices, Inc. nor the
70  *       names of its contributors may be used to endorse or promote products
71  *       derived from this software without specific prior written permission.
72  *
73  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
74  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
76  * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
77  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
78  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
79  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
80  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
81  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
82  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83  *
84  * This file incorporates work covered by the following copyright and
85  * permission notice:
86  *     The Synopsys DWC ETHER XGMAC Software Driver and documentation
87  *     (hereinafter "Software") is an unsupported proprietary work of Synopsys,
88  *     Inc. unless otherwise expressly agreed to in writing between Synopsys
89  *     and you.
90  *
91  *     The Software IS NOT an item of Licensed Software or Licensed Product
92  *     under any End User Software License Agreement or Agreement for Licensed
93  *     Product with Synopsys or any supplement thereto.  Permission is hereby
94  *     granted, free of charge, to any person obtaining a copy of this software
95  *     annotated with this license and the Software, to deal in the Software
96  *     without restriction, including without limitation the rights to use,
97  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
98  *     of the Software, and to permit persons to whom the Software is furnished
99  *     to do so, subject to the following conditions:
100  *
101  *     The above copyright notice and this permission notice shall be included
102  *     in all copies or substantial portions of the Software.
103  *
104  *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
105  *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
106  *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
107  *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
108  *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
109  *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
110  *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
111  *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
112  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
113  *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
114  *     THE POSSIBILITY OF SUCH DAMAGE.
115  */
116 
117 #include <linux/module.h>
118 #include <linux/kmod.h>
119 #include <linux/mdio.h>
120 #include <linux/phy.h>
121 #include <linux/of.h>
122 #include <linux/bitops.h>
123 #include <linux/jiffies.h>
124 
125 #include "xgbe.h"
126 #include "xgbe-common.h"
127 
128 static void xgbe_an_enable_kr_training(struct xgbe_prv_data *pdata)
129 {
130 	unsigned int reg;
131 
132 	reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
133 
134 	reg |= XGBE_KR_TRAINING_ENABLE;
135 	XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
136 }
137 
138 static void xgbe_an_disable_kr_training(struct xgbe_prv_data *pdata)
139 {
140 	unsigned int reg;
141 
142 	reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
143 
144 	reg &= ~XGBE_KR_TRAINING_ENABLE;
145 	XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
146 }
147 
148 static void xgbe_pcs_power_cycle(struct xgbe_prv_data *pdata)
149 {
150 	unsigned int reg;
151 
152 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
153 
154 	reg |= MDIO_CTRL1_LPOWER;
155 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, reg);
156 
157 	usleep_range(75, 100);
158 
159 	reg &= ~MDIO_CTRL1_LPOWER;
160 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, reg);
161 }
162 
163 static void xgbe_serdes_start_ratechange(struct xgbe_prv_data *pdata)
164 {
165 	/* Assert Rx and Tx ratechange */
166 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, RATECHANGE, 1);
167 }
168 
169 static void xgbe_serdes_complete_ratechange(struct xgbe_prv_data *pdata)
170 {
171 	unsigned int wait;
172 	u16 status;
173 
174 	/* Release Rx and Tx ratechange */
175 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, RATECHANGE, 0);
176 
177 	/* Wait for Rx and Tx ready */
178 	wait = XGBE_RATECHANGE_COUNT;
179 	while (wait--) {
180 		usleep_range(50, 75);
181 
182 		status = XSIR0_IOREAD(pdata, SIR0_STATUS);
183 		if (XSIR_GET_BITS(status, SIR0_STATUS, RX_READY) &&
184 		    XSIR_GET_BITS(status, SIR0_STATUS, TX_READY))
185 			goto rx_reset;
186 	}
187 
188 	netif_dbg(pdata, link, pdata->netdev, "SerDes rx/tx not ready (%#hx)\n",
189 		  status);
190 
191 rx_reset:
192 	/* Perform Rx reset for the DFE changes */
193 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG6, RESETB_RXD, 0);
194 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG6, RESETB_RXD, 1);
195 }
196 
197 static void xgbe_xgmii_mode(struct xgbe_prv_data *pdata)
198 {
199 	unsigned int reg;
200 
201 	/* Enable KR training */
202 	xgbe_an_enable_kr_training(pdata);
203 
204 	/* Set MAC to 10G speed */
205 	pdata->hw_if.set_xgmii_speed(pdata);
206 
207 	/* Set PCS to KR/10G speed */
208 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL2);
209 	reg &= ~MDIO_PCS_CTRL2_TYPE;
210 	reg |= MDIO_PCS_CTRL2_10GBR;
211 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL2, reg);
212 
213 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
214 	reg &= ~MDIO_CTRL1_SPEEDSEL;
215 	reg |= MDIO_CTRL1_SPEED10G;
216 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, reg);
217 
218 	xgbe_pcs_power_cycle(pdata);
219 
220 	/* Set SerDes to 10G speed */
221 	xgbe_serdes_start_ratechange(pdata);
222 
223 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, DATARATE, XGBE_SPEED_10000_RATE);
224 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, WORDMODE, XGBE_SPEED_10000_WORD);
225 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, PLLSEL, XGBE_SPEED_10000_PLL);
226 
227 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, CDR_RATE,
228 			   pdata->serdes_cdr_rate[XGBE_SPEED_10000]);
229 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, TXAMP,
230 			   pdata->serdes_tx_amp[XGBE_SPEED_10000]);
231 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG20, BLWC_ENA,
232 			   pdata->serdes_blwc[XGBE_SPEED_10000]);
233 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG114, PQ_REG,
234 			   pdata->serdes_pq_skew[XGBE_SPEED_10000]);
235 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG129, RXDFE_CONFIG,
236 			   pdata->serdes_dfe_tap_cfg[XGBE_SPEED_10000]);
237 	XRXTX_IOWRITE(pdata, RXTX_REG22,
238 		      pdata->serdes_dfe_tap_ena[XGBE_SPEED_10000]);
239 
240 	xgbe_serdes_complete_ratechange(pdata);
241 
242 	netif_dbg(pdata, link, pdata->netdev, "10GbE KR mode set\n");
243 }
244 
245 static void xgbe_gmii_2500_mode(struct xgbe_prv_data *pdata)
246 {
247 	unsigned int reg;
248 
249 	/* Disable KR training */
250 	xgbe_an_disable_kr_training(pdata);
251 
252 	/* Set MAC to 2.5G speed */
253 	pdata->hw_if.set_gmii_2500_speed(pdata);
254 
255 	/* Set PCS to KX/1G speed */
256 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL2);
257 	reg &= ~MDIO_PCS_CTRL2_TYPE;
258 	reg |= MDIO_PCS_CTRL2_10GBX;
259 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL2, reg);
260 
261 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
262 	reg &= ~MDIO_CTRL1_SPEEDSEL;
263 	reg |= MDIO_CTRL1_SPEED1G;
264 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, reg);
265 
266 	xgbe_pcs_power_cycle(pdata);
267 
268 	/* Set SerDes to 2.5G speed */
269 	xgbe_serdes_start_ratechange(pdata);
270 
271 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, DATARATE, XGBE_SPEED_2500_RATE);
272 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, WORDMODE, XGBE_SPEED_2500_WORD);
273 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, PLLSEL, XGBE_SPEED_2500_PLL);
274 
275 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, CDR_RATE,
276 			   pdata->serdes_cdr_rate[XGBE_SPEED_2500]);
277 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, TXAMP,
278 			   pdata->serdes_tx_amp[XGBE_SPEED_2500]);
279 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG20, BLWC_ENA,
280 			   pdata->serdes_blwc[XGBE_SPEED_2500]);
281 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG114, PQ_REG,
282 			   pdata->serdes_pq_skew[XGBE_SPEED_2500]);
283 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG129, RXDFE_CONFIG,
284 			   pdata->serdes_dfe_tap_cfg[XGBE_SPEED_2500]);
285 	XRXTX_IOWRITE(pdata, RXTX_REG22,
286 		      pdata->serdes_dfe_tap_ena[XGBE_SPEED_2500]);
287 
288 	xgbe_serdes_complete_ratechange(pdata);
289 
290 	netif_dbg(pdata, link, pdata->netdev, "2.5GbE KX mode set\n");
291 }
292 
293 static void xgbe_gmii_mode(struct xgbe_prv_data *pdata)
294 {
295 	unsigned int reg;
296 
297 	/* Disable KR training */
298 	xgbe_an_disable_kr_training(pdata);
299 
300 	/* Set MAC to 1G speed */
301 	pdata->hw_if.set_gmii_speed(pdata);
302 
303 	/* Set PCS to KX/1G speed */
304 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL2);
305 	reg &= ~MDIO_PCS_CTRL2_TYPE;
306 	reg |= MDIO_PCS_CTRL2_10GBX;
307 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL2, reg);
308 
309 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
310 	reg &= ~MDIO_CTRL1_SPEEDSEL;
311 	reg |= MDIO_CTRL1_SPEED1G;
312 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, reg);
313 
314 	xgbe_pcs_power_cycle(pdata);
315 
316 	/* Set SerDes to 1G speed */
317 	xgbe_serdes_start_ratechange(pdata);
318 
319 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, DATARATE, XGBE_SPEED_1000_RATE);
320 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, WORDMODE, XGBE_SPEED_1000_WORD);
321 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, PLLSEL, XGBE_SPEED_1000_PLL);
322 
323 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, CDR_RATE,
324 			   pdata->serdes_cdr_rate[XGBE_SPEED_1000]);
325 	XSIR1_IOWRITE_BITS(pdata, SIR1_SPEED, TXAMP,
326 			   pdata->serdes_tx_amp[XGBE_SPEED_1000]);
327 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG20, BLWC_ENA,
328 			   pdata->serdes_blwc[XGBE_SPEED_1000]);
329 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG114, PQ_REG,
330 			   pdata->serdes_pq_skew[XGBE_SPEED_1000]);
331 	XRXTX_IOWRITE_BITS(pdata, RXTX_REG129, RXDFE_CONFIG,
332 			   pdata->serdes_dfe_tap_cfg[XGBE_SPEED_1000]);
333 	XRXTX_IOWRITE(pdata, RXTX_REG22,
334 		      pdata->serdes_dfe_tap_ena[XGBE_SPEED_1000]);
335 
336 	xgbe_serdes_complete_ratechange(pdata);
337 
338 	netif_dbg(pdata, link, pdata->netdev, "1GbE KX mode set\n");
339 }
340 
341 static void xgbe_cur_mode(struct xgbe_prv_data *pdata,
342 			  enum xgbe_mode *mode)
343 {
344 	unsigned int reg;
345 
346 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL2);
347 	if ((reg & MDIO_PCS_CTRL2_TYPE) == MDIO_PCS_CTRL2_10GBR)
348 		*mode = XGBE_MODE_KR;
349 	else
350 		*mode = XGBE_MODE_KX;
351 }
352 
353 static bool xgbe_in_kr_mode(struct xgbe_prv_data *pdata)
354 {
355 	enum xgbe_mode mode;
356 
357 	xgbe_cur_mode(pdata, &mode);
358 
359 	return (mode == XGBE_MODE_KR);
360 }
361 
362 static void xgbe_switch_mode(struct xgbe_prv_data *pdata)
363 {
364 	/* If we are in KR switch to KX, and vice-versa */
365 	if (xgbe_in_kr_mode(pdata)) {
366 		if (pdata->speed_set == XGBE_SPEEDSET_1000_10000)
367 			xgbe_gmii_mode(pdata);
368 		else
369 			xgbe_gmii_2500_mode(pdata);
370 	} else {
371 		xgbe_xgmii_mode(pdata);
372 	}
373 }
374 
375 static void xgbe_set_mode(struct xgbe_prv_data *pdata,
376 			  enum xgbe_mode mode)
377 {
378 	enum xgbe_mode cur_mode;
379 
380 	xgbe_cur_mode(pdata, &cur_mode);
381 	if (mode != cur_mode)
382 		xgbe_switch_mode(pdata);
383 }
384 
385 static bool xgbe_use_xgmii_mode(struct xgbe_prv_data *pdata)
386 {
387 	if (pdata->phy.autoneg == AUTONEG_ENABLE) {
388 		if (pdata->phy.advertising & ADVERTISED_10000baseKR_Full)
389 			return true;
390 	} else {
391 		if (pdata->phy.speed == SPEED_10000)
392 			return true;
393 	}
394 
395 	return false;
396 }
397 
398 static bool xgbe_use_gmii_2500_mode(struct xgbe_prv_data *pdata)
399 {
400 	if (pdata->phy.autoneg == AUTONEG_ENABLE) {
401 		if (pdata->phy.advertising & ADVERTISED_2500baseX_Full)
402 			return true;
403 	} else {
404 		if (pdata->phy.speed == SPEED_2500)
405 			return true;
406 	}
407 
408 	return false;
409 }
410 
411 static bool xgbe_use_gmii_mode(struct xgbe_prv_data *pdata)
412 {
413 	if (pdata->phy.autoneg == AUTONEG_ENABLE) {
414 		if (pdata->phy.advertising & ADVERTISED_1000baseKX_Full)
415 			return true;
416 	} else {
417 		if (pdata->phy.speed == SPEED_1000)
418 			return true;
419 	}
420 
421 	return false;
422 }
423 
424 static void xgbe_set_an(struct xgbe_prv_data *pdata, bool enable, bool restart)
425 {
426 	unsigned int reg;
427 
428 	reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1);
429 	reg &= ~MDIO_AN_CTRL1_ENABLE;
430 
431 	if (enable)
432 		reg |= MDIO_AN_CTRL1_ENABLE;
433 
434 	if (restart)
435 		reg |= MDIO_AN_CTRL1_RESTART;
436 
437 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_CTRL1, reg);
438 }
439 
440 static void xgbe_restart_an(struct xgbe_prv_data *pdata)
441 {
442 	xgbe_set_an(pdata, true, true);
443 
444 	netif_dbg(pdata, link, pdata->netdev, "AN enabled/restarted\n");
445 }
446 
447 static void xgbe_disable_an(struct xgbe_prv_data *pdata)
448 {
449 	xgbe_set_an(pdata, false, false);
450 
451 	netif_dbg(pdata, link, pdata->netdev, "AN disabled\n");
452 }
453 
454 static enum xgbe_an xgbe_an_tx_training(struct xgbe_prv_data *pdata,
455 					enum xgbe_rx *state)
456 {
457 	unsigned int ad_reg, lp_reg, reg;
458 
459 	*state = XGBE_RX_COMPLETE;
460 
461 	/* If we're not in KR mode then we're done */
462 	if (!xgbe_in_kr_mode(pdata))
463 		return XGBE_AN_PAGE_RECEIVED;
464 
465 	/* Enable/Disable FEC */
466 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
467 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
468 
469 	reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL);
470 	reg &= ~(MDIO_PMA_10GBR_FECABLE_ABLE | MDIO_PMA_10GBR_FECABLE_ERRABLE);
471 	if ((ad_reg & 0xc000) && (lp_reg & 0xc000))
472 		reg |= pdata->fec_ability;
473 
474 	XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL, reg);
475 
476 	/* Start KR training */
477 	reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
478 	if (reg & XGBE_KR_TRAINING_ENABLE) {
479 		XSIR0_IOWRITE_BITS(pdata, SIR0_KR_RT_1, RESET, 1);
480 
481 		reg |= XGBE_KR_TRAINING_START;
482 		XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL,
483 			    reg);
484 
485 		XSIR0_IOWRITE_BITS(pdata, SIR0_KR_RT_1, RESET, 0);
486 
487 		netif_dbg(pdata, link, pdata->netdev,
488 			  "KR training initiated\n");
489 	}
490 
491 	return XGBE_AN_PAGE_RECEIVED;
492 }
493 
494 static enum xgbe_an xgbe_an_tx_xnp(struct xgbe_prv_data *pdata,
495 				   enum xgbe_rx *state)
496 {
497 	u16 msg;
498 
499 	*state = XGBE_RX_XNP;
500 
501 	msg = XGBE_XNP_MCF_NULL_MESSAGE;
502 	msg |= XGBE_XNP_MP_FORMATTED;
503 
504 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP + 2, 0);
505 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP + 1, 0);
506 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP, msg);
507 
508 	return XGBE_AN_PAGE_RECEIVED;
509 }
510 
511 static enum xgbe_an xgbe_an_rx_bpa(struct xgbe_prv_data *pdata,
512 				   enum xgbe_rx *state)
513 {
514 	unsigned int link_support;
515 	unsigned int reg, ad_reg, lp_reg;
516 
517 	/* Read Base Ability register 2 first */
518 	reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
519 
520 	/* Check for a supported mode, otherwise restart in a different one */
521 	link_support = xgbe_in_kr_mode(pdata) ? 0x80 : 0x20;
522 	if (!(reg & link_support))
523 		return XGBE_AN_INCOMPAT_LINK;
524 
525 	/* Check Extended Next Page support */
526 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
527 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
528 
529 	return ((ad_reg & XGBE_XNP_NP_EXCHANGE) ||
530 		(lp_reg & XGBE_XNP_NP_EXCHANGE))
531 	       ? xgbe_an_tx_xnp(pdata, state)
532 	       : xgbe_an_tx_training(pdata, state);
533 }
534 
535 static enum xgbe_an xgbe_an_rx_xnp(struct xgbe_prv_data *pdata,
536 				   enum xgbe_rx *state)
537 {
538 	unsigned int ad_reg, lp_reg;
539 
540 	/* Check Extended Next Page support */
541 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_XNP);
542 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPX);
543 
544 	return ((ad_reg & XGBE_XNP_NP_EXCHANGE) ||
545 		(lp_reg & XGBE_XNP_NP_EXCHANGE))
546 	       ? xgbe_an_tx_xnp(pdata, state)
547 	       : xgbe_an_tx_training(pdata, state);
548 }
549 
550 static enum xgbe_an xgbe_an_page_received(struct xgbe_prv_data *pdata)
551 {
552 	enum xgbe_rx *state;
553 	unsigned long an_timeout;
554 	enum xgbe_an ret;
555 
556 	if (!pdata->an_start) {
557 		pdata->an_start = jiffies;
558 	} else {
559 		an_timeout = pdata->an_start +
560 			     msecs_to_jiffies(XGBE_AN_MS_TIMEOUT);
561 		if (time_after(jiffies, an_timeout)) {
562 			/* Auto-negotiation timed out, reset state */
563 			pdata->kr_state = XGBE_RX_BPA;
564 			pdata->kx_state = XGBE_RX_BPA;
565 
566 			pdata->an_start = jiffies;
567 
568 			netif_dbg(pdata, link, pdata->netdev,
569 				  "AN timed out, resetting state\n");
570 		}
571 	}
572 
573 	state = xgbe_in_kr_mode(pdata) ? &pdata->kr_state
574 					   : &pdata->kx_state;
575 
576 	switch (*state) {
577 	case XGBE_RX_BPA:
578 		ret = xgbe_an_rx_bpa(pdata, state);
579 		break;
580 
581 	case XGBE_RX_XNP:
582 		ret = xgbe_an_rx_xnp(pdata, state);
583 		break;
584 
585 	default:
586 		ret = XGBE_AN_ERROR;
587 	}
588 
589 	return ret;
590 }
591 
592 static enum xgbe_an xgbe_an_incompat_link(struct xgbe_prv_data *pdata)
593 {
594 	/* Be sure we aren't looping trying to negotiate */
595 	if (xgbe_in_kr_mode(pdata)) {
596 		pdata->kr_state = XGBE_RX_ERROR;
597 
598 		if (!(pdata->phy.advertising & ADVERTISED_1000baseKX_Full) &&
599 		    !(pdata->phy.advertising & ADVERTISED_2500baseX_Full))
600 			return XGBE_AN_NO_LINK;
601 
602 		if (pdata->kx_state != XGBE_RX_BPA)
603 			return XGBE_AN_NO_LINK;
604 	} else {
605 		pdata->kx_state = XGBE_RX_ERROR;
606 
607 		if (!(pdata->phy.advertising & ADVERTISED_10000baseKR_Full))
608 			return XGBE_AN_NO_LINK;
609 
610 		if (pdata->kr_state != XGBE_RX_BPA)
611 			return XGBE_AN_NO_LINK;
612 	}
613 
614 	xgbe_disable_an(pdata);
615 
616 	xgbe_switch_mode(pdata);
617 
618 	xgbe_restart_an(pdata);
619 
620 	return XGBE_AN_INCOMPAT_LINK;
621 }
622 
623 static irqreturn_t xgbe_an_isr(int irq, void *data)
624 {
625 	struct xgbe_prv_data *pdata = (struct xgbe_prv_data *)data;
626 
627 	netif_dbg(pdata, intr, pdata->netdev, "AN interrupt received\n");
628 
629 	/* Interrupt reason must be read and cleared outside of IRQ context */
630 	disable_irq_nosync(pdata->an_irq);
631 
632 	queue_work(pdata->an_workqueue, &pdata->an_irq_work);
633 
634 	return IRQ_HANDLED;
635 }
636 
637 static void xgbe_an_irq_work(struct work_struct *work)
638 {
639 	struct xgbe_prv_data *pdata = container_of(work,
640 						   struct xgbe_prv_data,
641 						   an_irq_work);
642 
643 	/* Avoid a race between enabling the IRQ and exiting the work by
644 	 * waiting for the work to finish and then queueing it
645 	 */
646 	flush_work(&pdata->an_work);
647 	queue_work(pdata->an_workqueue, &pdata->an_work);
648 }
649 
650 static const char *xgbe_state_as_string(enum xgbe_an state)
651 {
652 	switch (state) {
653 	case XGBE_AN_READY:
654 		return "Ready";
655 	case XGBE_AN_PAGE_RECEIVED:
656 		return "Page-Received";
657 	case XGBE_AN_INCOMPAT_LINK:
658 		return "Incompatible-Link";
659 	case XGBE_AN_COMPLETE:
660 		return "Complete";
661 	case XGBE_AN_NO_LINK:
662 		return "No-Link";
663 	case XGBE_AN_ERROR:
664 		return "Error";
665 	default:
666 		return "Undefined";
667 	}
668 }
669 
670 static void xgbe_an_state_machine(struct work_struct *work)
671 {
672 	struct xgbe_prv_data *pdata = container_of(work,
673 						   struct xgbe_prv_data,
674 						   an_work);
675 	enum xgbe_an cur_state = pdata->an_state;
676 	unsigned int int_reg, int_mask;
677 
678 	mutex_lock(&pdata->an_mutex);
679 
680 	/* Read the interrupt */
681 	int_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_INT);
682 	if (!int_reg)
683 		goto out;
684 
685 next_int:
686 	if (int_reg & XGBE_AN_PG_RCV) {
687 		pdata->an_state = XGBE_AN_PAGE_RECEIVED;
688 		int_mask = XGBE_AN_PG_RCV;
689 	} else if (int_reg & XGBE_AN_INC_LINK) {
690 		pdata->an_state = XGBE_AN_INCOMPAT_LINK;
691 		int_mask = XGBE_AN_INC_LINK;
692 	} else if (int_reg & XGBE_AN_INT_CMPLT) {
693 		pdata->an_state = XGBE_AN_COMPLETE;
694 		int_mask = XGBE_AN_INT_CMPLT;
695 	} else {
696 		pdata->an_state = XGBE_AN_ERROR;
697 		int_mask = 0;
698 	}
699 
700 	/* Clear the interrupt to be processed */
701 	int_reg &= ~int_mask;
702 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, int_reg);
703 
704 	pdata->an_result = pdata->an_state;
705 
706 again:
707 	netif_dbg(pdata, link, pdata->netdev, "AN %s\n",
708 		  xgbe_state_as_string(pdata->an_state));
709 
710 	cur_state = pdata->an_state;
711 
712 	switch (pdata->an_state) {
713 	case XGBE_AN_READY:
714 		pdata->an_supported = 0;
715 		break;
716 
717 	case XGBE_AN_PAGE_RECEIVED:
718 		pdata->an_state = xgbe_an_page_received(pdata);
719 		pdata->an_supported++;
720 		break;
721 
722 	case XGBE_AN_INCOMPAT_LINK:
723 		pdata->an_supported = 0;
724 		pdata->parallel_detect = 0;
725 		pdata->an_state = xgbe_an_incompat_link(pdata);
726 		break;
727 
728 	case XGBE_AN_COMPLETE:
729 		pdata->parallel_detect = pdata->an_supported ? 0 : 1;
730 		netif_dbg(pdata, link, pdata->netdev, "%s successful\n",
731 			  pdata->an_supported ? "Auto negotiation"
732 					      : "Parallel detection");
733 		break;
734 
735 	case XGBE_AN_NO_LINK:
736 		break;
737 
738 	default:
739 		pdata->an_state = XGBE_AN_ERROR;
740 	}
741 
742 	if (pdata->an_state == XGBE_AN_NO_LINK) {
743 		int_reg = 0;
744 		XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0);
745 	} else if (pdata->an_state == XGBE_AN_ERROR) {
746 		netdev_err(pdata->netdev,
747 			   "error during auto-negotiation, state=%u\n",
748 			   cur_state);
749 
750 		int_reg = 0;
751 		XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0);
752 	}
753 
754 	if (pdata->an_state >= XGBE_AN_COMPLETE) {
755 		pdata->an_result = pdata->an_state;
756 		pdata->an_state = XGBE_AN_READY;
757 		pdata->kr_state = XGBE_RX_BPA;
758 		pdata->kx_state = XGBE_RX_BPA;
759 		pdata->an_start = 0;
760 
761 		netif_dbg(pdata, link, pdata->netdev, "AN result: %s\n",
762 			  xgbe_state_as_string(pdata->an_result));
763 	}
764 
765 	if (cur_state != pdata->an_state)
766 		goto again;
767 
768 	if (int_reg)
769 		goto next_int;
770 
771 out:
772 	enable_irq(pdata->an_irq);
773 
774 	mutex_unlock(&pdata->an_mutex);
775 }
776 
777 static void xgbe_an_init(struct xgbe_prv_data *pdata)
778 {
779 	unsigned int reg;
780 
781 	/* Set up Advertisement register 3 first */
782 	reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
783 	if (pdata->phy.advertising & ADVERTISED_10000baseR_FEC)
784 		reg |= 0xc000;
785 	else
786 		reg &= ~0xc000;
787 
788 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2, reg);
789 
790 	/* Set up Advertisement register 2 next */
791 	reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
792 	if (pdata->phy.advertising & ADVERTISED_10000baseKR_Full)
793 		reg |= 0x80;
794 	else
795 		reg &= ~0x80;
796 
797 	if ((pdata->phy.advertising & ADVERTISED_1000baseKX_Full) ||
798 	    (pdata->phy.advertising & ADVERTISED_2500baseX_Full))
799 		reg |= 0x20;
800 	else
801 		reg &= ~0x20;
802 
803 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1, reg);
804 
805 	/* Set up Advertisement register 1 last */
806 	reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
807 	if (pdata->phy.advertising & ADVERTISED_Pause)
808 		reg |= 0x400;
809 	else
810 		reg &= ~0x400;
811 
812 	if (pdata->phy.advertising & ADVERTISED_Asym_Pause)
813 		reg |= 0x800;
814 	else
815 		reg &= ~0x800;
816 
817 	/* We don't intend to perform XNP */
818 	reg &= ~XGBE_XNP_NP_EXCHANGE;
819 
820 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE, reg);
821 
822 	netif_dbg(pdata, link, pdata->netdev, "AN initialized\n");
823 }
824 
825 static const char *xgbe_phy_fc_string(struct xgbe_prv_data *pdata)
826 {
827 	if (pdata->tx_pause && pdata->rx_pause)
828 		return "rx/tx";
829 	else if (pdata->rx_pause)
830 		return "rx";
831 	else if (pdata->tx_pause)
832 		return "tx";
833 	else
834 		return "off";
835 }
836 
837 static const char *xgbe_phy_speed_string(int speed)
838 {
839 	switch (speed) {
840 	case SPEED_1000:
841 		return "1Gbps";
842 	case SPEED_2500:
843 		return "2.5Gbps";
844 	case SPEED_10000:
845 		return "10Gbps";
846 	case SPEED_UNKNOWN:
847 		return "Unknown";
848 	default:
849 		return "Unsupported";
850 	}
851 }
852 
853 static void xgbe_phy_print_status(struct xgbe_prv_data *pdata)
854 {
855 	if (pdata->phy.link)
856 		netdev_info(pdata->netdev,
857 			    "Link is Up - %s/%s - flow control %s\n",
858 			    xgbe_phy_speed_string(pdata->phy.speed),
859 			    pdata->phy.duplex == DUPLEX_FULL ? "Full" : "Half",
860 			    xgbe_phy_fc_string(pdata));
861 	else
862 		netdev_info(pdata->netdev, "Link is Down\n");
863 }
864 
865 static void xgbe_phy_adjust_link(struct xgbe_prv_data *pdata)
866 {
867 	int new_state = 0;
868 
869 	if (pdata->phy.link) {
870 		/* Flow control support */
871 		pdata->pause_autoneg = pdata->phy.pause_autoneg;
872 
873 		if (pdata->tx_pause != pdata->phy.tx_pause) {
874 			new_state = 1;
875 			pdata->hw_if.config_tx_flow_control(pdata);
876 			pdata->tx_pause = pdata->phy.tx_pause;
877 		}
878 
879 		if (pdata->rx_pause != pdata->phy.rx_pause) {
880 			new_state = 1;
881 			pdata->hw_if.config_rx_flow_control(pdata);
882 			pdata->rx_pause = pdata->phy.rx_pause;
883 		}
884 
885 		/* Speed support */
886 		if (pdata->phy_speed != pdata->phy.speed) {
887 			new_state = 1;
888 			pdata->phy_speed = pdata->phy.speed;
889 		}
890 
891 		if (pdata->phy_link != pdata->phy.link) {
892 			new_state = 1;
893 			pdata->phy_link = pdata->phy.link;
894 		}
895 	} else if (pdata->phy_link) {
896 		new_state = 1;
897 		pdata->phy_link = 0;
898 		pdata->phy_speed = SPEED_UNKNOWN;
899 	}
900 
901 	if (new_state && netif_msg_link(pdata))
902 		xgbe_phy_print_status(pdata);
903 }
904 
905 static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata)
906 {
907 	netif_dbg(pdata, link, pdata->netdev, "fixed PHY configuration\n");
908 
909 	/* Disable auto-negotiation */
910 	xgbe_disable_an(pdata);
911 
912 	/* Validate/Set specified speed */
913 	switch (pdata->phy.speed) {
914 	case SPEED_10000:
915 		xgbe_set_mode(pdata, XGBE_MODE_KR);
916 		break;
917 
918 	case SPEED_2500:
919 	case SPEED_1000:
920 		xgbe_set_mode(pdata, XGBE_MODE_KX);
921 		break;
922 
923 	default:
924 		return -EINVAL;
925 	}
926 
927 	/* Validate duplex mode */
928 	if (pdata->phy.duplex != DUPLEX_FULL)
929 		return -EINVAL;
930 
931 	return 0;
932 }
933 
934 static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata)
935 {
936 	set_bit(XGBE_LINK_INIT, &pdata->dev_state);
937 	pdata->link_check = jiffies;
938 
939 	if (pdata->phy.autoneg != AUTONEG_ENABLE)
940 		return xgbe_phy_config_fixed(pdata);
941 
942 	netif_dbg(pdata, link, pdata->netdev, "AN PHY configuration\n");
943 
944 	/* Disable auto-negotiation interrupt */
945 	disable_irq(pdata->an_irq);
946 
947 	/* Start auto-negotiation in a supported mode */
948 	if (pdata->phy.advertising & ADVERTISED_10000baseKR_Full) {
949 		xgbe_set_mode(pdata, XGBE_MODE_KR);
950 	} else if ((pdata->phy.advertising & ADVERTISED_1000baseKX_Full) ||
951 		   (pdata->phy.advertising & ADVERTISED_2500baseX_Full)) {
952 		xgbe_set_mode(pdata, XGBE_MODE_KX);
953 	} else {
954 		enable_irq(pdata->an_irq);
955 		return -EINVAL;
956 	}
957 
958 	/* Disable and stop any in progress auto-negotiation */
959 	xgbe_disable_an(pdata);
960 
961 	/* Clear any auto-negotitation interrupts */
962 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0);
963 
964 	pdata->an_result = XGBE_AN_READY;
965 	pdata->an_state = XGBE_AN_READY;
966 	pdata->kr_state = XGBE_RX_BPA;
967 	pdata->kx_state = XGBE_RX_BPA;
968 
969 	/* Re-enable auto-negotiation interrupt */
970 	enable_irq(pdata->an_irq);
971 
972 	/* Set up advertisement registers based on current settings */
973 	xgbe_an_init(pdata);
974 
975 	/* Enable and start auto-negotiation */
976 	xgbe_restart_an(pdata);
977 
978 	return 0;
979 }
980 
981 static int xgbe_phy_config_aneg(struct xgbe_prv_data *pdata)
982 {
983 	int ret;
984 
985 	mutex_lock(&pdata->an_mutex);
986 
987 	ret = __xgbe_phy_config_aneg(pdata);
988 	if (ret)
989 		set_bit(XGBE_LINK_ERR, &pdata->dev_state);
990 	else
991 		clear_bit(XGBE_LINK_ERR, &pdata->dev_state);
992 
993 	mutex_unlock(&pdata->an_mutex);
994 
995 	return ret;
996 }
997 
998 static bool xgbe_phy_aneg_done(struct xgbe_prv_data *pdata)
999 {
1000 	return (pdata->an_result == XGBE_AN_COMPLETE);
1001 }
1002 
1003 static void xgbe_check_link_timeout(struct xgbe_prv_data *pdata)
1004 {
1005 	unsigned long link_timeout;
1006 
1007 	link_timeout = pdata->link_check + (XGBE_LINK_TIMEOUT * HZ);
1008 	if (time_after(jiffies, link_timeout)) {
1009 		netif_dbg(pdata, link, pdata->netdev, "AN link timeout\n");
1010 		xgbe_phy_config_aneg(pdata);
1011 	}
1012 }
1013 
1014 static void xgbe_phy_status_force(struct xgbe_prv_data *pdata)
1015 {
1016 	if (xgbe_in_kr_mode(pdata)) {
1017 		pdata->phy.speed = SPEED_10000;
1018 	} else {
1019 		switch (pdata->speed_set) {
1020 		case XGBE_SPEEDSET_1000_10000:
1021 			pdata->phy.speed = SPEED_1000;
1022 			break;
1023 
1024 		case XGBE_SPEEDSET_2500_10000:
1025 			pdata->phy.speed = SPEED_2500;
1026 			break;
1027 		}
1028 	}
1029 	pdata->phy.duplex = DUPLEX_FULL;
1030 }
1031 
1032 static void xgbe_phy_status_aneg(struct xgbe_prv_data *pdata)
1033 {
1034 	unsigned int ad_reg, lp_reg;
1035 
1036 	pdata->phy.lp_advertising = 0;
1037 
1038 	if ((pdata->phy.autoneg != AUTONEG_ENABLE) || pdata->parallel_detect)
1039 		return xgbe_phy_status_force(pdata);
1040 
1041 	pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1042 	pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1043 
1044 	/* Compare Advertisement and Link Partner register 1 */
1045 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1046 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
1047 	if (lp_reg & 0x400)
1048 		pdata->phy.lp_advertising |= ADVERTISED_Pause;
1049 	if (lp_reg & 0x800)
1050 		pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1051 
1052 	if (pdata->phy.pause_autoneg) {
1053 		/* Set flow control based on auto-negotiation result */
1054 		pdata->phy.tx_pause = 0;
1055 		pdata->phy.rx_pause = 0;
1056 
1057 		if (ad_reg & lp_reg & 0x400) {
1058 			pdata->phy.tx_pause = 1;
1059 			pdata->phy.rx_pause = 1;
1060 		} else if (ad_reg & lp_reg & 0x800) {
1061 			if (ad_reg & 0x400)
1062 				pdata->phy.rx_pause = 1;
1063 			else if (lp_reg & 0x400)
1064 				pdata->phy.tx_pause = 1;
1065 		}
1066 	}
1067 
1068 	/* Compare Advertisement and Link Partner register 2 */
1069 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1070 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1071 	if (lp_reg & 0x80)
1072 		pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1073 	if (lp_reg & 0x20) {
1074 		switch (pdata->speed_set) {
1075 		case XGBE_SPEEDSET_1000_10000:
1076 			pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1077 			break;
1078 		case XGBE_SPEEDSET_2500_10000:
1079 			pdata->phy.lp_advertising |= ADVERTISED_2500baseX_Full;
1080 			break;
1081 		}
1082 	}
1083 
1084 	ad_reg &= lp_reg;
1085 	if (ad_reg & 0x80) {
1086 		pdata->phy.speed = SPEED_10000;
1087 		xgbe_set_mode(pdata, XGBE_MODE_KR);
1088 	} else if (ad_reg & 0x20) {
1089 		switch (pdata->speed_set) {
1090 		case XGBE_SPEEDSET_1000_10000:
1091 			pdata->phy.speed = SPEED_1000;
1092 			break;
1093 
1094 		case XGBE_SPEEDSET_2500_10000:
1095 			pdata->phy.speed = SPEED_2500;
1096 			break;
1097 		}
1098 
1099 		xgbe_set_mode(pdata, XGBE_MODE_KX);
1100 	} else {
1101 		pdata->phy.speed = SPEED_UNKNOWN;
1102 	}
1103 
1104 	/* Compare Advertisement and Link Partner register 3 */
1105 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1106 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1107 	if (lp_reg & 0xc000)
1108 		pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1109 
1110 	pdata->phy.duplex = DUPLEX_FULL;
1111 }
1112 
1113 static void xgbe_phy_status(struct xgbe_prv_data *pdata)
1114 {
1115 	unsigned int reg, link_aneg;
1116 
1117 	if (test_bit(XGBE_LINK_ERR, &pdata->dev_state)) {
1118 		netif_carrier_off(pdata->netdev);
1119 
1120 		pdata->phy.link = 0;
1121 		goto adjust_link;
1122 	}
1123 
1124 	link_aneg = (pdata->phy.autoneg == AUTONEG_ENABLE);
1125 
1126 	/* Get the link status. Link status is latched low, so read
1127 	 * once to clear and then read again to get current state
1128 	 */
1129 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1130 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1131 	pdata->phy.link = (reg & MDIO_STAT1_LSTATUS) ? 1 : 0;
1132 
1133 	if (pdata->phy.link) {
1134 		if (link_aneg && !xgbe_phy_aneg_done(pdata)) {
1135 			xgbe_check_link_timeout(pdata);
1136 			return;
1137 		}
1138 
1139 		xgbe_phy_status_aneg(pdata);
1140 
1141 		if (test_bit(XGBE_LINK_INIT, &pdata->dev_state))
1142 			clear_bit(XGBE_LINK_INIT, &pdata->dev_state);
1143 
1144 		netif_carrier_on(pdata->netdev);
1145 	} else {
1146 		if (test_bit(XGBE_LINK_INIT, &pdata->dev_state)) {
1147 			xgbe_check_link_timeout(pdata);
1148 
1149 			if (link_aneg)
1150 				return;
1151 		}
1152 
1153 		xgbe_phy_status_aneg(pdata);
1154 
1155 		netif_carrier_off(pdata->netdev);
1156 	}
1157 
1158 adjust_link:
1159 	xgbe_phy_adjust_link(pdata);
1160 }
1161 
1162 static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
1163 {
1164 	netif_dbg(pdata, link, pdata->netdev, "stopping PHY\n");
1165 
1166 	/* Disable auto-negotiation */
1167 	xgbe_disable_an(pdata);
1168 
1169 	/* Disable auto-negotiation interrupts */
1170 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, 0);
1171 
1172 	devm_free_irq(pdata->dev, pdata->an_irq, pdata);
1173 
1174 	pdata->phy.link = 0;
1175 	netif_carrier_off(pdata->netdev);
1176 
1177 	xgbe_phy_adjust_link(pdata);
1178 }
1179 
1180 static int xgbe_phy_start(struct xgbe_prv_data *pdata)
1181 {
1182 	struct net_device *netdev = pdata->netdev;
1183 	int ret;
1184 
1185 	netif_dbg(pdata, link, pdata->netdev, "starting PHY\n");
1186 
1187 	ret = devm_request_irq(pdata->dev, pdata->an_irq,
1188 			       xgbe_an_isr, 0, pdata->an_name,
1189 			       pdata);
1190 	if (ret) {
1191 		netdev_err(netdev, "phy irq request failed\n");
1192 		return ret;
1193 	}
1194 
1195 	/* Set initial mode - call the mode setting routines
1196 	 * directly to insure we are properly configured
1197 	 */
1198 	if (xgbe_use_xgmii_mode(pdata)) {
1199 		xgbe_xgmii_mode(pdata);
1200 	} else if (xgbe_use_gmii_mode(pdata)) {
1201 		xgbe_gmii_mode(pdata);
1202 	} else if (xgbe_use_gmii_2500_mode(pdata)) {
1203 		xgbe_gmii_2500_mode(pdata);
1204 	} else {
1205 		ret = -EINVAL;
1206 		goto err_irq;
1207 	}
1208 
1209 	/* Set up advertisement registers based on current settings */
1210 	xgbe_an_init(pdata);
1211 
1212 	/* Enable auto-negotiation interrupts */
1213 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, 0x07);
1214 
1215 	return xgbe_phy_config_aneg(pdata);
1216 
1217 err_irq:
1218 	devm_free_irq(pdata->dev, pdata->an_irq, pdata);
1219 
1220 	return ret;
1221 }
1222 
1223 static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
1224 {
1225 	unsigned int count, reg;
1226 
1227 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
1228 	reg |= MDIO_CTRL1_RESET;
1229 	XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, reg);
1230 
1231 	count = 50;
1232 	do {
1233 		msleep(20);
1234 		reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
1235 	} while ((reg & MDIO_CTRL1_RESET) && --count);
1236 
1237 	if (reg & MDIO_CTRL1_RESET)
1238 		return -ETIMEDOUT;
1239 
1240 	/* Disable auto-negotiation for now */
1241 	xgbe_disable_an(pdata);
1242 
1243 	/* Clear auto-negotiation interrupts */
1244 	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0);
1245 
1246 	return 0;
1247 }
1248 
1249 static void xgbe_dump_phy_registers(struct xgbe_prv_data *pdata)
1250 {
1251 	struct device *dev = pdata->dev;
1252 
1253 	dev_dbg(dev, "\n************* PHY Reg dump **********************\n");
1254 
1255 	dev_dbg(dev, "PCS Control Reg (%#04x) = %#04x\n", MDIO_CTRL1,
1256 		XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1));
1257 	dev_dbg(dev, "PCS Status Reg (%#04x) = %#04x\n", MDIO_STAT1,
1258 		XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1));
1259 	dev_dbg(dev, "Phy Id (PHYS ID 1 %#04x)= %#04x\n", MDIO_DEVID1,
1260 		XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID1));
1261 	dev_dbg(dev, "Phy Id (PHYS ID 2 %#04x)= %#04x\n", MDIO_DEVID2,
1262 		XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID2));
1263 	dev_dbg(dev, "Devices in Package (%#04x)= %#04x\n", MDIO_DEVS1,
1264 		XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS1));
1265 	dev_dbg(dev, "Devices in Package (%#04x)= %#04x\n", MDIO_DEVS2,
1266 		XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS2));
1267 
1268 	dev_dbg(dev, "Auto-Neg Control Reg (%#04x) = %#04x\n", MDIO_CTRL1,
1269 		XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1));
1270 	dev_dbg(dev, "Auto-Neg Status Reg (%#04x) = %#04x\n", MDIO_STAT1,
1271 		XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_STAT1));
1272 	dev_dbg(dev, "Auto-Neg Ad Reg 1 (%#04x) = %#04x\n",
1273 		MDIO_AN_ADVERTISE,
1274 		XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE));
1275 	dev_dbg(dev, "Auto-Neg Ad Reg 2 (%#04x) = %#04x\n",
1276 		MDIO_AN_ADVERTISE + 1,
1277 		XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1));
1278 	dev_dbg(dev, "Auto-Neg Ad Reg 3 (%#04x) = %#04x\n",
1279 		MDIO_AN_ADVERTISE + 2,
1280 		XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2));
1281 	dev_dbg(dev, "Auto-Neg Completion Reg (%#04x) = %#04x\n",
1282 		MDIO_AN_COMP_STAT,
1283 		XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_COMP_STAT));
1284 
1285 	dev_dbg(dev, "\n*************************************************\n");
1286 }
1287 
1288 static void xgbe_phy_init(struct xgbe_prv_data *pdata)
1289 {
1290 	mutex_init(&pdata->an_mutex);
1291 	INIT_WORK(&pdata->an_irq_work, xgbe_an_irq_work);
1292 	INIT_WORK(&pdata->an_work, xgbe_an_state_machine);
1293 	pdata->mdio_mmd = MDIO_MMD_PCS;
1294 
1295 	/* Initialize supported features */
1296 	pdata->phy.supported = SUPPORTED_Autoneg;
1297 	pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1298 	pdata->phy.supported |= SUPPORTED_Backplane;
1299 	pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
1300 	switch (pdata->speed_set) {
1301 	case XGBE_SPEEDSET_1000_10000:
1302 		pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
1303 		break;
1304 	case XGBE_SPEEDSET_2500_10000:
1305 		pdata->phy.supported |= SUPPORTED_2500baseX_Full;
1306 		break;
1307 	}
1308 
1309 	pdata->fec_ability = XMDIO_READ(pdata, MDIO_MMD_PMAPMD,
1310 					MDIO_PMA_10GBR_FECABLE);
1311 	pdata->fec_ability &= (MDIO_PMA_10GBR_FECABLE_ABLE |
1312 			       MDIO_PMA_10GBR_FECABLE_ERRABLE);
1313 	if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
1314 		pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
1315 
1316 	pdata->phy.advertising = pdata->phy.supported;
1317 
1318 	pdata->phy.address = 0;
1319 
1320 	pdata->phy.autoneg = AUTONEG_ENABLE;
1321 	pdata->phy.speed = SPEED_UNKNOWN;
1322 	pdata->phy.duplex = DUPLEX_UNKNOWN;
1323 
1324 	pdata->phy.link = 0;
1325 
1326 	pdata->phy.pause_autoneg = pdata->pause_autoneg;
1327 	pdata->phy.tx_pause = pdata->tx_pause;
1328 	pdata->phy.rx_pause = pdata->rx_pause;
1329 
1330 	/* Fix up Flow Control advertising */
1331 	pdata->phy.advertising &= ~ADVERTISED_Pause;
1332 	pdata->phy.advertising &= ~ADVERTISED_Asym_Pause;
1333 
1334 	if (pdata->rx_pause) {
1335 		pdata->phy.advertising |= ADVERTISED_Pause;
1336 		pdata->phy.advertising |= ADVERTISED_Asym_Pause;
1337 	}
1338 
1339 	if (pdata->tx_pause)
1340 		pdata->phy.advertising ^= ADVERTISED_Asym_Pause;
1341 
1342 	if (netif_msg_drv(pdata))
1343 		xgbe_dump_phy_registers(pdata);
1344 }
1345 
1346 void xgbe_init_function_ptrs_phy(struct xgbe_phy_if *phy_if)
1347 {
1348 	phy_if->phy_init        = xgbe_phy_init;
1349 
1350 	phy_if->phy_reset       = xgbe_phy_reset;
1351 	phy_if->phy_start       = xgbe_phy_start;
1352 	phy_if->phy_stop        = xgbe_phy_stop;
1353 
1354 	phy_if->phy_status      = xgbe_phy_status;
1355 	phy_if->phy_config_aneg = xgbe_phy_config_aneg;
1356 }
1357