/* PHY functions for a generic PHY */ static int gen_init_phy(int phy_addr) { int ret = 1; if (gen_get_link_speed(phy_addr)) { /* Try another time */ ret = gen_get_link_speed(phy_addr); } return(ret); }
static int gen_auto_negotiate(int phy_addr) { u_int16_t tmp; u_int16_t val; unsigned long cntr = 0; if (!davinci_eth_phy_read(phy_addr, MII_BMCR, &tmp)) return 0; val = tmp | BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_SPEED100; davinci_eth_phy_write(phy_addr, MII_BMCR, val); if (!davinci_eth_phy_read(phy_addr, MII_ADVERTISE, &val)) return 0; val |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10FULL | ADVERTISE_10HALF); davinci_eth_phy_write(phy_addr, MII_ADVERTISE, val); if (!davinci_eth_phy_read(phy_addr, MII_BMCR, &tmp)) return(0); #ifdef DAVINCI_EMAC_GIG_ENABLE davinci_eth_phy_read(phy_addr, MII_CTRL1000, &val); val |= PHY_1000BTCR_1000FD; val &= ~PHY_1000BTCR_1000HD; davinci_eth_phy_write(phy_addr, MII_CTRL1000, val); davinci_eth_phy_read(phy_addr, MII_CTRL1000, &val); #endif /* Restart Auto_negotiation */ tmp |= BMCR_ANRESTART; davinci_eth_phy_write(phy_addr, MII_BMCR, tmp); /*check AutoNegotiate complete */ do { udelay(40000); if (!davinci_eth_phy_read(phy_addr, MII_BMSR, &tmp)) return 0; if (tmp & BMSR_ANEGCOMPLETE) break; cntr++; } while (cntr < 200); if (!davinci_eth_phy_read(phy_addr, MII_BMSR, &tmp)) return(0); if (!(tmp & BMSR_ANEGCOMPLETE)) return(0); return(gen_get_link_speed(phy_addr)); }
static int gen_auto_negotiate(int phy_addr) { u_int16_t tmp; u_int16_t val; unsigned int cntr = 0; if (!davinci_eth_phy_read(phy_addr, PHY_BMCR, &tmp)) return(0); val = tmp | PHY_BMCR_DPLX | PHY_BMCR_AUTON | PHY_BMCR_100MB ; davinci_eth_phy_write(phy_addr, PHY_BMCR, val); davinci_eth_phy_read(phy_addr, PHY_BMCR, &val); /* advertise 100 Full Duplex */ davinci_eth_phy_read(phy_addr,PHY_ANAR, &val); val |= (PHY_ANLPAR_10 | PHY_ANLPAR_10FD | PHY_ANLPAR_TX | PHY_ANLPAR_TXFD); davinci_eth_phy_write(phy_addr,PHY_ANAR, val); davinci_eth_phy_read(phy_addr,PHY_ANAR, &val); davinci_eth_phy_read(phy_addr, PHY_BMCR, &tmp); /* Restart Auto_negotiation */ tmp |= PHY_BMCR_AUTON; davinci_eth_phy_write(phy_addr, PHY_BMCR, tmp); /*check AutoNegotiate complete - it can take upto 3 secs*/ do{ udelay(40000); cntr++; if (davinci_eth_phy_read(phy_addr, PHY_BMSR, &tmp)){ if(tmp & PHY_BMSR_AUTN_COMP) break; } }while(cntr < 250); if (!davinci_eth_phy_read(phy_addr, PHY_BMSR, &tmp)) return(0); if (!(tmp & PHY_BMSR_AUTN_COMP)) return(0); return(gen_get_link_speed(phy_addr)); }
static int gen_auto_negotiate(int phy_addr) { u_int16_t tmp; if (!davinci_eth_phy_read(phy_addr, PHY_BMCR, &tmp)) return(0); /* Restart Auto_negotiation */ tmp |= PHY_BMCR_AUTON; davinci_eth_phy_write(phy_addr, PHY_BMCR, tmp); /*check AutoNegotiate complete */ udelay (10000); if (!davinci_eth_phy_read(phy_addr, PHY_BMSR, &tmp)) return(0); if (!(tmp & PHY_BMSR_AUTN_COMP)) return(0); return(gen_get_link_speed(phy_addr)); }