txc43128_phy.c (16172B)
1// SPDX-License-Identifier: GPL-2.0-only 2/**************************************************************************** 3 * Driver for Solarflare network controllers and boards 4 * Copyright 2006-2011 Solarflare Communications Inc. 5 */ 6 7/* 8 * Driver for Transwitch/Mysticom CX4 retimer 9 * see www.transwitch.com, part is TXC-43128 10 */ 11 12#include <linux/delay.h> 13#include <linux/slab.h> 14#include "efx.h" 15#include "mdio_10g.h" 16#include "phy.h" 17#include "nic.h" 18 19/* We expect these MMDs to be in the package */ 20#define TXC_REQUIRED_DEVS (MDIO_DEVS_PCS | \ 21 MDIO_DEVS_PMAPMD | \ 22 MDIO_DEVS_PHYXS) 23 24#define TXC_LOOPBACKS ((1 << LOOPBACK_PCS) | \ 25 (1 << LOOPBACK_PMAPMD) | \ 26 (1 << LOOPBACK_PHYXS_WS)) 27 28/************************************************************************** 29 * 30 * Compile-time config 31 * 32 ************************************************************************** 33 */ 34#define TXCNAME "TXC43128" 35/* Total length of time we'll wait for the PHY to come out of reset (ms) */ 36#define TXC_MAX_RESET_TIME 500 37/* Interval between checks (ms) */ 38#define TXC_RESET_WAIT 10 39/* How long to run BIST (us) */ 40#define TXC_BIST_DURATION 50 41 42/************************************************************************** 43 * 44 * Register definitions 45 * 46 ************************************************************************** 47 */ 48 49/* Command register */ 50#define TXC_GLRGS_GLCMD 0xc004 51/* Useful bits in command register */ 52/* Lane power-down */ 53#define TXC_GLCMD_L01PD_LBN 5 54#define TXC_GLCMD_L23PD_LBN 6 55/* Limited SW reset: preserves configuration but 56 * initiates a logic reset. Self-clearing */ 57#define TXC_GLCMD_LMTSWRST_LBN 14 58 59/* Signal Quality Control */ 60#define TXC_GLRGS_GSGQLCTL 0xc01a 61/* Enable bit */ 62#define TXC_GSGQLCT_SGQLEN_LBN 15 63/* Lane selection */ 64#define TXC_GSGQLCT_LNSL_LBN 13 65#define TXC_GSGQLCT_LNSL_WIDTH 2 66 67/* Analog TX control */ 68#define TXC_ALRGS_ATXCTL 0xc040 69/* Lane power-down */ 70#define TXC_ATXCTL_TXPD3_LBN 15 71#define TXC_ATXCTL_TXPD2_LBN 14 72#define TXC_ATXCTL_TXPD1_LBN 13 73#define TXC_ATXCTL_TXPD0_LBN 12 74 75/* Amplitude on lanes 0, 1 */ 76#define TXC_ALRGS_ATXAMP0 0xc041 77/* Amplitude on lanes 2, 3 */ 78#define TXC_ALRGS_ATXAMP1 0xc042 79/* Bit position of value for lane 0 (or 2) */ 80#define TXC_ATXAMP_LANE02_LBN 3 81/* Bit position of value for lane 1 (or 3) */ 82#define TXC_ATXAMP_LANE13_LBN 11 83 84#define TXC_ATXAMP_1280_mV 0 85#define TXC_ATXAMP_1200_mV 8 86#define TXC_ATXAMP_1120_mV 12 87#define TXC_ATXAMP_1060_mV 14 88#define TXC_ATXAMP_0820_mV 25 89#define TXC_ATXAMP_0720_mV 26 90#define TXC_ATXAMP_0580_mV 27 91#define TXC_ATXAMP_0440_mV 28 92 93#define TXC_ATXAMP_0820_BOTH \ 94 ((TXC_ATXAMP_0820_mV << TXC_ATXAMP_LANE02_LBN) \ 95 | (TXC_ATXAMP_0820_mV << TXC_ATXAMP_LANE13_LBN)) 96 97#define TXC_ATXAMP_DEFAULT 0x6060 /* From databook */ 98 99/* Preemphasis on lanes 0, 1 */ 100#define TXC_ALRGS_ATXPRE0 0xc043 101/* Preemphasis on lanes 2, 3 */ 102#define TXC_ALRGS_ATXPRE1 0xc044 103 104#define TXC_ATXPRE_NONE 0 105#define TXC_ATXPRE_DEFAULT 0x1010 /* From databook */ 106 107#define TXC_ALRGS_ARXCTL 0xc045 108/* Lane power-down */ 109#define TXC_ARXCTL_RXPD3_LBN 15 110#define TXC_ARXCTL_RXPD2_LBN 14 111#define TXC_ARXCTL_RXPD1_LBN 13 112#define TXC_ARXCTL_RXPD0_LBN 12 113 114/* Main control */ 115#define TXC_MRGS_CTL 0xc340 116/* Bits in main control */ 117#define TXC_MCTL_RESET_LBN 15 /* Self clear */ 118#define TXC_MCTL_TXLED_LBN 14 /* 1 to show align status */ 119#define TXC_MCTL_RXLED_LBN 13 /* 1 to show align status */ 120 121/* GPIO output */ 122#define TXC_GPIO_OUTPUT 0xc346 123#define TXC_GPIO_DIR 0xc348 124 125/* Vendor-specific BIST registers */ 126#define TXC_BIST_CTL 0xc280 127#define TXC_BIST_TXFRMCNT 0xc281 128#define TXC_BIST_RX0FRMCNT 0xc282 129#define TXC_BIST_RX1FRMCNT 0xc283 130#define TXC_BIST_RX2FRMCNT 0xc284 131#define TXC_BIST_RX3FRMCNT 0xc285 132#define TXC_BIST_RX0ERRCNT 0xc286 133#define TXC_BIST_RX1ERRCNT 0xc287 134#define TXC_BIST_RX2ERRCNT 0xc288 135#define TXC_BIST_RX3ERRCNT 0xc289 136 137/* BIST type (controls bit patter in test) */ 138#define TXC_BIST_CTRL_TYPE_LBN 10 139#define TXC_BIST_CTRL_TYPE_TSD 0 /* TranSwitch Deterministic */ 140#define TXC_BIST_CTRL_TYPE_CRP 1 /* CRPAT standard */ 141#define TXC_BIST_CTRL_TYPE_CJP 2 /* CJPAT standard */ 142#define TXC_BIST_CTRL_TYPE_TSR 3 /* TranSwitch pseudo-random */ 143/* Set this to 1 for 10 bit and 0 for 8 bit */ 144#define TXC_BIST_CTRL_B10EN_LBN 12 145/* Enable BIST (write 0 to disable) */ 146#define TXC_BIST_CTRL_ENAB_LBN 13 147/* Stop BIST (self-clears when stop complete) */ 148#define TXC_BIST_CTRL_STOP_LBN 14 149/* Start BIST (cleared by writing 1 to STOP) */ 150#define TXC_BIST_CTRL_STRT_LBN 15 151 152/* Mt. Diablo test configuration */ 153#define TXC_MTDIABLO_CTRL 0xc34f 154#define TXC_MTDIABLO_CTRL_PMA_LOOP_LBN 10 155 156struct txc43128_data { 157 unsigned long bug10934_timer; 158 enum ef4_phy_mode phy_mode; 159 enum ef4_loopback_mode loopback_mode; 160}; 161 162/* The PHY sometimes needs a reset to bring the link back up. So long as 163 * it reports link down, we reset it every 5 seconds. 164 */ 165#define BUG10934_RESET_INTERVAL (5 * HZ) 166 167/* Perform a reset that doesn't clear configuration changes */ 168static void txc_reset_logic(struct ef4_nic *efx); 169 170/* Set the output value of a gpio */ 171void falcon_txc_set_gpio_val(struct ef4_nic *efx, int pin, int on) 172{ 173 ef4_mdio_set_flag(efx, MDIO_MMD_PHYXS, TXC_GPIO_OUTPUT, 1 << pin, on); 174} 175 176/* Set up the GPIO direction register */ 177void falcon_txc_set_gpio_dir(struct ef4_nic *efx, int pin, int dir) 178{ 179 ef4_mdio_set_flag(efx, MDIO_MMD_PHYXS, TXC_GPIO_DIR, 1 << pin, dir); 180} 181 182/* Reset the PMA/PMD MMD. The documentation is explicit that this does a 183 * global reset (it's less clear what reset of other MMDs does).*/ 184static int txc_reset_phy(struct ef4_nic *efx) 185{ 186 int rc = ef4_mdio_reset_mmd(efx, MDIO_MMD_PMAPMD, 187 TXC_MAX_RESET_TIME / TXC_RESET_WAIT, 188 TXC_RESET_WAIT); 189 if (rc < 0) 190 goto fail; 191 192 /* Check that all the MMDs we expect are present and responding. */ 193 rc = ef4_mdio_check_mmds(efx, TXC_REQUIRED_DEVS); 194 if (rc < 0) 195 goto fail; 196 197 return 0; 198 199fail: 200 netif_err(efx, hw, efx->net_dev, TXCNAME ": reset timed out!\n"); 201 return rc; 202} 203 204/* Run a single BIST on one MMD */ 205static int txc_bist_one(struct ef4_nic *efx, int mmd, int test) 206{ 207 int ctrl, bctl; 208 int lane; 209 int rc = 0; 210 211 /* Set PMA to test into loopback using Mt Diablo reg as per app note */ 212 ctrl = ef4_mdio_read(efx, MDIO_MMD_PCS, TXC_MTDIABLO_CTRL); 213 ctrl |= (1 << TXC_MTDIABLO_CTRL_PMA_LOOP_LBN); 214 ef4_mdio_write(efx, MDIO_MMD_PCS, TXC_MTDIABLO_CTRL, ctrl); 215 216 /* The BIST app. note lists these as 3 distinct steps. */ 217 /* Set the BIST type */ 218 bctl = (test << TXC_BIST_CTRL_TYPE_LBN); 219 ef4_mdio_write(efx, mmd, TXC_BIST_CTL, bctl); 220 221 /* Set the BSTEN bit in the BIST Control register to enable */ 222 bctl |= (1 << TXC_BIST_CTRL_ENAB_LBN); 223 ef4_mdio_write(efx, mmd, TXC_BIST_CTL, bctl); 224 225 /* Set the BSTRT bit in the BIST Control register */ 226 ef4_mdio_write(efx, mmd, TXC_BIST_CTL, 227 bctl | (1 << TXC_BIST_CTRL_STRT_LBN)); 228 229 /* Wait. */ 230 udelay(TXC_BIST_DURATION); 231 232 /* Set the BSTOP bit in the BIST Control register */ 233 bctl |= (1 << TXC_BIST_CTRL_STOP_LBN); 234 ef4_mdio_write(efx, mmd, TXC_BIST_CTL, bctl); 235 236 /* The STOP bit should go off when things have stopped */ 237 while (bctl & (1 << TXC_BIST_CTRL_STOP_LBN)) 238 bctl = ef4_mdio_read(efx, mmd, TXC_BIST_CTL); 239 240 /* Check all the error counts are 0 and all the frame counts are 241 non-zero */ 242 for (lane = 0; lane < 4; lane++) { 243 int count = ef4_mdio_read(efx, mmd, TXC_BIST_RX0ERRCNT + lane); 244 if (count != 0) { 245 netif_err(efx, hw, efx->net_dev, TXCNAME": BIST error. " 246 "Lane %d had %d errs\n", lane, count); 247 rc = -EIO; 248 } 249 count = ef4_mdio_read(efx, mmd, TXC_BIST_RX0FRMCNT + lane); 250 if (count == 0) { 251 netif_err(efx, hw, efx->net_dev, TXCNAME": BIST error. " 252 "Lane %d got 0 frames\n", lane); 253 rc = -EIO; 254 } 255 } 256 257 if (rc == 0) 258 netif_info(efx, hw, efx->net_dev, TXCNAME": BIST pass\n"); 259 260 /* Disable BIST */ 261 ef4_mdio_write(efx, mmd, TXC_BIST_CTL, 0); 262 263 /* Turn off loopback */ 264 ctrl &= ~(1 << TXC_MTDIABLO_CTRL_PMA_LOOP_LBN); 265 ef4_mdio_write(efx, MDIO_MMD_PCS, TXC_MTDIABLO_CTRL, ctrl); 266 267 return rc; 268} 269 270static int txc_bist(struct ef4_nic *efx) 271{ 272 return txc_bist_one(efx, MDIO_MMD_PCS, TXC_BIST_CTRL_TYPE_TSD); 273} 274 275/* Push the non-configurable defaults into the PHY. This must be 276 * done after every full reset */ 277static void txc_apply_defaults(struct ef4_nic *efx) 278{ 279 int mctrl; 280 281 /* Turn amplitude down and preemphasis off on the host side 282 * (PHY<->MAC) as this is believed less likely to upset Falcon 283 * and no adverse effects have been noted. It probably also 284 * saves a picowatt or two */ 285 286 /* Turn off preemphasis */ 287 ef4_mdio_write(efx, MDIO_MMD_PHYXS, TXC_ALRGS_ATXPRE0, TXC_ATXPRE_NONE); 288 ef4_mdio_write(efx, MDIO_MMD_PHYXS, TXC_ALRGS_ATXPRE1, TXC_ATXPRE_NONE); 289 290 /* Turn down the amplitude */ 291 ef4_mdio_write(efx, MDIO_MMD_PHYXS, 292 TXC_ALRGS_ATXAMP0, TXC_ATXAMP_0820_BOTH); 293 ef4_mdio_write(efx, MDIO_MMD_PHYXS, 294 TXC_ALRGS_ATXAMP1, TXC_ATXAMP_0820_BOTH); 295 296 /* Set the line side amplitude and preemphasis to the databook 297 * defaults as an erratum causes them to be 0 on at least some 298 * PHY rev.s */ 299 ef4_mdio_write(efx, MDIO_MMD_PMAPMD, 300 TXC_ALRGS_ATXPRE0, TXC_ATXPRE_DEFAULT); 301 ef4_mdio_write(efx, MDIO_MMD_PMAPMD, 302 TXC_ALRGS_ATXPRE1, TXC_ATXPRE_DEFAULT); 303 ef4_mdio_write(efx, MDIO_MMD_PMAPMD, 304 TXC_ALRGS_ATXAMP0, TXC_ATXAMP_DEFAULT); 305 ef4_mdio_write(efx, MDIO_MMD_PMAPMD, 306 TXC_ALRGS_ATXAMP1, TXC_ATXAMP_DEFAULT); 307 308 /* Set up the LEDs */ 309 mctrl = ef4_mdio_read(efx, MDIO_MMD_PHYXS, TXC_MRGS_CTL); 310 311 /* Set the Green and Red LEDs to their default modes */ 312 mctrl &= ~((1 << TXC_MCTL_TXLED_LBN) | (1 << TXC_MCTL_RXLED_LBN)); 313 ef4_mdio_write(efx, MDIO_MMD_PHYXS, TXC_MRGS_CTL, mctrl); 314 315 /* Databook recommends doing this after configuration changes */ 316 txc_reset_logic(efx); 317 318 falcon_board(efx)->type->init_phy(efx); 319} 320 321static int txc43128_phy_probe(struct ef4_nic *efx) 322{ 323 struct txc43128_data *phy_data; 324 325 /* Allocate phy private storage */ 326 phy_data = kzalloc(sizeof(*phy_data), GFP_KERNEL); 327 if (!phy_data) 328 return -ENOMEM; 329 efx->phy_data = phy_data; 330 phy_data->phy_mode = efx->phy_mode; 331 332 efx->mdio.mmds = TXC_REQUIRED_DEVS; 333 efx->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22; 334 335 efx->loopback_modes = TXC_LOOPBACKS | FALCON_XMAC_LOOPBACKS; 336 337 return 0; 338} 339 340/* Initialisation entry point for this PHY driver */ 341static int txc43128_phy_init(struct ef4_nic *efx) 342{ 343 int rc; 344 345 rc = txc_reset_phy(efx); 346 if (rc < 0) 347 return rc; 348 349 rc = txc_bist(efx); 350 if (rc < 0) 351 return rc; 352 353 txc_apply_defaults(efx); 354 355 return 0; 356} 357 358/* Set the lane power down state in the global registers */ 359static void txc_glrgs_lane_power(struct ef4_nic *efx, int mmd) 360{ 361 int pd = (1 << TXC_GLCMD_L01PD_LBN) | (1 << TXC_GLCMD_L23PD_LBN); 362 int ctl = ef4_mdio_read(efx, mmd, TXC_GLRGS_GLCMD); 363 364 if (!(efx->phy_mode & PHY_MODE_LOW_POWER)) 365 ctl &= ~pd; 366 else 367 ctl |= pd; 368 369 ef4_mdio_write(efx, mmd, TXC_GLRGS_GLCMD, ctl); 370} 371 372/* Set the lane power down state in the analog control registers */ 373static void txc_analog_lane_power(struct ef4_nic *efx, int mmd) 374{ 375 int txpd = (1 << TXC_ATXCTL_TXPD3_LBN) | (1 << TXC_ATXCTL_TXPD2_LBN) 376 | (1 << TXC_ATXCTL_TXPD1_LBN) | (1 << TXC_ATXCTL_TXPD0_LBN); 377 int rxpd = (1 << TXC_ARXCTL_RXPD3_LBN) | (1 << TXC_ARXCTL_RXPD2_LBN) 378 | (1 << TXC_ARXCTL_RXPD1_LBN) | (1 << TXC_ARXCTL_RXPD0_LBN); 379 int txctl = ef4_mdio_read(efx, mmd, TXC_ALRGS_ATXCTL); 380 int rxctl = ef4_mdio_read(efx, mmd, TXC_ALRGS_ARXCTL); 381 382 if (!(efx->phy_mode & PHY_MODE_LOW_POWER)) { 383 txctl &= ~txpd; 384 rxctl &= ~rxpd; 385 } else { 386 txctl |= txpd; 387 rxctl |= rxpd; 388 } 389 390 ef4_mdio_write(efx, mmd, TXC_ALRGS_ATXCTL, txctl); 391 ef4_mdio_write(efx, mmd, TXC_ALRGS_ARXCTL, rxctl); 392} 393 394static void txc_set_power(struct ef4_nic *efx) 395{ 396 /* According to the data book, all the MMDs can do low power */ 397 ef4_mdio_set_mmds_lpower(efx, 398 !!(efx->phy_mode & PHY_MODE_LOW_POWER), 399 TXC_REQUIRED_DEVS); 400 401 /* Global register bank is in PCS, PHY XS. These control the host 402 * side and line side settings respectively. */ 403 txc_glrgs_lane_power(efx, MDIO_MMD_PCS); 404 txc_glrgs_lane_power(efx, MDIO_MMD_PHYXS); 405 406 /* Analog register bank in PMA/PMD, PHY XS */ 407 txc_analog_lane_power(efx, MDIO_MMD_PMAPMD); 408 txc_analog_lane_power(efx, MDIO_MMD_PHYXS); 409} 410 411static void txc_reset_logic_mmd(struct ef4_nic *efx, int mmd) 412{ 413 int val = ef4_mdio_read(efx, mmd, TXC_GLRGS_GLCMD); 414 int tries = 50; 415 416 val |= (1 << TXC_GLCMD_LMTSWRST_LBN); 417 ef4_mdio_write(efx, mmd, TXC_GLRGS_GLCMD, val); 418 while (--tries) { 419 val = ef4_mdio_read(efx, mmd, TXC_GLRGS_GLCMD); 420 if (!(val & (1 << TXC_GLCMD_LMTSWRST_LBN))) 421 break; 422 udelay(1); 423 } 424 if (!tries) 425 netif_info(efx, hw, efx->net_dev, 426 TXCNAME " Logic reset timed out!\n"); 427} 428 429/* Perform a logic reset. This preserves the configuration registers 430 * and is needed for some configuration changes to take effect */ 431static void txc_reset_logic(struct ef4_nic *efx) 432{ 433 /* The data sheet claims we can do the logic reset on either the 434 * PCS or the PHYXS and the result is a reset of both host- and 435 * line-side logic. */ 436 txc_reset_logic_mmd(efx, MDIO_MMD_PCS); 437} 438 439static bool txc43128_phy_read_link(struct ef4_nic *efx) 440{ 441 return ef4_mdio_links_ok(efx, TXC_REQUIRED_DEVS); 442} 443 444static int txc43128_phy_reconfigure(struct ef4_nic *efx) 445{ 446 struct txc43128_data *phy_data = efx->phy_data; 447 enum ef4_phy_mode mode_change = efx->phy_mode ^ phy_data->phy_mode; 448 bool loop_change = LOOPBACK_CHANGED(phy_data, efx, TXC_LOOPBACKS); 449 450 if (efx->phy_mode & mode_change & PHY_MODE_TX_DISABLED) { 451 txc_reset_phy(efx); 452 txc_apply_defaults(efx); 453 falcon_reset_xaui(efx); 454 mode_change &= ~PHY_MODE_TX_DISABLED; 455 } 456 457 ef4_mdio_transmit_disable(efx); 458 ef4_mdio_phy_reconfigure(efx); 459 if (mode_change & PHY_MODE_LOW_POWER) 460 txc_set_power(efx); 461 462 /* The data sheet claims this is required after every reconfiguration 463 * (note at end of 7.1), but we mustn't do it when nothing changes as 464 * it glitches the link, and reconfigure gets called on link change, 465 * so we get an IRQ storm on link up. */ 466 if (loop_change || mode_change) 467 txc_reset_logic(efx); 468 469 phy_data->phy_mode = efx->phy_mode; 470 phy_data->loopback_mode = efx->loopback_mode; 471 472 return 0; 473} 474 475static void txc43128_phy_fini(struct ef4_nic *efx) 476{ 477 /* Disable link events */ 478 ef4_mdio_write(efx, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_CTRL, 0); 479} 480 481static void txc43128_phy_remove(struct ef4_nic *efx) 482{ 483 kfree(efx->phy_data); 484 efx->phy_data = NULL; 485} 486 487/* Periodic callback: this exists mainly to poll link status as we 488 * don't use LASI interrupts */ 489static bool txc43128_phy_poll(struct ef4_nic *efx) 490{ 491 struct txc43128_data *data = efx->phy_data; 492 bool was_up = efx->link_state.up; 493 494 efx->link_state.up = txc43128_phy_read_link(efx); 495 efx->link_state.speed = 10000; 496 efx->link_state.fd = true; 497 efx->link_state.fc = efx->wanted_fc; 498 499 if (efx->link_state.up || (efx->loopback_mode != LOOPBACK_NONE)) { 500 data->bug10934_timer = jiffies; 501 } else { 502 if (time_after_eq(jiffies, (data->bug10934_timer + 503 BUG10934_RESET_INTERVAL))) { 504 data->bug10934_timer = jiffies; 505 txc_reset_logic(efx); 506 } 507 } 508 509 return efx->link_state.up != was_up; 510} 511 512static const char *const txc43128_test_names[] = { 513 "bist" 514}; 515 516static const char *txc43128_test_name(struct ef4_nic *efx, unsigned int index) 517{ 518 if (index < ARRAY_SIZE(txc43128_test_names)) 519 return txc43128_test_names[index]; 520 return NULL; 521} 522 523static int txc43128_run_tests(struct ef4_nic *efx, int *results, unsigned flags) 524{ 525 int rc; 526 527 if (!(flags & ETH_TEST_FL_OFFLINE)) 528 return 0; 529 530 rc = txc_reset_phy(efx); 531 if (rc < 0) 532 return rc; 533 534 rc = txc_bist(efx); 535 txc_apply_defaults(efx); 536 results[0] = rc ? -1 : 1; 537 return rc; 538} 539 540static void txc43128_get_link_ksettings(struct ef4_nic *efx, 541 struct ethtool_link_ksettings *cmd) 542{ 543 mdio45_ethtool_ksettings_get(&efx->mdio, cmd); 544} 545 546const struct ef4_phy_operations falcon_txc_phy_ops = { 547 .probe = txc43128_phy_probe, 548 .init = txc43128_phy_init, 549 .reconfigure = txc43128_phy_reconfigure, 550 .poll = txc43128_phy_poll, 551 .fini = txc43128_phy_fini, 552 .remove = txc43128_phy_remove, 553 .get_link_ksettings = txc43128_get_link_ksettings, 554 .set_link_ksettings = ef4_mdio_set_link_ksettings, 555 .test_alive = ef4_mdio_test_alive, 556 .run_tests = txc43128_run_tests, 557 .test_name = txc43128_test_name, 558};