staticint cavium_mdiobus_c45_addr(struct cavium_mdiobus *p, int phy_id, int devad, int regnum)
{ union cvmx_smix_cmd smi_cmd; union cvmx_smix_wr_dat smi_wr; int timeout = 1000;
do { /* Wait 1000 clocks so we don't saturate the RSL bus * doing reads.
*/
__delay(1000);
smi_wr.u64 = oct_mdio_readq(p->register_base + SMI_WR_DAT);
} while (smi_wr.s.pending && --timeout);
if (timeout <= 0) return -EIO; return 0;
}
int cavium_mdiobus_read_c22(struct mii_bus *bus, int phy_id, int regnum)
{ struct cavium_mdiobus *p = bus->priv; union cvmx_smix_cmd smi_cmd; union cvmx_smix_rd_dat smi_rd; int timeout = 1000;
do { /* Wait 1000 clocks so we don't saturate the RSL bus * doing reads.
*/
__delay(1000);
smi_rd.u64 = oct_mdio_readq(p->register_base + SMI_RD_DAT);
} while (smi_rd.s.pending && --timeout);
if (smi_rd.s.val) return smi_rd.s.dat; else return -EIO;
}
EXPORT_SYMBOL(cavium_mdiobus_read_c22);
int cavium_mdiobus_read_c45(struct mii_bus *bus, int phy_id, int devad, int regnum)
{ struct cavium_mdiobus *p = bus->priv; union cvmx_smix_cmd smi_cmd; union cvmx_smix_rd_dat smi_rd; int timeout = 1000; int r;
r = cavium_mdiobus_c45_addr(p, phy_id, devad, regnum); if (r < 0) return r;
do { /* Wait 1000 clocks so we don't saturate the RSL bus * doing reads.
*/
__delay(1000);
smi_rd.u64 = oct_mdio_readq(p->register_base + SMI_RD_DAT);
} while (smi_rd.s.pending && --timeout);
if (smi_rd.s.val) return smi_rd.s.dat; else return -EIO;
}
EXPORT_SYMBOL(cavium_mdiobus_read_c45);
int cavium_mdiobus_write_c22(struct mii_bus *bus, int phy_id, int regnum,
u16 val)
{ struct cavium_mdiobus *p = bus->priv; union cvmx_smix_cmd smi_cmd; union cvmx_smix_wr_dat smi_wr; int timeout = 1000;
do { /* Wait 1000 clocks so we don't saturate the RSL bus * doing reads.
*/
__delay(1000);
smi_wr.u64 = oct_mdio_readq(p->register_base + SMI_WR_DAT);
} while (smi_wr.s.pending && --timeout);
int cavium_mdiobus_write_c45(struct mii_bus *bus, int phy_id, int devad, int regnum, u16 val)
{ struct cavium_mdiobus *p = bus->priv; union cvmx_smix_cmd smi_cmd; union cvmx_smix_wr_dat smi_wr; int timeout = 1000; int r;
r = cavium_mdiobus_c45_addr(p, phy_id, devad, regnum); if (r < 0) return r;
do { /* Wait 1000 clocks so we don't saturate the RSL bus * doing reads.
*/
__delay(1000);
smi_wr.u64 = oct_mdio_readq(p->register_base + SMI_WR_DAT);
} while (smi_wr.s.pending && --timeout);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.