There are two problems:
- In smsc_phy_init function, when the driver is trying to reset PHY, it doesn't poll for the correct bit (BMCR_RESET) to be cleared. Instead, it ands it with MII_BMCR which happens to be 0, so it just exits the loop.
- In smsc_miibus_readreg and smsc_miibus_writetreg it doesn't set the SMSC_MII_BUSY bit, which is necessary for PHY to acknowledge a read/write request. the linux driver does the same.