Linux Audio

Check our new training course

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