struct nx_host_sds_ring *sds_ring;
        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 
-       if ((adapter->flags & NETXEN_NIC_MSIX_ENABLED) &&
-                       adapter->rss_supported)
-               adapter->max_sds_rings = (num_online_cpus() >= 4) ? 4 : 2;
-       else
-               adapter->max_sds_rings = 1;
-
        if (netxen_alloc_sds_rings(recv_ctx, adapter->max_sds_rings))
                return 1;
 
 
        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
                sds_ring = &recv_ctx->sds_rings[ring];
-               netxen_nic_disable_int(sds_ring);
                napi_disable(&sds_ring->napi);
+               netxen_nic_disable_int(sds_ring);
+               synchronize_irq(sds_ring->irq);
        }
 }
 
        }
 }
 
-static void netxen_init_msix_entries(struct netxen_adapter *adapter)
+static void netxen_init_msix_entries(struct netxen_adapter *adapter, int count)
 {
        int i;
 
-       for (i = 0; i < MSIX_ENTRIES_PER_ADAPTER; i++)
+       for (i = 0; i < count; i++)
                adapter->msix_entries[i].entry = i;
 }
 
 {
        struct netxen_legacy_intr_set *legacy_intrp;
        struct pci_dev *pdev = adapter->pdev;
+       int err, num_msix;
+
+       if (adapter->rss_supported) {
+               num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ?
+                       MSIX_ENTRIES_PER_ADAPTER : 2;
+       } else
+               num_msix = 1;
+
+       adapter->max_sds_rings = 1;
 
        adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
 
 
        if (adapter->msix_supported) {
 
-               netxen_init_msix_entries(adapter);
-               if (pci_enable_msix(pdev, adapter->msix_entries,
-                                       MSIX_ENTRIES_PER_ADAPTER))
-                       goto request_msi;
+               netxen_init_msix_entries(adapter, num_msix);
+               err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
+               if (err == 0) {
+                       adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
+                       netxen_set_msix_bit(pdev, 1);
 
-               adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
-               netxen_set_msix_bit(pdev, 1);
-               dev_info(&pdev->dev, "using msi-x interrupts\n");
+                       if (adapter->rss_supported)
+                               adapter->max_sds_rings = num_msix;
 
-       } else {
-request_msi:
-               if (use_msi && !pci_enable_msi(pdev)) {
-                       adapter->flags |= NETXEN_NIC_MSI_ENABLED;
-                       adapter->msi_tgt_status =
-                               msi_tgt_status[adapter->ahw.pci_func];
-                       dev_info(&pdev->dev, "using msi interrupts\n");
-               } else
-                       dev_info(&pdev->dev, "using legacy interrupts\n");
-               adapter->msix_entries[0].vector = pdev->irq;
+                       dev_info(&pdev->dev, "using msi-x interrupts\n");
+                       return;
+               }
+
+               if (err > 0)
+                       pci_disable_msix(pdev);
+
+               /* fall through for msi */
        }
+
+       if (use_msi && !pci_enable_msi(pdev)) {
+               adapter->flags |= NETXEN_NIC_MSI_ENABLED;
+               adapter->msi_tgt_status =
+                       msi_tgt_status[adapter->ahw.pci_func];
+               dev_info(&pdev->dev, "using msi interrupts\n");
+               return;
+       }
+
+       dev_info(&pdev->dev, "using legacy interrupts\n");
+       adapter->msix_entries[0].vector = pdev->irq;
 }
 
 static void
 
        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
                sds_ring = &recv_ctx->sds_rings[ring];
-               sprintf(sds_ring->name, "%16s[%d]", netdev->name, ring);
+               sprintf(sds_ring->name, "%s[%d]", netdev->name, ring);
                err = request_irq(sds_ring->irq, handler,
                                  flags, sds_ring->name, sds_ring);
                if (err)
 {
        netif_carrier_off(netdev);
        netif_stop_queue(netdev);
-       smp_mb();
-       netxen_napi_disable(adapter);
 
        if (adapter->stop_port)
                adapter->stop_port(adapter);
        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
                netxen_p3_free_mac_list(adapter);
 
+       netxen_napi_disable(adapter);
+
        netxen_release_tx_buffers(adapter);
 
        FLUSH_SCHEDULED_WORK();
 static void
 netxen_nic_detach(struct netxen_adapter *adapter)
 {
-       netxen_nic_free_irq(adapter);
-
        netxen_release_rx_buffers(adapter);
        netxen_free_hw_resources(adapter);
+       netxen_nic_free_irq(adapter);
        netxen_free_sw_resources(adapter);
 
        adapter->is_up = 0;