static int e1000_ethtool_spause(struct e1000_adapter *adapter, struct ethtool_pauseparam *epause) { struct e1000_hw *hw = &adapter->hw; adapter->fc_autoneg = epause->autoneg; if(epause->rx_pause && epause->tx_pause) hw->fc = e1000_fc_full; else if(epause->rx_pause && !epause->tx_pause) hw->fc = e1000_fc_rx_pause; else if(!epause->rx_pause && epause->tx_pause) hw->fc = e1000_fc_tx_pause; else if(!epause->rx_pause && !epause->tx_pause) hw->fc = e1000_fc_none; hw->original_fc = hw->fc; if(adapter->fc_autoneg == AUTONEG_ENABLE) { if(netif_running(adapter->netdev)) { e1000_down(adapter); e1000_up(adapter); } else e1000_reset(adapter); } else return e1000_force_mac_fc(hw); return 0; }
static int e1000_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) { struct e1000_adapter *adapter = netdev->priv; struct e1000_hw *hw = &adapter->hw; adapter->fc_autoneg = pause->autoneg; if(pause->rx_pause && pause->tx_pause) hw->fc = e1000_fc_full; else if(pause->rx_pause && !pause->tx_pause) hw->fc = e1000_fc_rx_pause; else if(!pause->rx_pause && pause->tx_pause) hw->fc = e1000_fc_tx_pause; else if(!pause->rx_pause && !pause->tx_pause) hw->fc = e1000_fc_none; hw->original_fc = hw->fc; if(adapter->fc_autoneg == AUTONEG_ENABLE) { if(netif_running(adapter->netdev)) { e1000_down(adapter); e1000_up(adapter); } else e1000_reset(adapter); } else return ((hw->media_type == e1000_media_type_fiber) ? e1000_setup_link(hw) : e1000_force_mac_fc(hw)); return 0; }
void e1000_force_flowctrl(struct e1000_hw *hw, int ifm) { enum e1000_fc_mode fc; fc = e1000_ifmedia2fc(ifm); if (hw->fc.current_mode != fc) { hw->fc.requested_mode = fc; hw->fc.current_mode = fc; e1000_force_mac_fc(hw); } }