#include <linux/if_vlan.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
+#include <linux/pci.h>
 
 struct igb_adapter;
 
 #define IGB_MIN_ITR_USECS      10
 #define NON_Q_VECTORS          1
 #define MAX_Q_VECTORS          8
+#define MAX_MSIX_ENTRIES       10
 
 /* Transmit and receive queues */
 #define IGB_MAX_RX_QUEUES      8
 #define IGB_TX_PTHRESH ((hw->mac.type == e1000_i354) ? 20 : 8)
 #define IGB_TX_HTHRESH 1
 #define IGB_RX_WTHRESH ((hw->mac.type == e1000_82576 && \
-                         adapter->msix_entries) ? 1 : 4)
+                         (adapter->flags & IGB_FLAG_HAS_MSIX)) ? 1 : 4)
 #define IGB_TX_WTHRESH ((hw->mac.type == e1000_82576 && \
-                         adapter->msix_entries) ? 1 : 16)
+                         (adapter->flags & IGB_FLAG_HAS_MSIX)) ? 1 : 16)
 
 /* this is the size past which hardware will drop packets when setting LPE=0 */
 #define MAXIMUM_ETHERNET_VLAN_SIZE 1522
        unsigned int flags;
 
        unsigned int num_q_vectors;
-       struct msix_entry *msix_entries;
+       struct msix_entry msix_entries[MAX_MSIX_ENTRIES];
 
        /* Interrupt Throttle Rate */
        u32 rx_itr_setting;
 #define IGB_FLAG_MEDIA_RESET           (1 << 10)
 #define IGB_FLAG_MAS_CAPABLE           (1 << 11)
 #define IGB_FLAG_MAS_ENABLE            (1 << 12)
+#define IGB_FLAG_HAS_MSIX              (1 << 13)
 
 /* Media Auto Sense */
 #define IGB_MAS_ENABLE_0               0X0001
 
                        msixbm = E1000_EICR_RX_QUEUE0 << rx_queue;
                if (tx_queue > IGB_N0_QUEUE)
                        msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue;
-               if (!adapter->msix_entries && msix_vector == 0)
+               if (!(adapter->flags & IGB_FLAG_HAS_MSIX) && msix_vector == 0)
                        msixbm |= E1000_EIMS_OTHER;
                array_wr32(E1000_MSIXBM(0), msix_vector, msixbm);
                q_vector->eims_value = msixbm;
 {
        int v_idx = adapter->num_q_vectors;
 
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX)
                pci_disable_msix(adapter->pdev);
-               kfree(adapter->msix_entries);
-               adapter->msix_entries = NULL;
-       } else if (adapter->flags & IGB_FLAG_HAS_MSI) {
+       else if (adapter->flags & IGB_FLAG_HAS_MSI)
                pci_disable_msi(adapter->pdev);
-       }
 
        while (v_idx--)
                igb_reset_q_vector(adapter, v_idx);
 
        if (!msix)
                goto msi_only;
+       adapter->flags |= IGB_FLAG_HAS_MSIX;
 
        /* Number of supported queues. */
        adapter->num_rx_queues = adapter->rss_queues;
 
        /* add 1 vector for link status interrupts */
        numvecs++;
-       adapter->msix_entries = kcalloc(numvecs, sizeof(struct msix_entry),
-                                       GFP_KERNEL);
-
-       if (!adapter->msix_entries)
-               goto msi_only;
-
        for (i = 0; i < numvecs; i++)
                adapter->msix_entries[i].entry = i;
 
        struct pci_dev *pdev = adapter->pdev;
        int err = 0;
 
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX) {
                err = igb_request_msix(adapter);
                if (!err)
                        goto request_done;
 
 static void igb_free_irq(struct igb_adapter *adapter)
 {
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX) {
                int vector = 0, i;
 
                free_irq(adapter->msix_entries[vector++].vector, adapter);
         * mapped into these registers and so clearing the bits can cause
         * issues on the VF drivers so we only need to clear what we set
         */
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX) {
                u32 regval = rd32(E1000_EIAM);
                wr32(E1000_EIAM, regval & ~adapter->eims_enable_mask);
                wr32(E1000_EIMC, adapter->eims_enable_mask);
        wr32(E1000_IAM, 0);
        wr32(E1000_IMC, ~0);
        wrfl();
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX) {
                int i;
                for (i = 0; i < adapter->num_q_vectors; i++)
                        synchronize_irq(adapter->msix_entries[i].vector);
 {
        struct e1000_hw *hw = &adapter->hw;
 
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX) {
                u32 ims = E1000_IMS_LSC | E1000_IMS_DOUTSYNC | E1000_IMS_DRSTA;
                u32 regval = rd32(E1000_EIAC);
                wr32(E1000_EIAC, regval | adapter->eims_enable_mask);
        for (i = 0; i < adapter->num_q_vectors; i++)
                napi_enable(&(adapter->q_vector[i]->napi));
 
-       if (adapter->msix_entries)
+       if (adapter->flags & IGB_FLAG_HAS_MSIX)
                igb_configure_msix(adapter);
        else
                igb_assign_vector(adapter->q_vector[0], 0);
        dev_info(&pdev->dev, "%s: PBA No: %s\n", netdev->name, part_str);
        dev_info(&pdev->dev,
                "Using %s interrupts. %d rx queue(s), %d tx queue(s)\n",
-               adapter->msix_entries ? "MSI-X" :
+               (adapter->flags & IGB_FLAG_HAS_MSIX) ? "MSI-X" :
                (adapter->flags & IGB_FLAG_HAS_MSI) ? "MSI" : "legacy",
                adapter->num_rx_queues, adapter->num_tx_queues);
        switch (hw->mac.type) {
        int err = 0;
        int i;
 
-       if (!adapter->msix_entries || num_vfs > 7) {
+       if (!(adapter->flags & IGB_FLAG_HAS_MSIX) || num_vfs > 7) {
                err = -EPERM;
                goto out;
        }
        }
 
        /* Cause software interrupt to ensure Rx ring is cleaned */
-       if (adapter->msix_entries) {
+       if (adapter->flags & IGB_FLAG_HAS_MSIX) {
                u32 eics = 0;
                for (i = 0; i < adapter->num_q_vectors; i++)
                        eics |= adapter->q_vector[i]->eims_value;
        }
 
        if (!test_bit(__IGB_DOWN, &adapter->state)) {
-               if (adapter->msix_entries)
+               if (adapter->flags & IGB_FLAG_HAS_MSIX)
                        wr32(E1000_EIMS, q_vector->eims_value);
                else
                        igb_irq_enable(adapter);
 
        for (i = 0; i < adapter->num_q_vectors; i++) {
                q_vector = adapter->q_vector[i];
-               if (adapter->msix_entries)
+               if (adapter->flags & IGB_FLAG_HAS_MSIX)
                        wr32(E1000_EIMC, q_vector->eims_value);
                else
                        igb_irq_disable(adapter);