cxgb_ael1002.c revision 186282
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 186282 2008-12-18 14:21:35Z 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 74186282Sgnnstatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr); 75186282Sgnn 76186282Sgnnstatic int get_module_type (struct cphy *phy, int hint) 77186282Sgnn{ 78186282Sgnn int v; 79186282Sgnn 80186282Sgnn v = hint ? hint : ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0); 81186282Sgnn if (v < 0) 82186282Sgnn return v; 83186282Sgnn 84186282Sgnn if (v == 0x3) { 85186282Sgnn /* SFP: see SFF-8472 for below */ 86186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 3); 87186282Sgnn if (v < 0) 88186282Sgnn return v; 89186282Sgnn 90186282Sgnn if (v == 0x1) 91186282Sgnn return phy_modtype_twinax; 92186282Sgnn if (v == 0x10) 93186282Sgnn return phy_modtype_sr; 94186282Sgnn if (v == 0x20) 95186282Sgnn return phy_modtype_lr; 96186282Sgnn if (v == 0x40) 97186282Sgnn return phy_modtype_lrm; 98186282Sgnn 99186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 6); 100186282Sgnn if (v < 0) 101186282Sgnn return v; 102186282Sgnn if (v != 4) 103186282Sgnn return phy_modtype_unknown; 104186282Sgnn 105186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 10); 106186282Sgnn if (v < 0) 107186282Sgnn return v; 108186282Sgnn 109186282Sgnn if (v & 0x80) { 110186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); 111186282Sgnn if (v < 0) 112186282Sgnn return v; 113186282Sgnn return v > 10 ? phy_modtype_twinax_long : 114186282Sgnn phy_modtype_twinax; 115186282Sgnn } 116186282Sgnn } else if (v == 0x6) { 117186282Sgnn /* XFP: See INF-8077i for details. */ 118186282Sgnn 119186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 127); 120186282Sgnn if (v < 0) 121186282Sgnn return v; 122186282Sgnn 123186282Sgnn if (v != 1) { 124186282Sgnn /* XXX: set page select to table 1 yourself */ 125186282Sgnn return phy_modtype_unknown; 126186282Sgnn } 127186282Sgnn 128186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 131); 129186282Sgnn if (v < 0) 130186282Sgnn return v; 131186282Sgnn if (v == 0x10) 132186282Sgnn return phy_modtype_lrm; 133186282Sgnn if (v == 0x40) 134186282Sgnn return phy_modtype_lr; 135186282Sgnn if (v == 0x80) 136186282Sgnn return phy_modtype_sr; 137186282Sgnn } 138186282Sgnn 139186282Sgnn return phy_modtype_unknown; 140186282Sgnn} 141186282Sgnn 142180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv) 143180583Skmacy{ 144180583Skmacy int err; 145180583Skmacy 146180583Skmacy for (err = 0; rv->mmd_addr && !err; rv++) { 147180583Skmacy if (rv->clear_bits == 0xffff) 148180583Skmacy err = mdio_write(phy, rv->mmd_addr, rv->reg_addr, 149180583Skmacy rv->set_bits); 150180583Skmacy else 151180583Skmacy err = t3_mdio_change_bits(phy, rv->mmd_addr, 152180583Skmacy rv->reg_addr, rv->clear_bits, 153180583Skmacy rv->set_bits); 154180583Skmacy } 155180583Skmacy return err; 156180583Skmacy} 157180583Skmacy 158167514Skmacystatic void ael100x_txon(struct cphy *phy) 159167514Skmacy{ 160167514Skmacy int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL; 161167514Skmacy 162176472Skmacy msleep(100); 163167514Skmacy t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio); 164176472Skmacy msleep(30); 165167514Skmacy} 166167514Skmacy 167167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable) 168167514Skmacy{ 169167514Skmacy int err; 170167514Skmacy 171167514Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable); 172167514Skmacy if (!err) 173167514Skmacy err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 174167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 175167514Skmacy return err; 176167514Skmacy} 177167514Skmacy 178186282Sgnnstatic int ael1002_get_module_type(struct cphy *phy, int delay_ms) 179186282Sgnn{ 180186282Sgnn int v; 181186282Sgnn 182186282Sgnn if (delay_ms) 183186282Sgnn msleep(delay_ms); 184186282Sgnn 185186282Sgnn v = ael2005_i2c_rd(phy, MODULE_DEV_ADDR, 0); 186186282Sgnn 187186282Sgnn return v == -ETIMEDOUT ? phy_modtype_none : get_module_type(phy, v); 188186282Sgnn} 189186282Sgnn 190167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait) 191167514Skmacy{ 192167514Skmacy int err; 193167514Skmacy 194167514Skmacy if ((err = ael1002_power_down(phy, 0)) || 195167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) || 196167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) || 197167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) || 198167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) || 199167514Skmacy (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN, 200167514Skmacy 0, 1 << 5))) 201167514Skmacy return err; 202186282Sgnn 203186282Sgnn err = ael1002_get_module_type(phy, 300); 204186282Sgnn if (err >= 0) 205186282Sgnn phy->modtype = err; 206186282Sgnn 207167514Skmacy return 0; 208167514Skmacy} 209167514Skmacy 210167514Skmacystatic int ael1002_intr_noop(struct cphy *phy) 211167514Skmacy{ 212167514Skmacy return 0; 213167514Skmacy} 214167514Skmacy 215181614Skmacy/* 216181614Skmacy * Get link status for a 10GBASE-R device. 217181614Skmacy */ 218181614Skmacystatic int get_link_status_r(struct cphy *phy, int *link_ok, int *speed, 219181614Skmacy int *duplex, int *fc) 220167514Skmacy{ 221167514Skmacy if (link_ok) { 222181614Skmacy unsigned int stat0, stat1, stat2; 223181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 224167514Skmacy 225181614Skmacy if (!err) 226181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_R, &stat1); 227181614Skmacy if (!err) 228181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 229167514Skmacy if (err) 230167514Skmacy return err; 231181614Skmacy *link_ok = (stat0 & stat1 & (stat2 >> 12)) & 1; 232167514Skmacy } 233167514Skmacy if (speed) 234167514Skmacy *speed = SPEED_10000; 235167514Skmacy if (duplex) 236167514Skmacy *duplex = DUPLEX_FULL; 237167514Skmacy return 0; 238167514Skmacy} 239167514Skmacy 240167514Skmacy#ifdef C99_NOT_SUPPORTED 241167514Skmacystatic struct cphy_ops ael1002_ops = { 242167514Skmacy ael1002_reset, 243167514Skmacy ael1002_intr_noop, 244167514Skmacy ael1002_intr_noop, 245167514Skmacy ael1002_intr_noop, 246167514Skmacy ael1002_intr_noop, 247167514Skmacy NULL, 248167514Skmacy NULL, 249167514Skmacy NULL, 250167514Skmacy NULL, 251167514Skmacy NULL, 252181614Skmacy get_link_status_r, 253167514Skmacy ael1002_power_down, 254167514Skmacy}; 255167514Skmacy#else 256167514Skmacystatic struct cphy_ops ael1002_ops = { 257167514Skmacy .reset = ael1002_reset, 258167514Skmacy .intr_enable = ael1002_intr_noop, 259167514Skmacy .intr_disable = ael1002_intr_noop, 260167514Skmacy .intr_clear = ael1002_intr_noop, 261167514Skmacy .intr_handler = ael1002_intr_noop, 262181614Skmacy .get_link_status = get_link_status_r, 263167514Skmacy .power_down = ael1002_power_down, 264167514Skmacy}; 265167514Skmacy#endif 266167514Skmacy 267176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 268176472Skmacy const struct mdio_ops *mdio_ops) 269167514Skmacy{ 270186282Sgnn int err; 271186282Sgnn 272176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops, 273176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 274177340Skmacy "10GBASE-R"); 275167514Skmacy ael100x_txon(phy); 276186282Sgnn 277186282Sgnn err = ael1002_get_module_type(phy, 0); 278186282Sgnn if (err >= 0) 279186282Sgnn phy->modtype = err; 280186282Sgnn 281176472Skmacy return 0; 282167514Skmacy} 283167514Skmacy 284167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait) 285167514Skmacy{ 286185157Sgnn u32 gpio_out; 287185157Sgnn t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 288185157Sgnn /* Hack to reset the phy correctly */ 289185157Sgnn /* Read out the current value */ 290185157Sgnn gpio_out = t3_read_reg(phy->adapter, A_T3DBG_GPIO_EN); 291185157Sgnn /* Reset the phy */ 292185157Sgnn gpio_out &= ~F_GPIO6_OUT_VAL; 293185157Sgnn t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out); 294185157Sgnn msleep(125); 295185157Sgnn /* Take the phy out of reset */ 296185157Sgnn gpio_out |= F_GPIO6_OUT_VAL; 297185157Sgnn t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out); 298185157Sgnn msleep(125); 299185157Sgnn t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 300185620Sgnn 301185620Sgnn /* Phy loopback work around for ael1006 */ 302185620Sgnn /* Soft reset phy by toggling loopback */ 303185620Sgnn msleep(125); 304185620Sgnn /* Put phy into local loopback */ 305185620Sgnn t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 0, 1); 306185620Sgnn msleep(125); 307185620Sgnn /* Take phy out of local loopback */ 308185620Sgnn t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0); 309185620Sgnn 310185157Sgnn return 0; 311167514Skmacy} 312167514Skmacy 313167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable) 314167514Skmacy{ 315167514Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 316167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 317167514Skmacy} 318167514Skmacy 319167514Skmacy#ifdef C99_NOT_SUPPORTED 320167514Skmacystatic struct cphy_ops ael1006_ops = { 321167514Skmacy ael1006_reset, 322180583Skmacy t3_phy_lasi_intr_enable, 323180583Skmacy t3_phy_lasi_intr_disable, 324180583Skmacy t3_phy_lasi_intr_clear, 325180583Skmacy t3_phy_lasi_intr_handler, 326167514Skmacy NULL, 327167514Skmacy NULL, 328167514Skmacy NULL, 329167514Skmacy NULL, 330167514Skmacy NULL, 331181614Skmacy get_link_status_r, 332167514Skmacy ael1006_power_down, 333167514Skmacy}; 334167514Skmacy#else 335167514Skmacystatic struct cphy_ops ael1006_ops = { 336167514Skmacy .reset = ael1006_reset, 337180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 338180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 339180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 340180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 341181614Skmacy .get_link_status = get_link_status_r, 342167514Skmacy .power_down = ael1006_power_down, 343167514Skmacy}; 344167514Skmacy#endif 345167514Skmacy 346176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 347176472Skmacy const struct mdio_ops *mdio_ops) 348167514Skmacy{ 349176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops, 350176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 351176472Skmacy "10GBASE-SR"); 352167514Skmacy ael100x_txon(phy); 353176472Skmacy return 0; 354167514Skmacy} 355167514Skmacy 356180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 357180583Skmacy{ 358181614Skmacy static struct reg_val regs[] = { 359181614Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 360181614Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 361181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 362181614Skmacy { 0, 0, 0, 0 } 363181614Skmacy }; 364180583Skmacy static u16 sr_edc[] = { 365180583Skmacy 0xcc00, 0x2ff4, 366180583Skmacy 0xcc01, 0x3cd4, 367180583Skmacy 0xcc02, 0x2015, 368180583Skmacy 0xcc03, 0x3105, 369180583Skmacy 0xcc04, 0x6524, 370180583Skmacy 0xcc05, 0x27ff, 371180583Skmacy 0xcc06, 0x300f, 372180583Skmacy 0xcc07, 0x2c8b, 373180583Skmacy 0xcc08, 0x300b, 374180583Skmacy 0xcc09, 0x4009, 375180583Skmacy 0xcc0a, 0x400e, 376180583Skmacy 0xcc0b, 0x2f72, 377180583Skmacy 0xcc0c, 0x3002, 378180583Skmacy 0xcc0d, 0x1002, 379180583Skmacy 0xcc0e, 0x2172, 380180583Skmacy 0xcc0f, 0x3012, 381180583Skmacy 0xcc10, 0x1002, 382180583Skmacy 0xcc11, 0x25d2, 383180583Skmacy 0xcc12, 0x3012, 384180583Skmacy 0xcc13, 0x1002, 385180583Skmacy 0xcc14, 0xd01e, 386180583Skmacy 0xcc15, 0x27d2, 387180583Skmacy 0xcc16, 0x3012, 388180583Skmacy 0xcc17, 0x1002, 389180583Skmacy 0xcc18, 0x2004, 390180583Skmacy 0xcc19, 0x3c84, 391180583Skmacy 0xcc1a, 0x6436, 392180583Skmacy 0xcc1b, 0x2007, 393180583Skmacy 0xcc1c, 0x3f87, 394180583Skmacy 0xcc1d, 0x8676, 395180583Skmacy 0xcc1e, 0x40b7, 396180583Skmacy 0xcc1f, 0xa746, 397180583Skmacy 0xcc20, 0x4047, 398180583Skmacy 0xcc21, 0x5673, 399180583Skmacy 0xcc22, 0x2982, 400180583Skmacy 0xcc23, 0x3002, 401180583Skmacy 0xcc24, 0x13d2, 402180583Skmacy 0xcc25, 0x8bbd, 403180583Skmacy 0xcc26, 0x2862, 404180583Skmacy 0xcc27, 0x3012, 405180583Skmacy 0xcc28, 0x1002, 406180583Skmacy 0xcc29, 0x2092, 407180583Skmacy 0xcc2a, 0x3012, 408180583Skmacy 0xcc2b, 0x1002, 409180583Skmacy 0xcc2c, 0x5cc3, 410180583Skmacy 0xcc2d, 0x314, 411180583Skmacy 0xcc2e, 0x2942, 412180583Skmacy 0xcc2f, 0x3002, 413180583Skmacy 0xcc30, 0x1002, 414180583Skmacy 0xcc31, 0xd019, 415180583Skmacy 0xcc32, 0x2032, 416180583Skmacy 0xcc33, 0x3012, 417180583Skmacy 0xcc34, 0x1002, 418180583Skmacy 0xcc35, 0x2a04, 419180583Skmacy 0xcc36, 0x3c74, 420180583Skmacy 0xcc37, 0x6435, 421180583Skmacy 0xcc38, 0x2fa4, 422180583Skmacy 0xcc39, 0x3cd4, 423180583Skmacy 0xcc3a, 0x6624, 424180583Skmacy 0xcc3b, 0x5563, 425180583Skmacy 0xcc3c, 0x2d42, 426180583Skmacy 0xcc3d, 0x3002, 427180583Skmacy 0xcc3e, 0x13d2, 428180583Skmacy 0xcc3f, 0x464d, 429180583Skmacy 0xcc40, 0x2862, 430180583Skmacy 0xcc41, 0x3012, 431180583Skmacy 0xcc42, 0x1002, 432180583Skmacy 0xcc43, 0x2032, 433180583Skmacy 0xcc44, 0x3012, 434180583Skmacy 0xcc45, 0x1002, 435180583Skmacy 0xcc46, 0x2fb4, 436180583Skmacy 0xcc47, 0x3cd4, 437180583Skmacy 0xcc48, 0x6624, 438180583Skmacy 0xcc49, 0x5563, 439180583Skmacy 0xcc4a, 0x2d42, 440180583Skmacy 0xcc4b, 0x3002, 441180583Skmacy 0xcc4c, 0x13d2, 442180583Skmacy 0xcc4d, 0x2ed2, 443180583Skmacy 0xcc4e, 0x3002, 444180583Skmacy 0xcc4f, 0x1002, 445180583Skmacy 0xcc50, 0x2fd2, 446180583Skmacy 0xcc51, 0x3002, 447180583Skmacy 0xcc52, 0x1002, 448180583Skmacy 0xcc53, 0x004, 449180583Skmacy 0xcc54, 0x2942, 450180583Skmacy 0xcc55, 0x3002, 451180583Skmacy 0xcc56, 0x1002, 452180583Skmacy 0xcc57, 0x2092, 453180583Skmacy 0xcc58, 0x3012, 454180583Skmacy 0xcc59, 0x1002, 455180583Skmacy 0xcc5a, 0x5cc3, 456180583Skmacy 0xcc5b, 0x317, 457180583Skmacy 0xcc5c, 0x2f72, 458180583Skmacy 0xcc5d, 0x3002, 459180583Skmacy 0xcc5e, 0x1002, 460180583Skmacy 0xcc5f, 0x2942, 461180583Skmacy 0xcc60, 0x3002, 462180583Skmacy 0xcc61, 0x1002, 463180583Skmacy 0xcc62, 0x22cd, 464180583Skmacy 0xcc63, 0x301d, 465180583Skmacy 0xcc64, 0x2862, 466180583Skmacy 0xcc65, 0x3012, 467180583Skmacy 0xcc66, 0x1002, 468180583Skmacy 0xcc67, 0x2ed2, 469180583Skmacy 0xcc68, 0x3002, 470180583Skmacy 0xcc69, 0x1002, 471180583Skmacy 0xcc6a, 0x2d72, 472180583Skmacy 0xcc6b, 0x3002, 473180583Skmacy 0xcc6c, 0x1002, 474180583Skmacy 0xcc6d, 0x628f, 475180583Skmacy 0xcc6e, 0x2112, 476180583Skmacy 0xcc6f, 0x3012, 477180583Skmacy 0xcc70, 0x1002, 478180583Skmacy 0xcc71, 0x5aa3, 479180583Skmacy 0xcc72, 0x2dc2, 480180583Skmacy 0xcc73, 0x3002, 481180583Skmacy 0xcc74, 0x1312, 482180583Skmacy 0xcc75, 0x6f72, 483180583Skmacy 0xcc76, 0x1002, 484180583Skmacy 0xcc77, 0x2807, 485180583Skmacy 0xcc78, 0x31a7, 486180583Skmacy 0xcc79, 0x20c4, 487180583Skmacy 0xcc7a, 0x3c24, 488180583Skmacy 0xcc7b, 0x6724, 489180583Skmacy 0xcc7c, 0x1002, 490180583Skmacy 0xcc7d, 0x2807, 491180583Skmacy 0xcc7e, 0x3187, 492180583Skmacy 0xcc7f, 0x20c4, 493180583Skmacy 0xcc80, 0x3c24, 494180583Skmacy 0xcc81, 0x6724, 495180583Skmacy 0xcc82, 0x1002, 496180583Skmacy 0xcc83, 0x2514, 497180583Skmacy 0xcc84, 0x3c64, 498180583Skmacy 0xcc85, 0x6436, 499180583Skmacy 0xcc86, 0xdff4, 500180583Skmacy 0xcc87, 0x6436, 501180583Skmacy 0xcc88, 0x1002, 502180583Skmacy 0xcc89, 0x40a4, 503180583Skmacy 0xcc8a, 0x643c, 504180583Skmacy 0xcc8b, 0x4016, 505180583Skmacy 0xcc8c, 0x8c6c, 506180583Skmacy 0xcc8d, 0x2b24, 507180583Skmacy 0xcc8e, 0x3c24, 508180583Skmacy 0xcc8f, 0x6435, 509180583Skmacy 0xcc90, 0x1002, 510180583Skmacy 0xcc91, 0x2b24, 511180583Skmacy 0xcc92, 0x3c24, 512180583Skmacy 0xcc93, 0x643a, 513180583Skmacy 0xcc94, 0x4025, 514180583Skmacy 0xcc95, 0x8a5a, 515180583Skmacy 0xcc96, 0x1002, 516180583Skmacy 0xcc97, 0x2731, 517180583Skmacy 0xcc98, 0x3011, 518180583Skmacy 0xcc99, 0x1001, 519180583Skmacy 0xcc9a, 0xc7a0, 520180583Skmacy 0xcc9b, 0x100, 521180583Skmacy 0xcc9c, 0xc502, 522180583Skmacy 0xcc9d, 0x53ac, 523180583Skmacy 0xcc9e, 0xc503, 524180583Skmacy 0xcc9f, 0xd5d5, 525180583Skmacy 0xcca0, 0xc600, 526180583Skmacy 0xcca1, 0x2a6d, 527180583Skmacy 0xcca2, 0xc601, 528180583Skmacy 0xcca3, 0x2a4c, 529180583Skmacy 0xcca4, 0xc602, 530180583Skmacy 0xcca5, 0x111, 531180583Skmacy 0xcca6, 0xc60c, 532180583Skmacy 0xcca7, 0x5900, 533180583Skmacy 0xcca8, 0xc710, 534180583Skmacy 0xcca9, 0x700, 535180583Skmacy 0xccaa, 0xc718, 536180583Skmacy 0xccab, 0x700, 537180583Skmacy 0xccac, 0xc720, 538180583Skmacy 0xccad, 0x4700, 539180583Skmacy 0xccae, 0xc801, 540180583Skmacy 0xccaf, 0x7f50, 541180583Skmacy 0xccb0, 0xc802, 542180583Skmacy 0xccb1, 0x7760, 543180583Skmacy 0xccb2, 0xc803, 544180583Skmacy 0xccb3, 0x7fce, 545180583Skmacy 0xccb4, 0xc804, 546180583Skmacy 0xccb5, 0x5700, 547180583Skmacy 0xccb6, 0xc805, 548180583Skmacy 0xccb7, 0x5f11, 549180583Skmacy 0xccb8, 0xc806, 550180583Skmacy 0xccb9, 0x4751, 551180583Skmacy 0xccba, 0xc807, 552180583Skmacy 0xccbb, 0x57e1, 553180583Skmacy 0xccbc, 0xc808, 554180583Skmacy 0xccbd, 0x2700, 555180583Skmacy 0xccbe, 0xc809, 556180583Skmacy 0xccbf, 0x000, 557180583Skmacy 0xccc0, 0xc821, 558180583Skmacy 0xccc1, 0x002, 559180583Skmacy 0xccc2, 0xc822, 560180583Skmacy 0xccc3, 0x014, 561180583Skmacy 0xccc4, 0xc832, 562180583Skmacy 0xccc5, 0x1186, 563180583Skmacy 0xccc6, 0xc847, 564180583Skmacy 0xccc7, 0x1e02, 565180583Skmacy 0xccc8, 0xc013, 566180583Skmacy 0xccc9, 0xf341, 567180583Skmacy 0xccca, 0xc01a, 568180583Skmacy 0xcccb, 0x446, 569180583Skmacy 0xcccc, 0xc024, 570180583Skmacy 0xcccd, 0x1000, 571180583Skmacy 0xccce, 0xc025, 572180583Skmacy 0xcccf, 0xa00, 573180583Skmacy 0xccd0, 0xc026, 574180583Skmacy 0xccd1, 0xc0c, 575180583Skmacy 0xccd2, 0xc027, 576180583Skmacy 0xccd3, 0xc0c, 577180583Skmacy 0xccd4, 0xc029, 578180583Skmacy 0xccd5, 0x0a0, 579180583Skmacy 0xccd6, 0xc030, 580180583Skmacy 0xccd7, 0xa00, 581180583Skmacy 0xccd8, 0xc03c, 582180583Skmacy 0xccd9, 0x01c, 583180583Skmacy 0xccda, 0xc005, 584180583Skmacy 0xccdb, 0x7a06, 585180583Skmacy 0xccdc, 0x000, 586180583Skmacy 0xccdd, 0x2731, 587180583Skmacy 0xccde, 0x3011, 588180583Skmacy 0xccdf, 0x1001, 589180583Skmacy 0xcce0, 0xc620, 590180583Skmacy 0xcce1, 0x000, 591180583Skmacy 0xcce2, 0xc621, 592180583Skmacy 0xcce3, 0x03f, 593180583Skmacy 0xcce4, 0xc622, 594180583Skmacy 0xcce5, 0x000, 595180583Skmacy 0xcce6, 0xc623, 596180583Skmacy 0xcce7, 0x000, 597180583Skmacy 0xcce8, 0xc624, 598180583Skmacy 0xcce9, 0x000, 599180583Skmacy 0xccea, 0xc625, 600180583Skmacy 0xcceb, 0x000, 601180583Skmacy 0xccec, 0xc627, 602180583Skmacy 0xcced, 0x000, 603180583Skmacy 0xccee, 0xc628, 604180583Skmacy 0xccef, 0x000, 605180583Skmacy 0xccf0, 0xc62c, 606180583Skmacy 0xccf1, 0x000, 607180583Skmacy 0xccf2, 0x000, 608180583Skmacy 0xccf3, 0x2806, 609180583Skmacy 0xccf4, 0x3cb6, 610180583Skmacy 0xccf5, 0xc161, 611180583Skmacy 0xccf6, 0x6134, 612180583Skmacy 0xccf7, 0x6135, 613180583Skmacy 0xccf8, 0x5443, 614180583Skmacy 0xccf9, 0x303, 615180583Skmacy 0xccfa, 0x6524, 616180583Skmacy 0xccfb, 0x00b, 617180583Skmacy 0xccfc, 0x1002, 618180583Skmacy 0xccfd, 0x2104, 619180583Skmacy 0xccfe, 0x3c24, 620180583Skmacy 0xccff, 0x2105, 621180583Skmacy 0xcd00, 0x3805, 622180583Skmacy 0xcd01, 0x6524, 623180583Skmacy 0xcd02, 0xdff4, 624180583Skmacy 0xcd03, 0x4005, 625180583Skmacy 0xcd04, 0x6524, 626180583Skmacy 0xcd05, 0x1002, 627180583Skmacy 0xcd06, 0x5dd3, 628180583Skmacy 0xcd07, 0x306, 629180583Skmacy 0xcd08, 0x2ff7, 630180583Skmacy 0xcd09, 0x38f7, 631180583Skmacy 0xcd0a, 0x60b7, 632180583Skmacy 0xcd0b, 0xdffd, 633180583Skmacy 0xcd0c, 0x00a, 634180583Skmacy 0xcd0d, 0x1002, 635180583Skmacy 0xcd0e, 0 636180583Skmacy }; 637180583Skmacy int i, err; 638180583Skmacy 639181614Skmacy err = set_phy_regs(phy, regs); 640181614Skmacy if (err) 641181614Skmacy return err; 642181614Skmacy 643181614Skmacy msleep(50); 644181614Skmacy 645181614Skmacy for (i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 646180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 647180583Skmacy sr_edc[i + 1]); 648181614Skmacy if (!err) 649181614Skmacy phy->priv = edc_sr; 650180583Skmacy return err; 651180583Skmacy} 652180583Skmacy 653181614Skmacystatic int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) 654181614Skmacy{ 655181614Skmacy static struct reg_val regs[] = { 656181614Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5a00 }, 657181614Skmacy { 0, 0, 0, 0 } 658181614Skmacy }; 659181614Skmacy static struct reg_val preemphasis[] = { 660181614Skmacy { MDIO_DEV_PMA_PMD, 0xc014, 0xffff, 0xfe16 }, 661181614Skmacy { MDIO_DEV_PMA_PMD, 0xc015, 0xffff, 0xa000 }, 662181614Skmacy { 0, 0, 0, 0 } 663181614Skmacy }; 664181614Skmacy static u16 twinax_edc[] = { 665181614Skmacy 0xcc00, 0x4009, 666181614Skmacy 0xcc01, 0x27ff, 667181614Skmacy 0xcc02, 0x300f, 668181614Skmacy 0xcc03, 0x40aa, 669181614Skmacy 0xcc04, 0x401c, 670181614Skmacy 0xcc05, 0x401e, 671181614Skmacy 0xcc06, 0x2ff4, 672181614Skmacy 0xcc07, 0x3cd4, 673181614Skmacy 0xcc08, 0x2035, 674181614Skmacy 0xcc09, 0x3145, 675181614Skmacy 0xcc0a, 0x6524, 676181614Skmacy 0xcc0b, 0x26a2, 677181614Skmacy 0xcc0c, 0x3012, 678181614Skmacy 0xcc0d, 0x1002, 679181614Skmacy 0xcc0e, 0x29c2, 680181614Skmacy 0xcc0f, 0x3002, 681181614Skmacy 0xcc10, 0x1002, 682181614Skmacy 0xcc11, 0x2072, 683181614Skmacy 0xcc12, 0x3012, 684181614Skmacy 0xcc13, 0x1002, 685181614Skmacy 0xcc14, 0x22cd, 686181614Skmacy 0xcc15, 0x301d, 687181614Skmacy 0xcc16, 0x2e52, 688181614Skmacy 0xcc17, 0x3012, 689181614Skmacy 0xcc18, 0x1002, 690181614Skmacy 0xcc19, 0x28e2, 691181614Skmacy 0xcc1a, 0x3002, 692181614Skmacy 0xcc1b, 0x1002, 693181614Skmacy 0xcc1c, 0x628f, 694181614Skmacy 0xcc1d, 0x2ac2, 695181614Skmacy 0xcc1e, 0x3012, 696181614Skmacy 0xcc1f, 0x1002, 697181614Skmacy 0xcc20, 0x5553, 698181614Skmacy 0xcc21, 0x2ae2, 699181614Skmacy 0xcc22, 0x3002, 700181614Skmacy 0xcc23, 0x1302, 701181614Skmacy 0xcc24, 0x401e, 702181614Skmacy 0xcc25, 0x2be2, 703181614Skmacy 0xcc26, 0x3012, 704181614Skmacy 0xcc27, 0x1002, 705181614Skmacy 0xcc28, 0x2da2, 706181614Skmacy 0xcc29, 0x3012, 707181614Skmacy 0xcc2a, 0x1002, 708181614Skmacy 0xcc2b, 0x2ba2, 709181614Skmacy 0xcc2c, 0x3002, 710181614Skmacy 0xcc2d, 0x1002, 711181614Skmacy 0xcc2e, 0x5ee3, 712181614Skmacy 0xcc2f, 0x305, 713181614Skmacy 0xcc30, 0x400e, 714181614Skmacy 0xcc31, 0x2bc2, 715181614Skmacy 0xcc32, 0x3002, 716181614Skmacy 0xcc33, 0x1002, 717181614Skmacy 0xcc34, 0x2b82, 718181614Skmacy 0xcc35, 0x3012, 719181614Skmacy 0xcc36, 0x1002, 720181614Skmacy 0xcc37, 0x5663, 721181614Skmacy 0xcc38, 0x302, 722181614Skmacy 0xcc39, 0x401e, 723181614Skmacy 0xcc3a, 0x6f72, 724181614Skmacy 0xcc3b, 0x1002, 725181614Skmacy 0xcc3c, 0x628f, 726181614Skmacy 0xcc3d, 0x2be2, 727181614Skmacy 0xcc3e, 0x3012, 728181614Skmacy 0xcc3f, 0x1002, 729181614Skmacy 0xcc40, 0x22cd, 730181614Skmacy 0xcc41, 0x301d, 731181614Skmacy 0xcc42, 0x2e52, 732181614Skmacy 0xcc43, 0x3012, 733181614Skmacy 0xcc44, 0x1002, 734181614Skmacy 0xcc45, 0x2522, 735181614Skmacy 0xcc46, 0x3012, 736181614Skmacy 0xcc47, 0x1002, 737181614Skmacy 0xcc48, 0x2da2, 738181614Skmacy 0xcc49, 0x3012, 739181614Skmacy 0xcc4a, 0x1002, 740181614Skmacy 0xcc4b, 0x2ca2, 741181614Skmacy 0xcc4c, 0x3012, 742181614Skmacy 0xcc4d, 0x1002, 743181614Skmacy 0xcc4e, 0x2fa4, 744181614Skmacy 0xcc4f, 0x3cd4, 745181614Skmacy 0xcc50, 0x6624, 746181614Skmacy 0xcc51, 0x410b, 747181614Skmacy 0xcc52, 0x56b3, 748181614Skmacy 0xcc53, 0x3c4, 749181614Skmacy 0xcc54, 0x2fb2, 750181614Skmacy 0xcc55, 0x3002, 751181614Skmacy 0xcc56, 0x1002, 752181614Skmacy 0xcc57, 0x220b, 753181614Skmacy 0xcc58, 0x303b, 754181614Skmacy 0xcc59, 0x56b3, 755181614Skmacy 0xcc5a, 0x3c3, 756181614Skmacy 0xcc5b, 0x866b, 757181614Skmacy 0xcc5c, 0x400c, 758181614Skmacy 0xcc5d, 0x23a2, 759181614Skmacy 0xcc5e, 0x3012, 760181614Skmacy 0xcc5f, 0x1002, 761181614Skmacy 0xcc60, 0x2da2, 762181614Skmacy 0xcc61, 0x3012, 763181614Skmacy 0xcc62, 0x1002, 764181614Skmacy 0xcc63, 0x2ca2, 765181614Skmacy 0xcc64, 0x3012, 766181614Skmacy 0xcc65, 0x1002, 767181614Skmacy 0xcc66, 0x2fb4, 768181614Skmacy 0xcc67, 0x3cd4, 769181614Skmacy 0xcc68, 0x6624, 770181614Skmacy 0xcc69, 0x56b3, 771181614Skmacy 0xcc6a, 0x3c3, 772181614Skmacy 0xcc6b, 0x866b, 773181614Skmacy 0xcc6c, 0x401c, 774181614Skmacy 0xcc6d, 0x2205, 775181614Skmacy 0xcc6e, 0x3035, 776181614Skmacy 0xcc6f, 0x5b53, 777181614Skmacy 0xcc70, 0x2c52, 778181614Skmacy 0xcc71, 0x3002, 779181614Skmacy 0xcc72, 0x13c2, 780181614Skmacy 0xcc73, 0x5cc3, 781181614Skmacy 0xcc74, 0x317, 782181614Skmacy 0xcc75, 0x2522, 783181614Skmacy 0xcc76, 0x3012, 784181614Skmacy 0xcc77, 0x1002, 785181614Skmacy 0xcc78, 0x2da2, 786181614Skmacy 0xcc79, 0x3012, 787181614Skmacy 0xcc7a, 0x1002, 788181614Skmacy 0xcc7b, 0x2b82, 789181614Skmacy 0xcc7c, 0x3012, 790181614Skmacy 0xcc7d, 0x1002, 791181614Skmacy 0xcc7e, 0x5663, 792181614Skmacy 0xcc7f, 0x303, 793181614Skmacy 0xcc80, 0x401e, 794181614Skmacy 0xcc81, 0x004, 795181614Skmacy 0xcc82, 0x2c42, 796181614Skmacy 0xcc83, 0x3012, 797181614Skmacy 0xcc84, 0x1002, 798181614Skmacy 0xcc85, 0x6f72, 799181614Skmacy 0xcc86, 0x1002, 800181614Skmacy 0xcc87, 0x628f, 801181614Skmacy 0xcc88, 0x2304, 802181614Skmacy 0xcc89, 0x3c84, 803181614Skmacy 0xcc8a, 0x6436, 804181614Skmacy 0xcc8b, 0xdff4, 805181614Skmacy 0xcc8c, 0x6436, 806181614Skmacy 0xcc8d, 0x2ff5, 807181614Skmacy 0xcc8e, 0x3005, 808181614Skmacy 0xcc8f, 0x8656, 809181614Skmacy 0xcc90, 0xdfba, 810181614Skmacy 0xcc91, 0x56a3, 811181614Skmacy 0xcc92, 0xd05a, 812181614Skmacy 0xcc93, 0x21c2, 813181614Skmacy 0xcc94, 0x3012, 814181614Skmacy 0xcc95, 0x1392, 815181614Skmacy 0xcc96, 0xd05a, 816181614Skmacy 0xcc97, 0x56a3, 817181614Skmacy 0xcc98, 0xdfba, 818181614Skmacy 0xcc99, 0x383, 819181614Skmacy 0xcc9a, 0x6f72, 820181614Skmacy 0xcc9b, 0x1002, 821181614Skmacy 0xcc9c, 0x28c5, 822181614Skmacy 0xcc9d, 0x3005, 823181614Skmacy 0xcc9e, 0x4178, 824181614Skmacy 0xcc9f, 0x5653, 825181614Skmacy 0xcca0, 0x384, 826181614Skmacy 0xcca1, 0x22b2, 827181614Skmacy 0xcca2, 0x3012, 828181614Skmacy 0xcca3, 0x1002, 829181614Skmacy 0xcca4, 0x2be5, 830181614Skmacy 0xcca5, 0x3005, 831181614Skmacy 0xcca6, 0x41e8, 832181614Skmacy 0xcca7, 0x5653, 833181614Skmacy 0xcca8, 0x382, 834181614Skmacy 0xcca9, 0x002, 835181614Skmacy 0xccaa, 0x4258, 836181614Skmacy 0xccab, 0x2474, 837181614Skmacy 0xccac, 0x3c84, 838181614Skmacy 0xccad, 0x6437, 839181614Skmacy 0xccae, 0xdff4, 840181614Skmacy 0xccaf, 0x6437, 841181614Skmacy 0xccb0, 0x2ff5, 842181614Skmacy 0xccb1, 0x3c05, 843181614Skmacy 0xccb2, 0x8757, 844181614Skmacy 0xccb3, 0xb888, 845181614Skmacy 0xccb4, 0x9787, 846181614Skmacy 0xccb5, 0xdff4, 847181614Skmacy 0xccb6, 0x6724, 848181614Skmacy 0xccb7, 0x866a, 849181614Skmacy 0xccb8, 0x6f72, 850181614Skmacy 0xccb9, 0x1002, 851181614Skmacy 0xccba, 0x2d01, 852181614Skmacy 0xccbb, 0x3011, 853181614Skmacy 0xccbc, 0x1001, 854181614Skmacy 0xccbd, 0xc620, 855181614Skmacy 0xccbe, 0x14e5, 856181614Skmacy 0xccbf, 0xc621, 857181614Skmacy 0xccc0, 0xc53d, 858181614Skmacy 0xccc1, 0xc622, 859181614Skmacy 0xccc2, 0x3cbe, 860181614Skmacy 0xccc3, 0xc623, 861181614Skmacy 0xccc4, 0x4452, 862181614Skmacy 0xccc5, 0xc624, 863181614Skmacy 0xccc6, 0xc5c5, 864181614Skmacy 0xccc7, 0xc625, 865181614Skmacy 0xccc8, 0xe01e, 866181614Skmacy 0xccc9, 0xc627, 867181614Skmacy 0xccca, 0x000, 868181614Skmacy 0xcccb, 0xc628, 869181614Skmacy 0xcccc, 0x000, 870181614Skmacy 0xcccd, 0xc62b, 871181614Skmacy 0xccce, 0x000, 872181614Skmacy 0xcccf, 0xc62c, 873181614Skmacy 0xccd0, 0x000, 874181614Skmacy 0xccd1, 0x000, 875181614Skmacy 0xccd2, 0x2d01, 876181614Skmacy 0xccd3, 0x3011, 877181614Skmacy 0xccd4, 0x1001, 878181614Skmacy 0xccd5, 0xc620, 879181614Skmacy 0xccd6, 0x000, 880181614Skmacy 0xccd7, 0xc621, 881181614Skmacy 0xccd8, 0x000, 882181614Skmacy 0xccd9, 0xc622, 883181614Skmacy 0xccda, 0x0ce, 884181614Skmacy 0xccdb, 0xc623, 885181614Skmacy 0xccdc, 0x07f, 886181614Skmacy 0xccdd, 0xc624, 887181614Skmacy 0xccde, 0x032, 888181614Skmacy 0xccdf, 0xc625, 889181614Skmacy 0xcce0, 0x000, 890181614Skmacy 0xcce1, 0xc627, 891181614Skmacy 0xcce2, 0x000, 892181614Skmacy 0xcce3, 0xc628, 893181614Skmacy 0xcce4, 0x000, 894181614Skmacy 0xcce5, 0xc62b, 895181614Skmacy 0xcce6, 0x000, 896181614Skmacy 0xcce7, 0xc62c, 897181614Skmacy 0xcce8, 0x000, 898181614Skmacy 0xcce9, 0x000, 899181614Skmacy 0xccea, 0x2d01, 900181614Skmacy 0xcceb, 0x3011, 901181614Skmacy 0xccec, 0x1001, 902181614Skmacy 0xcced, 0xc502, 903181614Skmacy 0xccee, 0x609f, 904181614Skmacy 0xccef, 0xc600, 905181614Skmacy 0xccf0, 0x2a6e, 906181614Skmacy 0xccf1, 0xc601, 907181614Skmacy 0xccf2, 0x2a2c, 908181614Skmacy 0xccf3, 0xc60c, 909181614Skmacy 0xccf4, 0x5400, 910181614Skmacy 0xccf5, 0xc710, 911181614Skmacy 0xccf6, 0x700, 912181614Skmacy 0xccf7, 0xc718, 913181614Skmacy 0xccf8, 0x700, 914181614Skmacy 0xccf9, 0xc720, 915181614Skmacy 0xccfa, 0x4700, 916181614Skmacy 0xccfb, 0xc728, 917181614Skmacy 0xccfc, 0x700, 918181614Skmacy 0xccfd, 0xc729, 919181614Skmacy 0xccfe, 0x1207, 920181614Skmacy 0xccff, 0xc801, 921181614Skmacy 0xcd00, 0x7f50, 922181614Skmacy 0xcd01, 0xc802, 923181614Skmacy 0xcd02, 0x7760, 924181614Skmacy 0xcd03, 0xc803, 925181614Skmacy 0xcd04, 0x7fce, 926181614Skmacy 0xcd05, 0xc804, 927181614Skmacy 0xcd06, 0x520e, 928181614Skmacy 0xcd07, 0xc805, 929181614Skmacy 0xcd08, 0x5c11, 930181614Skmacy 0xcd09, 0xc806, 931181614Skmacy 0xcd0a, 0x3c51, 932181614Skmacy 0xcd0b, 0xc807, 933181614Skmacy 0xcd0c, 0x4061, 934181614Skmacy 0xcd0d, 0xc808, 935181614Skmacy 0xcd0e, 0x49c1, 936181614Skmacy 0xcd0f, 0xc809, 937181614Skmacy 0xcd10, 0x3840, 938181614Skmacy 0xcd11, 0xc80a, 939181614Skmacy 0xcd12, 0x000, 940181614Skmacy 0xcd13, 0xc821, 941181614Skmacy 0xcd14, 0x002, 942181614Skmacy 0xcd15, 0xc822, 943181614Skmacy 0xcd16, 0x046, 944181614Skmacy 0xcd17, 0xc844, 945181614Skmacy 0xcd18, 0x182f, 946181614Skmacy 0xcd19, 0xc013, 947181614Skmacy 0xcd1a, 0xf341, 948181614Skmacy 0xcd1b, 0xc01a, 949181614Skmacy 0xcd1c, 0x446, 950181614Skmacy 0xcd1d, 0xc024, 951181614Skmacy 0xcd1e, 0x1000, 952181614Skmacy 0xcd1f, 0xc025, 953181614Skmacy 0xcd20, 0xa00, 954181614Skmacy 0xcd21, 0xc026, 955181614Skmacy 0xcd22, 0xc0c, 956181614Skmacy 0xcd23, 0xc027, 957181614Skmacy 0xcd24, 0xc0c, 958181614Skmacy 0xcd25, 0xc029, 959181614Skmacy 0xcd26, 0x0a0, 960181614Skmacy 0xcd27, 0xc030, 961181614Skmacy 0xcd28, 0xa00, 962181614Skmacy 0xcd29, 0xc03c, 963181614Skmacy 0xcd2a, 0x01c, 964181614Skmacy 0xcd2b, 0x000, 965181614Skmacy 0xcd2c, 0x2b84, 966181614Skmacy 0xcd2d, 0x3c74, 967181614Skmacy 0xcd2e, 0x6435, 968181614Skmacy 0xcd2f, 0xdff4, 969181614Skmacy 0xcd30, 0x6435, 970181614Skmacy 0xcd31, 0x2806, 971181614Skmacy 0xcd32, 0x3006, 972181614Skmacy 0xcd33, 0x8565, 973181614Skmacy 0xcd34, 0x2b24, 974181614Skmacy 0xcd35, 0x3c24, 975181614Skmacy 0xcd36, 0x6436, 976181614Skmacy 0xcd37, 0x1002, 977181614Skmacy 0xcd38, 0x2b24, 978181614Skmacy 0xcd39, 0x3c24, 979181614Skmacy 0xcd3a, 0x6436, 980181614Skmacy 0xcd3b, 0x4045, 981181614Skmacy 0xcd3c, 0x8656, 982181614Skmacy 0xcd3d, 0x1002, 983181614Skmacy 0xcd3e, 0x2807, 984181614Skmacy 0xcd3f, 0x31a7, 985181614Skmacy 0xcd40, 0x20c4, 986181614Skmacy 0xcd41, 0x3c24, 987181614Skmacy 0xcd42, 0x6724, 988181614Skmacy 0xcd43, 0x1002, 989181614Skmacy 0xcd44, 0x2807, 990181614Skmacy 0xcd45, 0x3187, 991181614Skmacy 0xcd46, 0x20c4, 992181614Skmacy 0xcd47, 0x3c24, 993181614Skmacy 0xcd48, 0x6724, 994181614Skmacy 0xcd49, 0x1002, 995181614Skmacy 0xcd4a, 0x2514, 996181614Skmacy 0xcd4b, 0x3c64, 997181614Skmacy 0xcd4c, 0x6436, 998181614Skmacy 0xcd4d, 0xdff4, 999181614Skmacy 0xcd4e, 0x6436, 1000181614Skmacy 0xcd4f, 0x1002, 1001181614Skmacy 0xcd50, 0x2806, 1002181614Skmacy 0xcd51, 0x3cb6, 1003181614Skmacy 0xcd52, 0xc161, 1004181614Skmacy 0xcd53, 0x6134, 1005181614Skmacy 0xcd54, 0x6135, 1006181614Skmacy 0xcd55, 0x5443, 1007181614Skmacy 0xcd56, 0x303, 1008181614Skmacy 0xcd57, 0x6524, 1009181614Skmacy 0xcd58, 0x00b, 1010181614Skmacy 0xcd59, 0x1002, 1011181614Skmacy 0xcd5a, 0xd019, 1012181614Skmacy 0xcd5b, 0x2104, 1013181614Skmacy 0xcd5c, 0x3c24, 1014181614Skmacy 0xcd5d, 0x2105, 1015181614Skmacy 0xcd5e, 0x3805, 1016181614Skmacy 0xcd5f, 0x6524, 1017181614Skmacy 0xcd60, 0xdff4, 1018181614Skmacy 0xcd61, 0x4005, 1019181614Skmacy 0xcd62, 0x6524, 1020181614Skmacy 0xcd63, 0x2e8d, 1021181614Skmacy 0xcd64, 0x303d, 1022181614Skmacy 0xcd65, 0x5dd3, 1023181614Skmacy 0xcd66, 0x306, 1024181614Skmacy 0xcd67, 0x2ff7, 1025181614Skmacy 0xcd68, 0x38f7, 1026181614Skmacy 0xcd69, 0x60b7, 1027181614Skmacy 0xcd6a, 0xdffd, 1028181614Skmacy 0xcd6b, 0x00a, 1029181614Skmacy 0xcd6c, 0x1002, 1030181614Skmacy 0xcd6d, 0 1031181614Skmacy }; 1032181614Skmacy int i, err; 1033181614Skmacy 1034181614Skmacy err = set_phy_regs(phy, regs); 1035181614Skmacy if (!err && modtype == phy_modtype_twinax_long) 1036181614Skmacy err = set_phy_regs(phy, preemphasis); 1037181614Skmacy if (err) 1038181614Skmacy return err; 1039181614Skmacy 1040181614Skmacy msleep(50); 1041181614Skmacy 1042181614Skmacy for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) 1043181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], 1044181614Skmacy twinax_edc[i + 1]); 1045181614Skmacy if (!err) 1046181614Skmacy phy->priv = edc_twinax; 1047181614Skmacy return err; 1048181614Skmacy} 1049181614Skmacy 1050181614Skmacystatic int ael2005_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) 1051181614Skmacy{ 1052181614Skmacy int i, err; 1053181614Skmacy unsigned int stat, data; 1054181614Skmacy 1055181614Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL_I2C_CTRL, 1056181614Skmacy (dev_addr << 8) | (1 << 8) | word_addr); 1057181614Skmacy if (err) 1058181614Skmacy return err; 1059181614Skmacy 1060181614Skmacy for (i = 0; i < 5; i++) { 1061181614Skmacy msleep(1); 1062181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_STAT, &stat); 1063181614Skmacy if (err) 1064181614Skmacy return err; 1065181614Skmacy if ((stat & 3) == 1) { 1066181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL_I2C_DATA, 1067181614Skmacy &data); 1068181614Skmacy if (err) 1069181614Skmacy return err; 1070181614Skmacy return data >> 8; 1071181614Skmacy } 1072181614Skmacy } 1073181614Skmacy CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n", 1074181614Skmacy phy->addr, word_addr); 1075181614Skmacy return -ETIMEDOUT; 1076181614Skmacy} 1077181614Skmacy 1078186282Sgnnstatic int ael2005_get_module_type(struct cphy *phy, int delay_ms) 1079181614Skmacy{ 1080181614Skmacy int v; 1081181614Skmacy unsigned int stat; 1082181614Skmacy 1083181614Skmacy v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); 1084181614Skmacy if (v) 1085181614Skmacy return v; 1086181614Skmacy 1087181614Skmacy if (stat & (1 << 8)) /* module absent */ 1088181614Skmacy return phy_modtype_none; 1089181614Skmacy 1090181614Skmacy if (delay_ms) 1091181614Skmacy msleep(delay_ms); 1092181614Skmacy 1093186282Sgnn return get_module_type(phy, 0); 1094181614Skmacy 1095181614Skmacy} 1096181614Skmacy 1097181614Skmacystatic int ael2005_intr_enable(struct cphy *phy) 1098181614Skmacy{ 1099181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); 1100181614Skmacy return err ? err : t3_phy_lasi_intr_enable(phy); 1101181614Skmacy} 1102181614Skmacy 1103181614Skmacystatic int ael2005_intr_disable(struct cphy *phy) 1104181614Skmacy{ 1105181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x100); 1106181614Skmacy return err ? err : t3_phy_lasi_intr_disable(phy); 1107181614Skmacy} 1108181614Skmacy 1109181614Skmacystatic int ael2005_intr_clear(struct cphy *phy) 1110181614Skmacy{ 1111181614Skmacy int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0xd00); 1112181614Skmacy return err ? err : t3_phy_lasi_intr_clear(phy); 1113181614Skmacy} 1114181614Skmacy 1115180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 1116180583Skmacy{ 1117180583Skmacy static struct reg_val regs0[] = { 1118180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 1119180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 1120180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 1121180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1122180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 1123180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 1124180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 1125180583Skmacy { 0, 0, 0, 0 } 1126180583Skmacy }; 1127180583Skmacy static struct reg_val regs1[] = { 1128180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 1129180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 1130180583Skmacy { 0, 0, 0, 0 } 1131180583Skmacy }; 1132180583Skmacy 1133181614Skmacy int err, lasi_ctrl; 1134180583Skmacy 1135181614Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); 1136181614Skmacy if (err) 1137181614Skmacy return err; 1138181614Skmacy 1139180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 1140180583Skmacy if (err) 1141180583Skmacy return err; 1142180583Skmacy 1143180583Skmacy msleep(125); 1144181614Skmacy phy->priv = edc_none; 1145180583Skmacy err = set_phy_regs(phy, regs0); 1146180583Skmacy if (err) 1147180583Skmacy return err; 1148180583Skmacy 1149180583Skmacy msleep(50); 1150181614Skmacy 1151186282Sgnn err = ael2005_get_module_type(phy, 0); 1152181614Skmacy if (err < 0) 1153181614Skmacy return err; 1154181614Skmacy phy->modtype = (u8)err; 1155181614Skmacy 1156181614Skmacy if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) 1157181614Skmacy err = ael2005_setup_twinax_edc(phy, err); 1158181614Skmacy else 1159181614Skmacy err = ael2005_setup_sr_edc(phy); 1160180583Skmacy if (err) 1161180583Skmacy return err; 1162180583Skmacy 1163181614Skmacy err = set_phy_regs(phy, regs1); 1164180583Skmacy if (err) 1165180583Skmacy return err; 1166180583Skmacy 1167181614Skmacy /* reset wipes out interrupts, reenable them if they were on */ 1168181614Skmacy if (lasi_ctrl & 1) 1169181614Skmacy err = ael2005_intr_enable(phy); 1170181614Skmacy return err; 1171180583Skmacy} 1172180583Skmacy 1173181614Skmacystatic int ael2005_intr_handler(struct cphy *phy) 1174181614Skmacy{ 1175181614Skmacy unsigned int stat; 1176181614Skmacy int ret, edc_needed, cause = 0; 1177181614Skmacy 1178181614Skmacy ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_STAT, &stat); 1179181614Skmacy if (ret) 1180181614Skmacy return ret; 1181181614Skmacy 1182181614Skmacy if (stat & AEL2005_MODDET_IRQ) { 1183181614Skmacy ret = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 1184181614Skmacy 0xd00); 1185181614Skmacy if (ret) 1186181614Skmacy return ret; 1187181614Skmacy 1188181614Skmacy /* modules have max 300 ms init time after hot plug */ 1189186282Sgnn ret = ael2005_get_module_type(phy, 300); 1190181614Skmacy if (ret < 0) 1191181614Skmacy return ret; 1192181614Skmacy 1193181614Skmacy phy->modtype = (u8)ret; 1194181614Skmacy if (ret == phy_modtype_none) 1195181614Skmacy edc_needed = phy->priv; /* on unplug retain EDC */ 1196181614Skmacy else if (ret == phy_modtype_twinax || 1197181614Skmacy ret == phy_modtype_twinax_long) 1198181614Skmacy edc_needed = edc_twinax; 1199181614Skmacy else 1200181614Skmacy edc_needed = edc_sr; 1201181614Skmacy 1202181614Skmacy if (edc_needed != phy->priv) { 1203181614Skmacy ret = ael2005_reset(phy, 0); 1204181614Skmacy return ret ? ret : cphy_cause_module_change; 1205181614Skmacy } 1206181614Skmacy cause = cphy_cause_module_change; 1207181614Skmacy } 1208181614Skmacy 1209181614Skmacy ret = t3_phy_lasi_intr_handler(phy); 1210181614Skmacy return ret < 0 ? ret : ret + cause; 1211181614Skmacy} 1212181614Skmacy 1213167514Skmacy#ifdef C99_NOT_SUPPORTED 1214180583Skmacystatic struct cphy_ops ael2005_ops = { 1215180583Skmacy ael2005_reset, 1216181614Skmacy ael2005_intr_enable, 1217181614Skmacy ael2005_intr_disable, 1218181614Skmacy ael2005_intr_clear, 1219181614Skmacy ael2005_intr_handler, 1220180583Skmacy NULL, 1221180583Skmacy NULL, 1222180583Skmacy NULL, 1223180583Skmacy NULL, 1224180583Skmacy NULL, 1225181614Skmacy get_link_status_r, 1226180583Skmacy ael1002_power_down, 1227180583Skmacy}; 1228180583Skmacy#else 1229180583Skmacystatic struct cphy_ops ael2005_ops = { 1230180583Skmacy .reset = ael2005_reset, 1231181614Skmacy .intr_enable = ael2005_intr_enable, 1232181614Skmacy .intr_disable = ael2005_intr_disable, 1233181614Skmacy .intr_clear = ael2005_intr_clear, 1234181614Skmacy .intr_handler = ael2005_intr_handler, 1235181614Skmacy .get_link_status = get_link_status_r, 1236180583Skmacy .power_down = ael1002_power_down, 1237180583Skmacy}; 1238180583Skmacy#endif 1239180583Skmacy 1240180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1241180583Skmacy const struct mdio_ops *mdio_ops) 1242180583Skmacy{ 1243186282Sgnn int err; 1244180583Skmacy cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops, 1245181614Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | 1246181614Skmacy SUPPORTED_IRQ, "10GBASE-R"); 1247180583Skmacy msleep(125); 1248186282Sgnn 1249186282Sgnn err = ael2005_get_module_type(phy, 0); 1250186282Sgnn if (err >= 0) 1251186282Sgnn phy->modtype = err; 1252186282Sgnn 1253180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 1254180583Skmacy 1 << 5); 1255180583Skmacy} 1256180583Skmacy 1257181614Skmacy/* 1258181614Skmacy * Get link status for a 10GBASE-X device. 1259181614Skmacy */ 1260181614Skmacystatic int get_link_status_x(struct cphy *phy, int *link_ok, int *speed, 1261181614Skmacy int *duplex, int *fc) 1262181614Skmacy{ 1263181614Skmacy if (link_ok) { 1264181614Skmacy unsigned int stat0, stat1, stat2; 1265181614Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, PMD_RSD, &stat0); 1266181614Skmacy 1267181614Skmacy if (!err) 1268181614Skmacy err = mdio_read(phy, MDIO_DEV_PCS, PCS_STAT1_X, &stat1); 1269181614Skmacy if (!err) 1270181614Skmacy err = mdio_read(phy, MDIO_DEV_XGXS, XS_LN_STAT, &stat2); 1271181614Skmacy if (err) 1272181614Skmacy return err; 1273181614Skmacy *link_ok = (stat0 & (stat1 >> 12) & (stat2 >> 12)) & 1; 1274181614Skmacy } 1275181614Skmacy if (speed) 1276181614Skmacy *speed = SPEED_10000; 1277181614Skmacy if (duplex) 1278181614Skmacy *duplex = DUPLEX_FULL; 1279181614Skmacy return 0; 1280181614Skmacy} 1281181614Skmacy 1282180583Skmacy#ifdef C99_NOT_SUPPORTED 1283167514Skmacystatic struct cphy_ops qt2045_ops = { 1284167514Skmacy ael1006_reset, 1285180583Skmacy t3_phy_lasi_intr_enable, 1286180583Skmacy t3_phy_lasi_intr_disable, 1287180583Skmacy t3_phy_lasi_intr_clear, 1288180583Skmacy t3_phy_lasi_intr_handler, 1289167514Skmacy NULL, 1290167514Skmacy NULL, 1291167514Skmacy NULL, 1292167514Skmacy NULL, 1293167514Skmacy NULL, 1294181614Skmacy get_link_status_x, 1295167514Skmacy ael1006_power_down, 1296167514Skmacy}; 1297167514Skmacy#else 1298167514Skmacystatic struct cphy_ops qt2045_ops = { 1299167514Skmacy .reset = ael1006_reset, 1300180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 1301180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 1302180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 1303180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 1304181614Skmacy .get_link_status = get_link_status_x, 1305167514Skmacy .power_down = ael1006_power_down, 1306167514Skmacy}; 1307167514Skmacy#endif 1308167514Skmacy 1309176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1310176472Skmacy const struct mdio_ops *mdio_ops) 1311167514Skmacy{ 1312167514Skmacy unsigned int stat; 1313167514Skmacy 1314176472Skmacy cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops, 1315176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1316176472Skmacy "10GBASE-CX4"); 1317167514Skmacy 1318167514Skmacy /* 1319167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 1320167514Skmacy * have it at 1. 1321167514Skmacy */ 1322167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 1323167514Skmacy stat == 0xffff) 1324167514Skmacy phy->addr = 1; 1325176472Skmacy return 0; 1326167514Skmacy} 1327167514Skmacy 1328167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 1329167514Skmacy{ 1330167514Skmacy return 0; 1331167514Skmacy} 1332167514Skmacy 1333167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, 1334167514Skmacy int *speed, int *duplex, int *fc) 1335167514Skmacy{ 1336167514Skmacy if (link_ok) { 1337167514Skmacy unsigned int status; 1338167514Skmacy 1339167514Skmacy status = t3_read_reg(phy->adapter, 1340170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 1341170654Skmacy t3_read_reg(phy->adapter, 1342170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 1343170654Skmacy t3_read_reg(phy->adapter, 1344170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 1345170654Skmacy t3_read_reg(phy->adapter, 1346170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 1347167514Skmacy *link_ok = !(status & F_LOWSIG0); 1348167514Skmacy } 1349167514Skmacy if (speed) 1350167514Skmacy *speed = SPEED_10000; 1351167514Skmacy if (duplex) 1352167514Skmacy *duplex = DUPLEX_FULL; 1353167514Skmacy return 0; 1354167514Skmacy} 1355167514Skmacy 1356167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 1357167514Skmacy{ 1358167514Skmacy return 0; 1359167514Skmacy} 1360167514Skmacy 1361167514Skmacy#ifdef C99_NOT_SUPPORTED 1362167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1363167514Skmacy xaui_direct_reset, 1364167514Skmacy ael1002_intr_noop, 1365167514Skmacy ael1002_intr_noop, 1366167514Skmacy ael1002_intr_noop, 1367167514Skmacy ael1002_intr_noop, 1368167514Skmacy NULL, 1369167514Skmacy NULL, 1370167514Skmacy NULL, 1371167514Skmacy NULL, 1372167514Skmacy NULL, 1373167514Skmacy xaui_direct_get_link_status, 1374167514Skmacy xaui_direct_power_down, 1375167514Skmacy}; 1376167514Skmacy#else 1377167514Skmacystatic struct cphy_ops xaui_direct_ops = { 1378167514Skmacy .reset = xaui_direct_reset, 1379167514Skmacy .intr_enable = ael1002_intr_noop, 1380167514Skmacy .intr_disable = ael1002_intr_noop, 1381167514Skmacy .intr_clear = ael1002_intr_noop, 1382167514Skmacy .intr_handler = ael1002_intr_noop, 1383167514Skmacy .get_link_status = xaui_direct_get_link_status, 1384167514Skmacy .power_down = xaui_direct_power_down, 1385167514Skmacy}; 1386167514Skmacy#endif 1387167514Skmacy 1388176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1389176472Skmacy const struct mdio_ops *mdio_ops) 1390167514Skmacy{ 1391176472Skmacy cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, 1392176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 1393176472Skmacy "10GBASE-CX4"); 1394176472Skmacy return 0; 1395167514Skmacy} 1396