static int pch_gbe_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) { struct pch_gbe_adapter *adapter = netdev_priv(netdev); struct pch_gbe_hw *hw = &adapter->hw; int ret = 0; hw->mac.fc_autoneg = pause->autoneg; if ((pause->rx_pause) && (pause->tx_pause)) hw->mac.fc = PCH_GBE_FC_FULL; else if ((pause->rx_pause) && (!pause->tx_pause)) hw->mac.fc = PCH_GBE_FC_RX_PAUSE; else if ((!pause->rx_pause) && (pause->tx_pause)) hw->mac.fc = PCH_GBE_FC_TX_PAUSE; else if ((!pause->rx_pause) && (!pause->tx_pause)) hw->mac.fc = PCH_GBE_FC_NONE; if (hw->mac.fc_autoneg == AUTONEG_ENABLE) { if ((netif_running(adapter->netdev))) { pch_gbe_down(adapter); ret = pch_gbe_up(adapter); } else { pch_gbe_reset(adapter); } } else { ret = pch_gbe_mac_force_mac_fc(hw); } return ret; }
/** * pch_gbe_set_settings - Set device-specific settings * @netdev: Network interface device structure * @ecmd: Ethtool command * Returns * 0: Successful. * Negative value: Failed. */ static int pch_gbe_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) { struct pch_gbe_adapter *adapter = netdev_priv(netdev); struct pch_gbe_hw *hw = &adapter->hw; int ret; pch_gbe_hal_write_phy_reg(hw, MII_BMCR, BMCR_RESET); if (ecmd->speed == USHRT_MAX) { ecmd->speed = SPEED_1000; ecmd->duplex = DUPLEX_FULL; } ret = mii_ethtool_sset(&adapter->mii, ecmd); if (ret) { pr_err("Error: mii_ethtool_sset\n"); return ret; } hw->mac.link_speed = ecmd->speed; hw->mac.link_duplex = ecmd->duplex; hw->phy.autoneg_advertised = ecmd->advertising; hw->mac.autoneg = ecmd->autoneg; pch_gbe_hal_phy_sw_reset(hw); /* reset the link */ if (netif_running(adapter->netdev)) { pch_gbe_down(adapter); ret = pch_gbe_up(adapter); } else { pch_gbe_reset(adapter); } return ret; }
static void pch_gbe_stop(struct udevice *dev) { struct pch_gbe_priv *priv = dev_get_priv(dev); pch_gbe_reset(dev); phy_shutdown(priv->phydev); }
static void pch_gbe_halt(struct eth_device *dev) { struct pch_gbe_priv *priv = dev->priv; pch_gbe_reset(dev); phy_shutdown(priv->phydev); }
/** * pch_gbe_set_rx_csum - Turn receive checksum on or off * @netdev: Network interface device structure * @data: Checksum On[true] or Off[false] * Returns * 0: Successful. * Negative value: Failed. */ static int pch_gbe_set_rx_csum(struct net_device *netdev, u32 data) { struct pch_gbe_adapter *adapter = netdev_priv(netdev); adapter->rx_csum = data; if ((netif_running(netdev))) pch_gbe_reinit_locked(adapter); else pch_gbe_reset(adapter); return 0; }
static int pch_gbe_start(struct udevice *dev) { struct pch_gbe_priv *priv = dev_get_priv(dev); struct pch_gbe_regs *mac_regs = priv->mac_regs; if (pch_gbe_reset(dev)) return -1; pch_gbe_rx_descs_init(dev); pch_gbe_tx_descs_init(dev); /* Enable frame bursting */ writel(PCH_GBE_MODE_FR_BST, &mac_regs->mode); /* Disable TCP/IP accelerator */ writel(PCH_GBE_RX_TCPIPACC_OFF, &mac_regs->tcpip_acc); /* Disable RX flow control */ writel(0, &mac_regs->rx_fctrl); /* Configure RX/TX mode */ writel(PCH_GBE_RH_ALM_EMP_16 | PCH_GBE_RH_ALM_FULL_16 | PCH_GBE_RH_RD_TRG_32, &mac_regs->rx_mode); writel(PCH_GBE_TM_TH_TX_STRT_32 | PCH_GBE_TM_TH_ALM_EMP_16 | PCH_GBE_TM_TH_ALM_FULL_32 | PCH_GBE_TM_ST_AND_FD | PCH_GBE_TM_SHORT_PKT, &mac_regs->tx_mode); /* Start up the PHY */ if (phy_startup(priv->phydev)) { printf("Could not initialize PHY %s\n", priv->phydev->dev->name); return -1; } pch_gbe_adjust_link(mac_regs, priv->phydev); if (!priv->phydev->link) return -1; /* Enable TX & RX */ writel(PCH_GBE_RX_DMA_EN | PCH_GBE_TX_DMA_EN, &mac_regs->dma_ctrl); writel(PCH_GBE_MRE_MAC_RX_EN, &mac_regs->mac_rx_en); return 0; }