netxen: fix build with without CONFIG_PM
[firefly-linux-kernel-4.4.55.git] / drivers / net / netxen / netxen_nic_main.c
index 31966a044900feba69d074e7d49a7778bc884781..43ac333898bfb3f8240d20425c01ff02f28c1ce9 100644 (file)
@@ -107,10 +107,14 @@ static uint32_t crb_cmd_producer[4] = {
 
 void
 netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
-               struct nx_host_tx_ring *tx_ring, u32 producer)
+               struct nx_host_tx_ring *tx_ring)
 {
-       adapter->hw_write_wx(adapter,
-                       tx_ring->crb_cmd_producer, producer);
+       NXWR32(adapter, tx_ring->crb_cmd_producer, tx_ring->producer);
+
+       if (netxen_tx_avail(tx_ring) <= TX_STOP_THRESH) {
+               netif_stop_queue(adapter->netdev);
+               smp_mb();
+       }
 }
 
 static uint32_t crb_cmd_consumer[4] = {
@@ -120,10 +124,9 @@ static uint32_t crb_cmd_consumer[4] = {
 
 static inline void
 netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
-               struct nx_host_tx_ring *tx_ring, u32 consumer)
+               struct nx_host_tx_ring *tx_ring)
 {
-       adapter->hw_write_wx(adapter,
-                       tx_ring->crb_cmd_consumer, consumer);
+       NXWR32(adapter, tx_ring->crb_cmd_consumer, tx_ring->sw_consumer);
 }
 
 static uint32_t msi_tgt_status[8] = {
@@ -139,14 +142,14 @@ static inline void netxen_nic_disable_int(struct nx_host_sds_ring *sds_ring)
 {
        struct netxen_adapter *adapter = sds_ring->adapter;
 
-       adapter->hw_write_wx(adapter, sds_ring->crb_intr_mask, 0);
+       NXWR32(adapter, sds_ring->crb_intr_mask, 0);
 }
 
 static inline void netxen_nic_enable_int(struct nx_host_sds_ring *sds_ring)
 {
        struct netxen_adapter *adapter = sds_ring->adapter;
 
-       adapter->hw_write_wx(adapter, sds_ring->crb_intr_mask, 0x1);
+       NXWR32(adapter, sds_ring->crb_intr_mask, 0x1);
 
        if (!NETXEN_IS_MSI_FAMILY(adapter))
                adapter->pci_write_immediate(adapter,
@@ -177,11 +180,6 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
        struct nx_host_sds_ring *sds_ring;
        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 
-       if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
-               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;
 
@@ -217,8 +215,9 @@ netxen_napi_disable(struct netxen_adapter *adapter)
 
        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);
        }
 }
 
@@ -262,7 +261,7 @@ nx_update_dma_mask(struct netxen_adapter *adapter)
 
        change = 0;
 
-       shift = netxen_nic_reg_read(adapter, CRB_DMA_SHIFT);
+       shift = NXRD32(adapter, CRB_DMA_SHIFT);
        if (shift >= 32)
                return 0;
 
@@ -290,10 +289,21 @@ static void netxen_check_options(struct netxen_adapter *adapter)
        else if (adapter->ahw.port_type == NETXEN_NIC_GBE)
                adapter->num_rxd = MAX_RCV_DESCRIPTORS_1G;
 
-       if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
+       adapter->msix_supported = 0;
+       if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
                adapter->msix_supported = !!use_msi_x;
-       else
-               adapter->msix_supported = 0;
+               adapter->rss_supported = !!use_msi_x;
+       } else if (adapter->fw_version >= NETXEN_VERSION_CODE(3, 4, 336)) {
+               switch (adapter->ahw.board_type) {
+               case NETXEN_BRDTYPE_P2_SB31_10G:
+               case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
+                       adapter->msix_supported = !!use_msi_x;
+                       adapter->rss_supported = !!use_msi_x;
+                       break;
+               default:
+                       break;
+               }
+       }
 
        adapter->num_txd = MAX_CMD_DESCRIPTORS_HOST;
        adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS;
@@ -309,42 +319,34 @@ netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
 
        if (first_boot == 0x55555555) {
                /* This is the first boot after power up */
-               adapter->hw_write_wx(adapter,
-                       NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
+               NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
 
                if (!NX_IS_REVISION_P2(adapter->ahw.revision_id))
                        return 0;
 
                /* PCI bus master workaround */
-               first_boot = adapter->hw_read_wx(adapter, NETXEN_PCIE_REG(0x4));
+               first_boot = NXRD32(adapter, NETXEN_PCIE_REG(0x4));
                if (!(first_boot & 0x4)) {
                        first_boot |= 0x4;
-                       adapter->hw_write_wx(adapter,
-                               NETXEN_PCIE_REG(0x4), first_boot);
-                       first_boot = adapter->hw_read_wx(adapter,
-                               NETXEN_PCIE_REG(0x4));
+                       NXWR32(adapter, NETXEN_PCIE_REG(0x4), first_boot);
+                       first_boot = NXRD32(adapter, NETXEN_PCIE_REG(0x4));
                }
 
                /* This is the first boot after power up */
-               first_boot = adapter->hw_read_wx(adapter,
-                       NETXEN_ROMUSB_GLB_SW_RESET);
+               first_boot = NXRD32(adapter, NETXEN_ROMUSB_GLB_SW_RESET);
                if (first_boot != 0x80000f) {
                        /* clear the register for future unloads/loads */
-                       adapter->hw_write_wx(adapter,
-                                       NETXEN_CAM_RAM(0x1fc), 0);
+                       NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), 0);
                        return -EIO;
                }
 
                /* Start P2 boot loader */
-               val = adapter->hw_read_wx(adapter,
-                               NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
-               adapter->hw_write_wx(adapter,
-                               NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
+               val = NXRD32(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
+               NXWR32(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
                timeout = 0;
                do {
                        msleep(1);
-                       val = adapter->hw_read_wx(adapter,
-                                       NETXEN_CAM_RAM(0x1fc));
+                       val = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
 
                        if (++timeout > 5000)
                                return -EIO;
@@ -363,24 +365,19 @@ static void netxen_set_port_mode(struct netxen_adapter *adapter)
                (val == NETXEN_BRDTYPE_P3_XG_LOM)) {
                if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
                        data = NETXEN_PORT_MODE_802_3_AP;
-                       adapter->hw_write_wx(adapter,
-                               NETXEN_PORT_MODE_ADDR, data);
+                       NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
                } else if (port_mode == NETXEN_PORT_MODE_XG) {
                        data = NETXEN_PORT_MODE_XG;
-                       adapter->hw_write_wx(adapter,
-                               NETXEN_PORT_MODE_ADDR, data);
+                       NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
                } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_1G) {
                        data = NETXEN_PORT_MODE_AUTO_NEG_1G;
-                       adapter->hw_write_wx(adapter,
-                               NETXEN_PORT_MODE_ADDR, data);
+                       NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
                } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_XG) {
                        data = NETXEN_PORT_MODE_AUTO_NEG_XG;
-                       adapter->hw_write_wx(adapter,
-                               NETXEN_PORT_MODE_ADDR, data);
+                       NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
                } else {
                        data = NETXEN_PORT_MODE_AUTO_NEG;
-                       adapter->hw_write_wx(adapter,
-                               NETXEN_PORT_MODE_ADDR, data);
+                       NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
                }
 
                if ((wol_port_mode != NETXEN_PORT_MODE_802_3_AP) &&
@@ -389,8 +386,7 @@ static void netxen_set_port_mode(struct netxen_adapter *adapter)
                        (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_XG)) {
                        wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG;
                }
-               adapter->hw_write_wx(adapter, NETXEN_WOL_PORT_MODE,
-                       wol_port_mode);
+               NXWR32(adapter, NETXEN_WOL_PORT_MODE, wol_port_mode);
        }
 }
 
@@ -410,11 +406,11 @@ static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
        }
 }
 
-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;
 }
 
@@ -445,20 +441,38 @@ netxen_read_mac_addr(struct netxen_adapter *adapter)
 
        if (!is_valid_ether_addr(netdev->perm_addr))
                dev_warn(&pdev->dev, "Bad MAC address %pM.\n", netdev->dev_addr);
-       else
-               adapter->macaddr_set(adapter, netdev->dev_addr);
 
        return 0;
 }
 
+int netxen_nic_set_mac(struct net_device *netdev, void *p)
+{
+       struct netxen_adapter *adapter = netdev_priv(netdev);
+       struct sockaddr *addr = p;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EINVAL;
+
+       if (netif_running(netdev)) {
+               netif_device_detach(netdev);
+               netxen_napi_disable(adapter);
+       }
+
+       memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
+       adapter->macaddr_set(adapter, addr->sa_data);
+
+       if (netif_running(netdev)) {
+               netif_device_attach(netdev);
+               netxen_napi_enable(adapter);
+       }
+       return 0;
+}
+
 static void netxen_set_multicast_list(struct net_device *dev)
 {
        struct netxen_adapter *adapter = netdev_priv(dev);
 
-       if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
-               netxen_p3_nic_set_multi(dev);
-       else
-               netxen_p2_nic_set_multi(dev);
+       adapter->set_multi(dev);
 }
 
 static const struct net_device_ops netxen_netdev_ops = {
@@ -481,6 +495,15 @@ netxen_setup_intr(struct netxen_adapter *adapter)
 {
        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);
 
@@ -497,24 +520,36 @@ netxen_setup_intr(struct netxen_adapter *adapter)
 
        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;
-                       dev_info(&pdev->dev, "using msi interrupts\n");
-               } else
-                       dev_info(&pdev->dev, "using legacy interrupts\n");
+                       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");
                adapter->msix_entries[0].vector = pdev->irq;
+               return;
        }
+
+       dev_info(&pdev->dev, "using legacy interrupts\n");
+       adapter->msix_entries[0].vector = pdev->irq;
 }
 
 static void
@@ -657,25 +692,22 @@ err_out:
 }
 
 static int
-netxen_start_firmware(struct netxen_adapter *adapter)
+netxen_start_firmware(struct netxen_adapter *adapter, int request_fw)
 {
        int val, err, first_boot;
        struct pci_dev *pdev = adapter->pdev;
 
        int first_driver = 0;
-       if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
-               if (adapter->ahw.pci_func == 0)
-                       first_driver = 1;
-       } else {
-               if (adapter->portnum == 0)
-                       first_driver = 1;
-       }
+
+       if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
+               first_driver = (adapter->portnum == 0);
+       else
+               first_driver = (adapter->ahw.pci_func == 0);
 
        if (!first_driver)
                return 0;
 
-       first_boot = adapter->hw_read_wx(adapter,
-                       NETXEN_CAM_RAM(0x1fc));
+       first_boot = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
 
        err = netxen_check_hw_init(adapter, first_boot);
        if (err) {
@@ -683,14 +715,16 @@ netxen_start_firmware(struct netxen_adapter *adapter)
                return err;
        }
 
+       if (request_fw)
+               netxen_request_firmware(adapter);
+
        if (first_boot != 0x55555555) {
-               adapter->hw_write_wx(adapter,
-                                       CRB_CMDPEG_STATE, 0);
+               NXWR32(adapter, CRB_CMDPEG_STATE, 0);
                netxen_pinit_from_rom(adapter, 0);
                msleep(1);
        }
 
-       netxen_nic_reg_write(adapter, CRB_DMA_SHIFT, 0x55555555);
+       NXWR32(adapter, CRB_DMA_SHIFT, 0x55555555);
        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
                netxen_set_port_mode(adapter);
 
@@ -702,8 +736,7 @@ netxen_start_firmware(struct netxen_adapter *adapter)
                val = 0x7654;
                if (adapter->ahw.port_type == NETXEN_NIC_XGBE)
                        val |= 0x0f000000;
-               netxen_crb_writelit_adapter(adapter,
-                               NETXEN_MAC_ADDR_CNTL_REG, val);
+               NXWR32(adapter, NETXEN_MAC_ADDR_CNTL_REG, val);
 
        }
 
@@ -717,7 +750,7 @@ netxen_start_firmware(struct netxen_adapter *adapter)
        val = (_NETXEN_NIC_LINUX_MAJOR << 16)
                | ((_NETXEN_NIC_LINUX_MINOR << 8))
                | (_NETXEN_NIC_LINUX_SUBVERSION);
-       adapter->hw_write_wx(adapter, CRB_DRIVER_VERSION, val);
+       NXWR32(adapter, CRB_DRIVER_VERSION, val);
 
        /* Handshake with the card before we register the devices. */
        err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
@@ -752,7 +785,7 @@ netxen_nic_request_irq(struct netxen_adapter *adapter)
 
        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)
@@ -787,24 +820,25 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
                                netxen_nic_driver_name, adapter->portnum);
                return err;
        }
-       adapter->macaddr_set(adapter, netdev->dev_addr);
-
-       netxen_nic_set_link_parameters(adapter);
+       if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
+               adapter->macaddr_set(adapter, netdev->dev_addr);
 
-       netxen_set_multicast_list(netdev);
-       if (adapter->set_mtu)
-               adapter->set_mtu(adapter, netdev->mtu);
+       adapter->set_multi(netdev);
+       adapter->set_mtu(adapter, netdev->mtu);
 
        adapter->ahw.linkup = 0;
-       mod_timer(&adapter->watchdog_timer, jiffies);
 
        netxen_napi_enable(adapter);
 
        if (adapter->max_sds_rings > 1)
                netxen_config_rss(adapter, 1);
 
-       if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
+       if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)
                netxen_linkevent_request(adapter, 1);
+       else
+               netxen_nic_set_link_parameters(adapter);
+
+       mod_timer(&adapter->watchdog_timer, jiffies);
 
        return 0;
 }
@@ -814,11 +848,15 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
 {
        netif_carrier_off(netdev);
        netif_stop_queue(netdev);
-       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();
@@ -863,12 +901,15 @@ netxen_nic_attach(struct netxen_adapter *adapter)
        }
 
        if (adapter->fw_major < 4) {
-               tx_ring = &adapter->tx_ring;
+               tx_ring = adapter->tx_ring;
                tx_ring->crb_cmd_producer = crb_cmd_producer[adapter->portnum];
                tx_ring->crb_cmd_consumer = crb_cmd_consumer[adapter->portnum];
 
-               netxen_nic_update_cmd_producer(adapter, tx_ring, 0);
-               netxen_nic_update_cmd_consumer(adapter, tx_ring, 0);
+               tx_ring->producer = 0;
+               tx_ring->sw_consumer = 0;
+
+               netxen_nic_update_cmd_producer(adapter, tx_ring);
+               netxen_nic_update_cmd_consumer(adapter, tx_ring);
        }
 
        for (ring = 0; ring < adapter->max_rds_rings; ring++) {
@@ -897,10 +938,9 @@ err_out_free_sw:
 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;
@@ -965,6 +1005,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        rwlock_init(&adapter->adapter_lock);
        spin_lock_init(&adapter->tx_clean_lock);
+       INIT_LIST_HEAD(&adapter->mac_list);
 
        err = netxen_setup_pci_map(adapter);
        if (err)
@@ -987,6 +1028,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
 
        netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
+       netdev->features |= (NETIF_F_GRO);
        netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
 
        if (NX_IS_REVISION_P3(revision_id)) {
@@ -1019,7 +1061,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                break;
        }
 
-       err = netxen_start_firmware(adapter);
+       err = netxen_start_firmware(adapter, 1);
        if (err)
                goto err_out_iounmap;
 
@@ -1032,8 +1074,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
         */
        adapter->physical_port = adapter->portnum;
        if (adapter->fw_major < 4) {
-               i = adapter->hw_read_wx(adapter,
-                               CRB_V2P(adapter->portnum));
+               i = NXRD32(adapter, CRB_V2P(adapter->portnum));
                if (i != 0x55555555)
                        adapter->physical_port = i;
        }
@@ -1118,9 +1159,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
        if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
                netxen_nic_detach(adapter);
-
-               if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
-                       netxen_p3_free_mac_list(adapter);
        }
 
        if (adapter->portnum == 0)
@@ -1131,6 +1169,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
        netxen_cleanup_pci_map(adapter);
 
+       netxen_release_firmware(adapter);
+
        pci_release_regions(pdev);
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
@@ -1138,6 +1178,7 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
        free_netdev(netdev);
 }
 
+#ifdef CONFIG_PM
 static int
 netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
 {
@@ -1182,7 +1223,7 @@ netxen_nic_resume(struct pci_dev *pdev)
 
        adapter->curr_window = 255;
 
-       err = netxen_start_firmware(adapter);
+       err = netxen_start_firmware(adapter, 0);
        if (err) {
                dev_err(&pdev->dev, "failed to start firmware\n");
                return err;
@@ -1202,6 +1243,7 @@ netxen_nic_resume(struct pci_dev *pdev)
 
        return 0;
 }
+#endif
 
 static int netxen_nic_open(struct net_device *netdev)
 {
@@ -1321,7 +1363,7 @@ static int
 netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
 {
        struct netxen_adapter *adapter = netdev_priv(netdev);
-       struct nx_host_tx_ring *tx_ring = &adapter->tx_ring;
+       struct nx_host_tx_ring *tx_ring = adapter->tx_ring;
        unsigned int first_seg_len = skb->len - skb->data_len;
        struct netxen_cmd_buffer *pbuf;
        struct netxen_skb_frag *buffrag;
@@ -1330,7 +1372,7 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        dma_addr_t temp_dma;
        int i, k;
 
-       u32 producer, consumer;
+       u32 producer;
        int frag_count, no_of_desc;
        u32 num_txd = tx_ring->num_desc;
        bool is_tso = false;
@@ -1340,15 +1382,13 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        /* 4 fragments per cmd des */
        no_of_desc = (frag_count + 3) >> 2;
 
-       producer = tx_ring->producer;
-       smp_mb();
-       consumer = tx_ring->sw_consumer;
-       if ((no_of_desc+2) > find_diff_among(producer, consumer, num_txd)) {
+       if (unlikely(no_of_desc + 2) > netxen_tx_avail(tx_ring)) {
                netif_stop_queue(netdev);
-               smp_mb();
                return NETDEV_TX_BUSY;
        }
 
+       producer = tx_ring->producer;
+
        hwdesc = &tx_ring->desc_head[producer];
        netxen_clear_cmddesc((u64 *)hwdesc);
        pbuf = &tx_ring->cmd_buf_arr[producer];
@@ -1461,10 +1501,9 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        tx_ring->producer = producer;
        adapter->stats.txbytes += skb->len;
 
-       netxen_nic_update_cmd_producer(adapter, tx_ring, producer);
+       netxen_nic_update_cmd_producer(adapter, tx_ring);
 
        adapter->stats.xmitcalled++;
-       netdev->trans_start = jiffies;
 
        return NETDEV_TX_OK;
 
@@ -1480,7 +1519,7 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
        uint32_t temp, temp_state, temp_val;
        int rv = 0;
 
-       temp = adapter->hw_read_wx(adapter, CRB_TEMP_STATE);
+       temp = NXRD32(adapter, CRB_TEMP_STATE);
 
        temp_state = nx_get_temp_state(temp);
        temp_val = nx_get_temp_val(temp);
@@ -1551,11 +1590,11 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
        port = adapter->physical_port;
 
        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
-               val = adapter->hw_read_wx(adapter, CRB_XG_STATE_P3);
+               val = NXRD32(adapter, CRB_XG_STATE_P3);
                val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
                linkup = (val == XG_LINK_UP_P3);
        } else {
-               val = adapter->hw_read_wx(adapter, CRB_XG_STATE);
+               val = NXRD32(adapter, CRB_XG_STATE);
                if (adapter->ahw.port_type == NETXEN_NIC_GBE)
                        linkup = (val >> port) & 1;
                else {
@@ -1650,15 +1689,14 @@ static irqreturn_t netxen_intr(int irq, void *data)
        } else {
                unsigned long our_int = 0;
 
-               our_int = adapter->hw_read_wx(adapter, CRB_INT_VECTOR);
+               our_int = NXRD32(adapter, CRB_INT_VECTOR);
 
                /* not our interrupt */
                if (!test_and_clear_bit((7 + adapter->portnum), &our_int))
                        return IRQ_NONE;
 
                /* claim interrupt */
-               adapter->hw_write_wx(adapter,
-                               CRB_INT_VECTOR, (our_int & 0xffffffff));
+               NXWR32(adapter, CRB_INT_VECTOR, (our_int & 0xffffffff));
        }
 
        /* clear interrupt */
@@ -1684,7 +1722,7 @@ static irqreturn_t netxen_msi_intr(int irq, void *data)
 
        /* clear interrupt */
        adapter->pci_write_immediate(adapter,
-                       msi_tgt_status[adapter->ahw.pci_func], 0xffffffff);
+                       adapter->msi_tgt_status, 0xffffffff);
 
        napi_schedule(&sds_ring->napi);
        return IRQ_HANDLED;
@@ -1735,8 +1773,10 @@ static struct pci_driver netxen_driver = {
        .id_table = netxen_pci_tbl,
        .probe = netxen_nic_probe,
        .remove = __devexit_p(netxen_nic_remove),
+#ifdef CONFIG_PM
        .suspend = netxen_nic_suspend,
        .resume = netxen_nic_resume
+#endif
 };
 
 /* Driver Registration on NetXen card    */