static int dm9161_read_status(struct gfar_mii_info *mii_info) { u16 status; int err; /* Update the link, but return if there * was an error */ err = genmii_update_link(mii_info); if (err) return err; /* If the link is up, read the speed and duplex */ /* If we aren't autonegotiating, assume speeds * are as set */ if (mii_info->autoneg && mii_info->link) { status = phy_read(mii_info, MII_DM9161_SCSR); if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_100H)) mii_info->speed = SPEED_100; else mii_info->speed = SPEED_10; if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_10F)) mii_info->duplex = DUPLEX_FULL; else mii_info->duplex = DUPLEX_HALF; } return 0; }
static int genmii_read_status(struct gfar_mii_info *mii_info) { u16 status; int err; /* Update the link, but return if there * was an error */ err = genmii_update_link(mii_info); if (err) return err; if (mii_info->autoneg) { status = phy_read(mii_info, MII_LPA); if (status & (LPA_10FULL | LPA_100FULL)) mii_info->duplex = DUPLEX_FULL; else mii_info->duplex = DUPLEX_HALF; if (status & (LPA_100FULL | LPA_100HALF)) mii_info->speed = SPEED_100; else mii_info->speed = SPEED_10; mii_info->pause = 0; } /* On non-aneg, we assume what we put in BMCR is the speed, * though magic-aneg shouldn't prevent this case from occurring */ return 0; }
static int marvell_read_status(struct gfar_mii_info *mii_info) { u16 status; int err; /* Update the link, but return if there * was an error */ err = genmii_update_link(mii_info); if (err) return err; /* If the link is up, read the speed and duplex */ /* If we aren't autonegotiating, assume speeds * are as set */ if (mii_info->autoneg && mii_info->link) { int speed; status = phy_read(mii_info, MII_M1011_PHY_SPEC_STATUS); #if 0 /* If speed and duplex aren't resolved, * return an error. Isn't this handled * by checking aneg? */ if ((status & MII_M1011_PHY_SPEC_STATUS_RESOLVED) == 0) return -EAGAIN; #endif /* Get the duplexity */ if (status & MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX) mii_info->duplex = DUPLEX_FULL; else mii_info->duplex = DUPLEX_HALF; /* Get the speed */ speed = status & MII_M1011_PHY_SPEC_STATUS_SPD_MASK; switch(speed) { case MII_M1011_PHY_SPEC_STATUS_1000: mii_info->speed = SPEED_1000; break; case MII_M1011_PHY_SPEC_STATUS_100: mii_info->speed = SPEED_100; break; default: mii_info->speed = SPEED_10; break; } mii_info->pause = 0; } return 0; }
static int marvell_read_status(struct ugeth_mii_info *mii_info) { u16 status; int err; ugphy_vdbg("%s: IN", __FUNCTION__); /* Update the link, but return if there * was an error */ err = genmii_update_link(mii_info); if (err) return err; /* If the link is up, read the speed and duplex */ /* If we aren't autonegotiating, assume speeds * are as set */ if (mii_info->autoneg && mii_info->link) { int speed; status = ucc_geth_phy_read(mii_info, MII_M1011_PHY_SPEC_STATUS); /* Get the duplexity */ if (status & MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX) mii_info->duplex = DUPLEX_FULL; else mii_info->duplex = DUPLEX_HALF; /* Get the speed */ speed = status & MII_M1011_PHY_SPEC_STATUS_SPD_MASK; switch (speed) { case MII_M1011_PHY_SPEC_STATUS_1000: mii_info->speed = SPEED_1000; break; case MII_M1011_PHY_SPEC_STATUS_100: mii_info->speed = SPEED_100; break; default: mii_info->speed = SPEED_10; break; } mii_info->pause = 0; } return 0; }
static int cis820x_read_status(struct ugeth_mii_info *mii_info) { u16 status; int err; ugphy_vdbg("%s: IN", __FUNCTION__); /* Update the link, but return if there * was an error */ err = genmii_update_link(mii_info); if (err) return err; /* If the link is up, read the speed and duplex */ /* If we aren't autonegotiating, assume speeds * are as set */ if (mii_info->autoneg && mii_info->link) { int speed; status = ucc_geth_phy_read(mii_info, MII_CIS8201_AUX_CONSTAT); if (status & MII_CIS8201_AUXCONSTAT_DUPLEX) mii_info->duplex = DUPLEX_FULL; else mii_info->duplex = DUPLEX_HALF; speed = status & MII_CIS8201_AUXCONSTAT_SPEED; switch (speed) { case MII_CIS8201_AUXCONSTAT_GBIT: mii_info->speed = SPEED_1000; break; case MII_CIS8201_AUXCONSTAT_100: mii_info->speed = SPEED_100; break; default: mii_info->speed = SPEED_10; break; } } return 0; }
static int smsc_read_status (struct uec_mii_info *mii_info) { u16 status; int err; /* Update the link, but return if there * was an error */ err = genmii_update_link (mii_info); if (err) return err; /* If the link is up, read the speed and duplex */ /* If we aren't autonegotiating, assume speeds * are as set */ if (mii_info->autoneg && mii_info->link) { int val; status = uec_phy_read(mii_info, 0x1f); val = (status & 0x1c) >> 2; switch (val) { case 1: mii_info->duplex = DUPLEX_HALF; mii_info->speed = SPEED_10; break; case 5: mii_info->duplex = DUPLEX_FULL; mii_info->speed = SPEED_10; break; case 2: mii_info->duplex = DUPLEX_HALF; mii_info->speed = SPEED_100; break; case 6: mii_info->duplex = DUPLEX_FULL; mii_info->speed = SPEED_100; break; } mii_info->pause = 0; }