cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xgbe-mdio.c (43822B)


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