void PhyReset(void) { static int init_done=0; unsigned Status; if (init_done) return; init_done=1; debug2_printf("Phy addr %d\n",RTL8201_ADDR); // first software reset the RTL8201 MiiStationWrite(RTL8201_CNTL_REG, RTL8201_ADDR, RTL8201_CNTL_RESET); MiiStationWrite(RTL8201_CNTL_REG, RTL8201_ADDR, 0); // initialize auto-negotiation capabilities MiiStationWrite(RTL8201_ANA_REG,RTL8201_ADDR, RTL8201_ANA_100TX_FULL+ RTL8201_ANA_100TX+ RTL8201_ANA_10T_FULL+ RTL8201_ANA_10T+ RTL8201_ANA_SEL_802_3); // Now start an auto negotiation debug1_printf("Start auto negotiation\n"); MiiStationWrite(RTL8201_CNTL_REG, RTL8201_ADDR, RTL8201_CNTL_AN+ RTL8201_CNTL_RSTRT_AN); }
void PhyReset(void) { // first software reset the LX970 MiiStationWrite(LX970_CNTL_REG, LX970_ADDR, LX970_CNTL_RESET); MiiStationWrite(LX970_CNTL_REG, LX970_ADDR, 0); // set low level drive for MII lines, enable interrupt output MiiStationWrite(17, LX970_ADDR, BIT3+BIT1); // default values for 100M encryption are wrong, so fix them // and configure LEDC to be activity indicator MiiStationWrite(19, LX970_ADDR, BIT7); // initialize auto-negotiation capabilities MiiStationWrite(LX970_ANA_REG,LX970_ADDR, LX970_ANA_PAUSE_ENA+ LX970_ANA_100T4+ LX970_ANA_100TX_FULL+ LX970_ANA_100TX+ LX970_ANA_10T_FULL+ LX970_ANA_10T+ LX970_ANA_SEL_802_3); #if 1 // Now start an auto negotiation MiiStationWrite(LX970_CNTL_REG, LX970_ADDR, LX970_CNTL_AN+ LX970_CNTL_RSTRT_AN); #else // force to 10M full duplex MiiStationWrite(LX970_CNTL_REG, LX970_ADDR, LX970_CNTL_FULL_DUP); #endif }
void PhyReset(void) { unsigned CtrlRegData; // First software reset the LX972 MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, LX972_CTRL_RESET); MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, 0); // Wait until the LX972 reset cycle has completed // The Control register will read 0x7FFF until the reset cycle has completed CtrlRegData = 0x7FFF; while (CtrlRegData == 0x7FFF) { CtrlRegData = MiiStationRead(LX972_CTRL_REG, LX972_ADDR); } // Set up the LEDs' modes MiiStationWrite(LX972_LED_CONFIG_REG, LX972_ADDR, (CYGPKG_DEVS_ETH_ARM_KS32C5000_PHY_LXT972_LED1 << LX972_LED_CONFIG_LED1SHIFT) | (CYGPKG_DEVS_ETH_ARM_KS32C5000_PHY_LXT972_LED2 << LX972_LED_CONFIG_LED2SHIFT) | (CYGPKG_DEVS_ETH_ARM_KS32C5000_PHY_LXT972_LED3 << LX972_LED_CONFIG_LED3SHIFT) | LX972_LED_CONFIG_STRETCH_100MS | LX972_LED_CONFIG_ENAB_LED_STRETCH); // Set MII drive strength MiiStationWrite(LX972_DIG_CONFIG_REG, LX972_ADDR, 0); // Enable interrupts MiiStationWrite(LX972_INT_ENAB_REG, LX972_ADDR, LX972_INT_ENAB_ANMSK | LX972_INT_ENAB_SPEEDMSK | LX972_INT_ENAB_DUPLEXMSK | LX972_INT_ENAB_LINKMSK | LX972_INT_ENAB_INTEN); // Initialize auto-negotiation capabilities // Next page not enabled MiiStationWrite(LX972_AN_ADVRT_REG, LX972_ADDR, LX972_AN_ADVRT_PAUSE_ENA | LX972_AN_ADVRT_100T4 | LX972_AN_ADVRT_100TX_FULL | LX972_AN_ADVRT_100TX | LX972_AN_ADVRT_10T_FULL | LX972_AN_ADVRT_10T | LX972_AN_ADVRT_SEL_802_3); #if 1 // Now start an auto negotiation MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, LX972_CTRL_AN | LX972_CTRL_RSTRT_AN); #else // force to 10M full duplex MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, LX972_CTRL_FULL_DUP); #endif }