pci_msi_teardown_msi_irqs(dev);
 
        list_for_each_entry_safe(entry, tmp, msi_list, list) {
-               if (entry->pci.msi_attrib.is_msix) {
-                       if (list_is_last(&entry->list, msi_list))
-                               iounmap(entry->pci.mask_base);
-               }
-
                list_del(&entry->list);
                free_msi_entry(entry);
        }
+
+       if (dev->msix_base) {
+               iounmap(dev->msix_base);
+               dev->msix_base = NULL;
+       }
 }
 
 static void pci_intx_for_msi(struct pci_dev *dev, int enable)
        for (i = 0, curmsk = masks; i < nvec; i++) {
                entry = alloc_msi_entry(&dev->dev, 1, curmsk);
                if (!entry) {
-                       if (!i)
-                               iounmap(base);
-                       else
-                               free_msi_irqs(dev);
                        /* No enough memory. Don't try again */
                        ret = -ENOMEM;
                        goto out;
                goto out_disable;
        }
 
+       dev->msix_base = base;
+
        /* Ensure that all table entries are masked. */
        msix_mask_all(base, tsize);
 
        ret = msix_setup_entries(dev, base, entries, nvec, affd);
        if (ret)
-               goto out_disable;
+               goto out_free;
 
        ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
        if (ret)