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