diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 51 | 
1 files changed, 35 insertions, 16 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 98346eb064d5..b46bff8fe056 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -146,7 +146,7 @@ static int igb_poll(struct napi_struct *, int);  static bool igb_clean_tx_irq(struct igb_q_vector *, int);  static int igb_clean_rx_irq(struct igb_q_vector *, int);  static int igb_ioctl(struct net_device *, struct ifreq *, int cmd); -static void igb_tx_timeout(struct net_device *); +static void igb_tx_timeout(struct net_device *, unsigned int txqueue);  static void igb_reset_task(struct work_struct *);  static void igb_vlan_mode(struct net_device *netdev,  			  netdev_features_t features); @@ -4468,6 +4468,37 @@ static inline void igb_set_vmolr(struct igb_adapter *adapter,  }  /** + *  igb_setup_srrctl - configure the split and replication receive control + *                     registers + *  @adapter: Board private structure + *  @ring: receive ring to be configured + **/ +void igb_setup_srrctl(struct igb_adapter *adapter, struct igb_ring *ring) +{ +	struct e1000_hw *hw = &adapter->hw; +	int reg_idx = ring->reg_idx; +	u32 srrctl = 0; + +	srrctl = IGB_RX_HDR_LEN << E1000_SRRCTL_BSIZEHDRSIZE_SHIFT; +	if (ring_uses_large_buffer(ring)) +		srrctl |= IGB_RXBUFFER_3072 >> E1000_SRRCTL_BSIZEPKT_SHIFT; +	else +		srrctl |= IGB_RXBUFFER_2048 >> E1000_SRRCTL_BSIZEPKT_SHIFT; +	srrctl |= E1000_SRRCTL_DESCTYPE_ADV_ONEBUF; +	if (hw->mac.type >= e1000_82580) +		srrctl |= E1000_SRRCTL_TIMESTAMP; +	/* Only set Drop Enable if VFs allocated, or we are supporting multiple +	 * queues and rx flow control is disabled +	 */ +	if (adapter->vfs_allocated_count || +	    (!(hw->fc.current_mode & e1000_fc_rx_pause) && +	     adapter->num_rx_queues > 1)) +		srrctl |= E1000_SRRCTL_DROP_EN; + +	wr32(E1000_SRRCTL(reg_idx), srrctl); +} + +/**   *  igb_configure_rx_ring - Configure a receive ring after Reset   *  @adapter: board private structure   *  @ring: receive ring to be configured @@ -4481,7 +4512,7 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,  	union e1000_adv_rx_desc *rx_desc;  	u64 rdba = ring->dma;  	int reg_idx = ring->reg_idx; -	u32 srrctl = 0, rxdctl = 0; +	u32 rxdctl = 0;  	/* disable the queue */  	wr32(E1000_RXDCTL(reg_idx), 0); @@ -4499,19 +4530,7 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,  	writel(0, ring->tail);  	/* set descriptor configuration */ -	srrctl = IGB_RX_HDR_LEN << E1000_SRRCTL_BSIZEHDRSIZE_SHIFT; -	if (ring_uses_large_buffer(ring)) -		srrctl |= IGB_RXBUFFER_3072 >> E1000_SRRCTL_BSIZEPKT_SHIFT; -	else -		srrctl |= IGB_RXBUFFER_2048 >> E1000_SRRCTL_BSIZEPKT_SHIFT; -	srrctl |= E1000_SRRCTL_DESCTYPE_ADV_ONEBUF; -	if (hw->mac.type >= e1000_82580) -		srrctl |= E1000_SRRCTL_TIMESTAMP; -	/* Only set Drop Enable if we are supporting multiple queues */ -	if (adapter->vfs_allocated_count || adapter->num_rx_queues > 1) -		srrctl |= E1000_SRRCTL_DROP_EN; - -	wr32(E1000_SRRCTL(reg_idx), srrctl); +	igb_setup_srrctl(adapter, ring);  	/* set filtering for VMDQ pools */  	igb_set_vmolr(adapter, reg_idx & 0x7, true); @@ -6184,7 +6203,7 @@ static netdev_tx_t igb_xmit_frame(struct sk_buff *skb,   *  igb_tx_timeout - Respond to a Tx Hang   *  @netdev: network interface device structure   **/ -static void igb_tx_timeout(struct net_device *netdev) +static void igb_tx_timeout(struct net_device *netdev, unsigned int txqueue)  {  	struct igb_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw;  |