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