static unsigned long phy_id_read(void) { unsigned long phy_id; unsigned short id1, id2; int my_phyaddr = 0x1; id1 = hieth_mdio_read(&hieth_mdio_local_device, my_phyaddr, 0x02); id2 = hieth_mdio_read(&hieth_mdio_local_device, my_phyaddr, 0x03); phy_id = (((id1 & 0xffff) << 16) | (id2 & 0xffff)); return phy_id; }
static int hieth_mdiobus_read(char *devname, unsigned char addr, unsigned char reg, unsigned short *value) { *value = hieth_mdio_read(&mdio_bus_ld, addr, reg); return 0; }
static void phy_quirk(struct hieth_mdio_local *mdio, int phyaddr) { unsigned long phy_id; unsigned short id1, id2; unsigned short reg; id1 = hieth_mdio_read(mdio, phyaddr, 0x02); id2 = hieth_mdio_read(mdio, phyaddr, 0x03); phy_id = (((id1 & 0xffff) << 16) | (id2 & 0xffff)); /* PHY-KSZ8051MNL */ if ((phy_id & 0xFFFFFFF0) == 0x221550) { reg = hieth_mdio_read(mdio, phyaddr, 0x1F); reg |= (1 << 7); /* set phy RMII 50MHz clk;*/ hieth_mdio_write(mdio, phyaddr, 0x1F, reg); reg = hieth_mdio_read(mdio, phyaddr, 0x16); reg |= (1 << 1); /* set phy RMII override; */ hieth_mdio_write(mdio, phyaddr, 0x16, reg); } }