alx_write_mem32(hw, ALX_MSI_ID_MAP, 0);
 }
 
+static void alx_init_intr(struct alx_priv *alx, bool msix)
+{
+       if (!(alx->flags & ALX_FLAG_USING_MSIX)) {
+               if (!pci_enable_msi(alx->hw.pdev))
+                       alx->flags |= ALX_FLAG_USING_MSI;
+       }
+}
+
+static void alx_disable_advanced_intr(struct alx_priv *alx)
+{
+       if (alx->flags & ALX_FLAG_USING_MSI) {
+               pci_disable_msi(alx->hw.pdev);
+               alx->flags &= ~ALX_FLAG_USING_MSI;
+       }
+}
+
 static void alx_irq_enable(struct alx_priv *alx)
 {
        struct alx_hw *hw = &alx->hw;
 
        msi_ctrl = (hw->imt >> 1) << ALX_MSI_RETRANS_TM_SHIFT;
 
-       if (!pci_enable_msi(alx->hw.pdev)) {
-               alx->msi = true;
-
+       if (alx->flags & ALX_FLAG_USING_MSI) {
                alx_write_mem32(hw, ALX_MSI_RETRANS_TIMER,
                                msi_ctrl | ALX_MSI_MASK_SEL_LINE);
                err = request_irq(pdev->irq, alx_intr_msi, 0,
                if (!err)
                        goto out;
                /* fall back to legacy interrupt */
+               alx->flags &= ~ALX_FLAG_USING_MSI;
                pci_disable_msi(alx->hw.pdev);
        }
 
 
        free_irq(pdev->irq, alx);
 
-       if (alx->msi) {
-               pci_disable_msi(alx->hw.pdev);
-               alx->msi = false;
-       }
+       alx_disable_advanced_intr(alx);
 }
 
 static int alx_identify_hw(struct alx_priv *alx)
 {
        int err;
 
+       alx_init_intr(alx, false);
+
        if (!resume)
                netif_carrier_off(alx->dev);
 
 {
        struct alx_priv *alx = netdev_priv(netdev);
 
-       if (alx->msi)
+       if (alx->flags & ALX_FLAG_USING_MSI)
                alx_intr_msi(0, alx);
        else
                alx_intr_legacy(0, alx);