9c39c72d25aba841ad0f143e631f3ccfd94a5784
[linux-2.6-microblaze.git] / drivers / net / ethernet / amd / xgbe / xgbe-mdio.c
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-2016 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-2016 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/interrupt.h>
118 #include <linux/module.h>
119 #include <linux/kmod.h>
120 #include <linux/mdio.h>
121 #include <linux/phy.h>
122 #include <linux/of.h>
123 #include <linux/bitops.h>
124 #include <linux/jiffies.h>
125
126 #include "xgbe.h"
127 #include "xgbe-common.h"
128
129 static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata,
130                                   struct ethtool_eeprom *eeprom, u8 *data)
131 {
132         if (!pdata->phy_if.phy_impl.module_eeprom)
133                 return -ENXIO;
134
135         return pdata->phy_if.phy_impl.module_eeprom(pdata, eeprom, data);
136 }
137
138 static int xgbe_phy_module_info(struct xgbe_prv_data *pdata,
139                                 struct ethtool_modinfo *modinfo)
140 {
141         if (!pdata->phy_if.phy_impl.module_info)
142                 return -ENXIO;
143
144         return pdata->phy_if.phy_impl.module_info(pdata, modinfo);
145 }
146
147 static void xgbe_an37_clear_interrupts(struct xgbe_prv_data *pdata)
148 {
149         int reg;
150
151         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT);
152         reg &= ~XGBE_AN_CL37_INT_MASK;
153         XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT, reg);
154 }
155
156 static void xgbe_an37_disable_interrupts(struct xgbe_prv_data *pdata)
157 {
158         int reg;
159
160         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL);
161         reg &= ~XGBE_AN_CL37_INT_MASK;
162         XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL, reg);
163
164         reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL);
165         reg &= ~XGBE_PCS_CL37_BP;
166         XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL, reg);
167 }
168
169 static void xgbe_an37_enable_interrupts(struct xgbe_prv_data *pdata)
170 {
171         int reg;
172
173         reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL);
174         reg |= XGBE_PCS_CL37_BP;
175         XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL, reg);
176
177         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL);
178         reg |= XGBE_AN_CL37_INT_MASK;
179         XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL, reg);
180 }
181
182 static void xgbe_an73_clear_interrupts(struct xgbe_prv_data *pdata)
183 {
184         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0);
185 }
186
187 static void xgbe_an73_disable_interrupts(struct xgbe_prv_data *pdata)
188 {
189         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, 0);
190 }
191
192 static void xgbe_an73_enable_interrupts(struct xgbe_prv_data *pdata)
193 {
194         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, XGBE_AN_CL73_INT_MASK);
195 }
196
197 static void xgbe_an_enable_interrupts(struct xgbe_prv_data *pdata)
198 {
199         switch (pdata->an_mode) {
200         case XGBE_AN_MODE_CL73:
201         case XGBE_AN_MODE_CL73_REDRV:
202                 xgbe_an73_enable_interrupts(pdata);
203                 break;
204         case XGBE_AN_MODE_CL37:
205         case XGBE_AN_MODE_CL37_SGMII:
206                 xgbe_an37_enable_interrupts(pdata);
207                 break;
208         default:
209                 break;
210         }
211 }
212
213 static void xgbe_an_clear_interrupts_all(struct xgbe_prv_data *pdata)
214 {
215         xgbe_an73_clear_interrupts(pdata);
216         xgbe_an37_clear_interrupts(pdata);
217 }
218
219 static void xgbe_an73_enable_kr_training(struct xgbe_prv_data *pdata)
220 {
221         unsigned int reg;
222
223         reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
224
225         reg |= XGBE_KR_TRAINING_ENABLE;
226         XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
227 }
228
229 static void xgbe_an73_disable_kr_training(struct xgbe_prv_data *pdata)
230 {
231         unsigned int reg;
232
233         reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
234
235         reg &= ~XGBE_KR_TRAINING_ENABLE;
236         XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
237 }
238
239 static void xgbe_kr_mode(struct xgbe_prv_data *pdata)
240 {
241         /* Enable KR training */
242         xgbe_an73_enable_kr_training(pdata);
243
244         /* Set MAC to 10G speed */
245         pdata->hw_if.set_speed(pdata, SPEED_10000);
246
247         /* Call PHY implementation support to complete rate change */
248         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_KR);
249 }
250
251 static void xgbe_kx_2500_mode(struct xgbe_prv_data *pdata)
252 {
253         /* Disable KR training */
254         xgbe_an73_disable_kr_training(pdata);
255
256         /* Set MAC to 2.5G speed */
257         pdata->hw_if.set_speed(pdata, SPEED_2500);
258
259         /* Call PHY implementation support to complete rate change */
260         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_KX_2500);
261 }
262
263 static void xgbe_kx_1000_mode(struct xgbe_prv_data *pdata)
264 {
265         /* Disable KR training */
266         xgbe_an73_disable_kr_training(pdata);
267
268         /* Set MAC to 1G speed */
269         pdata->hw_if.set_speed(pdata, SPEED_1000);
270
271         /* Call PHY implementation support to complete rate change */
272         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_KX_1000);
273 }
274
275 static void xgbe_sfi_mode(struct xgbe_prv_data *pdata)
276 {
277         /* If a KR re-driver is present, change to KR mode instead */
278         if (pdata->kr_redrv)
279                 return xgbe_kr_mode(pdata);
280
281         /* Disable KR training */
282         xgbe_an73_disable_kr_training(pdata);
283
284         /* Set MAC to 10G speed */
285         pdata->hw_if.set_speed(pdata, SPEED_10000);
286
287         /* Call PHY implementation support to complete rate change */
288         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SFI);
289 }
290
291 static void xgbe_x_mode(struct xgbe_prv_data *pdata)
292 {
293         /* Disable KR training */
294         xgbe_an73_disable_kr_training(pdata);
295
296         /* Set MAC to 1G speed */
297         pdata->hw_if.set_speed(pdata, SPEED_1000);
298
299         /* Call PHY implementation support to complete rate change */
300         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_X);
301 }
302
303 static void xgbe_sgmii_1000_mode(struct xgbe_prv_data *pdata)
304 {
305         /* Disable KR training */
306         xgbe_an73_disable_kr_training(pdata);
307
308         /* Set MAC to 1G speed */
309         pdata->hw_if.set_speed(pdata, SPEED_1000);
310
311         /* Call PHY implementation support to complete rate change */
312         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_1000);
313 }
314
315 static void xgbe_sgmii_100_mode(struct xgbe_prv_data *pdata)
316 {
317         /* Disable KR training */
318         xgbe_an73_disable_kr_training(pdata);
319
320         /* Set MAC to 1G speed */
321         pdata->hw_if.set_speed(pdata, SPEED_1000);
322
323         /* Call PHY implementation support to complete rate change */
324         pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_100);
325 }
326
327 static enum xgbe_mode xgbe_cur_mode(struct xgbe_prv_data *pdata)
328 {
329         return pdata->phy_if.phy_impl.cur_mode(pdata);
330 }
331
332 static bool xgbe_in_kr_mode(struct xgbe_prv_data *pdata)
333 {
334         return (xgbe_cur_mode(pdata) == XGBE_MODE_KR);
335 }
336
337 static void xgbe_change_mode(struct xgbe_prv_data *pdata,
338                              enum xgbe_mode mode)
339 {
340         switch (mode) {
341         case XGBE_MODE_KX_1000:
342                 xgbe_kx_1000_mode(pdata);
343                 break;
344         case XGBE_MODE_KX_2500:
345                 xgbe_kx_2500_mode(pdata);
346                 break;
347         case XGBE_MODE_KR:
348                 xgbe_kr_mode(pdata);
349                 break;
350         case XGBE_MODE_SGMII_100:
351                 xgbe_sgmii_100_mode(pdata);
352                 break;
353         case XGBE_MODE_SGMII_1000:
354                 xgbe_sgmii_1000_mode(pdata);
355                 break;
356         case XGBE_MODE_X:
357                 xgbe_x_mode(pdata);
358                 break;
359         case XGBE_MODE_SFI:
360                 xgbe_sfi_mode(pdata);
361                 break;
362         case XGBE_MODE_UNKNOWN:
363                 break;
364         default:
365                 netif_dbg(pdata, link, pdata->netdev,
366                           "invalid operation mode requested (%u)\n", mode);
367         }
368 }
369
370 static void xgbe_switch_mode(struct xgbe_prv_data *pdata)
371 {
372         xgbe_change_mode(pdata, pdata->phy_if.phy_impl.switch_mode(pdata));
373 }
374
375 static void xgbe_set_mode(struct xgbe_prv_data *pdata,
376                           enum xgbe_mode mode)
377 {
378         if (mode == xgbe_cur_mode(pdata))
379                 return;
380
381         xgbe_change_mode(pdata, mode);
382 }
383
384 static bool xgbe_use_mode(struct xgbe_prv_data *pdata,
385                           enum xgbe_mode mode)
386 {
387         return pdata->phy_if.phy_impl.use_mode(pdata, mode);
388 }
389
390 static void xgbe_an37_set(struct xgbe_prv_data *pdata, bool enable,
391                           bool restart)
392 {
393         unsigned int reg;
394
395         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_CTRL1);
396         reg &= ~MDIO_VEND2_CTRL1_AN_ENABLE;
397
398         if (enable)
399                 reg |= MDIO_VEND2_CTRL1_AN_ENABLE;
400
401         if (restart)
402                 reg |= MDIO_VEND2_CTRL1_AN_RESTART;
403
404         XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_CTRL1, reg);
405 }
406
407 static void xgbe_an37_restart(struct xgbe_prv_data *pdata)
408 {
409         xgbe_an37_enable_interrupts(pdata);
410         xgbe_an37_set(pdata, true, true);
411
412         netif_dbg(pdata, link, pdata->netdev, "CL37 AN enabled/restarted\n");
413 }
414
415 static void xgbe_an37_disable(struct xgbe_prv_data *pdata)
416 {
417         xgbe_an37_set(pdata, false, false);
418         xgbe_an37_disable_interrupts(pdata);
419
420         netif_dbg(pdata, link, pdata->netdev, "CL37 AN disabled\n");
421 }
422
423 static void xgbe_an73_set(struct xgbe_prv_data *pdata, bool enable,
424                           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_an73_restart(struct xgbe_prv_data *pdata)
441 {
442         xgbe_an73_enable_interrupts(pdata);
443         xgbe_an73_set(pdata, true, true);
444
445         netif_dbg(pdata, link, pdata->netdev, "CL73 AN enabled/restarted\n");
446 }
447
448 static void xgbe_an73_disable(struct xgbe_prv_data *pdata)
449 {
450         xgbe_an73_set(pdata, false, false);
451         xgbe_an73_disable_interrupts(pdata);
452
453         pdata->an_start = 0;
454
455         netif_dbg(pdata, link, pdata->netdev, "CL73 AN disabled\n");
456 }
457
458 static void xgbe_an_restart(struct xgbe_prv_data *pdata)
459 {
460         if (pdata->phy_if.phy_impl.an_pre)
461                 pdata->phy_if.phy_impl.an_pre(pdata);
462
463         switch (pdata->an_mode) {
464         case XGBE_AN_MODE_CL73:
465         case XGBE_AN_MODE_CL73_REDRV:
466                 xgbe_an73_restart(pdata);
467                 break;
468         case XGBE_AN_MODE_CL37:
469         case XGBE_AN_MODE_CL37_SGMII:
470                 xgbe_an37_restart(pdata);
471                 break;
472         default:
473                 break;
474         }
475 }
476
477 static void xgbe_an_disable(struct xgbe_prv_data *pdata)
478 {
479         if (pdata->phy_if.phy_impl.an_post)
480                 pdata->phy_if.phy_impl.an_post(pdata);
481
482         switch (pdata->an_mode) {
483         case XGBE_AN_MODE_CL73:
484         case XGBE_AN_MODE_CL73_REDRV:
485                 xgbe_an73_disable(pdata);
486                 break;
487         case XGBE_AN_MODE_CL37:
488         case XGBE_AN_MODE_CL37_SGMII:
489                 xgbe_an37_disable(pdata);
490                 break;
491         default:
492                 break;
493         }
494 }
495
496 static void xgbe_an_disable_all(struct xgbe_prv_data *pdata)
497 {
498         xgbe_an73_disable(pdata);
499         xgbe_an37_disable(pdata);
500 }
501
502 static enum xgbe_an xgbe_an73_tx_training(struct xgbe_prv_data *pdata,
503                                           enum xgbe_rx *state)
504 {
505         unsigned int ad_reg, lp_reg, reg;
506
507         *state = XGBE_RX_COMPLETE;
508
509         /* If we're not in KR mode then we're done */
510         if (!xgbe_in_kr_mode(pdata))
511                 return XGBE_AN_PAGE_RECEIVED;
512
513         /* Enable/Disable FEC */
514         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
515         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
516
517         reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL);
518         reg &= ~(MDIO_PMA_10GBR_FECABLE_ABLE | MDIO_PMA_10GBR_FECABLE_ERRABLE);
519         if ((ad_reg & 0xc000) && (lp_reg & 0xc000))
520                 reg |= pdata->fec_ability;
521
522         XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL, reg);
523
524         /* Start KR training */
525         reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
526         if (reg & XGBE_KR_TRAINING_ENABLE) {
527                 if (pdata->phy_if.phy_impl.kr_training_pre)
528                         pdata->phy_if.phy_impl.kr_training_pre(pdata);
529
530                 reg |= XGBE_KR_TRAINING_START;
531                 XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL,
532                             reg);
533
534                 netif_dbg(pdata, link, pdata->netdev,
535                           "KR training initiated\n");
536
537                 if (pdata->phy_if.phy_impl.kr_training_post)
538                         pdata->phy_if.phy_impl.kr_training_post(pdata);
539         }
540
541         return XGBE_AN_PAGE_RECEIVED;
542 }
543
544 static enum xgbe_an xgbe_an73_tx_xnp(struct xgbe_prv_data *pdata,
545                                      enum xgbe_rx *state)
546 {
547         u16 msg;
548
549         *state = XGBE_RX_XNP;
550
551         msg = XGBE_XNP_MCF_NULL_MESSAGE;
552         msg |= XGBE_XNP_MP_FORMATTED;
553
554         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP + 2, 0);
555         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP + 1, 0);
556         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP, msg);
557
558         return XGBE_AN_PAGE_RECEIVED;
559 }
560
561 static enum xgbe_an xgbe_an73_rx_bpa(struct xgbe_prv_data *pdata,
562                                      enum xgbe_rx *state)
563 {
564         unsigned int link_support;
565         unsigned int reg, ad_reg, lp_reg;
566
567         /* Read Base Ability register 2 first */
568         reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
569
570         /* Check for a supported mode, otherwise restart in a different one */
571         link_support = xgbe_in_kr_mode(pdata) ? 0x80 : 0x20;
572         if (!(reg & link_support))
573                 return XGBE_AN_INCOMPAT_LINK;
574
575         /* Check Extended Next Page support */
576         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
577         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
578
579         return ((ad_reg & XGBE_XNP_NP_EXCHANGE) ||
580                 (lp_reg & XGBE_XNP_NP_EXCHANGE))
581                ? xgbe_an73_tx_xnp(pdata, state)
582                : xgbe_an73_tx_training(pdata, state);
583 }
584
585 static enum xgbe_an xgbe_an73_rx_xnp(struct xgbe_prv_data *pdata,
586                                      enum xgbe_rx *state)
587 {
588         unsigned int ad_reg, lp_reg;
589
590         /* Check Extended Next Page support */
591         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_XNP);
592         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPX);
593
594         return ((ad_reg & XGBE_XNP_NP_EXCHANGE) ||
595                 (lp_reg & XGBE_XNP_NP_EXCHANGE))
596                ? xgbe_an73_tx_xnp(pdata, state)
597                : xgbe_an73_tx_training(pdata, state);
598 }
599
600 static enum xgbe_an xgbe_an73_page_received(struct xgbe_prv_data *pdata)
601 {
602         enum xgbe_rx *state;
603         unsigned long an_timeout;
604         enum xgbe_an ret;
605
606         if (!pdata->an_start) {
607                 pdata->an_start = jiffies;
608         } else {
609                 an_timeout = pdata->an_start +
610                              msecs_to_jiffies(XGBE_AN_MS_TIMEOUT);
611                 if (time_after(jiffies, an_timeout)) {
612                         /* Auto-negotiation timed out, reset state */
613                         pdata->kr_state = XGBE_RX_BPA;
614                         pdata->kx_state = XGBE_RX_BPA;
615
616                         pdata->an_start = jiffies;
617
618                         netif_dbg(pdata, link, pdata->netdev,
619                                   "CL73 AN timed out, resetting state\n");
620                 }
621         }
622
623         state = xgbe_in_kr_mode(pdata) ? &pdata->kr_state
624                                        : &pdata->kx_state;
625
626         switch (*state) {
627         case XGBE_RX_BPA:
628                 ret = xgbe_an73_rx_bpa(pdata, state);
629                 break;
630
631         case XGBE_RX_XNP:
632                 ret = xgbe_an73_rx_xnp(pdata, state);
633                 break;
634
635         default:
636                 ret = XGBE_AN_ERROR;
637         }
638
639         return ret;
640 }
641
642 static enum xgbe_an xgbe_an73_incompat_link(struct xgbe_prv_data *pdata)
643 {
644         struct ethtool_link_ksettings *lks = &pdata->phy.lks;
645
646         /* Be sure we aren't looping trying to negotiate */
647         if (xgbe_in_kr_mode(pdata)) {
648                 pdata->kr_state = XGBE_RX_ERROR;
649
650                 if (!XGBE_ADV(lks, 1000baseKX_Full) &&
651                     !XGBE_ADV(lks, 2500baseX_Full))
652                         return XGBE_AN_NO_LINK;
653
654                 if (pdata->kx_state != XGBE_RX_BPA)
655                         return XGBE_AN_NO_LINK;
656         } else {
657                 pdata->kx_state = XGBE_RX_ERROR;
658
659                 if (!XGBE_ADV(lks, 10000baseKR_Full))
660                         return XGBE_AN_NO_LINK;
661
662                 if (pdata->kr_state != XGBE_RX_BPA)
663                         return XGBE_AN_NO_LINK;
664         }
665
666         xgbe_an_disable(pdata);
667
668         xgbe_switch_mode(pdata);
669
670         xgbe_an_restart(pdata);
671
672         return XGBE_AN_INCOMPAT_LINK;
673 }
674
675 static void xgbe_an37_isr(struct xgbe_prv_data *pdata)
676 {
677         unsigned int reg;
678
679         /* Disable AN interrupts */
680         xgbe_an37_disable_interrupts(pdata);
681
682         /* Save the interrupt(s) that fired */
683         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT);
684         pdata->an_int = reg & XGBE_AN_CL37_INT_MASK;
685         pdata->an_status = reg & ~XGBE_AN_CL37_INT_MASK;
686
687         if (pdata->an_int) {
688                 /* Clear the interrupt(s) that fired and process them */
689                 reg &= ~XGBE_AN_CL37_INT_MASK;
690                 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT, reg);
691
692                 queue_work(pdata->an_workqueue, &pdata->an_irq_work);
693         } else {
694                 /* Enable AN interrupts */
695                 xgbe_an37_enable_interrupts(pdata);
696
697                 /* Reissue interrupt if status is not clear */
698                 if (pdata->vdata->irq_reissue_support)
699                         XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 3);
700         }
701 }
702
703 static void xgbe_an73_isr(struct xgbe_prv_data *pdata)
704 {
705         /* Disable AN interrupts */
706         xgbe_an73_disable_interrupts(pdata);
707
708         /* Save the interrupt(s) that fired */
709         pdata->an_int = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_INT);
710
711         if (pdata->an_int) {
712                 /* Clear the interrupt(s) that fired and process them */
713                 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, ~pdata->an_int);
714
715                 queue_work(pdata->an_workqueue, &pdata->an_irq_work);
716         } else {
717                 /* Enable AN interrupts */
718                 xgbe_an73_enable_interrupts(pdata);
719
720                 /* Reissue interrupt if status is not clear */
721                 if (pdata->vdata->irq_reissue_support)
722                         XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 3);
723         }
724 }
725
726 static void xgbe_an_isr_task(unsigned long data)
727 {
728         struct xgbe_prv_data *pdata = (struct xgbe_prv_data *)data;
729
730         netif_dbg(pdata, intr, pdata->netdev, "AN interrupt received\n");
731
732         switch (pdata->an_mode) {
733         case XGBE_AN_MODE_CL73:
734         case XGBE_AN_MODE_CL73_REDRV:
735                 xgbe_an73_isr(pdata);
736                 break;
737         case XGBE_AN_MODE_CL37:
738         case XGBE_AN_MODE_CL37_SGMII:
739                 xgbe_an37_isr(pdata);
740                 break;
741         default:
742                 break;
743         }
744 }
745
746 static irqreturn_t xgbe_an_isr(int irq, void *data)
747 {
748         struct xgbe_prv_data *pdata = (struct xgbe_prv_data *)data;
749
750         if (pdata->isr_as_tasklet)
751                 tasklet_schedule(&pdata->tasklet_an);
752         else
753                 xgbe_an_isr_task((unsigned long)pdata);
754
755         return IRQ_HANDLED;
756 }
757
758 static irqreturn_t xgbe_an_combined_isr(struct xgbe_prv_data *pdata)
759 {
760         xgbe_an_isr_task((unsigned long)pdata);
761
762         return IRQ_HANDLED;
763 }
764
765 static void xgbe_an_irq_work(struct work_struct *work)
766 {
767         struct xgbe_prv_data *pdata = container_of(work,
768                                                    struct xgbe_prv_data,
769                                                    an_irq_work);
770
771         /* Avoid a race between enabling the IRQ and exiting the work by
772          * waiting for the work to finish and then queueing it
773          */
774         flush_work(&pdata->an_work);
775         queue_work(pdata->an_workqueue, &pdata->an_work);
776 }
777
778 static const char *xgbe_state_as_string(enum xgbe_an state)
779 {
780         switch (state) {
781         case XGBE_AN_READY:
782                 return "Ready";
783         case XGBE_AN_PAGE_RECEIVED:
784                 return "Page-Received";
785         case XGBE_AN_INCOMPAT_LINK:
786                 return "Incompatible-Link";
787         case XGBE_AN_COMPLETE:
788                 return "Complete";
789         case XGBE_AN_NO_LINK:
790                 return "No-Link";
791         case XGBE_AN_ERROR:
792                 return "Error";
793         default:
794                 return "Undefined";
795         }
796 }
797
798 static void xgbe_an37_state_machine(struct xgbe_prv_data *pdata)
799 {
800         enum xgbe_an cur_state = pdata->an_state;
801
802         if (!pdata->an_int)
803                 return;
804
805         if (pdata->an_int & XGBE_AN_CL37_INT_CMPLT) {
806                 pdata->an_state = XGBE_AN_COMPLETE;
807                 pdata->an_int &= ~XGBE_AN_CL37_INT_CMPLT;
808
809                 /* If SGMII is enabled, check the link status */
810                 if ((pdata->an_mode == XGBE_AN_MODE_CL37_SGMII) &&
811                     !(pdata->an_status & XGBE_SGMII_AN_LINK_STATUS))
812                         pdata->an_state = XGBE_AN_NO_LINK;
813         }
814
815         netif_dbg(pdata, link, pdata->netdev, "CL37 AN %s\n",
816                   xgbe_state_as_string(pdata->an_state));
817
818         cur_state = pdata->an_state;
819
820         switch (pdata->an_state) {
821         case XGBE_AN_READY:
822                 break;
823
824         case XGBE_AN_COMPLETE:
825                 netif_dbg(pdata, link, pdata->netdev,
826                           "Auto negotiation successful\n");
827                 break;
828
829         case XGBE_AN_NO_LINK:
830                 break;
831
832         default:
833                 pdata->an_state = XGBE_AN_ERROR;
834         }
835
836         if (pdata->an_state == XGBE_AN_ERROR) {
837                 netdev_err(pdata->netdev,
838                            "error during auto-negotiation, state=%u\n",
839                            cur_state);
840
841                 pdata->an_int = 0;
842                 xgbe_an37_clear_interrupts(pdata);
843         }
844
845         if (pdata->an_state >= XGBE_AN_COMPLETE) {
846                 pdata->an_result = pdata->an_state;
847                 pdata->an_state = XGBE_AN_READY;
848
849                 if (pdata->phy_if.phy_impl.an_post)
850                         pdata->phy_if.phy_impl.an_post(pdata);
851
852                 netif_dbg(pdata, link, pdata->netdev, "CL37 AN result: %s\n",
853                           xgbe_state_as_string(pdata->an_result));
854         }
855
856         xgbe_an37_enable_interrupts(pdata);
857 }
858
859 static void xgbe_an73_state_machine(struct xgbe_prv_data *pdata)
860 {
861         enum xgbe_an cur_state = pdata->an_state;
862
863         if (!pdata->an_int)
864                 return;
865
866 next_int:
867         if (pdata->an_int & XGBE_AN_CL73_PG_RCV) {
868                 pdata->an_state = XGBE_AN_PAGE_RECEIVED;
869                 pdata->an_int &= ~XGBE_AN_CL73_PG_RCV;
870         } else if (pdata->an_int & XGBE_AN_CL73_INC_LINK) {
871                 pdata->an_state = XGBE_AN_INCOMPAT_LINK;
872                 pdata->an_int &= ~XGBE_AN_CL73_INC_LINK;
873         } else if (pdata->an_int & XGBE_AN_CL73_INT_CMPLT) {
874                 pdata->an_state = XGBE_AN_COMPLETE;
875                 pdata->an_int &= ~XGBE_AN_CL73_INT_CMPLT;
876         } else {
877                 pdata->an_state = XGBE_AN_ERROR;
878         }
879
880 again:
881         netif_dbg(pdata, link, pdata->netdev, "CL73 AN %s\n",
882                   xgbe_state_as_string(pdata->an_state));
883
884         cur_state = pdata->an_state;
885
886         switch (pdata->an_state) {
887         case XGBE_AN_READY:
888                 pdata->an_supported = 0;
889                 break;
890
891         case XGBE_AN_PAGE_RECEIVED:
892                 pdata->an_state = xgbe_an73_page_received(pdata);
893                 pdata->an_supported++;
894                 break;
895
896         case XGBE_AN_INCOMPAT_LINK:
897                 pdata->an_supported = 0;
898                 pdata->parallel_detect = 0;
899                 pdata->an_state = xgbe_an73_incompat_link(pdata);
900                 break;
901
902         case XGBE_AN_COMPLETE:
903                 pdata->parallel_detect = pdata->an_supported ? 0 : 1;
904                 netif_dbg(pdata, link, pdata->netdev, "%s successful\n",
905                           pdata->an_supported ? "Auto negotiation"
906                                               : "Parallel detection");
907                 break;
908
909         case XGBE_AN_NO_LINK:
910                 break;
911
912         default:
913                 pdata->an_state = XGBE_AN_ERROR;
914         }
915
916         if (pdata->an_state == XGBE_AN_NO_LINK) {
917                 pdata->an_int = 0;
918                 xgbe_an73_clear_interrupts(pdata);
919         } else if (pdata->an_state == XGBE_AN_ERROR) {
920                 netdev_err(pdata->netdev,
921                            "error during auto-negotiation, state=%u\n",
922                            cur_state);
923
924                 pdata->an_int = 0;
925                 xgbe_an73_clear_interrupts(pdata);
926         }
927
928         if (pdata->an_state >= XGBE_AN_COMPLETE) {
929                 pdata->an_result = pdata->an_state;
930                 pdata->an_state = XGBE_AN_READY;
931                 pdata->kr_state = XGBE_RX_BPA;
932                 pdata->kx_state = XGBE_RX_BPA;
933                 pdata->an_start = 0;
934
935                 if (pdata->phy_if.phy_impl.an_post)
936                         pdata->phy_if.phy_impl.an_post(pdata);
937
938                 netif_dbg(pdata, link, pdata->netdev, "CL73 AN result: %s\n",
939                           xgbe_state_as_string(pdata->an_result));
940         }
941
942         if (cur_state != pdata->an_state)
943                 goto again;
944
945         if (pdata->an_int)
946                 goto next_int;
947
948         xgbe_an73_enable_interrupts(pdata);
949 }
950
951 static void xgbe_an_state_machine(struct work_struct *work)
952 {
953         struct xgbe_prv_data *pdata = container_of(work,
954                                                    struct xgbe_prv_data,
955                                                    an_work);
956
957         mutex_lock(&pdata->an_mutex);
958
959         switch (pdata->an_mode) {
960         case XGBE_AN_MODE_CL73:
961         case XGBE_AN_MODE_CL73_REDRV:
962                 xgbe_an73_state_machine(pdata);
963                 break;
964         case XGBE_AN_MODE_CL37:
965         case XGBE_AN_MODE_CL37_SGMII:
966                 xgbe_an37_state_machine(pdata);
967                 break;
968         default:
969                 break;
970         }
971
972         /* Reissue interrupt if status is not clear */
973         if (pdata->vdata->irq_reissue_support)
974                 XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 3);
975
976         mutex_unlock(&pdata->an_mutex);
977 }
978
979 static void xgbe_an37_init(struct xgbe_prv_data *pdata)
980 {
981         struct ethtool_link_ksettings lks;
982         unsigned int reg;
983
984         pdata->phy_if.phy_impl.an_advertising(pdata, &lks);
985
986         /* Set up Advertisement register */
987         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
988         if (XGBE_ADV(&lks, Pause))
989                 reg |= 0x100;
990         else
991                 reg &= ~0x100;
992
993         if (XGBE_ADV(&lks, Asym_Pause))
994                 reg |= 0x80;
995         else
996                 reg &= ~0x80;
997
998         /* Full duplex, but not half */
999         reg |= XGBE_AN_CL37_FD_MASK;
1000         reg &= ~XGBE_AN_CL37_HD_MASK;
1001
1002         XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE, reg);
1003
1004         /* Set up the Control register */
1005         reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL);
1006         reg &= ~XGBE_AN_CL37_TX_CONFIG_MASK;
1007         reg &= ~XGBE_AN_CL37_PCS_MODE_MASK;
1008
1009         switch (pdata->an_mode) {
1010         case XGBE_AN_MODE_CL37:
1011                 reg |= XGBE_AN_CL37_PCS_MODE_BASEX;
1012                 break;
1013         case XGBE_AN_MODE_CL37_SGMII:
1014                 reg |= XGBE_AN_CL37_PCS_MODE_SGMII;
1015                 break;
1016         default:
1017                 break;
1018         }
1019
1020         reg |= XGBE_AN_CL37_MII_CTRL_8BIT;
1021
1022         XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL, reg);
1023
1024         netif_dbg(pdata, link, pdata->netdev, "CL37 AN (%s) initialized\n",
1025                   (pdata->an_mode == XGBE_AN_MODE_CL37) ? "BaseX" : "SGMII");
1026 }
1027
1028 static void xgbe_an73_init(struct xgbe_prv_data *pdata)
1029 {
1030         struct ethtool_link_ksettings lks;
1031         unsigned int reg;
1032
1033         pdata->phy_if.phy_impl.an_advertising(pdata, &lks);
1034
1035         /* Set up Advertisement register 3 first */
1036         reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1037         if (XGBE_ADV(&lks, 10000baseR_FEC))
1038                 reg |= 0xc000;
1039         else
1040                 reg &= ~0xc000;
1041
1042         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2, reg);
1043
1044         /* Set up Advertisement register 2 next */
1045         reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1046         if (XGBE_ADV(&lks, 10000baseKR_Full))
1047                 reg |= 0x80;
1048         else
1049                 reg &= ~0x80;
1050
1051         if (XGBE_ADV(&lks, 1000baseKX_Full) ||
1052             XGBE_ADV(&lks, 2500baseX_Full))
1053                 reg |= 0x20;
1054         else
1055                 reg &= ~0x20;
1056
1057         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1, reg);
1058
1059         /* Set up Advertisement register 1 last */
1060         reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1061         if (XGBE_ADV(&lks, Pause))
1062                 reg |= 0x400;
1063         else
1064                 reg &= ~0x400;
1065
1066         if (XGBE_ADV(&lks, Asym_Pause))
1067                 reg |= 0x800;
1068         else
1069                 reg &= ~0x800;
1070
1071         /* We don't intend to perform XNP */
1072         reg &= ~XGBE_XNP_NP_EXCHANGE;
1073
1074         XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE, reg);
1075
1076         netif_dbg(pdata, link, pdata->netdev, "CL73 AN initialized\n");
1077 }
1078
1079 static void xgbe_an_init(struct xgbe_prv_data *pdata)
1080 {
1081         /* Set up advertisement registers based on current settings */
1082         pdata->an_mode = pdata->phy_if.phy_impl.an_mode(pdata);
1083         switch (pdata->an_mode) {
1084         case XGBE_AN_MODE_CL73:
1085         case XGBE_AN_MODE_CL73_REDRV:
1086                 xgbe_an73_init(pdata);
1087                 break;
1088         case XGBE_AN_MODE_CL37:
1089         case XGBE_AN_MODE_CL37_SGMII:
1090                 xgbe_an37_init(pdata);
1091                 break;
1092         default:
1093                 break;
1094         }
1095 }
1096
1097 static const char *xgbe_phy_fc_string(struct xgbe_prv_data *pdata)
1098 {
1099         if (pdata->tx_pause && pdata->rx_pause)
1100                 return "rx/tx";
1101         else if (pdata->rx_pause)
1102                 return "rx";
1103         else if (pdata->tx_pause)
1104                 return "tx";
1105         else
1106                 return "off";
1107 }
1108
1109 static const char *xgbe_phy_speed_string(int speed)
1110 {
1111         switch (speed) {
1112         case SPEED_100:
1113                 return "100Mbps";
1114         case SPEED_1000:
1115                 return "1Gbps";
1116         case SPEED_2500:
1117                 return "2.5Gbps";
1118         case SPEED_10000:
1119                 return "10Gbps";
1120         case SPEED_UNKNOWN:
1121                 return "Unknown";
1122         default:
1123                 return "Unsupported";
1124         }
1125 }
1126
1127 static void xgbe_phy_print_status(struct xgbe_prv_data *pdata)
1128 {
1129         if (pdata->phy.link)
1130                 netdev_info(pdata->netdev,
1131                             "Link is Up - %s/%s - flow control %s\n",
1132                             xgbe_phy_speed_string(pdata->phy.speed),
1133                             pdata->phy.duplex == DUPLEX_FULL ? "Full" : "Half",
1134                             xgbe_phy_fc_string(pdata));
1135         else
1136                 netdev_info(pdata->netdev, "Link is Down\n");
1137 }
1138
1139 static void xgbe_phy_adjust_link(struct xgbe_prv_data *pdata)
1140 {
1141         int new_state = 0;
1142
1143         if (pdata->phy.link) {
1144                 /* Flow control support */
1145                 pdata->pause_autoneg = pdata->phy.pause_autoneg;
1146
1147                 if (pdata->tx_pause != pdata->phy.tx_pause) {
1148                         new_state = 1;
1149                         pdata->hw_if.config_tx_flow_control(pdata);
1150                         pdata->tx_pause = pdata->phy.tx_pause;
1151                 }
1152
1153                 if (pdata->rx_pause != pdata->phy.rx_pause) {
1154                         new_state = 1;
1155                         pdata->hw_if.config_rx_flow_control(pdata);
1156                         pdata->rx_pause = pdata->phy.rx_pause;
1157                 }
1158
1159                 /* Speed support */
1160                 if (pdata->phy_speed != pdata->phy.speed) {
1161                         new_state = 1;
1162                         pdata->phy_speed = pdata->phy.speed;
1163                 }
1164
1165                 if (pdata->phy_link != pdata->phy.link) {
1166                         new_state = 1;
1167                         pdata->phy_link = pdata->phy.link;
1168                 }
1169         } else if (pdata->phy_link) {
1170                 new_state = 1;
1171                 pdata->phy_link = 0;
1172                 pdata->phy_speed = SPEED_UNKNOWN;
1173         }
1174
1175         if (new_state && netif_msg_link(pdata))
1176                 xgbe_phy_print_status(pdata);
1177 }
1178
1179 static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
1180 {
1181         return pdata->phy_if.phy_impl.valid_speed(pdata, speed);
1182 }
1183
1184 static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata)
1185 {
1186         enum xgbe_mode mode;
1187
1188         netif_dbg(pdata, link, pdata->netdev, "fixed PHY configuration\n");
1189
1190         /* Disable auto-negotiation */
1191         xgbe_an_disable(pdata);
1192
1193         /* Set specified mode for specified speed */
1194         mode = pdata->phy_if.phy_impl.get_mode(pdata, pdata->phy.speed);
1195         switch (mode) {
1196         case XGBE_MODE_KX_1000:
1197         case XGBE_MODE_KX_2500:
1198         case XGBE_MODE_KR:
1199         case XGBE_MODE_SGMII_100:
1200         case XGBE_MODE_SGMII_1000:
1201         case XGBE_MODE_X:
1202         case XGBE_MODE_SFI:
1203                 break;
1204         case XGBE_MODE_UNKNOWN:
1205         default:
1206                 return -EINVAL;
1207         }
1208
1209         /* Validate duplex mode */
1210         if (pdata->phy.duplex != DUPLEX_FULL)
1211                 return -EINVAL;
1212
1213         xgbe_set_mode(pdata, mode);
1214
1215         return 0;
1216 }
1217
1218 static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata)
1219 {
1220         int ret;
1221
1222         set_bit(XGBE_LINK_INIT, &pdata->dev_state);
1223         pdata->link_check = jiffies;
1224
1225         ret = pdata->phy_if.phy_impl.an_config(pdata);
1226         if (ret)
1227                 return ret;
1228
1229         if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1230                 ret = xgbe_phy_config_fixed(pdata);
1231                 if (ret || !pdata->kr_redrv)
1232                         return ret;
1233
1234                 netif_dbg(pdata, link, pdata->netdev, "AN redriver support\n");
1235         } else {
1236                 netif_dbg(pdata, link, pdata->netdev, "AN PHY configuration\n");
1237         }
1238
1239         /* Disable auto-negotiation interrupt */
1240         disable_irq(pdata->an_irq);
1241
1242         /* Start auto-negotiation in a supported mode */
1243         if (xgbe_use_mode(pdata, XGBE_MODE_KR)) {
1244                 xgbe_set_mode(pdata, XGBE_MODE_KR);
1245         } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_2500)) {
1246                 xgbe_set_mode(pdata, XGBE_MODE_KX_2500);
1247         } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_1000)) {
1248                 xgbe_set_mode(pdata, XGBE_MODE_KX_1000);
1249         } else if (xgbe_use_mode(pdata, XGBE_MODE_SFI)) {
1250                 xgbe_set_mode(pdata, XGBE_MODE_SFI);
1251         } else if (xgbe_use_mode(pdata, XGBE_MODE_X)) {
1252                 xgbe_set_mode(pdata, XGBE_MODE_X);
1253         } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_1000)) {
1254                 xgbe_set_mode(pdata, XGBE_MODE_SGMII_1000);
1255         } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) {
1256                 xgbe_set_mode(pdata, XGBE_MODE_SGMII_100);
1257         } else {
1258                 enable_irq(pdata->an_irq);
1259                 return -EINVAL;
1260         }
1261
1262         /* Disable and stop any in progress auto-negotiation */
1263         xgbe_an_disable_all(pdata);
1264
1265         /* Clear any auto-negotitation interrupts */
1266         xgbe_an_clear_interrupts_all(pdata);
1267
1268         pdata->an_result = XGBE_AN_READY;
1269         pdata->an_state = XGBE_AN_READY;
1270         pdata->kr_state = XGBE_RX_BPA;
1271         pdata->kx_state = XGBE_RX_BPA;
1272
1273         /* Re-enable auto-negotiation interrupt */
1274         enable_irq(pdata->an_irq);
1275
1276         xgbe_an_init(pdata);
1277         xgbe_an_restart(pdata);
1278
1279         return 0;
1280 }
1281
1282 static int xgbe_phy_config_aneg(struct xgbe_prv_data *pdata)
1283 {
1284         int ret;
1285
1286         mutex_lock(&pdata->an_mutex);
1287
1288         ret = __xgbe_phy_config_aneg(pdata);
1289         if (ret)
1290                 set_bit(XGBE_LINK_ERR, &pdata->dev_state);
1291         else
1292                 clear_bit(XGBE_LINK_ERR, &pdata->dev_state);
1293
1294         mutex_unlock(&pdata->an_mutex);
1295
1296         return ret;
1297 }
1298
1299 static bool xgbe_phy_aneg_done(struct xgbe_prv_data *pdata)
1300 {
1301         return (pdata->an_result == XGBE_AN_COMPLETE);
1302 }
1303
1304 static void xgbe_check_link_timeout(struct xgbe_prv_data *pdata)
1305 {
1306         unsigned long link_timeout;
1307
1308         link_timeout = pdata->link_check + (XGBE_LINK_TIMEOUT * HZ);
1309         if (time_after(jiffies, link_timeout)) {
1310                 netif_dbg(pdata, link, pdata->netdev, "AN link timeout\n");
1311                 xgbe_phy_config_aneg(pdata);
1312         }
1313 }
1314
1315 static enum xgbe_mode xgbe_phy_status_aneg(struct xgbe_prv_data *pdata)
1316 {
1317         return pdata->phy_if.phy_impl.an_outcome(pdata);
1318 }
1319
1320 static void xgbe_phy_status_result(struct xgbe_prv_data *pdata)
1321 {
1322         struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1323         enum xgbe_mode mode;
1324
1325         XGBE_ZERO_LP_ADV(lks);
1326
1327         if ((pdata->phy.autoneg != AUTONEG_ENABLE) || pdata->parallel_detect)
1328                 mode = xgbe_cur_mode(pdata);
1329         else
1330                 mode = xgbe_phy_status_aneg(pdata);
1331
1332         switch (mode) {
1333         case XGBE_MODE_SGMII_100:
1334                 pdata->phy.speed = SPEED_100;
1335                 break;
1336         case XGBE_MODE_X:
1337         case XGBE_MODE_KX_1000:
1338         case XGBE_MODE_SGMII_1000:
1339                 pdata->phy.speed = SPEED_1000;
1340                 break;
1341         case XGBE_MODE_KX_2500:
1342                 pdata->phy.speed = SPEED_2500;
1343                 break;
1344         case XGBE_MODE_KR:
1345         case XGBE_MODE_SFI:
1346                 pdata->phy.speed = SPEED_10000;
1347                 break;
1348         case XGBE_MODE_UNKNOWN:
1349         default:
1350                 pdata->phy.speed = SPEED_UNKNOWN;
1351         }
1352
1353         pdata->phy.duplex = DUPLEX_FULL;
1354
1355         xgbe_set_mode(pdata, mode);
1356 }
1357
1358 static void xgbe_phy_status(struct xgbe_prv_data *pdata)
1359 {
1360         unsigned int link_aneg;
1361         int an_restart;
1362
1363         if (test_bit(XGBE_LINK_ERR, &pdata->dev_state)) {
1364                 netif_carrier_off(pdata->netdev);
1365
1366                 pdata->phy.link = 0;
1367                 goto adjust_link;
1368         }
1369
1370         link_aneg = (pdata->phy.autoneg == AUTONEG_ENABLE);
1371
1372         pdata->phy.link = pdata->phy_if.phy_impl.link_status(pdata,
1373                                                              &an_restart);
1374         if (an_restart) {
1375                 xgbe_phy_config_aneg(pdata);
1376                 return;
1377         }
1378
1379         if (pdata->phy.link) {
1380                 if (link_aneg && !xgbe_phy_aneg_done(pdata)) {
1381                         xgbe_check_link_timeout(pdata);
1382                         return;
1383                 }
1384
1385                 xgbe_phy_status_result(pdata);
1386
1387                 if (test_bit(XGBE_LINK_INIT, &pdata->dev_state))
1388                         clear_bit(XGBE_LINK_INIT, &pdata->dev_state);
1389
1390                 netif_carrier_on(pdata->netdev);
1391         } else {
1392                 if (test_bit(XGBE_LINK_INIT, &pdata->dev_state)) {
1393                         xgbe_check_link_timeout(pdata);
1394
1395                         if (link_aneg)
1396                                 return;
1397                 }
1398
1399                 xgbe_phy_status_result(pdata);
1400
1401                 netif_carrier_off(pdata->netdev);
1402         }
1403
1404 adjust_link:
1405         xgbe_phy_adjust_link(pdata);
1406 }
1407
1408 static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
1409 {
1410         netif_dbg(pdata, link, pdata->netdev, "stopping PHY\n");
1411
1412         if (!pdata->phy_started)
1413                 return;
1414
1415         /* Indicate the PHY is down */
1416         pdata->phy_started = 0;
1417
1418         /* Disable auto-negotiation */
1419         xgbe_an_disable_all(pdata);
1420
1421         if (pdata->dev_irq != pdata->an_irq)
1422                 devm_free_irq(pdata->dev, pdata->an_irq, pdata);
1423
1424         pdata->phy_if.phy_impl.stop(pdata);
1425
1426         pdata->phy.link = 0;
1427         netif_carrier_off(pdata->netdev);
1428
1429         xgbe_phy_adjust_link(pdata);
1430 }
1431
1432 static int xgbe_phy_start(struct xgbe_prv_data *pdata)
1433 {
1434         struct net_device *netdev = pdata->netdev;
1435         int ret;
1436
1437         netif_dbg(pdata, link, pdata->netdev, "starting PHY\n");
1438
1439         ret = pdata->phy_if.phy_impl.start(pdata);
1440         if (ret)
1441                 return ret;
1442
1443         /* If we have a separate AN irq, enable it */
1444         if (pdata->dev_irq != pdata->an_irq) {
1445                 tasklet_init(&pdata->tasklet_an, xgbe_an_isr_task,
1446                              (unsigned long)pdata);
1447
1448                 ret = devm_request_irq(pdata->dev, pdata->an_irq,
1449                                        xgbe_an_isr, 0, pdata->an_name,
1450                                        pdata);
1451                 if (ret) {
1452                         netdev_err(netdev, "phy irq request failed\n");
1453                         goto err_stop;
1454                 }
1455         }
1456
1457         /* Set initial mode - call the mode setting routines
1458          * directly to insure we are properly configured
1459          */
1460         if (xgbe_use_mode(pdata, XGBE_MODE_KR)) {
1461                 xgbe_kr_mode(pdata);
1462         } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_2500)) {
1463                 xgbe_kx_2500_mode(pdata);
1464         } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_1000)) {
1465                 xgbe_kx_1000_mode(pdata);
1466         } else if (xgbe_use_mode(pdata, XGBE_MODE_SFI)) {
1467                 xgbe_sfi_mode(pdata);
1468         } else if (xgbe_use_mode(pdata, XGBE_MODE_X)) {
1469                 xgbe_x_mode(pdata);
1470         } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_1000)) {
1471                 xgbe_sgmii_1000_mode(pdata);
1472         } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) {
1473                 xgbe_sgmii_100_mode(pdata);
1474         } else {
1475                 ret = -EINVAL;
1476                 goto err_irq;
1477         }
1478
1479         /* Indicate the PHY is up and running */
1480         pdata->phy_started = 1;
1481
1482         xgbe_an_init(pdata);
1483         xgbe_an_enable_interrupts(pdata);
1484
1485         return xgbe_phy_config_aneg(pdata);
1486
1487 err_irq:
1488         if (pdata->dev_irq != pdata->an_irq)
1489                 devm_free_irq(pdata->dev, pdata->an_irq, pdata);
1490
1491 err_stop:
1492         pdata->phy_if.phy_impl.stop(pdata);
1493
1494         return ret;
1495 }
1496
1497 static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
1498 {
1499         int ret;
1500
1501         ret = pdata->phy_if.phy_impl.reset(pdata);
1502         if (ret)
1503                 return ret;
1504
1505         /* Disable auto-negotiation for now */
1506         xgbe_an_disable_all(pdata);
1507
1508         /* Clear auto-negotiation interrupts */
1509         xgbe_an_clear_interrupts_all(pdata);
1510
1511         return 0;
1512 }
1513
1514 static void xgbe_dump_phy_registers(struct xgbe_prv_data *pdata)
1515 {
1516         struct device *dev = pdata->dev;
1517
1518         dev_dbg(dev, "\n************* PHY Reg dump **********************\n");
1519
1520         dev_dbg(dev, "PCS Control Reg (%#06x) = %#06x\n", MDIO_CTRL1,
1521                 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1));
1522         dev_dbg(dev, "PCS Status Reg (%#06x) = %#06x\n", MDIO_STAT1,
1523                 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1));
1524         dev_dbg(dev, "Phy Id (PHYS ID 1 %#06x)= %#06x\n", MDIO_DEVID1,
1525                 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID1));
1526         dev_dbg(dev, "Phy Id (PHYS ID 2 %#06x)= %#06x\n", MDIO_DEVID2,
1527                 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID2));
1528         dev_dbg(dev, "Devices in Package (%#06x)= %#06x\n", MDIO_DEVS1,
1529                 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS1));
1530         dev_dbg(dev, "Devices in Package (%#06x)= %#06x\n", MDIO_DEVS2,
1531                 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS2));
1532
1533         dev_dbg(dev, "Auto-Neg Control Reg (%#06x) = %#06x\n", MDIO_CTRL1,
1534                 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1));
1535         dev_dbg(dev, "Auto-Neg Status Reg (%#06x) = %#06x\n", MDIO_STAT1,
1536                 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_STAT1));
1537         dev_dbg(dev, "Auto-Neg Ad Reg 1 (%#06x) = %#06x\n",
1538                 MDIO_AN_ADVERTISE,
1539                 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE));
1540         dev_dbg(dev, "Auto-Neg Ad Reg 2 (%#06x) = %#06x\n",
1541                 MDIO_AN_ADVERTISE + 1,
1542                 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1));
1543         dev_dbg(dev, "Auto-Neg Ad Reg 3 (%#06x) = %#06x\n",
1544                 MDIO_AN_ADVERTISE + 2,
1545                 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2));
1546         dev_dbg(dev, "Auto-Neg Completion Reg (%#06x) = %#06x\n",
1547                 MDIO_AN_COMP_STAT,
1548                 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_COMP_STAT));
1549
1550         dev_dbg(dev, "\n*************************************************\n");
1551 }
1552
1553 static int xgbe_phy_best_advertised_speed(struct xgbe_prv_data *pdata)
1554 {
1555         struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1556
1557         if (XGBE_ADV(lks, 10000baseKR_Full))
1558                 return SPEED_10000;
1559         else if (XGBE_ADV(lks, 10000baseT_Full))
1560                 return SPEED_10000;
1561         else if (XGBE_ADV(lks, 2500baseX_Full))
1562                 return SPEED_2500;
1563         else if (XGBE_ADV(lks, 2500baseT_Full))
1564                 return SPEED_2500;
1565         else if (XGBE_ADV(lks, 1000baseKX_Full))
1566                 return SPEED_1000;
1567         else if (XGBE_ADV(lks, 1000baseT_Full))
1568                 return SPEED_1000;
1569         else if (XGBE_ADV(lks, 100baseT_Full))
1570                 return SPEED_100;
1571
1572         return SPEED_UNKNOWN;
1573 }
1574
1575 static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
1576 {
1577         pdata->phy_if.phy_impl.exit(pdata);
1578 }
1579
1580 static int xgbe_phy_init(struct xgbe_prv_data *pdata)
1581 {
1582         struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1583         int ret;
1584
1585         mutex_init(&pdata->an_mutex);
1586         INIT_WORK(&pdata->an_irq_work, xgbe_an_irq_work);
1587         INIT_WORK(&pdata->an_work, xgbe_an_state_machine);
1588         pdata->mdio_mmd = MDIO_MMD_PCS;
1589
1590         /* Check for FEC support */
1591         pdata->fec_ability = XMDIO_READ(pdata, MDIO_MMD_PMAPMD,
1592                                         MDIO_PMA_10GBR_FECABLE);
1593         pdata->fec_ability &= (MDIO_PMA_10GBR_FECABLE_ABLE |
1594                                MDIO_PMA_10GBR_FECABLE_ERRABLE);
1595
1596         /* Setup the phy (including supported features) */
1597         ret = pdata->phy_if.phy_impl.init(pdata);
1598         if (ret)
1599                 return ret;
1600
1601         /* Copy supported link modes to advertising link modes */
1602         XGBE_LM_COPY(lks, advertising, lks, supported);
1603
1604         pdata->phy.address = 0;
1605
1606         if (XGBE_ADV(lks, Autoneg)) {
1607                 pdata->phy.autoneg = AUTONEG_ENABLE;
1608                 pdata->phy.speed = SPEED_UNKNOWN;
1609                 pdata->phy.duplex = DUPLEX_UNKNOWN;
1610         } else {
1611                 pdata->phy.autoneg = AUTONEG_DISABLE;
1612                 pdata->phy.speed = xgbe_phy_best_advertised_speed(pdata);
1613                 pdata->phy.duplex = DUPLEX_FULL;
1614         }
1615
1616         pdata->phy.link = 0;
1617
1618         pdata->phy.pause_autoneg = pdata->pause_autoneg;
1619         pdata->phy.tx_pause = pdata->tx_pause;
1620         pdata->phy.rx_pause = pdata->rx_pause;
1621
1622         /* Fix up Flow Control advertising */
1623         XGBE_CLR_ADV(lks, Pause);
1624         XGBE_CLR_ADV(lks, Asym_Pause);
1625
1626         if (pdata->rx_pause) {
1627                 XGBE_SET_ADV(lks, Pause);
1628                 XGBE_SET_ADV(lks, Asym_Pause);
1629         }
1630
1631         if (pdata->tx_pause) {
1632                 /* Equivalent to XOR of Asym_Pause */
1633                 if (XGBE_ADV(lks, Asym_Pause))
1634                         XGBE_CLR_ADV(lks, Asym_Pause);
1635                 else
1636                         XGBE_SET_ADV(lks, Asym_Pause);
1637         }
1638
1639         if (netif_msg_drv(pdata))
1640                 xgbe_dump_phy_registers(pdata);
1641
1642         return 0;
1643 }
1644
1645 void xgbe_init_function_ptrs_phy(struct xgbe_phy_if *phy_if)
1646 {
1647         phy_if->phy_init        = xgbe_phy_init;
1648         phy_if->phy_exit        = xgbe_phy_exit;
1649
1650         phy_if->phy_reset       = xgbe_phy_reset;
1651         phy_if->phy_start       = xgbe_phy_start;
1652         phy_if->phy_stop        = xgbe_phy_stop;
1653
1654         phy_if->phy_status      = xgbe_phy_status;
1655         phy_if->phy_config_aneg = xgbe_phy_config_aneg;
1656
1657         phy_if->phy_valid_speed = xgbe_phy_valid_speed;
1658
1659         phy_if->an_isr          = xgbe_an_combined_isr;
1660
1661         phy_if->module_info     = xgbe_phy_module_info;
1662         phy_if->module_eeprom   = xgbe_phy_module_eeprom;
1663 }