static void cvm_oct_adjust_link(struct net_device *dev) { struct octeon_ethernet *priv = netdev_priv(dev); cvmx_helper_link_info_t link_info; if (priv->last_link != priv->phydev->link) { priv->last_link = priv->phydev->link; link_info.u64 = 0; link_info.s.link_up = priv->last_link ? 1 : 0; link_info.s.full_duplex = priv->phydev->duplex ? 1 : 0; link_info.s.speed = priv->phydev->speed; cvmx_helper_link_set( priv->port, link_info); if (priv->last_link) { netif_carrier_on(dev); if (priv->queue != -1) printk_ratelimited("%s: %u Mbps %s duplex, " "port %2d, queue %2d\n", dev->name, priv->phydev->speed, priv->phydev->duplex ? "Full" : "Half", priv->port, priv->queue); else printk_ratelimited("%s: %u Mbps %s duplex, " "port %2d, POW\n", dev->name, priv->phydev->speed, priv->phydev->duplex ? "Full" : "Half", priv->port); } else { netif_carrier_off(dev); printk_ratelimited("%s: Link down\n", dev->name); } } }
static void cvm_oct_adjust_link(struct net_device *dev) { struct octeon_ethernet *priv = netdev_priv(dev); cvmx_helper_link_info_t link_info; if (priv->last_link != priv->phydev->link) { priv->last_link = priv->phydev->link; link_info.u64 = 0; link_info.s.link_up = priv->last_link ? 1 : 0; link_info.s.full_duplex = priv->phydev->duplex ? 1 : 0; link_info.s.speed = priv->phydev->speed; cvmx_helper_link_set(priv->port, link_info); cvm_oct_set_carrier(priv, link_info); } }
void cvm_oct_link_poll(struct net_device *dev) { struct octeon_ethernet *priv = netdev_priv(dev); cvmx_helper_link_info_t link_info; link_info = cvmx_helper_link_get(priv->port); if (link_info.u64 == priv->link_info) return; if (cvmx_helper_link_set(priv->port, link_info)) link_info.u64 = priv->link_info; else priv->link_info = link_info.u64; if (link_info.s.link_up) { if (!netif_carrier_ok(dev)) netif_carrier_on(dev); } else if (netif_carrier_ok(dev)) { netif_carrier_off(dev); } cvm_oct_note_carrier(priv, link_info); }
int cvm_oct_sgmii_stop(struct net_device *dev) { union cvmx_gmxx_prtx_cfg gmx_cfg; struct octeon_ethernet *priv = netdev_priv(dev); cvmx_helper_link_info_t link_info; gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(priv->interface_port, priv->interface)); gmx_cfg.s.en = 0; cvmx_write_csr(CVMX_GMXX_PRTX_CFG(priv->interface_port, priv->interface), gmx_cfg.u64); priv->poll = NULL; if (priv->phydev) { phy_disconnect(priv->phydev); } priv->phydev = NULL; if (priv->last_link) { link_info.u64 = 0; priv->last_link = 0; cvmx_helper_link_set(priv->ipd_port, link_info); } return 0; }