static bool prvProbePHY(volatile avr32_macb_t *macb) { volatile unsigned long mii_status; volatile unsigned long config; unsigned long upper, lower, advertise, lpa; volatile unsigned long physID; // Read Phy Identifier register 1 & 2 lower = ulReadMDIO(macb, PHY_PHYSID2); upper = ulReadMDIO(macb, PHY_PHYSID1); // get Phy ID, ignore Revision physID = ((upper << 16) & 0xFFFF0000) | (lower & 0xFFF0); // check if it match config if (physID == EXTPHY_PHY_ID) { #if ETHERNET_CONF_USE_RMII_INTERFACE // setup rmii mode ethernet_phy_setup_rmii(macb); #endif // set advertise register #if ETHERNET_CONF_AN_ENABLE == 1 advertise = ADVERTISE_CSMA | ADVERTISE_ALL; #else advertise = ADVERTISE_CSMA; #if ETHERNET_CONF_USE_100MB #if ETHERNET_CONF_USE_FULL_DUPLEX advertise |= ADVERTISE_100FULL; #else advertise |= ADVERTISE_100HALF; #endif #else #if ETHERNET_CONF_USE_FULL_DUPLEX advertise |= ADVERTISE_10FULL; #else advertise |= ADVERTISE_10HALF; #endif #endif #endif // write advertise register vWriteMDIO(macb, PHY_ADVERTISE, advertise); // read Control register config = ulReadMDIO(macb, PHY_BMCR); // setup auto negociation ethernet_phy_setup_auto_negociation(macb, &config); // update ctrl register vWriteMDIO(macb, PHY_BMCR, config); // loop while link status isn't OK do { mii_status = ulReadMDIO(macb, PHY_BMSR); } while (!(mii_status & BMSR_LSTATUS)); // read the LPA configuration of the PHY lpa = ulReadMDIO(macb, PHY_LPA); // read the MACB config register config = AVR32_MACB.ncfgr; // if 100MB needed if ((lpa & advertise) & (LPA_100HALF | LPA_100FULL)) { config |= AVR32_MACB_SPD_MASK; } else { config &= ~(AVR32_MACB_SPD_MASK); } // if FULL DUPLEX needed if ((lpa & advertise) & (LPA_10FULL | LPA_100FULL)) { config |= AVR32_MACB_FD_MASK; } else { config &= ~(AVR32_MACB_FD_MASK); } // write the MACB config register macb->ncfgr = config; return true; } return false; }
static bool prvProbePHY(volatile avr32_macb_t *macb) { volatile unsigned long config; unsigned long upper, lower, advertise; volatile unsigned long physID; // Read Phy Identifier register 1 & 2 lower = ulReadMDIO(macb, PHY_PHYSID2); upper = ulReadMDIO(macb, PHY_PHYSID1); // get Phy ID, ignore Revision physID = ((upper << 16) & 0xFFFF0000) | (lower & 0xFFF0); // check if it match config if (physID == EXTPHY_PHY_ID) { #if ETHERNET_CONF_USE_RMII_INTERFACE // setup rmii mode ethernet_phy_setup_rmii(macb); #endif // set advertise register #if ETHERNET_CONF_AN_ENABLE == 1 advertise = ADVERTISE_CSMA | ADVERTISE_ALL; #else advertise = ADVERTISE_CSMA; #if ETHERNET_CONF_USE_100MB #if ETHERNET_CONF_USE_FULL_DUPLEX advertise |= ADVERTISE_100FULL; #else advertise |= ADVERTISE_100HALF; #endif #else #if ETHERNET_CONF_USE_FULL_DUPLEX advertise |= ADVERTISE_10FULL; #else advertise |= ADVERTISE_10HALF; #endif #endif #endif // write advertise register vWriteMDIO(macb, PHY_ADVERTISE, advertise); // read Control register config = ulReadMDIO(macb, PHY_BMCR); // setup auto negotiation ethernet_phy_setup_auto_negotiation(macb, &config); // update ctrl register vWriteMDIO(macb, PHY_BMCR, config); #if (ETHERNET_CONF_USE_PHY_IT == 0) volatile unsigned long mii_status; // loop while link status isn't OK do { mii_status = ulReadMDIO(macb, PHY_BMSR); } while (!(mii_status & BMSR_LSTATUS)); prvSetupMACBConfig(macb); #endif /* ETHERNET_CONF_USE_PHY_IT == 0 */ return true; } return false; }