cxgb_ael1002.c revision 185157
1167514Skmacy/************************************************************************** 2167514Skmacy 3177340SkmacyCopyright (c) 2007-2008, 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 185157 2008-11-21 19:22:25Z gnn $"); 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, 48167514Skmacy AEL1002_PWR_DOWN_HI = 0xc011, 49167514Skmacy AEL1002_PWR_DOWN_LO = 0xc012, 50167514Skmacy AEL1002_XFI_EQL = 0xc015, 51167514Skmacy AEL1002_LB_EN = 0xc017, 52180583Skmacy AEL_OPT_SETTINGS = 0xc017, 53181614Skmacy AEL_I2C_CTRL = 0xc30a, 54181614Skmacy AEL_I2C_DATA = 0xc30b, 55181614Skmacy AEL_I2C_STAT = 0xc30c, 56181614Skmacy AEL2005_GPIO_CTRL = 0xc214, 57181614Skmacy AEL2005_GPIO_STAT = 0xc215, 58180583Skmacy}; 59167514Skmacy 60181614Skmacyenum { edc_none, edc_sr, edc_twinax }; 61181614Skmacy 62181614Skmacy/* PHY module I2C device address */ 63181614Skmacy#define MODULE_DEV_ADDR 0xa0 64181614Skmacy 65181614Skmacy#define AEL2005_MODDET_IRQ 4 66181614Skmacy 67180583Skmacystruct reg_val { 68180583Skmacy unsigned short mmd_addr; 69180583Skmacy unsigned short reg_addr; 70180583Skmacy unsigned short clear_bits; 71180583Skmacy unsigned short set_bits; 72167514Skmacy}; 73167514Skmacy 74180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv) 75180583Skmacy{ 76180583Skmacy int err; 77180583Skmacy 78180583Skmacy for (err = 0; rv->mmd_addr && !err; rv++) { 79180583Skmacy if (rv->clear_bits == 0xffff) 80180583Skmacy err = mdio_write(phy, rv->mmd_addr, rv->reg_addr, 81180583Skmacy rv->set_bits); 82180583Skmacy else 83180583Skmacy err = t3_mdio_change_bits(phy, rv->mmd_addr, 84180583Skmacy rv->reg_addr, rv->clear_bits, 85180583Skmacy rv->set_bits); 86180583Skmacy } 87180583Skmacy return err; 88180583Skmacy} 89180583Skmacy 90167514Skmacystatic void ael100x_txon(struct cphy *phy) 91167514Skmacy{ 92167514Skmacy int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL; 93167514Skmacy 94176472Skmacy msleep(100); 95167514Skmacy t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio); 96176472Skmacy msleep(30); 97167514Skmacy} 98167514Skmacy 99167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable) 100167514Skmacy{ 101167514Skmacy int err; 102167514Skmacy 103167514Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable); 104167514Skmacy if (!err) 105167514Skmacy err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 106167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 107167514Skmacy return err; 108167514Skmacy} 109167514Skmacy 110167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait) 111167514Skmacy{ 112167514Skmacy int err; 113167514Skmacy 114167514Skmacy if ((err = ael1002_power_down(phy, 0)) || 115167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) || 116167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) || 117167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) || 118167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) || 119167514Skmacy (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN, 120167514Skmacy 0, 1 << 5))) 121167514Skmacy return err; 122167514Skmacy return 0; 123167514Skmacy} 124167514Skmacy 125167514Skmacystatic int ael1002_intr_noop(struct cphy *phy) 126167514Skmacy{ 127167514Skmacy return 0; 128167514Skmacy} 129167514Skmacy 130181614Skmacy/* 131181614Skmacy * Get link status for a 10GBASE-R device. 132181614Skmacy */ 133181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed, 134181614Skmacy int *duplex, int *fc) 135167514Skmacy{ 136167514Skmacy if (link_ok) { 137181614Skmacy unsigned int stat0, stat1, stat2; 138181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 139167514Skmacy 140181614Skmacy if (!err) 141181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1); 142181614Skmacy if (!err) 143181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 144167514Skmacy if (err) 145167514Skmacy return err; 146181614Skmacy *link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1; 147167514Skmacy } 148167514Skmacy if (speed) 149167514Skmacy *speed = SPEED_10000; 150167514Skmacy if (duplex) 151167514Skmacy *duplex = DUPLEX_FULL; 152167514Skmacy return 0; 153167514Skmacy} 154167514Skmacy 155167514Skmacy#ifdef C99_NOT_SUPPORTED 156167514Skmacystatic struct cphy_ops ael1002_ops = { 157167514Skmacy ael1002_reset, 158167514Skmacy ael1002_intr_noop, 159167514Skmacy ael1002_intr_noop, 160167514Skmacy ael1002_intr_noop, 161167514Skmacy ael1002_intr_noop, 162167514Skmacy NULL, 163167514Skmacy NULL, 164167514Skmacy NULL, 165167514Skmacy NULL, 166167514Skmacy NULL, 167181614Skmacy get_link_status_r, 168167514Skmacy ael1002_power_down, 169167514Skmacy}; 170167514Skmacy#else 171167514Skmacystatic struct cphy_ops ael1002_ops = { 172167514Skmacy .reset = ael1002_reset, 173167514Skmacy .intr_enable = ael1002_intr_noop, 174167514Skmacy .intr_disable = ael1002_intr_noop, 175167514Skmacy .intr_clear = ael1002_intr_noop, 176167514Skmacy .intr_handler = ael1002_intr_noop, 177181614Skmacy .get_link_status = get_link_status_r, 178167514Skmacy .power_down = ael1002_power_down, 179167514Skmacy}; 180167514Skmacy#endif 181167514Skmacy 182176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 183176472Skmacy const struct mdio_ops *mdio_ops) 184167514Skmacy{ 185176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops, 186176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 187177340Skmacy "10GBASE-R"); 188167514Skmacy ael100x_txon(phy); 189176472Skmacy return 0; 190167514Skmacy} 191167514Skmacy 192167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait) 193167514Skmacy{ 194185157Sgnn u32 gpio_out; 195185157Sgnn t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 196185157Sgnn /* Hack to reset the phy correctly */ 197185157Sgnn /* Read out the current value */ 198185157Sgnn gpio_out = t3_read_reg(phy->adapter, A_T3DBG_GPIO_EN); 199185157Sgnn /* Reset the phy */ 200185157Sgnn gpio_out &= ~F_GPIO6_OUT_VAL; 201185157Sgnn t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out); 202185157Sgnn msleep(125); 203185157Sgnn /* Take the phy out of reset */ 204185157Sgnn gpio_out |= F_GPIO6_OUT_VAL; 205185157Sgnn t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out); 206185157Sgnn msleep(125); 207185157Sgnn t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 208185157Sgnn return 0; 209167514Skmacy} 210167514Skmacy 211167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable) 212167514Skmacy{ 213167514Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 214167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 215167514Skmacy} 216167514Skmacy 217167514Skmacy#ifdef C99_NOT_SUPPORTED 218167514Skmacystatic struct cphy_ops ael1006_ops = { 219167514Skmacy ael1006_reset, 220180583Skmacy t3_phy_lasi_intr_enable, 221180583Skmacy t3_phy_lasi_intr_disable, 222180583Skmacy t3_phy_lasi_intr_clear, 223180583Skmacy t3_phy_lasi_intr_handler, 224167514Skmacy NULL, 225167514Skmacy NULL, 226167514Skmacy NULL, 227167514Skmacy NULL, 228167514Skmacy NULL, 229181614Skmacy get_link_status_r, 230167514Skmacy ael1006_power_down, 231167514Skmacy}; 232167514Skmacy#else 233167514Skmacystatic struct cphy_ops ael1006_ops = { 234167514Skmacy .reset = ael1006_reset, 235180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 236180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 237180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 238180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 239181614Skmacy .get_link_status = get_link_status_r, 240167514Skmacy .power_down = ael1006_power_down, 241167514Skmacy}; 242167514Skmacy#endif 243167514Skmacy 244176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 245176472Skmacy const struct mdio_ops *mdio_ops) 246167514Skmacy{ 247176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops, 248176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 249176472Skmacy "10GBASE-SR"); 250167514Skmacy ael100x_txon(phy); 251176472Skmacy return 0; 252167514Skmacy} 253167514Skmacy 254180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 255180583Skmacy{ 256181614Skmacy static struct reg_val regs[] = { 257181614Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 258181614Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 259181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 260181614Skmacy { 0, 0, 0, 0 } 261181614Skmacy }; 262180583Skmacy static u16 sr_edc[] = { 263180583Skmacy 0xcc00, 0x2ff4, 264180583Skmacy 0xcc01, 0x3cd4, 265180583Skmacy 0xcc02, 0x2015, 266180583Skmacy 0xcc03, 0x3105, 267180583Skmacy 0xcc04, 0x6524, 268180583Skmacy 0xcc05, 0x27ff, 269180583Skmacy 0xcc06, 0x300f, 270180583Skmacy 0xcc07, 0x2c8b, 271180583Skmacy 0xcc08, 0x300b, 272180583Skmacy 0xcc09, 0x4009, 273180583Skmacy 0xcc0a, 0x400e, 274180583Skmacy 0xcc0b, 0x2f72, 275180583Skmacy 0xcc0c, 0x3002, 276180583Skmacy 0xcc0d, 0x1002, 277180583Skmacy 0xcc0e, 0x2172, 278180583Skmacy 0xcc0f, 0x3012, 279180583Skmacy 0xcc10, 0x1002, 280180583Skmacy 0xcc11, 0x25d2, 281180583Skmacy 0xcc12, 0x3012, 282180583Skmacy 0xcc13, 0x1002, 283180583Skmacy 0xcc14, 0xd01e, 284180583Skmacy 0xcc15, 0x27d2, 285180583Skmacy 0xcc16, 0x3012, 286180583Skmacy 0xcc17, 0x1002, 287180583Skmacy 0xcc18, 0x2004, 288180583Skmacy 0xcc19, 0x3c84, 289180583Skmacy 0xcc1a, 0x6436, 290180583Skmacy 0xcc1b, 0x2007, 291180583Skmacy 0xcc1c, 0x3f87, 292180583Skmacy 0xcc1d, 0x8676, 293180583Skmacy 0xcc1e, 0x40b7, 294180583Skmacy 0xcc1f, 0xa746, 295180583Skmacy 0xcc20, 0x4047, 296180583Skmacy 0xcc21, 0x5673, 297180583Skmacy 0xcc22, 0x2982, 298180583Skmacy 0xcc23, 0x3002, 299180583Skmacy 0xcc24, 0x13d2, 300180583Skmacy 0xcc25, 0x8bbd, 301180583Skmacy 0xcc26, 0x2862, 302180583Skmacy 0xcc27, 0x3012, 303180583Skmacy 0xcc28, 0x1002, 304180583Skmacy 0xcc29, 0x2092, 305180583Skmacy 0xcc2a, 0x3012, 306180583Skmacy 0xcc2b, 0x1002, 307180583Skmacy 0xcc2c, 0x5cc3, 308180583Skmacy 0xcc2d, 0x314, 309180583Skmacy 0xcc2e, 0x2942, 310180583Skmacy 0xcc2f, 0x3002, 311180583Skmacy 0xcc30, 0x1002, 312180583Skmacy 0xcc31, 0xd019, 313180583Skmacy 0xcc32, 0x2032, 314180583Skmacy 0xcc33, 0x3012, 315180583Skmacy 0xcc34, 0x1002, 316180583Skmacy 0xcc35, 0x2a04, 317180583Skmacy 0xcc36, 0x3c74, 318180583Skmacy 0xcc37, 0x6435, 319180583Skmacy 0xcc38, 0x2fa4, 320180583Skmacy 0xcc39, 0x3cd4, 321180583Skmacy 0xcc3a, 0x6624, 322180583Skmacy 0xcc3b, 0x5563, 323180583Skmacy 0xcc3c, 0x2d42, 324180583Skmacy 0xcc3d, 0x3002, 325180583Skmacy 0xcc3e, 0x13d2, 326180583Skmacy 0xcc3f, 0x464d, 327180583Skmacy 0xcc40, 0x2862, 328180583Skmacy 0xcc41, 0x3012, 329180583Skmacy 0xcc42, 0x1002, 330180583Skmacy 0xcc43, 0x2032, 331180583Skmacy 0xcc44, 0x3012, 332180583Skmacy 0xcc45, 0x1002, 333180583Skmacy 0xcc46, 0x2fb4, 334180583Skmacy 0xcc47, 0x3cd4, 335180583Skmacy 0xcc48, 0x6624, 336180583Skmacy 0xcc49, 0x5563, 337180583Skmacy 0xcc4a, 0x2d42, 338180583Skmacy 0xcc4b, 0x3002, 339180583Skmacy 0xcc4c, 0x13d2, 340180583Skmacy 0xcc4d, 0x2ed2, 341180583Skmacy 0xcc4e, 0x3002, 342180583Skmacy 0xcc4f, 0x1002, 343180583Skmacy 0xcc50, 0x2fd2, 344180583Skmacy 0xcc51, 0x3002, 345180583Skmacy 0xcc52, 0x1002, 346180583Skmacy 0xcc53, 0x004, 347180583Skmacy 0xcc54, 0x2942, 348180583Skmacy 0xcc55, 0x3002, 349180583Skmacy 0xcc56, 0x1002, 350180583Skmacy 0xcc57, 0x2092, 351180583Skmacy 0xcc58, 0x3012, 352180583Skmacy 0xcc59, 0x1002, 353180583Skmacy 0xcc5a, 0x5cc3, 354180583Skmacy 0xcc5b, 0x317, 355180583Skmacy 0xcc5c, 0x2f72, 356180583Skmacy 0xcc5d, 0x3002, 357180583Skmacy 0xcc5e, 0x1002, 358180583Skmacy 0xcc5f, 0x2942, 359180583Skmacy 0xcc60, 0x3002, 360180583Skmacy 0xcc61, 0x1002, 361180583Skmacy 0xcc62, 0x22cd, 362180583Skmacy 0xcc63, 0x301d, 363180583Skmacy 0xcc64, 0x2862, 364180583Skmacy 0xcc65, 0x3012, 365180583Skmacy 0xcc66, 0x1002, 366180583Skmacy 0xcc67, 0x2ed2, 367180583Skmacy 0xcc68, 0x3002, 368180583Skmacy 0xcc69, 0x1002, 369180583Skmacy 0xcc6a, 0x2d72, 370180583Skmacy 0xcc6b, 0x3002, 371180583Skmacy 0xcc6c, 0x1002, 372180583Skmacy 0xcc6d, 0x628f, 373180583Skmacy 0xcc6e, 0x2112, 374180583Skmacy 0xcc6f, 0x3012, 375180583Skmacy 0xcc70, 0x1002, 376180583Skmacy 0xcc71, 0x5aa3, 377180583Skmacy 0xcc72, 0x2dc2, 378180583Skmacy 0xcc73, 0x3002, 379180583Skmacy 0xcc74, 0x1312, 380180583Skmacy 0xcc75, 0x6f72, 381180583Skmacy 0xcc76, 0x1002, 382180583Skmacy 0xcc77, 0x2807, 383180583Skmacy 0xcc78, 0x31a7, 384180583Skmacy 0xcc79, 0x20c4, 385180583Skmacy 0xcc7a, 0x3c24, 386180583Skmacy 0xcc7b, 0x6724, 387180583Skmacy 0xcc7c, 0x1002, 388180583Skmacy 0xcc7d, 0x2807, 389180583Skmacy 0xcc7e, 0x3187, 390180583Skmacy 0xcc7f, 0x20c4, 391180583Skmacy 0xcc80, 0x3c24, 392180583Skmacy 0xcc81, 0x6724, 393180583Skmacy 0xcc82, 0x1002, 394180583Skmacy 0xcc83, 0x2514, 395180583Skmacy 0xcc84, 0x3c64, 396180583Skmacy 0xcc85, 0x6436, 397180583Skmacy 0xcc86, 0xdff4, 398180583Skmacy 0xcc87, 0x6436, 399180583Skmacy 0xcc88, 0x1002, 400180583Skmacy 0xcc89, 0x40a4, 401180583Skmacy 0xcc8a, 0x643c, 402180583Skmacy 0xcc8b, 0x4016, 403180583Skmacy 0xcc8c, 0x8c6c, 404180583Skmacy 0xcc8d, 0x2b24, 405180583Skmacy 0xcc8e, 0x3c24, 406180583Skmacy 0xcc8f, 0x6435, 407180583Skmacy 0xcc90, 0x1002, 408180583Skmacy 0xcc91, 0x2b24, 409180583Skmacy 0xcc92, 0x3c24, 410180583Skmacy 0xcc93, 0x643a, 411180583Skmacy 0xcc94, 0x4025, 412180583Skmacy 0xcc95, 0x8a5a, 413180583Skmacy 0xcc96, 0x1002, 414180583Skmacy 0xcc97, 0x2731, 415180583Skmacy 0xcc98, 0x3011, 416180583Skmacy 0xcc99, 0x1001, 417180583Skmacy 0xcc9a, 0xc7a0, 418180583Skmacy 0xcc9b, 0x100, 419180583Skmacy 0xcc9c, 0xc502, 420180583Skmacy 0xcc9d, 0x53ac, 421180583Skmacy 0xcc9e, 0xc503, 422180583Skmacy 0xcc9f, 0xd5d5, 423180583Skmacy 0xcca0, 0xc600, 424180583Skmacy 0xcca1, 0x2a6d, 425180583Skmacy 0xcca2, 0xc601, 426180583Skmacy 0xcca3, 0x2a4c, 427180583Skmacy 0xcca4, 0xc602, 428180583Skmacy 0xcca5, 0x111, 429180583Skmacy 0xcca6, 0xc60c, 430180583Skmacy 0xcca7, 0x5900, 431180583Skmacy 0xcca8, 0xc710, 432180583Skmacy 0xcca9, 0x700, 433180583Skmacy 0xccaa, 0xc718, 434180583Skmacy 0xccab, 0x700, 435180583Skmacy 0xccac, 0xc720, 436180583Skmacy 0xccad, 0x4700, 437180583Skmacy 0xccae, 0xc801, 438180583Skmacy 0xccaf, 0x7f50, 439180583Skmacy 0xccb0, 0xc802, 440180583Skmacy 0xccb1, 0x7760, 441180583Skmacy 0xccb2, 0xc803, 442180583Skmacy 0xccb3, 0x7fce, 443180583Skmacy 0xccb4, 0xc804, 444180583Skmacy 0xccb5, 0x5700, 445180583Skmacy 0xccb6, 0xc805, 446180583Skmacy 0xccb7, 0x5f11, 447180583Skmacy 0xccb8, 0xc806, 448180583Skmacy 0xccb9, 0x4751, 449180583Skmacy 0xccba, 0xc807, 450180583Skmacy 0xccbb, 0x57e1, 451180583Skmacy 0xccbc, 0xc808, 452180583Skmacy 0xccbd, 0x2700, 453180583Skmacy 0xccbe, 0xc809, 454180583Skmacy 0xccbf, 0x000, 455180583Skmacy 0xccc0, 0xc821, 456180583Skmacy 0xccc1, 0x002, 457180583Skmacy 0xccc2, 0xc822, 458180583Skmacy 0xccc3, 0x014, 459180583Skmacy 0xccc4, 0xc832, 460180583Skmacy 0xccc5, 0x1186, 461180583Skmacy 0xccc6, 0xc847, 462180583Skmacy 0xccc7, 0x1e02, 463180583Skmacy 0xccc8, 0xc013, 464180583Skmacy 0xccc9, 0xf341, 465180583Skmacy 0xccca, 0xc01a, 466180583Skmacy 0xcccb, 0x446, 467180583Skmacy 0xcccc, 0xc024, 468180583Skmacy 0xcccd, 0x1000, 469180583Skmacy 0xccce, 0xc025, 470180583Skmacy 0xcccf, 0xa00, 471180583Skmacy 0xccd0, 0xc026, 472180583Skmacy 0xccd1, 0xc0c, 473180583Skmacy 0xccd2, 0xc027, 474180583Skmacy 0xccd3, 0xc0c, 475180583Skmacy 0xccd4, 0xc029, 476180583Skmacy 0xccd5, 0x0a0, 477180583Skmacy 0xccd6, 0xc030, 478180583Skmacy 0xccd7, 0xa00, 479180583Skmacy 0xccd8, 0xc03c, 480180583Skmacy 0xccd9, 0x01c, 481180583Skmacy 0xccda, 0xc005, 482180583Skmacy 0xccdb, 0x7a06, 483180583Skmacy 0xccdc, 0x000, 484180583Skmacy 0xccdd, 0x2731, 485180583Skmacy 0xccde, 0x3011, 486180583Skmacy 0xccdf, 0x1001, 487180583Skmacy 0xcce0, 0xc620, 488180583Skmacy 0xcce1, 0x000, 489180583Skmacy 0xcce2, 0xc621, 490180583Skmacy 0xcce3, 0x03f, 491180583Skmacy 0xcce4, 0xc622, 492180583Skmacy 0xcce5, 0x000, 493180583Skmacy 0xcce6, 0xc623, 494180583Skmacy 0xcce7, 0x000, 495180583Skmacy 0xcce8, 0xc624, 496180583Skmacy 0xcce9, 0x000, 497180583Skmacy 0xccea, 0xc625, 498180583Skmacy 0xcceb, 0x000, 499180583Skmacy 0xccec, 0xc627, 500180583Skmacy 0xcced, 0x000, 501180583Skmacy 0xccee, 0xc628, 502180583Skmacy 0xccef, 0x000, 503180583Skmacy 0xccf0, 0xc62c, 504180583Skmacy 0xccf1, 0x000, 505180583Skmacy 0xccf2, 0x000, 506180583Skmacy 0xccf3, 0x2806, 507180583Skmacy 0xccf4, 0x3cb6, 508180583Skmacy 0xccf5, 0xc161, 509180583Skmacy 0xccf6, 0x6134, 510180583Skmacy 0xccf7, 0x6135, 511180583Skmacy 0xccf8, 0x5443, 512180583Skmacy 0xccf9, 0x303, 513180583Skmacy 0xccfa, 0x6524, 514180583Skmacy 0xccfb, 0x00b, 515180583Skmacy 0xccfc, 0x1002, 516180583Skmacy 0xccfd, 0x2104, 517180583Skmacy 0xccfe, 0x3c24, 518180583Skmacy 0xccff, 0x2105, 519180583Skmacy 0xcd00, 0x3805, 520180583Skmacy 0xcd01, 0x6524, 521180583Skmacy 0xcd02, 0xdff4, 522180583Skmacy 0xcd03, 0x4005, 523180583Skmacy 0xcd04, 0x6524, 524180583Skmacy 0xcd05, 0x1002, 525180583Skmacy 0xcd06, 0x5dd3, 526180583Skmacy 0xcd07, 0x306, 527180583Skmacy 0xcd08, 0x2ff7, 528180583Skmacy 0xcd09, 0x38f7, 529180583Skmacy 0xcd0a, 0x60b7, 530180583Skmacy 0xcd0b, 0xdffd, 531180583Skmacy 0xcd0c, 0x00a, 532180583Skmacy 0xcd0d, 0x1002, 533180583Skmacy 0xcd0e, 0 534180583Skmacy }; 535180583Skmacy int i, err; 536180583Skmacy 537181614Skmacy err = set_phy_regs(phy, regs); 538181614Skmacy if (err) 539181614Skmacy return err; 540181614Skmacy 541181614Skmacy msleep(50); 542181614Skmacy 543181614Skmacy for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 544180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 545180583Skmacy sr_edc[i + 1]); 546181614Skmacy if (!err) 547181614Skmacy phy->priv = edc_sr; 548180583Skmacy return err; 549180583Skmacy} 550180583Skmacy 551181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) 552181614Skmacy{ 553181614Skmacy static struct reg_val regs[] = { 554181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 }, 555181614Skmacy { 0, 0, 0, 0 } 556181614Skmacy }; 557181614Skmacy static struct reg_val preemphasis[] = { 558181614Skmacy { MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 }, 559181614Skmacy { MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 }, 560181614Skmacy { 0, 0, 0, 0 } 561181614Skmacy }; 562181614Skmacy static u16 twinax_edc[] = { 563181614Skmacy 0xcc00, 0x4009, 564181614Skmacy 0xcc01, 0x27ff, 565181614Skmacy 0xcc02, 0x300f, 566181614Skmacy 0xcc03, 0x40aa, 567181614Skmacy 0xcc04, 0x401c, 568181614Skmacy 0xcc05, 0x401e, 569181614Skmacy 0xcc06, 0x2ff4, 570181614Skmacy 0xcc07, 0x3cd4, 571181614Skmacy 0xcc08, 0x2035, 572181614Skmacy 0xcc09, 0x3145, 573181614Skmacy 0xcc0a, 0x6524, 574181614Skmacy 0xcc0b, 0x26a2, 575181614Skmacy 0xcc0c, 0x3012, 576181614Skmacy 0xcc0d, 0x1002, 577181614Skmacy 0xcc0e, 0x29c2, 578181614Skmacy 0xcc0f, 0x3002, 579181614Skmacy 0xcc10, 0x1002, 580181614Skmacy 0xcc11, 0x2072, 581181614Skmacy 0xcc12, 0x3012, 582181614Skmacy 0xcc13, 0x1002, 583181614Skmacy 0xcc14, 0x22cd, 584181614Skmacy 0xcc15, 0x301d, 585181614Skmacy 0xcc16, 0x2e52, 586181614Skmacy 0xcc17, 0x3012, 587181614Skmacy 0xcc18, 0x1002, 588181614Skmacy 0xcc19, 0x28e2, 589181614Skmacy 0xcc1a, 0x3002, 590181614Skmacy 0xcc1b, 0x1002, 591181614Skmacy 0xcc1c, 0x628f, 592181614Skmacy 0xcc1d, 0x2ac2, 593181614Skmacy 0xcc1e, 0x3012, 594181614Skmacy 0xcc1f, 0x1002, 595181614Skmacy 0xcc20, 0x5553, 596181614Skmacy 0xcc21, 0x2ae2, 597181614Skmacy 0xcc22, 0x3002, 598181614Skmacy 0xcc23, 0x1302, 599181614Skmacy 0xcc24, 0x401e, 600181614Skmacy 0xcc25, 0x2be2, 601181614Skmacy 0xcc26, 0x3012, 602181614Skmacy 0xcc27, 0x1002, 603181614Skmacy 0xcc28, 0x2da2, 604181614Skmacy 0xcc29, 0x3012, 605181614Skmacy 0xcc2a, 0x1002, 606181614Skmacy 0xcc2b, 0x2ba2, 607181614Skmacy 0xcc2c, 0x3002, 608181614Skmacy 0xcc2d, 0x1002, 609181614Skmacy 0xcc2e, 0x5ee3, 610181614Skmacy 0xcc2f, 0x305, 611181614Skmacy 0xcc30, 0x400e, 612181614Skmacy 0xcc31, 0x2bc2, 613181614Skmacy 0xcc32, 0x3002, 614181614Skmacy 0xcc33, 0x1002, 615181614Skmacy 0xcc34, 0x2b82, 616181614Skmacy 0xcc35, 0x3012, 617181614Skmacy 0xcc36, 0x1002, 618181614Skmacy 0xcc37, 0x5663, 619181614Skmacy 0xcc38, 0x302, 620181614Skmacy 0xcc39, 0x401e, 621181614Skmacy 0xcc3a, 0x6f72, 622181614Skmacy 0xcc3b, 0x1002, 623181614Skmacy 0xcc3c, 0x628f, 624181614Skmacy 0xcc3d, 0x2be2, 625181614Skmacy 0xcc3e, 0x3012, 626181614Skmacy 0xcc3f, 0x1002, 627181614Skmacy 0xcc40, 0x22cd, 628181614Skmacy 0xcc41, 0x301d, 629181614Skmacy 0xcc42, 0x2e52, 630181614Skmacy 0xcc43, 0x3012, 631181614Skmacy 0xcc44, 0x1002, 632181614Skmacy 0xcc45, 0x2522, 633181614Skmacy 0xcc46, 0x3012, 634181614Skmacy 0xcc47, 0x1002, 635181614Skmacy 0xcc48, 0x2da2, 636181614Skmacy 0xcc49, 0x3012, 637181614Skmacy 0xcc4a, 0x1002, 638181614Skmacy 0xcc4b, 0x2ca2, 639181614Skmacy 0xcc4c, 0x3012, 640181614Skmacy 0xcc4d, 0x1002, 641181614Skmacy 0xcc4e, 0x2fa4, 642181614Skmacy 0xcc4f, 0x3cd4, 643181614Skmacy 0xcc50, 0x6624, 644181614Skmacy 0xcc51, 0x410b, 645181614Skmacy 0xcc52, 0x56b3, 646181614Skmacy 0xcc53, 0x3c4, 647181614Skmacy 0xcc54, 0x2fb2, 648181614Skmacy 0xcc55, 0x3002, 649181614Skmacy 0xcc56, 0x1002, 650181614Skmacy 0xcc57, 0x220b, 651181614Skmacy 0xcc58, 0x303b, 652181614Skmacy 0xcc59, 0x56b3, 653181614Skmacy 0xcc5a, 0x3c3, 654181614Skmacy 0xcc5b, 0x866b, 655181614Skmacy 0xcc5c, 0x400c, 656181614Skmacy 0xcc5d, 0x23a2, 657181614Skmacy 0xcc5e, 0x3012, 658181614Skmacy 0xcc5f, 0x1002, 659181614Skmacy 0xcc60, 0x2da2, 660181614Skmacy 0xcc61, 0x3012, 661181614Skmacy 0xcc62, 0x1002, 662181614Skmacy 0xcc63, 0x2ca2, 663181614Skmacy 0xcc64, 0x3012, 664181614Skmacy 0xcc65, 0x1002, 665181614Skmacy 0xcc66, 0x2fb4, 666181614Skmacy 0xcc67, 0x3cd4, 667181614Skmacy 0xcc68, 0x6624, 668181614Skmacy 0xcc69, 0x56b3, 669181614Skmacy 0xcc6a, 0x3c3, 670181614Skmacy 0xcc6b, 0x866b, 671181614Skmacy 0xcc6c, 0x401c, 672181614Skmacy 0xcc6d, 0x2205, 673181614Skmacy 0xcc6e, 0x3035, 674181614Skmacy 0xcc6f, 0x5b53, 675181614Skmacy 0xcc70, 0x2c52, 676181614Skmacy 0xcc71, 0x3002, 677181614Skmacy 0xcc72, 0x13c2, 678181614Skmacy 0xcc73, 0x5cc3, 679181614Skmacy 0xcc74, 0x317, 680181614Skmacy 0xcc75, 0x2522, 681181614Skmacy 0xcc76, 0x3012, 682181614Skmacy 0xcc77, 0x1002, 683181614Skmacy 0xcc78, 0x2da2, 684181614Skmacy 0xcc79, 0x3012, 685181614Skmacy 0xcc7a, 0x1002, 686181614Skmacy 0xcc7b, 0x2b82, 687181614Skmacy 0xcc7c, 0x3012, 688181614Skmacy 0xcc7d, 0x1002, 689181614Skmacy 0xcc7e, 0x5663, 690181614Skmacy 0xcc7f, 0x303, 691181614Skmacy 0xcc80, 0x401e, 692181614Skmacy 0xcc81, 0x004, 693181614Skmacy 0xcc82, 0x2c42, 694181614Skmacy 0xcc83, 0x3012, 695181614Skmacy 0xcc84, 0x1002, 696181614Skmacy 0xcc85, 0x6f72, 697181614Skmacy 0xcc86, 0x1002, 698181614Skmacy 0xcc87, 0x628f, 699181614Skmacy 0xcc88, 0x2304, 700181614Skmacy 0xcc89, 0x3c84, 701181614Skmacy 0xcc8a, 0x6436, 702181614Skmacy 0xcc8b, 0xdff4, 703181614Skmacy 0xcc8c, 0x6436, 704181614Skmacy 0xcc8d, 0x2ff5, 705181614Skmacy 0xcc8e, 0x3005, 706181614Skmacy 0xcc8f, 0x8656, 707181614Skmacy 0xcc90, 0xdfba, 708181614Skmacy 0xcc91, 0x56a3, 709181614Skmacy 0xcc92, 0xd05a, 710181614Skmacy 0xcc93, 0x21c2, 711181614Skmacy 0xcc94, 0x3012, 712181614Skmacy 0xcc95, 0x1392, 713181614Skmacy 0xcc96, 0xd05a, 714181614Skmacy 0xcc97, 0x56a3, 715181614Skmacy 0xcc98, 0xdfba, 716181614Skmacy 0xcc99, 0x383, 717181614Skmacy 0xcc9a, 0x6f72, 718181614Skmacy 0xcc9b, 0x1002, 719181614Skmacy 0xcc9c, 0x28c5, 720181614Skmacy 0xcc9d, 0x3005, 721181614Skmacy 0xcc9e, 0x4178, 722181614Skmacy 0xcc9f, 0x5653, 723181614Skmacy 0xcca0, 0x384, 724181614Skmacy 0xcca1, 0x22b2, 725181614Skmacy 0xcca2, 0x3012, 726181614Skmacy 0xcca3, 0x1002, 727181614Skmacy 0xcca4, 0x2be5, 728181614Skmacy 0xcca5, 0x3005, 729181614Skmacy 0xcca6, 0x41e8, 730181614Skmacy 0xcca7, 0x5653, 731181614Skmacy 0xcca8, 0x382, 732181614Skmacy 0xcca9, 0x002, 733181614Skmacy 0xccaa, 0x4258, 734181614Skmacy 0xccab, 0x2474, 735181614Skmacy 0xccac, 0x3c84, 736181614Skmacy 0xccad, 0x6437, 737181614Skmacy 0xccae, 0xdff4, 738181614Skmacy 0xccaf, 0x6437, 739181614Skmacy 0xccb0, 0x2ff5, 740181614Skmacy 0xccb1, 0x3c05, 741181614Skmacy 0xccb2, 0x8757, 742181614Skmacy 0xccb3, 0xb888, 743181614Skmacy 0xccb4, 0x9787, 744181614Skmacy 0xccb5, 0xdff4, 745181614Skmacy 0xccb6, 0x6724, 746181614Skmacy 0xccb7, 0x866a, 747181614Skmacy 0xccb8, 0x6f72, 748181614Skmacy 0xccb9, 0x1002, 749181614Skmacy 0xccba, 0x2d01, 750181614Skmacy 0xccbb, 0x3011, 751181614Skmacy 0xccbc, 0x1001, 752181614Skmacy 0xccbd, 0xc620, 753181614Skmacy 0xccbe, 0x14e5, 754181614Skmacy 0xccbf, 0xc621, 755181614Skmacy 0xccc0, 0xc53d, 756181614Skmacy 0xccc1, 0xc622, 757181614Skmacy 0xccc2, 0x3cbe, 758181614Skmacy 0xccc3, 0xc623, 759181614Skmacy 0xccc4, 0x4452, 760181614Skmacy 0xccc5, 0xc624, 761181614Skmacy 0xccc6, 0xc5c5, 762181614Skmacy 0xccc7, 0xc625, 763181614Skmacy 0xccc8, 0xe01e, 764181614Skmacy 0xccc9, 0xc627, 765181614Skmacy 0xccca, 0x000, 766181614Skmacy 0xcccb, 0xc628, 767181614Skmacy 0xcccc, 0x000, 768181614Skmacy 0xcccd, 0xc62b, 769181614Skmacy 0xccce, 0x000, 770181614Skmacy 0xcccf, 0xc62c, 771181614Skmacy 0xccd0, 0x000, 772181614Skmacy 0xccd1, 0x000, 773181614Skmacy 0xccd2, 0x2d01, 774181614Skmacy 0xccd3, 0x3011, 775181614Skmacy 0xccd4, 0x1001, 776181614Skmacy 0xccd5, 0xc620, 777181614Skmacy 0xccd6, 0x000, 778181614Skmacy 0xccd7, 0xc621, 779181614Skmacy 0xccd8, 0x000, 780181614Skmacy 0xccd9, 0xc622, 781181614Skmacy 0xccda, 0x0ce, 782181614Skmacy 0xccdb, 0xc623, 783181614Skmacy 0xccdc, 0x07f, 784181614Skmacy 0xccdd, 0xc624, 785181614Skmacy 0xccde, 0x032, 786181614Skmacy 0xccdf, 0xc625, 787181614Skmacy 0xcce0, 0x000, 788181614Skmacy 0xcce1, 0xc627, 789181614Skmacy 0xcce2, 0x000, 790181614Skmacy 0xcce3, 0xc628, 791181614Skmacy 0xcce4, 0x000, 792181614Skmacy 0xcce5, 0xc62b, 793181614Skmacy 0xcce6, 0x000, 794181614Skmacy 0xcce7, 0xc62c, 795181614Skmacy 0xcce8, 0x000, 796181614Skmacy 0xcce9, 0x000, 797181614Skmacy 0xccea, 0x2d01, 798181614Skmacy 0xcceb, 0x3011, 799181614Skmacy 0xccec, 0x1001, 800181614Skmacy 0xcced, 0xc502, 801181614Skmacy 0xccee, 0x609f, 802181614Skmacy 0xccef, 0xc600, 803181614Skmacy 0xccf0, 0x2a6e, 804181614Skmacy 0xccf1, 0xc601, 805181614Skmacy 0xccf2, 0x2a2c, 806181614Skmacy 0xccf3, 0xc60c, 807181614Skmacy 0xccf4, 0x5400, 808181614Skmacy 0xccf5, 0xc710, 809181614Skmacy 0xccf6, 0x700, 810181614Skmacy 0xccf7, 0xc718, 811181614Skmacy 0xccf8, 0x700, 812181614Skmacy 0xccf9, 0xc720, 813181614Skmacy 0xccfa, 0x4700, 814181614Skmacy 0xccfb, 0xc728, 815181614Skmacy 0xccfc, 0x700, 816181614Skmacy 0xccfd, 0xc729, 817181614Skmacy 0xccfe, 0x1207, 818181614Skmacy 0xccff, 0xc801, 819181614Skmacy 0xcd00, 0x7f50, 820181614Skmacy 0xcd01, 0xc802, 821181614Skmacy 0xcd02, 0x7760, 822181614Skmacy 0xcd03, 0xc803, 823181614Skmacy 0xcd04, 0x7fce, 824181614Skmacy 0xcd05, 0xc804, 825181614Skmacy 0xcd06, 0x520e, 826181614Skmacy 0xcd07, 0xc805, 827181614Skmacy 0xcd08, 0x5c11, 828181614Skmacy 0xcd09, 0xc806, 829181614Skmacy 0xcd0a, 0x3c51, 830181614Skmacy 0xcd0b, 0xc807, 831181614Skmacy 0xcd0c, 0x4061, 832181614Skmacy 0xcd0d, 0xc808, 833181614Skmacy 0xcd0e, 0x49c1, 834181614Skmacy 0xcd0f, 0xc809, 835181614Skmacy 0xcd10, 0x3840, 836181614Skmacy 0xcd11, 0xc80a, 837181614Skmacy 0xcd12, 0x000, 838181614Skmacy 0xcd13, 0xc821, 839181614Skmacy 0xcd14, 0x002, 840181614Skmacy 0xcd15, 0xc822, 841181614Skmacy 0xcd16, 0x046, 842181614Skmacy 0xcd17, 0xc844, 843181614Skmacy 0xcd18, 0x182f, 844181614Skmacy 0xcd19, 0xc013, 845181614Skmacy 0xcd1a, 0xf341, 846181614Skmacy 0xcd1b, 0xc01a, 847181614Skmacy 0xcd1c, 0x446, 848181614Skmacy 0xcd1d, 0xc024, 849181614Skmacy 0xcd1e, 0x1000, 850181614Skmacy 0xcd1f, 0xc025, 851181614Skmacy 0xcd20, 0xa00, 852181614Skmacy 0xcd21, 0xc026, 853181614Skmacy 0xcd22, 0xc0c, 854181614Skmacy 0xcd23, 0xc027, 855181614Skmacy 0xcd24, 0xc0c, 856181614Skmacy 0xcd25, 0xc029, 857181614Skmacy 0xcd26, 0x0a0, 858181614Skmacy 0xcd27, 0xc030, 859181614Skmacy 0xcd28, 0xa00, 860181614Skmacy 0xcd29, 0xc03c, 861181614Skmacy 0xcd2a, 0x01c, 862181614Skmacy 0xcd2b, 0x000, 863181614Skmacy 0xcd2c, 0x2b84, 864181614Skmacy 0xcd2d, 0x3c74, 865181614Skmacy 0xcd2e, 0x6435, 866181614Skmacy 0xcd2f, 0xdff4, 867181614Skmacy 0xcd30, 0x6435, 868181614Skmacy 0xcd31, 0x2806, 869181614Skmacy 0xcd32, 0x3006, 870181614Skmacy 0xcd33, 0x8565, 871181614Skmacy 0xcd34, 0x2b24, 872181614Skmacy 0xcd35, 0x3c24, 873181614Skmacy 0xcd36, 0x6436, 874181614Skmacy 0xcd37, 0x1002, 875181614Skmacy 0xcd38, 0x2b24, 876181614Skmacy 0xcd39, 0x3c24, 877181614Skmacy 0xcd3a, 0x6436, 878181614Skmacy 0xcd3b, 0x4045, 879181614Skmacy 0xcd3c, 0x8656, 880181614Skmacy 0xcd3d, 0x1002, 881181614Skmacy 0xcd3e, 0x2807, 882181614Skmacy 0xcd3f, 0x31a7, 883181614Skmacy 0xcd40, 0x20c4, 884181614Skmacy 0xcd41, 0x3c24, 885181614Skmacy 0xcd42, 0x6724, 886181614Skmacy 0xcd43, 0x1002, 887181614Skmacy 0xcd44, 0x2807, 888181614Skmacy 0xcd45, 0x3187, 889181614Skmacy 0xcd46, 0x20c4, 890181614Skmacy 0xcd47, 0x3c24, 891181614Skmacy 0xcd48, 0x6724, 892181614Skmacy 0xcd49, 0x1002, 893181614Skmacy 0xcd4a, 0x2514, 894181614Skmacy 0xcd4b, 0x3c64, 895181614Skmacy 0xcd4c, 0x6436, 896181614Skmacy 0xcd4d, 0xdff4, 897181614Skmacy 0xcd4e, 0x6436, 898181614Skmacy 0xcd4f, 0x1002, 899181614Skmacy 0xcd50, 0x2806, 900181614Skmacy 0xcd51, 0x3cb6, 901181614Skmacy 0xcd52, 0xc161, 902181614Skmacy 0xcd53, 0x6134, 903181614Skmacy 0xcd54, 0x6135, 904181614Skmacy 0xcd55, 0x5443, 905181614Skmacy 0xcd56, 0x303, 906181614Skmacy 0xcd57, 0x6524, 907181614Skmacy 0xcd58, 0x00b, 908181614Skmacy 0xcd59, 0x1002, 909181614Skmacy 0xcd5a, 0xd019, 910181614Skmacy 0xcd5b, 0x2104, 911181614Skmacy 0xcd5c, 0x3c24, 912181614Skmacy 0xcd5d, 0x2105, 913181614Skmacy 0xcd5e, 0x3805, 914181614Skmacy 0xcd5f, 0x6524, 915181614Skmacy 0xcd60, 0xdff4, 916181614Skmacy 0xcd61, 0x4005, 917181614Skmacy 0xcd62, 0x6524, 918181614Skmacy 0xcd63, 0x2e8d, 919181614Skmacy 0xcd64, 0x303d, 920181614Skmacy 0xcd65, 0x5dd3, 921181614Skmacy 0xcd66, 0x306, 922181614Skmacy 0xcd67, 0x2ff7, 923181614Skmacy 0xcd68, 0x38f7, 924181614Skmacy 0xcd69, 0x60b7, 925181614Skmacy 0xcd6a, 0xdffd, 926181614Skmacy 0xcd6b, 0x00a, 927181614Skmacy 0xcd6c, 0x1002, 928181614Skmacy 0xcd6d, 0 929181614Skmacy }; 930181614Skmacy int i, err; 931181614Skmacy 932181614Skmacy err = set_phy_regs(phy, regs); 933181614Skmacy if (!err && modtype == phy_modtype_twinax_long) 934181614Skmacy err = set_phy_regs(phy, preemphasis); 935181614Skmacy if (err) 936181614Skmacy return err; 937181614Skmacy 938181614Skmacy msleep(50); 939181614Skmacy 940181614Skmacy for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 941181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 942181614Skmacy twinax_edc[i + 1]); 943181614Skmacy if (!err) 944181614Skmacy phy->priv = edc_twinax; 945181614Skmacy return err; 946181614Skmacy} 947181614Skmacy 948181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) 949181614Skmacy{ 950181614Skmacy int i, err; 951181614Skmacy unsigned int stat, data; 952181614Skmacy 953181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL, 954181614Skmacy (dev_addr << 8) | (1 << 8) | word_addr); 955181614Skmacy if (err) 956181614Skmacy return err; 957181614Skmacy 958181614Skmacy for (i = 0; i < 5; i++) { 959181614Skmacy msleep(1); 960181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat); 961181614Skmacy if (err) 962181614Skmacy return err; 963181614Skmacy if ((stat & 3) == 1) { 964181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, 965181614Skmacy &data); 966181614Skmacy if (err) 967181614Skmacy return err; 968181614Skmacy return data >> 8; 969181614Skmacy } 970181614Skmacy } 971181614Skmacy CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n", 972181614Skmacy phy->addr, word_addr); 973181614Skmacy return -ETIMEDOUT; 974181614Skmacy} 975181614Skmacy 976181614Skmacystatic int get_module_type(struct cphy *phy, int delay_ms) 977181614Skmacy{ 978181614Skmacy int v; 979181614Skmacy unsigned int stat; 980181614Skmacy 981181614Skmacy v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); 982181614Skmacy if (v) 983181614Skmacy return v; 984181614Skmacy 985181614Skmacy if (stat & (1 << 8)) /* module absent */ 986181614Skmacy return phy_modtype_none; 987181614Skmacy 988181614Skmacy if (delay_ms) 989181614Skmacy msleep(delay_ms); 990181614Skmacy 991181614Skmacy /* see SFF-8472 for below */ 992181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3); 993181614Skmacy if (v < 0) 994181614Skmacy return v; 995181614Skmacy 996181614Skmacy if (v == 0x10) 997181614Skmacy return phy_modtype_sr; 998181614Skmacy if (v == 0x20) 999181614Skmacy return phy_modtype_lr; 1000181614Skmacy if (v == 0x40) 1001181614Skmacy return phy_modtype_lrm; 1002181614Skmacy 1003181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6); 1004181614Skmacy if (v < 0) 1005181614Skmacy return v; 1006181614Skmacy if (v != 4) 1007181614Skmacy goto unknown; 1008181614Skmacy 1009181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10); 1010181614Skmacy if (v < 0) 1011181614Skmacy return v; 1012181614Skmacy 1013181614Skmacy if (v & 0x80) { 1014181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); 1015181614Skmacy if (v < 0) 1016181614Skmacy return v; 1017181614Skmacy return v > 10 ? phy_modtype_twinax_long : phy_modtype_twinax; 1018181614Skmacy } 1019181614Skmacyunknown: 1020181614Skmacy return phy_modtype_unknown; 1021181614Skmacy} 1022181614Skmacy 1023181614Skmacystatic int ael2005_intr_enable(struct cphy *phy) 1024181614Skmacy{ 1025181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); 1026181614Skmacy return err ? err : t3_phy_lasi_intr_enable(phy); 1027181614Skmacy} 1028181614Skmacy 1029181614Skmacystatic int ael2005_intr_disable(struct cphy *phy) 1030181614Skmacy{ 1031181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100); 1032181614Skmacy return err ? err : t3_phy_lasi_intr_disable(phy); 1033181614Skmacy} 1034181614Skmacy 1035181614Skmacystatic int ael2005_intr_clear(struct cphy *phy) 1036181614Skmacy{ 1037181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00); 1038181614Skmacy return err ? err : t3_phy_lasi_intr_clear(phy); 1039181614Skmacy} 1040181614Skmacy 1041180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 1042180583Skmacy{ 1043180583Skmacy static struct reg_val regs0[] = { 1044180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 1045180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 1046180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 1047180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1048180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 1049180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1050180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 1051180583Skmacy { 0, 0, 0, 0 } 1052180583Skmacy }; 1053180583Skmacy static struct reg_val regs1[] = { 1054180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 1055180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 1056180583Skmacy { 0, 0, 0, 0 } 1057180583Skmacy }; 1058180583Skmacy 1059181614Skmacy int err, lasi_ctrl; 1060180583Skmacy 1061181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1062181614Skmacy if (err) 1063181614Skmacy return err; 1064181614Skmacy 1065180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 1066180583Skmacy if (err) 1067180583Skmacy return err; 1068180583Skmacy 1069180583Skmacy msleep(125); 1070181614Skmacy phy->priv = edc_none; 1071180583Skmacy err = set_phy_regs(phy, regs0); 1072180583Skmacy if (err) 1073180583Skmacy return err; 1074180583Skmacy 1075180583Skmacy msleep(50); 1076181614Skmacy 1077181614Skmacy err = get_module_type(phy, 0); 1078181614Skmacy if (err < 0) 1079181614Skmacy return err; 1080181614Skmacy phy->modtype = (u8)err; 1081181614Skmacy 1082181614Skmacy if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1083181614Skmacy err = ael2005_setup_twinax_edc(phy, err); 1084181614Skmacy else 1085181614Skmacy err = ael2005_setup_sr_edc(phy); 1086180583Skmacy if (err) 1087180583Skmacy return err; 1088180583Skmacy 1089181614Skmacy err = set_phy_regs(phy, regs1); 1090180583Skmacy if (err) 1091180583Skmacy return err; 1092180583Skmacy 1093181614Skmacy /* reset wipes out interrupts, reenable them if they were on */ 1094181614Skmacy if (lasi_ctrl & 1) 1095181614Skmacy err = ael2005_intr_enable(phy); 1096181614Skmacy return err; 1097180583Skmacy} 1098180583Skmacy 1099181614Skmacystatic int ael2005_intr_handler(struct cphy *phy) 1100181614Skmacy{ 1101181614Skmacy unsigned int stat; 1102181614Skmacy int ret, edc_needed, cause = 0; 1103181614Skmacy 1104181614Skmacy ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat); 1105181614Skmacy if (ret) 1106181614Skmacy return ret; 1107181614Skmacy 1108181614Skmacy if (stat & AEL2005_MODDET_IRQ) { 1109181614Skmacy ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 1110181614Skmacy 0xd00); 1111181614Skmacy if (ret) 1112181614Skmacy return ret; 1113181614Skmacy 1114181614Skmacy /* modules have max 300 ms init time after hot plug */ 1115181614Skmacy ret = get_module_type(phy, 300); 1116181614Skmacy if (ret < 0) 1117181614Skmacy return ret; 1118181614Skmacy 1119181614Skmacy phy->modtype = (u8)ret; 1120181614Skmacy if (ret == phy_modtype_none) 1121181614Skmacy edc_needed = phy->priv; /* on unplug retain EDC */ 1122181614Skmacy else if (ret == phy_modtype_twinax || 1123181614Skmacy ret == phy_modtype_twinax_long) 1124181614Skmacy edc_needed = edc_twinax; 1125181614Skmacy else 1126181614Skmacy edc_needed = edc_sr; 1127181614Skmacy 1128181614Skmacy if (edc_needed != phy->priv) { 1129181614Skmacy ret = ael2005_reset(phy, 0); 1130181614Skmacy return ret ? ret : cphy_cause_module_change; 1131181614Skmacy } 1132181614Skmacy cause = cphy_cause_module_change; 1133181614Skmacy } 1134181614Skmacy 1135181614Skmacy ret = t3_phy_lasi_intr_handler(phy); 1136181614Skmacy return ret < 0 ? ret : ret + cause; 1137181614Skmacy} 1138181614Skmacy 1139167514Skmacy#ifdef C99_NOT_SUPPORTED 1140180583Skmacystatic struct cphy_ops ael2005_ops = { 1141180583Skmacy ael2005_reset, 1142181614Skmacy ael2005_intr_enable, 1143181614Skmacy ael2005_intr_disable, 1144181614Skmacy ael2005_intr_clear, 1145181614Skmacy ael2005_intr_handler, 1146180583Skmacy NULL, 1147180583Skmacy NULL, 1148180583Skmacy NULL, 1149180583Skmacy NULL, 1150180583Skmacy NULL, 1151181614Skmacy get_link_status_r, 1152180583Skmacy ael1002_power_down, 1153180583Skmacy}; 1154180583Skmacy#else 1155180583Skmacystatic struct cphy_ops ael2005_ops = { 1156180583Skmacy .reset = ael2005_reset, 1157181614Skmacy .intr_enable = ael2005_intr_enable, 1158181614Skmacy .intr_disable = ael2005_intr_disable, 1159181614Skmacy .intr_clear = ael2005_intr_clear, 1160181614Skmacy .intr_handler = ael2005_intr_handler, 1161181614Skmacy .get_link_status = get_link_status_r, 1162180583Skmacy .power_down = ael1002_power_down, 1163180583Skmacy}; 1164180583Skmacy#endif 1165180583Skmacy 1166180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1167180583Skmacy const struct mdio_ops *mdio_ops) 1168180583Skmacy{ 1169180583Skmacy cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops, 1170181614Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 1171181614Skmacy SUPPORTED_IRQ, "10GBASE-R"); 1172180583Skmacy msleep(125); 1173180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 1174180583Skmacy 1 << 5); 1175180583Skmacy} 1176180583Skmacy 1177181614Skmacy/* 1178181614Skmacy * Get link status for a 10GBASE-X device. 1179181614Skmacy */ 1180181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed, 1181181614Skmacy int *duplex, int *fc) 1182181614Skmacy{ 1183181614Skmacy if (link_ok) { 1184181614Skmacy unsigned int stat0, stat1, stat2; 1185181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 1186181614Skmacy 1187181614Skmacy if (!err) 1188181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1); 1189181614Skmacy if (!err) 1190181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 1191181614Skmacy if (err) 1192181614Skmacy return err; 1193181614Skmacy *link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1; 1194181614Skmacy } 1195181614Skmacy if (speed) 1196181614Skmacy *speed = SPEED_10000; 1197181614Skmacy if (duplex) 1198181614Skmacy *duplex = DUPLEX_FULL; 1199181614Skmacy return 0; 1200181614Skmacy} 1201181614Skmacy 1202180583Skmacy#ifdef C99_NOT_SUPPORTED 1203167514Skmacystatic struct cphy_ops qt2045_ops = { 1204167514Skmacy ael1006_reset, 1205180583Skmacy t3_phy_lasi_intr_enable, 1206180583Skmacy t3_phy_lasi_intr_disable, 1207180583Skmacy t3_phy_lasi_intr_clear, 1208180583Skmacy t3_phy_lasi_intr_handler, 1209167514Skmacy NULL, 1210167514Skmacy NULL, 1211167514Skmacy NULL, 1212167514Skmacy NULL, 1213167514Skmacy NULL, 1214181614Skmacy get_link_status_x, 1215167514Skmacy ael1006_power_down, 1216167514Skmacy}; 1217167514Skmacy#else 1218167514Skmacystatic struct cphy_ops qt2045_ops = { 1219167514Skmacy .reset = ael1006_reset, 1220180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 1221180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 1222180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 1223180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 1224181614Skmacy .get_link_status = get_link_status_x, 1225167514Skmacy .power_down = ael1006_power_down, 1226167514Skmacy}; 1227167514Skmacy#endif 1228167514Skmacy 1229176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1230176472Skmacy const struct mdio_ops *mdio_ops) 1231167514Skmacy{ 1232167514Skmacy unsigned int stat; 1233167514Skmacy 1234176472Skmacy cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops, 1235176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1236176472Skmacy "10GBASE-CX4"); 1237167514Skmacy 1238167514Skmacy /* 1239167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 1240167514Skmacy * have it at 1. 1241167514Skmacy */ 1242167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 1243167514Skmacy stat == 0xffff) 1244167514Skmacy phy->addr = 1; 1245176472Skmacy return 0; 1246167514Skmacy} 1247167514Skmacy 1248167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 1249167514Skmacy{ 1250167514Skmacy return 0; 1251167514Skmacy} 1252167514Skmacy 1253167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, 1254167514Skmacy int *speed, int *duplex, int *fc) 1255167514Skmacy{ 1256167514Skmacy if (link_ok) { 1257167514Skmacy unsigned int status; 1258167514Skmacy 1259167514Skmacy status = t3_read_reg(phy->adapter, 1260170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 1261170654Skmacy t3_read_reg(phy->adapter, 1262170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 1263170654Skmacy t3_read_reg(phy->adapter, 1264170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 1265170654Skmacy t3_read_reg(phy->adapter, 1266170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 1267167514Skmacy *link_ok = !(status & F_LOWSIG0); 1268167514Skmacy } 1269167514Skmacy if (speed) 1270167514Skmacy *speed = SPEED_10000; 1271167514Skmacy if (duplex) 1272167514Skmacy *duplex = DUPLEX_FULL; 1273167514Skmacy return 0; 1274167514Skmacy} 1275167514Skmacy 1276167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 1277167514Skmacy{ 1278167514Skmacy return 0; 1279167514Skmacy} 1280167514Skmacy 1281167514Skmacy#ifdef C99_NOT_SUPPORTED 1282167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1283167514Skmacy xaui_direct_reset, 1284167514Skmacy ael1002_intr_noop, 1285167514Skmacy ael1002_intr_noop, 1286167514Skmacy ael1002_intr_noop, 1287167514Skmacy ael1002_intr_noop, 1288167514Skmacy NULL, 1289167514Skmacy NULL, 1290167514Skmacy NULL, 1291167514Skmacy NULL, 1292167514Skmacy NULL, 1293167514Skmacy xaui_direct_get_link_status, 1294167514Skmacy xaui_direct_power_down, 1295167514Skmacy}; 1296167514Skmacy#else 1297167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1298167514Skmacy .reset = xaui_direct_reset, 1299167514Skmacy .intr_enable = ael1002_intr_noop, 1300167514Skmacy .intr_disable = ael1002_intr_noop, 1301167514Skmacy .intr_clear = ael1002_intr_noop, 1302167514Skmacy .intr_handler = ael1002_intr_noop, 1303167514Skmacy .get_link_status = xaui_direct_get_link_status, 1304167514Skmacy .power_down = xaui_direct_power_down, 1305167514Skmacy}; 1306167514Skmacy#endif 1307167514Skmacy 1308176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1309176472Skmacy const struct mdio_ops *mdio_ops) 1310167514Skmacy{ 1311176472Skmacy cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, 1312176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1313176472Skmacy "10GBASE-CX4"); 1314176472Skmacy return 0; 1315167514Skmacy} 1316