diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 26 | 
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index ea7b09887245..31e5f3942839 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -946,7 +946,6 @@ static void igb_configure_msix(struct igb_adapter *adapter)  static int igb_request_msix(struct igb_adapter *adapter)  {  	struct net_device *netdev = adapter->netdev; -	struct e1000_hw *hw = &adapter->hw;  	int i, err = 0, vector = 0, free_vector = 0;  	err = request_irq(adapter->msix_entries[vector].vector, @@ -959,7 +958,7 @@ static int igb_request_msix(struct igb_adapter *adapter)  		vector++; -		q_vector->itr_register = hw->hw_addr + E1000_EITR(vector); +		q_vector->itr_register = adapter->io_addr + E1000_EITR(vector);  		if (q_vector->rx.ring && q_vector->tx.ring)  			sprintf(q_vector->name, "%s-TxRx-%u", netdev->name, @@ -1230,7 +1229,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,  	q_vector->tx.work_limit = adapter->tx_work_limit;  	/* initialize ITR configuration */ -	q_vector->itr_register = adapter->hw.hw_addr + E1000_EITR(0); +	q_vector->itr_register = adapter->io_addr + E1000_EITR(0);  	q_vector->itr_val = IGB_START_ITR;  	/* initialize pointer to rings */ @@ -2294,9 +2293,11 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);  	err = -EIO; -	hw->hw_addr = pci_iomap(pdev, 0, 0); -	if (!hw->hw_addr) +	adapter->io_addr = pci_iomap(pdev, 0, 0); +	if (!adapter->io_addr)  		goto err_ioremap; +	/* hw->hw_addr can be altered, we'll use adapter->io_addr for unmap */ +	hw->hw_addr = adapter->io_addr;  	netdev->netdev_ops = &igb_netdev_ops;  	igb_set_ethtool_ops(netdev); @@ -2378,8 +2379,8 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	}  	if (hw->mac.type >= e1000_82576) { -		netdev->hw_features |= NETIF_F_SCTP_CSUM; -		netdev->features |= NETIF_F_SCTP_CSUM; +		netdev->hw_features |= NETIF_F_SCTP_CRC; +		netdev->features |= NETIF_F_SCTP_CRC;  	}  	netdev->priv_flags |= IFF_UNICAST_FLT; @@ -2656,7 +2657,7 @@ err_sw_init:  #ifdef CONFIG_PCI_IOV  	igb_disable_sriov(pdev);  #endif -	pci_iounmap(pdev, hw->hw_addr); +	pci_iounmap(pdev, adapter->io_addr);  err_ioremap:  	free_netdev(netdev);  err_alloc_etherdev: @@ -2823,7 +2824,7 @@ static void igb_remove(struct pci_dev *pdev)  	igb_clear_interrupt_scheme(adapter); -	pci_iounmap(pdev, hw->hw_addr); +	pci_iounmap(pdev, adapter->io_addr);  	if (hw->flash_address)  		iounmap(hw->flash_address);  	pci_release_selected_regions(pdev, @@ -2856,6 +2857,13 @@ static void igb_probe_vfs(struct igb_adapter *adapter)  	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))  		return; +	/* Of the below we really only want the effect of getting +	 * IGB_FLAG_HAS_MSIX set (if available), without which +	 * igb_enable_sriov() has no effect. +	 */ +	igb_set_interrupt_capability(adapter, true); +	igb_reset_interrupt_capability(adapter); +  	pci_sriov_set_totalvfs(pdev, 7);  	igb_enable_sriov(pdev, max_vfs);  | 
