cxgb_ael1002.c revision 181614
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 181614 2008-08-11 23:01:34Z kmacy $"); 32167514Skmacy 33170076Skmacy#ifdef CONFIG_DEFINED 34170076Skmacy#include <cxgb_include.h> 35170076Skmacy#else 36170076Skmacy#include <dev/cxgb/cxgb_include.h> 37170076Skmacy#endif 38167514Skmacy 39176472Skmacy#undef msleep 40176472Skmacy#define msleep t3_os_sleep 41176472Skmacy 42167514Skmacyenum { 43181614Skmacy PMD_RSD = 10, /* PMA/PMD receive signal detect register */ 44181614Skmacy PCS_STAT1_X = 24, /* 10GBASE-X PCS status 1 register */ 45181614Skmacy PCS_STAT1_R = 32, /* 10GBASE-R PCS status 1 register */ 46181614Skmacy XS_LN_STAT = 24 /* XS lane status register */ 47181614Skmacy}; 48181614Skmacy 49181614Skmacyenum { 50167514Skmacy AEL100X_TX_DISABLE = 9, 51167514Skmacy AEL100X_TX_CONFIG1 = 0xc002, 52167514Skmacy AEL1002_PWR_DOWN_HI = 0xc011, 53167514Skmacy AEL1002_PWR_DOWN_LO = 0xc012, 54167514Skmacy AEL1002_XFI_EQL = 0xc015, 55167514Skmacy AEL1002_LB_EN = 0xc017, 56180583Skmacy AEL_OPT_SETTINGS = 0xc017, 57181614Skmacy AEL_I2C_CTRL = 0xc30a, 58181614Skmacy AEL_I2C_DATA = 0xc30b, 59181614Skmacy AEL_I2C_STAT = 0xc30c, 60181614Skmacy AEL2005_GPIO_CTRL = 0xc214, 61181614Skmacy AEL2005_GPIO_STAT = 0xc215, 62180583Skmacy}; 63167514Skmacy 64181614Skmacyenum { edc_none, edc_sr, edc_twinax }; 65181614Skmacy 66181614Skmacy/* PHY module I2C device address */ 67181614Skmacy#define MODULE_DEV_ADDR 0xa0 68181614Skmacy 69181614Skmacy#define AEL2005_MODDET_IRQ 4 70181614Skmacy 71180583Skmacystruct reg_val { 72180583Skmacy unsigned short mmd_addr; 73180583Skmacy unsigned short reg_addr; 74180583Skmacy unsigned short clear_bits; 75180583Skmacy unsigned short set_bits; 76167514Skmacy}; 77167514Skmacy 78180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv) 79180583Skmacy{ 80180583Skmacy int err; 81180583Skmacy 82180583Skmacy for (err = 0; rv->mmd_addr && !err; rv++) { 83180583Skmacy if (rv->clear_bits == 0xffff) 84180583Skmacy err = mdio_write(phy, rv->mmd_addr, rv->reg_addr, 85180583Skmacy rv->set_bits); 86180583Skmacy else 87180583Skmacy err = t3_mdio_change_bits(phy, rv->mmd_addr, 88180583Skmacy rv->reg_addr, rv->clear_bits, 89180583Skmacy rv->set_bits); 90180583Skmacy } 91180583Skmacy return err; 92180583Skmacy} 93180583Skmacy 94167514Skmacystatic void ael100x_txon(struct cphy *phy) 95167514Skmacy{ 96167514Skmacy int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL; 97167514Skmacy 98176472Skmacy msleep(100); 99167514Skmacy t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio); 100176472Skmacy msleep(30); 101167514Skmacy} 102167514Skmacy 103167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable) 104167514Skmacy{ 105167514Skmacy int err; 106167514Skmacy 107167514Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable); 108167514Skmacy if (!err) 109167514Skmacy err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 110167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 111167514Skmacy return err; 112167514Skmacy} 113167514Skmacy 114167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait) 115167514Skmacy{ 116167514Skmacy int err; 117167514Skmacy 118167514Skmacy if ((err = ael1002_power_down(phy, 0)) || 119167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) || 120167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) || 121167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) || 122167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) || 123167514Skmacy (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN, 124167514Skmacy 0, 1 << 5))) 125167514Skmacy return err; 126167514Skmacy return 0; 127167514Skmacy} 128167514Skmacy 129167514Skmacystatic int ael1002_intr_noop(struct cphy *phy) 130167514Skmacy{ 131167514Skmacy return 0; 132167514Skmacy} 133167514Skmacy 134181614Skmacy/* 135181614Skmacy * Get link status for a 10GBASE-R device. 136181614Skmacy */ 137181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed, 138181614Skmacy int *duplex, int *fc) 139167514Skmacy{ 140167514Skmacy if (link_ok) { 141181614Skmacy unsigned int stat0, stat1, stat2; 142181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 143167514Skmacy 144181614Skmacy if (!err) 145181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1); 146181614Skmacy if (!err) 147181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 148167514Skmacy if (err) 149167514Skmacy return err; 150181614Skmacy *link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1; 151167514Skmacy } 152167514Skmacy if (speed) 153167514Skmacy *speed = SPEED_10000; 154167514Skmacy if (duplex) 155167514Skmacy *duplex = DUPLEX_FULL; 156167514Skmacy return 0; 157167514Skmacy} 158167514Skmacy 159167514Skmacy#ifdef C99_NOT_SUPPORTED 160167514Skmacystatic struct cphy_ops ael1002_ops = { 161167514Skmacy ael1002_reset, 162167514Skmacy ael1002_intr_noop, 163167514Skmacy ael1002_intr_noop, 164167514Skmacy ael1002_intr_noop, 165167514Skmacy ael1002_intr_noop, 166167514Skmacy NULL, 167167514Skmacy NULL, 168167514Skmacy NULL, 169167514Skmacy NULL, 170167514Skmacy NULL, 171181614Skmacy get_link_status_r, 172167514Skmacy ael1002_power_down, 173167514Skmacy}; 174167514Skmacy#else 175167514Skmacystatic struct cphy_ops ael1002_ops = { 176167514Skmacy .reset = ael1002_reset, 177167514Skmacy .intr_enable = ael1002_intr_noop, 178167514Skmacy .intr_disable = ael1002_intr_noop, 179167514Skmacy .intr_clear = ael1002_intr_noop, 180167514Skmacy .intr_handler = ael1002_intr_noop, 181181614Skmacy .get_link_status = get_link_status_r, 182167514Skmacy .power_down = ael1002_power_down, 183167514Skmacy}; 184167514Skmacy#endif 185167514Skmacy 186176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 187176472Skmacy const struct mdio_ops *mdio_ops) 188167514Skmacy{ 189176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops, 190176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 191177340Skmacy "10GBASE-R"); 192167514Skmacy ael100x_txon(phy); 193176472Skmacy return 0; 194167514Skmacy} 195167514Skmacy 196167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait) 197167514Skmacy{ 198167514Skmacy return t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 199167514Skmacy} 200167514Skmacy 201167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable) 202167514Skmacy{ 203167514Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 204167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 205167514Skmacy} 206167514Skmacy 207167514Skmacy#ifdef C99_NOT_SUPPORTED 208167514Skmacystatic struct cphy_ops ael1006_ops = { 209167514Skmacy ael1006_reset, 210180583Skmacy t3_phy_lasi_intr_enable, 211180583Skmacy t3_phy_lasi_intr_disable, 212180583Skmacy t3_phy_lasi_intr_clear, 213180583Skmacy t3_phy_lasi_intr_handler, 214167514Skmacy NULL, 215167514Skmacy NULL, 216167514Skmacy NULL, 217167514Skmacy NULL, 218167514Skmacy NULL, 219181614Skmacy get_link_status_r, 220167514Skmacy ael1006_power_down, 221167514Skmacy}; 222167514Skmacy#else 223167514Skmacystatic struct cphy_ops ael1006_ops = { 224167514Skmacy .reset = ael1006_reset, 225180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 226180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 227180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 228180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 229181614Skmacy .get_link_status = get_link_status_r, 230167514Skmacy .power_down = ael1006_power_down, 231167514Skmacy}; 232167514Skmacy#endif 233167514Skmacy 234176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 235176472Skmacy const struct mdio_ops *mdio_ops) 236167514Skmacy{ 237176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops, 238176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 239176472Skmacy "10GBASE-SR"); 240167514Skmacy ael100x_txon(phy); 241176472Skmacy return 0; 242167514Skmacy} 243167514Skmacy 244180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 245180583Skmacy{ 246181614Skmacy static struct reg_val regs[] = { 247181614Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 248181614Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 249181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 250181614Skmacy { 0, 0, 0, 0 } 251181614Skmacy }; 252180583Skmacy static u16 sr_edc[] = { 253180583Skmacy 0xcc00, 0x2ff4, 254180583Skmacy 0xcc01, 0x3cd4, 255180583Skmacy 0xcc02, 0x2015, 256180583Skmacy 0xcc03, 0x3105, 257180583Skmacy 0xcc04, 0x6524, 258180583Skmacy 0xcc05, 0x27ff, 259180583Skmacy 0xcc06, 0x300f, 260180583Skmacy 0xcc07, 0x2c8b, 261180583Skmacy 0xcc08, 0x300b, 262180583Skmacy 0xcc09, 0x4009, 263180583Skmacy 0xcc0a, 0x400e, 264180583Skmacy 0xcc0b, 0x2f72, 265180583Skmacy 0xcc0c, 0x3002, 266180583Skmacy 0xcc0d, 0x1002, 267180583Skmacy 0xcc0e, 0x2172, 268180583Skmacy 0xcc0f, 0x3012, 269180583Skmacy 0xcc10, 0x1002, 270180583Skmacy 0xcc11, 0x25d2, 271180583Skmacy 0xcc12, 0x3012, 272180583Skmacy 0xcc13, 0x1002, 273180583Skmacy 0xcc14, 0xd01e, 274180583Skmacy 0xcc15, 0x27d2, 275180583Skmacy 0xcc16, 0x3012, 276180583Skmacy 0xcc17, 0x1002, 277180583Skmacy 0xcc18, 0x2004, 278180583Skmacy 0xcc19, 0x3c84, 279180583Skmacy 0xcc1a, 0x6436, 280180583Skmacy 0xcc1b, 0x2007, 281180583Skmacy 0xcc1c, 0x3f87, 282180583Skmacy 0xcc1d, 0x8676, 283180583Skmacy 0xcc1e, 0x40b7, 284180583Skmacy 0xcc1f, 0xa746, 285180583Skmacy 0xcc20, 0x4047, 286180583Skmacy 0xcc21, 0x5673, 287180583Skmacy 0xcc22, 0x2982, 288180583Skmacy 0xcc23, 0x3002, 289180583Skmacy 0xcc24, 0x13d2, 290180583Skmacy 0xcc25, 0x8bbd, 291180583Skmacy 0xcc26, 0x2862, 292180583Skmacy 0xcc27, 0x3012, 293180583Skmacy 0xcc28, 0x1002, 294180583Skmacy 0xcc29, 0x2092, 295180583Skmacy 0xcc2a, 0x3012, 296180583Skmacy 0xcc2b, 0x1002, 297180583Skmacy 0xcc2c, 0x5cc3, 298180583Skmacy 0xcc2d, 0x314, 299180583Skmacy 0xcc2e, 0x2942, 300180583Skmacy 0xcc2f, 0x3002, 301180583Skmacy 0xcc30, 0x1002, 302180583Skmacy 0xcc31, 0xd019, 303180583Skmacy 0xcc32, 0x2032, 304180583Skmacy 0xcc33, 0x3012, 305180583Skmacy 0xcc34, 0x1002, 306180583Skmacy 0xcc35, 0x2a04, 307180583Skmacy 0xcc36, 0x3c74, 308180583Skmacy 0xcc37, 0x6435, 309180583Skmacy 0xcc38, 0x2fa4, 310180583Skmacy 0xcc39, 0x3cd4, 311180583Skmacy 0xcc3a, 0x6624, 312180583Skmacy 0xcc3b, 0x5563, 313180583Skmacy 0xcc3c, 0x2d42, 314180583Skmacy 0xcc3d, 0x3002, 315180583Skmacy 0xcc3e, 0x13d2, 316180583Skmacy 0xcc3f, 0x464d, 317180583Skmacy 0xcc40, 0x2862, 318180583Skmacy 0xcc41, 0x3012, 319180583Skmacy 0xcc42, 0x1002, 320180583Skmacy 0xcc43, 0x2032, 321180583Skmacy 0xcc44, 0x3012, 322180583Skmacy 0xcc45, 0x1002, 323180583Skmacy 0xcc46, 0x2fb4, 324180583Skmacy 0xcc47, 0x3cd4, 325180583Skmacy 0xcc48, 0x6624, 326180583Skmacy 0xcc49, 0x5563, 327180583Skmacy 0xcc4a, 0x2d42, 328180583Skmacy 0xcc4b, 0x3002, 329180583Skmacy 0xcc4c, 0x13d2, 330180583Skmacy 0xcc4d, 0x2ed2, 331180583Skmacy 0xcc4e, 0x3002, 332180583Skmacy 0xcc4f, 0x1002, 333180583Skmacy 0xcc50, 0x2fd2, 334180583Skmacy 0xcc51, 0x3002, 335180583Skmacy 0xcc52, 0x1002, 336180583Skmacy 0xcc53, 0x004, 337180583Skmacy 0xcc54, 0x2942, 338180583Skmacy 0xcc55, 0x3002, 339180583Skmacy 0xcc56, 0x1002, 340180583Skmacy 0xcc57, 0x2092, 341180583Skmacy 0xcc58, 0x3012, 342180583Skmacy 0xcc59, 0x1002, 343180583Skmacy 0xcc5a, 0x5cc3, 344180583Skmacy 0xcc5b, 0x317, 345180583Skmacy 0xcc5c, 0x2f72, 346180583Skmacy 0xcc5d, 0x3002, 347180583Skmacy 0xcc5e, 0x1002, 348180583Skmacy 0xcc5f, 0x2942, 349180583Skmacy 0xcc60, 0x3002, 350180583Skmacy 0xcc61, 0x1002, 351180583Skmacy 0xcc62, 0x22cd, 352180583Skmacy 0xcc63, 0x301d, 353180583Skmacy 0xcc64, 0x2862, 354180583Skmacy 0xcc65, 0x3012, 355180583Skmacy 0xcc66, 0x1002, 356180583Skmacy 0xcc67, 0x2ed2, 357180583Skmacy 0xcc68, 0x3002, 358180583Skmacy 0xcc69, 0x1002, 359180583Skmacy 0xcc6a, 0x2d72, 360180583Skmacy 0xcc6b, 0x3002, 361180583Skmacy 0xcc6c, 0x1002, 362180583Skmacy 0xcc6d, 0x628f, 363180583Skmacy 0xcc6e, 0x2112, 364180583Skmacy 0xcc6f, 0x3012, 365180583Skmacy 0xcc70, 0x1002, 366180583Skmacy 0xcc71, 0x5aa3, 367180583Skmacy 0xcc72, 0x2dc2, 368180583Skmacy 0xcc73, 0x3002, 369180583Skmacy 0xcc74, 0x1312, 370180583Skmacy 0xcc75, 0x6f72, 371180583Skmacy 0xcc76, 0x1002, 372180583Skmacy 0xcc77, 0x2807, 373180583Skmacy 0xcc78, 0x31a7, 374180583Skmacy 0xcc79, 0x20c4, 375180583Skmacy 0xcc7a, 0x3c24, 376180583Skmacy 0xcc7b, 0x6724, 377180583Skmacy 0xcc7c, 0x1002, 378180583Skmacy 0xcc7d, 0x2807, 379180583Skmacy 0xcc7e, 0x3187, 380180583Skmacy 0xcc7f, 0x20c4, 381180583Skmacy 0xcc80, 0x3c24, 382180583Skmacy 0xcc81, 0x6724, 383180583Skmacy 0xcc82, 0x1002, 384180583Skmacy 0xcc83, 0x2514, 385180583Skmacy 0xcc84, 0x3c64, 386180583Skmacy 0xcc85, 0x6436, 387180583Skmacy 0xcc86, 0xdff4, 388180583Skmacy 0xcc87, 0x6436, 389180583Skmacy 0xcc88, 0x1002, 390180583Skmacy 0xcc89, 0x40a4, 391180583Skmacy 0xcc8a, 0x643c, 392180583Skmacy 0xcc8b, 0x4016, 393180583Skmacy 0xcc8c, 0x8c6c, 394180583Skmacy 0xcc8d, 0x2b24, 395180583Skmacy 0xcc8e, 0x3c24, 396180583Skmacy 0xcc8f, 0x6435, 397180583Skmacy 0xcc90, 0x1002, 398180583Skmacy 0xcc91, 0x2b24, 399180583Skmacy 0xcc92, 0x3c24, 400180583Skmacy 0xcc93, 0x643a, 401180583Skmacy 0xcc94, 0x4025, 402180583Skmacy 0xcc95, 0x8a5a, 403180583Skmacy 0xcc96, 0x1002, 404180583Skmacy 0xcc97, 0x2731, 405180583Skmacy 0xcc98, 0x3011, 406180583Skmacy 0xcc99, 0x1001, 407180583Skmacy 0xcc9a, 0xc7a0, 408180583Skmacy 0xcc9b, 0x100, 409180583Skmacy 0xcc9c, 0xc502, 410180583Skmacy 0xcc9d, 0x53ac, 411180583Skmacy 0xcc9e, 0xc503, 412180583Skmacy 0xcc9f, 0xd5d5, 413180583Skmacy 0xcca0, 0xc600, 414180583Skmacy 0xcca1, 0x2a6d, 415180583Skmacy 0xcca2, 0xc601, 416180583Skmacy 0xcca3, 0x2a4c, 417180583Skmacy 0xcca4, 0xc602, 418180583Skmacy 0xcca5, 0x111, 419180583Skmacy 0xcca6, 0xc60c, 420180583Skmacy 0xcca7, 0x5900, 421180583Skmacy 0xcca8, 0xc710, 422180583Skmacy 0xcca9, 0x700, 423180583Skmacy 0xccaa, 0xc718, 424180583Skmacy 0xccab, 0x700, 425180583Skmacy 0xccac, 0xc720, 426180583Skmacy 0xccad, 0x4700, 427180583Skmacy 0xccae, 0xc801, 428180583Skmacy 0xccaf, 0x7f50, 429180583Skmacy 0xccb0, 0xc802, 430180583Skmacy 0xccb1, 0x7760, 431180583Skmacy 0xccb2, 0xc803, 432180583Skmacy 0xccb3, 0x7fce, 433180583Skmacy 0xccb4, 0xc804, 434180583Skmacy 0xccb5, 0x5700, 435180583Skmacy 0xccb6, 0xc805, 436180583Skmacy 0xccb7, 0x5f11, 437180583Skmacy 0xccb8, 0xc806, 438180583Skmacy 0xccb9, 0x4751, 439180583Skmacy 0xccba, 0xc807, 440180583Skmacy 0xccbb, 0x57e1, 441180583Skmacy 0xccbc, 0xc808, 442180583Skmacy 0xccbd, 0x2700, 443180583Skmacy 0xccbe, 0xc809, 444180583Skmacy 0xccbf, 0x000, 445180583Skmacy 0xccc0, 0xc821, 446180583Skmacy 0xccc1, 0x002, 447180583Skmacy 0xccc2, 0xc822, 448180583Skmacy 0xccc3, 0x014, 449180583Skmacy 0xccc4, 0xc832, 450180583Skmacy 0xccc5, 0x1186, 451180583Skmacy 0xccc6, 0xc847, 452180583Skmacy 0xccc7, 0x1e02, 453180583Skmacy 0xccc8, 0xc013, 454180583Skmacy 0xccc9, 0xf341, 455180583Skmacy 0xccca, 0xc01a, 456180583Skmacy 0xcccb, 0x446, 457180583Skmacy 0xcccc, 0xc024, 458180583Skmacy 0xcccd, 0x1000, 459180583Skmacy 0xccce, 0xc025, 460180583Skmacy 0xcccf, 0xa00, 461180583Skmacy 0xccd0, 0xc026, 462180583Skmacy 0xccd1, 0xc0c, 463180583Skmacy 0xccd2, 0xc027, 464180583Skmacy 0xccd3, 0xc0c, 465180583Skmacy 0xccd4, 0xc029, 466180583Skmacy 0xccd5, 0x0a0, 467180583Skmacy 0xccd6, 0xc030, 468180583Skmacy 0xccd7, 0xa00, 469180583Skmacy 0xccd8, 0xc03c, 470180583Skmacy 0xccd9, 0x01c, 471180583Skmacy 0xccda, 0xc005, 472180583Skmacy 0xccdb, 0x7a06, 473180583Skmacy 0xccdc, 0x000, 474180583Skmacy 0xccdd, 0x2731, 475180583Skmacy 0xccde, 0x3011, 476180583Skmacy 0xccdf, 0x1001, 477180583Skmacy 0xcce0, 0xc620, 478180583Skmacy 0xcce1, 0x000, 479180583Skmacy 0xcce2, 0xc621, 480180583Skmacy 0xcce3, 0x03f, 481180583Skmacy 0xcce4, 0xc622, 482180583Skmacy 0xcce5, 0x000, 483180583Skmacy 0xcce6, 0xc623, 484180583Skmacy 0xcce7, 0x000, 485180583Skmacy 0xcce8, 0xc624, 486180583Skmacy 0xcce9, 0x000, 487180583Skmacy 0xccea, 0xc625, 488180583Skmacy 0xcceb, 0x000, 489180583Skmacy 0xccec, 0xc627, 490180583Skmacy 0xcced, 0x000, 491180583Skmacy 0xccee, 0xc628, 492180583Skmacy 0xccef, 0x000, 493180583Skmacy 0xccf0, 0xc62c, 494180583Skmacy 0xccf1, 0x000, 495180583Skmacy 0xccf2, 0x000, 496180583Skmacy 0xccf3, 0x2806, 497180583Skmacy 0xccf4, 0x3cb6, 498180583Skmacy 0xccf5, 0xc161, 499180583Skmacy 0xccf6, 0x6134, 500180583Skmacy 0xccf7, 0x6135, 501180583Skmacy 0xccf8, 0x5443, 502180583Skmacy 0xccf9, 0x303, 503180583Skmacy 0xccfa, 0x6524, 504180583Skmacy 0xccfb, 0x00b, 505180583Skmacy 0xccfc, 0x1002, 506180583Skmacy 0xccfd, 0x2104, 507180583Skmacy 0xccfe, 0x3c24, 508180583Skmacy 0xccff, 0x2105, 509180583Skmacy 0xcd00, 0x3805, 510180583Skmacy 0xcd01, 0x6524, 511180583Skmacy 0xcd02, 0xdff4, 512180583Skmacy 0xcd03, 0x4005, 513180583Skmacy 0xcd04, 0x6524, 514180583Skmacy 0xcd05, 0x1002, 515180583Skmacy 0xcd06, 0x5dd3, 516180583Skmacy 0xcd07, 0x306, 517180583Skmacy 0xcd08, 0x2ff7, 518180583Skmacy 0xcd09, 0x38f7, 519180583Skmacy 0xcd0a, 0x60b7, 520180583Skmacy 0xcd0b, 0xdffd, 521180583Skmacy 0xcd0c, 0x00a, 522180583Skmacy 0xcd0d, 0x1002, 523180583Skmacy 0xcd0e, 0 524180583Skmacy }; 525180583Skmacy int i, err; 526180583Skmacy 527181614Skmacy err = set_phy_regs(phy, regs); 528181614Skmacy if (err) 529181614Skmacy return err; 530181614Skmacy 531181614Skmacy msleep(50); 532181614Skmacy 533181614Skmacy for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 534180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 535180583Skmacy sr_edc[i + 1]); 536181614Skmacy if (!err) 537181614Skmacy phy->priv = edc_sr; 538180583Skmacy return err; 539180583Skmacy} 540180583Skmacy 541181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) 542181614Skmacy{ 543181614Skmacy static struct reg_val regs[] = { 544181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 }, 545181614Skmacy { 0, 0, 0, 0 } 546181614Skmacy }; 547181614Skmacy static struct reg_val preemphasis[] = { 548181614Skmacy { MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 }, 549181614Skmacy { MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 }, 550181614Skmacy { 0, 0, 0, 0 } 551181614Skmacy }; 552181614Skmacy static u16 twinax_edc[] = { 553181614Skmacy 0xcc00, 0x4009, 554181614Skmacy 0xcc01, 0x27ff, 555181614Skmacy 0xcc02, 0x300f, 556181614Skmacy 0xcc03, 0x40aa, 557181614Skmacy 0xcc04, 0x401c, 558181614Skmacy 0xcc05, 0x401e, 559181614Skmacy 0xcc06, 0x2ff4, 560181614Skmacy 0xcc07, 0x3cd4, 561181614Skmacy 0xcc08, 0x2035, 562181614Skmacy 0xcc09, 0x3145, 563181614Skmacy 0xcc0a, 0x6524, 564181614Skmacy 0xcc0b, 0x26a2, 565181614Skmacy 0xcc0c, 0x3012, 566181614Skmacy 0xcc0d, 0x1002, 567181614Skmacy 0xcc0e, 0x29c2, 568181614Skmacy 0xcc0f, 0x3002, 569181614Skmacy 0xcc10, 0x1002, 570181614Skmacy 0xcc11, 0x2072, 571181614Skmacy 0xcc12, 0x3012, 572181614Skmacy 0xcc13, 0x1002, 573181614Skmacy 0xcc14, 0x22cd, 574181614Skmacy 0xcc15, 0x301d, 575181614Skmacy 0xcc16, 0x2e52, 576181614Skmacy 0xcc17, 0x3012, 577181614Skmacy 0xcc18, 0x1002, 578181614Skmacy 0xcc19, 0x28e2, 579181614Skmacy 0xcc1a, 0x3002, 580181614Skmacy 0xcc1b, 0x1002, 581181614Skmacy 0xcc1c, 0x628f, 582181614Skmacy 0xcc1d, 0x2ac2, 583181614Skmacy 0xcc1e, 0x3012, 584181614Skmacy 0xcc1f, 0x1002, 585181614Skmacy 0xcc20, 0x5553, 586181614Skmacy 0xcc21, 0x2ae2, 587181614Skmacy 0xcc22, 0x3002, 588181614Skmacy 0xcc23, 0x1302, 589181614Skmacy 0xcc24, 0x401e, 590181614Skmacy 0xcc25, 0x2be2, 591181614Skmacy 0xcc26, 0x3012, 592181614Skmacy 0xcc27, 0x1002, 593181614Skmacy 0xcc28, 0x2da2, 594181614Skmacy 0xcc29, 0x3012, 595181614Skmacy 0xcc2a, 0x1002, 596181614Skmacy 0xcc2b, 0x2ba2, 597181614Skmacy 0xcc2c, 0x3002, 598181614Skmacy 0xcc2d, 0x1002, 599181614Skmacy 0xcc2e, 0x5ee3, 600181614Skmacy 0xcc2f, 0x305, 601181614Skmacy 0xcc30, 0x400e, 602181614Skmacy 0xcc31, 0x2bc2, 603181614Skmacy 0xcc32, 0x3002, 604181614Skmacy 0xcc33, 0x1002, 605181614Skmacy 0xcc34, 0x2b82, 606181614Skmacy 0xcc35, 0x3012, 607181614Skmacy 0xcc36, 0x1002, 608181614Skmacy 0xcc37, 0x5663, 609181614Skmacy 0xcc38, 0x302, 610181614Skmacy 0xcc39, 0x401e, 611181614Skmacy 0xcc3a, 0x6f72, 612181614Skmacy 0xcc3b, 0x1002, 613181614Skmacy 0xcc3c, 0x628f, 614181614Skmacy 0xcc3d, 0x2be2, 615181614Skmacy 0xcc3e, 0x3012, 616181614Skmacy 0xcc3f, 0x1002, 617181614Skmacy 0xcc40, 0x22cd, 618181614Skmacy 0xcc41, 0x301d, 619181614Skmacy 0xcc42, 0x2e52, 620181614Skmacy 0xcc43, 0x3012, 621181614Skmacy 0xcc44, 0x1002, 622181614Skmacy 0xcc45, 0x2522, 623181614Skmacy 0xcc46, 0x3012, 624181614Skmacy 0xcc47, 0x1002, 625181614Skmacy 0xcc48, 0x2da2, 626181614Skmacy 0xcc49, 0x3012, 627181614Skmacy 0xcc4a, 0x1002, 628181614Skmacy 0xcc4b, 0x2ca2, 629181614Skmacy 0xcc4c, 0x3012, 630181614Skmacy 0xcc4d, 0x1002, 631181614Skmacy 0xcc4e, 0x2fa4, 632181614Skmacy 0xcc4f, 0x3cd4, 633181614Skmacy 0xcc50, 0x6624, 634181614Skmacy 0xcc51, 0x410b, 635181614Skmacy 0xcc52, 0x56b3, 636181614Skmacy 0xcc53, 0x3c4, 637181614Skmacy 0xcc54, 0x2fb2, 638181614Skmacy 0xcc55, 0x3002, 639181614Skmacy 0xcc56, 0x1002, 640181614Skmacy 0xcc57, 0x220b, 641181614Skmacy 0xcc58, 0x303b, 642181614Skmacy 0xcc59, 0x56b3, 643181614Skmacy 0xcc5a, 0x3c3, 644181614Skmacy 0xcc5b, 0x866b, 645181614Skmacy 0xcc5c, 0x400c, 646181614Skmacy 0xcc5d, 0x23a2, 647181614Skmacy 0xcc5e, 0x3012, 648181614Skmacy 0xcc5f, 0x1002, 649181614Skmacy 0xcc60, 0x2da2, 650181614Skmacy 0xcc61, 0x3012, 651181614Skmacy 0xcc62, 0x1002, 652181614Skmacy 0xcc63, 0x2ca2, 653181614Skmacy 0xcc64, 0x3012, 654181614Skmacy 0xcc65, 0x1002, 655181614Skmacy 0xcc66, 0x2fb4, 656181614Skmacy 0xcc67, 0x3cd4, 657181614Skmacy 0xcc68, 0x6624, 658181614Skmacy 0xcc69, 0x56b3, 659181614Skmacy 0xcc6a, 0x3c3, 660181614Skmacy 0xcc6b, 0x866b, 661181614Skmacy 0xcc6c, 0x401c, 662181614Skmacy 0xcc6d, 0x2205, 663181614Skmacy 0xcc6e, 0x3035, 664181614Skmacy 0xcc6f, 0x5b53, 665181614Skmacy 0xcc70, 0x2c52, 666181614Skmacy 0xcc71, 0x3002, 667181614Skmacy 0xcc72, 0x13c2, 668181614Skmacy 0xcc73, 0x5cc3, 669181614Skmacy 0xcc74, 0x317, 670181614Skmacy 0xcc75, 0x2522, 671181614Skmacy 0xcc76, 0x3012, 672181614Skmacy 0xcc77, 0x1002, 673181614Skmacy 0xcc78, 0x2da2, 674181614Skmacy 0xcc79, 0x3012, 675181614Skmacy 0xcc7a, 0x1002, 676181614Skmacy 0xcc7b, 0x2b82, 677181614Skmacy 0xcc7c, 0x3012, 678181614Skmacy 0xcc7d, 0x1002, 679181614Skmacy 0xcc7e, 0x5663, 680181614Skmacy 0xcc7f, 0x303, 681181614Skmacy 0xcc80, 0x401e, 682181614Skmacy 0xcc81, 0x004, 683181614Skmacy 0xcc82, 0x2c42, 684181614Skmacy 0xcc83, 0x3012, 685181614Skmacy 0xcc84, 0x1002, 686181614Skmacy 0xcc85, 0x6f72, 687181614Skmacy 0xcc86, 0x1002, 688181614Skmacy 0xcc87, 0x628f, 689181614Skmacy 0xcc88, 0x2304, 690181614Skmacy 0xcc89, 0x3c84, 691181614Skmacy 0xcc8a, 0x6436, 692181614Skmacy 0xcc8b, 0xdff4, 693181614Skmacy 0xcc8c, 0x6436, 694181614Skmacy 0xcc8d, 0x2ff5, 695181614Skmacy 0xcc8e, 0x3005, 696181614Skmacy 0xcc8f, 0x8656, 697181614Skmacy 0xcc90, 0xdfba, 698181614Skmacy 0xcc91, 0x56a3, 699181614Skmacy 0xcc92, 0xd05a, 700181614Skmacy 0xcc93, 0x21c2, 701181614Skmacy 0xcc94, 0x3012, 702181614Skmacy 0xcc95, 0x1392, 703181614Skmacy 0xcc96, 0xd05a, 704181614Skmacy 0xcc97, 0x56a3, 705181614Skmacy 0xcc98, 0xdfba, 706181614Skmacy 0xcc99, 0x383, 707181614Skmacy 0xcc9a, 0x6f72, 708181614Skmacy 0xcc9b, 0x1002, 709181614Skmacy 0xcc9c, 0x28c5, 710181614Skmacy 0xcc9d, 0x3005, 711181614Skmacy 0xcc9e, 0x4178, 712181614Skmacy 0xcc9f, 0x5653, 713181614Skmacy 0xcca0, 0x384, 714181614Skmacy 0xcca1, 0x22b2, 715181614Skmacy 0xcca2, 0x3012, 716181614Skmacy 0xcca3, 0x1002, 717181614Skmacy 0xcca4, 0x2be5, 718181614Skmacy 0xcca5, 0x3005, 719181614Skmacy 0xcca6, 0x41e8, 720181614Skmacy 0xcca7, 0x5653, 721181614Skmacy 0xcca8, 0x382, 722181614Skmacy 0xcca9, 0x002, 723181614Skmacy 0xccaa, 0x4258, 724181614Skmacy 0xccab, 0x2474, 725181614Skmacy 0xccac, 0x3c84, 726181614Skmacy 0xccad, 0x6437, 727181614Skmacy 0xccae, 0xdff4, 728181614Skmacy 0xccaf, 0x6437, 729181614Skmacy 0xccb0, 0x2ff5, 730181614Skmacy 0xccb1, 0x3c05, 731181614Skmacy 0xccb2, 0x8757, 732181614Skmacy 0xccb3, 0xb888, 733181614Skmacy 0xccb4, 0x9787, 734181614Skmacy 0xccb5, 0xdff4, 735181614Skmacy 0xccb6, 0x6724, 736181614Skmacy 0xccb7, 0x866a, 737181614Skmacy 0xccb8, 0x6f72, 738181614Skmacy 0xccb9, 0x1002, 739181614Skmacy 0xccba, 0x2d01, 740181614Skmacy 0xccbb, 0x3011, 741181614Skmacy 0xccbc, 0x1001, 742181614Skmacy 0xccbd, 0xc620, 743181614Skmacy 0xccbe, 0x14e5, 744181614Skmacy 0xccbf, 0xc621, 745181614Skmacy 0xccc0, 0xc53d, 746181614Skmacy 0xccc1, 0xc622, 747181614Skmacy 0xccc2, 0x3cbe, 748181614Skmacy 0xccc3, 0xc623, 749181614Skmacy 0xccc4, 0x4452, 750181614Skmacy 0xccc5, 0xc624, 751181614Skmacy 0xccc6, 0xc5c5, 752181614Skmacy 0xccc7, 0xc625, 753181614Skmacy 0xccc8, 0xe01e, 754181614Skmacy 0xccc9, 0xc627, 755181614Skmacy 0xccca, 0x000, 756181614Skmacy 0xcccb, 0xc628, 757181614Skmacy 0xcccc, 0x000, 758181614Skmacy 0xcccd, 0xc62b, 759181614Skmacy 0xccce, 0x000, 760181614Skmacy 0xcccf, 0xc62c, 761181614Skmacy 0xccd0, 0x000, 762181614Skmacy 0xccd1, 0x000, 763181614Skmacy 0xccd2, 0x2d01, 764181614Skmacy 0xccd3, 0x3011, 765181614Skmacy 0xccd4, 0x1001, 766181614Skmacy 0xccd5, 0xc620, 767181614Skmacy 0xccd6, 0x000, 768181614Skmacy 0xccd7, 0xc621, 769181614Skmacy 0xccd8, 0x000, 770181614Skmacy 0xccd9, 0xc622, 771181614Skmacy 0xccda, 0x0ce, 772181614Skmacy 0xccdb, 0xc623, 773181614Skmacy 0xccdc, 0x07f, 774181614Skmacy 0xccdd, 0xc624, 775181614Skmacy 0xccde, 0x032, 776181614Skmacy 0xccdf, 0xc625, 777181614Skmacy 0xcce0, 0x000, 778181614Skmacy 0xcce1, 0xc627, 779181614Skmacy 0xcce2, 0x000, 780181614Skmacy 0xcce3, 0xc628, 781181614Skmacy 0xcce4, 0x000, 782181614Skmacy 0xcce5, 0xc62b, 783181614Skmacy 0xcce6, 0x000, 784181614Skmacy 0xcce7, 0xc62c, 785181614Skmacy 0xcce8, 0x000, 786181614Skmacy 0xcce9, 0x000, 787181614Skmacy 0xccea, 0x2d01, 788181614Skmacy 0xcceb, 0x3011, 789181614Skmacy 0xccec, 0x1001, 790181614Skmacy 0xcced, 0xc502, 791181614Skmacy 0xccee, 0x609f, 792181614Skmacy 0xccef, 0xc600, 793181614Skmacy 0xccf0, 0x2a6e, 794181614Skmacy 0xccf1, 0xc601, 795181614Skmacy 0xccf2, 0x2a2c, 796181614Skmacy 0xccf3, 0xc60c, 797181614Skmacy 0xccf4, 0x5400, 798181614Skmacy 0xccf5, 0xc710, 799181614Skmacy 0xccf6, 0x700, 800181614Skmacy 0xccf7, 0xc718, 801181614Skmacy 0xccf8, 0x700, 802181614Skmacy 0xccf9, 0xc720, 803181614Skmacy 0xccfa, 0x4700, 804181614Skmacy 0xccfb, 0xc728, 805181614Skmacy 0xccfc, 0x700, 806181614Skmacy 0xccfd, 0xc729, 807181614Skmacy 0xccfe, 0x1207, 808181614Skmacy 0xccff, 0xc801, 809181614Skmacy 0xcd00, 0x7f50, 810181614Skmacy 0xcd01, 0xc802, 811181614Skmacy 0xcd02, 0x7760, 812181614Skmacy 0xcd03, 0xc803, 813181614Skmacy 0xcd04, 0x7fce, 814181614Skmacy 0xcd05, 0xc804, 815181614Skmacy 0xcd06, 0x520e, 816181614Skmacy 0xcd07, 0xc805, 817181614Skmacy 0xcd08, 0x5c11, 818181614Skmacy 0xcd09, 0xc806, 819181614Skmacy 0xcd0a, 0x3c51, 820181614Skmacy 0xcd0b, 0xc807, 821181614Skmacy 0xcd0c, 0x4061, 822181614Skmacy 0xcd0d, 0xc808, 823181614Skmacy 0xcd0e, 0x49c1, 824181614Skmacy 0xcd0f, 0xc809, 825181614Skmacy 0xcd10, 0x3840, 826181614Skmacy 0xcd11, 0xc80a, 827181614Skmacy 0xcd12, 0x000, 828181614Skmacy 0xcd13, 0xc821, 829181614Skmacy 0xcd14, 0x002, 830181614Skmacy 0xcd15, 0xc822, 831181614Skmacy 0xcd16, 0x046, 832181614Skmacy 0xcd17, 0xc844, 833181614Skmacy 0xcd18, 0x182f, 834181614Skmacy 0xcd19, 0xc013, 835181614Skmacy 0xcd1a, 0xf341, 836181614Skmacy 0xcd1b, 0xc01a, 837181614Skmacy 0xcd1c, 0x446, 838181614Skmacy 0xcd1d, 0xc024, 839181614Skmacy 0xcd1e, 0x1000, 840181614Skmacy 0xcd1f, 0xc025, 841181614Skmacy 0xcd20, 0xa00, 842181614Skmacy 0xcd21, 0xc026, 843181614Skmacy 0xcd22, 0xc0c, 844181614Skmacy 0xcd23, 0xc027, 845181614Skmacy 0xcd24, 0xc0c, 846181614Skmacy 0xcd25, 0xc029, 847181614Skmacy 0xcd26, 0x0a0, 848181614Skmacy 0xcd27, 0xc030, 849181614Skmacy 0xcd28, 0xa00, 850181614Skmacy 0xcd29, 0xc03c, 851181614Skmacy 0xcd2a, 0x01c, 852181614Skmacy 0xcd2b, 0x000, 853181614Skmacy 0xcd2c, 0x2b84, 854181614Skmacy 0xcd2d, 0x3c74, 855181614Skmacy 0xcd2e, 0x6435, 856181614Skmacy 0xcd2f, 0xdff4, 857181614Skmacy 0xcd30, 0x6435, 858181614Skmacy 0xcd31, 0x2806, 859181614Skmacy 0xcd32, 0x3006, 860181614Skmacy 0xcd33, 0x8565, 861181614Skmacy 0xcd34, 0x2b24, 862181614Skmacy 0xcd35, 0x3c24, 863181614Skmacy 0xcd36, 0x6436, 864181614Skmacy 0xcd37, 0x1002, 865181614Skmacy 0xcd38, 0x2b24, 866181614Skmacy 0xcd39, 0x3c24, 867181614Skmacy 0xcd3a, 0x6436, 868181614Skmacy 0xcd3b, 0x4045, 869181614Skmacy 0xcd3c, 0x8656, 870181614Skmacy 0xcd3d, 0x1002, 871181614Skmacy 0xcd3e, 0x2807, 872181614Skmacy 0xcd3f, 0x31a7, 873181614Skmacy 0xcd40, 0x20c4, 874181614Skmacy 0xcd41, 0x3c24, 875181614Skmacy 0xcd42, 0x6724, 876181614Skmacy 0xcd43, 0x1002, 877181614Skmacy 0xcd44, 0x2807, 878181614Skmacy 0xcd45, 0x3187, 879181614Skmacy 0xcd46, 0x20c4, 880181614Skmacy 0xcd47, 0x3c24, 881181614Skmacy 0xcd48, 0x6724, 882181614Skmacy 0xcd49, 0x1002, 883181614Skmacy 0xcd4a, 0x2514, 884181614Skmacy 0xcd4b, 0x3c64, 885181614Skmacy 0xcd4c, 0x6436, 886181614Skmacy 0xcd4d, 0xdff4, 887181614Skmacy 0xcd4e, 0x6436, 888181614Skmacy 0xcd4f, 0x1002, 889181614Skmacy 0xcd50, 0x2806, 890181614Skmacy 0xcd51, 0x3cb6, 891181614Skmacy 0xcd52, 0xc161, 892181614Skmacy 0xcd53, 0x6134, 893181614Skmacy 0xcd54, 0x6135, 894181614Skmacy 0xcd55, 0x5443, 895181614Skmacy 0xcd56, 0x303, 896181614Skmacy 0xcd57, 0x6524, 897181614Skmacy 0xcd58, 0x00b, 898181614Skmacy 0xcd59, 0x1002, 899181614Skmacy 0xcd5a, 0xd019, 900181614Skmacy 0xcd5b, 0x2104, 901181614Skmacy 0xcd5c, 0x3c24, 902181614Skmacy 0xcd5d, 0x2105, 903181614Skmacy 0xcd5e, 0x3805, 904181614Skmacy 0xcd5f, 0x6524, 905181614Skmacy 0xcd60, 0xdff4, 906181614Skmacy 0xcd61, 0x4005, 907181614Skmacy 0xcd62, 0x6524, 908181614Skmacy 0xcd63, 0x2e8d, 909181614Skmacy 0xcd64, 0x303d, 910181614Skmacy 0xcd65, 0x5dd3, 911181614Skmacy 0xcd66, 0x306, 912181614Skmacy 0xcd67, 0x2ff7, 913181614Skmacy 0xcd68, 0x38f7, 914181614Skmacy 0xcd69, 0x60b7, 915181614Skmacy 0xcd6a, 0xdffd, 916181614Skmacy 0xcd6b, 0x00a, 917181614Skmacy 0xcd6c, 0x1002, 918181614Skmacy 0xcd6d, 0 919181614Skmacy }; 920181614Skmacy int i, err; 921181614Skmacy 922181614Skmacy err = set_phy_regs(phy, regs); 923181614Skmacy if (!err && modtype == phy_modtype_twinax_long) 924181614Skmacy err = set_phy_regs(phy, preemphasis); 925181614Skmacy if (err) 926181614Skmacy return err; 927181614Skmacy 928181614Skmacy msleep(50); 929181614Skmacy 930181614Skmacy for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 931181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 932181614Skmacy twinax_edc[i + 1]); 933181614Skmacy if (!err) 934181614Skmacy phy->priv = edc_twinax; 935181614Skmacy return err; 936181614Skmacy} 937181614Skmacy 938181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) 939181614Skmacy{ 940181614Skmacy int i, err; 941181614Skmacy unsigned int stat, data; 942181614Skmacy 943181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL, 944181614Skmacy (dev_addr << 8) | (1 << 8) | word_addr); 945181614Skmacy if (err) 946181614Skmacy return err; 947181614Skmacy 948181614Skmacy for (i = 0; i < 5; i++) { 949181614Skmacy msleep(1); 950181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat); 951181614Skmacy if (err) 952181614Skmacy return err; 953181614Skmacy if ((stat & 3) == 1) { 954181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, 955181614Skmacy &data); 956181614Skmacy if (err) 957181614Skmacy return err; 958181614Skmacy return data >> 8; 959181614Skmacy } 960181614Skmacy } 961181614Skmacy CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n", 962181614Skmacy phy->addr, word_addr); 963181614Skmacy return -ETIMEDOUT; 964181614Skmacy} 965181614Skmacy 966181614Skmacystatic int get_module_type(struct cphy *phy, int delay_ms) 967181614Skmacy{ 968181614Skmacy int v; 969181614Skmacy unsigned int stat; 970181614Skmacy 971181614Skmacy v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); 972181614Skmacy if (v) 973181614Skmacy return v; 974181614Skmacy 975181614Skmacy if (stat & (1 << 8)) /* module absent */ 976181614Skmacy return phy_modtype_none; 977181614Skmacy 978181614Skmacy if (delay_ms) 979181614Skmacy msleep(delay_ms); 980181614Skmacy 981181614Skmacy /* see SFF-8472 for below */ 982181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3); 983181614Skmacy if (v < 0) 984181614Skmacy return v; 985181614Skmacy 986181614Skmacy if (v == 0x10) 987181614Skmacy return phy_modtype_sr; 988181614Skmacy if (v == 0x20) 989181614Skmacy return phy_modtype_lr; 990181614Skmacy if (v == 0x40) 991181614Skmacy return phy_modtype_lrm; 992181614Skmacy 993181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6); 994181614Skmacy if (v < 0) 995181614Skmacy return v; 996181614Skmacy if (v != 4) 997181614Skmacy goto unknown; 998181614Skmacy 999181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10); 1000181614Skmacy if (v < 0) 1001181614Skmacy return v; 1002181614Skmacy 1003181614Skmacy if (v & 0x80) { 1004181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); 1005181614Skmacy if (v < 0) 1006181614Skmacy return v; 1007181614Skmacy return v > 10 ? phy_modtype_twinax_long : phy_modtype_twinax; 1008181614Skmacy } 1009181614Skmacyunknown: 1010181614Skmacy return phy_modtype_unknown; 1011181614Skmacy} 1012181614Skmacy 1013181614Skmacystatic int ael2005_intr_enable(struct cphy *phy) 1014181614Skmacy{ 1015181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); 1016181614Skmacy return err ? err : t3_phy_lasi_intr_enable(phy); 1017181614Skmacy} 1018181614Skmacy 1019181614Skmacystatic int ael2005_intr_disable(struct cphy *phy) 1020181614Skmacy{ 1021181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100); 1022181614Skmacy return err ? err : t3_phy_lasi_intr_disable(phy); 1023181614Skmacy} 1024181614Skmacy 1025181614Skmacystatic int ael2005_intr_clear(struct cphy *phy) 1026181614Skmacy{ 1027181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00); 1028181614Skmacy return err ? err : t3_phy_lasi_intr_clear(phy); 1029181614Skmacy} 1030181614Skmacy 1031180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 1032180583Skmacy{ 1033180583Skmacy static struct reg_val regs0[] = { 1034180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 1035180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 1036180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 1037180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1038180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 1039180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1040180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 1041180583Skmacy { 0, 0, 0, 0 } 1042180583Skmacy }; 1043180583Skmacy static struct reg_val regs1[] = { 1044180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 1045180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 1046180583Skmacy { 0, 0, 0, 0 } 1047180583Skmacy }; 1048180583Skmacy 1049181614Skmacy int err, lasi_ctrl; 1050180583Skmacy 1051181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1052181614Skmacy if (err) 1053181614Skmacy return err; 1054181614Skmacy 1055180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 1056180583Skmacy if (err) 1057180583Skmacy return err; 1058180583Skmacy 1059180583Skmacy msleep(125); 1060181614Skmacy phy->priv = edc_none; 1061180583Skmacy err = set_phy_regs(phy, regs0); 1062180583Skmacy if (err) 1063180583Skmacy return err; 1064180583Skmacy 1065180583Skmacy msleep(50); 1066181614Skmacy 1067181614Skmacy err = get_module_type(phy, 0); 1068181614Skmacy if (err < 0) 1069181614Skmacy return err; 1070181614Skmacy phy->modtype = (u8)err; 1071181614Skmacy 1072181614Skmacy if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1073181614Skmacy err = ael2005_setup_twinax_edc(phy, err); 1074181614Skmacy else 1075181614Skmacy err = ael2005_setup_sr_edc(phy); 1076180583Skmacy if (err) 1077180583Skmacy return err; 1078180583Skmacy 1079181614Skmacy err = set_phy_regs(phy, regs1); 1080180583Skmacy if (err) 1081180583Skmacy return err; 1082180583Skmacy 1083181614Skmacy /* reset wipes out interrupts, reenable them if they were on */ 1084181614Skmacy if (lasi_ctrl & 1) 1085181614Skmacy err = ael2005_intr_enable(phy); 1086181614Skmacy return err; 1087180583Skmacy} 1088180583Skmacy 1089181614Skmacystatic int ael2005_intr_handler(struct cphy *phy) 1090181614Skmacy{ 1091181614Skmacy unsigned int stat; 1092181614Skmacy int ret, edc_needed, cause = 0; 1093181614Skmacy 1094181614Skmacy ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat); 1095181614Skmacy if (ret) 1096181614Skmacy return ret; 1097181614Skmacy 1098181614Skmacy if (stat & AEL2005_MODDET_IRQ) { 1099181614Skmacy ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 1100181614Skmacy 0xd00); 1101181614Skmacy if (ret) 1102181614Skmacy return ret; 1103181614Skmacy 1104181614Skmacy /* modules have max 300 ms init time after hot plug */ 1105181614Skmacy ret = get_module_type(phy, 300); 1106181614Skmacy if (ret < 0) 1107181614Skmacy return ret; 1108181614Skmacy 1109181614Skmacy phy->modtype = (u8)ret; 1110181614Skmacy if (ret == phy_modtype_none) 1111181614Skmacy edc_needed = phy->priv; /* on unplug retain EDC */ 1112181614Skmacy else if (ret == phy_modtype_twinax || 1113181614Skmacy ret == phy_modtype_twinax_long) 1114181614Skmacy edc_needed = edc_twinax; 1115181614Skmacy else 1116181614Skmacy edc_needed = edc_sr; 1117181614Skmacy 1118181614Skmacy if (edc_needed != phy->priv) { 1119181614Skmacy ret = ael2005_reset(phy, 0); 1120181614Skmacy return ret ? ret : cphy_cause_module_change; 1121181614Skmacy } 1122181614Skmacy cause = cphy_cause_module_change; 1123181614Skmacy } 1124181614Skmacy 1125181614Skmacy ret = t3_phy_lasi_intr_handler(phy); 1126181614Skmacy return ret < 0 ? ret : ret + cause; 1127181614Skmacy} 1128181614Skmacy 1129167514Skmacy#ifdef C99_NOT_SUPPORTED 1130180583Skmacystatic struct cphy_ops ael2005_ops = { 1131180583Skmacy ael2005_reset, 1132181614Skmacy ael2005_intr_enable, 1133181614Skmacy ael2005_intr_disable, 1134181614Skmacy ael2005_intr_clear, 1135181614Skmacy ael2005_intr_handler, 1136180583Skmacy NULL, 1137180583Skmacy NULL, 1138180583Skmacy NULL, 1139180583Skmacy NULL, 1140180583Skmacy NULL, 1141181614Skmacy get_link_status_r, 1142180583Skmacy ael1002_power_down, 1143180583Skmacy}; 1144180583Skmacy#else 1145180583Skmacystatic struct cphy_ops ael2005_ops = { 1146180583Skmacy .reset = ael2005_reset, 1147181614Skmacy .intr_enable = ael2005_intr_enable, 1148181614Skmacy .intr_disable = ael2005_intr_disable, 1149181614Skmacy .intr_clear = ael2005_intr_clear, 1150181614Skmacy .intr_handler = ael2005_intr_handler, 1151181614Skmacy .get_link_status = get_link_status_r, 1152180583Skmacy .power_down = ael1002_power_down, 1153180583Skmacy}; 1154180583Skmacy#endif 1155180583Skmacy 1156180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1157180583Skmacy const struct mdio_ops *mdio_ops) 1158180583Skmacy{ 1159180583Skmacy cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops, 1160181614Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 1161181614Skmacy SUPPORTED_IRQ, "10GBASE-R"); 1162180583Skmacy msleep(125); 1163180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 1164180583Skmacy 1 << 5); 1165180583Skmacy} 1166180583Skmacy 1167181614Skmacy/* 1168181614Skmacy * Get link status for a 10GBASE-X device. 1169181614Skmacy */ 1170181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed, 1171181614Skmacy int *duplex, int *fc) 1172181614Skmacy{ 1173181614Skmacy if (link_ok) { 1174181614Skmacy unsigned int stat0, stat1, stat2; 1175181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 1176181614Skmacy 1177181614Skmacy if (!err) 1178181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1); 1179181614Skmacy if (!err) 1180181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 1181181614Skmacy if (err) 1182181614Skmacy return err; 1183181614Skmacy *link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1; 1184181614Skmacy } 1185181614Skmacy if (speed) 1186181614Skmacy *speed = SPEED_10000; 1187181614Skmacy if (duplex) 1188181614Skmacy *duplex = DUPLEX_FULL; 1189181614Skmacy return 0; 1190181614Skmacy} 1191181614Skmacy 1192180583Skmacy#ifdef C99_NOT_SUPPORTED 1193167514Skmacystatic struct cphy_ops qt2045_ops = { 1194167514Skmacy ael1006_reset, 1195180583Skmacy t3_phy_lasi_intr_enable, 1196180583Skmacy t3_phy_lasi_intr_disable, 1197180583Skmacy t3_phy_lasi_intr_clear, 1198180583Skmacy t3_phy_lasi_intr_handler, 1199167514Skmacy NULL, 1200167514Skmacy NULL, 1201167514Skmacy NULL, 1202167514Skmacy NULL, 1203167514Skmacy NULL, 1204181614Skmacy get_link_status_x, 1205167514Skmacy ael1006_power_down, 1206167514Skmacy}; 1207167514Skmacy#else 1208167514Skmacystatic struct cphy_ops qt2045_ops = { 1209167514Skmacy .reset = ael1006_reset, 1210180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 1211180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 1212180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 1213180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 1214181614Skmacy .get_link_status = get_link_status_x, 1215167514Skmacy .power_down = ael1006_power_down, 1216167514Skmacy}; 1217167514Skmacy#endif 1218167514Skmacy 1219176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1220176472Skmacy const struct mdio_ops *mdio_ops) 1221167514Skmacy{ 1222167514Skmacy unsigned int stat; 1223167514Skmacy 1224176472Skmacy cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops, 1225176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1226176472Skmacy "10GBASE-CX4"); 1227167514Skmacy 1228167514Skmacy /* 1229167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 1230167514Skmacy * have it at 1. 1231167514Skmacy */ 1232167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 1233167514Skmacy stat == 0xffff) 1234167514Skmacy phy->addr = 1; 1235176472Skmacy return 0; 1236167514Skmacy} 1237167514Skmacy 1238167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 1239167514Skmacy{ 1240167514Skmacy return 0; 1241167514Skmacy} 1242167514Skmacy 1243167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, 1244167514Skmacy int *speed, int *duplex, int *fc) 1245167514Skmacy{ 1246167514Skmacy if (link_ok) { 1247167514Skmacy unsigned int status; 1248167514Skmacy 1249167514Skmacy status = t3_read_reg(phy->adapter, 1250170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 1251170654Skmacy t3_read_reg(phy->adapter, 1252170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 1253170654Skmacy t3_read_reg(phy->adapter, 1254170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 1255170654Skmacy t3_read_reg(phy->adapter, 1256170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 1257167514Skmacy *link_ok = !(status & F_LOWSIG0); 1258167514Skmacy } 1259167514Skmacy if (speed) 1260167514Skmacy *speed = SPEED_10000; 1261167514Skmacy if (duplex) 1262167514Skmacy *duplex = DUPLEX_FULL; 1263167514Skmacy return 0; 1264167514Skmacy} 1265167514Skmacy 1266167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 1267167514Skmacy{ 1268167514Skmacy return 0; 1269167514Skmacy} 1270167514Skmacy 1271167514Skmacy#ifdef C99_NOT_SUPPORTED 1272167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1273167514Skmacy xaui_direct_reset, 1274167514Skmacy ael1002_intr_noop, 1275167514Skmacy ael1002_intr_noop, 1276167514Skmacy ael1002_intr_noop, 1277167514Skmacy ael1002_intr_noop, 1278167514Skmacy NULL, 1279167514Skmacy NULL, 1280167514Skmacy NULL, 1281167514Skmacy NULL, 1282167514Skmacy NULL, 1283167514Skmacy xaui_direct_get_link_status, 1284167514Skmacy xaui_direct_power_down, 1285167514Skmacy}; 1286167514Skmacy#else 1287167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1288167514Skmacy .reset = xaui_direct_reset, 1289167514Skmacy .intr_enable = ael1002_intr_noop, 1290167514Skmacy .intr_disable = ael1002_intr_noop, 1291167514Skmacy .intr_clear = ael1002_intr_noop, 1292167514Skmacy .intr_handler = ael1002_intr_noop, 1293167514Skmacy .get_link_status = xaui_direct_get_link_status, 1294167514Skmacy .power_down = xaui_direct_power_down, 1295167514Skmacy}; 1296167514Skmacy#endif 1297167514Skmacy 1298176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1299176472Skmacy const struct mdio_ops *mdio_ops) 1300167514Skmacy{ 1301176472Skmacy cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, 1302176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1303176472Skmacy "10GBASE-CX4"); 1304176472Skmacy return 0; 1305167514Skmacy} 1306