cxgb_ael1002.c revision 185620
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 185620 2008-12-04 20:32:53Z 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); 208185620Sgnn 209185620Sgnn /* Phy loopback work around for ael1006 */ 210185620Sgnn /* Soft reset phy by toggling loopback */ 211185620Sgnn msleep(125); 212185620Sgnn /* Put phy into local loopback */ 213185620Sgnn t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 0, 1); 214185620Sgnn msleep(125); 215185620Sgnn /* Take phy out of local loopback */ 216185620Sgnn t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0); 217185620Sgnn 218185157Sgnn return 0; 219167514Skmacy} 220167514Skmacy 221167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable) 222167514Skmacy{ 223167514Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 224167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 225167514Skmacy} 226167514Skmacy 227167514Skmacy#ifdef C99_NOT_SUPPORTED 228167514Skmacystatic struct cphy_ops ael1006_ops = { 229167514Skmacy ael1006_reset, 230180583Skmacy t3_phy_lasi_intr_enable, 231180583Skmacy t3_phy_lasi_intr_disable, 232180583Skmacy t3_phy_lasi_intr_clear, 233180583Skmacy t3_phy_lasi_intr_handler, 234167514Skmacy NULL, 235167514Skmacy NULL, 236167514Skmacy NULL, 237167514Skmacy NULL, 238167514Skmacy NULL, 239181614Skmacy get_link_status_r, 240167514Skmacy ael1006_power_down, 241167514Skmacy}; 242167514Skmacy#else 243167514Skmacystatic struct cphy_ops ael1006_ops = { 244167514Skmacy .reset = ael1006_reset, 245180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 246180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 247180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 248180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 249181614Skmacy .get_link_status = get_link_status_r, 250167514Skmacy .power_down = ael1006_power_down, 251167514Skmacy}; 252167514Skmacy#endif 253167514Skmacy 254176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 255176472Skmacy const struct mdio_ops *mdio_ops) 256167514Skmacy{ 257176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops, 258176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 259176472Skmacy "10GBASE-SR"); 260167514Skmacy ael100x_txon(phy); 261176472Skmacy return 0; 262167514Skmacy} 263167514Skmacy 264180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 265180583Skmacy{ 266181614Skmacy static struct reg_val regs[] = { 267181614Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 268181614Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 269181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 270181614Skmacy { 0, 0, 0, 0 } 271181614Skmacy }; 272180583Skmacy static u16 sr_edc[] = { 273180583Skmacy 0xcc00, 0x2ff4, 274180583Skmacy 0xcc01, 0x3cd4, 275180583Skmacy 0xcc02, 0x2015, 276180583Skmacy 0xcc03, 0x3105, 277180583Skmacy 0xcc04, 0x6524, 278180583Skmacy 0xcc05, 0x27ff, 279180583Skmacy 0xcc06, 0x300f, 280180583Skmacy 0xcc07, 0x2c8b, 281180583Skmacy 0xcc08, 0x300b, 282180583Skmacy 0xcc09, 0x4009, 283180583Skmacy 0xcc0a, 0x400e, 284180583Skmacy 0xcc0b, 0x2f72, 285180583Skmacy 0xcc0c, 0x3002, 286180583Skmacy 0xcc0d, 0x1002, 287180583Skmacy 0xcc0e, 0x2172, 288180583Skmacy 0xcc0f, 0x3012, 289180583Skmacy 0xcc10, 0x1002, 290180583Skmacy 0xcc11, 0x25d2, 291180583Skmacy 0xcc12, 0x3012, 292180583Skmacy 0xcc13, 0x1002, 293180583Skmacy 0xcc14, 0xd01e, 294180583Skmacy 0xcc15, 0x27d2, 295180583Skmacy 0xcc16, 0x3012, 296180583Skmacy 0xcc17, 0x1002, 297180583Skmacy 0xcc18, 0x2004, 298180583Skmacy 0xcc19, 0x3c84, 299180583Skmacy 0xcc1a, 0x6436, 300180583Skmacy 0xcc1b, 0x2007, 301180583Skmacy 0xcc1c, 0x3f87, 302180583Skmacy 0xcc1d, 0x8676, 303180583Skmacy 0xcc1e, 0x40b7, 304180583Skmacy 0xcc1f, 0xa746, 305180583Skmacy 0xcc20, 0x4047, 306180583Skmacy 0xcc21, 0x5673, 307180583Skmacy 0xcc22, 0x2982, 308180583Skmacy 0xcc23, 0x3002, 309180583Skmacy 0xcc24, 0x13d2, 310180583Skmacy 0xcc25, 0x8bbd, 311180583Skmacy 0xcc26, 0x2862, 312180583Skmacy 0xcc27, 0x3012, 313180583Skmacy 0xcc28, 0x1002, 314180583Skmacy 0xcc29, 0x2092, 315180583Skmacy 0xcc2a, 0x3012, 316180583Skmacy 0xcc2b, 0x1002, 317180583Skmacy 0xcc2c, 0x5cc3, 318180583Skmacy 0xcc2d, 0x314, 319180583Skmacy 0xcc2e, 0x2942, 320180583Skmacy 0xcc2f, 0x3002, 321180583Skmacy 0xcc30, 0x1002, 322180583Skmacy 0xcc31, 0xd019, 323180583Skmacy 0xcc32, 0x2032, 324180583Skmacy 0xcc33, 0x3012, 325180583Skmacy 0xcc34, 0x1002, 326180583Skmacy 0xcc35, 0x2a04, 327180583Skmacy 0xcc36, 0x3c74, 328180583Skmacy 0xcc37, 0x6435, 329180583Skmacy 0xcc38, 0x2fa4, 330180583Skmacy 0xcc39, 0x3cd4, 331180583Skmacy 0xcc3a, 0x6624, 332180583Skmacy 0xcc3b, 0x5563, 333180583Skmacy 0xcc3c, 0x2d42, 334180583Skmacy 0xcc3d, 0x3002, 335180583Skmacy 0xcc3e, 0x13d2, 336180583Skmacy 0xcc3f, 0x464d, 337180583Skmacy 0xcc40, 0x2862, 338180583Skmacy 0xcc41, 0x3012, 339180583Skmacy 0xcc42, 0x1002, 340180583Skmacy 0xcc43, 0x2032, 341180583Skmacy 0xcc44, 0x3012, 342180583Skmacy 0xcc45, 0x1002, 343180583Skmacy 0xcc46, 0x2fb4, 344180583Skmacy 0xcc47, 0x3cd4, 345180583Skmacy 0xcc48, 0x6624, 346180583Skmacy 0xcc49, 0x5563, 347180583Skmacy 0xcc4a, 0x2d42, 348180583Skmacy 0xcc4b, 0x3002, 349180583Skmacy 0xcc4c, 0x13d2, 350180583Skmacy 0xcc4d, 0x2ed2, 351180583Skmacy 0xcc4e, 0x3002, 352180583Skmacy 0xcc4f, 0x1002, 353180583Skmacy 0xcc50, 0x2fd2, 354180583Skmacy 0xcc51, 0x3002, 355180583Skmacy 0xcc52, 0x1002, 356180583Skmacy 0xcc53, 0x004, 357180583Skmacy 0xcc54, 0x2942, 358180583Skmacy 0xcc55, 0x3002, 359180583Skmacy 0xcc56, 0x1002, 360180583Skmacy 0xcc57, 0x2092, 361180583Skmacy 0xcc58, 0x3012, 362180583Skmacy 0xcc59, 0x1002, 363180583Skmacy 0xcc5a, 0x5cc3, 364180583Skmacy 0xcc5b, 0x317, 365180583Skmacy 0xcc5c, 0x2f72, 366180583Skmacy 0xcc5d, 0x3002, 367180583Skmacy 0xcc5e, 0x1002, 368180583Skmacy 0xcc5f, 0x2942, 369180583Skmacy 0xcc60, 0x3002, 370180583Skmacy 0xcc61, 0x1002, 371180583Skmacy 0xcc62, 0x22cd, 372180583Skmacy 0xcc63, 0x301d, 373180583Skmacy 0xcc64, 0x2862, 374180583Skmacy 0xcc65, 0x3012, 375180583Skmacy 0xcc66, 0x1002, 376180583Skmacy 0xcc67, 0x2ed2, 377180583Skmacy 0xcc68, 0x3002, 378180583Skmacy 0xcc69, 0x1002, 379180583Skmacy 0xcc6a, 0x2d72, 380180583Skmacy 0xcc6b, 0x3002, 381180583Skmacy 0xcc6c, 0x1002, 382180583Skmacy 0xcc6d, 0x628f, 383180583Skmacy 0xcc6e, 0x2112, 384180583Skmacy 0xcc6f, 0x3012, 385180583Skmacy 0xcc70, 0x1002, 386180583Skmacy 0xcc71, 0x5aa3, 387180583Skmacy 0xcc72, 0x2dc2, 388180583Skmacy 0xcc73, 0x3002, 389180583Skmacy 0xcc74, 0x1312, 390180583Skmacy 0xcc75, 0x6f72, 391180583Skmacy 0xcc76, 0x1002, 392180583Skmacy 0xcc77, 0x2807, 393180583Skmacy 0xcc78, 0x31a7, 394180583Skmacy 0xcc79, 0x20c4, 395180583Skmacy 0xcc7a, 0x3c24, 396180583Skmacy 0xcc7b, 0x6724, 397180583Skmacy 0xcc7c, 0x1002, 398180583Skmacy 0xcc7d, 0x2807, 399180583Skmacy 0xcc7e, 0x3187, 400180583Skmacy 0xcc7f, 0x20c4, 401180583Skmacy 0xcc80, 0x3c24, 402180583Skmacy 0xcc81, 0x6724, 403180583Skmacy 0xcc82, 0x1002, 404180583Skmacy 0xcc83, 0x2514, 405180583Skmacy 0xcc84, 0x3c64, 406180583Skmacy 0xcc85, 0x6436, 407180583Skmacy 0xcc86, 0xdff4, 408180583Skmacy 0xcc87, 0x6436, 409180583Skmacy 0xcc88, 0x1002, 410180583Skmacy 0xcc89, 0x40a4, 411180583Skmacy 0xcc8a, 0x643c, 412180583Skmacy 0xcc8b, 0x4016, 413180583Skmacy 0xcc8c, 0x8c6c, 414180583Skmacy 0xcc8d, 0x2b24, 415180583Skmacy 0xcc8e, 0x3c24, 416180583Skmacy 0xcc8f, 0x6435, 417180583Skmacy 0xcc90, 0x1002, 418180583Skmacy 0xcc91, 0x2b24, 419180583Skmacy 0xcc92, 0x3c24, 420180583Skmacy 0xcc93, 0x643a, 421180583Skmacy 0xcc94, 0x4025, 422180583Skmacy 0xcc95, 0x8a5a, 423180583Skmacy 0xcc96, 0x1002, 424180583Skmacy 0xcc97, 0x2731, 425180583Skmacy 0xcc98, 0x3011, 426180583Skmacy 0xcc99, 0x1001, 427180583Skmacy 0xcc9a, 0xc7a0, 428180583Skmacy 0xcc9b, 0x100, 429180583Skmacy 0xcc9c, 0xc502, 430180583Skmacy 0xcc9d, 0x53ac, 431180583Skmacy 0xcc9e, 0xc503, 432180583Skmacy 0xcc9f, 0xd5d5, 433180583Skmacy 0xcca0, 0xc600, 434180583Skmacy 0xcca1, 0x2a6d, 435180583Skmacy 0xcca2, 0xc601, 436180583Skmacy 0xcca3, 0x2a4c, 437180583Skmacy 0xcca4, 0xc602, 438180583Skmacy 0xcca5, 0x111, 439180583Skmacy 0xcca6, 0xc60c, 440180583Skmacy 0xcca7, 0x5900, 441180583Skmacy 0xcca8, 0xc710, 442180583Skmacy 0xcca9, 0x700, 443180583Skmacy 0xccaa, 0xc718, 444180583Skmacy 0xccab, 0x700, 445180583Skmacy 0xccac, 0xc720, 446180583Skmacy 0xccad, 0x4700, 447180583Skmacy 0xccae, 0xc801, 448180583Skmacy 0xccaf, 0x7f50, 449180583Skmacy 0xccb0, 0xc802, 450180583Skmacy 0xccb1, 0x7760, 451180583Skmacy 0xccb2, 0xc803, 452180583Skmacy 0xccb3, 0x7fce, 453180583Skmacy 0xccb4, 0xc804, 454180583Skmacy 0xccb5, 0x5700, 455180583Skmacy 0xccb6, 0xc805, 456180583Skmacy 0xccb7, 0x5f11, 457180583Skmacy 0xccb8, 0xc806, 458180583Skmacy 0xccb9, 0x4751, 459180583Skmacy 0xccba, 0xc807, 460180583Skmacy 0xccbb, 0x57e1, 461180583Skmacy 0xccbc, 0xc808, 462180583Skmacy 0xccbd, 0x2700, 463180583Skmacy 0xccbe, 0xc809, 464180583Skmacy 0xccbf, 0x000, 465180583Skmacy 0xccc0, 0xc821, 466180583Skmacy 0xccc1, 0x002, 467180583Skmacy 0xccc2, 0xc822, 468180583Skmacy 0xccc3, 0x014, 469180583Skmacy 0xccc4, 0xc832, 470180583Skmacy 0xccc5, 0x1186, 471180583Skmacy 0xccc6, 0xc847, 472180583Skmacy 0xccc7, 0x1e02, 473180583Skmacy 0xccc8, 0xc013, 474180583Skmacy 0xccc9, 0xf341, 475180583Skmacy 0xccca, 0xc01a, 476180583Skmacy 0xcccb, 0x446, 477180583Skmacy 0xcccc, 0xc024, 478180583Skmacy 0xcccd, 0x1000, 479180583Skmacy 0xccce, 0xc025, 480180583Skmacy 0xcccf, 0xa00, 481180583Skmacy 0xccd0, 0xc026, 482180583Skmacy 0xccd1, 0xc0c, 483180583Skmacy 0xccd2, 0xc027, 484180583Skmacy 0xccd3, 0xc0c, 485180583Skmacy 0xccd4, 0xc029, 486180583Skmacy 0xccd5, 0x0a0, 487180583Skmacy 0xccd6, 0xc030, 488180583Skmacy 0xccd7, 0xa00, 489180583Skmacy 0xccd8, 0xc03c, 490180583Skmacy 0xccd9, 0x01c, 491180583Skmacy 0xccda, 0xc005, 492180583Skmacy 0xccdb, 0x7a06, 493180583Skmacy 0xccdc, 0x000, 494180583Skmacy 0xccdd, 0x2731, 495180583Skmacy 0xccde, 0x3011, 496180583Skmacy 0xccdf, 0x1001, 497180583Skmacy 0xcce0, 0xc620, 498180583Skmacy 0xcce1, 0x000, 499180583Skmacy 0xcce2, 0xc621, 500180583Skmacy 0xcce3, 0x03f, 501180583Skmacy 0xcce4, 0xc622, 502180583Skmacy 0xcce5, 0x000, 503180583Skmacy 0xcce6, 0xc623, 504180583Skmacy 0xcce7, 0x000, 505180583Skmacy 0xcce8, 0xc624, 506180583Skmacy 0xcce9, 0x000, 507180583Skmacy 0xccea, 0xc625, 508180583Skmacy 0xcceb, 0x000, 509180583Skmacy 0xccec, 0xc627, 510180583Skmacy 0xcced, 0x000, 511180583Skmacy 0xccee, 0xc628, 512180583Skmacy 0xccef, 0x000, 513180583Skmacy 0xccf0, 0xc62c, 514180583Skmacy 0xccf1, 0x000, 515180583Skmacy 0xccf2, 0x000, 516180583Skmacy 0xccf3, 0x2806, 517180583Skmacy 0xccf4, 0x3cb6, 518180583Skmacy 0xccf5, 0xc161, 519180583Skmacy 0xccf6, 0x6134, 520180583Skmacy 0xccf7, 0x6135, 521180583Skmacy 0xccf8, 0x5443, 522180583Skmacy 0xccf9, 0x303, 523180583Skmacy 0xccfa, 0x6524, 524180583Skmacy 0xccfb, 0x00b, 525180583Skmacy 0xccfc, 0x1002, 526180583Skmacy 0xccfd, 0x2104, 527180583Skmacy 0xccfe, 0x3c24, 528180583Skmacy 0xccff, 0x2105, 529180583Skmacy 0xcd00, 0x3805, 530180583Skmacy 0xcd01, 0x6524, 531180583Skmacy 0xcd02, 0xdff4, 532180583Skmacy 0xcd03, 0x4005, 533180583Skmacy 0xcd04, 0x6524, 534180583Skmacy 0xcd05, 0x1002, 535180583Skmacy 0xcd06, 0x5dd3, 536180583Skmacy 0xcd07, 0x306, 537180583Skmacy 0xcd08, 0x2ff7, 538180583Skmacy 0xcd09, 0x38f7, 539180583Skmacy 0xcd0a, 0x60b7, 540180583Skmacy 0xcd0b, 0xdffd, 541180583Skmacy 0xcd0c, 0x00a, 542180583Skmacy 0xcd0d, 0x1002, 543180583Skmacy 0xcd0e, 0 544180583Skmacy }; 545180583Skmacy int i, err; 546180583Skmacy 547181614Skmacy err = set_phy_regs(phy, regs); 548181614Skmacy if (err) 549181614Skmacy return err; 550181614Skmacy 551181614Skmacy msleep(50); 552181614Skmacy 553181614Skmacy for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 554180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 555180583Skmacy sr_edc[i + 1]); 556181614Skmacy if (!err) 557181614Skmacy phy->priv = edc_sr; 558180583Skmacy return err; 559180583Skmacy} 560180583Skmacy 561181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) 562181614Skmacy{ 563181614Skmacy static struct reg_val regs[] = { 564181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 }, 565181614Skmacy { 0, 0, 0, 0 } 566181614Skmacy }; 567181614Skmacy static struct reg_val preemphasis[] = { 568181614Skmacy { MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 }, 569181614Skmacy { MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 }, 570181614Skmacy { 0, 0, 0, 0 } 571181614Skmacy }; 572181614Skmacy static u16 twinax_edc[] = { 573181614Skmacy 0xcc00, 0x4009, 574181614Skmacy 0xcc01, 0x27ff, 575181614Skmacy 0xcc02, 0x300f, 576181614Skmacy 0xcc03, 0x40aa, 577181614Skmacy 0xcc04, 0x401c, 578181614Skmacy 0xcc05, 0x401e, 579181614Skmacy 0xcc06, 0x2ff4, 580181614Skmacy 0xcc07, 0x3cd4, 581181614Skmacy 0xcc08, 0x2035, 582181614Skmacy 0xcc09, 0x3145, 583181614Skmacy 0xcc0a, 0x6524, 584181614Skmacy 0xcc0b, 0x26a2, 585181614Skmacy 0xcc0c, 0x3012, 586181614Skmacy 0xcc0d, 0x1002, 587181614Skmacy 0xcc0e, 0x29c2, 588181614Skmacy 0xcc0f, 0x3002, 589181614Skmacy 0xcc10, 0x1002, 590181614Skmacy 0xcc11, 0x2072, 591181614Skmacy 0xcc12, 0x3012, 592181614Skmacy 0xcc13, 0x1002, 593181614Skmacy 0xcc14, 0x22cd, 594181614Skmacy 0xcc15, 0x301d, 595181614Skmacy 0xcc16, 0x2e52, 596181614Skmacy 0xcc17, 0x3012, 597181614Skmacy 0xcc18, 0x1002, 598181614Skmacy 0xcc19, 0x28e2, 599181614Skmacy 0xcc1a, 0x3002, 600181614Skmacy 0xcc1b, 0x1002, 601181614Skmacy 0xcc1c, 0x628f, 602181614Skmacy 0xcc1d, 0x2ac2, 603181614Skmacy 0xcc1e, 0x3012, 604181614Skmacy 0xcc1f, 0x1002, 605181614Skmacy 0xcc20, 0x5553, 606181614Skmacy 0xcc21, 0x2ae2, 607181614Skmacy 0xcc22, 0x3002, 608181614Skmacy 0xcc23, 0x1302, 609181614Skmacy 0xcc24, 0x401e, 610181614Skmacy 0xcc25, 0x2be2, 611181614Skmacy 0xcc26, 0x3012, 612181614Skmacy 0xcc27, 0x1002, 613181614Skmacy 0xcc28, 0x2da2, 614181614Skmacy 0xcc29, 0x3012, 615181614Skmacy 0xcc2a, 0x1002, 616181614Skmacy 0xcc2b, 0x2ba2, 617181614Skmacy 0xcc2c, 0x3002, 618181614Skmacy 0xcc2d, 0x1002, 619181614Skmacy 0xcc2e, 0x5ee3, 620181614Skmacy 0xcc2f, 0x305, 621181614Skmacy 0xcc30, 0x400e, 622181614Skmacy 0xcc31, 0x2bc2, 623181614Skmacy 0xcc32, 0x3002, 624181614Skmacy 0xcc33, 0x1002, 625181614Skmacy 0xcc34, 0x2b82, 626181614Skmacy 0xcc35, 0x3012, 627181614Skmacy 0xcc36, 0x1002, 628181614Skmacy 0xcc37, 0x5663, 629181614Skmacy 0xcc38, 0x302, 630181614Skmacy 0xcc39, 0x401e, 631181614Skmacy 0xcc3a, 0x6f72, 632181614Skmacy 0xcc3b, 0x1002, 633181614Skmacy 0xcc3c, 0x628f, 634181614Skmacy 0xcc3d, 0x2be2, 635181614Skmacy 0xcc3e, 0x3012, 636181614Skmacy 0xcc3f, 0x1002, 637181614Skmacy 0xcc40, 0x22cd, 638181614Skmacy 0xcc41, 0x301d, 639181614Skmacy 0xcc42, 0x2e52, 640181614Skmacy 0xcc43, 0x3012, 641181614Skmacy 0xcc44, 0x1002, 642181614Skmacy 0xcc45, 0x2522, 643181614Skmacy 0xcc46, 0x3012, 644181614Skmacy 0xcc47, 0x1002, 645181614Skmacy 0xcc48, 0x2da2, 646181614Skmacy 0xcc49, 0x3012, 647181614Skmacy 0xcc4a, 0x1002, 648181614Skmacy 0xcc4b, 0x2ca2, 649181614Skmacy 0xcc4c, 0x3012, 650181614Skmacy 0xcc4d, 0x1002, 651181614Skmacy 0xcc4e, 0x2fa4, 652181614Skmacy 0xcc4f, 0x3cd4, 653181614Skmacy 0xcc50, 0x6624, 654181614Skmacy 0xcc51, 0x410b, 655181614Skmacy 0xcc52, 0x56b3, 656181614Skmacy 0xcc53, 0x3c4, 657181614Skmacy 0xcc54, 0x2fb2, 658181614Skmacy 0xcc55, 0x3002, 659181614Skmacy 0xcc56, 0x1002, 660181614Skmacy 0xcc57, 0x220b, 661181614Skmacy 0xcc58, 0x303b, 662181614Skmacy 0xcc59, 0x56b3, 663181614Skmacy 0xcc5a, 0x3c3, 664181614Skmacy 0xcc5b, 0x866b, 665181614Skmacy 0xcc5c, 0x400c, 666181614Skmacy 0xcc5d, 0x23a2, 667181614Skmacy 0xcc5e, 0x3012, 668181614Skmacy 0xcc5f, 0x1002, 669181614Skmacy 0xcc60, 0x2da2, 670181614Skmacy 0xcc61, 0x3012, 671181614Skmacy 0xcc62, 0x1002, 672181614Skmacy 0xcc63, 0x2ca2, 673181614Skmacy 0xcc64, 0x3012, 674181614Skmacy 0xcc65, 0x1002, 675181614Skmacy 0xcc66, 0x2fb4, 676181614Skmacy 0xcc67, 0x3cd4, 677181614Skmacy 0xcc68, 0x6624, 678181614Skmacy 0xcc69, 0x56b3, 679181614Skmacy 0xcc6a, 0x3c3, 680181614Skmacy 0xcc6b, 0x866b, 681181614Skmacy 0xcc6c, 0x401c, 682181614Skmacy 0xcc6d, 0x2205, 683181614Skmacy 0xcc6e, 0x3035, 684181614Skmacy 0xcc6f, 0x5b53, 685181614Skmacy 0xcc70, 0x2c52, 686181614Skmacy 0xcc71, 0x3002, 687181614Skmacy 0xcc72, 0x13c2, 688181614Skmacy 0xcc73, 0x5cc3, 689181614Skmacy 0xcc74, 0x317, 690181614Skmacy 0xcc75, 0x2522, 691181614Skmacy 0xcc76, 0x3012, 692181614Skmacy 0xcc77, 0x1002, 693181614Skmacy 0xcc78, 0x2da2, 694181614Skmacy 0xcc79, 0x3012, 695181614Skmacy 0xcc7a, 0x1002, 696181614Skmacy 0xcc7b, 0x2b82, 697181614Skmacy 0xcc7c, 0x3012, 698181614Skmacy 0xcc7d, 0x1002, 699181614Skmacy 0xcc7e, 0x5663, 700181614Skmacy 0xcc7f, 0x303, 701181614Skmacy 0xcc80, 0x401e, 702181614Skmacy 0xcc81, 0x004, 703181614Skmacy 0xcc82, 0x2c42, 704181614Skmacy 0xcc83, 0x3012, 705181614Skmacy 0xcc84, 0x1002, 706181614Skmacy 0xcc85, 0x6f72, 707181614Skmacy 0xcc86, 0x1002, 708181614Skmacy 0xcc87, 0x628f, 709181614Skmacy 0xcc88, 0x2304, 710181614Skmacy 0xcc89, 0x3c84, 711181614Skmacy 0xcc8a, 0x6436, 712181614Skmacy 0xcc8b, 0xdff4, 713181614Skmacy 0xcc8c, 0x6436, 714181614Skmacy 0xcc8d, 0x2ff5, 715181614Skmacy 0xcc8e, 0x3005, 716181614Skmacy 0xcc8f, 0x8656, 717181614Skmacy 0xcc90, 0xdfba, 718181614Skmacy 0xcc91, 0x56a3, 719181614Skmacy 0xcc92, 0xd05a, 720181614Skmacy 0xcc93, 0x21c2, 721181614Skmacy 0xcc94, 0x3012, 722181614Skmacy 0xcc95, 0x1392, 723181614Skmacy 0xcc96, 0xd05a, 724181614Skmacy 0xcc97, 0x56a3, 725181614Skmacy 0xcc98, 0xdfba, 726181614Skmacy 0xcc99, 0x383, 727181614Skmacy 0xcc9a, 0x6f72, 728181614Skmacy 0xcc9b, 0x1002, 729181614Skmacy 0xcc9c, 0x28c5, 730181614Skmacy 0xcc9d, 0x3005, 731181614Skmacy 0xcc9e, 0x4178, 732181614Skmacy 0xcc9f, 0x5653, 733181614Skmacy 0xcca0, 0x384, 734181614Skmacy 0xcca1, 0x22b2, 735181614Skmacy 0xcca2, 0x3012, 736181614Skmacy 0xcca3, 0x1002, 737181614Skmacy 0xcca4, 0x2be5, 738181614Skmacy 0xcca5, 0x3005, 739181614Skmacy 0xcca6, 0x41e8, 740181614Skmacy 0xcca7, 0x5653, 741181614Skmacy 0xcca8, 0x382, 742181614Skmacy 0xcca9, 0x002, 743181614Skmacy 0xccaa, 0x4258, 744181614Skmacy 0xccab, 0x2474, 745181614Skmacy 0xccac, 0x3c84, 746181614Skmacy 0xccad, 0x6437, 747181614Skmacy 0xccae, 0xdff4, 748181614Skmacy 0xccaf, 0x6437, 749181614Skmacy 0xccb0, 0x2ff5, 750181614Skmacy 0xccb1, 0x3c05, 751181614Skmacy 0xccb2, 0x8757, 752181614Skmacy 0xccb3, 0xb888, 753181614Skmacy 0xccb4, 0x9787, 754181614Skmacy 0xccb5, 0xdff4, 755181614Skmacy 0xccb6, 0x6724, 756181614Skmacy 0xccb7, 0x866a, 757181614Skmacy 0xccb8, 0x6f72, 758181614Skmacy 0xccb9, 0x1002, 759181614Skmacy 0xccba, 0x2d01, 760181614Skmacy 0xccbb, 0x3011, 761181614Skmacy 0xccbc, 0x1001, 762181614Skmacy 0xccbd, 0xc620, 763181614Skmacy 0xccbe, 0x14e5, 764181614Skmacy 0xccbf, 0xc621, 765181614Skmacy 0xccc0, 0xc53d, 766181614Skmacy 0xccc1, 0xc622, 767181614Skmacy 0xccc2, 0x3cbe, 768181614Skmacy 0xccc3, 0xc623, 769181614Skmacy 0xccc4, 0x4452, 770181614Skmacy 0xccc5, 0xc624, 771181614Skmacy 0xccc6, 0xc5c5, 772181614Skmacy 0xccc7, 0xc625, 773181614Skmacy 0xccc8, 0xe01e, 774181614Skmacy 0xccc9, 0xc627, 775181614Skmacy 0xccca, 0x000, 776181614Skmacy 0xcccb, 0xc628, 777181614Skmacy 0xcccc, 0x000, 778181614Skmacy 0xcccd, 0xc62b, 779181614Skmacy 0xccce, 0x000, 780181614Skmacy 0xcccf, 0xc62c, 781181614Skmacy 0xccd0, 0x000, 782181614Skmacy 0xccd1, 0x000, 783181614Skmacy 0xccd2, 0x2d01, 784181614Skmacy 0xccd3, 0x3011, 785181614Skmacy 0xccd4, 0x1001, 786181614Skmacy 0xccd5, 0xc620, 787181614Skmacy 0xccd6, 0x000, 788181614Skmacy 0xccd7, 0xc621, 789181614Skmacy 0xccd8, 0x000, 790181614Skmacy 0xccd9, 0xc622, 791181614Skmacy 0xccda, 0x0ce, 792181614Skmacy 0xccdb, 0xc623, 793181614Skmacy 0xccdc, 0x07f, 794181614Skmacy 0xccdd, 0xc624, 795181614Skmacy 0xccde, 0x032, 796181614Skmacy 0xccdf, 0xc625, 797181614Skmacy 0xcce0, 0x000, 798181614Skmacy 0xcce1, 0xc627, 799181614Skmacy 0xcce2, 0x000, 800181614Skmacy 0xcce3, 0xc628, 801181614Skmacy 0xcce4, 0x000, 802181614Skmacy 0xcce5, 0xc62b, 803181614Skmacy 0xcce6, 0x000, 804181614Skmacy 0xcce7, 0xc62c, 805181614Skmacy 0xcce8, 0x000, 806181614Skmacy 0xcce9, 0x000, 807181614Skmacy 0xccea, 0x2d01, 808181614Skmacy 0xcceb, 0x3011, 809181614Skmacy 0xccec, 0x1001, 810181614Skmacy 0xcced, 0xc502, 811181614Skmacy 0xccee, 0x609f, 812181614Skmacy 0xccef, 0xc600, 813181614Skmacy 0xccf0, 0x2a6e, 814181614Skmacy 0xccf1, 0xc601, 815181614Skmacy 0xccf2, 0x2a2c, 816181614Skmacy 0xccf3, 0xc60c, 817181614Skmacy 0xccf4, 0x5400, 818181614Skmacy 0xccf5, 0xc710, 819181614Skmacy 0xccf6, 0x700, 820181614Skmacy 0xccf7, 0xc718, 821181614Skmacy 0xccf8, 0x700, 822181614Skmacy 0xccf9, 0xc720, 823181614Skmacy 0xccfa, 0x4700, 824181614Skmacy 0xccfb, 0xc728, 825181614Skmacy 0xccfc, 0x700, 826181614Skmacy 0xccfd, 0xc729, 827181614Skmacy 0xccfe, 0x1207, 828181614Skmacy 0xccff, 0xc801, 829181614Skmacy 0xcd00, 0x7f50, 830181614Skmacy 0xcd01, 0xc802, 831181614Skmacy 0xcd02, 0x7760, 832181614Skmacy 0xcd03, 0xc803, 833181614Skmacy 0xcd04, 0x7fce, 834181614Skmacy 0xcd05, 0xc804, 835181614Skmacy 0xcd06, 0x520e, 836181614Skmacy 0xcd07, 0xc805, 837181614Skmacy 0xcd08, 0x5c11, 838181614Skmacy 0xcd09, 0xc806, 839181614Skmacy 0xcd0a, 0x3c51, 840181614Skmacy 0xcd0b, 0xc807, 841181614Skmacy 0xcd0c, 0x4061, 842181614Skmacy 0xcd0d, 0xc808, 843181614Skmacy 0xcd0e, 0x49c1, 844181614Skmacy 0xcd0f, 0xc809, 845181614Skmacy 0xcd10, 0x3840, 846181614Skmacy 0xcd11, 0xc80a, 847181614Skmacy 0xcd12, 0x000, 848181614Skmacy 0xcd13, 0xc821, 849181614Skmacy 0xcd14, 0x002, 850181614Skmacy 0xcd15, 0xc822, 851181614Skmacy 0xcd16, 0x046, 852181614Skmacy 0xcd17, 0xc844, 853181614Skmacy 0xcd18, 0x182f, 854181614Skmacy 0xcd19, 0xc013, 855181614Skmacy 0xcd1a, 0xf341, 856181614Skmacy 0xcd1b, 0xc01a, 857181614Skmacy 0xcd1c, 0x446, 858181614Skmacy 0xcd1d, 0xc024, 859181614Skmacy 0xcd1e, 0x1000, 860181614Skmacy 0xcd1f, 0xc025, 861181614Skmacy 0xcd20, 0xa00, 862181614Skmacy 0xcd21, 0xc026, 863181614Skmacy 0xcd22, 0xc0c, 864181614Skmacy 0xcd23, 0xc027, 865181614Skmacy 0xcd24, 0xc0c, 866181614Skmacy 0xcd25, 0xc029, 867181614Skmacy 0xcd26, 0x0a0, 868181614Skmacy 0xcd27, 0xc030, 869181614Skmacy 0xcd28, 0xa00, 870181614Skmacy 0xcd29, 0xc03c, 871181614Skmacy 0xcd2a, 0x01c, 872181614Skmacy 0xcd2b, 0x000, 873181614Skmacy 0xcd2c, 0x2b84, 874181614Skmacy 0xcd2d, 0x3c74, 875181614Skmacy 0xcd2e, 0x6435, 876181614Skmacy 0xcd2f, 0xdff4, 877181614Skmacy 0xcd30, 0x6435, 878181614Skmacy 0xcd31, 0x2806, 879181614Skmacy 0xcd32, 0x3006, 880181614Skmacy 0xcd33, 0x8565, 881181614Skmacy 0xcd34, 0x2b24, 882181614Skmacy 0xcd35, 0x3c24, 883181614Skmacy 0xcd36, 0x6436, 884181614Skmacy 0xcd37, 0x1002, 885181614Skmacy 0xcd38, 0x2b24, 886181614Skmacy 0xcd39, 0x3c24, 887181614Skmacy 0xcd3a, 0x6436, 888181614Skmacy 0xcd3b, 0x4045, 889181614Skmacy 0xcd3c, 0x8656, 890181614Skmacy 0xcd3d, 0x1002, 891181614Skmacy 0xcd3e, 0x2807, 892181614Skmacy 0xcd3f, 0x31a7, 893181614Skmacy 0xcd40, 0x20c4, 894181614Skmacy 0xcd41, 0x3c24, 895181614Skmacy 0xcd42, 0x6724, 896181614Skmacy 0xcd43, 0x1002, 897181614Skmacy 0xcd44, 0x2807, 898181614Skmacy 0xcd45, 0x3187, 899181614Skmacy 0xcd46, 0x20c4, 900181614Skmacy 0xcd47, 0x3c24, 901181614Skmacy 0xcd48, 0x6724, 902181614Skmacy 0xcd49, 0x1002, 903181614Skmacy 0xcd4a, 0x2514, 904181614Skmacy 0xcd4b, 0x3c64, 905181614Skmacy 0xcd4c, 0x6436, 906181614Skmacy 0xcd4d, 0xdff4, 907181614Skmacy 0xcd4e, 0x6436, 908181614Skmacy 0xcd4f, 0x1002, 909181614Skmacy 0xcd50, 0x2806, 910181614Skmacy 0xcd51, 0x3cb6, 911181614Skmacy 0xcd52, 0xc161, 912181614Skmacy 0xcd53, 0x6134, 913181614Skmacy 0xcd54, 0x6135, 914181614Skmacy 0xcd55, 0x5443, 915181614Skmacy 0xcd56, 0x303, 916181614Skmacy 0xcd57, 0x6524, 917181614Skmacy 0xcd58, 0x00b, 918181614Skmacy 0xcd59, 0x1002, 919181614Skmacy 0xcd5a, 0xd019, 920181614Skmacy 0xcd5b, 0x2104, 921181614Skmacy 0xcd5c, 0x3c24, 922181614Skmacy 0xcd5d, 0x2105, 923181614Skmacy 0xcd5e, 0x3805, 924181614Skmacy 0xcd5f, 0x6524, 925181614Skmacy 0xcd60, 0xdff4, 926181614Skmacy 0xcd61, 0x4005, 927181614Skmacy 0xcd62, 0x6524, 928181614Skmacy 0xcd63, 0x2e8d, 929181614Skmacy 0xcd64, 0x303d, 930181614Skmacy 0xcd65, 0x5dd3, 931181614Skmacy 0xcd66, 0x306, 932181614Skmacy 0xcd67, 0x2ff7, 933181614Skmacy 0xcd68, 0x38f7, 934181614Skmacy 0xcd69, 0x60b7, 935181614Skmacy 0xcd6a, 0xdffd, 936181614Skmacy 0xcd6b, 0x00a, 937181614Skmacy 0xcd6c, 0x1002, 938181614Skmacy 0xcd6d, 0 939181614Skmacy }; 940181614Skmacy int i, err; 941181614Skmacy 942181614Skmacy err = set_phy_regs(phy, regs); 943181614Skmacy if (!err && modtype == phy_modtype_twinax_long) 944181614Skmacy err = set_phy_regs(phy, preemphasis); 945181614Skmacy if (err) 946181614Skmacy return err; 947181614Skmacy 948181614Skmacy msleep(50); 949181614Skmacy 950181614Skmacy for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 951181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 952181614Skmacy twinax_edc[i + 1]); 953181614Skmacy if (!err) 954181614Skmacy phy->priv = edc_twinax; 955181614Skmacy return err; 956181614Skmacy} 957181614Skmacy 958181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) 959181614Skmacy{ 960181614Skmacy int i, err; 961181614Skmacy unsigned int stat, data; 962181614Skmacy 963181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL, 964181614Skmacy (dev_addr << 8) | (1 << 8) | word_addr); 965181614Skmacy if (err) 966181614Skmacy return err; 967181614Skmacy 968181614Skmacy for (i = 0; i < 5; i++) { 969181614Skmacy msleep(1); 970181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat); 971181614Skmacy if (err) 972181614Skmacy return err; 973181614Skmacy if ((stat & 3) == 1) { 974181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, 975181614Skmacy &data); 976181614Skmacy if (err) 977181614Skmacy return err; 978181614Skmacy return data >> 8; 979181614Skmacy } 980181614Skmacy } 981181614Skmacy CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n", 982181614Skmacy phy->addr, word_addr); 983181614Skmacy return -ETIMEDOUT; 984181614Skmacy} 985181614Skmacy 986181614Skmacystatic int get_module_type(struct cphy *phy, int delay_ms) 987181614Skmacy{ 988181614Skmacy int v; 989181614Skmacy unsigned int stat; 990181614Skmacy 991181614Skmacy v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); 992181614Skmacy if (v) 993181614Skmacy return v; 994181614Skmacy 995181614Skmacy if (stat & (1 << 8)) /* module absent */ 996181614Skmacy return phy_modtype_none; 997181614Skmacy 998181614Skmacy if (delay_ms) 999181614Skmacy msleep(delay_ms); 1000181614Skmacy 1001181614Skmacy /* see SFF-8472 for below */ 1002181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3); 1003181614Skmacy if (v < 0) 1004181614Skmacy return v; 1005181614Skmacy 1006181614Skmacy if (v == 0x10) 1007181614Skmacy return phy_modtype_sr; 1008181614Skmacy if (v == 0x20) 1009181614Skmacy return phy_modtype_lr; 1010181614Skmacy if (v == 0x40) 1011181614Skmacy return phy_modtype_lrm; 1012181614Skmacy 1013181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6); 1014181614Skmacy if (v < 0) 1015181614Skmacy return v; 1016181614Skmacy if (v != 4) 1017181614Skmacy goto unknown; 1018181614Skmacy 1019181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10); 1020181614Skmacy if (v < 0) 1021181614Skmacy return v; 1022181614Skmacy 1023181614Skmacy if (v & 0x80) { 1024181614Skmacy v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); 1025181614Skmacy if (v < 0) 1026181614Skmacy return v; 1027181614Skmacy return v > 10 ? phy_modtype_twinax_long : phy_modtype_twinax; 1028181614Skmacy } 1029181614Skmacyunknown: 1030181614Skmacy return phy_modtype_unknown; 1031181614Skmacy} 1032181614Skmacy 1033181614Skmacystatic int ael2005_intr_enable(struct cphy *phy) 1034181614Skmacy{ 1035181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); 1036181614Skmacy return err ? err : t3_phy_lasi_intr_enable(phy); 1037181614Skmacy} 1038181614Skmacy 1039181614Skmacystatic int ael2005_intr_disable(struct cphy *phy) 1040181614Skmacy{ 1041181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100); 1042181614Skmacy return err ? err : t3_phy_lasi_intr_disable(phy); 1043181614Skmacy} 1044181614Skmacy 1045181614Skmacystatic int ael2005_intr_clear(struct cphy *phy) 1046181614Skmacy{ 1047181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00); 1048181614Skmacy return err ? err : t3_phy_lasi_intr_clear(phy); 1049181614Skmacy} 1050181614Skmacy 1051180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 1052180583Skmacy{ 1053180583Skmacy static struct reg_val regs0[] = { 1054180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 1055180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 1056180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 1057180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1058180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 1059180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1060180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 1061180583Skmacy { 0, 0, 0, 0 } 1062180583Skmacy }; 1063180583Skmacy static struct reg_val regs1[] = { 1064180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 1065180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 1066180583Skmacy { 0, 0, 0, 0 } 1067180583Skmacy }; 1068180583Skmacy 1069181614Skmacy int err, lasi_ctrl; 1070180583Skmacy 1071181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1072181614Skmacy if (err) 1073181614Skmacy return err; 1074181614Skmacy 1075180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 1076180583Skmacy if (err) 1077180583Skmacy return err; 1078180583Skmacy 1079180583Skmacy msleep(125); 1080181614Skmacy phy->priv = edc_none; 1081180583Skmacy err = set_phy_regs(phy, regs0); 1082180583Skmacy if (err) 1083180583Skmacy return err; 1084180583Skmacy 1085180583Skmacy msleep(50); 1086181614Skmacy 1087181614Skmacy err = get_module_type(phy, 0); 1088181614Skmacy if (err < 0) 1089181614Skmacy return err; 1090181614Skmacy phy->modtype = (u8)err; 1091181614Skmacy 1092181614Skmacy if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1093181614Skmacy err = ael2005_setup_twinax_edc(phy, err); 1094181614Skmacy else 1095181614Skmacy err = ael2005_setup_sr_edc(phy); 1096180583Skmacy if (err) 1097180583Skmacy return err; 1098180583Skmacy 1099181614Skmacy err = set_phy_regs(phy, regs1); 1100180583Skmacy if (err) 1101180583Skmacy return err; 1102180583Skmacy 1103181614Skmacy /* reset wipes out interrupts, reenable them if they were on */ 1104181614Skmacy if (lasi_ctrl & 1) 1105181614Skmacy err = ael2005_intr_enable(phy); 1106181614Skmacy return err; 1107180583Skmacy} 1108180583Skmacy 1109181614Skmacystatic int ael2005_intr_handler(struct cphy *phy) 1110181614Skmacy{ 1111181614Skmacy unsigned int stat; 1112181614Skmacy int ret, edc_needed, cause = 0; 1113181614Skmacy 1114181614Skmacy ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat); 1115181614Skmacy if (ret) 1116181614Skmacy return ret; 1117181614Skmacy 1118181614Skmacy if (stat & AEL2005_MODDET_IRQ) { 1119181614Skmacy ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 1120181614Skmacy 0xd00); 1121181614Skmacy if (ret) 1122181614Skmacy return ret; 1123181614Skmacy 1124181614Skmacy /* modules have max 300 ms init time after hot plug */ 1125181614Skmacy ret = get_module_type(phy, 300); 1126181614Skmacy if (ret < 0) 1127181614Skmacy return ret; 1128181614Skmacy 1129181614Skmacy phy->modtype = (u8)ret; 1130181614Skmacy if (ret == phy_modtype_none) 1131181614Skmacy edc_needed = phy->priv; /* on unplug retain EDC */ 1132181614Skmacy else if (ret == phy_modtype_twinax || 1133181614Skmacy ret == phy_modtype_twinax_long) 1134181614Skmacy edc_needed = edc_twinax; 1135181614Skmacy else 1136181614Skmacy edc_needed = edc_sr; 1137181614Skmacy 1138181614Skmacy if (edc_needed != phy->priv) { 1139181614Skmacy ret = ael2005_reset(phy, 0); 1140181614Skmacy return ret ? ret : cphy_cause_module_change; 1141181614Skmacy } 1142181614Skmacy cause = cphy_cause_module_change; 1143181614Skmacy } 1144181614Skmacy 1145181614Skmacy ret = t3_phy_lasi_intr_handler(phy); 1146181614Skmacy return ret < 0 ? ret : ret + cause; 1147181614Skmacy} 1148181614Skmacy 1149167514Skmacy#ifdef C99_NOT_SUPPORTED 1150180583Skmacystatic struct cphy_ops ael2005_ops = { 1151180583Skmacy ael2005_reset, 1152181614Skmacy ael2005_intr_enable, 1153181614Skmacy ael2005_intr_disable, 1154181614Skmacy ael2005_intr_clear, 1155181614Skmacy ael2005_intr_handler, 1156180583Skmacy NULL, 1157180583Skmacy NULL, 1158180583Skmacy NULL, 1159180583Skmacy NULL, 1160180583Skmacy NULL, 1161181614Skmacy get_link_status_r, 1162180583Skmacy ael1002_power_down, 1163180583Skmacy}; 1164180583Skmacy#else 1165180583Skmacystatic struct cphy_ops ael2005_ops = { 1166180583Skmacy .reset = ael2005_reset, 1167181614Skmacy .intr_enable = ael2005_intr_enable, 1168181614Skmacy .intr_disable = ael2005_intr_disable, 1169181614Skmacy .intr_clear = ael2005_intr_clear, 1170181614Skmacy .intr_handler = ael2005_intr_handler, 1171181614Skmacy .get_link_status = get_link_status_r, 1172180583Skmacy .power_down = ael1002_power_down, 1173180583Skmacy}; 1174180583Skmacy#endif 1175180583Skmacy 1176180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1177180583Skmacy const struct mdio_ops *mdio_ops) 1178180583Skmacy{ 1179180583Skmacy cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops, 1180181614Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 1181181614Skmacy SUPPORTED_IRQ, "10GBASE-R"); 1182180583Skmacy msleep(125); 1183180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 1184180583Skmacy 1 << 5); 1185180583Skmacy} 1186180583Skmacy 1187181614Skmacy/* 1188181614Skmacy * Get link status for a 10GBASE-X device. 1189181614Skmacy */ 1190181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed, 1191181614Skmacy int *duplex, int *fc) 1192181614Skmacy{ 1193181614Skmacy if (link_ok) { 1194181614Skmacy unsigned int stat0, stat1, stat2; 1195181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 1196181614Skmacy 1197181614Skmacy if (!err) 1198181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1); 1199181614Skmacy if (!err) 1200181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 1201181614Skmacy if (err) 1202181614Skmacy return err; 1203181614Skmacy *link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1; 1204181614Skmacy } 1205181614Skmacy if (speed) 1206181614Skmacy *speed = SPEED_10000; 1207181614Skmacy if (duplex) 1208181614Skmacy *duplex = DUPLEX_FULL; 1209181614Skmacy return 0; 1210181614Skmacy} 1211181614Skmacy 1212180583Skmacy#ifdef C99_NOT_SUPPORTED 1213167514Skmacystatic struct cphy_ops qt2045_ops = { 1214167514Skmacy ael1006_reset, 1215180583Skmacy t3_phy_lasi_intr_enable, 1216180583Skmacy t3_phy_lasi_intr_disable, 1217180583Skmacy t3_phy_lasi_intr_clear, 1218180583Skmacy t3_phy_lasi_intr_handler, 1219167514Skmacy NULL, 1220167514Skmacy NULL, 1221167514Skmacy NULL, 1222167514Skmacy NULL, 1223167514Skmacy NULL, 1224181614Skmacy get_link_status_x, 1225167514Skmacy ael1006_power_down, 1226167514Skmacy}; 1227167514Skmacy#else 1228167514Skmacystatic struct cphy_ops qt2045_ops = { 1229167514Skmacy .reset = ael1006_reset, 1230180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 1231180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 1232180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 1233180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 1234181614Skmacy .get_link_status = get_link_status_x, 1235167514Skmacy .power_down = ael1006_power_down, 1236167514Skmacy}; 1237167514Skmacy#endif 1238167514Skmacy 1239176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1240176472Skmacy const struct mdio_ops *mdio_ops) 1241167514Skmacy{ 1242167514Skmacy unsigned int stat; 1243167514Skmacy 1244176472Skmacy cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops, 1245176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1246176472Skmacy "10GBASE-CX4"); 1247167514Skmacy 1248167514Skmacy /* 1249167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 1250167514Skmacy * have it at 1. 1251167514Skmacy */ 1252167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 1253167514Skmacy stat == 0xffff) 1254167514Skmacy phy->addr = 1; 1255176472Skmacy return 0; 1256167514Skmacy} 1257167514Skmacy 1258167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 1259167514Skmacy{ 1260167514Skmacy return 0; 1261167514Skmacy} 1262167514Skmacy 1263167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, 1264167514Skmacy int *speed, int *duplex, int *fc) 1265167514Skmacy{ 1266167514Skmacy if (link_ok) { 1267167514Skmacy unsigned int status; 1268167514Skmacy 1269167514Skmacy status = t3_read_reg(phy->adapter, 1270170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 1271170654Skmacy t3_read_reg(phy->adapter, 1272170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 1273170654Skmacy t3_read_reg(phy->adapter, 1274170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 1275170654Skmacy t3_read_reg(phy->adapter, 1276170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 1277167514Skmacy *link_ok = !(status & F_LOWSIG0); 1278167514Skmacy } 1279167514Skmacy if (speed) 1280167514Skmacy *speed = SPEED_10000; 1281167514Skmacy if (duplex) 1282167514Skmacy *duplex = DUPLEX_FULL; 1283167514Skmacy return 0; 1284167514Skmacy} 1285167514Skmacy 1286167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 1287167514Skmacy{ 1288167514Skmacy return 0; 1289167514Skmacy} 1290167514Skmacy 1291167514Skmacy#ifdef C99_NOT_SUPPORTED 1292167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1293167514Skmacy xaui_direct_reset, 1294167514Skmacy ael1002_intr_noop, 1295167514Skmacy ael1002_intr_noop, 1296167514Skmacy ael1002_intr_noop, 1297167514Skmacy ael1002_intr_noop, 1298167514Skmacy NULL, 1299167514Skmacy NULL, 1300167514Skmacy NULL, 1301167514Skmacy NULL, 1302167514Skmacy NULL, 1303167514Skmacy xaui_direct_get_link_status, 1304167514Skmacy xaui_direct_power_down, 1305167514Skmacy}; 1306167514Skmacy#else 1307167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1308167514Skmacy .reset = xaui_direct_reset, 1309167514Skmacy .intr_enable = ael1002_intr_noop, 1310167514Skmacy .intr_disable = ael1002_intr_noop, 1311167514Skmacy .intr_clear = ael1002_intr_noop, 1312167514Skmacy .intr_handler = ael1002_intr_noop, 1313167514Skmacy .get_link_status = xaui_direct_get_link_status, 1314167514Skmacy .power_down = xaui_direct_power_down, 1315167514Skmacy}; 1316167514Skmacy#endif 1317167514Skmacy 1318176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1319176472Skmacy const struct mdio_ops *mdio_ops) 1320167514Skmacy{ 1321176472Skmacy cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, 1322176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1323176472Skmacy "10GBASE-CX4"); 1324176472Skmacy return 0; 1325167514Skmacy} 1326