aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/s2io.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/s2io.c')
-rw-r--r--drivers/net/s2io.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
index 600d3ff347fc..290e1c1f30c6 100644
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -1,6 +1,6 @@
1/************************************************************************ 1/************************************************************************
2 * s2io.c: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC 2 * s2io.c: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
3 * Copyright(c) 2002-2005 Neterion Inc. 3 * Copyright(c) 2002-2007 Neterion Inc.
4 4
5 * This software may be used and distributed according to the terms of 5 * This software may be used and distributed according to the terms of
6 * the GNU General Public License (GPL), incorporated herein by reference. 6 * the GNU General Public License (GPL), incorporated herein by reference.
@@ -84,7 +84,7 @@
84#include "s2io.h" 84#include "s2io.h"
85#include "s2io-regs.h" 85#include "s2io-regs.h"
86 86
87#define DRV_VERSION "2.0.17.1" 87#define DRV_VERSION "2.0.22.1"
88 88
89/* S2io Driver name & version. */ 89/* S2io Driver name & version. */
90static char s2io_driver_name[] = "Neterion"; 90static char s2io_driver_name[] = "Neterion";
@@ -316,7 +316,7 @@ static void s2io_vlan_rx_register(struct net_device *dev,
316} 316}
317 317
318/* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */ 318/* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */
319int vlan_strip_flag; 319static int vlan_strip_flag;
320 320
321/* Unregister the vlan */ 321/* Unregister the vlan */
322static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) 322static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid)
@@ -394,7 +394,6 @@ static const u64 fix_mac[] = {
394 END_SIGN 394 END_SIGN
395}; 395};
396 396
397MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@neterion.com>");
398MODULE_LICENSE("GPL"); 397MODULE_LICENSE("GPL");
399MODULE_VERSION(DRV_VERSION); 398MODULE_VERSION(DRV_VERSION);
400 399
@@ -516,7 +515,7 @@ static int init_shared_mem(struct s2io_nic *nic)
516 mac_control->fifos[i].list_info = kmalloc(list_holder_size, 515 mac_control->fifos[i].list_info = kmalloc(list_holder_size,
517 GFP_KERNEL); 516 GFP_KERNEL);
518 if (!mac_control->fifos[i].list_info) { 517 if (!mac_control->fifos[i].list_info) {
519 DBG_PRINT(ERR_DBG, 518 DBG_PRINT(INFO_DBG,
520 "Malloc failed for list_info\n"); 519 "Malloc failed for list_info\n");
521 return -ENOMEM; 520 return -ENOMEM;
522 } 521 }
@@ -542,9 +541,9 @@ static int init_shared_mem(struct s2io_nic *nic)
542 tmp_v = pci_alloc_consistent(nic->pdev, 541 tmp_v = pci_alloc_consistent(nic->pdev,
543 PAGE_SIZE, &tmp_p); 542 PAGE_SIZE, &tmp_p);
544 if (!tmp_v) { 543 if (!tmp_v) {
545 DBG_PRINT(ERR_DBG, 544 DBG_PRINT(INFO_DBG,
546 "pci_alloc_consistent "); 545 "pci_alloc_consistent ");
547 DBG_PRINT(ERR_DBG, "failed for TxDL\n"); 546 DBG_PRINT(INFO_DBG, "failed for TxDL\n");
548 return -ENOMEM; 547 return -ENOMEM;
549 } 548 }
550 /* If we got a zero DMA address(can happen on 549 /* If we got a zero DMA address(can happen on
@@ -561,9 +560,9 @@ static int init_shared_mem(struct s2io_nic *nic)
561 tmp_v = pci_alloc_consistent(nic->pdev, 560 tmp_v = pci_alloc_consistent(nic->pdev,
562 PAGE_SIZE, &tmp_p); 561 PAGE_SIZE, &tmp_p);
563 if (!tmp_v) { 562 if (!tmp_v) {
564 DBG_PRINT(ERR_DBG, 563 DBG_PRINT(INFO_DBG,
565 "pci_alloc_consistent "); 564 "pci_alloc_consistent ");
566 DBG_PRINT(ERR_DBG, "failed for TxDL\n"); 565 DBG_PRINT(INFO_DBG, "failed for TxDL\n");
567 return -ENOMEM; 566 return -ENOMEM;
568 } 567 }
569 } 568 }
@@ -2187,7 +2186,7 @@ static int fill_rxd_3buf(struct s2io_nic *nic, struct RxD_t *rxdp, struct \
2187 /* skb_shinfo(skb)->frag_list will have L4 data payload */ 2186 /* skb_shinfo(skb)->frag_list will have L4 data payload */
2188 skb_shinfo(skb)->frag_list = dev_alloc_skb(dev->mtu + ALIGN_SIZE); 2187 skb_shinfo(skb)->frag_list = dev_alloc_skb(dev->mtu + ALIGN_SIZE);
2189 if (skb_shinfo(skb)->frag_list == NULL) { 2188 if (skb_shinfo(skb)->frag_list == NULL) {
2190 DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n ", dev->name); 2189 DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n ", dev->name);
2191 return -ENOMEM ; 2190 return -ENOMEM ;
2192 } 2191 }
2193 frag_list = skb_shinfo(skb)->frag_list; 2192 frag_list = skb_shinfo(skb)->frag_list;
@@ -2242,6 +2241,7 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
2242 struct buffAdd *ba; 2241 struct buffAdd *ba;
2243 unsigned long flags; 2242 unsigned long flags;
2244 struct RxD_t *first_rxdp = NULL; 2243 struct RxD_t *first_rxdp = NULL;
2244 u64 Buffer0_ptr = 0, Buffer1_ptr = 0;
2245 2245
2246 mac_control = &nic->mac_control; 2246 mac_control = &nic->mac_control;
2247 config = &nic->config; 2247 config = &nic->config;
@@ -2313,8 +2313,8 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
2313 /* allocate skb */ 2313 /* allocate skb */
2314 skb = dev_alloc_skb(size); 2314 skb = dev_alloc_skb(size);
2315 if(!skb) { 2315 if(!skb) {
2316 DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); 2316 DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
2317 DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n"); 2317 DBG_PRINT(INFO_DBG, "memory to allocate SKBs\n");
2318 if (first_rxdp) { 2318 if (first_rxdp) {
2319 wmb(); 2319 wmb();
2320 first_rxdp->Control_1 |= RXD_OWN_XENA; 2320 first_rxdp->Control_1 |= RXD_OWN_XENA;
@@ -2342,7 +2342,14 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
2342 * payload 2342 * payload
2343 */ 2343 */
2344 2344
2345 /* save the buffer pointers to avoid frequent dma mapping */
2346 Buffer0_ptr = ((struct RxD3*)rxdp)->Buffer0_ptr;
2347 Buffer1_ptr = ((struct RxD3*)rxdp)->Buffer1_ptr;
2345 memset(rxdp, 0, sizeof(struct RxD3)); 2348 memset(rxdp, 0, sizeof(struct RxD3));
2349 /* restore the buffer pointers for dma sync*/
2350 ((struct RxD3*)rxdp)->Buffer0_ptr = Buffer0_ptr;
2351 ((struct RxD3*)rxdp)->Buffer1_ptr = Buffer1_ptr;
2352
2346 ba = &mac_control->rings[ring_no].ba[block_no][off]; 2353 ba = &mac_control->rings[ring_no].ba[block_no][off];
2347 skb_reserve(skb, BUF0_LEN); 2354 skb_reserve(skb, BUF0_LEN);
2348 tmp = (u64)(unsigned long) skb->data; 2355 tmp = (u64)(unsigned long) skb->data;
@@ -2573,8 +2580,8 @@ static int s2io_poll(struct net_device *dev, int *budget)
2573 2580
2574 for (i = 0; i < config->rx_ring_num; i++) { 2581 for (i = 0; i < config->rx_ring_num; i++) {
2575 if (fill_rx_buffers(nic, i) == -ENOMEM) { 2582 if (fill_rx_buffers(nic, i) == -ENOMEM) {
2576 DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); 2583 DBG_PRINT(INFO_DBG, "%s:Out of memory", dev->name);
2577 DBG_PRINT(ERR_DBG, " in Rx Poll!!\n"); 2584 DBG_PRINT(INFO_DBG, " in Rx Poll!!\n");
2578 break; 2585 break;
2579 } 2586 }
2580 } 2587 }
@@ -2590,8 +2597,8 @@ no_rx:
2590 2597
2591 for (i = 0; i < config->rx_ring_num; i++) { 2598 for (i = 0; i < config->rx_ring_num; i++) {
2592 if (fill_rx_buffers(nic, i) == -ENOMEM) { 2599 if (fill_rx_buffers(nic, i) == -ENOMEM) {
2593 DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); 2600 DBG_PRINT(INFO_DBG, "%s:Out of memory", dev->name);
2594 DBG_PRINT(ERR_DBG, " in Rx Poll!!\n"); 2601 DBG_PRINT(INFO_DBG, " in Rx Poll!!\n");
2595 break; 2602 break;
2596 } 2603 }
2597 } 2604 }
@@ -2640,8 +2647,8 @@ static void s2io_netpoll(struct net_device *dev)
2640 2647
2641 for (i = 0; i < config->rx_ring_num; i++) { 2648 for (i = 0; i < config->rx_ring_num; i++) {
2642 if (fill_rx_buffers(nic, i) == -ENOMEM) { 2649 if (fill_rx_buffers(nic, i) == -ENOMEM) {
2643 DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); 2650 DBG_PRINT(INFO_DBG, "%s:Out of memory", dev->name);
2644 DBG_PRINT(ERR_DBG, " in Rx Netpoll!!\n"); 2651 DBG_PRINT(INFO_DBG, " in Rx Netpoll!!\n");
2645 break; 2652 break;
2646 } 2653 }
2647 } 2654 }
@@ -3307,6 +3314,7 @@ static void s2io_reset(struct s2io_nic * sp)
3307 u16 subid, pci_cmd; 3314 u16 subid, pci_cmd;
3308 int i; 3315 int i;
3309 u16 val16; 3316 u16 val16;
3317 unsigned long long reset_cnt = 0;
3310 DBG_PRINT(INIT_DBG,"%s - Resetting XFrame card %s\n", 3318 DBG_PRINT(INIT_DBG,"%s - Resetting XFrame card %s\n",
3311 __FUNCTION__, sp->dev->name); 3319 __FUNCTION__, sp->dev->name);
3312 3320
@@ -3372,6 +3380,11 @@ new_way:
3372 3380
3373 /* Reset device statistics maintained by OS */ 3381 /* Reset device statistics maintained by OS */
3374 memset(&sp->stats, 0, sizeof (struct net_device_stats)); 3382 memset(&sp->stats, 0, sizeof (struct net_device_stats));
3383 /* save reset count */
3384 reset_cnt = sp->mac_control.stats_info->sw_stat.soft_reset_cnt;
3385 memset(sp->mac_control.stats_info, 0, sizeof(struct stat_block));
3386 /* restore reset count */
3387 sp->mac_control.stats_info->sw_stat.soft_reset_cnt = reset_cnt;
3375 3388
3376 /* SXE-002: Configure link and activity LED to turn it off */ 3389 /* SXE-002: Configure link and activity LED to turn it off */
3377 subid = sp->pdev->subsystem_device; 3390 subid = sp->pdev->subsystem_device;
@@ -3659,7 +3672,7 @@ static int s2io_enable_msi_x(struct s2io_nic *nic)
3659 nic->entries = kmalloc(MAX_REQUESTED_MSI_X * sizeof(struct msix_entry), 3672 nic->entries = kmalloc(MAX_REQUESTED_MSI_X * sizeof(struct msix_entry),
3660 GFP_KERNEL); 3673 GFP_KERNEL);
3661 if (nic->entries == NULL) { 3674 if (nic->entries == NULL) {
3662 DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", __FUNCTION__); 3675 DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
3663 return -ENOMEM; 3676 return -ENOMEM;
3664 } 3677 }
3665 memset(nic->entries, 0, MAX_REQUESTED_MSI_X * sizeof(struct msix_entry)); 3678 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)
3668 kmalloc(MAX_REQUESTED_MSI_X * sizeof(struct s2io_msix_entry), 3681 kmalloc(MAX_REQUESTED_MSI_X * sizeof(struct s2io_msix_entry),
3669 GFP_KERNEL); 3682 GFP_KERNEL);
3670 if (nic->s2io_entries == NULL) { 3683 if (nic->s2io_entries == NULL) {
3671 DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", __FUNCTION__); 3684 DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
3672 kfree(nic->entries); 3685 kfree(nic->entries);
3673 return -ENOMEM; 3686 return -ENOMEM;
3674 } 3687 }
@@ -4019,7 +4032,7 @@ static int s2io_chk_rx_buffers(struct s2io_nic *sp, int rng_n)
4019 DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); 4032 DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__);
4020 DBG_PRINT(INTR_DBG, "PANIC levels\n"); 4033 DBG_PRINT(INTR_DBG, "PANIC levels\n");
4021 if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { 4034 if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) {
4022 DBG_PRINT(ERR_DBG, "Out of memory in %s", 4035 DBG_PRINT(INFO_DBG, "Out of memory in %s",
4023 __FUNCTION__); 4036 __FUNCTION__);
4024 clear_bit(0, (&sp->tasklet_status)); 4037 clear_bit(0, (&sp->tasklet_status));
4025 return -1; 4038 return -1;
@@ -4029,8 +4042,8 @@ static int s2io_chk_rx_buffers(struct s2io_nic *sp, int rng_n)
4029 tasklet_schedule(&sp->task); 4042 tasklet_schedule(&sp->task);
4030 4043
4031 } else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { 4044 } else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) {
4032 DBG_PRINT(ERR_DBG, "%s:Out of memory", sp->dev->name); 4045 DBG_PRINT(INFO_DBG, "%s:Out of memory", sp->dev->name);
4033 DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); 4046 DBG_PRINT(INFO_DBG, " in Rx Intr!!\n");
4034 } 4047 }
4035 return 0; 4048 return 0;
4036} 4049}
@@ -4279,9 +4292,7 @@ static void s2io_updt_stats(struct s2io_nic *sp)
4279 if (cnt == 5) 4292 if (cnt == 5)
4280 break; /* Updt failed */ 4293 break; /* Updt failed */
4281 } while(1); 4294 } while(1);
4282 } else { 4295 }
4283 memset(sp->mac_control.stats_info, 0, sizeof(struct stat_block));
4284 }
4285} 4296}
4286 4297
4287/** 4298/**
@@ -5949,12 +5960,12 @@ static void s2io_tasklet(unsigned long dev_addr)
5949 for (i = 0; i < config->rx_ring_num; i++) { 5960 for (i = 0; i < config->rx_ring_num; i++) {
5950 ret = fill_rx_buffers(sp, i); 5961 ret = fill_rx_buffers(sp, i);
5951 if (ret == -ENOMEM) { 5962 if (ret == -ENOMEM) {
5952 DBG_PRINT(ERR_DBG, "%s: Out of ", 5963 DBG_PRINT(INFO_DBG, "%s: Out of ",
5953 dev->name); 5964 dev->name);
5954 DBG_PRINT(ERR_DBG, "memory in tasklet\n"); 5965 DBG_PRINT(ERR_DBG, "memory in tasklet\n");
5955 break; 5966 break;
5956 } else if (ret == -EFILL) { 5967 } else if (ret == -EFILL) {
5957 DBG_PRINT(ERR_DBG, 5968 DBG_PRINT(INFO_DBG,
5958 "%s: Rx Ring %d is full\n", 5969 "%s: Rx Ring %d is full\n",
5959 dev->name, i); 5970 dev->name, i);
5960 break; 5971 break;
@@ -6065,8 +6076,8 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
6065 } else { 6076 } else {
6066 *skb = dev_alloc_skb(size); 6077 *skb = dev_alloc_skb(size);
6067 if (!(*skb)) { 6078 if (!(*skb)) {
6068 DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); 6079 DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
6069 DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n"); 6080 DBG_PRINT(INFO_DBG, "memory to allocate SKBs\n");
6070 return -ENOMEM ; 6081 return -ENOMEM ;
6071 } 6082 }
6072 /* storing the mapped addr in a temp variable 6083 /* 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,
6088 } else { 6099 } else {
6089 *skb = dev_alloc_skb(size); 6100 *skb = dev_alloc_skb(size);
6090 if (!(*skb)) { 6101 if (!(*skb)) {
6091 DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n", 6102 DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n",
6092 dev->name); 6103 dev->name);
6093 return -ENOMEM; 6104 return -ENOMEM;
6094 } 6105 }
@@ -6115,7 +6126,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
6115 } else { 6126 } else {
6116 *skb = dev_alloc_skb(size); 6127 *skb = dev_alloc_skb(size);
6117 if (!(*skb)) { 6128 if (!(*skb)) {
6118 DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n", 6129 DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n",
6119 dev->name); 6130 dev->name);
6120 return -ENOMEM; 6131 return -ENOMEM;
6121 } 6132 }
@@ -6616,7 +6627,6 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)
6616 6627
6617 /* Updating statistics */ 6628 /* Updating statistics */
6618 rxdp->Host_Control = 0; 6629 rxdp->Host_Control = 0;
6619 sp->rx_pkt_count++;
6620 sp->stats.rx_packets++; 6630 sp->stats.rx_packets++;
6621 if (sp->rxd_mode == RXD_MODE_1) { 6631 if (sp->rxd_mode == RXD_MODE_1) {
6622 int len = RXD_GET_BUFFER0_SIZE_1(rxdp->Control_2); 6632 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)
7252 goto register_failed; 7262 goto register_failed;
7253 } 7263 }
7254 s2io_vpd_read(sp); 7264 s2io_vpd_read(sp);
7255 DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n"); 7265 DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2007 Neterion Inc.\n");
7256 DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n",dev->name, 7266 DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n",dev->name,
7257 sp->product_name, get_xena_rev_id(sp->pdev)); 7267 sp->product_name, get_xena_rev_id(sp->pdev));
7258 DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name, 7268 DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name,