]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
ixgbevf: Handle previously-freed msix_entries
[karo-tx-linux.git] / drivers / net / ethernet / intel / ixgbevf / ixgbevf_main.c
index 7eaac323404990073439d243e884801bee61db3c..d316f503a7279c8e9c608199a6966bfd9a2639b3 100644 (file)
@@ -1498,6 +1498,9 @@ static void ixgbevf_free_irq(struct ixgbevf_adapter *adapter)
 {
        int i, q_vectors;
 
+       if (!adapter->msix_entries)
+               return;
+
        q_vectors = adapter->num_msix_vectors;
        i = q_vectors - 1;
 
@@ -2552,6 +2555,9 @@ static void ixgbevf_free_q_vectors(struct ixgbevf_adapter *adapter)
  **/
 static void ixgbevf_reset_interrupt_capability(struct ixgbevf_adapter *adapter)
 {
+       if (!adapter->msix_entries)
+               return;
+
        pci_disable_msix(adapter->pdev);
        kfree(adapter->msix_entries);
        adapter->msix_entries = NULL;
@@ -3742,24 +3748,8 @@ static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu)
        struct ixgbevf_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
-       int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE;
        int ret;
 
-       switch (adapter->hw.api_version) {
-       case ixgbe_mbox_api_11:
-       case ixgbe_mbox_api_12:
-               max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE;
-               break;
-       default:
-               if (adapter->hw.mac.type != ixgbe_mac_82599_vf)
-                       max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE;
-               break;
-       }
-
-       /* MTU < 68 is an error and causes problems on some kernels */
-       if ((new_mtu < 68) || (max_frame > max_possible_frame))
-               return -EINVAL;
-
        spin_lock_bh(&adapter->mbx_lock);
        /* notify the PF of our intent to use this size of frame */
        ret = hw->mac.ops.set_rlpml(hw, max_frame);
@@ -3810,11 +3800,10 @@ static int ixgbevf_suspend(struct pci_dev *pdev, pm_message_t state)
                ixgbevf_free_irq(adapter);
                ixgbevf_free_all_tx_resources(adapter);
                ixgbevf_free_all_rx_resources(adapter);
+               ixgbevf_clear_interrupt_scheme(adapter);
                rtnl_unlock();
        }
 
-       ixgbevf_clear_interrupt_scheme(adapter);
-
 #ifdef CONFIG_PM
        retval = pci_save_state(pdev);
        if (retval)
@@ -4104,6 +4093,23 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        netdev->priv_flags |= IFF_UNICAST_FLT;
 
+       /* MTU range: 68 - 1504 or 9710 */
+       netdev->min_mtu = ETH_MIN_MTU;
+       switch (adapter->hw.api_version) {
+       case ixgbe_mbox_api_11:
+       case ixgbe_mbox_api_12:
+               netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE -
+                                 (ETH_HLEN + ETH_FCS_LEN);
+               break;
+       default:
+               if (adapter->hw.mac.type != ixgbe_mac_82599_vf)
+                       netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE -
+                                         (ETH_HLEN + ETH_FCS_LEN);
+               else
+                       netdev->max_mtu = ETH_DATA_LEN + ETH_FCS_LEN;
+               break;
+       }
+
        if (IXGBE_REMOVED(hw->hw_addr)) {
                err = -EIO;
                goto err_sw_init;