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;
}
Esempio n. 2
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;
}
Esempio n. 3
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);
	}
}