]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/netxen/netxen_nic_init.c
Merge git://git.infradead.org/~dwmw2/battery-2.6
[linux-2.6-omap-h63xx.git] / drivers / net / netxen / netxen_nic_init.c
index eff965dc5ffff8fec3da1734182d7d2c8c63de80..1811bcb8c380ad53019033c7e43df01e0ff0912b 100644 (file)
@@ -139,7 +139,9 @@ int netxen_init_firmware(struct netxen_adapter *adapter)
                return err;
        }
        /* Window 1 call */
-       writel(MPORT_SINGLE_FUNCTION_MODE,
+       writel(INTR_SCHEME_PERPORT,
+              NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_HOST));
+       writel(MPORT_MULTI_FUNCTION_MODE,
               NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE));
        writel(PHAN_INITIALIZE_ACK,
               NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
@@ -226,7 +228,6 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
                adapter->unset_promisc = netxen_niu_set_promiscuous_mode;
                adapter->phy_read = netxen_niu_gbe_phy_read;
                adapter->phy_write = netxen_niu_gbe_phy_write;
-               adapter->init_port = netxen_niu_gbe_init_port;
                adapter->init_niu = netxen_nic_init_niu_gb;
                adapter->stop_port = netxen_niu_disable_gbe_port;
                break;
@@ -277,8 +278,8 @@ u32 netxen_decode_crb_addr(u32 addr)
                return (pci_base + offset);
 }
 
-static long rom_max_timeout = 10000;
-static long rom_lock_timeout = 1000000;
+static long rom_max_timeout = 100;
+static long rom_lock_timeout = 10000;
 static long rom_write_timeout = 700;
 
 static inline int rom_lock(struct netxen_adapter *adapter)
@@ -406,10 +407,7 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
 static inline int
 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
 {
-       if (jiffies > (last_schedule_time + (8 * HZ))) {
-               last_schedule_time = jiffies;
-               schedule();
-       }
+       cond_resched();
 
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
@@ -438,9 +436,9 @@ do_rom_fast_read_words(struct netxen_adapter *adapter, int addr,
 
        for (addridx = addr; addridx < (addr + size); addridx += 4) {
                ret = do_rom_fast_read(adapter, addridx, (int *)bytes);
-               *(int *)bytes = cpu_to_le32(*(int *)bytes);
                if (ret != 0)
                        break;
+               *(int *)bytes = cpu_to_le32(*(int *)bytes);
                bytes += 4;
        }
 
@@ -499,7 +497,6 @@ static inline int do_rom_fast_write_words(struct netxen_adapter *adapter,
                int data;
 
                data = le32_to_cpu((*(u32*)bytes));
-
                ret = do_rom_fast_write(adapter, addridx, data);
                if (ret < 0)
                        return ret;
@@ -587,7 +584,7 @@ int netxen_backup_crbinit(struct netxen_adapter *adapter)
 {
        int ret = FLASH_SUCCESS;
        int val;
-       char *buffer = kmalloc(FLASH_SECTOR_SIZE, GFP_KERNEL);
+       char *buffer = kmalloc(NETXEN_FLASH_SECTOR_SIZE, GFP_KERNEL);
 
        if (!buffer)
                return -ENOMEM; 
@@ -603,13 +600,13 @@ int netxen_backup_crbinit(struct netxen_adapter *adapter)
                goto out_kfree;
 
        /* copy  sector 0 to sector 63 */
-       ret = netxen_rom_fast_read_words(adapter, CRBINIT_START, 
-                                               buffer, FLASH_SECTOR_SIZE);
+       ret = netxen_rom_fast_read_words(adapter, NETXEN_CRBINIT_START, 
+                                       buffer, NETXEN_FLASH_SECTOR_SIZE);
        if (ret != FLASH_SUCCESS)
                goto out_kfree;
 
-       ret = netxen_rom_fast_write_words(adapter, FIXED_START, 
-                                               buffer, FLASH_SECTOR_SIZE);
+       ret = netxen_rom_fast_write_words(adapter, NETXEN_FIXED_START, 
+                                       buffer, NETXEN_FLASH_SECTOR_SIZE);
        if (ret != FLASH_SUCCESS)
                goto out_kfree;
 
@@ -656,7 +653,8 @@ void check_erased_flash(struct netxen_adapter *adapter, int addr)
        int count = 0, erased_errors = 0;
        int range;
 
-       range = (addr == USER_START) ? FIXED_START : addr + FLASH_SECTOR_SIZE;
+       range = (addr == NETXEN_USER_START) ? 
+               NETXEN_FIXED_START : addr + NETXEN_FLASH_SECTOR_SIZE;
        
        for (i = addr; i < range; i += 4) {
                netxen_rom_fast_read(adapter, i, &val);
@@ -691,7 +689,7 @@ netxen_flash_erase_sections(struct netxen_adapter *adapter, int start, int end)
        int i;
 
        for (i = start; i < end; i++) {
-               ret = netxen_rom_se(adapter, i * FLASH_SECTOR_SIZE);
+               ret = netxen_rom_se(adapter, i * NETXEN_FLASH_SECTOR_SIZE);
                if (ret)
                        break;
                ret = netxen_rom_wip_poll(adapter);
@@ -708,8 +706,8 @@ netxen_flash_erase_secondary(struct netxen_adapter *adapter)
        int ret = FLASH_SUCCESS;
        int start, end;
 
-       start = SECONDARY_START / FLASH_SECTOR_SIZE;
-       end   = USER_START / FLASH_SECTOR_SIZE;
+       start = NETXEN_SECONDARY_START / NETXEN_FLASH_SECTOR_SIZE;
+       end   = NETXEN_USER_START / NETXEN_FLASH_SECTOR_SIZE;
        ret = netxen_flash_erase_sections(adapter, start, end);
 
        return ret;
@@ -721,8 +719,8 @@ netxen_flash_erase_primary(struct netxen_adapter *adapter)
        int ret = FLASH_SUCCESS;
        int start, end;
 
-       start = PRIMARY_START / FLASH_SECTOR_SIZE;
-       end   = SECONDARY_START / FLASH_SECTOR_SIZE;
+       start = NETXEN_PRIMARY_START / NETXEN_FLASH_SECTOR_SIZE;
+       end   = NETXEN_SECONDARY_START / NETXEN_FLASH_SECTOR_SIZE;
        ret = netxen_flash_erase_sections(adapter, start, end);
 
        return ret;
@@ -855,10 +853,10 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
                                netxen_nic_pci_change_crbwindow(adapter, 1);
                        }
                        if (init_delay == 1) {
-                               ssleep(1);
+                               msleep(2000);
                                init_delay = 0;
                        }
-                       msleep(1);
+                       msleep(20);
                }
                kfree(buf);
 
@@ -934,10 +932,6 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter)
 void netxen_free_adapter_offload(struct netxen_adapter *adapter)
 {
        if (adapter->dummy_dma.addr) {
-               writel(0, NETXEN_CRB_NORMALIZE(adapter,
-                       CRB_HOST_DUMMY_BUF_ADDR_HI));
-               writel(0, NETXEN_CRB_NORMALIZE(adapter,
-                       CRB_HOST_DUMMY_BUF_ADDR_LO));
                pci_free_consistent(adapter->ahw.pdev,
                                    NETXEN_HOST_DUMMY_DMA_SIZE,
                                    adapter->dummy_dma.addr,
@@ -946,24 +940,32 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter)
        }
 }
 
-void netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
+int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
 {
        u32 val = 0;
-       int loops = 0;
+       int retries = 30;
 
        if (!pegtune_val) {
-               val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
-               while (val != PHAN_INITIALIZE_COMPLETE && loops < 200000) {
-                       udelay(100);
-                       schedule();
-                       val =
-                           readl(NETXEN_CRB_NORMALIZE
+               do {
+                       val = readl(NETXEN_CRB_NORMALIZE
                                  (adapter, CRB_CMDPEG_STATE));
-                       loops++;
+                       pegtune_val = readl(NETXEN_CRB_NORMALIZE
+                                 (adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE));
+
+                       if (val == PHAN_INITIALIZE_COMPLETE ||
+                               val == PHAN_INITIALIZE_ACK)
+                               return 0;
+
+                       msleep(1000);
+               } while (--retries);
+               if (!retries) {
+                       printk(KERN_WARNING "netxen_phantom_init: init failed, "
+                                       "pegtune_val=%x\n", pegtune_val);
+                       return -1;
                }
-               if (val != PHAN_INITIALIZE_COMPLETE)
-                       printk("WARNING: Initial boot wait loop failed...\n");
        }
+
+       return 0;
 }
 
 int netxen_nic_rx_has_work(struct netxen_adapter *adapter)
@@ -990,9 +992,7 @@ int netxen_nic_rx_has_work(struct netxen_adapter *adapter)
 
 static inline int netxen_nic_check_temp(struct netxen_adapter *adapter)
 {
-       int port_num;
-       struct netxen_port *port;
-       struct net_device *netdev;
+       struct net_device *netdev = adapter->netdev;
        uint32_t temp, temp_state, temp_val;
        int rv = 0;
 
@@ -1006,14 +1006,9 @@ static inline int netxen_nic_check_temp(struct netxen_adapter *adapter)
                       "%s: Device temperature %d degrees C exceeds"
                       " maximum allowed. Hardware has been shut down.\n",
                       netxen_nic_driver_name, temp_val);
-               for (port_num = 0; port_num < adapter->ahw.max_ports;
-                    port_num++) {
-                       port = adapter->port[port_num];
-                       netdev = port->netdev;
 
-                       netif_carrier_off(netdev);
-                       netif_stop_queue(netdev);
-               }
+               netif_carrier_off(netdev);
+               netif_stop_queue(netdev);
                rv = 1;
        } else if (temp_state == NX_TEMP_WARN) {
                if (adapter->temp == NX_TEMP_NORMAL) {
@@ -1037,31 +1032,30 @@ static inline int netxen_nic_check_temp(struct netxen_adapter *adapter)
 
 void netxen_watchdog_task(struct work_struct *work)
 {
-       int port_num;
-       struct netxen_port *port;
        struct net_device *netdev;
        struct netxen_adapter *adapter =
                container_of(work, struct netxen_adapter, watchdog_task);
 
-       if (netxen_nic_check_temp(adapter))
+       if ((adapter->portnum  == 0) && netxen_nic_check_temp(adapter))
                return;
 
-       for (port_num = 0; port_num < adapter->ahw.max_ports; port_num++) {
-               port = adapter->port[port_num];
-               netdev = port->netdev;
-
-               if ((netif_running(netdev)) && !netif_carrier_ok(netdev)) {
-                       printk(KERN_INFO "%s port %d, %s carrier is now ok\n",
-                              netxen_nic_driver_name, port_num, netdev->name);
-                       netif_carrier_on(netdev);
-               }
+       if (adapter->handle_phy_intr)
+               adapter->handle_phy_intr(adapter);
 
-               if (netif_queue_stopped(netdev))
-                       netif_wake_queue(netdev);
+       netdev = adapter->netdev;
+       if ((netif_running(netdev)) && !netif_carrier_ok(netdev) &&
+                       netxen_nic_link_ok(adapter) ) {
+               printk(KERN_INFO "%s %s (port %d), Link is up\n",
+                              netxen_nic_driver_name, netdev->name, adapter->portnum);
+               netif_carrier_on(netdev);
+               netif_wake_queue(netdev);
+       } else if(!(netif_running(netdev)) && netif_carrier_ok(netdev)) {
+               printk(KERN_ERR "%s %s Link is Down\n",
+                               netxen_nic_driver_name, netdev->name);
+               netif_carrier_off(netdev);
+               netif_stop_queue(netdev);
        }
 
-       if (adapter->handle_phy_intr)
-               adapter->handle_phy_intr(adapter);
        mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
 }
 
@@ -1074,9 +1068,8 @@ void
 netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
                   struct status_desc *desc)
 {
-       struct netxen_port *port = adapter->port[netxen_get_sts_port(desc)];
-       struct pci_dev *pdev = port->pdev;
-       struct net_device *netdev = port->netdev;
+       struct pci_dev *pdev = adapter->pdev;
+       struct net_device *netdev = adapter->netdev;
        int index = netxen_get_sts_refhandle(desc);
        struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]);
        struct netxen_rx_buffer *buffer;
@@ -1126,7 +1119,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
        skb = (struct sk_buff *)buffer->skb;
 
        if (likely(netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) {
-               port->stats.csummed++;
+               adapter->stats.csummed++;
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        }
        skb->dev = netdev;
@@ -1147,27 +1140,27 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
         */
        switch (ret) {
        case NET_RX_SUCCESS:
-               port->stats.uphappy++;
+               adapter->stats.uphappy++;
                break;
 
        case NET_RX_CN_LOW:
-               port->stats.uplcong++;
+               adapter->stats.uplcong++;
                break;
 
        case NET_RX_CN_MOD:
-               port->stats.upmcong++;
+               adapter->stats.upmcong++;
                break;
 
        case NET_RX_CN_HIGH:
-               port->stats.uphcong++;
+               adapter->stats.uphcong++;
                break;
 
        case NET_RX_DROP:
-               port->stats.updropped++;
+               adapter->stats.updropped++;
                break;
 
        default:
-               port->stats.updunno++;
+               adapter->stats.updunno++;
                break;
        }
 
@@ -1179,14 +1172,13 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
        /*
         * We just consumed one buffer so post a buffer.
         */
-       adapter->stats.post_called++;
        buffer->skb = NULL;
        buffer->state = NETXEN_BUFFER_FREE;
        buffer->lro_current_frags = 0;
        buffer->lro_expected_frags = 0;
 
-       port->stats.no_rcv++;
-       port->stats.rxbytes += length;
+       adapter->stats.no_rcv++;
+       adapter->stats.rxbytes += length;
 }
 
 /* Process Receive status ring */
@@ -1227,15 +1219,15 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
 
        /* update the consumer index in phantom */
        if (count) {
-               adapter->stats.process_rcv++;
                recv_ctx->status_rx_consumer = consumer;
                recv_ctx->status_rx_producer = producer;
 
                /* Window = 1 */
                writel(consumer,
                       NETXEN_CRB_NORMALIZE(adapter,
-                                           recv_crb_registers[ctxid].
+                                           recv_crb_registers[adapter->portnum].
                                            crb_rcv_status_consumer));
+               wmb();
        }
 
        return count;
@@ -1250,13 +1242,10 @@ int netxen_process_cmd_ring(unsigned long data)
        int count1 = 0;
        int count2 = 0;
        struct netxen_cmd_buffer *buffer;
-       struct netxen_port *port;       /* port #1 */
-       struct netxen_port *nport;
        struct pci_dev *pdev;
        struct netxen_skb_frag *frag;
        u32 i;
        struct sk_buff *skb = NULL;
-       int p;
        int done;
 
        spin_lock(&adapter->tx_lock);
@@ -1277,7 +1266,6 @@ int netxen_process_cmd_ring(unsigned long data)
        }
 
        adapter->proc_cmd_buf_counter++;
-       adapter->stats.process_xmit++;
        /*
         * Not needed - does not seem to be used anywhere.
         * adapter->cmd_consumer = consumer;
@@ -1286,38 +1274,38 @@ int netxen_process_cmd_ring(unsigned long data)
 
        while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) {
                buffer = &adapter->cmd_buf_arr[last_consumer];
-               port = adapter->port[buffer->port];
-               pdev = port->pdev;
+               pdev = adapter->pdev;
                frag = &buffer->frag_array[0];
                skb = buffer->skb;
                if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) {
                        pci_unmap_single(pdev, frag->dma, frag->length,
                                         PCI_DMA_TODEVICE);
+                       frag->dma = 0ULL;
                        for (i = 1; i < buffer->frag_count; i++) {
                                DPRINTK(INFO, "getting fragment no %d\n", i);
                                frag++; /* Get the next frag */
                                pci_unmap_page(pdev, frag->dma, frag->length,
                                               PCI_DMA_TODEVICE);
+                               frag->dma = 0ULL;
                        }
 
-                       port->stats.skbfreed++;
+                       adapter->stats.skbfreed++;
                        dev_kfree_skb_any(skb);
                        skb = NULL;
                } else if (adapter->proc_cmd_buf_counter == 1) {
-                       port->stats.txnullskb++;
+                       adapter->stats.txnullskb++;
                }
-               if (unlikely(netif_queue_stopped(port->netdev)
-                            && netif_carrier_ok(port->netdev))
-                   && ((jiffies - port->netdev->trans_start) >
-                       port->netdev->watchdog_timeo)) {
-                       SCHEDULE_WORK(&port->tx_timeout_task);
+               if (unlikely(netif_queue_stopped(adapter->netdev)
+                            && netif_carrier_ok(adapter->netdev))
+                   && ((jiffies - adapter->netdev->trans_start) >
+                       adapter->netdev->watchdog_timeo)) {
+                       SCHEDULE_WORK(&adapter->tx_timeout_task);
                }
 
                last_consumer = get_next_index(last_consumer,
                                               adapter->max_tx_desc_count);
                count1++;
        }
-       adapter->stats.noxmitdone += count1;
 
        count2 = 0;
        spin_lock(&adapter->tx_lock);
@@ -1337,13 +1325,10 @@ int netxen_process_cmd_ring(unsigned long data)
                }
        }
        if (count1 || count2) {
-               for (p = 0; p < adapter->ahw.max_ports; p++) {
-                       nport = adapter->port[p];
-                       if (netif_queue_stopped(nport->netdev)
-                           && (nport->flags & NETXEN_NETDEV_STATUS)) {
-                               netif_wake_queue(nport->netdev);
-                               nport->flags &= ~NETXEN_NETDEV_STATUS;
-                       }
+               if (netif_queue_stopped(adapter->netdev)
+                   && (adapter->flags & NETXEN_NETDEV_STATUS)) {
+                       netif_wake_queue(adapter->netdev);
+                       adapter->flags &= ~NETXEN_NETDEV_STATUS;
                }
        }
        /*
@@ -1389,7 +1374,6 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
        netxen_ctx_msg msg = 0;
        dma_addr_t dma;
 
-       adapter->stats.post_called++;
        rcv_desc = &recv_ctx->rcv_desc[ringid];
 
        producer = rcv_desc->producer;
@@ -1442,8 +1426,6 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
        if (count) {
                rcv_desc->begin_alloc = index;
                rcv_desc->rcv_pending += count;
-               adapter->stats.lastposted = count;
-               adapter->stats.posted += count;
                rcv_desc->producer = producer;
                if (rcv_desc->rcv_free >= 32) {
                        rcv_desc->rcv_free = 0;
@@ -1451,7 +1433,8 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
                        writel((producer - 1) &
                               (rcv_desc->max_rx_desc_count - 1),
                               NETXEN_CRB_NORMALIZE(adapter,
-                                                   recv_crb_registers[0].
+                                                   recv_crb_registers[
+                                                   adapter->portnum].
                                                    rcv_desc_crb[ringid].
                                                    crb_rcv_producer_offset));
                        /*
@@ -1464,11 +1447,12 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
                                             ((producer -
                                               1) & (rcv_desc->
                                                     max_rx_desc_count - 1)));
-                       netxen_set_msg_ctxid(msg, 0);
+                       netxen_set_msg_ctxid(msg, adapter->portnum);
                        netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid));
                        writel(msg,
                               DB_NORMALIZE(adapter,
                                            NETXEN_RCV_PRODUCER_OFFSET));
+                       wmb();
                }
        }
 }
@@ -1486,7 +1470,6 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx,
        int count = 0;
        int index = 0;
 
-       adapter->stats.post_called++;
        rcv_desc = &recv_ctx->rcv_desc[ringid];
 
        producer = rcv_desc->producer;
@@ -1533,8 +1516,6 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx,
        if (count) {
                rcv_desc->begin_alloc = index;
                rcv_desc->rcv_pending += count;
-               adapter->stats.lastposted = count;
-               adapter->stats.posted += count;
                rcv_desc->producer = producer;
                if (rcv_desc->rcv_free >= 32) {
                        rcv_desc->rcv_free = 0;
@@ -1542,7 +1523,8 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx,
                        writel((producer - 1) &
                               (rcv_desc->max_rx_desc_count - 1),
                               NETXEN_CRB_NORMALIZE(adapter,
-                                                   recv_crb_registers[0].
+                                                   recv_crb_registers[
+                                                   adapter->portnum].
                                                    rcv_desc_crb[ringid].
                                                    crb_rcv_producer_offset));
                        wmb();
@@ -1563,13 +1545,7 @@ int netxen_nic_tx_has_work(struct netxen_adapter *adapter)
 
 void netxen_nic_clear_stats(struct netxen_adapter *adapter)
 {
-       struct netxen_port *port;
-       int port_num;
-
        memset(&adapter->stats, 0, sizeof(adapter->stats));
-       for (port_num = 0; port_num < adapter->ahw.max_ports; port_num++) {
-               port = adapter->port[port_num];
-               memset(&port->stats, 0, sizeof(port->stats));
-       }
+       return;
 }