diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 37 | 
1 files changed, 13 insertions, 24 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 1298b69f990b..dc853b0863af 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -1914,30 +1914,20 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)  	struct net_device *netdev = data;  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw; -	u32 icr; -	bool enable = true; - -	icr = er32(ICR); -	if (icr & E1000_ICR_RXO) { -		ew32(ICR, E1000_ICR_RXO); -		enable = false; -		/* napi poll will re-enable Other, make sure it runs */ -		if (napi_schedule_prep(&adapter->napi)) { -			adapter->total_rx_bytes = 0; -			adapter->total_rx_packets = 0; -			__napi_schedule(&adapter->napi); -		} -	} +	u32 icr = er32(ICR); + +	if (icr & adapter->eiac_mask) +		ew32(ICS, (icr & adapter->eiac_mask)); +  	if (icr & E1000_ICR_LSC) { -		ew32(ICR, E1000_ICR_LSC);  		hw->mac.get_link_status = true;  		/* guard against interrupt when we're going down */  		if (!test_bit(__E1000_DOWN, &adapter->state))  			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	} -	if (enable && !test_bit(__E1000_DOWN, &adapter->state)) -		ew32(IMS, E1000_IMS_OTHER); +	if (!test_bit(__E1000_DOWN, &adapter->state)) +		ew32(IMS, E1000_IMS_OTHER | IMS_OTHER_MASK);  	return IRQ_HANDLED;  } @@ -2040,7 +2030,6 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)  		       hw->hw_addr + E1000_EITR_82574(vector));  	else  		writel(1, hw->hw_addr + E1000_EITR_82574(vector)); -	adapter->eiac_mask |= E1000_IMS_OTHER;  	/* Cause Tx interrupts on every write back */  	ivar |= BIT(31); @@ -2265,7 +2254,8 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)  	if (adapter->msix_entries) {  		ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574); -		ew32(IMS, adapter->eiac_mask | E1000_IMS_LSC); +		ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | +		     IMS_OTHER_MASK);  	} else if (hw->mac.type >= e1000_pch_lpt) {  		ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);  	} else { @@ -2333,8 +2323,8 @@ static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,  {  	struct pci_dev *pdev = adapter->pdev; -	ring->desc = dma_alloc_coherent(&pdev->dev, ring->size, &ring->dma, -					GFP_KERNEL); +	ring->desc = dma_zalloc_coherent(&pdev->dev, ring->size, &ring->dma, +					 GFP_KERNEL);  	if (!ring->desc)  		return -ENOMEM; @@ -2707,8 +2697,7 @@ static int e1000e_poll(struct napi_struct *napi, int weight)  		napi_complete_done(napi, work_done);  		if (!test_bit(__E1000_DOWN, &adapter->state)) {  			if (adapter->msix_entries) -				ew32(IMS, adapter->rx_ring->ims_val | -				     E1000_IMS_OTHER); +				ew32(IMS, adapter->rx_ring->ims_val);  			else  				e1000_irq_enable(adapter);  		} @@ -5101,7 +5090,7 @@ static bool e1000e_has_link(struct e1000_adapter *adapter)  	case e1000_media_type_copper:  		if (hw->mac.get_link_status) {  			ret_val = hw->mac.ops.check_for_link(hw); -			link_active = ret_val > 0; +			link_active = !hw->mac.get_link_status;  		} else {  			link_active = true;  		}  |