static int m88e1011s_startup(struct phy_device *phydev) { genphy_update_link(phydev); m88e1xxx_parse_status(phydev); return 0; }
static int rtl8211e_startup(struct phy_device *phydev) { genphy_update_link(phydev); genphy_parse_link(phydev); return 0; }
static int vitesse_startup(struct phy_device *phydev) { genphy_update_link(phydev); vitesse_parse_status(phydev); return 0; }
static int dp83865_startup(struct phy_device *phydev) { genphy_update_link(phydev); dp83865_parse_status(phydev); return 0; }
static int rtl8211f_startup(struct phy_device *phydev) { /* Read the Status (2x to make sure link is right) */ genphy_update_link(phydev); rtl8211f_parse_status(phydev); return 0; }
static int vitesse_startup(struct phy_device *phydev) { int ret; ret = genphy_update_link(phydev); if (ret) return ret; return vitesse_parse_status(phydev); }
static int m88e1145_startup(struct phy_device *phydev) { genphy_update_link(phydev); phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_LED_CONTROL, MIIM_88E1145_PHY_LED_DIRECT); m88e1xxx_parse_status(phydev); return 0; }
static int m88e1011s_startup(struct phy_device *phydev) { int ret; ret = genphy_update_link(phydev); if (ret) return ret; return m88e1xxx_parse_status(phydev); }
static int m88e1118_startup(struct phy_device *phydev) { /* Change Page Number */ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); genphy_update_link(phydev); m88e1xxx_parse_status(phydev); return 0; }
static u32 dsa_slave_get_link(struct net_device *dev) { struct dsa_slave_priv *p = netdev_priv(dev); if (p->phy != NULL) { genphy_update_link(p->phy); return p->phy->link; } return -EOPNOTSUPP; }
static int ks2_eth_send(struct udevice *dev, void *packet, int length) { struct ks2_eth_priv *priv = dev_get_priv(dev); genphy_update_link(priv->phydev); if (priv->phydev->link == 0) return -1; if (length < EMAC_MIN_ETHERNET_PKT_SIZE) length = EMAC_MIN_ETHERNET_PKT_SIZE; return ksnav_send(priv->netcp_pktdma, (u32 *)packet, length, (priv->slave_port) << 16); }
/* * Figure out if BCM5482 is in serdes or copper mode and determine link * configuration accordingly */ static int bcm5482_startup(struct phy_device *phydev) { if (bcm5482_is_serdes(phydev)) { bcm5482_parse_serdes_sr(phydev); phydev->port = PORT_FIBRE; } else { /* Wait for auto-negotiation to complete or fail */ genphy_update_link(phydev); /* Parse BCM54xx copper aux status register */ bcm54xx_parse_status(phydev); } return 0; }
/* * This function sends a single packet on the network and returns * positive number (number of bytes transmitted) or negative for error */ static int keystone2_eth_send_packet(struct eth_device *dev, void *packet, int length) { int ret_status = -1; struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv; struct phy_device *phy_dev = eth_priv->phy_dev; genphy_update_link(phy_dev); if (phy_dev->link == 0) return -1; if (cpmac_drv_send((u32 *)packet, length, eth_priv->slave_port) != 0) return ret_status; return length; }
static u32 fe_get_link(struct net_device *dev) { struct fe_priv *priv = netdev_priv(dev); int err; if (!priv->phy_dev) goto out_get_link; if (priv->phy_flags == FE_PHY_FLAG_ATTACH) { err = genphy_update_link(priv->phy_dev); if (err) goto out_get_link; } return priv->phy_dev->link; out_get_link: return ethtool_op_get_link(dev); }
static int ksz9021_startup(struct phy_device *phydev) { unsigned phy_ctl; genphy_update_link(phydev); phy_ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ9021_PHY_CTL); if (phy_ctl & MIIM_KSZ9021_PHYCTL_DUPLEX) phydev->duplex = DUPLEX_FULL; else phydev->duplex = DUPLEX_HALF; if (phy_ctl & MIIM_KSZ9021_PHYCTL_1000) phydev->speed = SPEED_1000; else if (phy_ctl & MIIM_KSZ9021_PHYCTL_100) phydev->speed = SPEED_100; else if (phy_ctl & MIIM_KSZ9021_PHYCTL_10) phydev->speed = SPEED_10; return 0; }
/* * KSZ9031 */ static int ksz9031_startup(struct phy_device *phydev) { genphy_update_link(phydev); ksz90xx_phy_state(phydev); return 0; }
/* marvell_read_status * * Generic status code does not detect Fiber correctly! * Description: * Check the link, then figure out the current state * by comparing what we advertise with what the link partner * advertises. Start by checking the gigabit possibilities, * then move on to 10/100. */ static int marvell_read_status(struct phy_device *phydev) { int adv; int err; int lpa; int lpagb; int status = 0; /* Update the link, but return if there * was an error */ err = genphy_update_link(phydev); if (err) return err; if (AUTONEG_ENABLE == phydev->autoneg) { status = phy_read(phydev, MII_M1011_PHY_STATUS); if (status < 0) return status; lpa = phy_read(phydev, MII_LPA); if (lpa < 0) return lpa; lpagb = phy_read(phydev, MII_STAT1000); if (lpagb < 0) return lpagb; adv = phy_read(phydev, MII_ADVERTISE); if (adv < 0) return adv; phydev->lp_advertising = mii_stat1000_to_ethtool_lpa_t(lpagb) | mii_lpa_to_ethtool_lpa_t(lpa); lpa &= adv; if (status & MII_M1011_PHY_STATUS_FULLDUPLEX) phydev->duplex = DUPLEX_FULL; else phydev->duplex = DUPLEX_HALF; status = status & MII_M1011_PHY_STATUS_SPD_MASK; phydev->pause = phydev->asym_pause = 0; switch (status) { case MII_M1011_PHY_STATUS_1000: phydev->speed = SPEED_1000; break; case MII_M1011_PHY_STATUS_100: phydev->speed = SPEED_100; break; default: phydev->speed = SPEED_10; break; } if (phydev->duplex == DUPLEX_FULL) { phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; } } else { int bmcr = phy_read(phydev, MII_BMCR); if (bmcr < 0) return bmcr; if (bmcr & BMCR_FULLDPLX) phydev->duplex = DUPLEX_FULL; else phydev->duplex = DUPLEX_HALF; if (bmcr & BMCR_SPEED1000) phydev->speed = SPEED_1000; else if (bmcr & BMCR_SPEED100) phydev->speed = SPEED_100; else phydev->speed = SPEED_10; phydev->pause = phydev->asym_pause = 0; phydev->lp_advertising = 0; } return 0; }
static int xilinxphy_read_status(struct phy_device *phydev) { int err; int status = 0; /* Update the link, but return if there * was an error */ err = genphy_update_link(phydev); if (err) return err; if (AUTONEG_ENABLE == phydev->autoneg) { status = phy_read(phydev, MII_LPA); if (status & MII_PHY_STATUS_FULLDUPLEX) phydev->duplex = DUPLEX_FULL; else phydev->duplex = DUPLEX_HALF; switch (status & MII_PHY_STATUS_SPD_MASK) { case MII_PHY_STATUS_1000: phydev->speed = SPEED_1000; break; case MII_PHY_STATUS_100: phydev->speed = SPEED_100; break; default: phydev->speed = SPEED_10; break; } } else { int bmcr = phy_read(phydev, MII_BMCR); if (bmcr < 0) return bmcr; if (bmcr & BMCR_FULLDPLX) phydev->duplex = DUPLEX_FULL; else phydev->duplex = DUPLEX_HALF; if (bmcr & BMCR_SPEED1000) phydev->speed = SPEED_1000; else if (bmcr & BMCR_SPEED100) phydev->speed = SPEED_100; else phydev->speed = SPEED_10; } /* For 1000BASE-X Phy Mode the speed/duplex will always be * 1000Mbps/fullduplex */ if (phydev->dev_flags == XAE_PHY_TYPE_1000BASE_X) { phydev->duplex = DUPLEX_FULL; phydev->speed = SPEED_1000; } return 0; }
/** * genphy_read_status - check the link status and update current link state * @phydev: target phy_device struct * * Description: Check the link, then figure out the current state * by comparing what we advertise with what the link partner * advertises. Start by checking the gigabit possibilities, * then move on to 10/100. */ int genphy_read_status(struct phy_device *phydev) { int adv; int err; int lpa; int lpagb = 0; /* Update the link, but return if there * was an error */ err = genphy_update_link(phydev); if (err) return err; if (AUTONEG_ENABLE == phydev->autoneg) { if (phydev->supported & (SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full)) { lpagb = phy_read(phydev, MII_STAT1000); if (lpagb < 0) return lpagb; adv = phy_read(phydev, MII_CTRL1000); if (adv < 0) return adv; lpagb &= adv << 2; } lpa = phy_read(phydev, MII_LPA); if (lpa < 0) return lpa; adv = phy_read(phydev, MII_ADVERTISE); if (adv < 0) return adv; lpa &= adv; phydev->speed = SPEED_10; phydev->duplex = DUPLEX_HALF; phydev->pause = phydev->asym_pause = 0; if (lpagb & (LPA_1000FULL | LPA_1000HALF)) { phydev->speed = SPEED_1000; if (lpagb & LPA_1000FULL) phydev->duplex = DUPLEX_FULL; } else if (lpa & (LPA_100FULL | LPA_100HALF)) { phydev->speed = SPEED_100; if (lpa & LPA_100FULL) phydev->duplex = DUPLEX_FULL; } else if (lpa & LPA_10FULL) phydev->duplex = DUPLEX_FULL; if (phydev->duplex == DUPLEX_FULL){ phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; } } else { int bmcr = phy_read(phydev, MII_BMCR); if (bmcr < 0) return bmcr; if (bmcr & BMCR_FULLDPLX) phydev->duplex = DUPLEX_FULL; else phydev->duplex = DUPLEX_HALF; if (bmcr & BMCR_SPEED1000) phydev->speed = SPEED_1000; else if (bmcr & BMCR_SPEED100) phydev->speed = SPEED_100; else phydev->speed = SPEED_10; phydev->pause = phydev->asym_pause = 0; } return 0; }
static int et1011c_startup(struct phy_device *phydev) { genphy_update_link(phydev); et1011c_parse_status(phydev); return 0; }