cxgb_ael1002.c revision 204921
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: head/sys/dev/cxgb/common/cxgb_ael1002.c 204921 2010-03-09 19:57:44Z 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 */ 286181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed, 287181614Skmacy int *duplex, int *fc) 288167514Skmacy{ 289167514Skmacy if (link_ok) { 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; 299181614Skmacy *link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1; 300167514Skmacy } 301167514Skmacy if (speed) 302167514Skmacy *speed = SPEED_10000; 303167514Skmacy if (duplex) 304167514Skmacy *duplex = DUPLEX_FULL; 305167514Skmacy return 0; 306167514Skmacy} 307167514Skmacy 308167514Skmacy#ifdef C99_NOT_SUPPORTED 309167514Skmacystatic struct cphy_ops ael1002_ops = { 310167514Skmacy ael1002_reset, 311167514Skmacy ael1002_intr_noop, 312167514Skmacy ael1002_intr_noop, 313167514Skmacy ael1002_intr_noop, 314167514Skmacy ael1002_intr_noop, 315167514Skmacy NULL, 316167514Skmacy NULL, 317167514Skmacy NULL, 318167514Skmacy NULL, 319167514Skmacy NULL, 320181614Skmacy get_link_status_r, 321167514Skmacy ael1002_power_down, 322167514Skmacy}; 323167514Skmacy#else 324167514Skmacystatic struct cphy_ops ael1002_ops = { 325167514Skmacy .reset = ael1002_reset, 326167514Skmacy .intr_enable = ael1002_intr_noop, 327167514Skmacy .intr_disable = ael1002_intr_noop, 328167514Skmacy .intr_clear = ael1002_intr_noop, 329167514Skmacy .intr_handler = ael1002_intr_noop, 330181614Skmacy .get_link_status = get_link_status_r, 331167514Skmacy .power_down = ael1002_power_down, 332167514Skmacy}; 333167514Skmacy#endif 334167514Skmacy 335197791Snpint t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr, 336176472Skmacy const struct mdio_ops *mdio_ops) 337167514Skmacy{ 338186282Sgnn int err; 339197791Snp struct cphy *phy = &pinfo->phy; 340186282Sgnn 341197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1002_ops, mdio_ops, 342176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 343177340Skmacy "10GBASE-R"); 344167514Skmacy ael100x_txon(phy); 345189643Sgnn ael_laser_down(phy, 0); 346186282Sgnn 347186282Sgnn err = ael1002_get_module_type(phy, 0); 348186282Sgnn if (err >= 0) 349186282Sgnn phy->modtype = err; 350186282Sgnn 351176472Skmacy return 0; 352167514Skmacy} 353167514Skmacy 354167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait) 355167514Skmacy{ 356189643Sgnn int err; 357189643Sgnn 358189643Sgnn err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 359189643Sgnn if (err) 360189643Sgnn return err; 361189643Sgnn 362189643Sgnn t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 363189643Sgnn F_GPIO6_OUT_VAL, 0); 364189643Sgnn 365185157Sgnn msleep(125); 366189643Sgnn 367189643Sgnn t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 368189643Sgnn F_GPIO6_OUT_VAL, F_GPIO6_OUT_VAL); 369189643Sgnn 370185157Sgnn msleep(125); 371185620Sgnn 372189643Sgnn err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 373189643Sgnn if (err) 374189643Sgnn return err; 375185620Sgnn 376189643Sgnn msleep(125); 377189643Sgnn 378189643Sgnn err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 1); 379189643Sgnn if (err) 380189643Sgnn return err; 381189643Sgnn 382189643Sgnn msleep(125); 383189643Sgnn 384189643Sgnn err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0); 385189643Sgnn 386189643Sgnn return err; 387189643Sgnn 388167514Skmacy} 389167514Skmacy 390167514Skmacy#ifdef C99_NOT_SUPPORTED 391167514Skmacystatic struct cphy_ops ael1006_ops = { 392167514Skmacy ael1006_reset, 393180583Skmacy t3_phy_lasi_intr_enable, 394180583Skmacy t3_phy_lasi_intr_disable, 395180583Skmacy t3_phy_lasi_intr_clear, 396180583Skmacy t3_phy_lasi_intr_handler, 397167514Skmacy NULL, 398167514Skmacy NULL, 399167514Skmacy NULL, 400167514Skmacy NULL, 401167514Skmacy NULL, 402181614Skmacy get_link_status_r, 403197791Snp ael1002_power_down, 404167514Skmacy}; 405167514Skmacy#else 406167514Skmacystatic struct cphy_ops ael1006_ops = { 407167514Skmacy .reset = ael1006_reset, 408180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 409180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 410180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 411180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 412181614Skmacy .get_link_status = get_link_status_r, 413197791Snp .power_down = ael1002_power_down, 414167514Skmacy}; 415167514Skmacy#endif 416167514Skmacy 417197791Snpint t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr, 418176472Skmacy const struct mdio_ops *mdio_ops) 419167514Skmacy{ 420197791Snp struct cphy *phy = &pinfo->phy; 421197791Snp 422197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1006_ops, mdio_ops, 423176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 424176472Skmacy "10GBASE-SR"); 425197791Snp phy->modtype = phy_modtype_sr; 426167514Skmacy ael100x_txon(phy); 427176472Skmacy return 0; 428167514Skmacy} 429167514Skmacy 430197791Snp/* 431197791Snp * Decode our module type. 432197791Snp */ 433197791Snpstatic int ael2xxx_get_module_type(struct cphy *phy, int delay_ms) 434197791Snp{ 435197791Snp int v; 436197791Snp 437197791Snp if (delay_ms) 438197791Snp msleep(delay_ms); 439197791Snp 440197791Snp v = get_phytrans_type(phy); 441197791Snp if (v == phy_transtype_sfp) { 442197791Snp /* SFP: see SFF-8472 for below */ 443197791Snp 444197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3); 445197791Snp if (v < 0) 446197791Snp return v; 447197791Snp 448197791Snp if (v == 0x1) 449204921Snp goto twinax; 450197791Snp if (v == 0x10) 451197791Snp return phy_modtype_sr; 452197791Snp if (v == 0x20) 453197791Snp return phy_modtype_lr; 454197791Snp if (v == 0x40) 455197791Snp return phy_modtype_lrm; 456197791Snp 457204921Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 8); 458204921Snp if (v < 0) 459204921Snp return v; 460204921Snp if (v == 4) { 461204921Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 60); 462204921Snp if (v < 0) 463204921Snp return v; 464204921Snp if (v & 0x1) 465204921Snp goto twinax; 466204921Snp } 467204921Snp 468197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6); 469197791Snp if (v < 0) 470197791Snp return v; 471197791Snp if (v != 4) 472197791Snp return phy_modtype_unknown; 473197791Snp 474197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10); 475197791Snp if (v < 0) 476197791Snp return v; 477197791Snp 478197791Snp if (v & 0x80) { 479204921Snptwinax: 480197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); 481197791Snp if (v < 0) 482197791Snp return v; 483197791Snp return v > 10 ? phy_modtype_twinax_long : 484197791Snp phy_modtype_twinax; 485197791Snp } 486197791Snp } else if (v == phy_transtype_xfp) { 487197791Snp /* XFP: See INF-8077i for details. */ 488197791Snp 489197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127); 490197791Snp if (v < 0) 491197791Snp return v; 492197791Snp 493197791Snp if (v != 1) { 494197791Snp /* XXX: set page select to table 1 yourself */ 495197791Snp return phy_modtype_unknown; 496197791Snp } 497197791Snp 498197791Snp v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131); 499197791Snp if (v < 0) 500197791Snp return v; 501197791Snp v &= 0xf0; 502197791Snp if (v == 0x10) 503197791Snp return phy_modtype_lrm; 504197791Snp if (v == 0x40) 505197791Snp return phy_modtype_lr; 506197791Snp if (v == 0x80) 507197791Snp return phy_modtype_sr; 508197791Snp } 509197791Snp 510197791Snp return phy_modtype_unknown; 511197791Snp} 512197791Snp 513197791Snp/* 514197791Snp * Code to support the Aeluros/NetLogic 2005 10Gb PHY. 515197791Snp */ 516180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 517180583Skmacy{ 518181614Skmacy static struct reg_val regs[] = { 519181614Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 520181614Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 521181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 522181614Skmacy { 0, 0, 0, 0 } 523181614Skmacy }; 524180583Skmacy static u16 sr_edc[] = { 525180583Skmacy 0xcc00, 0x2ff4, 526180583Skmacy 0xcc01, 0x3cd4, 527180583Skmacy 0xcc02, 0x2015, 528180583Skmacy 0xcc03, 0x3105, 529180583Skmacy 0xcc04, 0x6524, 530180583Skmacy 0xcc05, 0x27ff, 531180583Skmacy 0xcc06, 0x300f, 532180583Skmacy 0xcc07, 0x2c8b, 533180583Skmacy 0xcc08, 0x300b, 534180583Skmacy 0xcc09, 0x4009, 535180583Skmacy 0xcc0a, 0x400e, 536180583Skmacy 0xcc0b, 0x2f72, 537180583Skmacy 0xcc0c, 0x3002, 538180583Skmacy 0xcc0d, 0x1002, 539180583Skmacy 0xcc0e, 0x2172, 540180583Skmacy 0xcc0f, 0x3012, 541180583Skmacy 0xcc10, 0x1002, 542180583Skmacy 0xcc11, 0x25d2, 543180583Skmacy 0xcc12, 0x3012, 544180583Skmacy 0xcc13, 0x1002, 545180583Skmacy 0xcc14, 0xd01e, 546180583Skmacy 0xcc15, 0x27d2, 547180583Skmacy 0xcc16, 0x3012, 548180583Skmacy 0xcc17, 0x1002, 549180583Skmacy 0xcc18, 0x2004, 550180583Skmacy 0xcc19, 0x3c84, 551180583Skmacy 0xcc1a, 0x6436, 552180583Skmacy 0xcc1b, 0x2007, 553180583Skmacy 0xcc1c, 0x3f87, 554180583Skmacy 0xcc1d, 0x8676, 555180583Skmacy 0xcc1e, 0x40b7, 556180583Skmacy 0xcc1f, 0xa746, 557180583Skmacy 0xcc20, 0x4047, 558180583Skmacy 0xcc21, 0x5673, 559180583Skmacy 0xcc22, 0x2982, 560180583Skmacy 0xcc23, 0x3002, 561180583Skmacy 0xcc24, 0x13d2, 562180583Skmacy 0xcc25, 0x8bbd, 563180583Skmacy 0xcc26, 0x2862, 564180583Skmacy 0xcc27, 0x3012, 565180583Skmacy 0xcc28, 0x1002, 566180583Skmacy 0xcc29, 0x2092, 567180583Skmacy 0xcc2a, 0x3012, 568180583Skmacy 0xcc2b, 0x1002, 569180583Skmacy 0xcc2c, 0x5cc3, 570180583Skmacy 0xcc2d, 0x314, 571180583Skmacy 0xcc2e, 0x2942, 572180583Skmacy 0xcc2f, 0x3002, 573180583Skmacy 0xcc30, 0x1002, 574180583Skmacy 0xcc31, 0xd019, 575180583Skmacy 0xcc32, 0x2032, 576180583Skmacy 0xcc33, 0x3012, 577180583Skmacy 0xcc34, 0x1002, 578180583Skmacy 0xcc35, 0x2a04, 579180583Skmacy 0xcc36, 0x3c74, 580180583Skmacy 0xcc37, 0x6435, 581180583Skmacy 0xcc38, 0x2fa4, 582180583Skmacy 0xcc39, 0x3cd4, 583180583Skmacy 0xcc3a, 0x6624, 584180583Skmacy 0xcc3b, 0x5563, 585180583Skmacy 0xcc3c, 0x2d42, 586180583Skmacy 0xcc3d, 0x3002, 587180583Skmacy 0xcc3e, 0x13d2, 588180583Skmacy 0xcc3f, 0x464d, 589180583Skmacy 0xcc40, 0x2862, 590180583Skmacy 0xcc41, 0x3012, 591180583Skmacy 0xcc42, 0x1002, 592180583Skmacy 0xcc43, 0x2032, 593180583Skmacy 0xcc44, 0x3012, 594180583Skmacy 0xcc45, 0x1002, 595180583Skmacy 0xcc46, 0x2fb4, 596180583Skmacy 0xcc47, 0x3cd4, 597180583Skmacy 0xcc48, 0x6624, 598180583Skmacy 0xcc49, 0x5563, 599180583Skmacy 0xcc4a, 0x2d42, 600180583Skmacy 0xcc4b, 0x3002, 601180583Skmacy 0xcc4c, 0x13d2, 602180583Skmacy 0xcc4d, 0x2ed2, 603180583Skmacy 0xcc4e, 0x3002, 604180583Skmacy 0xcc4f, 0x1002, 605180583Skmacy 0xcc50, 0x2fd2, 606180583Skmacy 0xcc51, 0x3002, 607180583Skmacy 0xcc52, 0x1002, 608180583Skmacy 0xcc53, 0x004, 609180583Skmacy 0xcc54, 0x2942, 610180583Skmacy 0xcc55, 0x3002, 611180583Skmacy 0xcc56, 0x1002, 612180583Skmacy 0xcc57, 0x2092, 613180583Skmacy 0xcc58, 0x3012, 614180583Skmacy 0xcc59, 0x1002, 615180583Skmacy 0xcc5a, 0x5cc3, 616180583Skmacy 0xcc5b, 0x317, 617180583Skmacy 0xcc5c, 0x2f72, 618180583Skmacy 0xcc5d, 0x3002, 619180583Skmacy 0xcc5e, 0x1002, 620180583Skmacy 0xcc5f, 0x2942, 621180583Skmacy 0xcc60, 0x3002, 622180583Skmacy 0xcc61, 0x1002, 623180583Skmacy 0xcc62, 0x22cd, 624180583Skmacy 0xcc63, 0x301d, 625180583Skmacy 0xcc64, 0x2862, 626180583Skmacy 0xcc65, 0x3012, 627180583Skmacy 0xcc66, 0x1002, 628180583Skmacy 0xcc67, 0x2ed2, 629180583Skmacy 0xcc68, 0x3002, 630180583Skmacy 0xcc69, 0x1002, 631180583Skmacy 0xcc6a, 0x2d72, 632180583Skmacy 0xcc6b, 0x3002, 633180583Skmacy 0xcc6c, 0x1002, 634180583Skmacy 0xcc6d, 0x628f, 635180583Skmacy 0xcc6e, 0x2112, 636180583Skmacy 0xcc6f, 0x3012, 637180583Skmacy 0xcc70, 0x1002, 638180583Skmacy 0xcc71, 0x5aa3, 639180583Skmacy 0xcc72, 0x2dc2, 640180583Skmacy 0xcc73, 0x3002, 641180583Skmacy 0xcc74, 0x1312, 642180583Skmacy 0xcc75, 0x6f72, 643180583Skmacy 0xcc76, 0x1002, 644180583Skmacy 0xcc77, 0x2807, 645180583Skmacy 0xcc78, 0x31a7, 646180583Skmacy 0xcc79, 0x20c4, 647180583Skmacy 0xcc7a, 0x3c24, 648180583Skmacy 0xcc7b, 0x6724, 649180583Skmacy 0xcc7c, 0x1002, 650180583Skmacy 0xcc7d, 0x2807, 651180583Skmacy 0xcc7e, 0x3187, 652180583Skmacy 0xcc7f, 0x20c4, 653180583Skmacy 0xcc80, 0x3c24, 654180583Skmacy 0xcc81, 0x6724, 655180583Skmacy 0xcc82, 0x1002, 656180583Skmacy 0xcc83, 0x2514, 657180583Skmacy 0xcc84, 0x3c64, 658180583Skmacy 0xcc85, 0x6436, 659180583Skmacy 0xcc86, 0xdff4, 660180583Skmacy 0xcc87, 0x6436, 661180583Skmacy 0xcc88, 0x1002, 662180583Skmacy 0xcc89, 0x40a4, 663180583Skmacy 0xcc8a, 0x643c, 664180583Skmacy 0xcc8b, 0x4016, 665180583Skmacy 0xcc8c, 0x8c6c, 666180583Skmacy 0xcc8d, 0x2b24, 667180583Skmacy 0xcc8e, 0x3c24, 668180583Skmacy 0xcc8f, 0x6435, 669180583Skmacy 0xcc90, 0x1002, 670180583Skmacy 0xcc91, 0x2b24, 671180583Skmacy 0xcc92, 0x3c24, 672180583Skmacy 0xcc93, 0x643a, 673180583Skmacy 0xcc94, 0x4025, 674180583Skmacy 0xcc95, 0x8a5a, 675180583Skmacy 0xcc96, 0x1002, 676180583Skmacy 0xcc97, 0x2731, 677180583Skmacy 0xcc98, 0x3011, 678180583Skmacy 0xcc99, 0x1001, 679180583Skmacy 0xcc9a, 0xc7a0, 680180583Skmacy 0xcc9b, 0x100, 681180583Skmacy 0xcc9c, 0xc502, 682180583Skmacy 0xcc9d, 0x53ac, 683180583Skmacy 0xcc9e, 0xc503, 684180583Skmacy 0xcc9f, 0xd5d5, 685180583Skmacy 0xcca0, 0xc600, 686180583Skmacy 0xcca1, 0x2a6d, 687180583Skmacy 0xcca2, 0xc601, 688180583Skmacy 0xcca3, 0x2a4c, 689180583Skmacy 0xcca4, 0xc602, 690180583Skmacy 0xcca5, 0x111, 691180583Skmacy 0xcca6, 0xc60c, 692180583Skmacy 0xcca7, 0x5900, 693180583Skmacy 0xcca8, 0xc710, 694180583Skmacy 0xcca9, 0x700, 695180583Skmacy 0xccaa, 0xc718, 696180583Skmacy 0xccab, 0x700, 697180583Skmacy 0xccac, 0xc720, 698180583Skmacy 0xccad, 0x4700, 699180583Skmacy 0xccae, 0xc801, 700180583Skmacy 0xccaf, 0x7f50, 701180583Skmacy 0xccb0, 0xc802, 702180583Skmacy 0xccb1, 0x7760, 703180583Skmacy 0xccb2, 0xc803, 704180583Skmacy 0xccb3, 0x7fce, 705180583Skmacy 0xccb4, 0xc804, 706180583Skmacy 0xccb5, 0x5700, 707180583Skmacy 0xccb6, 0xc805, 708180583Skmacy 0xccb7, 0x5f11, 709180583Skmacy 0xccb8, 0xc806, 710180583Skmacy 0xccb9, 0x4751, 711180583Skmacy 0xccba, 0xc807, 712180583Skmacy 0xccbb, 0x57e1, 713180583Skmacy 0xccbc, 0xc808, 714180583Skmacy 0xccbd, 0x2700, 715180583Skmacy 0xccbe, 0xc809, 716180583Skmacy 0xccbf, 0x000, 717180583Skmacy 0xccc0, 0xc821, 718180583Skmacy 0xccc1, 0x002, 719180583Skmacy 0xccc2, 0xc822, 720180583Skmacy 0xccc3, 0x014, 721180583Skmacy 0xccc4, 0xc832, 722180583Skmacy 0xccc5, 0x1186, 723180583Skmacy 0xccc6, 0xc847, 724180583Skmacy 0xccc7, 0x1e02, 725180583Skmacy 0xccc8, 0xc013, 726180583Skmacy 0xccc9, 0xf341, 727180583Skmacy 0xccca, 0xc01a, 728180583Skmacy 0xcccb, 0x446, 729180583Skmacy 0xcccc, 0xc024, 730180583Skmacy 0xcccd, 0x1000, 731180583Skmacy 0xccce, 0xc025, 732180583Skmacy 0xcccf, 0xa00, 733180583Skmacy 0xccd0, 0xc026, 734180583Skmacy 0xccd1, 0xc0c, 735180583Skmacy 0xccd2, 0xc027, 736180583Skmacy 0xccd3, 0xc0c, 737180583Skmacy 0xccd4, 0xc029, 738180583Skmacy 0xccd5, 0x0a0, 739180583Skmacy 0xccd6, 0xc030, 740180583Skmacy 0xccd7, 0xa00, 741180583Skmacy 0xccd8, 0xc03c, 742180583Skmacy 0xccd9, 0x01c, 743180583Skmacy 0xccda, 0xc005, 744180583Skmacy 0xccdb, 0x7a06, 745180583Skmacy 0xccdc, 0x000, 746180583Skmacy 0xccdd, 0x2731, 747180583Skmacy 0xccde, 0x3011, 748180583Skmacy 0xccdf, 0x1001, 749180583Skmacy 0xcce0, 0xc620, 750180583Skmacy 0xcce1, 0x000, 751180583Skmacy 0xcce2, 0xc621, 752180583Skmacy 0xcce3, 0x03f, 753180583Skmacy 0xcce4, 0xc622, 754180583Skmacy 0xcce5, 0x000, 755180583Skmacy 0xcce6, 0xc623, 756180583Skmacy 0xcce7, 0x000, 757180583Skmacy 0xcce8, 0xc624, 758180583Skmacy 0xcce9, 0x000, 759180583Skmacy 0xccea, 0xc625, 760180583Skmacy 0xcceb, 0x000, 761180583Skmacy 0xccec, 0xc627, 762180583Skmacy 0xcced, 0x000, 763180583Skmacy 0xccee, 0xc628, 764180583Skmacy 0xccef, 0x000, 765180583Skmacy 0xccf0, 0xc62c, 766180583Skmacy 0xccf1, 0x000, 767180583Skmacy 0xccf2, 0x000, 768180583Skmacy 0xccf3, 0x2806, 769180583Skmacy 0xccf4, 0x3cb6, 770180583Skmacy 0xccf5, 0xc161, 771180583Skmacy 0xccf6, 0x6134, 772180583Skmacy 0xccf7, 0x6135, 773180583Skmacy 0xccf8, 0x5443, 774180583Skmacy 0xccf9, 0x303, 775180583Skmacy 0xccfa, 0x6524, 776180583Skmacy 0xccfb, 0x00b, 777180583Skmacy 0xccfc, 0x1002, 778180583Skmacy 0xccfd, 0x2104, 779180583Skmacy 0xccfe, 0x3c24, 780180583Skmacy 0xccff, 0x2105, 781180583Skmacy 0xcd00, 0x3805, 782180583Skmacy 0xcd01, 0x6524, 783180583Skmacy 0xcd02, 0xdff4, 784180583Skmacy 0xcd03, 0x4005, 785180583Skmacy 0xcd04, 0x6524, 786180583Skmacy 0xcd05, 0x1002, 787180583Skmacy 0xcd06, 0x5dd3, 788180583Skmacy 0xcd07, 0x306, 789180583Skmacy 0xcd08, 0x2ff7, 790180583Skmacy 0xcd09, 0x38f7, 791180583Skmacy 0xcd0a, 0x60b7, 792180583Skmacy 0xcd0b, 0xdffd, 793180583Skmacy 0xcd0c, 0x00a, 794180583Skmacy 0xcd0d, 0x1002, 795180583Skmacy 0xcd0e, 0 796180583Skmacy }; 797180583Skmacy int i, err; 798180583Skmacy 799181614Skmacy err = set_phy_regs(phy, regs); 800181614Skmacy if (err) 801181614Skmacy return err; 802181614Skmacy 803181614Skmacy msleep(50); 804181614Skmacy 805181614Skmacy for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 806180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 807180583Skmacy sr_edc[i + 1]); 808181614Skmacy if (!err) 809181614Skmacy phy->priv = edc_sr; 810180583Skmacy return err; 811180583Skmacy} 812180583Skmacy 813181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) 814181614Skmacy{ 815181614Skmacy static struct reg_val regs[] = { 816181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 }, 817181614Skmacy { 0, 0, 0, 0 } 818181614Skmacy }; 819181614Skmacy static struct reg_val preemphasis[] = { 820181614Skmacy { MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 }, 821181614Skmacy { MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 }, 822181614Skmacy { 0, 0, 0, 0 } 823181614Skmacy }; 824181614Skmacy static u16 twinax_edc[] = { 825181614Skmacy 0xcc00, 0x4009, 826181614Skmacy 0xcc01, 0x27ff, 827181614Skmacy 0xcc02, 0x300f, 828181614Skmacy 0xcc03, 0x40aa, 829181614Skmacy 0xcc04, 0x401c, 830181614Skmacy 0xcc05, 0x401e, 831181614Skmacy 0xcc06, 0x2ff4, 832181614Skmacy 0xcc07, 0x3cd4, 833181614Skmacy 0xcc08, 0x2035, 834181614Skmacy 0xcc09, 0x3145, 835181614Skmacy 0xcc0a, 0x6524, 836181614Skmacy 0xcc0b, 0x26a2, 837181614Skmacy 0xcc0c, 0x3012, 838181614Skmacy 0xcc0d, 0x1002, 839181614Skmacy 0xcc0e, 0x29c2, 840181614Skmacy 0xcc0f, 0x3002, 841181614Skmacy 0xcc10, 0x1002, 842181614Skmacy 0xcc11, 0x2072, 843181614Skmacy 0xcc12, 0x3012, 844181614Skmacy 0xcc13, 0x1002, 845181614Skmacy 0xcc14, 0x22cd, 846181614Skmacy 0xcc15, 0x301d, 847181614Skmacy 0xcc16, 0x2e52, 848181614Skmacy 0xcc17, 0x3012, 849181614Skmacy 0xcc18, 0x1002, 850181614Skmacy 0xcc19, 0x28e2, 851181614Skmacy 0xcc1a, 0x3002, 852181614Skmacy 0xcc1b, 0x1002, 853181614Skmacy 0xcc1c, 0x628f, 854181614Skmacy 0xcc1d, 0x2ac2, 855181614Skmacy 0xcc1e, 0x3012, 856181614Skmacy 0xcc1f, 0x1002, 857181614Skmacy 0xcc20, 0x5553, 858181614Skmacy 0xcc21, 0x2ae2, 859181614Skmacy 0xcc22, 0x3002, 860181614Skmacy 0xcc23, 0x1302, 861181614Skmacy 0xcc24, 0x401e, 862181614Skmacy 0xcc25, 0x2be2, 863181614Skmacy 0xcc26, 0x3012, 864181614Skmacy 0xcc27, 0x1002, 865181614Skmacy 0xcc28, 0x2da2, 866181614Skmacy 0xcc29, 0x3012, 867181614Skmacy 0xcc2a, 0x1002, 868181614Skmacy 0xcc2b, 0x2ba2, 869181614Skmacy 0xcc2c, 0x3002, 870181614Skmacy 0xcc2d, 0x1002, 871181614Skmacy 0xcc2e, 0x5ee3, 872181614Skmacy 0xcc2f, 0x305, 873181614Skmacy 0xcc30, 0x400e, 874181614Skmacy 0xcc31, 0x2bc2, 875181614Skmacy 0xcc32, 0x3002, 876181614Skmacy 0xcc33, 0x1002, 877181614Skmacy 0xcc34, 0x2b82, 878181614Skmacy 0xcc35, 0x3012, 879181614Skmacy 0xcc36, 0x1002, 880181614Skmacy 0xcc37, 0x5663, 881181614Skmacy 0xcc38, 0x302, 882181614Skmacy 0xcc39, 0x401e, 883181614Skmacy 0xcc3a, 0x6f72, 884181614Skmacy 0xcc3b, 0x1002, 885181614Skmacy 0xcc3c, 0x628f, 886181614Skmacy 0xcc3d, 0x2be2, 887181614Skmacy 0xcc3e, 0x3012, 888181614Skmacy 0xcc3f, 0x1002, 889181614Skmacy 0xcc40, 0x22cd, 890181614Skmacy 0xcc41, 0x301d, 891181614Skmacy 0xcc42, 0x2e52, 892181614Skmacy 0xcc43, 0x3012, 893181614Skmacy 0xcc44, 0x1002, 894181614Skmacy 0xcc45, 0x2522, 895181614Skmacy 0xcc46, 0x3012, 896181614Skmacy 0xcc47, 0x1002, 897181614Skmacy 0xcc48, 0x2da2, 898181614Skmacy 0xcc49, 0x3012, 899181614Skmacy 0xcc4a, 0x1002, 900181614Skmacy 0xcc4b, 0x2ca2, 901181614Skmacy 0xcc4c, 0x3012, 902181614Skmacy 0xcc4d, 0x1002, 903181614Skmacy 0xcc4e, 0x2fa4, 904181614Skmacy 0xcc4f, 0x3cd4, 905181614Skmacy 0xcc50, 0x6624, 906181614Skmacy 0xcc51, 0x410b, 907181614Skmacy 0xcc52, 0x56b3, 908181614Skmacy 0xcc53, 0x3c4, 909181614Skmacy 0xcc54, 0x2fb2, 910181614Skmacy 0xcc55, 0x3002, 911181614Skmacy 0xcc56, 0x1002, 912181614Skmacy 0xcc57, 0x220b, 913181614Skmacy 0xcc58, 0x303b, 914181614Skmacy 0xcc59, 0x56b3, 915181614Skmacy 0xcc5a, 0x3c3, 916181614Skmacy 0xcc5b, 0x866b, 917181614Skmacy 0xcc5c, 0x400c, 918181614Skmacy 0xcc5d, 0x23a2, 919181614Skmacy 0xcc5e, 0x3012, 920181614Skmacy 0xcc5f, 0x1002, 921181614Skmacy 0xcc60, 0x2da2, 922181614Skmacy 0xcc61, 0x3012, 923181614Skmacy 0xcc62, 0x1002, 924181614Skmacy 0xcc63, 0x2ca2, 925181614Skmacy 0xcc64, 0x3012, 926181614Skmacy 0xcc65, 0x1002, 927181614Skmacy 0xcc66, 0x2fb4, 928181614Skmacy 0xcc67, 0x3cd4, 929181614Skmacy 0xcc68, 0x6624, 930181614Skmacy 0xcc69, 0x56b3, 931181614Skmacy 0xcc6a, 0x3c3, 932181614Skmacy 0xcc6b, 0x866b, 933181614Skmacy 0xcc6c, 0x401c, 934181614Skmacy 0xcc6d, 0x2205, 935181614Skmacy 0xcc6e, 0x3035, 936181614Skmacy 0xcc6f, 0x5b53, 937181614Skmacy 0xcc70, 0x2c52, 938181614Skmacy 0xcc71, 0x3002, 939181614Skmacy 0xcc72, 0x13c2, 940181614Skmacy 0xcc73, 0x5cc3, 941181614Skmacy 0xcc74, 0x317, 942181614Skmacy 0xcc75, 0x2522, 943181614Skmacy 0xcc76, 0x3012, 944181614Skmacy 0xcc77, 0x1002, 945181614Skmacy 0xcc78, 0x2da2, 946181614Skmacy 0xcc79, 0x3012, 947181614Skmacy 0xcc7a, 0x1002, 948181614Skmacy 0xcc7b, 0x2b82, 949181614Skmacy 0xcc7c, 0x3012, 950181614Skmacy 0xcc7d, 0x1002, 951181614Skmacy 0xcc7e, 0x5663, 952181614Skmacy 0xcc7f, 0x303, 953181614Skmacy 0xcc80, 0x401e, 954181614Skmacy 0xcc81, 0x004, 955181614Skmacy 0xcc82, 0x2c42, 956181614Skmacy 0xcc83, 0x3012, 957181614Skmacy 0xcc84, 0x1002, 958181614Skmacy 0xcc85, 0x6f72, 959181614Skmacy 0xcc86, 0x1002, 960181614Skmacy 0xcc87, 0x628f, 961181614Skmacy 0xcc88, 0x2304, 962181614Skmacy 0xcc89, 0x3c84, 963181614Skmacy 0xcc8a, 0x6436, 964181614Skmacy 0xcc8b, 0xdff4, 965181614Skmacy 0xcc8c, 0x6436, 966181614Skmacy 0xcc8d, 0x2ff5, 967181614Skmacy 0xcc8e, 0x3005, 968181614Skmacy 0xcc8f, 0x8656, 969181614Skmacy 0xcc90, 0xdfba, 970181614Skmacy 0xcc91, 0x56a3, 971181614Skmacy 0xcc92, 0xd05a, 972181614Skmacy 0xcc93, 0x21c2, 973181614Skmacy 0xcc94, 0x3012, 974181614Skmacy 0xcc95, 0x1392, 975181614Skmacy 0xcc96, 0xd05a, 976181614Skmacy 0xcc97, 0x56a3, 977181614Skmacy 0xcc98, 0xdfba, 978181614Skmacy 0xcc99, 0x383, 979181614Skmacy 0xcc9a, 0x6f72, 980181614Skmacy 0xcc9b, 0x1002, 981181614Skmacy 0xcc9c, 0x28c5, 982181614Skmacy 0xcc9d, 0x3005, 983181614Skmacy 0xcc9e, 0x4178, 984181614Skmacy 0xcc9f, 0x5653, 985181614Skmacy 0xcca0, 0x384, 986181614Skmacy 0xcca1, 0x22b2, 987181614Skmacy 0xcca2, 0x3012, 988181614Skmacy 0xcca3, 0x1002, 989181614Skmacy 0xcca4, 0x2be5, 990181614Skmacy 0xcca5, 0x3005, 991181614Skmacy 0xcca6, 0x41e8, 992181614Skmacy 0xcca7, 0x5653, 993181614Skmacy 0xcca8, 0x382, 994181614Skmacy 0xcca9, 0x002, 995181614Skmacy 0xccaa, 0x4258, 996181614Skmacy 0xccab, 0x2474, 997181614Skmacy 0xccac, 0x3c84, 998181614Skmacy 0xccad, 0x6437, 999181614Skmacy 0xccae, 0xdff4, 1000181614Skmacy 0xccaf, 0x6437, 1001181614Skmacy 0xccb0, 0x2ff5, 1002181614Skmacy 0xccb1, 0x3c05, 1003181614Skmacy 0xccb2, 0x8757, 1004181614Skmacy 0xccb3, 0xb888, 1005181614Skmacy 0xccb4, 0x9787, 1006181614Skmacy 0xccb5, 0xdff4, 1007181614Skmacy 0xccb6, 0x6724, 1008181614Skmacy 0xccb7, 0x866a, 1009181614Skmacy 0xccb8, 0x6f72, 1010181614Skmacy 0xccb9, 0x1002, 1011181614Skmacy 0xccba, 0x2d01, 1012181614Skmacy 0xccbb, 0x3011, 1013181614Skmacy 0xccbc, 0x1001, 1014181614Skmacy 0xccbd, 0xc620, 1015181614Skmacy 0xccbe, 0x14e5, 1016181614Skmacy 0xccbf, 0xc621, 1017181614Skmacy 0xccc0, 0xc53d, 1018181614Skmacy 0xccc1, 0xc622, 1019181614Skmacy 0xccc2, 0x3cbe, 1020181614Skmacy 0xccc3, 0xc623, 1021181614Skmacy 0xccc4, 0x4452, 1022181614Skmacy 0xccc5, 0xc624, 1023181614Skmacy 0xccc6, 0xc5c5, 1024181614Skmacy 0xccc7, 0xc625, 1025181614Skmacy 0xccc8, 0xe01e, 1026181614Skmacy 0xccc9, 0xc627, 1027181614Skmacy 0xccca, 0x000, 1028181614Skmacy 0xcccb, 0xc628, 1029181614Skmacy 0xcccc, 0x000, 1030181614Skmacy 0xcccd, 0xc62b, 1031181614Skmacy 0xccce, 0x000, 1032181614Skmacy 0xcccf, 0xc62c, 1033181614Skmacy 0xccd0, 0x000, 1034181614Skmacy 0xccd1, 0x000, 1035181614Skmacy 0xccd2, 0x2d01, 1036181614Skmacy 0xccd3, 0x3011, 1037181614Skmacy 0xccd4, 0x1001, 1038181614Skmacy 0xccd5, 0xc620, 1039181614Skmacy 0xccd6, 0x000, 1040181614Skmacy 0xccd7, 0xc621, 1041181614Skmacy 0xccd8, 0x000, 1042181614Skmacy 0xccd9, 0xc622, 1043181614Skmacy 0xccda, 0x0ce, 1044181614Skmacy 0xccdb, 0xc623, 1045181614Skmacy 0xccdc, 0x07f, 1046181614Skmacy 0xccdd, 0xc624, 1047181614Skmacy 0xccde, 0x032, 1048181614Skmacy 0xccdf, 0xc625, 1049181614Skmacy 0xcce0, 0x000, 1050181614Skmacy 0xcce1, 0xc627, 1051181614Skmacy 0xcce2, 0x000, 1052181614Skmacy 0xcce3, 0xc628, 1053181614Skmacy 0xcce4, 0x000, 1054181614Skmacy 0xcce5, 0xc62b, 1055181614Skmacy 0xcce6, 0x000, 1056181614Skmacy 0xcce7, 0xc62c, 1057181614Skmacy 0xcce8, 0x000, 1058181614Skmacy 0xcce9, 0x000, 1059181614Skmacy 0xccea, 0x2d01, 1060181614Skmacy 0xcceb, 0x3011, 1061181614Skmacy 0xccec, 0x1001, 1062181614Skmacy 0xcced, 0xc502, 1063181614Skmacy 0xccee, 0x609f, 1064181614Skmacy 0xccef, 0xc600, 1065181614Skmacy 0xccf0, 0x2a6e, 1066181614Skmacy 0xccf1, 0xc601, 1067181614Skmacy 0xccf2, 0x2a2c, 1068181614Skmacy 0xccf3, 0xc60c, 1069181614Skmacy 0xccf4, 0x5400, 1070181614Skmacy 0xccf5, 0xc710, 1071181614Skmacy 0xccf6, 0x700, 1072181614Skmacy 0xccf7, 0xc718, 1073181614Skmacy 0xccf8, 0x700, 1074181614Skmacy 0xccf9, 0xc720, 1075181614Skmacy 0xccfa, 0x4700, 1076181614Skmacy 0xccfb, 0xc728, 1077181614Skmacy 0xccfc, 0x700, 1078181614Skmacy 0xccfd, 0xc729, 1079181614Skmacy 0xccfe, 0x1207, 1080181614Skmacy 0xccff, 0xc801, 1081181614Skmacy 0xcd00, 0x7f50, 1082181614Skmacy 0xcd01, 0xc802, 1083181614Skmacy 0xcd02, 0x7760, 1084181614Skmacy 0xcd03, 0xc803, 1085181614Skmacy 0xcd04, 0x7fce, 1086181614Skmacy 0xcd05, 0xc804, 1087181614Skmacy 0xcd06, 0x520e, 1088181614Skmacy 0xcd07, 0xc805, 1089181614Skmacy 0xcd08, 0x5c11, 1090181614Skmacy 0xcd09, 0xc806, 1091181614Skmacy 0xcd0a, 0x3c51, 1092181614Skmacy 0xcd0b, 0xc807, 1093181614Skmacy 0xcd0c, 0x4061, 1094181614Skmacy 0xcd0d, 0xc808, 1095181614Skmacy 0xcd0e, 0x49c1, 1096181614Skmacy 0xcd0f, 0xc809, 1097181614Skmacy 0xcd10, 0x3840, 1098181614Skmacy 0xcd11, 0xc80a, 1099181614Skmacy 0xcd12, 0x000, 1100181614Skmacy 0xcd13, 0xc821, 1101181614Skmacy 0xcd14, 0x002, 1102181614Skmacy 0xcd15, 0xc822, 1103181614Skmacy 0xcd16, 0x046, 1104181614Skmacy 0xcd17, 0xc844, 1105181614Skmacy 0xcd18, 0x182f, 1106181614Skmacy 0xcd19, 0xc013, 1107181614Skmacy 0xcd1a, 0xf341, 1108181614Skmacy 0xcd1b, 0xc01a, 1109181614Skmacy 0xcd1c, 0x446, 1110181614Skmacy 0xcd1d, 0xc024, 1111181614Skmacy 0xcd1e, 0x1000, 1112181614Skmacy 0xcd1f, 0xc025, 1113181614Skmacy 0xcd20, 0xa00, 1114181614Skmacy 0xcd21, 0xc026, 1115181614Skmacy 0xcd22, 0xc0c, 1116181614Skmacy 0xcd23, 0xc027, 1117181614Skmacy 0xcd24, 0xc0c, 1118181614Skmacy 0xcd25, 0xc029, 1119181614Skmacy 0xcd26, 0x0a0, 1120181614Skmacy 0xcd27, 0xc030, 1121181614Skmacy 0xcd28, 0xa00, 1122181614Skmacy 0xcd29, 0xc03c, 1123181614Skmacy 0xcd2a, 0x01c, 1124181614Skmacy 0xcd2b, 0x000, 1125181614Skmacy 0xcd2c, 0x2b84, 1126181614Skmacy 0xcd2d, 0x3c74, 1127181614Skmacy 0xcd2e, 0x6435, 1128181614Skmacy 0xcd2f, 0xdff4, 1129181614Skmacy 0xcd30, 0x6435, 1130181614Skmacy 0xcd31, 0x2806, 1131181614Skmacy 0xcd32, 0x3006, 1132181614Skmacy 0xcd33, 0x8565, 1133181614Skmacy 0xcd34, 0x2b24, 1134181614Skmacy 0xcd35, 0x3c24, 1135181614Skmacy 0xcd36, 0x6436, 1136181614Skmacy 0xcd37, 0x1002, 1137181614Skmacy 0xcd38, 0x2b24, 1138181614Skmacy 0xcd39, 0x3c24, 1139181614Skmacy 0xcd3a, 0x6436, 1140181614Skmacy 0xcd3b, 0x4045, 1141181614Skmacy 0xcd3c, 0x8656, 1142181614Skmacy 0xcd3d, 0x1002, 1143181614Skmacy 0xcd3e, 0x2807, 1144181614Skmacy 0xcd3f, 0x31a7, 1145181614Skmacy 0xcd40, 0x20c4, 1146181614Skmacy 0xcd41, 0x3c24, 1147181614Skmacy 0xcd42, 0x6724, 1148181614Skmacy 0xcd43, 0x1002, 1149181614Skmacy 0xcd44, 0x2807, 1150181614Skmacy 0xcd45, 0x3187, 1151181614Skmacy 0xcd46, 0x20c4, 1152181614Skmacy 0xcd47, 0x3c24, 1153181614Skmacy 0xcd48, 0x6724, 1154181614Skmacy 0xcd49, 0x1002, 1155181614Skmacy 0xcd4a, 0x2514, 1156181614Skmacy 0xcd4b, 0x3c64, 1157181614Skmacy 0xcd4c, 0x6436, 1158181614Skmacy 0xcd4d, 0xdff4, 1159181614Skmacy 0xcd4e, 0x6436, 1160181614Skmacy 0xcd4f, 0x1002, 1161181614Skmacy 0xcd50, 0x2806, 1162181614Skmacy 0xcd51, 0x3cb6, 1163181614Skmacy 0xcd52, 0xc161, 1164181614Skmacy 0xcd53, 0x6134, 1165181614Skmacy 0xcd54, 0x6135, 1166181614Skmacy 0xcd55, 0x5443, 1167181614Skmacy 0xcd56, 0x303, 1168181614Skmacy 0xcd57, 0x6524, 1169181614Skmacy 0xcd58, 0x00b, 1170181614Skmacy 0xcd59, 0x1002, 1171181614Skmacy 0xcd5a, 0xd019, 1172181614Skmacy 0xcd5b, 0x2104, 1173181614Skmacy 0xcd5c, 0x3c24, 1174181614Skmacy 0xcd5d, 0x2105, 1175181614Skmacy 0xcd5e, 0x3805, 1176181614Skmacy 0xcd5f, 0x6524, 1177181614Skmacy 0xcd60, 0xdff4, 1178181614Skmacy 0xcd61, 0x4005, 1179181614Skmacy 0xcd62, 0x6524, 1180181614Skmacy 0xcd63, 0x2e8d, 1181181614Skmacy 0xcd64, 0x303d, 1182181614Skmacy 0xcd65, 0x5dd3, 1183181614Skmacy 0xcd66, 0x306, 1184181614Skmacy 0xcd67, 0x2ff7, 1185181614Skmacy 0xcd68, 0x38f7, 1186181614Skmacy 0xcd69, 0x60b7, 1187181614Skmacy 0xcd6a, 0xdffd, 1188181614Skmacy 0xcd6b, 0x00a, 1189181614Skmacy 0xcd6c, 0x1002, 1190181614Skmacy 0xcd6d, 0 1191181614Skmacy }; 1192181614Skmacy int i, err; 1193181614Skmacy 1194181614Skmacy err = set_phy_regs(phy, regs); 1195181614Skmacy if (!err && modtype == phy_modtype_twinax_long) 1196181614Skmacy err = set_phy_regs(phy, preemphasis); 1197181614Skmacy if (err) 1198181614Skmacy return err; 1199181614Skmacy 1200181614Skmacy msleep(50); 1201181614Skmacy 1202181614Skmacy for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 1203181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 1204181614Skmacy twinax_edc[i + 1]); 1205181614Skmacy if (!err) 1206181614Skmacy phy->priv = edc_twinax; 1207181614Skmacy return err; 1208181614Skmacy} 1209181614Skmacy 1210197791Snpstatic int ael2005_get_module_type(struct cphy *phy, int delay_ms) 1211181614Skmacy{ 1212189643Sgnn int v; 1213197791Snp unsigned int stat; 1214181614Skmacy 1215197791Snp v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); 1216197791Snp if (v) 1217197791Snp return v; 1218181614Skmacy 1219197791Snp if (stat & (1 << 8)) /* module absent */ 1220197791Snp return phy_modtype_none; 1221181614Skmacy 1222197791Snp return ael2xxx_get_module_type(phy, delay_ms); 1223181614Skmacy} 1224181614Skmacy 1225181614Skmacystatic int ael2005_intr_enable(struct cphy *phy) 1226181614Skmacy{ 1227181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); 1228181614Skmacy return err ? err : t3_phy_lasi_intr_enable(phy); 1229181614Skmacy} 1230181614Skmacy 1231181614Skmacystatic int ael2005_intr_disable(struct cphy *phy) 1232181614Skmacy{ 1233181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100); 1234181614Skmacy return err ? err : t3_phy_lasi_intr_disable(phy); 1235181614Skmacy} 1236181614Skmacy 1237181614Skmacystatic int ael2005_intr_clear(struct cphy *phy) 1238181614Skmacy{ 1239181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00); 1240181614Skmacy return err ? err : t3_phy_lasi_intr_clear(phy); 1241181614Skmacy} 1242181614Skmacy 1243180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 1244180583Skmacy{ 1245180583Skmacy static struct reg_val regs0[] = { 1246180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 1247180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 1248180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 1249180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1250180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 1251180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1252180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 1253180583Skmacy { 0, 0, 0, 0 } 1254180583Skmacy }; 1255180583Skmacy static struct reg_val regs1[] = { 1256180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 1257180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 1258180583Skmacy { 0, 0, 0, 0 } 1259180583Skmacy }; 1260180583Skmacy 1261197791Snp int err; 1262197791Snp unsigned int lasi_ctrl; 1263180583Skmacy 1264181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1265181614Skmacy if (err) 1266181614Skmacy return err; 1267181614Skmacy 1268180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 1269180583Skmacy if (err) 1270180583Skmacy return err; 1271180583Skmacy 1272180583Skmacy msleep(125); 1273181614Skmacy phy->priv = edc_none; 1274180583Skmacy err = set_phy_regs(phy, regs0); 1275180583Skmacy if (err) 1276180583Skmacy return err; 1277180583Skmacy 1278180583Skmacy msleep(50); 1279181614Skmacy 1280186282Sgnn err = ael2005_get_module_type(phy, 0); 1281181614Skmacy if (err < 0) 1282181614Skmacy return err; 1283181614Skmacy phy->modtype = (u8)err; 1284181614Skmacy 1285199238Snp if (err == phy_modtype_none) 1286192540Sgnn err = 0; 1287192540Sgnn else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1288181614Skmacy err = ael2005_setup_twinax_edc(phy, err); 1289181614Skmacy else 1290181614Skmacy err = ael2005_setup_sr_edc(phy); 1291180583Skmacy if (err) 1292180583Skmacy return err; 1293180583Skmacy 1294181614Skmacy err = set_phy_regs(phy, regs1); 1295180583Skmacy if (err) 1296180583Skmacy return err; 1297180583Skmacy 1298181614Skmacy /* reset wipes out interrupts, reenable them if they were on */ 1299181614Skmacy if (lasi_ctrl & 1) 1300181614Skmacy err = ael2005_intr_enable(phy); 1301181614Skmacy return err; 1302180583Skmacy} 1303180583Skmacy 1304181614Skmacystatic int ael2005_intr_handler(struct cphy *phy) 1305181614Skmacy{ 1306181614Skmacy unsigned int stat; 1307181614Skmacy int ret, edc_needed, cause = 0; 1308181614Skmacy 1309181614Skmacy ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat); 1310181614Skmacy if (ret) 1311181614Skmacy return ret; 1312181614Skmacy 1313181614Skmacy if (stat & AEL2005_MODDET_IRQ) { 1314181614Skmacy ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 1315181614Skmacy 0xd00); 1316181614Skmacy if (ret) 1317181614Skmacy return ret; 1318181614Skmacy 1319181614Skmacy /* modules have max 300 ms init time after hot plug */ 1320186282Sgnn ret = ael2005_get_module_type(phy, 300); 1321181614Skmacy if (ret < 0) 1322181614Skmacy return ret; 1323181614Skmacy 1324181614Skmacy phy->modtype = (u8)ret; 1325181614Skmacy if (ret == phy_modtype_none) 1326181614Skmacy edc_needed = phy->priv; /* on unplug retain EDC */ 1327181614Skmacy else if (ret == phy_modtype_twinax || 1328181614Skmacy ret == phy_modtype_twinax_long) 1329181614Skmacy edc_needed = edc_twinax; 1330181614Skmacy else 1331181614Skmacy edc_needed = edc_sr; 1332181614Skmacy 1333181614Skmacy if (edc_needed != phy->priv) { 1334181614Skmacy ret = ael2005_reset(phy, 0); 1335181614Skmacy return ret ? ret : cphy_cause_module_change; 1336181614Skmacy } 1337181614Skmacy cause = cphy_cause_module_change; 1338181614Skmacy } 1339181614Skmacy 1340181614Skmacy ret = t3_phy_lasi_intr_handler(phy); 1341189643Sgnn if (ret < 0) 1342189643Sgnn return ret; 1343189643Sgnn 1344189643Sgnn ret |= cause; 1345189643Sgnn if (!ret) 1346189643Sgnn ret |= cphy_cause_link_change; 1347189643Sgnn return ret; 1348181614Skmacy} 1349181614Skmacy 1350197791Snpstatic struct cphy_ops ael2005_ops = { 1351167514Skmacy#ifdef C99_NOT_SUPPORTED 1352180583Skmacy ael2005_reset, 1353181614Skmacy ael2005_intr_enable, 1354181614Skmacy ael2005_intr_disable, 1355181614Skmacy ael2005_intr_clear, 1356181614Skmacy ael2005_intr_handler, 1357180583Skmacy NULL, 1358180583Skmacy NULL, 1359180583Skmacy NULL, 1360180583Skmacy NULL, 1361180583Skmacy NULL, 1362181614Skmacy get_link_status_r, 1363180583Skmacy ael1002_power_down, 1364180583Skmacy#else 1365180583Skmacy .reset = ael2005_reset, 1366181614Skmacy .intr_enable = ael2005_intr_enable, 1367181614Skmacy .intr_disable = ael2005_intr_disable, 1368181614Skmacy .intr_clear = ael2005_intr_clear, 1369181614Skmacy .intr_handler = ael2005_intr_handler, 1370181614Skmacy .get_link_status = get_link_status_r, 1371180583Skmacy .power_down = ael1002_power_down, 1372197791Snp#endif 1373180583Skmacy}; 1374180583Skmacy 1375197791Snpint t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr, 1376180583Skmacy const struct mdio_ops *mdio_ops) 1377180583Skmacy{ 1378186282Sgnn int err; 1379197791Snp struct cphy *phy = &pinfo->phy; 1380197791Snp 1381197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2005_ops, mdio_ops, 1382181614Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 1383181614Skmacy SUPPORTED_IRQ, "10GBASE-R"); 1384180583Skmacy msleep(125); 1385189643Sgnn ael_laser_down(phy, 0); 1386186282Sgnn 1387186282Sgnn err = ael2005_get_module_type(phy, 0); 1388186282Sgnn if (err >= 0) 1389186282Sgnn phy->modtype = err; 1390186282Sgnn 1391180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 1392180583Skmacy 1 << 5); 1393180583Skmacy} 1394180583Skmacy 1395181614Skmacy/* 1396197791Snp * Setup EDC and other parameters for operation with an optical module. 1397197791Snp */ 1398197791Snpstatic int ael2020_setup_sr_edc(struct cphy *phy) 1399197791Snp{ 1400197791Snp static struct reg_val regs[] = { 1401197791Snp { MDIO_DEV_PMA_PMD, 0xcc01, 0xffff, 0x488a }, 1402197791Snp 1403197791Snp { MDIO_DEV_PMA_PMD, 0xcb1b, 0xffff, 0x0200 }, 1404197791Snp { MDIO_DEV_PMA_PMD, 0xcb1c, 0xffff, 0x00f0 }, 1405197791Snp { MDIO_DEV_PMA_PMD, 0xcc06, 0xffff, 0x00e0 }, 1406197791Snp 1407197791Snp /* end */ 1408197791Snp { 0, 0, 0, 0 } 1409197791Snp }; 1410197791Snp int err; 1411197791Snp 1412197791Snp err = set_phy_regs(phy, regs); 1413197791Snp msleep(50); 1414197791Snp if (err) 1415197791Snp return err; 1416197791Snp 1417197791Snp phy->priv = edc_sr; 1418197791Snp return 0; 1419197791Snp} 1420197791Snp 1421197791Snp/* 1422197791Snp * Setup EDC and other parameters for operation with an TWINAX module. 1423197791Snp */ 1424197791Snpstatic int ael2020_setup_twinax_edc(struct cphy *phy, int modtype) 1425197791Snp{ 1426197791Snp static struct reg_val uCclock40MHz[] = { 1427197791Snp { MDIO_DEV_PMA_PMD, 0xff28, 0xffff, 0x4001 }, 1428197791Snp { MDIO_DEV_PMA_PMD, 0xff2a, 0xffff, 0x0002 }, 1429197791Snp { 0, 0, 0, 0 } 1430197791Snp }; 1431197791Snp 1432197791Snp static struct reg_val uCclockActivate[] = { 1433197791Snp { MDIO_DEV_PMA_PMD, 0xd000, 0xffff, 0x5200 }, 1434197791Snp { 0, 0, 0, 0 } 1435197791Snp }; 1436197791Snp 1437197791Snp static struct reg_val uCactivate[] = { 1438197791Snp { MDIO_DEV_PMA_PMD, 0xd080, 0xffff, 0x0100 }, 1439197791Snp { MDIO_DEV_PMA_PMD, 0xd092, 0xffff, 0x0000 }, 1440197791Snp { 0, 0, 0, 0 } 1441197791Snp }; 1442197791Snp 1443197791Snp static u16 twinax_edc[] = { 1444197791Snp 0xd800, 0x4009, 1445197791Snp 0xd801, 0x2fff, 1446197791Snp 0xd802, 0x300f, 1447197791Snp 0xd803, 0x40aa, 1448197791Snp 0xd804, 0x401c, 1449197791Snp 0xd805, 0x401e, 1450197791Snp 0xd806, 0x2ff4, 1451197791Snp 0xd807, 0x3dc4, 1452197791Snp 0xd808, 0x2035, 1453197791Snp 0xd809, 0x3035, 1454197791Snp 0xd80a, 0x6524, 1455197791Snp 0xd80b, 0x2cb2, 1456197791Snp 0xd80c, 0x3012, 1457197791Snp 0xd80d, 0x1002, 1458197791Snp 0xd80e, 0x26e2, 1459197791Snp 0xd80f, 0x3022, 1460197791Snp 0xd810, 0x1002, 1461197791Snp 0xd811, 0x27d2, 1462197791Snp 0xd812, 0x3022, 1463197791Snp 0xd813, 0x1002, 1464197791Snp 0xd814, 0x2822, 1465197791Snp 0xd815, 0x3012, 1466197791Snp 0xd816, 0x1002, 1467197791Snp 0xd817, 0x2492, 1468197791Snp 0xd818, 0x3022, 1469197791Snp 0xd819, 0x1002, 1470197791Snp 0xd81a, 0x2772, 1471197791Snp 0xd81b, 0x3012, 1472197791Snp 0xd81c, 0x1002, 1473197791Snp 0xd81d, 0x23d2, 1474197791Snp 0xd81e, 0x3022, 1475197791Snp 0xd81f, 0x1002, 1476197791Snp 0xd820, 0x22cd, 1477197791Snp 0xd821, 0x301d, 1478197791Snp 0xd822, 0x27f2, 1479197791Snp 0xd823, 0x3022, 1480197791Snp 0xd824, 0x1002, 1481197791Snp 0xd825, 0x5553, 1482197791Snp 0xd826, 0x0307, 1483197791Snp 0xd827, 0x2522, 1484197791Snp 0xd828, 0x3022, 1485197791Snp 0xd829, 0x1002, 1486197791Snp 0xd82a, 0x2142, 1487197791Snp 0xd82b, 0x3012, 1488197791Snp 0xd82c, 0x1002, 1489197791Snp 0xd82d, 0x4016, 1490197791Snp 0xd82e, 0x5e63, 1491197791Snp 0xd82f, 0x0344, 1492197791Snp 0xd830, 0x2142, 1493197791Snp 0xd831, 0x3012, 1494197791Snp 0xd832, 0x1002, 1495197791Snp 0xd833, 0x400e, 1496197791Snp 0xd834, 0x2522, 1497197791Snp 0xd835, 0x3022, 1498197791Snp 0xd836, 0x1002, 1499197791Snp 0xd837, 0x2b52, 1500197791Snp 0xd838, 0x3012, 1501197791Snp 0xd839, 0x1002, 1502197791Snp 0xd83a, 0x2742, 1503197791Snp 0xd83b, 0x3022, 1504197791Snp 0xd83c, 0x1002, 1505197791Snp 0xd83d, 0x25e2, 1506197791Snp 0xd83e, 0x3022, 1507197791Snp 0xd83f, 0x1002, 1508197791Snp 0xd840, 0x2fa4, 1509197791Snp 0xd841, 0x3dc4, 1510197791Snp 0xd842, 0x6624, 1511197791Snp 0xd843, 0x414b, 1512197791Snp 0xd844, 0x56b3, 1513197791Snp 0xd845, 0x03c6, 1514197791Snp 0xd846, 0x866b, 1515197791Snp 0xd847, 0x400c, 1516197791Snp 0xd848, 0x2712, 1517197791Snp 0xd849, 0x3012, 1518197791Snp 0xd84a, 0x1002, 1519197791Snp 0xd84b, 0x2c4b, 1520197791Snp 0xd84c, 0x309b, 1521197791Snp 0xd84d, 0x56b3, 1522197791Snp 0xd84e, 0x03c3, 1523197791Snp 0xd84f, 0x866b, 1524197791Snp 0xd850, 0x400c, 1525197791Snp 0xd851, 0x2272, 1526197791Snp 0xd852, 0x3022, 1527197791Snp 0xd853, 0x1002, 1528197791Snp 0xd854, 0x2742, 1529197791Snp 0xd855, 0x3022, 1530197791Snp 0xd856, 0x1002, 1531197791Snp 0xd857, 0x25e2, 1532197791Snp 0xd858, 0x3022, 1533197791Snp 0xd859, 0x1002, 1534197791Snp 0xd85a, 0x2fb4, 1535197791Snp 0xd85b, 0x3dc4, 1536197791Snp 0xd85c, 0x6624, 1537197791Snp 0xd85d, 0x56b3, 1538197791Snp 0xd85e, 0x03c3, 1539197791Snp 0xd85f, 0x866b, 1540197791Snp 0xd860, 0x401c, 1541197791Snp 0xd861, 0x2c45, 1542197791Snp 0xd862, 0x3095, 1543197791Snp 0xd863, 0x5b53, 1544197791Snp 0xd864, 0x2372, 1545197791Snp 0xd865, 0x3012, 1546197791Snp 0xd866, 0x13c2, 1547197791Snp 0xd867, 0x5cc3, 1548197791Snp 0xd868, 0x2712, 1549197791Snp 0xd869, 0x3012, 1550197791Snp 0xd86a, 0x1312, 1551197791Snp 0xd86b, 0x2b52, 1552197791Snp 0xd86c, 0x3012, 1553197791Snp 0xd86d, 0x1002, 1554197791Snp 0xd86e, 0x2742, 1555197791Snp 0xd86f, 0x3022, 1556197791Snp 0xd870, 0x1002, 1557197791Snp 0xd871, 0x2582, 1558197791Snp 0xd872, 0x3022, 1559197791Snp 0xd873, 0x1002, 1560197791Snp 0xd874, 0x2142, 1561197791Snp 0xd875, 0x3012, 1562197791Snp 0xd876, 0x1002, 1563197791Snp 0xd877, 0x628f, 1564197791Snp 0xd878, 0x2985, 1565197791Snp 0xd879, 0x33a5, 1566197791Snp 0xd87a, 0x25e2, 1567197791Snp 0xd87b, 0x3022, 1568197791Snp 0xd87c, 0x1002, 1569197791Snp 0xd87d, 0x5653, 1570197791Snp 0xd87e, 0x03d2, 1571197791Snp 0xd87f, 0x401e, 1572197791Snp 0xd880, 0x6f72, 1573197791Snp 0xd881, 0x1002, 1574197791Snp 0xd882, 0x628f, 1575197791Snp 0xd883, 0x2304, 1576197791Snp 0xd884, 0x3c84, 1577197791Snp 0xd885, 0x6436, 1578197791Snp 0xd886, 0xdff4, 1579197791Snp 0xd887, 0x6436, 1580197791Snp 0xd888, 0x2ff5, 1581197791Snp 0xd889, 0x3005, 1582197791Snp 0xd88a, 0x8656, 1583197791Snp 0xd88b, 0xdfba, 1584197791Snp 0xd88c, 0x56a3, 1585197791Snp 0xd88d, 0xd05a, 1586197791Snp 0xd88e, 0x2972, 1587197791Snp 0xd88f, 0x3012, 1588197791Snp 0xd890, 0x1392, 1589197791Snp 0xd891, 0xd05a, 1590197791Snp 0xd892, 0x56a3, 1591197791Snp 0xd893, 0xdfba, 1592197791Snp 0xd894, 0x0383, 1593197791Snp 0xd895, 0x6f72, 1594197791Snp 0xd896, 0x1002, 1595197791Snp 0xd897, 0x2b45, 1596197791Snp 0xd898, 0x3005, 1597197791Snp 0xd899, 0x4178, 1598197791Snp 0xd89a, 0x5653, 1599197791Snp 0xd89b, 0x0384, 1600197791Snp 0xd89c, 0x2a62, 1601197791Snp 0xd89d, 0x3012, 1602197791Snp 0xd89e, 0x1002, 1603197791Snp 0xd89f, 0x2f05, 1604197791Snp 0xd8a0, 0x3005, 1605197791Snp 0xd8a1, 0x41c8, 1606197791Snp 0xd8a2, 0x5653, 1607197791Snp 0xd8a3, 0x0382, 1608197791Snp 0xd8a4, 0x0002, 1609197791Snp 0xd8a5, 0x4218, 1610197791Snp 0xd8a6, 0x2474, 1611197791Snp 0xd8a7, 0x3c84, 1612197791Snp 0xd8a8, 0x6437, 1613197791Snp 0xd8a9, 0xdff4, 1614197791Snp 0xd8aa, 0x6437, 1615197791Snp 0xd8ab, 0x2ff5, 1616197791Snp 0xd8ac, 0x3c05, 1617197791Snp 0xd8ad, 0x8757, 1618197791Snp 0xd8ae, 0xb888, 1619197791Snp 0xd8af, 0x9787, 1620197791Snp 0xd8b0, 0xdff4, 1621197791Snp 0xd8b1, 0x6724, 1622197791Snp 0xd8b2, 0x866a, 1623197791Snp 0xd8b3, 0x6f72, 1624197791Snp 0xd8b4, 0x1002, 1625197791Snp 0xd8b5, 0x2641, 1626197791Snp 0xd8b6, 0x3021, 1627197791Snp 0xd8b7, 0x1001, 1628197791Snp 0xd8b8, 0xc620, 1629197791Snp 0xd8b9, 0x0000, 1630197791Snp 0xd8ba, 0xc621, 1631197791Snp 0xd8bb, 0x0000, 1632197791Snp 0xd8bc, 0xc622, 1633197791Snp 0xd8bd, 0x00ce, 1634197791Snp 0xd8be, 0xc623, 1635197791Snp 0xd8bf, 0x007f, 1636197791Snp 0xd8c0, 0xc624, 1637197791Snp 0xd8c1, 0x0032, 1638197791Snp 0xd8c2, 0xc625, 1639197791Snp 0xd8c3, 0x0000, 1640197791Snp 0xd8c4, 0xc627, 1641197791Snp 0xd8c5, 0x0000, 1642197791Snp 0xd8c6, 0xc628, 1643197791Snp 0xd8c7, 0x0000, 1644197791Snp 0xd8c8, 0xc62c, 1645197791Snp 0xd8c9, 0x0000, 1646197791Snp 0xd8ca, 0x0000, 1647197791Snp 0xd8cb, 0x2641, 1648197791Snp 0xd8cc, 0x3021, 1649197791Snp 0xd8cd, 0x1001, 1650197791Snp 0xd8ce, 0xc502, 1651197791Snp 0xd8cf, 0x53ac, 1652197791Snp 0xd8d0, 0xc503, 1653197791Snp 0xd8d1, 0x2cd3, 1654197791Snp 0xd8d2, 0xc600, 1655197791Snp 0xd8d3, 0x2a6e, 1656197791Snp 0xd8d4, 0xc601, 1657197791Snp 0xd8d5, 0x2a2c, 1658197791Snp 0xd8d6, 0xc605, 1659197791Snp 0xd8d7, 0x5557, 1660197791Snp 0xd8d8, 0xc60c, 1661197791Snp 0xd8d9, 0x5400, 1662197791Snp 0xd8da, 0xc710, 1663197791Snp 0xd8db, 0x0700, 1664197791Snp 0xd8dc, 0xc711, 1665197791Snp 0xd8dd, 0x0f06, 1666197791Snp 0xd8de, 0xc718, 1667197791Snp 0xd8df, 0x0700, 1668197791Snp 0xd8e0, 0xc719, 1669197791Snp 0xd8e1, 0x0f06, 1670197791Snp 0xd8e2, 0xc720, 1671197791Snp 0xd8e3, 0x4700, 1672197791Snp 0xd8e4, 0xc721, 1673197791Snp 0xd8e5, 0x0f06, 1674197791Snp 0xd8e6, 0xc728, 1675197791Snp 0xd8e7, 0x0700, 1676197791Snp 0xd8e8, 0xc729, 1677197791Snp 0xd8e9, 0x1207, 1678197791Snp 0xd8ea, 0xc801, 1679197791Snp 0xd8eb, 0x7f50, 1680197791Snp 0xd8ec, 0xc802, 1681197791Snp 0xd8ed, 0x7760, 1682197791Snp 0xd8ee, 0xc803, 1683197791Snp 0xd8ef, 0x7fce, 1684197791Snp 0xd8f0, 0xc804, 1685197791Snp 0xd8f1, 0x520e, 1686197791Snp 0xd8f2, 0xc805, 1687197791Snp 0xd8f3, 0x5c11, 1688197791Snp 0xd8f4, 0xc806, 1689197791Snp 0xd8f5, 0x3c51, 1690197791Snp 0xd8f6, 0xc807, 1691197791Snp 0xd8f7, 0x4061, 1692197791Snp 0xd8f8, 0xc808, 1693197791Snp 0xd8f9, 0x49c1, 1694197791Snp 0xd8fa, 0xc809, 1695197791Snp 0xd8fb, 0x3840, 1696197791Snp 0xd8fc, 0xc80a, 1697197791Snp 0xd8fd, 0x0000, 1698197791Snp 0xd8fe, 0xc821, 1699197791Snp 0xd8ff, 0x0002, 1700197791Snp 0xd900, 0xc822, 1701197791Snp 0xd901, 0x0046, 1702197791Snp 0xd902, 0xc844, 1703197791Snp 0xd903, 0x182f, 1704197791Snp 0xd904, 0xc013, 1705197791Snp 0xd905, 0xf341, 1706197791Snp 0xd906, 0xc084, 1707197791Snp 0xd907, 0x0030, 1708197791Snp 0xd908, 0xc904, 1709197791Snp 0xd909, 0x1401, 1710197791Snp 0xd90a, 0xcb0c, 1711197791Snp 0xd90b, 0x0004, 1712197791Snp 0xd90c, 0xcb0e, 1713197791Snp 0xd90d, 0xa00a, 1714197791Snp 0xd90e, 0xcb0f, 1715197791Snp 0xd90f, 0xc0c0, 1716197791Snp 0xd910, 0xcb10, 1717197791Snp 0xd911, 0xc0c0, 1718197791Snp 0xd912, 0xcb11, 1719197791Snp 0xd913, 0x00a0, 1720197791Snp 0xd914, 0xcb12, 1721197791Snp 0xd915, 0x0007, 1722197791Snp 0xd916, 0xc241, 1723197791Snp 0xd917, 0xa000, 1724197791Snp 0xd918, 0xc243, 1725197791Snp 0xd919, 0x7fe0, 1726197791Snp 0xd91a, 0xc604, 1727197791Snp 0xd91b, 0x000e, 1728197791Snp 0xd91c, 0xc609, 1729197791Snp 0xd91d, 0x00f5, 1730197791Snp 0xd91e, 0xc611, 1731197791Snp 0xd91f, 0x000e, 1732197791Snp 0xd920, 0xc660, 1733197791Snp 0xd921, 0x9600, 1734197791Snp 0xd922, 0xc687, 1735197791Snp 0xd923, 0x0004, 1736197791Snp 0xd924, 0xc60a, 1737197791Snp 0xd925, 0x04f5, 1738197791Snp 0xd926, 0x0000, 1739197791Snp 0xd927, 0x2641, 1740197791Snp 0xd928, 0x3021, 1741197791Snp 0xd929, 0x1001, 1742197791Snp 0xd92a, 0xc620, 1743197791Snp 0xd92b, 0x14e5, 1744197791Snp 0xd92c, 0xc621, 1745197791Snp 0xd92d, 0xc53d, 1746197791Snp 0xd92e, 0xc622, 1747197791Snp 0xd92f, 0x3cbe, 1748197791Snp 0xd930, 0xc623, 1749197791Snp 0xd931, 0x4452, 1750197791Snp 0xd932, 0xc624, 1751197791Snp 0xd933, 0xc5c5, 1752197791Snp 0xd934, 0xc625, 1753197791Snp 0xd935, 0xe01e, 1754197791Snp 0xd936, 0xc627, 1755197791Snp 0xd937, 0x0000, 1756197791Snp 0xd938, 0xc628, 1757197791Snp 0xd939, 0x0000, 1758197791Snp 0xd93a, 0xc62c, 1759197791Snp 0xd93b, 0x0000, 1760197791Snp 0xd93c, 0x0000, 1761197791Snp 0xd93d, 0x2b84, 1762197791Snp 0xd93e, 0x3c74, 1763197791Snp 0xd93f, 0x6435, 1764197791Snp 0xd940, 0xdff4, 1765197791Snp 0xd941, 0x6435, 1766197791Snp 0xd942, 0x2806, 1767197791Snp 0xd943, 0x3006, 1768197791Snp 0xd944, 0x8565, 1769197791Snp 0xd945, 0x2b24, 1770197791Snp 0xd946, 0x3c24, 1771197791Snp 0xd947, 0x6436, 1772197791Snp 0xd948, 0x1002, 1773197791Snp 0xd949, 0x2b24, 1774197791Snp 0xd94a, 0x3c24, 1775197791Snp 0xd94b, 0x6436, 1776197791Snp 0xd94c, 0x4045, 1777197791Snp 0xd94d, 0x8656, 1778197791Snp 0xd94e, 0x5663, 1779197791Snp 0xd94f, 0x0302, 1780197791Snp 0xd950, 0x401e, 1781197791Snp 0xd951, 0x1002, 1782197791Snp 0xd952, 0x2807, 1783197791Snp 0xd953, 0x31a7, 1784197791Snp 0xd954, 0x20c4, 1785197791Snp 0xd955, 0x3c24, 1786197791Snp 0xd956, 0x6724, 1787197791Snp 0xd957, 0x1002, 1788197791Snp 0xd958, 0x2807, 1789197791Snp 0xd959, 0x3187, 1790197791Snp 0xd95a, 0x20c4, 1791197791Snp 0xd95b, 0x3c24, 1792197791Snp 0xd95c, 0x6724, 1793197791Snp 0xd95d, 0x1002, 1794197791Snp 0xd95e, 0x24f4, 1795197791Snp 0xd95f, 0x3c64, 1796197791Snp 0xd960, 0x6436, 1797197791Snp 0xd961, 0xdff4, 1798197791Snp 0xd962, 0x6436, 1799197791Snp 0xd963, 0x1002, 1800197791Snp 0xd964, 0x2006, 1801197791Snp 0xd965, 0x3d76, 1802197791Snp 0xd966, 0xc161, 1803197791Snp 0xd967, 0x6134, 1804197791Snp 0xd968, 0x6135, 1805197791Snp 0xd969, 0x5443, 1806197791Snp 0xd96a, 0x0303, 1807197791Snp 0xd96b, 0x6524, 1808197791Snp 0xd96c, 0x00fb, 1809197791Snp 0xd96d, 0x1002, 1810197791Snp 0xd96e, 0x20d4, 1811197791Snp 0xd96f, 0x3c24, 1812197791Snp 0xd970, 0x2025, 1813197791Snp 0xd971, 0x3005, 1814197791Snp 0xd972, 0x6524, 1815197791Snp 0xd973, 0x1002, 1816197791Snp 0xd974, 0xd019, 1817197791Snp 0xd975, 0x2104, 1818197791Snp 0xd976, 0x3c24, 1819197791Snp 0xd977, 0x2105, 1820197791Snp 0xd978, 0x3805, 1821197791Snp 0xd979, 0x6524, 1822197791Snp 0xd97a, 0xdff4, 1823197791Snp 0xd97b, 0x4005, 1824197791Snp 0xd97c, 0x6524, 1825197791Snp 0xd97d, 0x2e8d, 1826197791Snp 0xd97e, 0x303d, 1827197791Snp 0xd97f, 0x2408, 1828197791Snp 0xd980, 0x35d8, 1829197791Snp 0xd981, 0x5dd3, 1830197791Snp 0xd982, 0x0307, 1831197791Snp 0xd983, 0x8887, 1832197791Snp 0xd984, 0x63a7, 1833197791Snp 0xd985, 0x8887, 1834197791Snp 0xd986, 0x63a7, 1835197791Snp 0xd987, 0xdffd, 1836197791Snp 0xd988, 0x00f9, 1837197791Snp 0xd989, 0x1002, 1838197791Snp 0xd98a, 0x0000, 1839197791Snp }; 1840197791Snp int i, err; 1841197791Snp 1842197791Snp /* set uC clock and activate it */ 1843197791Snp err = set_phy_regs(phy, uCclock40MHz); 1844197791Snp msleep(500); 1845197791Snp if (err) 1846197791Snp return err; 1847197791Snp err = set_phy_regs(phy, uCclockActivate); 1848197791Snp msleep(500); 1849197791Snp if (err) 1850197791Snp return err; 1851197791Snp 1852197791Snp for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 1853197791Snp err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 1854197791Snp twinax_edc[i + 1]); 1855197791Snp /* activate uC */ 1856197791Snp err = set_phy_regs(phy, uCactivate); 1857197791Snp if (!err) 1858197791Snp phy->priv = edc_twinax; 1859197791Snp return err; 1860197791Snp} 1861197791Snp 1862197791Snp/* 1863197791Snp * Return Module Type. 1864197791Snp */ 1865197791Snpstatic int ael2020_get_module_type(struct cphy *phy, int delay_ms) 1866197791Snp{ 1867197791Snp int v; 1868197791Snp unsigned int stat; 1869197791Snp 1870197791Snp v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_STAT, &stat); 1871197791Snp if (v) 1872197791Snp return v; 1873197791Snp 1874197791Snp if (stat & (0x1 << (AEL2020_GPIO_MODDET*4))) { 1875197791Snp /* module absent */ 1876197791Snp return phy_modtype_none; 1877197791Snp } 1878197791Snp 1879197791Snp return ael2xxx_get_module_type(phy, delay_ms); 1880197791Snp} 1881197791Snp 1882197791Snp/* 1883197791Snp * Enable PHY interrupts. We enable "Module Detection" interrupts (on any 1884197791Snp * state transition) and then generic Link Alarm Status Interrupt (LASI). 1885197791Snp */ 1886197791Snpstatic int ael2020_intr_enable(struct cphy *phy) 1887197791Snp{ 1888197791Snp struct reg_val regs[] = { 1889197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CFG+AEL2020_GPIO_LSTAT, 1890197791Snp 0xffff, 0x4 }, 1891197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1892197791Snp 0xffff, 0x8 << (AEL2020_GPIO_LSTAT*4) }, 1893197791Snp 1894197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1895197791Snp 0xffff, 0x2 << (AEL2020_GPIO_MODDET*4) }, 1896197791Snp 1897197791Snp /* end */ 1898197791Snp { 0, 0, 0, 0 } 1899197791Snp }; 1900197791Snp int err; 1901197791Snp 1902197791Snp err = set_phy_regs(phy, regs); 1903197791Snp if (err) 1904197791Snp return err; 1905197791Snp 1906197791Snp phy->caps |= POLL_LINK_1ST_TIME; 1907197791Snp 1908197791Snp /* enable standard Link Alarm Status Interrupts */ 1909197791Snp err = t3_phy_lasi_intr_enable(phy); 1910197791Snp if (err) 1911197791Snp return err; 1912197791Snp 1913197791Snp return 0; 1914197791Snp} 1915197791Snp 1916197791Snp/* 1917197791Snp * Disable PHY interrupts. The mirror of the above ... 1918197791Snp */ 1919197791Snpstatic int ael2020_intr_disable(struct cphy *phy) 1920197791Snp{ 1921197791Snp struct reg_val regs[] = { 1922197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1923197791Snp 0xffff, 0xb << (AEL2020_GPIO_LSTAT*4) }, 1924197791Snp 1925197791Snp { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, 1926197791Snp 0xffff, 0x1 << (AEL2020_GPIO_MODDET*4) }, 1927197791Snp 1928197791Snp /* end */ 1929197791Snp { 0, 0, 0, 0 } 1930197791Snp }; 1931197791Snp int err; 1932197791Snp 1933197791Snp err = set_phy_regs(phy, regs); 1934197791Snp if (err) 1935197791Snp return err; 1936197791Snp 1937197791Snp /* disable standard Link Alarm Status Interrupts */ 1938197791Snp return t3_phy_lasi_intr_disable(phy); 1939197791Snp} 1940197791Snp 1941197791Snp/* 1942197791Snp * Clear PHY interrupt state. 1943197791Snp */ 1944197791Snpstatic int ael2020_intr_clear(struct cphy *phy) 1945197791Snp{ 1946197791Snp unsigned int stat; 1947197791Snp int err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat); 1948197791Snp return err ? err : t3_phy_lasi_intr_clear(phy); 1949197791Snp} 1950197791Snp 1951197791Snp/* 1952197791Snp * Common register settings for the AEL2020 when it comes out of reset. 1953197791Snp */ 1954197791Snpstatic struct reg_val ael2020_reset_regs[] = { 1955197791Snp { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x3101 }, 1956197791Snp 1957197791Snp { MDIO_DEV_PMA_PMD, 0xcd40, 0xffff, 0x0001 }, 1958197791Snp 1959197791Snp { MDIO_DEV_PMA_PMD, 0xff02, 0xffff, 0x0023 }, 1960197791Snp { MDIO_DEV_PMA_PMD, 0xff03, 0xffff, 0x0000 }, 1961197791Snp { MDIO_DEV_PMA_PMD, 0xff04, 0xffff, 0x0000 }, 1962197791Snp 1963197791Snp /* end */ 1964197791Snp { 0, 0, 0, 0 } 1965197791Snp}; 1966197791Snp 1967197791Snp/* 1968197791Snp * Reset the PHY and put it into a canonical operating state. 1969197791Snp */ 1970197791Snpstatic int ael2020_reset(struct cphy *phy, int wait) 1971197791Snp{ 1972197791Snp int err; 1973197791Snp unsigned int lasi_ctrl; 1974197791Snp 1975197791Snp /* grab current interrupt state */ 1976197791Snp err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1977197791Snp if (err) 1978197791Snp return err; 1979197791Snp 1980197791Snp err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 125); 1981197791Snp if (err) 1982197791Snp return err; 1983197791Snp msleep(100); 1984197791Snp 1985197791Snp /* basic initialization for all module types */ 1986197791Snp phy->priv = edc_none; 1987197791Snp err = set_phy_regs(phy, ael2020_reset_regs); 1988197791Snp if (err) 1989197791Snp return err; 1990197791Snp 1991197791Snp /* determine module type and perform appropriate initialization */ 1992197791Snp err = ael2020_get_module_type(phy, 0); 1993197791Snp if (err < 0) 1994197791Snp return err; 1995197791Snp phy->modtype = (u8)err; 1996199238Snp if (err == phy_modtype_none) 1997197791Snp err = 0; 1998197791Snp else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1999197791Snp err = ael2020_setup_twinax_edc(phy, err); 2000197791Snp else 2001197791Snp err = ael2020_setup_sr_edc(phy); 2002197791Snp if (err) 2003197791Snp return err; 2004197791Snp 2005197791Snp /* reset wipes out interrupts, reenable them if they were on */ 2006197791Snp if (lasi_ctrl & 1) 2007197791Snp err = ael2020_intr_enable(phy); 2008197791Snp return err; 2009197791Snp} 2010197791Snp 2011197791Snp/* 2012197791Snp * Handle a PHY interrupt. 2013197791Snp */ 2014197791Snpstatic int ael2020_intr_handler(struct cphy *phy) 2015197791Snp{ 2016197791Snp unsigned int stat; 2017197791Snp int ret, edc_needed, cause = 0; 2018197791Snp 2019197791Snp ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat); 2020197791Snp if (ret) 2021197791Snp return ret; 2022197791Snp 2023197791Snp if (stat & (0x1 << AEL2020_GPIO_MODDET)) { 2024197791Snp /* modules have max 300 ms init time after hot plug */ 2025197791Snp ret = ael2020_get_module_type(phy, 300); 2026197791Snp if (ret < 0) 2027197791Snp return ret; 2028197791Snp 2029197791Snp phy->modtype = (u8)ret; 2030197791Snp if (ret == phy_modtype_none) 2031197791Snp edc_needed = phy->priv; /* on unplug retain EDC */ 2032197791Snp else if (ret == phy_modtype_twinax || 2033197791Snp ret == phy_modtype_twinax_long) 2034197791Snp edc_needed = edc_twinax; 2035197791Snp else 2036197791Snp edc_needed = edc_sr; 2037197791Snp 2038197791Snp if (edc_needed != phy->priv) { 2039197791Snp ret = ael2020_reset(phy, 0); 2040197791Snp return ret ? ret : cphy_cause_module_change; 2041197791Snp } 2042197791Snp cause = cphy_cause_module_change; 2043197791Snp } 2044197791Snp 2045197791Snp ret = t3_phy_lasi_intr_handler(phy); 2046197791Snp if (ret < 0) 2047197791Snp return ret; 2048197791Snp 2049197791Snp ret |= cause; 2050197791Snp if (!ret) 2051197791Snp ret |= cphy_cause_link_change; 2052197791Snp return ret; 2053197791Snp} 2054197791Snp 2055197791Snpstatic struct cphy_ops ael2020_ops = { 2056197791Snp#ifdef C99_NOT_SUPPORTED 2057197791Snp ael2020_reset, 2058197791Snp ael2020_intr_enable, 2059197791Snp ael2020_intr_disable, 2060197791Snp ael2020_intr_clear, 2061197791Snp ael2020_intr_handler, 2062197791Snp NULL, 2063197791Snp NULL, 2064197791Snp NULL, 2065197791Snp NULL, 2066197791Snp NULL, 2067197791Snp get_link_status_r, 2068197791Snp ael1002_power_down, 2069197791Snp#else 2070197791Snp .reset = ael2020_reset, 2071197791Snp .intr_enable = ael2020_intr_enable, 2072197791Snp .intr_disable = ael2020_intr_disable, 2073197791Snp .intr_clear = ael2020_intr_clear, 2074197791Snp .intr_handler = ael2020_intr_handler, 2075197791Snp .get_link_status = get_link_status_r, 2076197791Snp .power_down = ael1002_power_down, 2077197791Snp#endif 2078197791Snp}; 2079197791Snp 2080197791Snpint t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr, 2081197791Snp const struct mdio_ops *mdio_ops) 2082197791Snp{ 2083197791Snp int err; 2084197791Snp struct cphy *phy = &pinfo->phy; 2085197791Snp 2086197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2020_ops, mdio_ops, 2087197791Snp SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 2088197791Snp SUPPORTED_IRQ, "10GBASE-R"); 2089197791Snp msleep(125); 2090197791Snp 2091197791Snp err = set_phy_regs(phy, ael2020_reset_regs); 2092197791Snp if (err) 2093197791Snp return err; 2094197791Snp err = ael2020_get_module_type(phy, 0); 2095197791Snp if (err >= 0) 2096197791Snp phy->modtype = err; 2097197791Snp 2098197791Snp ael_laser_down(phy, 0); 2099197791Snp return 0; 2100197791Snp} 2101197791Snp 2102197791Snp/* 2103181614Skmacy * Get link status for a 10GBASE-X device. 2104181614Skmacy */ 2105181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed, 2106181614Skmacy int *duplex, int *fc) 2107181614Skmacy{ 2108181614Skmacy if (link_ok) { 2109181614Skmacy unsigned int stat0, stat1, stat2; 2110181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 2111181614Skmacy 2112181614Skmacy if (!err) 2113181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1); 2114181614Skmacy if (!err) 2115181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 2116181614Skmacy if (err) 2117181614Skmacy return err; 2118181614Skmacy *link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1; 2119181614Skmacy } 2120181614Skmacy if (speed) 2121181614Skmacy *speed = SPEED_10000; 2122181614Skmacy if (duplex) 2123181614Skmacy *duplex = DUPLEX_FULL; 2124181614Skmacy return 0; 2125181614Skmacy} 2126181614Skmacy 2127180583Skmacy#ifdef C99_NOT_SUPPORTED 2128167514Skmacystatic struct cphy_ops qt2045_ops = { 2129167514Skmacy ael1006_reset, 2130180583Skmacy t3_phy_lasi_intr_enable, 2131180583Skmacy t3_phy_lasi_intr_disable, 2132180583Skmacy t3_phy_lasi_intr_clear, 2133180583Skmacy t3_phy_lasi_intr_handler, 2134167514Skmacy NULL, 2135167514Skmacy NULL, 2136167514Skmacy NULL, 2137167514Skmacy NULL, 2138167514Skmacy NULL, 2139181614Skmacy get_link_status_x, 2140197791Snp ael1002_power_down, 2141167514Skmacy}; 2142167514Skmacy#else 2143167514Skmacystatic struct cphy_ops qt2045_ops = { 2144167514Skmacy .reset = ael1006_reset, 2145180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 2146180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 2147180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 2148180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 2149181614Skmacy .get_link_status = get_link_status_x, 2150197791Snp .power_down = ael1002_power_down, 2151167514Skmacy}; 2152167514Skmacy#endif 2153167514Skmacy 2154197791Snpint t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr, 2155176472Skmacy const struct mdio_ops *mdio_ops) 2156167514Skmacy{ 2157167514Skmacy unsigned int stat; 2158197791Snp struct cphy *phy = &pinfo->phy; 2159167514Skmacy 2160197791Snp cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &qt2045_ops, mdio_ops, 2161176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 2162176472Skmacy "10GBASE-CX4"); 2163167514Skmacy 2164167514Skmacy /* 2165167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 2166167514Skmacy * have it at 1. 2167167514Skmacy */ 2168167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 2169167514Skmacy stat == 0xffff) 2170167514Skmacy phy->addr = 1; 2171176472Skmacy return 0; 2172167514Skmacy} 2173167514Skmacy 2174167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 2175167514Skmacy{ 2176167514Skmacy return 0; 2177167514Skmacy} 2178167514Skmacy 2179167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, 2180167514Skmacy int *speed, int *duplex, int *fc) 2181167514Skmacy{ 2182167514Skmacy if (link_ok) { 2183167514Skmacy unsigned int status; 2184197791Snp adapter_t *adapter = phy->adapter; 2185189643Sgnn 2186197791Snp status = t3_read_reg(adapter, 2187170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 2188197791Snp t3_read_reg(adapter, 2189170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 2190197791Snp t3_read_reg(adapter, 2191170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 2192197791Snp t3_read_reg(adapter, 2193170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 2194167514Skmacy *link_ok = !(status & F_LOWSIG0); 2195167514Skmacy } 2196167514Skmacy if (speed) 2197167514Skmacy *speed = SPEED_10000; 2198167514Skmacy if (duplex) 2199167514Skmacy *duplex = DUPLEX_FULL; 2200167514Skmacy return 0; 2201167514Skmacy} 2202167514Skmacy 2203167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 2204167514Skmacy{ 2205167514Skmacy return 0; 2206167514Skmacy} 2207167514Skmacy 2208167514Skmacy#ifdef C99_NOT_SUPPORTED 2209167514Skmacystatic struct cphy_ops xaui_direct_ops = { 2210167514Skmacy xaui_direct_reset, 2211167514Skmacy ael1002_intr_noop, 2212167514Skmacy ael1002_intr_noop, 2213167514Skmacy ael1002_intr_noop, 2214167514Skmacy ael1002_intr_noop, 2215167514Skmacy NULL, 2216167514Skmacy NULL, 2217167514Skmacy NULL, 2218167514Skmacy NULL, 2219167514Skmacy NULL, 2220167514Skmacy xaui_direct_get_link_status, 2221167514Skmacy xaui_direct_power_down, 2222167514Skmacy}; 2223167514Skmacy#else 2224167514Skmacystatic struct cphy_ops xaui_direct_ops = { 2225167514Skmacy .reset = xaui_direct_reset, 2226167514Skmacy .intr_enable = ael1002_intr_noop, 2227167514Skmacy .intr_disable = ael1002_intr_noop, 2228167514Skmacy .intr_clear = ael1002_intr_noop, 2229167514Skmacy .intr_handler = ael1002_intr_noop, 2230167514Skmacy .get_link_status = xaui_direct_get_link_status, 2231167514Skmacy .power_down = xaui_direct_power_down, 2232167514Skmacy}; 2233167514Skmacy#endif 2234167514Skmacy 2235197791Snpint t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr, 2236176472Skmacy const struct mdio_ops *mdio_ops) 2237167514Skmacy{ 2238197791Snp cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &xaui_direct_ops, mdio_ops, 2239176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 2240176472Skmacy "10GBASE-CX4"); 2241176472Skmacy return 0; 2242167514Skmacy} 2243