cxgb_ael1002.c revision 180583
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 180583 2008-07-18 06:12:31Z kmacy $"); 32167514Skmacy 33170076Skmacy#ifdef CONFIG_DEFINED 34170076Skmacy#include <cxgb_include.h> 35170076Skmacy#else 36170076Skmacy#include <dev/cxgb/cxgb_include.h> 37170076Skmacy#endif 38167514Skmacy 39176472Skmacy#undef msleep 40176472Skmacy#define msleep t3_os_sleep 41176472Skmacy 42167514Skmacyenum { 43167514Skmacy AEL100X_TX_DISABLE = 9, 44167514Skmacy AEL100X_TX_CONFIG1 = 0xc002, 45167514Skmacy AEL1002_PWR_DOWN_HI = 0xc011, 46167514Skmacy AEL1002_PWR_DOWN_LO = 0xc012, 47167514Skmacy AEL1002_XFI_EQL = 0xc015, 48167514Skmacy AEL1002_LB_EN = 0xc017, 49180583Skmacy AEL_OPT_SETTINGS = 0xc017, 50180583Skmacy}; 51167514Skmacy 52180583Skmacystruct reg_val { 53180583Skmacy unsigned short mmd_addr; 54180583Skmacy unsigned short reg_addr; 55180583Skmacy unsigned short clear_bits; 56180583Skmacy unsigned short set_bits; 57167514Skmacy}; 58167514Skmacy 59180583Skmacystatic int set_phy_regs(struct cphy *phy, const struct reg_val *rv) 60180583Skmacy{ 61180583Skmacy int err; 62180583Skmacy 63180583Skmacy for (err = 0; rv->mmd_addr && !err; rv++) { 64180583Skmacy if (rv->clear_bits == 0xffff) 65180583Skmacy err = mdio_write(phy, rv->mmd_addr, rv->reg_addr, 66180583Skmacy rv->set_bits); 67180583Skmacy else 68180583Skmacy err = t3_mdio_change_bits(phy, rv->mmd_addr, 69180583Skmacy rv->reg_addr, rv->clear_bits, 70180583Skmacy rv->set_bits); 71180583Skmacy } 72180583Skmacy return err; 73180583Skmacy} 74180583Skmacy 75167514Skmacystatic void ael100x_txon(struct cphy *phy) 76167514Skmacy{ 77167514Skmacy int tx_on_gpio = phy->addr == 0 ? F_GPIO7_OUT_VAL : F_GPIO2_OUT_VAL; 78167514Skmacy 79176472Skmacy msleep(100); 80167514Skmacy t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, 0, tx_on_gpio); 81176472Skmacy msleep(30); 82167514Skmacy} 83167514Skmacy 84167514Skmacystatic int ael1002_power_down(struct cphy *phy, int enable) 85167514Skmacy{ 86167514Skmacy int err; 87167514Skmacy 88167514Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_DISABLE, !!enable); 89167514Skmacy if (!err) 90167514Skmacy err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 91167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 92167514Skmacy return err; 93167514Skmacy} 94167514Skmacy 95167514Skmacystatic int ael1002_reset(struct cphy *phy, int wait) 96167514Skmacy{ 97167514Skmacy int err; 98167514Skmacy 99167514Skmacy if ((err = ael1002_power_down(phy, 0)) || 100167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL100X_TX_CONFIG1, 1)) || 101167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_HI, 0)) || 102167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_PWR_DOWN_LO, 0)) || 103167514Skmacy (err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL1002_XFI_EQL, 0x18)) || 104167514Skmacy (err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL1002_LB_EN, 105167514Skmacy 0, 1 << 5))) 106167514Skmacy return err; 107167514Skmacy return 0; 108167514Skmacy} 109167514Skmacy 110167514Skmacystatic int ael1002_intr_noop(struct cphy *phy) 111167514Skmacy{ 112167514Skmacy return 0; 113167514Skmacy} 114167514Skmacy 115167514Skmacystatic int ael100x_get_link_status(struct cphy *phy, int *link_ok, 116167514Skmacy int *speed, int *duplex, int *fc) 117167514Skmacy{ 118167514Skmacy if (link_ok) { 119167514Skmacy unsigned int status; 120167514Skmacy int err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &status); 121167514Skmacy 122167514Skmacy /* 123167514Skmacy * BMSR_LSTATUS is latch-low, so if it is 0 we need to read it 124167514Skmacy * once more to get the current link state. 125167514Skmacy */ 126167514Skmacy if (!err && !(status & BMSR_LSTATUS)) 127167514Skmacy err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, 128167514Skmacy &status); 129167514Skmacy if (err) 130167514Skmacy return err; 131167514Skmacy *link_ok = !!(status & BMSR_LSTATUS); 132167514Skmacy } 133167514Skmacy if (speed) 134167514Skmacy *speed = SPEED_10000; 135167514Skmacy if (duplex) 136167514Skmacy *duplex = DUPLEX_FULL; 137167514Skmacy return 0; 138167514Skmacy} 139167514Skmacy 140167514Skmacy#ifdef C99_NOT_SUPPORTED 141167514Skmacystatic struct cphy_ops ael1002_ops = { 142167514Skmacy ael1002_reset, 143167514Skmacy ael1002_intr_noop, 144167514Skmacy ael1002_intr_noop, 145167514Skmacy ael1002_intr_noop, 146167514Skmacy ael1002_intr_noop, 147167514Skmacy NULL, 148167514Skmacy NULL, 149167514Skmacy NULL, 150167514Skmacy NULL, 151167514Skmacy NULL, 152167514Skmacy ael100x_get_link_status, 153167514Skmacy ael1002_power_down, 154167514Skmacy}; 155167514Skmacy#else 156167514Skmacystatic struct cphy_ops ael1002_ops = { 157167514Skmacy .reset = ael1002_reset, 158167514Skmacy .intr_enable = ael1002_intr_noop, 159167514Skmacy .intr_disable = ael1002_intr_noop, 160167514Skmacy .intr_clear = ael1002_intr_noop, 161167514Skmacy .intr_handler = ael1002_intr_noop, 162167514Skmacy .get_link_status = ael100x_get_link_status, 163167514Skmacy .power_down = ael1002_power_down, 164167514Skmacy}; 165167514Skmacy#endif 166167514Skmacy 167176472Skmacyint t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 168176472Skmacy const struct mdio_ops *mdio_ops) 169167514Skmacy{ 170176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops, 171176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 172177340Skmacy "10GBASE-R"); 173167514Skmacy ael100x_txon(phy); 174176472Skmacy return 0; 175167514Skmacy} 176167514Skmacy 177167514Skmacystatic int ael1006_reset(struct cphy *phy, int wait) 178167514Skmacy{ 179167514Skmacy return t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); 180167514Skmacy} 181167514Skmacy 182167514Skmacystatic int ael1006_power_down(struct cphy *phy, int enable) 183167514Skmacy{ 184167514Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 185167514Skmacy BMCR_PDOWN, enable ? BMCR_PDOWN : 0); 186167514Skmacy} 187167514Skmacy 188167514Skmacy#ifdef C99_NOT_SUPPORTED 189167514Skmacystatic struct cphy_ops ael1006_ops = { 190167514Skmacy ael1006_reset, 191180583Skmacy t3_phy_lasi_intr_enable, 192180583Skmacy t3_phy_lasi_intr_disable, 193180583Skmacy t3_phy_lasi_intr_clear, 194180583Skmacy t3_phy_lasi_intr_handler, 195167514Skmacy NULL, 196167514Skmacy NULL, 197167514Skmacy NULL, 198167514Skmacy NULL, 199167514Skmacy NULL, 200167514Skmacy ael100x_get_link_status, 201167514Skmacy ael1006_power_down, 202167514Skmacy}; 203167514Skmacy#else 204167514Skmacystatic struct cphy_ops ael1006_ops = { 205167514Skmacy .reset = ael1006_reset, 206180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 207180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 208180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 209180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 210167514Skmacy .get_link_status = ael100x_get_link_status, 211167514Skmacy .power_down = ael1006_power_down, 212167514Skmacy}; 213167514Skmacy#endif 214167514Skmacy 215176472Skmacyint t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 216176472Skmacy const struct mdio_ops *mdio_ops) 217167514Skmacy{ 218176472Skmacy cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops, 219176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 220176472Skmacy "10GBASE-SR"); 221167514Skmacy ael100x_txon(phy); 222176472Skmacy return 0; 223167514Skmacy} 224167514Skmacy 225180583Skmacystatic int ael2005_setup_sr_edc(struct cphy *phy) 226180583Skmacy{ 227180583Skmacy static u16 sr_edc[] = { 228180583Skmacy 0xcc00, 0x2ff4, 229180583Skmacy 0xcc01, 0x3cd4, 230180583Skmacy 0xcc02, 0x2015, 231180583Skmacy 0xcc03, 0x3105, 232180583Skmacy 0xcc04, 0x6524, 233180583Skmacy 0xcc05, 0x27ff, 234180583Skmacy 0xcc06, 0x300f, 235180583Skmacy 0xcc07, 0x2c8b, 236180583Skmacy 0xcc08, 0x300b, 237180583Skmacy 0xcc09, 0x4009, 238180583Skmacy 0xcc0a, 0x400e, 239180583Skmacy 0xcc0b, 0x2f72, 240180583Skmacy 0xcc0c, 0x3002, 241180583Skmacy 0xcc0d, 0x1002, 242180583Skmacy 0xcc0e, 0x2172, 243180583Skmacy 0xcc0f, 0x3012, 244180583Skmacy 0xcc10, 0x1002, 245180583Skmacy 0xcc11, 0x25d2, 246180583Skmacy 0xcc12, 0x3012, 247180583Skmacy 0xcc13, 0x1002, 248180583Skmacy 0xcc14, 0xd01e, 249180583Skmacy 0xcc15, 0x27d2, 250180583Skmacy 0xcc16, 0x3012, 251180583Skmacy 0xcc17, 0x1002, 252180583Skmacy 0xcc18, 0x2004, 253180583Skmacy 0xcc19, 0x3c84, 254180583Skmacy 0xcc1a, 0x6436, 255180583Skmacy 0xcc1b, 0x2007, 256180583Skmacy 0xcc1c, 0x3f87, 257180583Skmacy 0xcc1d, 0x8676, 258180583Skmacy 0xcc1e, 0x40b7, 259180583Skmacy 0xcc1f, 0xa746, 260180583Skmacy 0xcc20, 0x4047, 261180583Skmacy 0xcc21, 0x5673, 262180583Skmacy 0xcc22, 0x2982, 263180583Skmacy 0xcc23, 0x3002, 264180583Skmacy 0xcc24, 0x13d2, 265180583Skmacy 0xcc25, 0x8bbd, 266180583Skmacy 0xcc26, 0x2862, 267180583Skmacy 0xcc27, 0x3012, 268180583Skmacy 0xcc28, 0x1002, 269180583Skmacy 0xcc29, 0x2092, 270180583Skmacy 0xcc2a, 0x3012, 271180583Skmacy 0xcc2b, 0x1002, 272180583Skmacy 0xcc2c, 0x5cc3, 273180583Skmacy 0xcc2d, 0x314, 274180583Skmacy 0xcc2e, 0x2942, 275180583Skmacy 0xcc2f, 0x3002, 276180583Skmacy 0xcc30, 0x1002, 277180583Skmacy 0xcc31, 0xd019, 278180583Skmacy 0xcc32, 0x2032, 279180583Skmacy 0xcc33, 0x3012, 280180583Skmacy 0xcc34, 0x1002, 281180583Skmacy 0xcc35, 0x2a04, 282180583Skmacy 0xcc36, 0x3c74, 283180583Skmacy 0xcc37, 0x6435, 284180583Skmacy 0xcc38, 0x2fa4, 285180583Skmacy 0xcc39, 0x3cd4, 286180583Skmacy 0xcc3a, 0x6624, 287180583Skmacy 0xcc3b, 0x5563, 288180583Skmacy 0xcc3c, 0x2d42, 289180583Skmacy 0xcc3d, 0x3002, 290180583Skmacy 0xcc3e, 0x13d2, 291180583Skmacy 0xcc3f, 0x464d, 292180583Skmacy 0xcc40, 0x2862, 293180583Skmacy 0xcc41, 0x3012, 294180583Skmacy 0xcc42, 0x1002, 295180583Skmacy 0xcc43, 0x2032, 296180583Skmacy 0xcc44, 0x3012, 297180583Skmacy 0xcc45, 0x1002, 298180583Skmacy 0xcc46, 0x2fb4, 299180583Skmacy 0xcc47, 0x3cd4, 300180583Skmacy 0xcc48, 0x6624, 301180583Skmacy 0xcc49, 0x5563, 302180583Skmacy 0xcc4a, 0x2d42, 303180583Skmacy 0xcc4b, 0x3002, 304180583Skmacy 0xcc4c, 0x13d2, 305180583Skmacy 0xcc4d, 0x2ed2, 306180583Skmacy 0xcc4e, 0x3002, 307180583Skmacy 0xcc4f, 0x1002, 308180583Skmacy 0xcc50, 0x2fd2, 309180583Skmacy 0xcc51, 0x3002, 310180583Skmacy 0xcc52, 0x1002, 311180583Skmacy 0xcc53, 0x004, 312180583Skmacy 0xcc54, 0x2942, 313180583Skmacy 0xcc55, 0x3002, 314180583Skmacy 0xcc56, 0x1002, 315180583Skmacy 0xcc57, 0x2092, 316180583Skmacy 0xcc58, 0x3012, 317180583Skmacy 0xcc59, 0x1002, 318180583Skmacy 0xcc5a, 0x5cc3, 319180583Skmacy 0xcc5b, 0x317, 320180583Skmacy 0xcc5c, 0x2f72, 321180583Skmacy 0xcc5d, 0x3002, 322180583Skmacy 0xcc5e, 0x1002, 323180583Skmacy 0xcc5f, 0x2942, 324180583Skmacy 0xcc60, 0x3002, 325180583Skmacy 0xcc61, 0x1002, 326180583Skmacy 0xcc62, 0x22cd, 327180583Skmacy 0xcc63, 0x301d, 328180583Skmacy 0xcc64, 0x2862, 329180583Skmacy 0xcc65, 0x3012, 330180583Skmacy 0xcc66, 0x1002, 331180583Skmacy 0xcc67, 0x2ed2, 332180583Skmacy 0xcc68, 0x3002, 333180583Skmacy 0xcc69, 0x1002, 334180583Skmacy 0xcc6a, 0x2d72, 335180583Skmacy 0xcc6b, 0x3002, 336180583Skmacy 0xcc6c, 0x1002, 337180583Skmacy 0xcc6d, 0x628f, 338180583Skmacy 0xcc6e, 0x2112, 339180583Skmacy 0xcc6f, 0x3012, 340180583Skmacy 0xcc70, 0x1002, 341180583Skmacy 0xcc71, 0x5aa3, 342180583Skmacy 0xcc72, 0x2dc2, 343180583Skmacy 0xcc73, 0x3002, 344180583Skmacy 0xcc74, 0x1312, 345180583Skmacy 0xcc75, 0x6f72, 346180583Skmacy 0xcc76, 0x1002, 347180583Skmacy 0xcc77, 0x2807, 348180583Skmacy 0xcc78, 0x31a7, 349180583Skmacy 0xcc79, 0x20c4, 350180583Skmacy 0xcc7a, 0x3c24, 351180583Skmacy 0xcc7b, 0x6724, 352180583Skmacy 0xcc7c, 0x1002, 353180583Skmacy 0xcc7d, 0x2807, 354180583Skmacy 0xcc7e, 0x3187, 355180583Skmacy 0xcc7f, 0x20c4, 356180583Skmacy 0xcc80, 0x3c24, 357180583Skmacy 0xcc81, 0x6724, 358180583Skmacy 0xcc82, 0x1002, 359180583Skmacy 0xcc83, 0x2514, 360180583Skmacy 0xcc84, 0x3c64, 361180583Skmacy 0xcc85, 0x6436, 362180583Skmacy 0xcc86, 0xdff4, 363180583Skmacy 0xcc87, 0x6436, 364180583Skmacy 0xcc88, 0x1002, 365180583Skmacy 0xcc89, 0x40a4, 366180583Skmacy 0xcc8a, 0x643c, 367180583Skmacy 0xcc8b, 0x4016, 368180583Skmacy 0xcc8c, 0x8c6c, 369180583Skmacy 0xcc8d, 0x2b24, 370180583Skmacy 0xcc8e, 0x3c24, 371180583Skmacy 0xcc8f, 0x6435, 372180583Skmacy 0xcc90, 0x1002, 373180583Skmacy 0xcc91, 0x2b24, 374180583Skmacy 0xcc92, 0x3c24, 375180583Skmacy 0xcc93, 0x643a, 376180583Skmacy 0xcc94, 0x4025, 377180583Skmacy 0xcc95, 0x8a5a, 378180583Skmacy 0xcc96, 0x1002, 379180583Skmacy 0xcc97, 0x2731, 380180583Skmacy 0xcc98, 0x3011, 381180583Skmacy 0xcc99, 0x1001, 382180583Skmacy 0xcc9a, 0xc7a0, 383180583Skmacy 0xcc9b, 0x100, 384180583Skmacy 0xcc9c, 0xc502, 385180583Skmacy 0xcc9d, 0x53ac, 386180583Skmacy 0xcc9e, 0xc503, 387180583Skmacy 0xcc9f, 0xd5d5, 388180583Skmacy 0xcca0, 0xc600, 389180583Skmacy 0xcca1, 0x2a6d, 390180583Skmacy 0xcca2, 0xc601, 391180583Skmacy 0xcca3, 0x2a4c, 392180583Skmacy 0xcca4, 0xc602, 393180583Skmacy 0xcca5, 0x111, 394180583Skmacy 0xcca6, 0xc60c, 395180583Skmacy 0xcca7, 0x5900, 396180583Skmacy 0xcca8, 0xc710, 397180583Skmacy 0xcca9, 0x700, 398180583Skmacy 0xccaa, 0xc718, 399180583Skmacy 0xccab, 0x700, 400180583Skmacy 0xccac, 0xc720, 401180583Skmacy 0xccad, 0x4700, 402180583Skmacy 0xccae, 0xc801, 403180583Skmacy 0xccaf, 0x7f50, 404180583Skmacy 0xccb0, 0xc802, 405180583Skmacy 0xccb1, 0x7760, 406180583Skmacy 0xccb2, 0xc803, 407180583Skmacy 0xccb3, 0x7fce, 408180583Skmacy 0xccb4, 0xc804, 409180583Skmacy 0xccb5, 0x5700, 410180583Skmacy 0xccb6, 0xc805, 411180583Skmacy 0xccb7, 0x5f11, 412180583Skmacy 0xccb8, 0xc806, 413180583Skmacy 0xccb9, 0x4751, 414180583Skmacy 0xccba, 0xc807, 415180583Skmacy 0xccbb, 0x57e1, 416180583Skmacy 0xccbc, 0xc808, 417180583Skmacy 0xccbd, 0x2700, 418180583Skmacy 0xccbe, 0xc809, 419180583Skmacy 0xccbf, 0x000, 420180583Skmacy 0xccc0, 0xc821, 421180583Skmacy 0xccc1, 0x002, 422180583Skmacy 0xccc2, 0xc822, 423180583Skmacy 0xccc3, 0x014, 424180583Skmacy 0xccc4, 0xc832, 425180583Skmacy 0xccc5, 0x1186, 426180583Skmacy 0xccc6, 0xc847, 427180583Skmacy 0xccc7, 0x1e02, 428180583Skmacy 0xccc8, 0xc013, 429180583Skmacy 0xccc9, 0xf341, 430180583Skmacy 0xccca, 0xc01a, 431180583Skmacy 0xcccb, 0x446, 432180583Skmacy 0xcccc, 0xc024, 433180583Skmacy 0xcccd, 0x1000, 434180583Skmacy 0xccce, 0xc025, 435180583Skmacy 0xcccf, 0xa00, 436180583Skmacy 0xccd0, 0xc026, 437180583Skmacy 0xccd1, 0xc0c, 438180583Skmacy 0xccd2, 0xc027, 439180583Skmacy 0xccd3, 0xc0c, 440180583Skmacy 0xccd4, 0xc029, 441180583Skmacy 0xccd5, 0x0a0, 442180583Skmacy 0xccd6, 0xc030, 443180583Skmacy 0xccd7, 0xa00, 444180583Skmacy 0xccd8, 0xc03c, 445180583Skmacy 0xccd9, 0x01c, 446180583Skmacy 0xccda, 0xc005, 447180583Skmacy 0xccdb, 0x7a06, 448180583Skmacy 0xccdc, 0x000, 449180583Skmacy 0xccdd, 0x2731, 450180583Skmacy 0xccde, 0x3011, 451180583Skmacy 0xccdf, 0x1001, 452180583Skmacy 0xcce0, 0xc620, 453180583Skmacy 0xcce1, 0x000, 454180583Skmacy 0xcce2, 0xc621, 455180583Skmacy 0xcce3, 0x03f, 456180583Skmacy 0xcce4, 0xc622, 457180583Skmacy 0xcce5, 0x000, 458180583Skmacy 0xcce6, 0xc623, 459180583Skmacy 0xcce7, 0x000, 460180583Skmacy 0xcce8, 0xc624, 461180583Skmacy 0xcce9, 0x000, 462180583Skmacy 0xccea, 0xc625, 463180583Skmacy 0xcceb, 0x000, 464180583Skmacy 0xccec, 0xc627, 465180583Skmacy 0xcced, 0x000, 466180583Skmacy 0xccee, 0xc628, 467180583Skmacy 0xccef, 0x000, 468180583Skmacy 0xccf0, 0xc62c, 469180583Skmacy 0xccf1, 0x000, 470180583Skmacy 0xccf2, 0x000, 471180583Skmacy 0xccf3, 0x2806, 472180583Skmacy 0xccf4, 0x3cb6, 473180583Skmacy 0xccf5, 0xc161, 474180583Skmacy 0xccf6, 0x6134, 475180583Skmacy 0xccf7, 0x6135, 476180583Skmacy 0xccf8, 0x5443, 477180583Skmacy 0xccf9, 0x303, 478180583Skmacy 0xccfa, 0x6524, 479180583Skmacy 0xccfb, 0x00b, 480180583Skmacy 0xccfc, 0x1002, 481180583Skmacy 0xccfd, 0x2104, 482180583Skmacy 0xccfe, 0x3c24, 483180583Skmacy 0xccff, 0x2105, 484180583Skmacy 0xcd00, 0x3805, 485180583Skmacy 0xcd01, 0x6524, 486180583Skmacy 0xcd02, 0xdff4, 487180583Skmacy 0xcd03, 0x4005, 488180583Skmacy 0xcd04, 0x6524, 489180583Skmacy 0xcd05, 0x1002, 490180583Skmacy 0xcd06, 0x5dd3, 491180583Skmacy 0xcd07, 0x306, 492180583Skmacy 0xcd08, 0x2ff7, 493180583Skmacy 0xcd09, 0x38f7, 494180583Skmacy 0xcd0a, 0x60b7, 495180583Skmacy 0xcd0b, 0xdffd, 496180583Skmacy 0xcd0c, 0x00a, 497180583Skmacy 0xcd0d, 0x1002, 498180583Skmacy 0xcd0e, 0 499180583Skmacy }; 500180583Skmacy int i, err; 501180583Skmacy 502180583Skmacy for (err = i = 0; i < ARRAY_SIZE(sr_edc) && !err; i += 2) 503180583Skmacy err = mdio_write(phy, MDIO_DEV_PMA_PMD, sr_edc[i], 504180583Skmacy sr_edc[i + 1]); 505180583Skmacy return err; 506180583Skmacy} 507180583Skmacy 508180583Skmacystatic int ael2005_reset(struct cphy *phy, int wait) 509180583Skmacy{ 510180583Skmacy static struct reg_val regs0[] = { 511180583Skmacy { MDIO_DEV_PMA_PMD, 0xc001, 0, 1 << 5 }, 512180583Skmacy { MDIO_DEV_PMA_PMD, 0xc017, 0, 1 << 5 }, 513180583Skmacy { MDIO_DEV_PMA_PMD, 0xc013, 0xffff, 0xf341 }, 514180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 515180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8100 }, 516180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0x8000 }, 517180583Skmacy { MDIO_DEV_PMA_PMD, 0xc210, 0xffff, 0 }, 518180583Skmacy { 0, 0, 0, 0 } 519180583Skmacy }; 520180583Skmacy static struct reg_val regs1[] = { 521180583Skmacy { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x181 }, 522180583Skmacy { MDIO_DEV_PMA_PMD, 0xc010, 0xffff, 0x448a }, 523180583Skmacy { MDIO_DEV_PMA_PMD, 0xc04a, 0xffff, 0x5200 }, 524180583Skmacy { 0, 0, 0, 0 } 525180583Skmacy }; 526180583Skmacy static struct reg_val regs2[] = { 527180583Skmacy { MDIO_DEV_PMA_PMD, 0xca00, 0xffff, 0x0080 }, 528180583Skmacy { MDIO_DEV_PMA_PMD, 0xca12, 0xffff, 0 }, 529180583Skmacy { 0, 0, 0, 0 } 530180583Skmacy }; 531180583Skmacy 532180583Skmacy int err; 533180583Skmacy 534180583Skmacy err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 0); 535180583Skmacy if (err) 536180583Skmacy return err; 537180583Skmacy 538180583Skmacy msleep(125); 539180583Skmacy err = set_phy_regs(phy, regs0); 540180583Skmacy if (err) 541180583Skmacy return err; 542180583Skmacy 543180583Skmacy msleep(50); 544180583Skmacy err = set_phy_regs(phy, regs1); 545180583Skmacy if (err) 546180583Skmacy return err; 547180583Skmacy 548180583Skmacy msleep(50); 549180583Skmacy err = ael2005_setup_sr_edc(phy); 550180583Skmacy if (err) 551180583Skmacy return err; 552180583Skmacy 553180583Skmacy return set_phy_regs(phy, regs2); 554180583Skmacy} 555180583Skmacy 556167514Skmacy#ifdef C99_NOT_SUPPORTED 557180583Skmacystatic struct cphy_ops ael2005_ops = { 558180583Skmacy ael2005_reset, 559180583Skmacy t3_phy_lasi_intr_enable, 560180583Skmacy t3_phy_lasi_intr_disable, 561180583Skmacy t3_phy_lasi_intr_clear, 562180583Skmacy t3_phy_lasi_intr_handler, 563180583Skmacy NULL, 564180583Skmacy NULL, 565180583Skmacy NULL, 566180583Skmacy NULL, 567180583Skmacy NULL, 568180583Skmacy ael100x_get_link_status, 569180583Skmacy ael1002_power_down, 570180583Skmacy}; 571180583Skmacy#else 572180583Skmacystatic struct cphy_ops ael2005_ops = { 573180583Skmacy .reset = ael2005_reset, 574180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 575180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 576180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 577180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 578180583Skmacy .get_link_status = ael100x_get_link_status, 579180583Skmacy .power_down = ael1002_power_down, 580180583Skmacy}; 581180583Skmacy#endif 582180583Skmacy 583180583Skmacyint t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 584180583Skmacy const struct mdio_ops *mdio_ops) 585180583Skmacy{ 586180583Skmacy cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops, 587180583Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, 588180583Skmacy "10GBASE-R"); 589180583Skmacy msleep(125); 590180583Skmacy return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, AEL_OPT_SETTINGS, 0, 591180583Skmacy 1 << 5); 592180583Skmacy} 593180583Skmacy 594180583Skmacy#ifdef C99_NOT_SUPPORTED 595167514Skmacystatic struct cphy_ops qt2045_ops = { 596167514Skmacy ael1006_reset, 597180583Skmacy t3_phy_lasi_intr_enable, 598180583Skmacy t3_phy_lasi_intr_disable, 599180583Skmacy t3_phy_lasi_intr_clear, 600180583Skmacy t3_phy_lasi_intr_handler, 601167514Skmacy NULL, 602167514Skmacy NULL, 603167514Skmacy NULL, 604167514Skmacy NULL, 605167514Skmacy NULL, 606167514Skmacy ael100x_get_link_status, 607167514Skmacy ael1006_power_down, 608167514Skmacy}; 609167514Skmacy#else 610167514Skmacystatic struct cphy_ops qt2045_ops = { 611167514Skmacy .reset = ael1006_reset, 612180583Skmacy .intr_enable = t3_phy_lasi_intr_enable, 613180583Skmacy .intr_disable = t3_phy_lasi_intr_disable, 614180583Skmacy .intr_clear = t3_phy_lasi_intr_clear, 615180583Skmacy .intr_handler = t3_phy_lasi_intr_handler, 616167514Skmacy .get_link_status = ael100x_get_link_status, 617167514Skmacy .power_down = ael1006_power_down, 618167514Skmacy}; 619167514Skmacy#endif 620167514Skmacy 621176472Skmacyint t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 622176472Skmacy const struct mdio_ops *mdio_ops) 623167514Skmacy{ 624167514Skmacy unsigned int stat; 625167514Skmacy 626176472Skmacy cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops, 627176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 628176472Skmacy "10GBASE-CX4"); 629167514Skmacy 630167514Skmacy /* 631167514Skmacy * Some cards where the PHY is supposed to be at address 0 actually 632167514Skmacy * have it at 1. 633167514Skmacy */ 634167514Skmacy if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) && 635167514Skmacy stat == 0xffff) 636167514Skmacy phy->addr = 1; 637176472Skmacy return 0; 638167514Skmacy} 639167514Skmacy 640167514Skmacystatic int xaui_direct_reset(struct cphy *phy, int wait) 641167514Skmacy{ 642167514Skmacy return 0; 643167514Skmacy} 644167514Skmacy 645167514Skmacystatic int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, 646167514Skmacy int *speed, int *duplex, int *fc) 647167514Skmacy{ 648167514Skmacy if (link_ok) { 649167514Skmacy unsigned int status; 650167514Skmacy 651167514Skmacy status = t3_read_reg(phy->adapter, 652170654Skmacy XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | 653170654Skmacy t3_read_reg(phy->adapter, 654170654Skmacy XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | 655170654Skmacy t3_read_reg(phy->adapter, 656170654Skmacy XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | 657170654Skmacy t3_read_reg(phy->adapter, 658170654Skmacy XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); 659167514Skmacy *link_ok = !(status & F_LOWSIG0); 660167514Skmacy } 661167514Skmacy if (speed) 662167514Skmacy *speed = SPEED_10000; 663167514Skmacy if (duplex) 664167514Skmacy *duplex = DUPLEX_FULL; 665167514Skmacy return 0; 666167514Skmacy} 667167514Skmacy 668167514Skmacystatic int xaui_direct_power_down(struct cphy *phy, int enable) 669167514Skmacy{ 670167514Skmacy return 0; 671167514Skmacy} 672167514Skmacy 673167514Skmacy#ifdef C99_NOT_SUPPORTED 674167514Skmacystatic struct cphy_ops xaui_direct_ops = { 675167514Skmacy xaui_direct_reset, 676167514Skmacy ael1002_intr_noop, 677167514Skmacy ael1002_intr_noop, 678167514Skmacy ael1002_intr_noop, 679167514Skmacy ael1002_intr_noop, 680167514Skmacy NULL, 681167514Skmacy NULL, 682167514Skmacy NULL, 683167514Skmacy NULL, 684167514Skmacy NULL, 685167514Skmacy xaui_direct_get_link_status, 686167514Skmacy xaui_direct_power_down, 687167514Skmacy}; 688167514Skmacy#else 689167514Skmacystatic struct cphy_ops xaui_direct_ops = { 690167514Skmacy .reset = xaui_direct_reset, 691167514Skmacy .intr_enable = ael1002_intr_noop, 692167514Skmacy .intr_disable = ael1002_intr_noop, 693167514Skmacy .intr_clear = ael1002_intr_noop, 694167514Skmacy .intr_handler = ael1002_intr_noop, 695167514Skmacy .get_link_status = xaui_direct_get_link_status, 696167514Skmacy .power_down = xaui_direct_power_down, 697167514Skmacy}; 698167514Skmacy#endif 699167514Skmacy 700176472Skmacyint t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 701176472Skmacy const struct mdio_ops *mdio_ops) 702167514Skmacy{ 703176472Skmacy cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, 704176472Skmacy SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, 705176472Skmacy "10GBASE-CX4"); 706176472Skmacy return 0; 707167514Skmacy} 708