1167514Skmacy/************************************************************************** 2167514Skmacy 3189643SgnnCopyright (c) 2007-2009, Chelsio Inc. 4167514SkmacyAll rights reserved. 5167514Skmacy 6167514SkmacyRedistribution and use in source and binary forms, with or without 7167514Skmacymodification, are permitted provided that the following conditions are met: 8167514Skmacy 9167514Skmacy 1. Redistributions of source code must retain the above copyright notice, 10167514Skmacy this list of conditions and the following disclaimer. 11167514Skmacy 12170076Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its 13167514Skmacy contributors may be used to endorse or promote products derived from 14167514Skmacy this software without specific prior written permission. 15167514Skmacy 16167514SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17167514SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18167514SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19167514SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20167514SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21167514SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22167514SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23167514SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24167514SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25167514SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26167514SkmacyPOSSIBILITY OF SUCH DAMAGE. 27167514Skmacy 28167514Skmacy***************************************************************************/ 29167514Skmacy 30167514Skmacy#include <sys/cdefs.h> 31167514Skmacy__FBSDID("$FreeBSD: releng/10.2/sys/dev/cxgb/common/cxgb_ael1002.c 277343 2015-01-18 20:38:38Z np $"); 32167514Skmacy 33170076Skmacy#include <cxgb_include.h> 34167514Skmacy 35176472Skmacy#undef msleep 36176472Skmacy#define msleep t3_os_sleep 37176472Skmacy 38167514Skmacyenum { 39181614Skmacy PMD_RSD = 10, /* PMA/PMD receive signal detect register */ 40181614Skmacy PCS_STAT1_X = 24, /* 10GBASE-X PCS status 1 register */ 41181614Skmacy PCS_STAT1_R = 32, /* 10GBASE-R PCS status 1 register */ 42181614Skmacy XS_LN_STAT = 24 /* XS lane status register */ 43181614Skmacy}; 44181614Skmacy 45181614Skmacyenum { 46167514Skmacy AEL100X_TX_DISABLE = 9, 47167514Skmacy AEL100X_TX_CONFIG1 = 0xc002, 48197791Snp 49167514Skmacy AEL1002_PWR_DOWN_HI = 0xc011, 50167514Skmacy AEL1002_PWR_DOWN_LO = 0xc012, 51167514Skmacy AEL1002_XFI_EQL = 0xc015, 52167514Skmacy AEL1002_LB_EN = 0xc017, 53197791Snp 54180583Skmacy AEL_OPT_SETTINGS = 0xc017, 55181614Skmacy AEL_I2C_CTRL = 0xc30a, 56181614Skmacy AEL_I2C_DATA = 0xc30b, 57181614Skmacy AEL_I2C_STAT = 0xc30c, 58197791Snp 59181614Skmacy AEL2005_GPIO_CTRL = 0xc214, 60181614Skmacy AEL2005_GPIO_STAT = 0xc215, 61197791Snp 62197791Snp AEL2020_GPIO_INTR = 0xc103, 63197791Snp AEL2020_GPIO_CTRL = 0xc108, 64197791Snp AEL2020_GPIO_STAT = 0xc10c, 65197791Snp AEL2020_GPIO_CFG = 0xc110, 66197791Snp 67197791Snp AEL2020_GPIO_SDA = 0, 68197791Snp AEL2020_GPIO_MODDET = 1, 69197791Snp AEL2020_GPIO_0 = 3, 70197791Snp AEL2020_GPIO_1 = 2, 71197791Snp AEL2020_GPIO_LSTAT = AEL2020_GPIO_1, 72180583Skmacy}; 73167514Skmacy 74181614Skmacyenum { edc_none, edc_sr, edc_twinax }; 75181614Skmacy 76181614Skmacy/* PHY module I2C device address */ 77189643Sgnnenum { 78189643Sgnn MODULE_DEV_ADDR = 0xa0, 79189643Sgnn SFF_DEV_ADDR = 0xa2, 80189643Sgnn}; 81181614Skmacy 82189643Sgnn/* PHY transceiver type */ 83189643Sgnnenum { 84189643Sgnn phy_transtype_unknown = 0, 85189643Sgnn phy_transtype_sfp = 3, 86189643Sgnn phy_transtype_xfp = 6, 87189643Sgnn}; 88189643Sgnn 89181614Skmacy#define AEL2005_MODDET_IRQ 4 90181614Skmacy 91180583Skmacystruct reg_val { 92180583Skmacy unsigned short mmd_addr; 93180583Skmacy unsigned short reg_addr; 94180583Skmacy unsigned short clear_bits; 95180583Skmacy unsigned short set_bits; 96167514Skmacy}; 97167514Skmacy 98197791Snpstatic int ael2xxx_get_module_type(struct cphy *phy, int delay_ms); 99186282Sgnn 100180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv) 101180583Skmacy{ 102180583Skmacy int err; 103180583Skmacy 104180583Skmacy for (err = 0; rv->mmd_addr && !err; rv++) { 105180583Skmacy if (rv->clear_bits == 0xffff) 106180583Skmacy err = mdio_write(phy, rv->mmd_addr, rv->reg_addr, 107180583Skmacy rv->set_bits); 108180583Skmacy else 109180583Skmacy err = t3_mdio_change_bits(phy, rv->mmd_addr, 110180583Skmacy rv->reg_addr, rv->clear_bits, 111180583Skmacy rv->set_bits); 112180583Skmacy } 113180583Skmacy return err; 114180583Skmacy} 115180583Skmacy 116167514Skmacystatic void ael100x_txon(struct cphy *phy) 117167514Skmacy{ 118167514Skmacy int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL; 119167514Skmacy 120176472Skmacy msleep(100); 121167514Skmacy t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio); 122176472Skmacy msleep(30); 123167514Skmacy} 124167514Skmacy 125197791Snp/* 126197791Snp * Read an 8-bit word from a device attached to the PHY's i2c bus. 127197791Snp */ 128189643Sgnnstatic int ael_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) 129189643Sgnn{ 130189643Sgnn int i, err; 131189643Sgnn unsigned int stat, data; 132189643Sgnn 133189643Sgnn err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL, 134189643Sgnn (dev_addr << 8) | (1 << 8) | word_addr); 135189643Sgnn if (err) 136189643Sgnn return err; 137189643Sgnn 138189643Sgnn for (i = 0; i < 200; i++) { 139189643Sgnn msleep(1); 140189643Sgnn err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat); 141189643Sgnn if (err) 142189643Sgnn return err; 143189643Sgnn if ((stat & 3) == 1) { 144189643Sgnn err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, 145189643Sgnn &data); 146189643Sgnn if (err) 147189643Sgnn return err; 148189643Sgnn return data >> 8; 149189643Sgnn } 150189643Sgnn } 151197791Snp CH_WARN(phy->adapter, "PHY %u i2c read of dev.addr %x.%x timed out\n", 152197791Snp phy->addr, dev_addr, word_addr); 153189643Sgnn return -ETIMEDOUT; 154189643Sgnn} 155189643Sgnn 156197791Snp/* 157197791Snp * Write an 8-bit word to a device attached to the PHY's i2c bus. 158197791Snp */ 159189643Sgnnstatic int ael_i2c_wr(struct cphy *phy, int dev_addr, int word_addr, int data) 160189643Sgnn{ 161189643Sgnn int i, err; 162189643Sgnn unsigned int stat; 163189643Sgnn 164189643Sgnn err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, data); 165189643Sgnn if (err) 166189643Sgnn return err; 167189643Sgnn 168189643Sgnn err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL, 169189643Sgnn (dev_addr << 8) | word_addr); 170189643Sgnn if (err) 171189643Sgnn return err; 172189643Sgnn 173189643Sgnn for (i = 0; i < 200; i++) { 174189643Sgnn msleep(1); 175189643Sgnn err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat); 176189643Sgnn if (err) 177189643Sgnn return err; 178189643Sgnn if ((stat & 3) == 1) 179189643Sgnn return 0; 180189643Sgnn } 181197791Snp CH_WARN(phy->adapter, "PHY %u i2c Write of dev.addr %x.%x = %#x timed out\n", 182197791Snp phy->addr, dev_addr, word_addr, data); 183189643Sgnn return -ETIMEDOUT; 184189643Sgnn} 185189643Sgnn 186189643Sgnnstatic int get_phytrans_type(struct cphy *phy) 187189643Sgnn{ 188189643Sgnn int v; 189189643Sgnn 190189643Sgnn v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0); 191189643Sgnn if (v < 0) 192189643Sgnn return phy_transtype_unknown; 193189643Sgnn 194189643Sgnn return v; 195189643Sgnn} 196189643Sgnn 197189643Sgnnstatic int ael_laser_down(struct cphy *phy, int enable) 198189643Sgnn{ 199189643Sgnn int v, dev_addr; 200189643Sgnn 201189643Sgnn v = get_phytrans_type(phy); 202189643Sgnn if (v < 0) 203189643Sgnn return v; 204189643Sgnn 205189643Sgnn if (v == phy_transtype_sfp) { 206189643Sgnn /* Check SFF Soft TX disable is supported */ 207189643Sgnn v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 93); 208189643Sgnn if (v < 0) 209189643Sgnn return v; 210189643Sgnn 211189643Sgnn v &= 0x40; 212189643Sgnn if (!v) 213189643Sgnn return v; 214189643Sgnn 215189643Sgnn dev_addr = SFF_DEV_ADDR; 216189643Sgnn } else if (v == phy_transtype_xfp) 217189643Sgnn dev_addr = MODULE_DEV_ADDR; 218189643Sgnn else 219189643Sgnn return v; 220189643Sgnn 221189643Sgnn v = ael_i2c_rd(phy, dev_addr, 110); 222189643Sgnn if (v < 0) 223189643Sgnn return v; 224189643Sgnn 225189643Sgnn if (enable) 226189643Sgnn v |= 0x40; 227189643Sgnn else 228189643Sgnn v &= ~0x40; 229189643Sgnn 230189643Sgnn v = ael_i2c_wr(phy, dev_addr, 110, v); 231189643Sgnn 232189643Sgnn return v; 233189643Sgnn} 234189643Sgnn 235167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable) 236167514Skmacy{ 237167514Skmacy int err; 238167514Skmacy 239167514Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable); 240167514Skmacy if (!err) 241167514Skmacy err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 242167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 243167514Skmacy return err; 244167514Skmacy} 245167514Skmacy 246186282Sgnnstatic int ael1002_get_module_type(struct cphy *phy, int delay_ms) 247186282Sgnn{ 248186282Sgnn int v; 249186282Sgnn 250186282Sgnn if (delay_ms) 251186282Sgnn msleep(delay_ms); 252186282Sgnn 253197791Snp v = ael2xxx_get_module_type(phy, delay_ms); 254186282Sgnn 255197791Snp return (v == -ETIMEDOUT ? phy_modtype_none : v); 256186282Sgnn} 257186282Sgnn 258167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait) 259167514Skmacy{ 260167514Skmacy int err; 261167514Skmacy 262167514Skmacy if ((err = ael1002_power_down(phy, 0)) || 263167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) || 264167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) || 265167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) || 266167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) || 267167514Skmacy (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN, 268167514Skmacy 0, 1 << 5))) 269167514Skmacy return err; 270186282Sgnn 271186282Sgnn err = ael1002_get_module_type(phy, 300); 272186282Sgnn if (err >= 0) 273186282Sgnn phy->modtype = err; 274186282Sgnn 275167514Skmacy return 0; 276167514Skmacy} 277167514Skmacy 278167514Skmacystatic int ael1002_intr_noop(struct cphy *phy) 279167514Skmacy{ 280167514Skmacy return 0; 281167514Skmacy} 282167514Skmacy 283181614Skmacy/* 284181614Skmacy * Get link status for a 10GBASE-R device. 285181614Skmacy */ 286277343Snpstatic int get_link_status_r(struct cphy *phy, int *link_state, int *speed, 287181614Skmacy int *duplex, int *fc) 288167514Skmacy{ 289277343Snp if (link_state) { 290181614Skmacy unsigned int stat0, stat1, stat2; 291181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 292167514Skmacy 293181614Skmacy if (!err) 294181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1); 295181614Skmacy if (!err) 296181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 297167514Skmacy if (err) 298167514Skmacy return err; 299209841Snp 300277343Snp stat0 &= 1; 301277343Snp stat1 &= 1; 302277343Snp stat2 = (stat2 >> 12) & 1; 303277343Snp if (stat0 & stat1 & stat2) 304277343Snp *link_state = PHY_LINK_UP; 305277343Snp else if (stat0 == 1 && stat1 == 0 && stat2 == 1) 306277343Snp *link_state = PHY_LINK_PARTIAL; 307277343Snp else 308277343Snp *link_state = PHY_LINK_DOWN; 309167514Skmacy } 310167514Skmacy if (speed) 311167514Skmacy *speed = SPEED_10000; 312167514Skmacy if (duplex) 313167514Skmacy *duplex = DUPLEX_FULL; 314167514Skmacy return 0; 315167514Skmacy} 316167514Skmacy 317167514Skmacy#ifdef C99_NOT_SUPPORTED 318167514Skmacystatic struct cphy_ops ael1002_ops = { 319167514Skmacy ael1002_reset, 320167514Skmacy ael1002_intr_noop, 321167514Skmacy ael1002_intr_noop, 322167514Skmacy ael1002_intr_noop, 323167514Skmacy ael1002_intr_noop, 324167514Skmacy NULL, 325167514Skmacy NULL, 326167514Skmacy NULL, 327167514Skmacy NULL, 328167514Skmacy NULL, 329181614Skmacy get_link_status_r, 330167514Skmacy ael1002_power_down, 331167514Skmacy}; 332167514Skmacy#else 333167514Skmacystatic struct cphy_ops ael1002_ops = { 334167514Skmacy .reset = ael1002_reset, 335167514Skmacy .intr_enable = ael1002_intr_noop, 336167514Skmacy .intr_disable = ael1002_intr_noop, 337167514Skmacy .intr_clear = ael1002_intr_noop, 338167514Skmacy .intr_handler = ael1002_intr_noop, 339181614Skmacy .get_link_status = get_link_status_r, 340167514Skmacy .power_down = ael1002_power_down, 341167514Skmacy}; 342167514Skmacy#endif 343167514Skmacy 344197791Snpint t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr, 345176472Skmacy const struct mdio_ops *mdio_ops) 346167514Skmacy{ 347186282Sgnn int err; 348197791Snp struct cphy *phy = &pinfo->phy; 349186282Sgnn 350197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1002_ops, mdio_ops, 351176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 352177340Skmacy "10GBASE-R"); 353167514Skmacy ael100x_txon(phy); 354189643Sgnn ael_laser_down(phy, 0); 355186282Sgnn 356186282Sgnn err = ael1002_get_module_type(phy, 0); 357186282Sgnn if (err >= 0) 358186282Sgnn phy->modtype = err; 359186282Sgnn 360176472Skmacy return 0; 361167514Skmacy} 362167514Skmacy 363167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait) 364167514Skmacy{ 365189643Sgnn int err; 366189643Sgnn 367189643Sgnn err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 368189643Sgnn if (err) 369189643Sgnn return err; 370189643Sgnn 371189643Sgnn t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 372189643Sgnn F_GPIO6_OUT_VAL, 0); 373189643Sgnn 374185157Sgnn msleep(125); 375189643Sgnn 376189643Sgnn t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 377189643Sgnn F_GPIO6_OUT_VAL, F_GPIO6_OUT_VAL); 378189643Sgnn 379185157Sgnn msleep(125); 380185620Sgnn 381189643Sgnn err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 382189643Sgnn if (err) 383189643Sgnn return err; 384185620Sgnn 385189643Sgnn msleep(125); 386189643Sgnn 387189643Sgnn err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 1); 388189643Sgnn if (err) 389189643Sgnn return err; 390189643Sgnn 391189643Sgnn msleep(125); 392189643Sgnn 393189643Sgnn err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0); 394189643Sgnn 395189643Sgnn return err; 396189643Sgnn 397167514Skmacy} 398167514Skmacy 399167514Skmacy#ifdef C99_NOT_SUPPORTED 400167514Skmacystatic struct cphy_ops ael1006_ops = { 401167514Skmacy ael1006_reset, 402180583Skmacy t3_phy_lasi_intr_enable, 403180583Skmacy t3_phy_lasi_intr_disable, 404180583Skmacy t3_phy_lasi_intr_clear, 405180583Skmacy t3_phy_lasi_intr_handler, 406167514Skmacy NULL, 407167514Skmacy NULL, 408167514Skmacy NULL, 409167514Skmacy NULL, 410167514Skmacy NULL, 411181614Skmacy get_link_status_r, 412197791Snp ael1002_power_down, 413167514Skmacy}; 414167514Skmacy#else 415167514Skmacystatic struct cphy_ops ael1006_ops = { 416167514Skmacy .reset = ael1006_reset, 417180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 418180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 419180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 420180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 421181614Skmacy .get_link_status = get_link_status_r, 422197791Snp .power_down = ael1002_power_down, 423167514Skmacy}; 424167514Skmacy#endif 425167514Skmacy 426197791Snpint t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr, 427176472Skmacy const struct mdio_ops *mdio_ops) 428167514Skmacy{ 429197791Snp struct cphy *phy = &pinfo->phy; 430197791Snp 431197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1006_ops, mdio_ops, 432176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 433176472Skmacy "10GBASE-SR"); 434197791Snp phy->modtype = phy_modtype_sr; 435167514Skmacy ael100x_txon(phy); 436176472Skmacy return 0; 437167514Skmacy} 438167514Skmacy 439197791Snp/* 440197791Snp * Decode our module type. 441197791Snp */ 442197791Snpstatic int ael2xxx_get_module_type(struct cphy *phy, int delay_ms) 443197791Snp{ 444197791Snp int v; 445197791Snp 446197791Snp if (delay_ms) 447197791Snp msleep(delay_ms); 448197791Snp 449197791Snp v = get_phytrans_type(phy); 450197791Snp if (v == phy_transtype_sfp) { 451197791Snp /* SFP: see SFF-8472 for below */ 452197791Snp 453197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3); 454197791Snp if (v < 0) 455197791Snp return v; 456197791Snp 457197791Snp if (v == 0x1) 458204921Snp goto twinax; 459197791Snp if (v == 0x10) 460197791Snp return phy_modtype_sr; 461197791Snp if (v == 0x20) 462197791Snp return phy_modtype_lr; 463197791Snp if (v == 0x40) 464197791Snp return phy_modtype_lrm; 465197791Snp 466204921Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 8); 467204921Snp if (v < 0) 468204921Snp return v; 469204921Snp if (v == 4) { 470204921Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 60); 471204921Snp if (v < 0) 472204921Snp return v; 473204921Snp if (v & 0x1) 474204921Snp goto twinax; 475204921Snp } 476204921Snp 477197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6); 478197791Snp if (v < 0) 479197791Snp return v; 480197791Snp if (v != 4) 481197791Snp return phy_modtype_unknown; 482197791Snp 483197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10); 484197791Snp if (v < 0) 485197791Snp return v; 486197791Snp 487197791Snp if (v & 0x80) { 488204921Snptwinax: 489197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); 490197791Snp if (v < 0) 491197791Snp return v; 492197791Snp return v > 10 ? phy_modtype_twinax_long : 493197791Snp phy_modtype_twinax; 494197791Snp } 495197791Snp } else if (v == phy_transtype_xfp) { 496197791Snp /* XFP: See INF-8077i for details. */ 497197791Snp 498197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127); 499197791Snp if (v < 0) 500197791Snp return v; 501197791Snp 502197791Snp if (v != 1) { 503197791Snp /* XXX: set page select to table 1 yourself */ 504197791Snp return phy_modtype_unknown; 505197791Snp } 506197791Snp 507197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131); 508197791Snp if (v < 0) 509197791Snp return v; 510197791Snp v &= 0xf0; 511197791Snp if (v == 0x10) 512197791Snp return phy_modtype_lrm; 513197791Snp if (v == 0x40) 514197791Snp return phy_modtype_lr; 515197791Snp if (v == 0x80) 516197791Snp return phy_modtype_sr; 517197791Snp } 518197791Snp 519197791Snp return phy_modtype_unknown; 520197791Snp} 521197791Snp 522197791Snp/* 523197791Snp * Code to support the Aeluros/NetLogic 2005 10Gb PHY. 524197791Snp */ 525180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 526180583Skmacy{ 527181614Skmacy static struct reg_val regs[] = { 528181614Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 529181614Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 530181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 531181614Skmacy { 0, 0, 0, 0 } 532181614Skmacy }; 533180583Skmacy static u16 sr_edc[] = { 534180583Skmacy 0xcc00, 0x2ff4, 535180583Skmacy 0xcc01, 0x3cd4, 536180583Skmacy 0xcc02, 0x2015, 537180583Skmacy 0xcc03, 0x3105, 538180583Skmacy 0xcc04, 0x6524, 539180583Skmacy 0xcc05, 0x27ff, 540180583Skmacy 0xcc06, 0x300f, 541180583Skmacy 0xcc07, 0x2c8b, 542180583Skmacy 0xcc08, 0x300b, 543180583Skmacy 0xcc09, 0x4009, 544180583Skmacy 0xcc0a, 0x400e, 545180583Skmacy 0xcc0b, 0x2f72, 546180583Skmacy 0xcc0c, 0x3002, 547180583Skmacy 0xcc0d, 0x1002, 548180583Skmacy 0xcc0e, 0x2172, 549180583Skmacy 0xcc0f, 0x3012, 550180583Skmacy 0xcc10, 0x1002, 551180583Skmacy 0xcc11, 0x25d2, 552180583Skmacy 0xcc12, 0x3012, 553180583Skmacy 0xcc13, 0x1002, 554180583Skmacy 0xcc14, 0xd01e, 555180583Skmacy 0xcc15, 0x27d2, 556180583Skmacy 0xcc16, 0x3012, 557180583Skmacy 0xcc17, 0x1002, 558180583Skmacy 0xcc18, 0x2004, 559180583Skmacy 0xcc19, 0x3c84, 560180583Skmacy 0xcc1a, 0x6436, 561180583Skmacy 0xcc1b, 0x2007, 562180583Skmacy 0xcc1c, 0x3f87, 563180583Skmacy 0xcc1d, 0x8676, 564180583Skmacy 0xcc1e, 0x40b7, 565180583Skmacy 0xcc1f, 0xa746, 566180583Skmacy 0xcc20, 0x4047, 567180583Skmacy 0xcc21, 0x5673, 568180583Skmacy 0xcc22, 0x2982, 569180583Skmacy 0xcc23, 0x3002, 570180583Skmacy 0xcc24, 0x13d2, 571180583Skmacy 0xcc25, 0x8bbd, 572180583Skmacy 0xcc26, 0x2862, 573180583Skmacy 0xcc27, 0x3012, 574180583Skmacy 0xcc28, 0x1002, 575180583Skmacy 0xcc29, 0x2092, 576180583Skmacy 0xcc2a, 0x3012, 577180583Skmacy 0xcc2b, 0x1002, 578180583Skmacy 0xcc2c, 0x5cc3, 579180583Skmacy 0xcc2d, 0x314, 580180583Skmacy 0xcc2e, 0x2942, 581180583Skmacy 0xcc2f, 0x3002, 582180583Skmacy 0xcc30, 0x1002, 583180583Skmacy 0xcc31, 0xd019, 584180583Skmacy 0xcc32, 0x2032, 585180583Skmacy 0xcc33, 0x3012, 586180583Skmacy 0xcc34, 0x1002, 587180583Skmacy 0xcc35, 0x2a04, 588180583Skmacy 0xcc36, 0x3c74, 589180583Skmacy 0xcc37, 0x6435, 590180583Skmacy 0xcc38, 0x2fa4, 591180583Skmacy 0xcc39, 0x3cd4, 592180583Skmacy 0xcc3a, 0x6624, 593180583Skmacy 0xcc3b, 0x5563, 594180583Skmacy 0xcc3c, 0x2d42, 595180583Skmacy 0xcc3d, 0x3002, 596180583Skmacy 0xcc3e, 0x13d2, 597180583Skmacy 0xcc3f, 0x464d, 598180583Skmacy 0xcc40, 0x2862, 599180583Skmacy 0xcc41, 0x3012, 600180583Skmacy 0xcc42, 0x1002, 601180583Skmacy 0xcc43, 0x2032, 602180583Skmacy 0xcc44, 0x3012, 603180583Skmacy 0xcc45, 0x1002, 604180583Skmacy 0xcc46, 0x2fb4, 605180583Skmacy 0xcc47, 0x3cd4, 606180583Skmacy 0xcc48, 0x6624, 607180583Skmacy 0xcc49, 0x5563, 608180583Skmacy 0xcc4a, 0x2d42, 609180583Skmacy 0xcc4b, 0x3002, 610180583Skmacy 0xcc4c, 0x13d2, 611180583Skmacy 0xcc4d, 0x2ed2, 612180583Skmacy 0xcc4e, 0x3002, 613180583Skmacy 0xcc4f, 0x1002, 614180583Skmacy 0xcc50, 0x2fd2, 615180583Skmacy 0xcc51, 0x3002, 616180583Skmacy 0xcc52, 0x1002, 617180583Skmacy 0xcc53, 0x004, 618180583Skmacy 0xcc54, 0x2942, 619180583Skmacy 0xcc55, 0x3002, 620180583Skmacy 0xcc56, 0x1002, 621180583Skmacy 0xcc57, 0x2092, 622180583Skmacy 0xcc58, 0x3012, 623180583Skmacy 0xcc59, 0x1002, 624180583Skmacy 0xcc5a, 0x5cc3, 625180583Skmacy 0xcc5b, 0x317, 626180583Skmacy 0xcc5c, 0x2f72, 627180583Skmacy 0xcc5d, 0x3002, 628180583Skmacy 0xcc5e, 0x1002, 629180583Skmacy 0xcc5f, 0x2942, 630180583Skmacy 0xcc60, 0x3002, 631180583Skmacy 0xcc61, 0x1002, 632180583Skmacy 0xcc62, 0x22cd, 633180583Skmacy 0xcc63, 0x301d, 634180583Skmacy 0xcc64, 0x2862, 635180583Skmacy 0xcc65, 0x3012, 636180583Skmacy 0xcc66, 0x1002, 637180583Skmacy 0xcc67, 0x2ed2, 638180583Skmacy 0xcc68, 0x3002, 639180583Skmacy 0xcc69, 0x1002, 640180583Skmacy 0xcc6a, 0x2d72, 641180583Skmacy 0xcc6b, 0x3002, 642180583Skmacy 0xcc6c, 0x1002, 643180583Skmacy 0xcc6d, 0x628f, 644180583Skmacy 0xcc6e, 0x2112, 645180583Skmacy 0xcc6f, 0x3012, 646180583Skmacy 0xcc70, 0x1002, 647180583Skmacy 0xcc71, 0x5aa3, 648180583Skmacy 0xcc72, 0x2dc2, 649180583Skmacy 0xcc73, 0x3002, 650180583Skmacy 0xcc74, 0x1312, 651180583Skmacy 0xcc75, 0x6f72, 652180583Skmacy 0xcc76, 0x1002, 653180583Skmacy 0xcc77, 0x2807, 654180583Skmacy 0xcc78, 0x31a7, 655180583Skmacy 0xcc79, 0x20c4, 656180583Skmacy 0xcc7a, 0x3c24, 657180583Skmacy 0xcc7b, 0x6724, 658180583Skmacy 0xcc7c, 0x1002, 659180583Skmacy 0xcc7d, 0x2807, 660180583Skmacy 0xcc7e, 0x3187, 661180583Skmacy 0xcc7f, 0x20c4, 662180583Skmacy 0xcc80, 0x3c24, 663180583Skmacy 0xcc81, 0x6724, 664180583Skmacy 0xcc82, 0x1002, 665180583Skmacy 0xcc83, 0x2514, 666180583Skmacy 0xcc84, 0x3c64, 667180583Skmacy 0xcc85, 0x6436, 668180583Skmacy 0xcc86, 0xdff4, 669180583Skmacy 0xcc87, 0x6436, 670180583Skmacy 0xcc88, 0x1002, 671180583Skmacy 0xcc89, 0x40a4, 672180583Skmacy 0xcc8a, 0x643c, 673180583Skmacy 0xcc8b, 0x4016, 674180583Skmacy 0xcc8c, 0x8c6c, 675180583Skmacy 0xcc8d, 0x2b24, 676180583Skmacy 0xcc8e, 0x3c24, 677180583Skmacy 0xcc8f, 0x6435, 678180583Skmacy 0xcc90, 0x1002, 679180583Skmacy 0xcc91, 0x2b24, 680180583Skmacy 0xcc92, 0x3c24, 681180583Skmacy 0xcc93, 0x643a, 682180583Skmacy 0xcc94, 0x4025, 683180583Skmacy 0xcc95, 0x8a5a, 684180583Skmacy 0xcc96, 0x1002, 685180583Skmacy 0xcc97, 0x2731, 686180583Skmacy 0xcc98, 0x3011, 687180583Skmacy 0xcc99, 0x1001, 688180583Skmacy 0xcc9a, 0xc7a0, 689180583Skmacy 0xcc9b, 0x100, 690180583Skmacy 0xcc9c, 0xc502, 691180583Skmacy 0xcc9d, 0x53ac, 692180583Skmacy 0xcc9e, 0xc503, 693180583Skmacy 0xcc9f, 0xd5d5, 694180583Skmacy 0xcca0, 0xc600, 695180583Skmacy 0xcca1, 0x2a6d, 696180583Skmacy 0xcca2, 0xc601, 697180583Skmacy 0xcca3, 0x2a4c, 698180583Skmacy 0xcca4, 0xc602, 699180583Skmacy 0xcca5, 0x111, 700180583Skmacy 0xcca6, 0xc60c, 701180583Skmacy 0xcca7, 0x5900, 702180583Skmacy 0xcca8, 0xc710, 703180583Skmacy 0xcca9, 0x700, 704180583Skmacy 0xccaa, 0xc718, 705180583Skmacy 0xccab, 0x700, 706180583Skmacy 0xccac, 0xc720, 707180583Skmacy 0xccad, 0x4700, 708180583Skmacy 0xccae, 0xc801, 709180583Skmacy 0xccaf, 0x7f50, 710180583Skmacy 0xccb0, 0xc802, 711180583Skmacy 0xccb1, 0x7760, 712180583Skmacy 0xccb2, 0xc803, 713180583Skmacy 0xccb3, 0x7fce, 714180583Skmacy 0xccb4, 0xc804, 715180583Skmacy 0xccb5, 0x5700, 716180583Skmacy 0xccb6, 0xc805, 717180583Skmacy 0xccb7, 0x5f11, 718180583Skmacy 0xccb8, 0xc806, 719180583Skmacy 0xccb9, 0x4751, 720180583Skmacy 0xccba, 0xc807, 721180583Skmacy 0xccbb, 0x57e1, 722180583Skmacy 0xccbc, 0xc808, 723180583Skmacy 0xccbd, 0x2700, 724180583Skmacy 0xccbe, 0xc809, 725180583Skmacy 0xccbf, 0x000, 726180583Skmacy 0xccc0, 0xc821, 727180583Skmacy 0xccc1, 0x002, 728180583Skmacy 0xccc2, 0xc822, 729180583Skmacy 0xccc3, 0x014, 730180583Skmacy 0xccc4, 0xc832, 731180583Skmacy 0xccc5, 0x1186, 732180583Skmacy 0xccc6, 0xc847, 733180583Skmacy 0xccc7, 0x1e02, 734180583Skmacy 0xccc8, 0xc013, 735180583Skmacy 0xccc9, 0xf341, 736180583Skmacy 0xccca, 0xc01a, 737180583Skmacy 0xcccb, 0x446, 738180583Skmacy 0xcccc, 0xc024, 739180583Skmacy 0xcccd, 0x1000, 740180583Skmacy 0xccce, 0xc025, 741180583Skmacy 0xcccf, 0xa00, 742180583Skmacy 0xccd0, 0xc026, 743180583Skmacy 0xccd1, 0xc0c, 744180583Skmacy 0xccd2, 0xc027, 745180583Skmacy 0xccd3, 0xc0c, 746180583Skmacy 0xccd4, 0xc029, 747180583Skmacy 0xccd5, 0x0a0, 748180583Skmacy 0xccd6, 0xc030, 749180583Skmacy 0xccd7, 0xa00, 750180583Skmacy 0xccd8, 0xc03c, 751180583Skmacy 0xccd9, 0x01c, 752180583Skmacy 0xccda, 0xc005, 753180583Skmacy 0xccdb, 0x7a06, 754180583Skmacy 0xccdc, 0x000, 755180583Skmacy 0xccdd, 0x2731, 756180583Skmacy 0xccde, 0x3011, 757180583Skmacy 0xccdf, 0x1001, 758180583Skmacy 0xcce0, 0xc620, 759180583Skmacy 0xcce1, 0x000, 760180583Skmacy 0xcce2, 0xc621, 761180583Skmacy 0xcce3, 0x03f, 762180583Skmacy 0xcce4, 0xc622, 763180583Skmacy 0xcce5, 0x000, 764180583Skmacy 0xcce6, 0xc623, 765180583Skmacy 0xcce7, 0x000, 766180583Skmacy 0xcce8, 0xc624, 767180583Skmacy 0xcce9, 0x000, 768180583Skmacy 0xccea, 0xc625, 769180583Skmacy 0xcceb, 0x000, 770180583Skmacy 0xccec, 0xc627, 771180583Skmacy 0xcced, 0x000, 772180583Skmacy 0xccee, 0xc628, 773180583Skmacy 0xccef, 0x000, 774180583Skmacy 0xccf0, 0xc62c, 775180583Skmacy 0xccf1, 0x000, 776180583Skmacy 0xccf2, 0x000, 777180583Skmacy 0xccf3, 0x2806, 778180583Skmacy 0xccf4, 0x3cb6, 779180583Skmacy 0xccf5, 0xc161, 780180583Skmacy 0xccf6, 0x6134, 781180583Skmacy 0xccf7, 0x6135, 782180583Skmacy 0xccf8, 0x5443, 783180583Skmacy 0xccf9, 0x303, 784180583Skmacy 0xccfa, 0x6524, 785180583Skmacy 0xccfb, 0x00b, 786180583Skmacy 0xccfc, 0x1002, 787180583Skmacy 0xccfd, 0x2104, 788180583Skmacy 0xccfe, 0x3c24, 789180583Skmacy 0xccff, 0x2105, 790180583Skmacy 0xcd00, 0x3805, 791180583Skmacy 0xcd01, 0x6524, 792180583Skmacy 0xcd02, 0xdff4, 793180583Skmacy 0xcd03, 0x4005, 794180583Skmacy 0xcd04, 0x6524, 795180583Skmacy 0xcd05, 0x1002, 796180583Skmacy 0xcd06, 0x5dd3, 797180583Skmacy 0xcd07, 0x306, 798180583Skmacy 0xcd08, 0x2ff7, 799180583Skmacy 0xcd09, 0x38f7, 800180583Skmacy 0xcd0a, 0x60b7, 801180583Skmacy 0xcd0b, 0xdffd, 802180583Skmacy 0xcd0c, 0x00a, 803180583Skmacy 0xcd0d, 0x1002, 804180583Skmacy 0xcd0e, 0 805180583Skmacy }; 806180583Skmacy int i, err; 807180583Skmacy 808181614Skmacy err = set_phy_regs(phy, regs); 809181614Skmacy if (err) 810181614Skmacy return err; 811181614Skmacy 812181614Skmacy msleep(50); 813181614Skmacy 814181614Skmacy for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 815180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 816180583Skmacy sr_edc[i + 1]); 817181614Skmacy if (!err) 818181614Skmacy phy->priv = edc_sr; 819180583Skmacy return err; 820180583Skmacy} 821180583Skmacy 822181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) 823181614Skmacy{ 824181614Skmacy static struct reg_val regs[] = { 825181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 }, 826181614Skmacy { 0, 0, 0, 0 } 827181614Skmacy }; 828181614Skmacy static struct reg_val preemphasis[] = { 829181614Skmacy { MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 }, 830181614Skmacy { MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 }, 831181614Skmacy { 0, 0, 0, 0 } 832181614Skmacy }; 833181614Skmacy static u16 twinax_edc[] = { 834181614Skmacy 0xcc00, 0x4009, 835181614Skmacy 0xcc01, 0x27ff, 836181614Skmacy 0xcc02, 0x300f, 837181614Skmacy 0xcc03, 0x40aa, 838181614Skmacy 0xcc04, 0x401c, 839181614Skmacy 0xcc05, 0x401e, 840181614Skmacy 0xcc06, 0x2ff4, 841181614Skmacy 0xcc07, 0x3cd4, 842181614Skmacy 0xcc08, 0x2035, 843181614Skmacy 0xcc09, 0x3145, 844181614Skmacy 0xcc0a, 0x6524, 845181614Skmacy 0xcc0b, 0x26a2, 846181614Skmacy 0xcc0c, 0x3012, 847181614Skmacy 0xcc0d, 0x1002, 848181614Skmacy 0xcc0e, 0x29c2, 849181614Skmacy 0xcc0f, 0x3002, 850181614Skmacy 0xcc10, 0x1002, 851181614Skmacy 0xcc11, 0x2072, 852181614Skmacy 0xcc12, 0x3012, 853181614Skmacy 0xcc13, 0x1002, 854181614Skmacy 0xcc14, 0x22cd, 855181614Skmacy 0xcc15, 0x301d, 856181614Skmacy 0xcc16, 0x2e52, 857181614Skmacy 0xcc17, 0x3012, 858181614Skmacy 0xcc18, 0x1002, 859181614Skmacy 0xcc19, 0x28e2, 860181614Skmacy 0xcc1a, 0x3002, 861181614Skmacy 0xcc1b, 0x1002, 862181614Skmacy 0xcc1c, 0x628f, 863181614Skmacy 0xcc1d, 0x2ac2, 864181614Skmacy 0xcc1e, 0x3012, 865181614Skmacy 0xcc1f, 0x1002, 866181614Skmacy 0xcc20, 0x5553, 867181614Skmacy 0xcc21, 0x2ae2, 868181614Skmacy 0xcc22, 0x3002, 869181614Skmacy 0xcc23, 0x1302, 870181614Skmacy 0xcc24, 0x401e, 871181614Skmacy 0xcc25, 0x2be2, 872181614Skmacy 0xcc26, 0x3012, 873181614Skmacy 0xcc27, 0x1002, 874181614Skmacy 0xcc28, 0x2da2, 875181614Skmacy 0xcc29, 0x3012, 876181614Skmacy 0xcc2a, 0x1002, 877181614Skmacy 0xcc2b, 0x2ba2, 878181614Skmacy 0xcc2c, 0x3002, 879181614Skmacy 0xcc2d, 0x1002, 880181614Skmacy 0xcc2e, 0x5ee3, 881181614Skmacy 0xcc2f, 0x305, 882181614Skmacy 0xcc30, 0x400e, 883181614Skmacy 0xcc31, 0x2bc2, 884181614Skmacy 0xcc32, 0x3002, 885181614Skmacy 0xcc33, 0x1002, 886181614Skmacy 0xcc34, 0x2b82, 887181614Skmacy 0xcc35, 0x3012, 888181614Skmacy 0xcc36, 0x1002, 889181614Skmacy 0xcc37, 0x5663, 890181614Skmacy 0xcc38, 0x302, 891181614Skmacy 0xcc39, 0x401e, 892181614Skmacy 0xcc3a, 0x6f72, 893181614Skmacy 0xcc3b, 0x1002, 894181614Skmacy 0xcc3c, 0x628f, 895181614Skmacy 0xcc3d, 0x2be2, 896181614Skmacy 0xcc3e, 0x3012, 897181614Skmacy 0xcc3f, 0x1002, 898181614Skmacy 0xcc40, 0x22cd, 899181614Skmacy 0xcc41, 0x301d, 900181614Skmacy 0xcc42, 0x2e52, 901181614Skmacy 0xcc43, 0x3012, 902181614Skmacy 0xcc44, 0x1002, 903181614Skmacy 0xcc45, 0x2522, 904181614Skmacy 0xcc46, 0x3012, 905181614Skmacy 0xcc47, 0x1002, 906181614Skmacy 0xcc48, 0x2da2, 907181614Skmacy 0xcc49, 0x3012, 908181614Skmacy 0xcc4a, 0x1002, 909181614Skmacy 0xcc4b, 0x2ca2, 910181614Skmacy 0xcc4c, 0x3012, 911181614Skmacy 0xcc4d, 0x1002, 912181614Skmacy 0xcc4e, 0x2fa4, 913181614Skmacy 0xcc4f, 0x3cd4, 914181614Skmacy 0xcc50, 0x6624, 915181614Skmacy 0xcc51, 0x410b, 916181614Skmacy 0xcc52, 0x56b3, 917181614Skmacy 0xcc53, 0x3c4, 918181614Skmacy 0xcc54, 0x2fb2, 919181614Skmacy 0xcc55, 0x3002, 920181614Skmacy 0xcc56, 0x1002, 921181614Skmacy 0xcc57, 0x220b, 922181614Skmacy 0xcc58, 0x303b, 923181614Skmacy 0xcc59, 0x56b3, 924181614Skmacy 0xcc5a, 0x3c3, 925181614Skmacy 0xcc5b, 0x866b, 926181614Skmacy 0xcc5c, 0x400c, 927181614Skmacy 0xcc5d, 0x23a2, 928181614Skmacy 0xcc5e, 0x3012, 929181614Skmacy 0xcc5f, 0x1002, 930181614Skmacy 0xcc60, 0x2da2, 931181614Skmacy 0xcc61, 0x3012, 932181614Skmacy 0xcc62, 0x1002, 933181614Skmacy 0xcc63, 0x2ca2, 934181614Skmacy 0xcc64, 0x3012, 935181614Skmacy 0xcc65, 0x1002, 936181614Skmacy 0xcc66, 0x2fb4, 937181614Skmacy 0xcc67, 0x3cd4, 938181614Skmacy 0xcc68, 0x6624, 939181614Skmacy 0xcc69, 0x56b3, 940181614Skmacy 0xcc6a, 0x3c3, 941181614Skmacy 0xcc6b, 0x866b, 942181614Skmacy 0xcc6c, 0x401c, 943181614Skmacy 0xcc6d, 0x2205, 944181614Skmacy 0xcc6e, 0x3035, 945181614Skmacy 0xcc6f, 0x5b53, 946181614Skmacy 0xcc70, 0x2c52, 947181614Skmacy 0xcc71, 0x3002, 948181614Skmacy 0xcc72, 0x13c2, 949181614Skmacy 0xcc73, 0x5cc3, 950181614Skmacy 0xcc74, 0x317, 951181614Skmacy 0xcc75, 0x2522, 952181614Skmacy 0xcc76, 0x3012, 953181614Skmacy 0xcc77, 0x1002, 954181614Skmacy 0xcc78, 0x2da2, 955181614Skmacy 0xcc79, 0x3012, 956181614Skmacy 0xcc7a, 0x1002, 957181614Skmacy 0xcc7b, 0x2b82, 958181614Skmacy 0xcc7c, 0x3012, 959181614Skmacy 0xcc7d, 0x1002, 960181614Skmacy 0xcc7e, 0x5663, 961181614Skmacy 0xcc7f, 0x303, 962181614Skmacy 0xcc80, 0x401e, 963181614Skmacy 0xcc81, 0x004, 964181614Skmacy 0xcc82, 0x2c42, 965181614Skmacy 0xcc83, 0x3012, 966181614Skmacy 0xcc84, 0x1002, 967181614Skmacy 0xcc85, 0x6f72, 968181614Skmacy 0xcc86, 0x1002, 969181614Skmacy 0xcc87, 0x628f, 970181614Skmacy 0xcc88, 0x2304, 971181614Skmacy 0xcc89, 0x3c84, 972181614Skmacy 0xcc8a, 0x6436, 973181614Skmacy 0xcc8b, 0xdff4, 974181614Skmacy 0xcc8c, 0x6436, 975181614Skmacy 0xcc8d, 0x2ff5, 976181614Skmacy 0xcc8e, 0x3005, 977181614Skmacy 0xcc8f, 0x8656, 978181614Skmacy 0xcc90, 0xdfba, 979181614Skmacy 0xcc91, 0x56a3, 980181614Skmacy 0xcc92, 0xd05a, 981181614Skmacy 0xcc93, 0x21c2, 982181614Skmacy 0xcc94, 0x3012, 983181614Skmacy 0xcc95, 0x1392, 984181614Skmacy 0xcc96, 0xd05a, 985181614Skmacy 0xcc97, 0x56a3, 986181614Skmacy 0xcc98, 0xdfba, 987181614Skmacy 0xcc99, 0x383, 988181614Skmacy 0xcc9a, 0x6f72, 989181614Skmacy 0xcc9b, 0x1002, 990181614Skmacy 0xcc9c, 0x28c5, 991181614Skmacy 0xcc9d, 0x3005, 992181614Skmacy 0xcc9e, 0x4178, 993181614Skmacy 0xcc9f, 0x5653, 994181614Skmacy 0xcca0, 0x384, 995181614Skmacy 0xcca1, 0x22b2, 996181614Skmacy 0xcca2, 0x3012, 997181614Skmacy 0xcca3, 0x1002, 998181614Skmacy 0xcca4, 0x2be5, 999181614Skmacy 0xcca5, 0x3005, 1000181614Skmacy 0xcca6, 0x41e8, 1001181614Skmacy 0xcca7, 0x5653, 1002181614Skmacy 0xcca8, 0x382, 1003181614Skmacy 0xcca9, 0x002, 1004181614Skmacy 0xccaa, 0x4258, 1005181614Skmacy 0xccab, 0x2474, 1006181614Skmacy 0xccac, 0x3c84, 1007181614Skmacy 0xccad, 0x6437, 1008181614Skmacy 0xccae, 0xdff4, 1009181614Skmacy 0xccaf, 0x6437, 1010181614Skmacy 0xccb0, 0x2ff5, 1011181614Skmacy 0xccb1, 0x3c05, 1012181614Skmacy 0xccb2, 0x8757, 1013181614Skmacy 0xccb3, 0xb888, 1014181614Skmacy 0xccb4, 0x9787, 1015181614Skmacy 0xccb5, 0xdff4, 1016181614Skmacy 0xccb6, 0x6724, 1017181614Skmacy 0xccb7, 0x866a, 1018181614Skmacy 0xccb8, 0x6f72, 1019181614Skmacy 0xccb9, 0x1002, 1020181614Skmacy 0xccba, 0x2d01, 1021181614Skmacy 0xccbb, 0x3011, 1022181614Skmacy 0xccbc, 0x1001, 1023181614Skmacy 0xccbd, 0xc620, 1024181614Skmacy 0xccbe, 0x14e5, 1025181614Skmacy 0xccbf, 0xc621, 1026181614Skmacy 0xccc0, 0xc53d, 1027181614Skmacy 0xccc1, 0xc622, 1028181614Skmacy 0xccc2, 0x3cbe, 1029181614Skmacy 0xccc3, 0xc623, 1030181614Skmacy 0xccc4, 0x4452, 1031181614Skmacy 0xccc5, 0xc624, 1032181614Skmacy 0xccc6, 0xc5c5, 1033181614Skmacy 0xccc7, 0xc625, 1034181614Skmacy 0xccc8, 0xe01e, 1035181614Skmacy 0xccc9, 0xc627, 1036181614Skmacy 0xccca, 0x000, 1037181614Skmacy 0xcccb, 0xc628, 1038181614Skmacy 0xcccc, 0x000, 1039181614Skmacy 0xcccd, 0xc62b, 1040181614Skmacy 0xccce, 0x000, 1041181614Skmacy 0xcccf, 0xc62c, 1042181614Skmacy 0xccd0, 0x000, 1043181614Skmacy 0xccd1, 0x000, 1044181614Skmacy 0xccd2, 0x2d01, 1045181614Skmacy 0xccd3, 0x3011, 1046181614Skmacy 0xccd4, 0x1001, 1047181614Skmacy 0xccd5, 0xc620, 1048181614Skmacy 0xccd6, 0x000, 1049181614Skmacy 0xccd7, 0xc621, 1050181614Skmacy 0xccd8, 0x000, 1051181614Skmacy 0xccd9, 0xc622, 1052181614Skmacy 0xccda, 0x0ce, 1053181614Skmacy 0xccdb, 0xc623, 1054181614Skmacy 0xccdc, 0x07f, 1055181614Skmacy 0xccdd, 0xc624, 1056181614Skmacy 0xccde, 0x032, 1057181614Skmacy 0xccdf, 0xc625, 1058181614Skmacy 0xcce0, 0x000, 1059181614Skmacy 0xcce1, 0xc627, 1060181614Skmacy 0xcce2, 0x000, 1061181614Skmacy 0xcce3, 0xc628, 1062181614Skmacy 0xcce4, 0x000, 1063181614Skmacy 0xcce5, 0xc62b, 1064181614Skmacy 0xcce6, 0x000, 1065181614Skmacy 0xcce7, 0xc62c, 1066181614Skmacy 0xcce8, 0x000, 1067181614Skmacy 0xcce9, 0x000, 1068181614Skmacy 0xccea, 0x2d01, 1069181614Skmacy 0xcceb, 0x3011, 1070181614Skmacy 0xccec, 0x1001, 1071181614Skmacy 0xcced, 0xc502, 1072181614Skmacy 0xccee, 0x609f, 1073181614Skmacy 0xccef, 0xc600, 1074181614Skmacy 0xccf0, 0x2a6e, 1075181614Skmacy 0xccf1, 0xc601, 1076181614Skmacy 0xccf2, 0x2a2c, 1077181614Skmacy 0xccf3, 0xc60c, 1078181614Skmacy 0xccf4, 0x5400, 1079181614Skmacy 0xccf5, 0xc710, 1080181614Skmacy 0xccf6, 0x700, 1081181614Skmacy 0xccf7, 0xc718, 1082181614Skmacy 0xccf8, 0x700, 1083181614Skmacy 0xccf9, 0xc720, 1084181614Skmacy 0xccfa, 0x4700, 1085181614Skmacy 0xccfb, 0xc728, 1086181614Skmacy 0xccfc, 0x700, 1087181614Skmacy 0xccfd, 0xc729, 1088181614Skmacy 0xccfe, 0x1207, 1089181614Skmacy 0xccff, 0xc801, 1090181614Skmacy 0xcd00, 0x7f50, 1091181614Skmacy 0xcd01, 0xc802, 1092181614Skmacy 0xcd02, 0x7760, 1093181614Skmacy 0xcd03, 0xc803, 1094181614Skmacy 0xcd04, 0x7fce, 1095181614Skmacy 0xcd05, 0xc804, 1096181614Skmacy 0xcd06, 0x520e, 1097181614Skmacy 0xcd07, 0xc805, 1098181614Skmacy 0xcd08, 0x5c11, 1099181614Skmacy 0xcd09, 0xc806, 1100181614Skmacy 0xcd0a, 0x3c51, 1101181614Skmacy 0xcd0b, 0xc807, 1102181614Skmacy 0xcd0c, 0x4061, 1103181614Skmacy 0xcd0d, 0xc808, 1104181614Skmacy 0xcd0e, 0x49c1, 1105181614Skmacy 0xcd0f, 0xc809, 1106181614Skmacy 0xcd10, 0x3840, 1107181614Skmacy 0xcd11, 0xc80a, 1108181614Skmacy 0xcd12, 0x000, 1109181614Skmacy 0xcd13, 0xc821, 1110181614Skmacy 0xcd14, 0x002, 1111181614Skmacy 0xcd15, 0xc822, 1112181614Skmacy 0xcd16, 0x046, 1113181614Skmacy 0xcd17, 0xc844, 1114181614Skmacy 0xcd18, 0x182f, 1115181614Skmacy 0xcd19, 0xc013, 1116181614Skmacy 0xcd1a, 0xf341, 1117181614Skmacy 0xcd1b, 0xc01a, 1118181614Skmacy 0xcd1c, 0x446, 1119181614Skmacy 0xcd1d, 0xc024, 1120181614Skmacy 0xcd1e, 0x1000, 1121181614Skmacy 0xcd1f, 0xc025, 1122181614Skmacy 0xcd20, 0xa00, 1123181614Skmacy 0xcd21, 0xc026, 1124181614Skmacy 0xcd22, 0xc0c, 1125181614Skmacy 0xcd23, 0xc027, 1126181614Skmacy 0xcd24, 0xc0c, 1127181614Skmacy 0xcd25, 0xc029, 1128181614Skmacy 0xcd26, 0x0a0, 1129181614Skmacy 0xcd27, 0xc030, 1130181614Skmacy 0xcd28, 0xa00, 1131181614Skmacy 0xcd29, 0xc03c, 1132181614Skmacy 0xcd2a, 0x01c, 1133181614Skmacy 0xcd2b, 0x000, 1134181614Skmacy 0xcd2c, 0x2b84, 1135181614Skmacy 0xcd2d, 0x3c74, 1136181614Skmacy 0xcd2e, 0x6435, 1137181614Skmacy 0xcd2f, 0xdff4, 1138181614Skmacy 0xcd30, 0x6435, 1139181614Skmacy 0xcd31, 0x2806, 1140181614Skmacy 0xcd32, 0x3006, 1141181614Skmacy 0xcd33, 0x8565, 1142181614Skmacy 0xcd34, 0x2b24, 1143181614Skmacy 0xcd35, 0x3c24, 1144181614Skmacy 0xcd36, 0x6436, 1145181614Skmacy 0xcd37, 0x1002, 1146181614Skmacy 0xcd38, 0x2b24, 1147181614Skmacy 0xcd39, 0x3c24, 1148181614Skmacy 0xcd3a, 0x6436, 1149181614Skmacy 0xcd3b, 0x4045, 1150181614Skmacy 0xcd3c, 0x8656, 1151181614Skmacy 0xcd3d, 0x1002, 1152181614Skmacy 0xcd3e, 0x2807, 1153181614Skmacy 0xcd3f, 0x31a7, 1154181614Skmacy 0xcd40, 0x20c4, 1155181614Skmacy 0xcd41, 0x3c24, 1156181614Skmacy 0xcd42, 0x6724, 1157181614Skmacy 0xcd43, 0x1002, 1158181614Skmacy 0xcd44, 0x2807, 1159181614Skmacy 0xcd45, 0x3187, 1160181614Skmacy 0xcd46, 0x20c4, 1161181614Skmacy 0xcd47, 0x3c24, 1162181614Skmacy 0xcd48, 0x6724, 1163181614Skmacy 0xcd49, 0x1002, 1164181614Skmacy 0xcd4a, 0x2514, 1165181614Skmacy 0xcd4b, 0x3c64, 1166181614Skmacy 0xcd4c, 0x6436, 1167181614Skmacy 0xcd4d, 0xdff4, 1168181614Skmacy 0xcd4e, 0x6436, 1169181614Skmacy 0xcd4f, 0x1002, 1170181614Skmacy 0xcd50, 0x2806, 1171181614Skmacy 0xcd51, 0x3cb6, 1172181614Skmacy 0xcd52, 0xc161, 1173181614Skmacy 0xcd53, 0x6134, 1174181614Skmacy 0xcd54, 0x6135, 1175181614Skmacy 0xcd55, 0x5443, 1176181614Skmacy 0xcd56, 0x303, 1177181614Skmacy 0xcd57, 0x6524, 1178181614Skmacy 0xcd58, 0x00b, 1179181614Skmacy 0xcd59, 0x1002, 1180181614Skmacy 0xcd5a, 0xd019, 1181181614Skmacy 0xcd5b, 0x2104, 1182181614Skmacy 0xcd5c, 0x3c24, 1183181614Skmacy 0xcd5d, 0x2105, 1184181614Skmacy 0xcd5e, 0x3805, 1185181614Skmacy 0xcd5f, 0x6524, 1186181614Skmacy 0xcd60, 0xdff4, 1187181614Skmacy 0xcd61, 0x4005, 1188181614Skmacy 0xcd62, 0x6524, 1189181614Skmacy 0xcd63, 0x2e8d, 1190181614Skmacy 0xcd64, 0x303d, 1191181614Skmacy 0xcd65, 0x5dd3, 1192181614Skmacy 0xcd66, 0x306, 1193181614Skmacy 0xcd67, 0x2ff7, 1194181614Skmacy 0xcd68, 0x38f7, 1195181614Skmacy 0xcd69, 0x60b7, 1196181614Skmacy 0xcd6a, 0xdffd, 1197181614Skmacy 0xcd6b, 0x00a, 1198181614Skmacy 0xcd6c, 0x1002, 1199181614Skmacy 0xcd6d, 0 1200181614Skmacy }; 1201181614Skmacy int i, err; 1202181614Skmacy 1203181614Skmacy err = set_phy_regs(phy, regs); 1204181614Skmacy if (!err && modtype == phy_modtype_twinax_long) 1205181614Skmacy err = set_phy_regs(phy, preemphasis); 1206181614Skmacy if (err) 1207181614Skmacy return err; 1208181614Skmacy 1209181614Skmacy msleep(50); 1210181614Skmacy 1211181614Skmacy for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 1212181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 1213181614Skmacy twinax_edc[i + 1]); 1214181614Skmacy if (!err) 1215181614Skmacy phy->priv = edc_twinax; 1216181614Skmacy return err; 1217181614Skmacy} 1218181614Skmacy 1219197791Snpstatic int ael2005_get_module_type(struct cphy *phy, int delay_ms) 1220181614Skmacy{ 1221189643Sgnn int v; 1222197791Snp unsigned int stat; 1223181614Skmacy 1224197791Snp v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); 1225197791Snp if (v) 1226197791Snp return v; 1227181614Skmacy 1228197791Snp if (stat & (1 << 8)) /* module absent */ 1229197791Snp return phy_modtype_none; 1230181614Skmacy 1231197791Snp return ael2xxx_get_module_type(phy, delay_ms); 1232181614Skmacy} 1233181614Skmacy 1234181614Skmacystatic int ael2005_intr_enable(struct cphy *phy) 1235181614Skmacy{ 1236181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); 1237181614Skmacy return err ? err : t3_phy_lasi_intr_enable(phy); 1238181614Skmacy} 1239181614Skmacy 1240181614Skmacystatic int ael2005_intr_disable(struct cphy *phy) 1241181614Skmacy{ 1242181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100); 1243181614Skmacy return err ? err : t3_phy_lasi_intr_disable(phy); 1244181614Skmacy} 1245181614Skmacy 1246181614Skmacystatic int ael2005_intr_clear(struct cphy *phy) 1247181614Skmacy{ 1248181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00); 1249181614Skmacy return err ? err : t3_phy_lasi_intr_clear(phy); 1250181614Skmacy} 1251181614Skmacy 1252180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 1253180583Skmacy{ 1254180583Skmacy static struct reg_val regs0[] = { 1255180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 1256180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 1257180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 1258180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1259180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 1260180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1261180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 1262180583Skmacy { 0, 0, 0, 0 } 1263180583Skmacy }; 1264180583Skmacy static struct reg_val regs1[] = { 1265180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 1266180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 1267180583Skmacy { 0, 0, 0, 0 } 1268180583Skmacy }; 1269180583Skmacy 1270197791Snp int err; 1271197791Snp unsigned int lasi_ctrl; 1272180583Skmacy 1273181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1274181614Skmacy if (err) 1275181614Skmacy return err; 1276181614Skmacy 1277180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 1278180583Skmacy if (err) 1279180583Skmacy return err; 1280180583Skmacy 1281180583Skmacy msleep(125); 1282181614Skmacy phy->priv = edc_none; 1283180583Skmacy err = set_phy_regs(phy, regs0); 1284180583Skmacy if (err) 1285180583Skmacy return err; 1286180583Skmacy 1287180583Skmacy msleep(50); 1288181614Skmacy 1289186282Sgnn err = ael2005_get_module_type(phy, 0); 1290181614Skmacy if (err < 0) 1291181614Skmacy return err; 1292181614Skmacy phy->modtype = (u8)err; 1293181614Skmacy 1294199238Snp if (err == phy_modtype_none) 1295192540Sgnn err = 0; 1296192540Sgnn else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1297181614Skmacy err = ael2005_setup_twinax_edc(phy, err); 1298181614Skmacy else 1299181614Skmacy err = ael2005_setup_sr_edc(phy); 1300180583Skmacy if (err) 1301180583Skmacy return err; 1302180583Skmacy 1303181614Skmacy err = set_phy_regs(phy, regs1); 1304180583Skmacy if (err) 1305180583Skmacy return err; 1306180583Skmacy 1307181614Skmacy /* reset wipes out interrupts, reenable them if they were on */ 1308181614Skmacy if (lasi_ctrl & 1) 1309181614Skmacy err = ael2005_intr_enable(phy); 1310181614Skmacy return err; 1311180583Skmacy} 1312180583Skmacy 1313181614Skmacystatic int ael2005_intr_handler(struct cphy *phy) 1314181614Skmacy{ 1315181614Skmacy unsigned int stat; 1316181614Skmacy int ret, edc_needed, cause = 0; 1317181614Skmacy 1318181614Skmacy ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat); 1319181614Skmacy if (ret) 1320181614Skmacy return ret; 1321181614Skmacy 1322181614Skmacy if (stat & AEL2005_MODDET_IRQ) { 1323181614Skmacy ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 1324181614Skmacy 0xd00); 1325181614Skmacy if (ret) 1326181614Skmacy return ret; 1327181614Skmacy 1328181614Skmacy /* modules have max 300 ms init time after hot plug */ 1329186282Sgnn ret = ael2005_get_module_type(phy, 300); 1330181614Skmacy if (ret < 0) 1331181614Skmacy return ret; 1332181614Skmacy 1333181614Skmacy phy->modtype = (u8)ret; 1334181614Skmacy if (ret == phy_modtype_none) 1335181614Skmacy edc_needed = phy->priv; /* on unplug retain EDC */ 1336181614Skmacy else if (ret == phy_modtype_twinax || 1337181614Skmacy ret == phy_modtype_twinax_long) 1338181614Skmacy edc_needed = edc_twinax; 1339181614Skmacy else 1340181614Skmacy edc_needed = edc_sr; 1341181614Skmacy 1342181614Skmacy if (edc_needed != phy->priv) { 1343181614Skmacy ret = ael2005_reset(phy, 0); 1344181614Skmacy return ret ? ret : cphy_cause_module_change; 1345181614Skmacy } 1346181614Skmacy cause = cphy_cause_module_change; 1347181614Skmacy } 1348181614Skmacy 1349181614Skmacy ret = t3_phy_lasi_intr_handler(phy); 1350189643Sgnn if (ret < 0) 1351189643Sgnn return ret; 1352189643Sgnn 1353189643Sgnn ret |= cause; 1354277343Snp if (!ret) 1355189643Sgnn ret |= cphy_cause_link_change; 1356189643Sgnn return ret; 1357181614Skmacy} 1358181614Skmacy 1359197791Snpstatic struct cphy_ops ael2005_ops = { 1360167514Skmacy#ifdef C99_NOT_SUPPORTED 1361180583Skmacy ael2005_reset, 1362181614Skmacy ael2005_intr_enable, 1363181614Skmacy ael2005_intr_disable, 1364181614Skmacy ael2005_intr_clear, 1365181614Skmacy ael2005_intr_handler, 1366180583Skmacy NULL, 1367180583Skmacy NULL, 1368180583Skmacy NULL, 1369180583Skmacy NULL, 1370180583Skmacy NULL, 1371181614Skmacy get_link_status_r, 1372180583Skmacy ael1002_power_down, 1373180583Skmacy#else 1374180583Skmacy .reset = ael2005_reset, 1375181614Skmacy .intr_enable = ael2005_intr_enable, 1376181614Skmacy .intr_disable = ael2005_intr_disable, 1377181614Skmacy .intr_clear = ael2005_intr_clear, 1378181614Skmacy .intr_handler = ael2005_intr_handler, 1379181614Skmacy .get_link_status = get_link_status_r, 1380180583Skmacy .power_down = ael1002_power_down, 1381197791Snp#endif 1382180583Skmacy}; 1383180583Skmacy 1384197791Snpint t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr, 1385180583Skmacy const struct mdio_ops *mdio_ops) 1386180583Skmacy{ 1387186282Sgnn int err; 1388197791Snp struct cphy *phy = &pinfo->phy; 1389197791Snp 1390197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2005_ops, mdio_ops, 1391181614Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 1392181614Skmacy SUPPORTED_IRQ, "10GBASE-R"); 1393180583Skmacy msleep(125); 1394189643Sgnn ael_laser_down(phy, 0); 1395186282Sgnn 1396186282Sgnn err = ael2005_get_module_type(phy, 0); 1397186282Sgnn if (err >= 0) 1398186282Sgnn phy->modtype = err; 1399186282Sgnn 1400180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 1401180583Skmacy 1 << 5); 1402180583Skmacy} 1403180583Skmacy 1404181614Skmacy/* 1405197791Snp * Setup EDC and other parameters for operation with an optical module. 1406197791Snp */ 1407197791Snpstatic int ael2020_setup_sr_edc(struct cphy *phy) 1408197791Snp{ 1409197791Snp static struct reg_val regs[] = { 1410197791Snp { MDIO_DEV_PMA_PMD, 0xcc01, 0xffff, 0x488a }, 1411197791Snp 1412197791Snp { MDIO_DEV_PMA_PMD, 0xcb1b, 0xffff, 0x0200 }, 1413197791Snp { MDIO_DEV_PMA_PMD, 0xcb1c, 0xffff, 0x00f0 }, 1414197791Snp { MDIO_DEV_PMA_PMD, 0xcc06, 0xffff, 0x00e0 }, 1415197791Snp 1416197791Snp /* end */ 1417197791Snp { 0, 0, 0, 0 } 1418197791Snp }; 1419197791Snp int err; 1420197791Snp 1421197791Snp err = set_phy_regs(phy, regs); 1422197791Snp msleep(50); 1423197791Snp if (err) 1424197791Snp return err; 1425197791Snp 1426197791Snp phy->priv = edc_sr; 1427197791Snp return 0; 1428197791Snp} 1429197791Snp 1430197791Snp/* 1431197791Snp * Setup EDC and other parameters for operation with an TWINAX module. 1432197791Snp */ 1433197791Snpstatic int ael2020_setup_twinax_edc(struct cphy *phy, int modtype) 1434197791Snp{ 1435197791Snp static struct reg_val uCclock40MHz[] = { 1436197791Snp { MDIO_DEV_PMA_PMD, 0xff28, 0xffff, 0x4001 }, 1437197791Snp { MDIO_DEV_PMA_PMD, 0xff2a, 0xffff, 0x0002 }, 1438197791Snp { 0, 0, 0, 0 } 1439197791Snp }; 1440197791Snp 1441197791Snp static struct reg_val uCclockActivate[] = { 1442197791Snp { MDIO_DEV_PMA_PMD, 0xd000, 0xffff, 0x5200 }, 1443197791Snp { 0, 0, 0, 0 } 1444197791Snp }; 1445197791Snp 1446197791Snp static struct reg_val uCactivate[] = { 1447197791Snp { MDIO_DEV_PMA_PMD, 0xd080, 0xffff, 0x0100 }, 1448197791Snp { MDIO_DEV_PMA_PMD, 0xd092, 0xffff, 0x0000 }, 1449197791Snp { 0, 0, 0, 0 } 1450197791Snp }; 1451197791Snp 1452197791Snp static u16 twinax_edc[] = { 1453197791Snp 0xd800, 0x4009, 1454197791Snp 0xd801, 0x2fff, 1455197791Snp 0xd802, 0x300f, 1456197791Snp 0xd803, 0x40aa, 1457197791Snp 0xd804, 0x401c, 1458197791Snp 0xd805, 0x401e, 1459205945Snp 0xd806, 0x20c5, 1460205945Snp 0xd807, 0x3c05, 1461205945Snp 0xd808, 0x6536, 1462205945Snp 0xd809, 0x2fe4, 1463205945Snp 0xd80a, 0x3dc4, 1464205945Snp 0xd80b, 0x6624, 1465205945Snp 0xd80c, 0x2ff4, 1466205945Snp 0xd80d, 0x3dc4, 1467205945Snp 0xd80e, 0x2035, 1468205945Snp 0xd80f, 0x30a5, 1469205945Snp 0xd810, 0x6524, 1470205945Snp 0xd811, 0x2ca2, 1471205945Snp 0xd812, 0x3012, 1472197791Snp 0xd813, 0x1002, 1473205945Snp 0xd814, 0x27e2, 1474205945Snp 0xd815, 0x3022, 1475197791Snp 0xd816, 0x1002, 1476205945Snp 0xd817, 0x28d2, 1477197791Snp 0xd818, 0x3022, 1478197791Snp 0xd819, 0x1002, 1479205945Snp 0xd81a, 0x2892, 1480197791Snp 0xd81b, 0x3012, 1481197791Snp 0xd81c, 0x1002, 1482205945Snp 0xd81d, 0x24e2, 1483197791Snp 0xd81e, 0x3022, 1484197791Snp 0xd81f, 0x1002, 1485205945Snp 0xd820, 0x27e2, 1486205945Snp 0xd821, 0x3012, 1487205945Snp 0xd822, 0x1002, 1488205945Snp 0xd823, 0x2422, 1489205945Snp 0xd824, 0x3022, 1490205945Snp 0xd825, 0x1002, 1491205945Snp 0xd826, 0x22cd, 1492205945Snp 0xd827, 0x301d, 1493205945Snp 0xd828, 0x28f2, 1494205945Snp 0xd829, 0x3022, 1495205945Snp 0xd82a, 0x1002, 1496205945Snp 0xd82b, 0x5553, 1497205945Snp 0xd82c, 0x0307, 1498205945Snp 0xd82d, 0x2572, 1499205945Snp 0xd82e, 0x3022, 1500205945Snp 0xd82f, 0x1002, 1501205945Snp 0xd830, 0x21a2, 1502197791Snp 0xd831, 0x3012, 1503197791Snp 0xd832, 0x1002, 1504205945Snp 0xd833, 0x4016, 1505205945Snp 0xd834, 0x5e63, 1506205945Snp 0xd835, 0x0344, 1507205945Snp 0xd836, 0x21a2, 1508205945Snp 0xd837, 0x3012, 1509205945Snp 0xd838, 0x1002, 1510205945Snp 0xd839, 0x400e, 1511205945Snp 0xd83a, 0x2572, 1512197791Snp 0xd83b, 0x3022, 1513197791Snp 0xd83c, 0x1002, 1514205945Snp 0xd83d, 0x2b22, 1515205945Snp 0xd83e, 0x3012, 1516197791Snp 0xd83f, 0x1002, 1517205945Snp 0xd840, 0x2842, 1518205945Snp 0xd841, 0x3022, 1519205945Snp 0xd842, 0x1002, 1520205945Snp 0xd843, 0x26e2, 1521205945Snp 0xd844, 0x3022, 1522205945Snp 0xd845, 0x1002, 1523205945Snp 0xd846, 0x2fa4, 1524205945Snp 0xd847, 0x3dc4, 1525205945Snp 0xd848, 0x6624, 1526205945Snp 0xd849, 0x2e8b, 1527205945Snp 0xd84a, 0x303b, 1528205945Snp 0xd84b, 0x56b3, 1529205945Snp 0xd84c, 0x03c6, 1530205945Snp 0xd84d, 0x866b, 1531205945Snp 0xd84e, 0x400c, 1532205945Snp 0xd84f, 0x2782, 1533205945Snp 0xd850, 0x3012, 1534205945Snp 0xd851, 0x1002, 1535205945Snp 0xd852, 0x2c4b, 1536205945Snp 0xd853, 0x309b, 1537205945Snp 0xd854, 0x56b3, 1538205945Snp 0xd855, 0x03c3, 1539205945Snp 0xd856, 0x866b, 1540205945Snp 0xd857, 0x400c, 1541205945Snp 0xd858, 0x22a2, 1542205945Snp 0xd859, 0x3022, 1543205945Snp 0xd85a, 0x1002, 1544205945Snp 0xd85b, 0x2842, 1545205945Snp 0xd85c, 0x3022, 1546205945Snp 0xd85d, 0x1002, 1547205945Snp 0xd85e, 0x26e2, 1548205945Snp 0xd85f, 0x3022, 1549205945Snp 0xd860, 0x1002, 1550205945Snp 0xd861, 0x2fb4, 1551205945Snp 0xd862, 0x3dc4, 1552205945Snp 0xd863, 0x6624, 1553205945Snp 0xd864, 0x56b3, 1554205945Snp 0xd865, 0x03c3, 1555205945Snp 0xd866, 0x866b, 1556205945Snp 0xd867, 0x401c, 1557205945Snp 0xd868, 0x2c45, 1558205945Snp 0xd869, 0x3095, 1559205945Snp 0xd86a, 0x5b53, 1560205945Snp 0xd86b, 0x23d2, 1561197791Snp 0xd86c, 0x3012, 1562205945Snp 0xd86d, 0x13c2, 1563205945Snp 0xd86e, 0x5cc3, 1564205945Snp 0xd86f, 0x2782, 1565205945Snp 0xd870, 0x3012, 1566205945Snp 0xd871, 0x1312, 1567205945Snp 0xd872, 0x2b22, 1568205945Snp 0xd873, 0x3012, 1569205945Snp 0xd874, 0x1002, 1570205945Snp 0xd875, 0x2842, 1571205945Snp 0xd876, 0x3022, 1572205945Snp 0xd877, 0x1002, 1573205945Snp 0xd878, 0x2622, 1574205945Snp 0xd879, 0x3022, 1575205945Snp 0xd87a, 0x1002, 1576205945Snp 0xd87b, 0x21a2, 1577205945Snp 0xd87c, 0x3012, 1578205945Snp 0xd87d, 0x1002, 1579205945Snp 0xd87e, 0x628f, 1580205945Snp 0xd87f, 0x2985, 1581205945Snp 0xd880, 0x33a5, 1582205945Snp 0xd881, 0x26e2, 1583205945Snp 0xd882, 0x3022, 1584205945Snp 0xd883, 0x1002, 1585205945Snp 0xd884, 0x5653, 1586205945Snp 0xd885, 0x03d2, 1587205945Snp 0xd886, 0x401e, 1588205945Snp 0xd887, 0x6f72, 1589205945Snp 0xd888, 0x1002, 1590205945Snp 0xd889, 0x628f, 1591205945Snp 0xd88a, 0x2304, 1592205945Snp 0xd88b, 0x3c84, 1593205945Snp 0xd88c, 0x6436, 1594205945Snp 0xd88d, 0xdff4, 1595205945Snp 0xd88e, 0x6436, 1596205945Snp 0xd88f, 0x2ff5, 1597205945Snp 0xd890, 0x3005, 1598205945Snp 0xd891, 0x8656, 1599205945Snp 0xd892, 0xdfba, 1600205945Snp 0xd893, 0x56a3, 1601205945Snp 0xd894, 0xd05a, 1602205945Snp 0xd895, 0x29e2, 1603205945Snp 0xd896, 0x3012, 1604205945Snp 0xd897, 0x1392, 1605205945Snp 0xd898, 0xd05a, 1606205945Snp 0xd899, 0x56a3, 1607205945Snp 0xd89a, 0xdfba, 1608205945Snp 0xd89b, 0x0383, 1609205945Snp 0xd89c, 0x6f72, 1610205945Snp 0xd89d, 0x1002, 1611205945Snp 0xd89e, 0x2a64, 1612205945Snp 0xd89f, 0x3014, 1613205945Snp 0xd8a0, 0x2005, 1614205945Snp 0xd8a1, 0x3d75, 1615205945Snp 0xd8a2, 0xc451, 1616205945Snp 0xd8a3, 0x29a2, 1617205945Snp 0xd8a4, 0x3022, 1618205945Snp 0xd8a5, 0x1002, 1619205945Snp 0xd8a6, 0x178c, 1620205945Snp 0xd8a7, 0x1898, 1621205945Snp 0xd8a8, 0x19a4, 1622205945Snp 0xd8a9, 0x1ab0, 1623205945Snp 0xd8aa, 0x1bbc, 1624205945Snp 0xd8ab, 0x1cc8, 1625205945Snp 0xd8ac, 0x1dd3, 1626205945Snp 0xd8ad, 0x1ede, 1627205945Snp 0xd8ae, 0x1fe9, 1628205945Snp 0xd8af, 0x20f4, 1629205945Snp 0xd8b0, 0x21ff, 1630205945Snp 0xd8b1, 0x0000, 1631205945Snp 0xd8b2, 0x2741, 1632205945Snp 0xd8b3, 0x3021, 1633205945Snp 0xd8b4, 0x1001, 1634205945Snp 0xd8b5, 0xc620, 1635205945Snp 0xd8b6, 0x0000, 1636205945Snp 0xd8b7, 0xc621, 1637205945Snp 0xd8b8, 0x0000, 1638205945Snp 0xd8b9, 0xc622, 1639205945Snp 0xd8ba, 0x00e2, 1640205945Snp 0xd8bb, 0xc623, 1641205945Snp 0xd8bc, 0x007f, 1642205945Snp 0xd8bd, 0xc624, 1643205945Snp 0xd8be, 0x00ce, 1644205945Snp 0xd8bf, 0xc625, 1645205945Snp 0xd8c0, 0x0000, 1646205945Snp 0xd8c1, 0xc627, 1647205945Snp 0xd8c2, 0x0000, 1648205945Snp 0xd8c3, 0xc628, 1649205945Snp 0xd8c4, 0x0000, 1650205945Snp 0xd8c5, 0xc90a, 1651205945Snp 0xd8c6, 0x3a7c, 1652205945Snp 0xd8c7, 0xc62c, 1653205945Snp 0xd8c8, 0x0000, 1654197791Snp 0xd8c9, 0x0000, 1655205945Snp 0xd8ca, 0x2741, 1656205945Snp 0xd8cb, 0x3021, 1657205945Snp 0xd8cc, 0x1001, 1658205945Snp 0xd8cd, 0xc502, 1659205945Snp 0xd8ce, 0x53ac, 1660205945Snp 0xd8cf, 0xc503, 1661205945Snp 0xd8d0, 0x2cd3, 1662205945Snp 0xd8d1, 0xc600, 1663205945Snp 0xd8d2, 0x2a6e, 1664205945Snp 0xd8d3, 0xc601, 1665205945Snp 0xd8d4, 0x2a2c, 1666205945Snp 0xd8d5, 0xc605, 1667205945Snp 0xd8d6, 0x5557, 1668205945Snp 0xd8d7, 0xc60c, 1669205945Snp 0xd8d8, 0x5400, 1670205945Snp 0xd8d9, 0xc710, 1671205945Snp 0xd8da, 0x0700, 1672205945Snp 0xd8db, 0xc711, 1673205945Snp 0xd8dc, 0x0f06, 1674205945Snp 0xd8dd, 0xc718, 1675205945Snp 0xd8de, 0x700, 1676205945Snp 0xd8df, 0xc719, 1677205945Snp 0xd8e0, 0x0f06, 1678205945Snp 0xd8e1, 0xc720, 1679205945Snp 0xd8e2, 0x4700, 1680205945Snp 0xd8e3, 0xc721, 1681205945Snp 0xd8e4, 0x0f06, 1682205945Snp 0xd8e5, 0xc728, 1683205945Snp 0xd8e6, 0x0700, 1684205945Snp 0xd8e7, 0xc729, 1685205945Snp 0xd8e8, 0x1207, 1686205945Snp 0xd8e9, 0xc801, 1687205945Snp 0xd8ea, 0x7f50, 1688205945Snp 0xd8eb, 0xc802, 1689205945Snp 0xd8ec, 0x7760, 1690205945Snp 0xd8ed, 0xc803, 1691205945Snp 0xd8ee, 0x7fce, 1692205945Snp 0xd8ef, 0xc804, 1693205945Snp 0xd8f0, 0x520e, 1694205945Snp 0xd8f1, 0xc805, 1695205945Snp 0xd8f2, 0x5c11, 1696205945Snp 0xd8f3, 0xc806, 1697205945Snp 0xd8f4, 0x3c51, 1698205945Snp 0xd8f5, 0xc807, 1699205945Snp 0xd8f6, 0x4061, 1700205945Snp 0xd8f7, 0xc808, 1701205945Snp 0xd8f8, 0x49c1, 1702205945Snp 0xd8f9, 0xc809, 1703205945Snp 0xd8fa, 0x3840, 1704205945Snp 0xd8fb, 0xc80a, 1705205945Snp 0xd8fc, 0x0000, 1706205945Snp 0xd8fd, 0xc821, 1707205945Snp 0xd8fe, 0x0002, 1708205945Snp 0xd8ff, 0xc822, 1709205945Snp 0xd900, 0x0046, 1710205945Snp 0xd901, 0xc844, 1711205945Snp 0xd902, 0x182f, 1712205945Snp 0xd903, 0xc849, 1713205945Snp 0xd904, 0x0400, 1714205945Snp 0xd905, 0xc84a, 1715205945Snp 0xd906, 0x0002, 1716205945Snp 0xd907, 0xc013, 1717205945Snp 0xd908, 0xf341, 1718205945Snp 0xd909, 0xc084, 1719205945Snp 0xd90a, 0x0030, 1720205945Snp 0xd90b, 0xc904, 1721205945Snp 0xd90c, 0x1401, 1722205945Snp 0xd90d, 0xcb0c, 1723205945Snp 0xd90e, 0x0004, 1724205945Snp 0xd90f, 0xcb0e, 1725205945Snp 0xd910, 0xa00a, 1726205945Snp 0xd911, 0xcb0f, 1727205945Snp 0xd912, 0xc0c0, 1728205945Snp 0xd913, 0xcb10, 1729205945Snp 0xd914, 0xc0c0, 1730205945Snp 0xd915, 0xcb11, 1731205945Snp 0xd916, 0x00a0, 1732205945Snp 0xd917, 0xcb12, 1733205945Snp 0xd918, 0x0007, 1734205945Snp 0xd919, 0xc241, 1735205945Snp 0xd91a, 0xa000, 1736205945Snp 0xd91b, 0xc243, 1737205945Snp 0xd91c, 0x7fe0, 1738205945Snp 0xd91d, 0xc604, 1739205945Snp 0xd91e, 0x000e, 1740205945Snp 0xd91f, 0xc609, 1741205945Snp 0xd920, 0x00f5, 1742205945Snp 0xd921, 0xc611, 1743205945Snp 0xd922, 0x000e, 1744205945Snp 0xd923, 0xc660, 1745205945Snp 0xd924, 0x9600, 1746205945Snp 0xd925, 0xc687, 1747205945Snp 0xd926, 0x0004, 1748205945Snp 0xd927, 0xc60a, 1749205945Snp 0xd928, 0x04f5, 1750205945Snp 0xd929, 0x0000, 1751205945Snp 0xd92a, 0x2741, 1752205945Snp 0xd92b, 0x3021, 1753205945Snp 0xd92c, 0x1001, 1754205945Snp 0xd92d, 0xc620, 1755205945Snp 0xd92e, 0x14e5, 1756205945Snp 0xd92f, 0xc621, 1757205945Snp 0xd930, 0xc53d, 1758205945Snp 0xd931, 0xc622, 1759205945Snp 0xd932, 0x3cbe, 1760205945Snp 0xd933, 0xc623, 1761205945Snp 0xd934, 0x4452, 1762205945Snp 0xd935, 0xc624, 1763205945Snp 0xd936, 0xc5c5, 1764205945Snp 0xd937, 0xc625, 1765205945Snp 0xd938, 0xe01e, 1766205945Snp 0xd939, 0xc627, 1767205945Snp 0xd93a, 0x0000, 1768205945Snp 0xd93b, 0xc628, 1769197791Snp 0xd93c, 0x0000, 1770205945Snp 0xd93d, 0xc62c, 1771205945Snp 0xd93e, 0x0000, 1772205945Snp 0xd93f, 0xc90a, 1773205945Snp 0xd940, 0x3a7c, 1774205945Snp 0xd941, 0x0000, 1775205945Snp 0xd942, 0x2b84, 1776205945Snp 0xd943, 0x3c74, 1777205945Snp 0xd944, 0x6435, 1778205945Snp 0xd945, 0xdff4, 1779205945Snp 0xd946, 0x6435, 1780205945Snp 0xd947, 0x2806, 1781205945Snp 0xd948, 0x3006, 1782205945Snp 0xd949, 0x8565, 1783205945Snp 0xd94a, 0x2b24, 1784205945Snp 0xd94b, 0x3c24, 1785205945Snp 0xd94c, 0x6436, 1786205945Snp 0xd94d, 0x1002, 1787205945Snp 0xd94e, 0x2b24, 1788205945Snp 0xd94f, 0x3c24, 1789205945Snp 0xd950, 0x6436, 1790205945Snp 0xd951, 0x4045, 1791205945Snp 0xd952, 0x8656, 1792205945Snp 0xd953, 0x5663, 1793205945Snp 0xd954, 0x0302, 1794205945Snp 0xd955, 0x401e, 1795205945Snp 0xd956, 0x1002, 1796205945Snp 0xd957, 0x2807, 1797205945Snp 0xd958, 0x31a7, 1798205945Snp 0xd959, 0x20c4, 1799205945Snp 0xd95a, 0x3c24, 1800205945Snp 0xd95b, 0x6724, 1801205945Snp 0xd95c, 0x2ff7, 1802205945Snp 0xd95d, 0x30f7, 1803205945Snp 0xd95e, 0x20c4, 1804205945Snp 0xd95f, 0x3c04, 1805205945Snp 0xd960, 0x6724, 1806205945Snp 0xd961, 0x1002, 1807205945Snp 0xd962, 0x2807, 1808205945Snp 0xd963, 0x3187, 1809205945Snp 0xd964, 0x20c4, 1810205945Snp 0xd965, 0x3c24, 1811205945Snp 0xd966, 0x6724, 1812205945Snp 0xd967, 0x2fe4, 1813205945Snp 0xd968, 0x3dc4, 1814205945Snp 0xd969, 0x6437, 1815205945Snp 0xd96a, 0x20c4, 1816205945Snp 0xd96b, 0x3c04, 1817205945Snp 0xd96c, 0x6724, 1818197791Snp 0xd96d, 0x1002, 1819205945Snp 0xd96e, 0x24f4, 1820205945Snp 0xd96f, 0x3c64, 1821205945Snp 0xd970, 0x6436, 1822205945Snp 0xd971, 0xdff4, 1823205945Snp 0xd972, 0x6436, 1824197791Snp 0xd973, 0x1002, 1825205945Snp 0xd974, 0x2006, 1826205945Snp 0xd975, 0x3d76, 1827205945Snp 0xd976, 0xc161, 1828205945Snp 0xd977, 0x6134, 1829205945Snp 0xd978, 0x6135, 1830205945Snp 0xd979, 0x5443, 1831205945Snp 0xd97a, 0x0303, 1832205945Snp 0xd97b, 0x6524, 1833205945Snp 0xd97c, 0x00fb, 1834205945Snp 0xd97d, 0x1002, 1835205945Snp 0xd97e, 0x20d4, 1836205945Snp 0xd97f, 0x3c24, 1837205945Snp 0xd980, 0x2025, 1838205945Snp 0xd981, 0x3005, 1839205945Snp 0xd982, 0x6524, 1840205945Snp 0xd983, 0x1002, 1841205945Snp 0xd984, 0xd019, 1842205945Snp 0xd985, 0x2104, 1843205945Snp 0xd986, 0x3c24, 1844205945Snp 0xd987, 0x2105, 1845205945Snp 0xd988, 0x3805, 1846205945Snp 0xd989, 0x6524, 1847205945Snp 0xd98a, 0xdff4, 1848205945Snp 0xd98b, 0x4005, 1849205945Snp 0xd98c, 0x6524, 1850205945Snp 0xd98d, 0x2e8d, 1851205945Snp 0xd98e, 0x303d, 1852205945Snp 0xd98f, 0x2408, 1853205945Snp 0xd990, 0x35d8, 1854205945Snp 0xd991, 0x5dd3, 1855205945Snp 0xd992, 0x0307, 1856205945Snp 0xd993, 0x8887, 1857205945Snp 0xd994, 0x63a7, 1858205945Snp 0xd995, 0x8887, 1859205945Snp 0xd996, 0x63a7, 1860205945Snp 0xd997, 0xdffd, 1861205945Snp 0xd998, 0x00f9, 1862205945Snp 0xd999, 0x1002, 1863205945Snp 0xd99a, 0x866a, 1864205945Snp 0xd99b, 0x6138, 1865205945Snp 0xd99c, 0x5883, 1866205945Snp 0xd99d, 0x2aa2, 1867205945Snp 0xd99e, 0x3022, 1868205945Snp 0xd99f, 0x1302, 1869205945Snp 0xd9a0, 0x2ff7, 1870205945Snp 0xd9a1, 0x3007, 1871205945Snp 0xd9a2, 0x8785, 1872205945Snp 0xd9a3, 0xb887, 1873205945Snp 0xd9a4, 0x8786, 1874205945Snp 0xd9a5, 0xb8c6, 1875205945Snp 0xd9a6, 0x5a53, 1876205945Snp 0xd9a7, 0x29b2, 1877205945Snp 0xd9a8, 0x3022, 1878205945Snp 0xd9a9, 0x13c2, 1879205945Snp 0xd9aa, 0x2474, 1880205945Snp 0xd9ab, 0x3c84, 1881205945Snp 0xd9ac, 0x64d7, 1882205945Snp 0xd9ad, 0x64d7, 1883205945Snp 0xd9ae, 0x2ff5, 1884205945Snp 0xd9af, 0x3c05, 1885205945Snp 0xd9b0, 0x8757, 1886205945Snp 0xd9b1, 0xb886, 1887205945Snp 0xd9b2, 0x9767, 1888205945Snp 0xd9b3, 0x67c4, 1889205945Snp 0xd9b4, 0x6f72, 1890205945Snp 0xd9b5, 0x1002, 1891205945Snp 0xd9b6, 0x0000, 1892197791Snp }; 1893197791Snp int i, err; 1894197791Snp 1895197791Snp /* set uC clock and activate it */ 1896197791Snp err = set_phy_regs(phy, uCclock40MHz); 1897197791Snp msleep(500); 1898197791Snp if (err) 1899197791Snp return err; 1900197791Snp err = set_phy_regs(phy, uCclockActivate); 1901197791Snp msleep(500); 1902197791Snp if (err) 1903197791Snp return err; 1904197791Snp 1905197791Snp for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 1906197791Snp err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 1907197791Snp twinax_edc[i + 1]); 1908197791Snp /* activate uC */ 1909197791Snp err = set_phy_regs(phy, uCactivate); 1910197791Snp if (!err) 1911197791Snp phy->priv = edc_twinax; 1912197791Snp return err; 1913197791Snp} 1914197791Snp 1915197791Snp/* 1916197791Snp * Return Module Type. 1917197791Snp */ 1918197791Snpstatic int ael2020_get_module_type(struct cphy *phy, int delay_ms) 1919197791Snp{ 1920197791Snp int v; 1921197791Snp unsigned int stat; 1922197791Snp 1923197791Snp v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_STAT, &stat); 1924197791Snp if (v) 1925197791Snp return v; 1926197791Snp 1927197791Snp if (stat & (0x1 << (AEL2020_GPIO_MODDET*4))) { 1928197791Snp /* module absent */ 1929197791Snp return phy_modtype_none; 1930197791Snp } 1931197791Snp 1932197791Snp return ael2xxx_get_module_type(phy, delay_ms); 1933197791Snp} 1934197791Snp 1935197791Snp/* 1936197791Snp * Enable PHY interrupts. We enable "Module Detection" interrupts (on any 1937197791Snp * state transition) and then generic Link Alarm Status Interrupt (LASI). 1938197791Snp */ 1939197791Snpstatic int ael2020_intr_enable(struct cphy *phy) 1940197791Snp{ 1941197791Snp struct reg_val regs[] = { 1942197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CFG+AEL2020_GPIO_LSTAT, 1943197791Snp 0xffff, 0x4 }, 1944197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1945197791Snp 0xffff, 0x8 << (AEL2020_GPIO_LSTAT*4) }, 1946197791Snp 1947197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1948197791Snp 0xffff, 0x2 << (AEL2020_GPIO_MODDET*4) }, 1949197791Snp 1950197791Snp /* end */ 1951197791Snp { 0, 0, 0, 0 } 1952197791Snp }; 1953197791Snp int err; 1954197791Snp 1955197791Snp err = set_phy_regs(phy, regs); 1956197791Snp if (err) 1957197791Snp return err; 1958197791Snp 1959197791Snp /* enable standard Link Alarm Status Interrupts */ 1960197791Snp err = t3_phy_lasi_intr_enable(phy); 1961197791Snp if (err) 1962197791Snp return err; 1963197791Snp 1964197791Snp return 0; 1965197791Snp} 1966197791Snp 1967197791Snp/* 1968197791Snp * Disable PHY interrupts. The mirror of the above ... 1969197791Snp */ 1970197791Snpstatic int ael2020_intr_disable(struct cphy *phy) 1971197791Snp{ 1972197791Snp struct reg_val regs[] = { 1973197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1974197791Snp 0xffff, 0xb << (AEL2020_GPIO_LSTAT*4) }, 1975197791Snp 1976197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1977197791Snp 0xffff, 0x1 << (AEL2020_GPIO_MODDET*4) }, 1978197791Snp 1979197791Snp /* end */ 1980197791Snp { 0, 0, 0, 0 } 1981197791Snp }; 1982197791Snp int err; 1983197791Snp 1984197791Snp err = set_phy_regs(phy, regs); 1985197791Snp if (err) 1986197791Snp return err; 1987197791Snp 1988197791Snp /* disable standard Link Alarm Status Interrupts */ 1989197791Snp return t3_phy_lasi_intr_disable(phy); 1990197791Snp} 1991197791Snp 1992197791Snp/* 1993197791Snp * Clear PHY interrupt state. 1994197791Snp */ 1995197791Snpstatic int ael2020_intr_clear(struct cphy *phy) 1996197791Snp{ 1997197791Snp unsigned int stat; 1998197791Snp int err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat); 1999197791Snp return err ? err : t3_phy_lasi_intr_clear(phy); 2000197791Snp} 2001197791Snp 2002197791Snp/* 2003197791Snp * Common register settings for the AEL2020 when it comes out of reset. 2004197791Snp */ 2005197791Snpstatic struct reg_val ael2020_reset_regs[] = { 2006197791Snp { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x3101 }, 2007197791Snp 2008197791Snp { MDIO_DEV_PMA_PMD, 0xcd40, 0xffff, 0x0001 }, 2009197791Snp 2010205945Snp { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0x0100 }, 2011205945Snp { MDIO_DEV_PMA_PMD, 0xca22, 0xffff, 0x0100 }, 2012205945Snp { MDIO_DEV_PMA_PMD, 0xca42, 0xffff, 0x0100 }, 2013197791Snp { MDIO_DEV_PMA_PMD, 0xff02, 0xffff, 0x0023 }, 2014197791Snp { MDIO_DEV_PMA_PMD, 0xff03, 0xffff, 0x0000 }, 2015197791Snp { MDIO_DEV_PMA_PMD, 0xff04, 0xffff, 0x0000 }, 2016197791Snp 2017205945Snp { MDIO_DEV_PMA_PMD, 0xc20d, 0xffff, 0x0002 }, 2018197791Snp /* end */ 2019197791Snp { 0, 0, 0, 0 } 2020197791Snp}; 2021197791Snp 2022197791Snp/* 2023197791Snp * Reset the PHY and put it into a canonical operating state. 2024197791Snp */ 2025197791Snpstatic int ael2020_reset(struct cphy *phy, int wait) 2026197791Snp{ 2027197791Snp int err; 2028197791Snp unsigned int lasi_ctrl; 2029197791Snp 2030197791Snp /* grab current interrupt state */ 2031197791Snp err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 2032197791Snp if (err) 2033197791Snp return err; 2034197791Snp 2035197791Snp err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 125); 2036197791Snp if (err) 2037197791Snp return err; 2038197791Snp msleep(100); 2039197791Snp 2040197791Snp /* basic initialization for all module types */ 2041197791Snp phy->priv = edc_none; 2042197791Snp err = set_phy_regs(phy, ael2020_reset_regs); 2043197791Snp if (err) 2044197791Snp return err; 2045205945Snp msleep(100); 2046197791Snp 2047197791Snp /* determine module type and perform appropriate initialization */ 2048197791Snp err = ael2020_get_module_type(phy, 0); 2049197791Snp if (err < 0) 2050197791Snp return err; 2051197791Snp phy->modtype = (u8)err; 2052199238Snp if (err == phy_modtype_none) 2053197791Snp err = 0; 2054197791Snp else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 2055197791Snp err = ael2020_setup_twinax_edc(phy, err); 2056197791Snp else 2057197791Snp err = ael2020_setup_sr_edc(phy); 2058197791Snp if (err) 2059197791Snp return err; 2060197791Snp 2061197791Snp /* reset wipes out interrupts, reenable them if they were on */ 2062197791Snp if (lasi_ctrl & 1) 2063197791Snp err = ael2020_intr_enable(phy); 2064197791Snp return err; 2065197791Snp} 2066197791Snp 2067197791Snp/* 2068197791Snp * Handle a PHY interrupt. 2069197791Snp */ 2070197791Snpstatic int ael2020_intr_handler(struct cphy *phy) 2071197791Snp{ 2072197791Snp unsigned int stat; 2073197791Snp int ret, edc_needed, cause = 0; 2074197791Snp 2075197791Snp ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat); 2076197791Snp if (ret) 2077197791Snp return ret; 2078197791Snp 2079197791Snp if (stat & (0x1 << AEL2020_GPIO_MODDET)) { 2080197791Snp /* modules have max 300 ms init time after hot plug */ 2081197791Snp ret = ael2020_get_module_type(phy, 300); 2082197791Snp if (ret < 0) 2083197791Snp return ret; 2084197791Snp 2085197791Snp phy->modtype = (u8)ret; 2086197791Snp if (ret == phy_modtype_none) 2087197791Snp edc_needed = phy->priv; /* on unplug retain EDC */ 2088197791Snp else if (ret == phy_modtype_twinax || 2089197791Snp ret == phy_modtype_twinax_long) 2090197791Snp edc_needed = edc_twinax; 2091197791Snp else 2092197791Snp edc_needed = edc_sr; 2093197791Snp 2094197791Snp if (edc_needed != phy->priv) { 2095197791Snp ret = ael2020_reset(phy, 0); 2096197791Snp return ret ? ret : cphy_cause_module_change; 2097197791Snp } 2098197791Snp cause = cphy_cause_module_change; 2099197791Snp } 2100197791Snp 2101197791Snp ret = t3_phy_lasi_intr_handler(phy); 2102197791Snp if (ret < 0) 2103197791Snp return ret; 2104197791Snp 2105197791Snp ret |= cause; 2106197791Snp if (!ret) 2107197791Snp ret |= cphy_cause_link_change; 2108197791Snp return ret; 2109197791Snp} 2110197791Snp 2111197791Snpstatic struct cphy_ops ael2020_ops = { 2112197791Snp#ifdef C99_NOT_SUPPORTED 2113197791Snp ael2020_reset, 2114197791Snp ael2020_intr_enable, 2115197791Snp ael2020_intr_disable, 2116197791Snp ael2020_intr_clear, 2117197791Snp ael2020_intr_handler, 2118197791Snp NULL, 2119197791Snp NULL, 2120197791Snp NULL, 2121197791Snp NULL, 2122197791Snp NULL, 2123197791Snp get_link_status_r, 2124197791Snp ael1002_power_down, 2125197791Snp#else 2126197791Snp .reset = ael2020_reset, 2127197791Snp .intr_enable = ael2020_intr_enable, 2128197791Snp .intr_disable = ael2020_intr_disable, 2129197791Snp .intr_clear = ael2020_intr_clear, 2130197791Snp .intr_handler = ael2020_intr_handler, 2131197791Snp .get_link_status = get_link_status_r, 2132197791Snp .power_down = ael1002_power_down, 2133197791Snp#endif 2134197791Snp}; 2135197791Snp 2136197791Snpint t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr, 2137197791Snp const struct mdio_ops *mdio_ops) 2138197791Snp{ 2139197791Snp int err; 2140197791Snp struct cphy *phy = &pinfo->phy; 2141197791Snp 2142197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2020_ops, mdio_ops, 2143197791Snp SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 2144197791Snp SUPPORTED_IRQ, "10GBASE-R"); 2145197791Snp msleep(125); 2146197791Snp 2147197791Snp err = set_phy_regs(phy, ael2020_reset_regs); 2148197791Snp if (err) 2149197791Snp return err; 2150205945Snp msleep(100); 2151205945Snp 2152197791Snp err = ael2020_get_module_type(phy, 0); 2153197791Snp if (err >= 0) 2154197791Snp phy->modtype = err; 2155197791Snp 2156197791Snp ael_laser_down(phy, 0); 2157197791Snp return 0; 2158197791Snp} 2159197791Snp 2160197791Snp/* 2161181614Skmacy * Get link status for a 10GBASE-X device. 2162181614Skmacy */ 2163277343Snpstatic int get_link_status_x(struct cphy *phy, int *link_state, int *speed, 2164181614Skmacy int *duplex, int *fc) 2165181614Skmacy{ 2166277343Snp if (link_state) { 2167181614Skmacy unsigned int stat0, stat1, stat2; 2168181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 2169181614Skmacy 2170181614Skmacy if (!err) 2171181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1); 2172181614Skmacy if (!err) 2173181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 2174181614Skmacy if (err) 2175181614Skmacy return err; 2176277343Snp if ((stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1) 2177277343Snp *link_state = PHY_LINK_UP; 2178277343Snp else 2179277343Snp *link_state = PHY_LINK_DOWN; 2180181614Skmacy } 2181181614Skmacy if (speed) 2182181614Skmacy *speed = SPEED_10000; 2183181614Skmacy if (duplex) 2184181614Skmacy *duplex = DUPLEX_FULL; 2185181614Skmacy return 0; 2186181614Skmacy} 2187181614Skmacy 2188180583Skmacy#ifdef C99_NOT_SUPPORTED 2189167514Skmacystatic struct cphy_ops qt2045_ops = { 2190167514Skmacy ael1006_reset, 2191180583Skmacy t3_phy_lasi_intr_enable, 2192180583Skmacy t3_phy_lasi_intr_disable, 2193180583Skmacy t3_phy_lasi_intr_clear, 2194180583Skmacy t3_phy_lasi_intr_handler, 2195167514Skmacy NULL, 2196167514Skmacy NULL, 2197167514Skmacy NULL, 2198167514Skmacy NULL, 2199167514Skmacy NULL, 2200181614Skmacy get_link_status_x, 2201197791Snp ael1002_power_down, 2202167514Skmacy}; 2203167514Skmacy#else 2204167514Skmacystatic struct cphy_ops qt2045_ops = { 2205167514Skmacy .reset = ael1006_reset, 2206180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 2207180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 2208180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 2209180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 2210181614Skmacy .get_link_status = get_link_status_x, 2211197791Snp .power_down = ael1002_power_down, 2212167514Skmacy}; 2213167514Skmacy#endif 2214167514Skmacy 2215197791Snpint t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr, 2216176472Skmacy const struct mdio_ops *mdio_ops) 2217167514Skmacy{ 2218167514Skmacy unsigned int stat; 2219197791Snp struct cphy *phy = &pinfo->phy; 2220167514Skmacy 2221197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &qt2045_ops, mdio_ops, 2222176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 2223176472Skmacy "10GBASE-CX4"); 2224167514Skmacy 2225167514Skmacy /* 2226167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 2227167514Skmacy * have it at 1. 2228167514Skmacy */ 2229167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 2230167514Skmacy stat == 0xffff) 2231167514Skmacy phy->addr = 1; 2232176472Skmacy return 0; 2233167514Skmacy} 2234167514Skmacy 2235167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 2236167514Skmacy{ 2237167514Skmacy return 0; 2238167514Skmacy} 2239167514Skmacy 2240277343Snpstatic int xaui_direct_get_link_status(struct cphy *phy, int *link_state, 2241167514Skmacy int *speed, int *duplex, int *fc) 2242167514Skmacy{ 2243277343Snp if (link_state) { 2244167514Skmacy unsigned int status; 2245197791Snp adapter_t *adapter = phy->adapter; 2246189643Sgnn 2247197791Snp status = t3_read_reg(adapter, 2248170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 2249197791Snp t3_read_reg(adapter, 2250170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 2251197791Snp t3_read_reg(adapter, 2252170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 2253197791Snp t3_read_reg(adapter, 2254170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 2255277343Snp *link_state = status & F_LOWSIG0 ? PHY_LINK_DOWN : PHY_LINK_UP; 2256167514Skmacy } 2257167514Skmacy if (speed) 2258167514Skmacy *speed = SPEED_10000; 2259167514Skmacy if (duplex) 2260167514Skmacy *duplex = DUPLEX_FULL; 2261167514Skmacy return 0; 2262167514Skmacy} 2263167514Skmacy 2264167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 2265167514Skmacy{ 2266167514Skmacy return 0; 2267167514Skmacy} 2268167514Skmacy 2269167514Skmacy#ifdef C99_NOT_SUPPORTED 2270167514Skmacystatic struct cphy_ops xaui_direct_ops = { 2271167514Skmacy xaui_direct_reset, 2272167514Skmacy ael1002_intr_noop, 2273167514Skmacy ael1002_intr_noop, 2274167514Skmacy ael1002_intr_noop, 2275167514Skmacy ael1002_intr_noop, 2276167514Skmacy NULL, 2277167514Skmacy NULL, 2278167514Skmacy NULL, 2279167514Skmacy NULL, 2280167514Skmacy NULL, 2281167514Skmacy xaui_direct_get_link_status, 2282167514Skmacy xaui_direct_power_down, 2283167514Skmacy}; 2284167514Skmacy#else 2285167514Skmacystatic struct cphy_ops xaui_direct_ops = { 2286167514Skmacy .reset = xaui_direct_reset, 2287167514Skmacy .intr_enable = ael1002_intr_noop, 2288167514Skmacy .intr_disable = ael1002_intr_noop, 2289167514Skmacy .intr_clear = ael1002_intr_noop, 2290167514Skmacy .intr_handler = ael1002_intr_noop, 2291167514Skmacy .get_link_status = xaui_direct_get_link_status, 2292167514Skmacy .power_down = xaui_direct_power_down, 2293167514Skmacy}; 2294167514Skmacy#endif 2295167514Skmacy 2296197791Snpint t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr, 2297176472Skmacy const struct mdio_ops *mdio_ops) 2298167514Skmacy{ 2299197791Snp cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &xaui_direct_ops, mdio_ops, 2300176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 2301176472Skmacy "10GBASE-CX4"); 2302176472Skmacy return 0; 2303167514Skmacy} 2304