netxen: fix the version code macro
[safe/jmp/linux-2.6] / drivers / net / netxen / netxen_nic_init.c
index d182167..7bdcbc6 100644 (file)
@@ -178,10 +178,8 @@ void netxen_free_sw_resources(struct netxen_adapter *adapter)
 
        for (ring = 0; ring < adapter->max_rds_rings; ring++) {
                rds_ring = &recv_ctx->rds_rings[ring];
-               if (rds_ring->rx_buf_arr) {
-                       vfree(rds_ring->rx_buf_arr);
-                       rds_ring->rx_buf_arr = NULL;
-               }
+               vfree(rds_ring->rx_buf_arr);
+               rds_ring->rx_buf_arr = NULL;
        }
        kfree(recv_ctx->rds_rings);
 
@@ -190,8 +188,7 @@ skip_rds:
                return;
 
        tx_ring = adapter->tx_ring;
-       if (tx_ring->cmd_buf_arr)
-               vfree(tx_ring->cmd_buf_arr);
+       vfree(tx_ring->cmd_buf_arr);
 }
 
 int netxen_alloc_sw_resources(struct netxen_adapter *adapter)
@@ -319,13 +316,15 @@ err_out:
 
 void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
 {
+       adapter->macaddr_set = netxen_p2_nic_set_mac_addr;
+       adapter->set_multi = netxen_p2_nic_set_multi;
+
        switch (adapter->ahw.port_type) {
        case NETXEN_NIC_GBE:
                adapter->enable_phy_interrupts =
                    netxen_niu_gbe_enable_phy_interrupts;
                adapter->disable_phy_interrupts =
                    netxen_niu_gbe_disable_phy_interrupts;
-               adapter->macaddr_set = netxen_niu_macaddr_set;
                adapter->set_mtu = netxen_nic_set_mtu_gb;
                adapter->set_promisc = netxen_niu_set_promiscuous_mode;
                adapter->phy_read = netxen_niu_gbe_phy_read;
@@ -339,7 +338,6 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
                    netxen_niu_xgbe_enable_phy_interrupts;
                adapter->disable_phy_interrupts =
                    netxen_niu_xgbe_disable_phy_interrupts;
-               adapter->macaddr_set = netxen_niu_xg_macaddr_set;
                adapter->set_mtu = netxen_nic_set_mtu_xgb;
                adapter->init_port = netxen_niu_xg_init_port;
                adapter->set_promisc = netxen_niu_xg_set_promiscuous_mode;
@@ -353,6 +351,8 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
                adapter->set_mtu = nx_fw_cmd_set_mtu;
                adapter->set_promisc = netxen_p3_nic_set_promisc;
+               adapter->macaddr_set = netxen_p3_nic_set_mac_addr;
+               adapter->set_multi = netxen_p3_nic_set_multi;
        }
 }
 
@@ -756,7 +756,7 @@ static int
 netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
 {
        __le32 val;
-       u32 major, minor, build, ver, min_ver, bios;
+       u32 ver, min_ver, bios;
        struct pci_dev *pdev = adapter->pdev;
        const struct firmware *fw = adapter->fw;
 
@@ -768,21 +768,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
                return -EINVAL;
 
        val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]);
-       major = (__force u32)val & 0xff;
-       minor = ((__force u32)val >> 8) & 0xff;
-       build = (__force u32)val >> 16;
 
        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
                min_ver = NETXEN_VERSION_CODE(4, 0, 216);
        else
                min_ver = NETXEN_VERSION_CODE(3, 4, 216);
 
-       ver = NETXEN_VERSION_CODE(major, minor, build);
+       ver = NETXEN_DECODE_VERSION(val);
 
-       if ((major > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) {
+       if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) {
                dev_err(&pdev->dev,
                                "%s: firmware version %d.%d.%d unsupported\n",
-                               fwname, major, minor, build);
+                               fwname, _major(ver), _minor(ver), _build(ver));
                return -EINVAL;
        }
 
@@ -798,11 +795,12 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
        if (netxen_rom_fast_read(adapter,
                        NX_FW_VERSION_OFFSET, (int *)&val))
                return -EIO;
-       major = (__force u32)val & 0xff;
-       minor = ((__force u32)val >> 8) & 0xff;
-       build = (__force u32)val >> 16;
-       if (NETXEN_VERSION_CODE(major, minor, build) > ver)
+       val = NETXEN_DECODE_VERSION(val);
+       if (val > ver) {
+               dev_info(&pdev->dev, "%s: firmware is older than flash\n",
+                               fwname);
                return -EINVAL;
+       }
 
        NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
        return 0;
@@ -830,6 +828,8 @@ request_mn:
 
        netxen_rom_fast_read(adapter,
                        NX_FW_VERSION_OFFSET, (int *)&flashed_ver);
+       flashed_ver = NETXEN_DECODE_VERSION(flashed_ver);
+
        if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) {
                capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY);
                if (capability & NX_PEG_TUNE_MN_PRESENT) {
@@ -838,6 +838,9 @@ request_mn:
                }
        }
 
+       adapter->fw = NULL;
+       goto done;
+
 request_fw:
        rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev);
        if (rc != 0) {
@@ -944,28 +947,31 @@ int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
        u32 val = 0;
        int retries = 60;
 
-       if (!pegtune_val) {
-               do {
-                       val = NXRD32(adapter, CRB_CMDPEG_STATE);
+       if (pegtune_val)
+               return 0;
 
-                       if (val == PHAN_INITIALIZE_COMPLETE ||
-                               val == PHAN_INITIALIZE_ACK)
-                               return 0;
+       do {
+               val = NXRD32(adapter, CRB_CMDPEG_STATE);
+
+               switch (val) {
+               case PHAN_INITIALIZE_COMPLETE:
+               case PHAN_INITIALIZE_ACK:
+                       return 0;
+               case PHAN_INITIALIZE_FAILED:
+                       goto out_err;
+               default:
+                       break;
+               }
 
-                       msleep(500);
+               msleep(500);
 
-               } while (--retries);
+       } while (--retries);
 
-               if (!retries) {
-                       pegtune_val = NXRD32(adapter,
-                                       NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
-                       printk(KERN_WARNING "netxen_phantom_init: init failed, "
-                                       "pegtune_val=%x\n", pegtune_val);
-                       return -1;
-               }
-       }
+       NXWR32(adapter, CRB_CMDPEG_STATE, PHAN_INITIALIZE_FAILED);
 
-       return 0;
+out_err:
+       dev_warn(&adapter->pdev->dev, "firmware init failed\n");
+       return -EIO;
 }
 
 static int
@@ -1292,7 +1298,6 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter)
                return 1;
 
        sw_consumer = tx_ring->sw_consumer;
-       barrier(); /* hw_consumer can change underneath */
        hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer));
 
        while (sw_consumer != hw_consumer) {
@@ -1319,13 +1324,15 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter)
                        break;
        }
 
-       if (count) {
+       if (count && netif_running(netdev)) {
                tx_ring->sw_consumer = sw_consumer;
+
                smp_mb();
-               if (netif_queue_stopped(netdev) && netif_running(netdev)) {
+
+               if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) {
                        netif_tx_lock(netdev);
-                       netif_wake_queue(netdev);
-                       smp_mb();
+                       if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH)
+                               netif_wake_queue(netdev);
                        netif_tx_unlock(netdev);
                }
        }
@@ -1342,7 +1349,6 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter)
         * There is still a possible race condition and the host could miss an
         * interrupt. The card has to take care of this.
         */
-       barrier(); /* hw_consumer can change underneath */
        hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer));
        done = (sw_consumer == hw_consumer);
        spin_unlock(&adapter->tx_clean_lock);
@@ -1450,7 +1456,6 @@ netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter,
                rds_ring->producer = producer;
                NXWR32(adapter, rds_ring->crb_rcv_producer,
                                (producer - 1) & (rds_ring->num_desc - 1));
-                       wmb();
        }
        spin_unlock(&rds_ring->lock);
 }