ne: Add platform_driver
[powerpc.git] / drivers / net / s2io.c
index 7309a17..290e1c1 100644 (file)
@@ -1,6 +1,6 @@
 /************************************************************************
  * s2io.c: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
- * Copyright(c) 2002-2005 Neterion Inc.
+ * Copyright(c) 2002-2007 Neterion Inc.
 
  * This software may be used and distributed according to the terms of
  * the GNU General Public License (GPL), incorporated herein by reference.
@@ -84,7 +84,7 @@
 #include "s2io.h"
 #include "s2io-regs.h"
 
-#define DRV_VERSION "2.0.17.1"
+#define DRV_VERSION "2.0.22.1"
 
 /* S2io Driver name & version. */
 static char s2io_driver_name[] = "Neterion";
@@ -394,7 +394,6 @@ static const u64 fix_mac[] = {
        END_SIGN
 };
 
-MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@neterion.com>");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_VERSION);
 
@@ -516,7 +515,7 @@ static int init_shared_mem(struct s2io_nic *nic)
                mac_control->fifos[i].list_info = kmalloc(list_holder_size,
                                                          GFP_KERNEL);
                if (!mac_control->fifos[i].list_info) {
-                       DBG_PRINT(ERR_DBG,
+                       DBG_PRINT(INFO_DBG,
                                  "Malloc failed for list_info\n");
                        return -ENOMEM;
                }
@@ -542,9 +541,9 @@ static int init_shared_mem(struct s2io_nic *nic)
                        tmp_v = pci_alloc_consistent(nic->pdev,
                                                     PAGE_SIZE, &tmp_p);
                        if (!tmp_v) {
-                               DBG_PRINT(ERR_DBG,
+                               DBG_PRINT(INFO_DBG,
                                          "pci_alloc_consistent ");
-                               DBG_PRINT(ERR_DBG, "failed for TxDL\n");
+                               DBG_PRINT(INFO_DBG, "failed for TxDL\n");
                                return -ENOMEM;
                        }
                        /* If we got a zero DMA address(can happen on
@@ -561,9 +560,9 @@ static int init_shared_mem(struct s2io_nic *nic)
                                tmp_v = pci_alloc_consistent(nic->pdev,
                                                     PAGE_SIZE, &tmp_p);
                                if (!tmp_v) {
-                                       DBG_PRINT(ERR_DBG,
+                                       DBG_PRINT(INFO_DBG,
                                          "pci_alloc_consistent ");
-                                       DBG_PRINT(ERR_DBG, "failed for TxDL\n");
+                                       DBG_PRINT(INFO_DBG, "failed for TxDL\n");
                                        return -ENOMEM;
                                }
                        }
@@ -2187,7 +2186,7 @@ static int fill_rxd_3buf(struct s2io_nic *nic, struct RxD_t *rxdp, struct \
        /* skb_shinfo(skb)->frag_list will have L4 data payload */
        skb_shinfo(skb)->frag_list = dev_alloc_skb(dev->mtu + ALIGN_SIZE);
        if (skb_shinfo(skb)->frag_list == NULL) {
-               DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n ", dev->name);
+               DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n ", dev->name);
                return -ENOMEM ;
        }
        frag_list = skb_shinfo(skb)->frag_list;
@@ -2242,6 +2241,7 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
        struct buffAdd *ba;
        unsigned long flags;
        struct RxD_t *first_rxdp = NULL;
+       u64 Buffer0_ptr = 0, Buffer1_ptr = 0;
 
        mac_control = &nic->mac_control;
        config = &nic->config;
@@ -2313,8 +2313,8 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
                /* allocate skb */
                skb = dev_alloc_skb(size);
                if(!skb) {
-                       DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name);
-                       DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n");
+                       DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
+                       DBG_PRINT(INFO_DBG, "memory to allocate SKBs\n");
                        if (first_rxdp) {
                                wmb();
                                first_rxdp->Control_1 |= RXD_OWN_XENA;
@@ -2342,7 +2342,14 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
                         * payload
                         */
 
+                       /* save the buffer pointers to avoid frequent dma mapping */
+                       Buffer0_ptr = ((struct RxD3*)rxdp)->Buffer0_ptr;
+                       Buffer1_ptr = ((struct RxD3*)rxdp)->Buffer1_ptr;
                        memset(rxdp, 0, sizeof(struct RxD3));
+                       /* restore the buffer pointers for dma sync*/
+                       ((struct RxD3*)rxdp)->Buffer0_ptr = Buffer0_ptr;
+                       ((struct RxD3*)rxdp)->Buffer1_ptr = Buffer1_ptr;
+
                        ba = &mac_control->rings[ring_no].ba[block_no][off];
                        skb_reserve(skb, BUF0_LEN);
                        tmp = (u64)(unsigned long) skb->data;
@@ -2573,8 +2580,8 @@ static int s2io_poll(struct net_device *dev, int *budget)
 
        for (i = 0; i < config->rx_ring_num; i++) {
                if (fill_rx_buffers(nic, i) == -ENOMEM) {
-                       DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name);
-                       DBG_PRINT(ERR_DBG, " in Rx Poll!!\n");
+                       DBG_PRINT(INFO_DBG, "%s:Out of memory", dev->name);
+                       DBG_PRINT(INFO_DBG, " in Rx Poll!!\n");
                        break;
                }
        }
@@ -2590,8 +2597,8 @@ no_rx:
 
        for (i = 0; i < config->rx_ring_num; i++) {
                if (fill_rx_buffers(nic, i) == -ENOMEM) {
-                       DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name);
-                       DBG_PRINT(ERR_DBG, " in Rx Poll!!\n");
+                       DBG_PRINT(INFO_DBG, "%s:Out of memory", dev->name);
+                       DBG_PRINT(INFO_DBG, " in Rx Poll!!\n");
                        break;
                }
        }
@@ -2640,8 +2647,8 @@ static void s2io_netpoll(struct net_device *dev)
 
        for (i = 0; i < config->rx_ring_num; i++) {
                if (fill_rx_buffers(nic, i) == -ENOMEM) {
-                       DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name);
-                       DBG_PRINT(ERR_DBG, " in Rx Netpoll!!\n");
+                       DBG_PRINT(INFO_DBG, "%s:Out of memory", dev->name);
+                       DBG_PRINT(INFO_DBG, " in Rx Netpoll!!\n");
                        break;
                }
        }
@@ -3307,6 +3314,7 @@ static void s2io_reset(struct s2io_nic * sp)
        u16 subid, pci_cmd;
        int i;
        u16 val16;
+       unsigned long long reset_cnt = 0;
        DBG_PRINT(INIT_DBG,"%s - Resetting XFrame card %s\n",
                        __FUNCTION__, sp->dev->name);
 
@@ -3372,6 +3380,11 @@ new_way:
 
        /* Reset device statistics maintained by OS */
        memset(&sp->stats, 0, sizeof (struct net_device_stats));
+       /* save reset count */
+       reset_cnt = sp->mac_control.stats_info->sw_stat.soft_reset_cnt;
+       memset(sp->mac_control.stats_info, 0, sizeof(struct stat_block));
+       /* restore reset count */
+       sp->mac_control.stats_info->sw_stat.soft_reset_cnt = reset_cnt;
 
        /* SXE-002: Configure link and activity LED to turn it off */
        subid = sp->pdev->subsystem_device;
@@ -3659,7 +3672,7 @@ static int s2io_enable_msi_x(struct s2io_nic *nic)
        nic->entries = kmalloc(MAX_REQUESTED_MSI_X * sizeof(struct msix_entry),
                               GFP_KERNEL);
        if (nic->entries == NULL) {
-               DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
+               DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
                return -ENOMEM;
        }
        memset(nic->entries, 0, MAX_REQUESTED_MSI_X * sizeof(struct msix_entry));
@@ -3668,7 +3681,7 @@ static int s2io_enable_msi_x(struct s2io_nic *nic)
                kmalloc(MAX_REQUESTED_MSI_X * sizeof(struct s2io_msix_entry),
                                   GFP_KERNEL);
        if (nic->s2io_entries == NULL) {
-               DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
+               DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
                kfree(nic->entries);
                return -ENOMEM;
        }
@@ -4019,7 +4032,7 @@ static int s2io_chk_rx_buffers(struct s2io_nic *sp, int rng_n)
                        DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__);
                        DBG_PRINT(INTR_DBG, "PANIC levels\n");
                        if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) {
-                               DBG_PRINT(ERR_DBG, "Out of memory in %s",
+                               DBG_PRINT(INFO_DBG, "Out of memory in %s",
                                          __FUNCTION__);
                                clear_bit(0, (&sp->tasklet_status));
                                return -1;
@@ -4029,8 +4042,8 @@ static int s2io_chk_rx_buffers(struct s2io_nic *sp, int rng_n)
                        tasklet_schedule(&sp->task);
 
        } else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) {
-                       DBG_PRINT(ERR_DBG, "%s:Out of memory", sp->dev->name);
-                       DBG_PRINT(ERR_DBG, " in Rx Intr!!\n");
+                       DBG_PRINT(INFO_DBG, "%s:Out of memory", sp->dev->name);
+                       DBG_PRINT(INFO_DBG, " in Rx Intr!!\n");
        }
        return 0;
 }
@@ -4279,9 +4292,7 @@ static void s2io_updt_stats(struct s2io_nic *sp)
                        if (cnt == 5)
                                break; /* Updt failed */
                } while(1);
-       } else {
-               memset(sp->mac_control.stats_info, 0, sizeof(struct stat_block));
-       }
+       } 
 }
 
 /**
@@ -5949,12 +5960,12 @@ static void s2io_tasklet(unsigned long dev_addr)
                for (i = 0; i < config->rx_ring_num; i++) {
                        ret = fill_rx_buffers(sp, i);
                        if (ret == -ENOMEM) {
-                               DBG_PRINT(ERR_DBG, "%s: Out of ",
+                               DBG_PRINT(INFO_DBG, "%s: Out of ",
                                          dev->name);
                                DBG_PRINT(ERR_DBG, "memory in tasklet\n");
                                break;
                        } else if (ret == -EFILL) {
-                               DBG_PRINT(ERR_DBG,
+                               DBG_PRINT(INFO_DBG,
                                          "%s: Rx Ring %d is full\n",
                                          dev->name, i);
                                break;
@@ -6065,8 +6076,8 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
                } else {
                        *skb = dev_alloc_skb(size);
                        if (!(*skb)) {
-                               DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name);
-                               DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n");
+                               DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
+                               DBG_PRINT(INFO_DBG, "memory to allocate SKBs\n");
                                return -ENOMEM ;
                        }
                        /* storing the mapped addr in a temp variable
@@ -6088,7 +6099,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
                } else {
                        *skb = dev_alloc_skb(size);
                        if (!(*skb)) {
-                               DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n",
+                               DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n",
                                        dev->name);
                                return -ENOMEM;
                        }
@@ -6115,7 +6126,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
                } else {
                        *skb = dev_alloc_skb(size);
                        if (!(*skb)) {
-                               DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n",
+                               DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n",
                                          dev->name);
                                return -ENOMEM;
                        }
@@ -6616,7 +6627,6 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)
 
        /* Updating statistics */
        rxdp->Host_Control = 0;
-       sp->rx_pkt_count++;
        sp->stats.rx_packets++;
        if (sp->rxd_mode == RXD_MODE_1) {
                int len = RXD_GET_BUFFER0_SIZE_1(rxdp->Control_2);
@@ -7252,7 +7262,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
                goto register_failed;
        }
        s2io_vpd_read(sp);
-       DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n");
+       DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2007 Neterion Inc.\n");
        DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n",dev->name,
                  sp->product_name, get_xena_rev_id(sp->pdev));
        DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name,