diff options
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 31 | 
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 4a25b8fa908..e7b10272348 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -948,7 +948,7 @@ static void igb_clear_interrupt_scheme(struct igb_adapter *adapter)   * Attempt to configure interrupts using the best available   * capabilities of the hardware and kernel.   **/ -static int igb_set_interrupt_capability(struct igb_adapter *adapter) +static void igb_set_interrupt_capability(struct igb_adapter *adapter)  {  	int err;  	int numvecs, i; @@ -985,7 +985,7 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter)  			      adapter->msix_entries,  			      numvecs);  	if (err == 0) -		goto out; +		return;  	igb_reset_interrupt_capability(adapter); @@ -1015,14 +1015,6 @@ msi_only:  	adapter->num_q_vectors = 1;  	if (!pci_enable_msi(adapter->pdev))  		adapter->flags |= IGB_FLAG_HAS_MSI; -out: -	/* Notify the stack of the (possibly) reduced queue counts. */ -	rtnl_lock(); -	netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); -	err = netif_set_real_num_rx_queues(adapter->netdev, -		adapter->num_rx_queues); -	rtnl_unlock(); -	return err;  }  static void igb_add_ring(struct igb_ring *ring, @@ -1212,9 +1204,7 @@ static int igb_init_interrupt_scheme(struct igb_adapter *adapter)  	struct pci_dev *pdev = adapter->pdev;  	int err; -	err = igb_set_interrupt_capability(adapter); -	if (err) -		return err; +	igb_set_interrupt_capability(adapter);  	err = igb_alloc_q_vectors(adapter);  	if (err) { @@ -2543,6 +2533,17 @@ static int __igb_open(struct net_device *netdev, bool resuming)  	if (err)  		goto err_req_irq; +	/* Notify the stack of the actual queue counts. */ +	err = netif_set_real_num_tx_queues(adapter->netdev, +					   adapter->num_tx_queues); +	if (err) +		goto err_set_queues; + +	err = netif_set_real_num_rx_queues(adapter->netdev, +					   adapter->num_rx_queues); +	if (err) +		goto err_set_queues; +  	/* From here on the code is the same as igb_up() */  	clear_bit(__IGB_DOWN, &adapter->state); @@ -2572,6 +2573,8 @@ static int __igb_open(struct net_device *netdev, bool resuming)  	return 0; +err_set_queues: +	igb_free_irq(adapter);  err_req_irq:  	igb_release_hw_control(adapter);  	igb_power_down_link(adapter); @@ -6841,7 +6844,9 @@ static int igb_resume(struct device *dev)  	wr32(E1000_WUS, ~0);  	if (netdev->flags & IFF_UP) { +		rtnl_lock();  		err = __igb_open(netdev, true); +		rtnl_unlock();  		if (err)  			return err;  	}  |