nes_nic.c revision cecdcd5f24be8c532ad8dcbbd93c7b477cfd3413
1/*
2 * Copyright (c) 2006 - 2011 Intel Corporation.  All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses.  You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 *     Redistribution and use in source and binary forms, with or
11 *     without modification, are permitted provided that the following
12 *     conditions are met:
13 *
14 *      - Redistributions of source code must retain the above
15 *        copyright notice, this list of conditions and the following
16 *        disclaimer.
17 *
18 *      - Redistributions in binary form must reproduce the above
19 *        copyright notice, this list of conditions and the following
20 *        disclaimer in the documentation and/or other materials
21 *        provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 *
32 */
33
34#include <linux/module.h>
35#include <linux/moduleparam.h>
36#include <linux/netdevice.h>
37#include <linux/etherdevice.h>
38#include <linux/ip.h>
39#include <linux/tcp.h>
40#include <linux/if_arp.h>
41#include <linux/if_vlan.h>
42#include <linux/ethtool.h>
43#include <linux/slab.h>
44#include <net/tcp.h>
45
46#include <net/inet_common.h>
47#include <linux/inet.h>
48
49#include "nes.h"
50
51static struct nic_qp_map nic_qp_mapping_0[] = {
52	{16,0,0,1},{24,4,0,0},{28,8,0,0},{32,12,0,0},
53	{20,2,2,1},{26,6,2,0},{30,10,2,0},{34,14,2,0},
54	{18,1,1,1},{25,5,1,0},{29,9,1,0},{33,13,1,0},
55	{22,3,3,1},{27,7,3,0},{31,11,3,0},{35,15,3,0}
56};
57
58static struct nic_qp_map nic_qp_mapping_1[] = {
59	{18,1,1,1},{25,5,1,0},{29,9,1,0},{33,13,1,0},
60	{22,3,3,1},{27,7,3,0},{31,11,3,0},{35,15,3,0}
61};
62
63static struct nic_qp_map nic_qp_mapping_2[] = {
64	{20,2,2,1},{26,6,2,0},{30,10,2,0},{34,14,2,0}
65};
66
67static struct nic_qp_map nic_qp_mapping_3[] = {
68	{22,3,3,1},{27,7,3,0},{31,11,3,0},{35,15,3,0}
69};
70
71static struct nic_qp_map nic_qp_mapping_4[] = {
72	{28,8,0,0},{32,12,0,0}
73};
74
75static struct nic_qp_map nic_qp_mapping_5[] = {
76	{29,9,1,0},{33,13,1,0}
77};
78
79static struct nic_qp_map nic_qp_mapping_6[] = {
80	{30,10,2,0},{34,14,2,0}
81};
82
83static struct nic_qp_map nic_qp_mapping_7[] = {
84	{31,11,3,0},{35,15,3,0}
85};
86
87static struct nic_qp_map *nic_qp_mapping_per_function[] = {
88	nic_qp_mapping_0, nic_qp_mapping_1, nic_qp_mapping_2, nic_qp_mapping_3,
89	nic_qp_mapping_4, nic_qp_mapping_5, nic_qp_mapping_6, nic_qp_mapping_7
90};
91
92static const u32 default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK
93		| NETIF_MSG_IFUP | NETIF_MSG_IFDOWN;
94static int debug = -1;
95static int nics_per_function = 1;
96
97/**
98 * nes_netdev_poll
99 */
100static int nes_netdev_poll(struct napi_struct *napi, int budget)
101{
102	struct nes_vnic *nesvnic = container_of(napi, struct nes_vnic, napi);
103	struct nes_device *nesdev = nesvnic->nesdev;
104	struct nes_hw_nic_cq *nescq = &nesvnic->nic_cq;
105
106	nesvnic->budget = budget;
107	nescq->cqes_pending = 0;
108	nescq->rx_cqes_completed = 0;
109	nescq->cqe_allocs_pending = 0;
110	nescq->rx_pkts_indicated = 0;
111
112	nes_nic_ce_handler(nesdev, nescq);
113
114	if (nescq->cqes_pending == 0) {
115		napi_complete(napi);
116		/* clear out completed cqes and arm */
117		nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
118				nescq->cq_number | (nescq->cqe_allocs_pending << 16));
119		nes_read32(nesdev->regs+NES_CQE_ALLOC);
120	} else {
121		/* clear out completed cqes but don't arm */
122		nes_write32(nesdev->regs+NES_CQE_ALLOC,
123				nescq->cq_number | (nescq->cqe_allocs_pending << 16));
124		nes_debug(NES_DBG_NETDEV, "%s: exiting with work pending\n",
125				nesvnic->netdev->name);
126	}
127	return nescq->rx_pkts_indicated;
128}
129
130
131/**
132 * nes_netdev_open - Activate the network interface; ifconfig
133 * ethx up.
134 */
135static int nes_netdev_open(struct net_device *netdev)
136{
137	u32 macaddr_low;
138	u16 macaddr_high;
139	struct nes_vnic *nesvnic = netdev_priv(netdev);
140	struct nes_device *nesdev = nesvnic->nesdev;
141	int ret;
142	int i;
143	struct nes_vnic *first_nesvnic = NULL;
144	u32 nic_active_bit;
145	u32 nic_active;
146	struct list_head *list_pos, *list_temp;
147	unsigned long flags;
148
149	assert(nesdev != NULL);
150
151	if (nesvnic->netdev_open == 1)
152		return 0;
153
154	if (netif_msg_ifup(nesvnic))
155		printk(KERN_INFO PFX "%s: enabling interface\n", netdev->name);
156
157	ret = nes_init_nic_qp(nesdev, netdev);
158	if (ret) {
159		return ret;
160	}
161
162	netif_carrier_off(netdev);
163	netif_stop_queue(netdev);
164
165	if ((!nesvnic->of_device_registered) && (nesvnic->rdma_enabled)) {
166		nesvnic->nesibdev = nes_init_ofa_device(netdev);
167		if (nesvnic->nesibdev == NULL) {
168			printk(KERN_ERR PFX "%s: nesvnic->nesibdev alloc failed", netdev->name);
169		} else {
170			nesvnic->nesibdev->nesvnic = nesvnic;
171			ret = nes_register_ofa_device(nesvnic->nesibdev);
172			if (ret) {
173				printk(KERN_ERR PFX "%s: Unable to register RDMA device, ret = %d\n",
174						netdev->name, ret);
175			}
176		}
177	}
178	/* Set packet filters */
179	nic_active_bit = 1 << nesvnic->nic_index;
180	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_ACTIVE);
181	nic_active |= nic_active_bit;
182	nes_write_indexed(nesdev, NES_IDX_NIC_ACTIVE, nic_active);
183	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE);
184	nic_active |= nic_active_bit;
185	nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE, nic_active);
186	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON);
187	nic_active |= nic_active_bit;
188	nes_write_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON, nic_active);
189
190	macaddr_high  = ((u16)netdev->dev_addr[0]) << 8;
191	macaddr_high += (u16)netdev->dev_addr[1];
192
193	macaddr_low   = ((u32)netdev->dev_addr[2]) << 24;
194	macaddr_low  += ((u32)netdev->dev_addr[3]) << 16;
195	macaddr_low  += ((u32)netdev->dev_addr[4]) << 8;
196	macaddr_low  += (u32)netdev->dev_addr[5];
197
198	/* Program the various MAC regs */
199	for (i = 0; i < NES_MAX_PORT_COUNT; i++) {
200		if (nesvnic->qp_nic_index[i] == 0xf) {
201			break;
202		}
203		nes_debug(NES_DBG_NETDEV, "i=%d, perfect filter table index= %d, PERF FILTER LOW"
204				" (Addr:%08X) = %08X, HIGH = %08X.\n",
205				i, nesvnic->qp_nic_index[i],
206				NES_IDX_PERFECT_FILTER_LOW+
207					(nesvnic->qp_nic_index[i] * 8),
208				macaddr_low,
209				(u32)macaddr_high | NES_MAC_ADDR_VALID |
210				((((u32)nesvnic->nic_index) << 16)));
211		nes_write_indexed(nesdev,
212				NES_IDX_PERFECT_FILTER_LOW + (nesvnic->qp_nic_index[i] * 8),
213				macaddr_low);
214		nes_write_indexed(nesdev,
215				NES_IDX_PERFECT_FILTER_HIGH + (nesvnic->qp_nic_index[i] * 8),
216				(u32)macaddr_high | NES_MAC_ADDR_VALID |
217				((((u32)nesvnic->nic_index) << 16)));
218	}
219
220
221	nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
222			nesvnic->nic_cq.cq_number);
223	nes_read32(nesdev->regs+NES_CQE_ALLOC);
224	list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
225		first_nesvnic = container_of(list_pos, struct nes_vnic, list);
226		if (first_nesvnic->netdev_open == 1)
227			break;
228	}
229	if (first_nesvnic->netdev_open == 0) {
230		nes_debug(NES_DBG_INIT, "Setting up MAC interrupt mask.\n");
231		nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK + (0x200 * nesdev->mac_index),
232				~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
233				NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
234		first_nesvnic = nesvnic;
235	}
236
237	if (first_nesvnic->linkup) {
238		/* Enable network packets */
239		nesvnic->linkup = 1;
240		netif_start_queue(netdev);
241		netif_carrier_on(netdev);
242	}
243
244	spin_lock_irqsave(&nesdev->nesadapter->phy_lock, flags);
245	if (nesdev->nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_SFP_D) {
246		nesdev->link_recheck = 1;
247		mod_delayed_work(system_wq, &nesdev->work,
248				 NES_LINK_RECHECK_DELAY);
249	}
250	spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
251
252	spin_lock_irqsave(&nesvnic->port_ibevent_lock, flags);
253	if (nesvnic->of_device_registered) {
254		nesdev->nesadapter->send_term_ok = 1;
255		if (nesvnic->linkup == 1) {
256			if (nesdev->iw_status == 0) {
257				nesdev->iw_status = 1;
258				nes_port_ibevent(nesvnic);
259			}
260		} else {
261			nesdev->iw_status = 0;
262		}
263	}
264	spin_unlock_irqrestore(&nesvnic->port_ibevent_lock, flags);
265
266	napi_enable(&nesvnic->napi);
267	nesvnic->netdev_open = 1;
268
269	return 0;
270}
271
272
273/**
274 * nes_netdev_stop
275 */
276static int nes_netdev_stop(struct net_device *netdev)
277{
278	struct nes_vnic *nesvnic = netdev_priv(netdev);
279	struct nes_device *nesdev = nesvnic->nesdev;
280	u32 nic_active_mask;
281	u32 nic_active;
282	struct nes_vnic *first_nesvnic = NULL;
283	struct list_head *list_pos, *list_temp;
284	unsigned long flags;
285
286	nes_debug(NES_DBG_SHUTDOWN, "nesvnic=%p, nesdev=%p, netdev=%p %s\n",
287			nesvnic, nesdev, netdev, netdev->name);
288	if (nesvnic->netdev_open == 0)
289		return 0;
290
291	if (netif_msg_ifdown(nesvnic))
292		printk(KERN_INFO PFX "%s: disabling interface\n", netdev->name);
293	netif_carrier_off(netdev);
294
295	/* Disable network packets */
296	napi_disable(&nesvnic->napi);
297	netif_stop_queue(netdev);
298	list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
299		first_nesvnic = container_of(list_pos, struct nes_vnic, list);
300		if ((first_nesvnic->netdev_open == 1) && (first_nesvnic != nesvnic))
301			break;
302	}
303
304	if ((first_nesvnic->netdev_open == 1) && (first_nesvnic != nesvnic)  &&
305		(PCI_FUNC(first_nesvnic->nesdev->pcidev->devfn) !=
306		PCI_FUNC(nesvnic->nesdev->pcidev->devfn))) {
307			nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK+
308				(0x200*nesdev->mac_index), 0xffffffff);
309			nes_write_indexed(first_nesvnic->nesdev,
310				NES_IDX_MAC_INT_MASK+
311				(0x200*first_nesvnic->nesdev->mac_index),
312			~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
313			NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
314	} else {
315		nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK+(0x200*nesdev->mac_index), 0xffffffff);
316	}
317
318	nic_active_mask = ~((u32)(1 << nesvnic->nic_index));
319	nes_write_indexed(nesdev, NES_IDX_PERFECT_FILTER_HIGH+
320			(nesvnic->perfect_filter_index*8), 0);
321	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_ACTIVE);
322	nic_active &= nic_active_mask;
323	nes_write_indexed(nesdev, NES_IDX_NIC_ACTIVE, nic_active);
324	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
325	nic_active &= nic_active_mask;
326	nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
327	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE);
328	nic_active &= nic_active_mask;
329	nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE, nic_active);
330	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
331	nic_active &= nic_active_mask;
332	nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
333	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON);
334	nic_active &= nic_active_mask;
335	nes_write_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON, nic_active);
336
337	spin_lock_irqsave(&nesvnic->port_ibevent_lock, flags);
338	if (nesvnic->of_device_registered) {
339		nesdev->nesadapter->send_term_ok = 0;
340		nesdev->iw_status = 0;
341		if (nesvnic->linkup == 1)
342			nes_port_ibevent(nesvnic);
343	}
344	del_timer_sync(&nesvnic->event_timer);
345	nesvnic->event_timer.function = NULL;
346	spin_unlock_irqrestore(&nesvnic->port_ibevent_lock, flags);
347
348	nes_destroy_nic_qp(nesvnic);
349
350	nesvnic->netdev_open = 0;
351
352	return 0;
353}
354
355
356/**
357 * nes_nic_send
358 */
359static int nes_nic_send(struct sk_buff *skb, struct net_device *netdev)
360{
361	struct nes_vnic *nesvnic = netdev_priv(netdev);
362	struct nes_device *nesdev = nesvnic->nesdev;
363	struct nes_hw_nic *nesnic = &nesvnic->nic;
364	struct nes_hw_nic_sq_wqe *nic_sqe;
365	struct tcphdr *tcph;
366	__le16 *wqe_fragment_length;
367	u32 wqe_misc;
368	u16 wqe_fragment_index = 1;	/* first fragment (0) is used by copy buffer */
369	u16 skb_fragment_index;
370	dma_addr_t bus_address;
371
372	nic_sqe = &nesnic->sq_vbase[nesnic->sq_head];
373	wqe_fragment_length = (__le16 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX];
374
375	/* setup the VLAN tag if present */
376	if (vlan_tx_tag_present(skb)) {
377		nes_debug(NES_DBG_NIC_TX, "%s: VLAN packet to send... VLAN = %08X\n",
378				netdev->name, vlan_tx_tag_get(skb));
379		wqe_misc = NES_NIC_SQ_WQE_TAGVALUE_ENABLE;
380		wqe_fragment_length[0] = (__force __le16) vlan_tx_tag_get(skb);
381	} else
382		wqe_misc = 0;
383
384	/* bump past the vlan tag */
385	wqe_fragment_length++;
386	/*	wqe_fragment_address = (u64 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX]; */
387	wqe_misc |= NES_NIC_SQ_WQE_COMPLETION;
388
389	if (skb->ip_summed == CHECKSUM_PARTIAL) {
390		if (skb_is_gso(skb)) {
391			tcph = tcp_hdr(skb);
392			/* nes_debug(NES_DBG_NIC_TX, "%s: TSO request... is_gso = %u seg size = %u\n",
393					netdev->name, skb_is_gso(skb), skb_shinfo(skb)->gso_size); */
394			wqe_misc |= NES_NIC_SQ_WQE_LSO_ENABLE | (u16)skb_shinfo(skb)->gso_size;
395			set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_LSO_INFO_IDX,
396					((u32)tcph->doff) |
397					(((u32)(((unsigned char *)tcph) - skb->data)) << 4));
398		}
399	} else {	/* CHECKSUM_HW */
400		wqe_misc |= NES_NIC_SQ_WQE_DISABLE_CHKSUM;
401	}
402
403	set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_TOTAL_LENGTH_IDX,
404				skb->len);
405	memcpy(&nesnic->first_frag_vbase[nesnic->sq_head].buffer,
406			skb->data, min(((unsigned int)NES_FIRST_FRAG_SIZE), skb_headlen(skb)));
407	wqe_fragment_length[0] = cpu_to_le16(min(((unsigned int)NES_FIRST_FRAG_SIZE),
408			skb_headlen(skb)));
409	wqe_fragment_length[1] = 0;
410	if (skb_headlen(skb) > NES_FIRST_FRAG_SIZE) {
411		if ((skb_shinfo(skb)->nr_frags + 1) > 4) {
412			nes_debug(NES_DBG_NIC_TX, "%s: Packet with %u fragments not sent, skb_headlen=%u\n",
413					netdev->name, skb_shinfo(skb)->nr_frags + 2, skb_headlen(skb));
414			kfree_skb(skb);
415			nesvnic->tx_sw_dropped++;
416			return NETDEV_TX_LOCKED;
417		}
418		set_bit(nesnic->sq_head, nesnic->first_frag_overflow);
419		bus_address = pci_map_single(nesdev->pcidev, skb->data + NES_FIRST_FRAG_SIZE,
420				skb_headlen(skb) - NES_FIRST_FRAG_SIZE, PCI_DMA_TODEVICE);
421		wqe_fragment_length[wqe_fragment_index++] =
422				cpu_to_le16(skb_headlen(skb) - NES_FIRST_FRAG_SIZE);
423		wqe_fragment_length[wqe_fragment_index] = 0;
424		set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG1_LOW_IDX,
425				((u64)(bus_address)));
426		nesnic->tx_skb[nesnic->sq_head] = skb;
427	}
428
429	if (skb_headlen(skb) == skb->len) {
430		if (skb_headlen(skb) <= NES_FIRST_FRAG_SIZE) {
431			nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_2_1_IDX] = 0;
432			nesnic->tx_skb[nesnic->sq_head] = skb;
433		}
434	} else {
435		/* Deal with Fragments */
436		nesnic->tx_skb[nesnic->sq_head] = skb;
437		for (skb_fragment_index = 0; skb_fragment_index < skb_shinfo(skb)->nr_frags;
438				skb_fragment_index++) {
439			skb_frag_t *frag =
440				&skb_shinfo(skb)->frags[skb_fragment_index];
441			bus_address = skb_frag_dma_map(&nesdev->pcidev->dev,
442						       frag, 0, skb_frag_size(frag),
443						       DMA_TO_DEVICE);
444			wqe_fragment_length[wqe_fragment_index] =
445					cpu_to_le16(skb_frag_size(&skb_shinfo(skb)->frags[skb_fragment_index]));
446			set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG0_LOW_IDX+(2*wqe_fragment_index),
447				bus_address);
448			wqe_fragment_index++;
449			if (wqe_fragment_index < 5)
450				wqe_fragment_length[wqe_fragment_index] = 0;
451		}
452	}
453
454	set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_MISC_IDX, wqe_misc);
455	nesnic->sq_head++;
456	nesnic->sq_head &= nesnic->sq_size - 1;
457
458	return NETDEV_TX_OK;
459}
460
461
462/**
463 * nes_netdev_start_xmit
464 */
465static int nes_netdev_start_xmit(struct sk_buff *skb, struct net_device *netdev)
466{
467	struct nes_vnic *nesvnic = netdev_priv(netdev);
468	struct nes_device *nesdev = nesvnic->nesdev;
469	struct nes_hw_nic *nesnic = &nesvnic->nic;
470	struct nes_hw_nic_sq_wqe *nic_sqe;
471	struct tcphdr *tcph;
472	/* struct udphdr *udph; */
473#define NES_MAX_TSO_FRAGS MAX_SKB_FRAGS
474	/* 64K segment plus overflow on each side */
475	dma_addr_t tso_bus_address[NES_MAX_TSO_FRAGS];
476	dma_addr_t bus_address;
477	u32 tso_frag_index;
478	u32 tso_frag_count;
479	u32 tso_wqe_length;
480	u32 curr_tcp_seq;
481	u32 wqe_count=1;
482	u32 send_rc;
483	struct iphdr *iph;
484	__le16 *wqe_fragment_length;
485	u32 nr_frags;
486	u32 original_first_length;
487	/* u64 *wqe_fragment_address; */
488	/* first fragment (0) is used by copy buffer */
489	u16 wqe_fragment_index=1;
490	u16 hoffset;
491	u16 nhoffset;
492	u16 wqes_needed;
493	u16 wqes_available;
494	u32 wqe_misc;
495
496	/*
497	 * nes_debug(NES_DBG_NIC_TX, "%s Request to tx NIC packet length %u, headlen %u,"
498	 *		" (%u frags), tso_size=%u\n",
499	 *		netdev->name, skb->len, skb_headlen(skb),
500	 *		skb_shinfo(skb)->nr_frags, skb_is_gso(skb));
501	 */
502
503	if (!netif_carrier_ok(netdev))
504		return NETDEV_TX_OK;
505
506	if (netif_queue_stopped(netdev))
507		return NETDEV_TX_BUSY;
508
509	/* Check if SQ is full */
510	if ((((nesnic->sq_tail+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) == 1) {
511		if (!netif_queue_stopped(netdev)) {
512			netif_stop_queue(netdev);
513			barrier();
514			if ((((((volatile u16)nesnic->sq_tail)+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) != 1) {
515				netif_start_queue(netdev);
516				goto sq_no_longer_full;
517			}
518		}
519		nesvnic->sq_full++;
520		return NETDEV_TX_BUSY;
521	}
522
523sq_no_longer_full:
524	nr_frags = skb_shinfo(skb)->nr_frags;
525	if (skb_headlen(skb) > NES_FIRST_FRAG_SIZE) {
526		nr_frags++;
527	}
528	/* Check if too many fragments */
529	if (unlikely((nr_frags > 4))) {
530		if (skb_is_gso(skb)) {
531			nesvnic->segmented_tso_requests++;
532			nesvnic->tso_requests++;
533			/* Basically 4 fragments available per WQE with extended fragments */
534			wqes_needed = nr_frags >> 2;
535			wqes_needed += (nr_frags&3)?1:0;
536			wqes_available = (((nesnic->sq_tail+nesnic->sq_size)-nesnic->sq_head) - 1) &
537					(nesnic->sq_size - 1);
538
539			if (unlikely(wqes_needed > wqes_available)) {
540				if (!netif_queue_stopped(netdev)) {
541					netif_stop_queue(netdev);
542					barrier();
543					wqes_available = (((((volatile u16)nesnic->sq_tail)+nesnic->sq_size)-nesnic->sq_head) - 1) &
544						(nesnic->sq_size - 1);
545					if (wqes_needed <= wqes_available) {
546						netif_start_queue(netdev);
547						goto tso_sq_no_longer_full;
548					}
549				}
550				nesvnic->sq_full++;
551				nes_debug(NES_DBG_NIC_TX, "%s: HNIC SQ full- TSO request has too many frags!\n",
552						netdev->name);
553				return NETDEV_TX_BUSY;
554			}
555tso_sq_no_longer_full:
556			/* Map all the buffers */
557			for (tso_frag_count=0; tso_frag_count < skb_shinfo(skb)->nr_frags;
558					tso_frag_count++) {
559				skb_frag_t *frag =
560					&skb_shinfo(skb)->frags[tso_frag_count];
561				tso_bus_address[tso_frag_count] =
562					skb_frag_dma_map(&nesdev->pcidev->dev,
563							 frag, 0, skb_frag_size(frag),
564							 DMA_TO_DEVICE);
565			}
566
567			tso_frag_index = 0;
568			curr_tcp_seq = ntohl(tcp_hdr(skb)->seq);
569			hoffset = skb_transport_header(skb) - skb->data;
570			nhoffset = skb_network_header(skb) - skb->data;
571			original_first_length = hoffset + ((((struct tcphdr *)skb_transport_header(skb))->doff)<<2);
572
573			for (wqe_count=0; wqe_count<((u32)wqes_needed); wqe_count++) {
574				tso_wqe_length = 0;
575				nic_sqe = &nesnic->sq_vbase[nesnic->sq_head];
576				wqe_fragment_length =
577						(__le16 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX];
578				/* setup the VLAN tag if present */
579				if (vlan_tx_tag_present(skb)) {
580					nes_debug(NES_DBG_NIC_TX, "%s: VLAN packet to send... VLAN = %08X\n",
581							netdev->name, vlan_tx_tag_get(skb) );
582					wqe_misc = NES_NIC_SQ_WQE_TAGVALUE_ENABLE;
583					wqe_fragment_length[0] = (__force __le16) vlan_tx_tag_get(skb);
584				} else
585					wqe_misc = 0;
586
587				/* bump past the vlan tag */
588				wqe_fragment_length++;
589
590				/* Assumes header totally fits in allocated buffer and is in first fragment */
591				if (original_first_length > NES_FIRST_FRAG_SIZE) {
592					nes_debug(NES_DBG_NIC_TX, "ERROR: SKB header too big, headlen=%u, FIRST_FRAG_SIZE=%u\n",
593							original_first_length, NES_FIRST_FRAG_SIZE);
594					nes_debug(NES_DBG_NIC_TX, "%s Request to tx NIC packet length %u, headlen %u,"
595							" (%u frags), is_gso = %u tso_size=%u\n",
596							netdev->name,
597							skb->len, skb_headlen(skb),
598							skb_shinfo(skb)->nr_frags, skb_is_gso(skb), skb_shinfo(skb)->gso_size);
599				}
600				memcpy(&nesnic->first_frag_vbase[nesnic->sq_head].buffer,
601						skb->data, min(((unsigned int)NES_FIRST_FRAG_SIZE),
602						original_first_length));
603				iph = (struct iphdr *)
604				(&nesnic->first_frag_vbase[nesnic->sq_head].buffer[nhoffset]);
605				tcph = (struct tcphdr *)
606				(&nesnic->first_frag_vbase[nesnic->sq_head].buffer[hoffset]);
607				if ((wqe_count+1)!=(u32)wqes_needed) {
608					tcph->fin = 0;
609					tcph->psh = 0;
610					tcph->rst = 0;
611					tcph->urg = 0;
612				}
613				if (wqe_count) {
614					tcph->syn = 0;
615				}
616				tcph->seq = htonl(curr_tcp_seq);
617				wqe_fragment_length[0] = cpu_to_le16(min(((unsigned int)NES_FIRST_FRAG_SIZE),
618						original_first_length));
619
620				wqe_fragment_index = 1;
621				if ((wqe_count==0) && (skb_headlen(skb) > original_first_length)) {
622					set_bit(nesnic->sq_head, nesnic->first_frag_overflow);
623					bus_address = pci_map_single(nesdev->pcidev, skb->data + original_first_length,
624							skb_headlen(skb) - original_first_length, PCI_DMA_TODEVICE);
625					wqe_fragment_length[wqe_fragment_index++] =
626						cpu_to_le16(skb_headlen(skb) - original_first_length);
627					wqe_fragment_length[wqe_fragment_index] = 0;
628					set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG1_LOW_IDX,
629									bus_address);
630					tso_wqe_length += skb_headlen(skb) -
631							original_first_length;
632				}
633				while (wqe_fragment_index < 5) {
634					wqe_fragment_length[wqe_fragment_index] =
635							cpu_to_le16(skb_frag_size(&skb_shinfo(skb)->frags[tso_frag_index]));
636					set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG0_LOW_IDX+(2*wqe_fragment_index),
637						(u64)tso_bus_address[tso_frag_index]);
638					wqe_fragment_index++;
639					tso_wqe_length += skb_frag_size(&skb_shinfo(skb)->frags[tso_frag_index++]);
640					if (wqe_fragment_index < 5)
641						wqe_fragment_length[wqe_fragment_index] = 0;
642					if (tso_frag_index == tso_frag_count)
643						break;
644				}
645				if ((wqe_count+1) == (u32)wqes_needed) {
646					nesnic->tx_skb[nesnic->sq_head] = skb;
647				} else {
648					nesnic->tx_skb[nesnic->sq_head] = NULL;
649				}
650				wqe_misc |= NES_NIC_SQ_WQE_COMPLETION | (u16)skb_shinfo(skb)->gso_size;
651				if ((tso_wqe_length + original_first_length) > skb_shinfo(skb)->gso_size) {
652					wqe_misc |= NES_NIC_SQ_WQE_LSO_ENABLE;
653				} else {
654					iph->tot_len = htons(tso_wqe_length + original_first_length - nhoffset);
655				}
656
657				set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_MISC_IDX,
658						 wqe_misc);
659				set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_LSO_INFO_IDX,
660						((u32)tcph->doff) | (((u32)hoffset) << 4));
661
662				set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_TOTAL_LENGTH_IDX,
663						tso_wqe_length + original_first_length);
664				curr_tcp_seq += tso_wqe_length;
665				nesnic->sq_head++;
666				nesnic->sq_head &= nesnic->sq_size-1;
667			}
668		} else {
669			nesvnic->linearized_skbs++;
670			hoffset = skb_transport_header(skb) - skb->data;
671			nhoffset = skb_network_header(skb) - skb->data;
672			skb_linearize(skb);
673			skb_set_transport_header(skb, hoffset);
674			skb_set_network_header(skb, nhoffset);
675			send_rc = nes_nic_send(skb, netdev);
676			if (send_rc != NETDEV_TX_OK)
677				return NETDEV_TX_OK;
678		}
679	} else {
680		send_rc = nes_nic_send(skb, netdev);
681		if (send_rc != NETDEV_TX_OK)
682			return NETDEV_TX_OK;
683	}
684
685	barrier();
686
687	if (wqe_count)
688		nes_write32(nesdev->regs+NES_WQE_ALLOC,
689				(wqe_count << 24) | (1 << 23) | nesvnic->nic.qp_id);
690
691	netdev->trans_start = jiffies;
692
693	return NETDEV_TX_OK;
694}
695
696
697/**
698 * nes_netdev_get_stats
699 */
700static struct net_device_stats *nes_netdev_get_stats(struct net_device *netdev)
701{
702	struct nes_vnic *nesvnic = netdev_priv(netdev);
703	struct nes_device *nesdev = nesvnic->nesdev;
704	u64 u64temp;
705	u32 u32temp;
706
707	u32temp = nes_read_indexed(nesdev,
708			NES_IDX_ENDNODE0_NSTAT_RX_DISCARD + (nesvnic->nic_index*0x200));
709	nesvnic->netstats.rx_dropped += u32temp;
710	nesvnic->endnode_nstat_rx_discard += u32temp;
711
712	u64temp = (u64)nes_read_indexed(nesdev,
713			NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_LO + (nesvnic->nic_index*0x200));
714	u64temp += ((u64)nes_read_indexed(nesdev,
715			NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_HI + (nesvnic->nic_index*0x200))) << 32;
716
717	nesvnic->endnode_nstat_rx_octets += u64temp;
718	nesvnic->netstats.rx_bytes += u64temp;
719
720	u64temp = (u64)nes_read_indexed(nesdev,
721			NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_LO + (nesvnic->nic_index*0x200));
722	u64temp += ((u64)nes_read_indexed(nesdev,
723			NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_HI + (nesvnic->nic_index*0x200))) << 32;
724
725	nesvnic->endnode_nstat_rx_frames += u64temp;
726	nesvnic->netstats.rx_packets += u64temp;
727
728	u64temp = (u64)nes_read_indexed(nesdev,
729			NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_LO + (nesvnic->nic_index*0x200));
730	u64temp += ((u64)nes_read_indexed(nesdev,
731			NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI + (nesvnic->nic_index*0x200))) << 32;
732
733	nesvnic->endnode_nstat_tx_octets += u64temp;
734	nesvnic->netstats.tx_bytes += u64temp;
735
736	u64temp = (u64)nes_read_indexed(nesdev,
737			NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO + (nesvnic->nic_index*0x200));
738	u64temp += ((u64)nes_read_indexed(nesdev,
739			NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI + (nesvnic->nic_index*0x200))) << 32;
740
741	nesvnic->endnode_nstat_tx_frames += u64temp;
742	nesvnic->netstats.tx_packets += u64temp;
743
744	u32temp = nes_read_indexed(nesdev,
745			NES_IDX_MAC_RX_SHORT_FRAMES + (nesvnic->nesdev->mac_index*0x200));
746	nesvnic->netstats.rx_dropped += u32temp;
747	nesvnic->nesdev->mac_rx_errors += u32temp;
748	nesvnic->nesdev->mac_rx_short_frames += u32temp;
749
750	u32temp = nes_read_indexed(nesdev,
751			NES_IDX_MAC_RX_OVERSIZED_FRAMES + (nesvnic->nesdev->mac_index*0x200));
752	nesvnic->netstats.rx_dropped += u32temp;
753	nesvnic->nesdev->mac_rx_errors += u32temp;
754	nesvnic->nesdev->mac_rx_oversized_frames += u32temp;
755
756	u32temp = nes_read_indexed(nesdev,
757			NES_IDX_MAC_RX_JABBER_FRAMES + (nesvnic->nesdev->mac_index*0x200));
758	nesvnic->netstats.rx_dropped += u32temp;
759	nesvnic->nesdev->mac_rx_errors += u32temp;
760	nesvnic->nesdev->mac_rx_jabber_frames += u32temp;
761
762	u32temp = nes_read_indexed(nesdev,
763			NES_IDX_MAC_RX_SYMBOL_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
764	nesvnic->netstats.rx_dropped += u32temp;
765	nesvnic->nesdev->mac_rx_errors += u32temp;
766	nesvnic->nesdev->mac_rx_symbol_err_frames += u32temp;
767
768	u32temp = nes_read_indexed(nesdev,
769			NES_IDX_MAC_RX_LENGTH_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
770	nesvnic->netstats.rx_length_errors += u32temp;
771	nesvnic->nesdev->mac_rx_errors += u32temp;
772
773	u32temp = nes_read_indexed(nesdev,
774			NES_IDX_MAC_RX_CRC_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
775	nesvnic->nesdev->mac_rx_errors += u32temp;
776	nesvnic->nesdev->mac_rx_crc_errors += u32temp;
777	nesvnic->netstats.rx_crc_errors += u32temp;
778
779	u32temp = nes_read_indexed(nesdev,
780			NES_IDX_MAC_TX_ERRORS + (nesvnic->nesdev->mac_index*0x200));
781	nesvnic->nesdev->mac_tx_errors += u32temp;
782	nesvnic->netstats.tx_errors += u32temp;
783
784	return &nesvnic->netstats;
785}
786
787
788/**
789 * nes_netdev_tx_timeout
790 */
791static void nes_netdev_tx_timeout(struct net_device *netdev)
792{
793	struct nes_vnic *nesvnic = netdev_priv(netdev);
794
795	if (netif_msg_timer(nesvnic))
796		nes_debug(NES_DBG_NIC_TX, "%s: tx timeout\n", netdev->name);
797}
798
799
800/**
801 * nes_netdev_set_mac_address
802 */
803static int nes_netdev_set_mac_address(struct net_device *netdev, void *p)
804{
805	struct nes_vnic *nesvnic = netdev_priv(netdev);
806	struct nes_device *nesdev = nesvnic->nesdev;
807	struct sockaddr *mac_addr = p;
808	int i;
809	u32 macaddr_low;
810	u16 macaddr_high;
811
812	if (!is_valid_ether_addr(mac_addr->sa_data))
813		return -EADDRNOTAVAIL;
814
815	memcpy(netdev->dev_addr, mac_addr->sa_data, netdev->addr_len);
816	printk(PFX "%s: Address length = %d, Address = %pM\n",
817	       __func__, netdev->addr_len, mac_addr->sa_data);
818	macaddr_high  = ((u16)netdev->dev_addr[0]) << 8;
819	macaddr_high += (u16)netdev->dev_addr[1];
820	macaddr_low   = ((u32)netdev->dev_addr[2]) << 24;
821	macaddr_low  += ((u32)netdev->dev_addr[3]) << 16;
822	macaddr_low  += ((u32)netdev->dev_addr[4]) << 8;
823	macaddr_low  += (u32)netdev->dev_addr[5];
824
825	for (i = 0; i < NES_MAX_PORT_COUNT; i++) {
826		if (nesvnic->qp_nic_index[i] == 0xf) {
827			break;
828		}
829		nes_write_indexed(nesdev,
830				NES_IDX_PERFECT_FILTER_LOW + (nesvnic->qp_nic_index[i] * 8),
831				macaddr_low);
832		nes_write_indexed(nesdev,
833				NES_IDX_PERFECT_FILTER_HIGH + (nesvnic->qp_nic_index[i] * 8),
834				(u32)macaddr_high | NES_MAC_ADDR_VALID |
835				((((u32)nesvnic->nic_index) << 16)));
836	}
837	return 0;
838}
839
840
841static void set_allmulti(struct nes_device *nesdev, u32 nic_active_bit)
842{
843	u32 nic_active;
844
845	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
846	nic_active |= nic_active_bit;
847	nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
848	nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
849	nic_active &= ~nic_active_bit;
850	nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
851}
852
853#define get_addr(addrs, index) ((addrs) + (index) * ETH_ALEN)
854
855/**
856 * nes_netdev_set_multicast_list
857 */
858static void nes_netdev_set_multicast_list(struct net_device *netdev)
859{
860	struct nes_vnic *nesvnic = netdev_priv(netdev);
861	struct nes_device *nesdev = nesvnic->nesdev;
862	struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
863	u32 nic_active_bit;
864	u32 nic_active;
865	u32 perfect_filter_register_address;
866	u32 macaddr_low;
867	u16 macaddr_high;
868	u8 mc_all_on = 0;
869	u8 mc_index;
870	int mc_nic_index = -1;
871	u8 pft_entries_preallocated = max(nesadapter->adapter_fcn_count *
872					nics_per_function, 4);
873	u8 max_pft_entries_avaiable = NES_PFT_SIZE - pft_entries_preallocated;
874	unsigned long flags;
875	int mc_count = netdev_mc_count(netdev);
876
877	spin_lock_irqsave(&nesadapter->resource_lock, flags);
878	nic_active_bit = 1 << nesvnic->nic_index;
879
880	if (netdev->flags & IFF_PROMISC) {
881		nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
882		nic_active |= nic_active_bit;
883		nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
884		nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
885		nic_active |= nic_active_bit;
886		nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
887		mc_all_on = 1;
888	} else if ((netdev->flags & IFF_ALLMULTI) ||
889			   (nesvnic->nic_index > 3)) {
890		set_allmulti(nesdev, nic_active_bit);
891		mc_all_on = 1;
892	} else {
893		nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
894		nic_active &= ~nic_active_bit;
895		nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
896		nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
897		nic_active &= ~nic_active_bit;
898		nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
899	}
900
901	nes_debug(NES_DBG_NIC_RX, "Number of MC entries = %d, Promiscuous = %d, All Multicast = %d.\n",
902		  mc_count, !!(netdev->flags & IFF_PROMISC),
903		  !!(netdev->flags & IFF_ALLMULTI));
904	if (!mc_all_on) {
905		char *addrs;
906		int i;
907		struct netdev_hw_addr *ha;
908
909		addrs = kmalloc(ETH_ALEN * mc_count, GFP_ATOMIC);
910		if (!addrs) {
911			set_allmulti(nesdev, nic_active_bit);
912			goto unlock;
913		}
914		i = 0;
915		netdev_for_each_mc_addr(ha, netdev)
916			memcpy(get_addr(addrs, i++), ha->addr, ETH_ALEN);
917
918		perfect_filter_register_address = NES_IDX_PERFECT_FILTER_LOW +
919						pft_entries_preallocated * 0x8;
920		for (i = 0, mc_index = 0; mc_index < max_pft_entries_avaiable;
921		     mc_index++) {
922			while (i < mc_count && nesvnic->mcrq_mcast_filter &&
923			((mc_nic_index = nesvnic->mcrq_mcast_filter(nesvnic,
924					get_addr(addrs, i++))) == 0));
925			if (mc_nic_index < 0)
926				mc_nic_index = nesvnic->nic_index;
927			while (nesadapter->pft_mcast_map[mc_index] < 16 &&
928				nesadapter->pft_mcast_map[mc_index] !=
929					nesvnic->nic_index &&
930					mc_index < max_pft_entries_avaiable) {
931						nes_debug(NES_DBG_NIC_RX,
932					"mc_index=%d skipping nic_index=%d, "
933					"used for=%d \n", mc_index,
934					nesvnic->nic_index,
935					nesadapter->pft_mcast_map[mc_index]);
936				mc_index++;
937			}
938			if (mc_index >= max_pft_entries_avaiable)
939				break;
940			if (i < mc_count) {
941				char *addr = get_addr(addrs, i++);
942
943				nes_debug(NES_DBG_NIC_RX, "Assigning MC Address %pM to register 0x%04X nic_idx=%d\n",
944					  addr,
945					  perfect_filter_register_address+(mc_index * 8),
946					  mc_nic_index);
947				macaddr_high  = ((u8) addr[0]) << 8;
948				macaddr_high += (u8) addr[1];
949				macaddr_low   = ((u8) addr[2]) << 24;
950				macaddr_low  += ((u8) addr[3]) << 16;
951				macaddr_low  += ((u8) addr[4]) << 8;
952				macaddr_low  += (u8) addr[5];
953
954				nes_write_indexed(nesdev,
955						perfect_filter_register_address+(mc_index * 8),
956						macaddr_low);
957				nes_write_indexed(nesdev,
958						perfect_filter_register_address+4+(mc_index * 8),
959						(u32)macaddr_high | NES_MAC_ADDR_VALID |
960						((((u32)(1<<mc_nic_index)) << 16)));
961				nesadapter->pft_mcast_map[mc_index] =
962							nesvnic->nic_index;
963			} else {
964				nes_debug(NES_DBG_NIC_RX, "Clearing MC Address at register 0x%04X\n",
965						  perfect_filter_register_address+(mc_index * 8));
966				nes_write_indexed(nesdev,
967						perfect_filter_register_address+4+(mc_index * 8),
968						0);
969				nesadapter->pft_mcast_map[mc_index] = 255;
970			}
971		}
972		kfree(addrs);
973		/* PFT is not large enough */
974		if (i < mc_count)
975			set_allmulti(nesdev, nic_active_bit);
976	}
977
978unlock:
979	spin_unlock_irqrestore(&nesadapter->resource_lock, flags);
980}
981
982
983/**
984 * nes_netdev_change_mtu
985 */
986static int nes_netdev_change_mtu(struct net_device *netdev, int new_mtu)
987{
988	struct nes_vnic	*nesvnic = netdev_priv(netdev);
989	struct nes_device *nesdev = nesvnic->nesdev;
990	int ret = 0;
991	u8 jumbomode = 0;
992	u32 nic_active;
993	u32 nic_active_bit;
994	u32 uc_all_active;
995	u32 mc_all_active;
996
997	if ((new_mtu < ETH_ZLEN) || (new_mtu > max_mtu))
998		return -EINVAL;
999
1000	netdev->mtu = new_mtu;
1001	nesvnic->max_frame_size	= new_mtu + VLAN_ETH_HLEN;
1002
1003	if (netdev->mtu	> 1500)	{
1004		jumbomode=1;
1005	}
1006	nes_nic_init_timer_defaults(nesdev, jumbomode);
1007
1008	if (netif_running(netdev)) {
1009		nic_active_bit = 1 << nesvnic->nic_index;
1010		mc_all_active = nes_read_indexed(nesdev,
1011				NES_IDX_NIC_MULTICAST_ALL) & nic_active_bit;
1012		uc_all_active = nes_read_indexed(nesdev,
1013				NES_IDX_NIC_UNICAST_ALL)  & nic_active_bit;
1014
1015		nes_netdev_stop(netdev);
1016		nes_netdev_open(netdev);
1017
1018		nic_active = nes_read_indexed(nesdev,
1019					NES_IDX_NIC_MULTICAST_ALL);
1020		nic_active |= mc_all_active;
1021		nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL,
1022							nic_active);
1023
1024		nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
1025		nic_active |= uc_all_active;
1026		nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
1027	}
1028
1029	return ret;
1030}
1031
1032
1033static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = {
1034	"Link Change Interrupts",
1035	"Linearized SKBs",
1036	"T/GSO Requests",
1037	"Pause Frames Sent",
1038	"Pause Frames Received",
1039	"Internal Routing Errors",
1040	"SQ SW Dropped SKBs",
1041	"SQ Full",
1042	"Segmented TSO Requests",
1043	"Rx Symbol Errors",
1044	"Rx Jabber Errors",
1045	"Rx Oversized Frames",
1046	"Rx Short Frames",
1047	"Rx Length Errors",
1048	"Rx CRC Errors",
1049	"Rx Port Discard",
1050	"Endnode Rx Discards",
1051	"Endnode Rx Octets",
1052	"Endnode Rx Frames",
1053	"Endnode Tx Octets",
1054	"Endnode Tx Frames",
1055	"Tx Errors",
1056	"mh detected",
1057	"mh pauses",
1058	"Retransmission Count",
1059	"CM Connects",
1060	"CM Accepts",
1061	"Disconnects",
1062	"Connected Events",
1063	"Connect Requests",
1064	"CM Rejects",
1065	"ModifyQP Timeouts",
1066	"CreateQPs",
1067	"SW DestroyQPs",
1068	"DestroyQPs",
1069	"CM Closes",
1070	"CM Packets Sent",
1071	"CM Packets Bounced",
1072	"CM Packets Created",
1073	"CM Packets Rcvd",
1074	"CM Packets Dropped",
1075	"CM Packets Retrans",
1076	"CM Listens Created",
1077	"CM Listens Destroyed",
1078	"CM Backlog Drops",
1079	"CM Loopbacks",
1080	"CM Nodes Created",
1081	"CM Nodes Destroyed",
1082	"CM Accel Drops",
1083	"CM Resets Received",
1084	"Free 4Kpbls",
1085	"Free 256pbls",
1086	"Timer Inits",
1087	"LRO aggregated",
1088	"LRO flushed",
1089	"LRO no_desc",
1090	"PAU CreateQPs",
1091	"PAU DestroyQPs",
1092};
1093#define NES_ETHTOOL_STAT_COUNT  ARRAY_SIZE(nes_ethtool_stringset)
1094
1095
1096/**
1097 * nes_netdev_get_sset_count
1098 */
1099static int nes_netdev_get_sset_count(struct net_device *netdev, int stringset)
1100{
1101	if (stringset == ETH_SS_STATS)
1102		return NES_ETHTOOL_STAT_COUNT;
1103	else
1104		return -EINVAL;
1105}
1106
1107
1108/**
1109 * nes_netdev_get_strings
1110 */
1111static void nes_netdev_get_strings(struct net_device *netdev, u32 stringset,
1112		u8 *ethtool_strings)
1113{
1114	if (stringset == ETH_SS_STATS)
1115		memcpy(ethtool_strings,
1116				&nes_ethtool_stringset,
1117				sizeof(nes_ethtool_stringset));
1118}
1119
1120
1121/**
1122 * nes_netdev_get_ethtool_stats
1123 */
1124
1125static void nes_netdev_get_ethtool_stats(struct net_device *netdev,
1126		struct ethtool_stats *target_ethtool_stats, u64 *target_stat_values)
1127{
1128	u64 u64temp;
1129	struct nes_vnic *nesvnic = netdev_priv(netdev);
1130	struct nes_device *nesdev = nesvnic->nesdev;
1131	struct nes_adapter *nesadapter = nesdev->nesadapter;
1132	u32 nic_count;
1133	u32 u32temp;
1134	u32 index = 0;
1135
1136	target_ethtool_stats->n_stats = NES_ETHTOOL_STAT_COUNT;
1137	target_stat_values[index] = nesvnic->nesdev->link_status_interrupts;
1138	target_stat_values[++index] = nesvnic->linearized_skbs;
1139	target_stat_values[++index] = nesvnic->tso_requests;
1140
1141	u32temp = nes_read_indexed(nesdev,
1142			NES_IDX_MAC_TX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1143	nesvnic->nesdev->mac_pause_frames_sent += u32temp;
1144	target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_sent;
1145
1146	u32temp = nes_read_indexed(nesdev,
1147			NES_IDX_MAC_RX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1148	nesvnic->nesdev->mac_pause_frames_received += u32temp;
1149
1150	u32temp = nes_read_indexed(nesdev,
1151			NES_IDX_PORT_RX_DISCARDS + (nesvnic->nesdev->mac_index*0x40));
1152	nesvnic->nesdev->port_rx_discards += u32temp;
1153	nesvnic->netstats.rx_dropped += u32temp;
1154
1155	u32temp = nes_read_indexed(nesdev,
1156			NES_IDX_PORT_TX_DISCARDS + (nesvnic->nesdev->mac_index*0x40));
1157	nesvnic->nesdev->port_tx_discards += u32temp;
1158	nesvnic->netstats.tx_dropped += u32temp;
1159
1160	u32temp = nes_read_indexed(nesdev,
1161			NES_IDX_MAC_RX_SHORT_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1162	nesvnic->netstats.rx_dropped += u32temp;
1163	nesvnic->nesdev->mac_rx_errors += u32temp;
1164	nesvnic->nesdev->mac_rx_short_frames += u32temp;
1165
1166	u32temp = nes_read_indexed(nesdev,
1167			NES_IDX_MAC_RX_OVERSIZED_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1168	nesvnic->netstats.rx_dropped += u32temp;
1169	nesvnic->nesdev->mac_rx_errors += u32temp;
1170	nesvnic->nesdev->mac_rx_oversized_frames += u32temp;
1171
1172	u32temp = nes_read_indexed(nesdev,
1173			NES_IDX_MAC_RX_JABBER_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1174	nesvnic->netstats.rx_dropped += u32temp;
1175	nesvnic->nesdev->mac_rx_errors += u32temp;
1176	nesvnic->nesdev->mac_rx_jabber_frames += u32temp;
1177
1178	u32temp = nes_read_indexed(nesdev,
1179			NES_IDX_MAC_RX_SYMBOL_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1180	nesvnic->netstats.rx_dropped += u32temp;
1181	nesvnic->nesdev->mac_rx_errors += u32temp;
1182	nesvnic->nesdev->mac_rx_symbol_err_frames += u32temp;
1183
1184	u32temp = nes_read_indexed(nesdev,
1185			NES_IDX_MAC_RX_LENGTH_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1186	nesvnic->netstats.rx_length_errors += u32temp;
1187	nesvnic->nesdev->mac_rx_errors += u32temp;
1188
1189	u32temp = nes_read_indexed(nesdev,
1190			NES_IDX_MAC_RX_CRC_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1191	nesvnic->nesdev->mac_rx_errors += u32temp;
1192	nesvnic->nesdev->mac_rx_crc_errors += u32temp;
1193	nesvnic->netstats.rx_crc_errors += u32temp;
1194
1195	u32temp = nes_read_indexed(nesdev,
1196			NES_IDX_MAC_TX_ERRORS + (nesvnic->nesdev->mac_index*0x200));
1197	nesvnic->nesdev->mac_tx_errors += u32temp;
1198	nesvnic->netstats.tx_errors += u32temp;
1199
1200	for (nic_count = 0; nic_count < NES_MAX_PORT_COUNT; nic_count++) {
1201		if (nesvnic->qp_nic_index[nic_count] == 0xf)
1202			break;
1203
1204		u32temp = nes_read_indexed(nesdev,
1205				NES_IDX_ENDNODE0_NSTAT_RX_DISCARD +
1206				(nesvnic->qp_nic_index[nic_count]*0x200));
1207		nesvnic->netstats.rx_dropped += u32temp;
1208		nesvnic->endnode_nstat_rx_discard += u32temp;
1209
1210		u64temp = (u64)nes_read_indexed(nesdev,
1211				NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_LO +
1212				(nesvnic->qp_nic_index[nic_count]*0x200));
1213		u64temp += ((u64)nes_read_indexed(nesdev,
1214				NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_HI +
1215				(nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1216
1217		nesvnic->endnode_nstat_rx_octets += u64temp;
1218		nesvnic->netstats.rx_bytes += u64temp;
1219
1220		u64temp = (u64)nes_read_indexed(nesdev,
1221				NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_LO +
1222				(nesvnic->qp_nic_index[nic_count]*0x200));
1223		u64temp += ((u64)nes_read_indexed(nesdev,
1224				NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_HI +
1225				(nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1226
1227		nesvnic->endnode_nstat_rx_frames += u64temp;
1228		nesvnic->netstats.rx_packets += u64temp;
1229
1230		u64temp = (u64)nes_read_indexed(nesdev,
1231				NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_LO +
1232				(nesvnic->qp_nic_index[nic_count]*0x200));
1233		u64temp += ((u64)nes_read_indexed(nesdev,
1234				NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI +
1235				(nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1236
1237		nesvnic->endnode_nstat_tx_octets += u64temp;
1238		nesvnic->netstats.tx_bytes += u64temp;
1239
1240		u64temp = (u64)nes_read_indexed(nesdev,
1241				NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO +
1242				(nesvnic->qp_nic_index[nic_count]*0x200));
1243		u64temp += ((u64)nes_read_indexed(nesdev,
1244				NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI +
1245				(nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1246
1247		nesvnic->endnode_nstat_tx_frames += u64temp;
1248		nesvnic->netstats.tx_packets += u64temp;
1249
1250		u32temp = nes_read_indexed(nesdev,
1251				NES_IDX_IPV4_TCP_REXMITS + (nesvnic->qp_nic_index[nic_count]*0x200));
1252		nesvnic->endnode_ipv4_tcp_retransmits += u32temp;
1253	}
1254
1255	target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_received;
1256	target_stat_values[++index] = nesdev->nesadapter->nic_rx_eth_route_err;
1257	target_stat_values[++index] = nesvnic->tx_sw_dropped;
1258	target_stat_values[++index] = nesvnic->sq_full;
1259	target_stat_values[++index] = nesvnic->segmented_tso_requests;
1260	target_stat_values[++index] = nesvnic->nesdev->mac_rx_symbol_err_frames;
1261	target_stat_values[++index] = nesvnic->nesdev->mac_rx_jabber_frames;
1262	target_stat_values[++index] = nesvnic->nesdev->mac_rx_oversized_frames;
1263	target_stat_values[++index] = nesvnic->nesdev->mac_rx_short_frames;
1264	target_stat_values[++index] = nesvnic->netstats.rx_length_errors;
1265	target_stat_values[++index] = nesvnic->nesdev->mac_rx_crc_errors;
1266	target_stat_values[++index] = nesvnic->nesdev->port_rx_discards;
1267	target_stat_values[++index] = nesvnic->endnode_nstat_rx_discard;
1268	target_stat_values[++index] = nesvnic->endnode_nstat_rx_octets;
1269	target_stat_values[++index] = nesvnic->endnode_nstat_rx_frames;
1270	target_stat_values[++index] = nesvnic->endnode_nstat_tx_octets;
1271	target_stat_values[++index] = nesvnic->endnode_nstat_tx_frames;
1272	target_stat_values[++index] = nesvnic->nesdev->mac_tx_errors;
1273	target_stat_values[++index] = mh_detected;
1274	target_stat_values[++index] = mh_pauses_sent;
1275	target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits;
1276	target_stat_values[++index] = atomic_read(&cm_connects);
1277	target_stat_values[++index] = atomic_read(&cm_accepts);
1278	target_stat_values[++index] = atomic_read(&cm_disconnects);
1279	target_stat_values[++index] = atomic_read(&cm_connecteds);
1280	target_stat_values[++index] = atomic_read(&cm_connect_reqs);
1281	target_stat_values[++index] = atomic_read(&cm_rejects);
1282	target_stat_values[++index] = atomic_read(&mod_qp_timouts);
1283	target_stat_values[++index] = atomic_read(&qps_created);
1284	target_stat_values[++index] = atomic_read(&sw_qps_destroyed);
1285	target_stat_values[++index] = atomic_read(&qps_destroyed);
1286	target_stat_values[++index] = atomic_read(&cm_closes);
1287	target_stat_values[++index] = cm_packets_sent;
1288	target_stat_values[++index] = cm_packets_bounced;
1289	target_stat_values[++index] = cm_packets_created;
1290	target_stat_values[++index] = cm_packets_received;
1291	target_stat_values[++index] = cm_packets_dropped;
1292	target_stat_values[++index] = cm_packets_retrans;
1293	target_stat_values[++index] = atomic_read(&cm_listens_created);
1294	target_stat_values[++index] = atomic_read(&cm_listens_destroyed);
1295	target_stat_values[++index] = cm_backlog_drops;
1296	target_stat_values[++index] = atomic_read(&cm_loopbacks);
1297	target_stat_values[++index] = atomic_read(&cm_nodes_created);
1298	target_stat_values[++index] = atomic_read(&cm_nodes_destroyed);
1299	target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts);
1300	target_stat_values[++index] = atomic_read(&cm_resets_recvd);
1301	target_stat_values[++index] = nesadapter->free_4kpbl;
1302	target_stat_values[++index] = nesadapter->free_256pbl;
1303	target_stat_values[++index] = int_mod_timer_init;
1304	target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated;
1305	target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed;
1306	target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc;
1307	target_stat_values[++index] = atomic_read(&pau_qps_created);
1308	target_stat_values[++index] = atomic_read(&pau_qps_destroyed);
1309}
1310
1311/**
1312 * nes_netdev_get_drvinfo
1313 */
1314static void nes_netdev_get_drvinfo(struct net_device *netdev,
1315		struct ethtool_drvinfo *drvinfo)
1316{
1317	struct nes_vnic *nesvnic = netdev_priv(netdev);
1318	struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
1319
1320	strcpy(drvinfo->driver, DRV_NAME);
1321	strcpy(drvinfo->bus_info, pci_name(nesvnic->nesdev->pcidev));
1322	sprintf(drvinfo->fw_version, "%u.%u", nesadapter->firmware_version>>16,
1323				nesadapter->firmware_version & 0x000000ff);
1324	strcpy(drvinfo->version, DRV_VERSION);
1325	drvinfo->testinfo_len = 0;
1326	drvinfo->eedump_len = 0;
1327	drvinfo->regdump_len = 0;
1328}
1329
1330
1331/**
1332 * nes_netdev_set_coalesce
1333 */
1334static int nes_netdev_set_coalesce(struct net_device *netdev,
1335		struct ethtool_coalesce	*et_coalesce)
1336{
1337	struct nes_vnic	*nesvnic = netdev_priv(netdev);
1338	struct nes_device *nesdev = nesvnic->nesdev;
1339	struct nes_adapter *nesadapter = nesdev->nesadapter;
1340	struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
1341	unsigned long flags;
1342
1343	spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags);
1344	if (et_coalesce->rx_max_coalesced_frames_low) {
1345		shared_timer->threshold_low = et_coalesce->rx_max_coalesced_frames_low;
1346	}
1347	if (et_coalesce->rx_max_coalesced_frames_irq) {
1348		shared_timer->threshold_target = et_coalesce->rx_max_coalesced_frames_irq;
1349	}
1350	if (et_coalesce->rx_max_coalesced_frames_high) {
1351		shared_timer->threshold_high = et_coalesce->rx_max_coalesced_frames_high;
1352	}
1353	if (et_coalesce->rx_coalesce_usecs_low) {
1354		shared_timer->timer_in_use_min = et_coalesce->rx_coalesce_usecs_low;
1355	}
1356	if (et_coalesce->rx_coalesce_usecs_high) {
1357		shared_timer->timer_in_use_max = et_coalesce->rx_coalesce_usecs_high;
1358	}
1359	spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
1360
1361	/* using this to drive total interrupt moderation */
1362	nesadapter->et_rx_coalesce_usecs_irq = et_coalesce->rx_coalesce_usecs_irq;
1363	if (et_coalesce->use_adaptive_rx_coalesce) {
1364		nesadapter->et_use_adaptive_rx_coalesce	= 1;
1365		nesadapter->timer_int_limit = NES_TIMER_INT_LIMIT_DYNAMIC;
1366		nesadapter->et_rx_coalesce_usecs_irq = 0;
1367		if (et_coalesce->pkt_rate_low) {
1368			nesadapter->et_pkt_rate_low = et_coalesce->pkt_rate_low;
1369		}
1370	} else {
1371		nesadapter->et_use_adaptive_rx_coalesce	= 0;
1372		nesadapter->timer_int_limit = NES_TIMER_INT_LIMIT;
1373		if (nesadapter->et_rx_coalesce_usecs_irq) {
1374			nes_write32(nesdev->regs+NES_PERIODIC_CONTROL,
1375					0x80000000 | ((u32)(nesadapter->et_rx_coalesce_usecs_irq*8)));
1376		}
1377	}
1378	return 0;
1379}
1380
1381
1382/**
1383 * nes_netdev_get_coalesce
1384 */
1385static int nes_netdev_get_coalesce(struct net_device *netdev,
1386		struct ethtool_coalesce	*et_coalesce)
1387{
1388	struct nes_vnic	*nesvnic = netdev_priv(netdev);
1389	struct nes_device *nesdev = nesvnic->nesdev;
1390	struct nes_adapter *nesadapter = nesdev->nesadapter;
1391	struct ethtool_coalesce	temp_et_coalesce;
1392	struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
1393	unsigned long flags;
1394
1395	memset(&temp_et_coalesce, 0, sizeof(temp_et_coalesce));
1396	temp_et_coalesce.rx_coalesce_usecs_irq    = nesadapter->et_rx_coalesce_usecs_irq;
1397	temp_et_coalesce.use_adaptive_rx_coalesce = nesadapter->et_use_adaptive_rx_coalesce;
1398	temp_et_coalesce.rate_sample_interval     = nesadapter->et_rate_sample_interval;
1399	temp_et_coalesce.pkt_rate_low =	nesadapter->et_pkt_rate_low;
1400	spin_lock_irqsave(&nesadapter->periodic_timer_lock,	flags);
1401	temp_et_coalesce.rx_max_coalesced_frames_low  = shared_timer->threshold_low;
1402	temp_et_coalesce.rx_max_coalesced_frames_irq  = shared_timer->threshold_target;
1403	temp_et_coalesce.rx_max_coalesced_frames_high = shared_timer->threshold_high;
1404	temp_et_coalesce.rx_coalesce_usecs_low  = shared_timer->timer_in_use_min;
1405	temp_et_coalesce.rx_coalesce_usecs_high = shared_timer->timer_in_use_max;
1406	if (nesadapter->et_use_adaptive_rx_coalesce) {
1407		temp_et_coalesce.rx_coalesce_usecs_irq = shared_timer->timer_in_use;
1408	}
1409	spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
1410	memcpy(et_coalesce, &temp_et_coalesce, sizeof(*et_coalesce));
1411	return 0;
1412}
1413
1414
1415/**
1416 * nes_netdev_get_pauseparam
1417 */
1418static void nes_netdev_get_pauseparam(struct net_device *netdev,
1419		struct ethtool_pauseparam *et_pauseparam)
1420{
1421	struct nes_vnic *nesvnic = netdev_priv(netdev);
1422
1423	et_pauseparam->autoneg = 0;
1424	et_pauseparam->rx_pause = (nesvnic->nesdev->disable_rx_flow_control == 0) ? 1:0;
1425	et_pauseparam->tx_pause = (nesvnic->nesdev->disable_tx_flow_control == 0) ? 1:0;
1426}
1427
1428
1429/**
1430 * nes_netdev_set_pauseparam
1431 */
1432static int nes_netdev_set_pauseparam(struct net_device *netdev,
1433		struct ethtool_pauseparam *et_pauseparam)
1434{
1435	struct nes_vnic *nesvnic = netdev_priv(netdev);
1436	struct nes_device *nesdev = nesvnic->nesdev;
1437	u32 u32temp;
1438
1439	if (et_pauseparam->autoneg) {
1440		/* TODO: should return unsupported */
1441		return 0;
1442	}
1443	if ((et_pauseparam->tx_pause == 1) && (nesdev->disable_tx_flow_control == 1)) {
1444		u32temp = nes_read_indexed(nesdev,
1445				NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
1446		u32temp |= NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
1447		nes_write_indexed(nesdev,
1448				NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200), u32temp);
1449		nesdev->disable_tx_flow_control = 0;
1450	} else if ((et_pauseparam->tx_pause == 0) && (nesdev->disable_tx_flow_control == 0)) {
1451		u32temp = nes_read_indexed(nesdev,
1452				NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
1453		u32temp &= ~NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
1454		nes_write_indexed(nesdev,
1455				NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200), u32temp);
1456		nesdev->disable_tx_flow_control = 1;
1457	}
1458	if ((et_pauseparam->rx_pause == 1) && (nesdev->disable_rx_flow_control == 1)) {
1459		u32temp = nes_read_indexed(nesdev,
1460				NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40));
1461		u32temp &= ~NES_IDX_MPP_DEBUG_PORT_DISABLE_PAUSE;
1462		nes_write_indexed(nesdev,
1463				NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40), u32temp);
1464		nesdev->disable_rx_flow_control = 0;
1465	} else if ((et_pauseparam->rx_pause == 0) && (nesdev->disable_rx_flow_control == 0)) {
1466		u32temp = nes_read_indexed(nesdev,
1467				NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40));
1468		u32temp |= NES_IDX_MPP_DEBUG_PORT_DISABLE_PAUSE;
1469		nes_write_indexed(nesdev,
1470				NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40), u32temp);
1471		nesdev->disable_rx_flow_control = 1;
1472	}
1473
1474	return 0;
1475}
1476
1477
1478/**
1479 * nes_netdev_get_settings
1480 */
1481static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd *et_cmd)
1482{
1483	struct nes_vnic *nesvnic = netdev_priv(netdev);
1484	struct nes_device *nesdev = nesvnic->nesdev;
1485	struct nes_adapter *nesadapter = nesdev->nesadapter;
1486	u32 mac_index = nesdev->mac_index;
1487	u8 phy_type = nesadapter->phy_type[mac_index];
1488	u8 phy_index = nesadapter->phy_index[mac_index];
1489	u16 phy_data;
1490
1491	et_cmd->duplex = DUPLEX_FULL;
1492	et_cmd->port   = PORT_MII;
1493	et_cmd->maxtxpkt = 511;
1494	et_cmd->maxrxpkt = 511;
1495
1496	if (nesadapter->OneG_Mode) {
1497		ethtool_cmd_speed_set(et_cmd, SPEED_1000);
1498		if (phy_type == NES_PHY_TYPE_PUMA_1G) {
1499			et_cmd->supported   = SUPPORTED_1000baseT_Full;
1500			et_cmd->advertising = ADVERTISED_1000baseT_Full;
1501			et_cmd->autoneg     = AUTONEG_DISABLE;
1502			et_cmd->transceiver = XCVR_INTERNAL;
1503			et_cmd->phy_address = mac_index;
1504		} else {
1505			unsigned long flags;
1506			et_cmd->supported   = SUPPORTED_1000baseT_Full
1507					    | SUPPORTED_Autoneg;
1508			et_cmd->advertising = ADVERTISED_1000baseT_Full
1509					    | ADVERTISED_Autoneg;
1510			spin_lock_irqsave(&nesadapter->phy_lock, flags);
1511			nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1512			spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
1513			if (phy_data & 0x1000)
1514				et_cmd->autoneg = AUTONEG_ENABLE;
1515			else
1516				et_cmd->autoneg = AUTONEG_DISABLE;
1517			et_cmd->transceiver = XCVR_EXTERNAL;
1518			et_cmd->phy_address = phy_index;
1519		}
1520		return 0;
1521	}
1522	if ((phy_type == NES_PHY_TYPE_ARGUS) ||
1523	    (phy_type == NES_PHY_TYPE_SFP_D) ||
1524	    (phy_type == NES_PHY_TYPE_KR)) {
1525		et_cmd->transceiver = XCVR_EXTERNAL;
1526		et_cmd->port        = PORT_FIBRE;
1527		et_cmd->supported   = SUPPORTED_FIBRE;
1528		et_cmd->advertising = ADVERTISED_FIBRE;
1529		et_cmd->phy_address = phy_index;
1530	} else {
1531		et_cmd->transceiver = XCVR_INTERNAL;
1532		et_cmd->supported   = SUPPORTED_10000baseT_Full;
1533		et_cmd->advertising = ADVERTISED_10000baseT_Full;
1534		et_cmd->phy_address = mac_index;
1535	}
1536	ethtool_cmd_speed_set(et_cmd, SPEED_10000);
1537	et_cmd->autoneg = AUTONEG_DISABLE;
1538	return 0;
1539}
1540
1541
1542/**
1543 * nes_netdev_set_settings
1544 */
1545static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd *et_cmd)
1546{
1547	struct nes_vnic *nesvnic = netdev_priv(netdev);
1548	struct nes_device *nesdev = nesvnic->nesdev;
1549	struct nes_adapter *nesadapter = nesdev->nesadapter;
1550
1551	if ((nesadapter->OneG_Mode) &&
1552	    (nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) {
1553		unsigned long flags;
1554		u16 phy_data;
1555		u8 phy_index = nesadapter->phy_index[nesdev->mac_index];
1556
1557		spin_lock_irqsave(&nesadapter->phy_lock, flags);
1558		nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1559		if (et_cmd->autoneg) {
1560			/* Turn on Full duplex, Autoneg, and restart autonegotiation */
1561			phy_data |= 0x1300;
1562		} else {
1563			/* Turn off autoneg */
1564			phy_data &= ~0x1000;
1565		}
1566		nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data);
1567		spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
1568	}
1569
1570	return 0;
1571}
1572
1573
1574static const struct ethtool_ops nes_ethtool_ops = {
1575	.get_link = ethtool_op_get_link,
1576	.get_settings = nes_netdev_get_settings,
1577	.set_settings = nes_netdev_set_settings,
1578	.get_strings = nes_netdev_get_strings,
1579	.get_sset_count = nes_netdev_get_sset_count,
1580	.get_ethtool_stats = nes_netdev_get_ethtool_stats,
1581	.get_drvinfo = nes_netdev_get_drvinfo,
1582	.get_coalesce = nes_netdev_get_coalesce,
1583	.set_coalesce = nes_netdev_set_coalesce,
1584	.get_pauseparam = nes_netdev_get_pauseparam,
1585	.set_pauseparam = nes_netdev_set_pauseparam,
1586};
1587
1588static void nes_vlan_mode(struct net_device *netdev, struct nes_device *nesdev, netdev_features_t features)
1589{
1590	struct nes_adapter *nesadapter = nesdev->nesadapter;
1591	u32 u32temp;
1592	unsigned long flags;
1593
1594	spin_lock_irqsave(&nesadapter->phy_lock, flags);
1595
1596	nes_debug(NES_DBG_NETDEV, "%s: %s\n", __func__, netdev->name);
1597
1598	/* Enable/Disable VLAN Stripping */
1599	u32temp = nes_read_indexed(nesdev, NES_IDX_PCIX_DIAG);
1600	if (features & NETIF_F_HW_VLAN_RX)
1601		u32temp &= 0xfdffffff;
1602	else
1603		u32temp	|= 0x02000000;
1604
1605	nes_write_indexed(nesdev, NES_IDX_PCIX_DIAG, u32temp);
1606	spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
1607}
1608
1609static netdev_features_t nes_fix_features(struct net_device *netdev, netdev_features_t features)
1610{
1611	/*
1612	 * Since there is no support for separate rx/tx vlan accel
1613	 * enable/disable make sure tx flag is always in same state as rx.
1614	 */
1615	if (features & NETIF_F_HW_VLAN_RX)
1616		features |= NETIF_F_HW_VLAN_TX;
1617	else
1618		features &= ~NETIF_F_HW_VLAN_TX;
1619
1620	return features;
1621}
1622
1623static int nes_set_features(struct net_device *netdev, netdev_features_t features)
1624{
1625	struct nes_vnic *nesvnic = netdev_priv(netdev);
1626	struct nes_device *nesdev = nesvnic->nesdev;
1627	u32 changed = netdev->features ^ features;
1628
1629	if (changed & NETIF_F_HW_VLAN_RX)
1630		nes_vlan_mode(netdev, nesdev, features);
1631
1632	return 0;
1633}
1634
1635static const struct net_device_ops nes_netdev_ops = {
1636	.ndo_open		= nes_netdev_open,
1637	.ndo_stop		= nes_netdev_stop,
1638	.ndo_start_xmit		= nes_netdev_start_xmit,
1639	.ndo_get_stats		= nes_netdev_get_stats,
1640	.ndo_tx_timeout		= nes_netdev_tx_timeout,
1641	.ndo_set_mac_address	= nes_netdev_set_mac_address,
1642	.ndo_set_rx_mode	= nes_netdev_set_multicast_list,
1643	.ndo_change_mtu		= nes_netdev_change_mtu,
1644	.ndo_validate_addr	= eth_validate_addr,
1645	.ndo_fix_features	= nes_fix_features,
1646	.ndo_set_features	= nes_set_features,
1647};
1648
1649/**
1650 * nes_netdev_init - initialize network device
1651 */
1652struct net_device *nes_netdev_init(struct nes_device *nesdev,
1653		void __iomem *mmio_addr)
1654{
1655	u64 u64temp;
1656	struct nes_vnic *nesvnic;
1657	struct net_device *netdev;
1658	struct nic_qp_map *curr_qp_map;
1659	u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index];
1660
1661	netdev = alloc_etherdev(sizeof(struct nes_vnic));
1662	if (!netdev) {
1663		printk(KERN_ERR PFX "nesvnic etherdev alloc failed");
1664		return NULL;
1665	}
1666	nesvnic = netdev_priv(netdev);
1667
1668	nes_debug(NES_DBG_INIT, "netdev = %p, %s\n", netdev, netdev->name);
1669
1670	SET_NETDEV_DEV(netdev, &nesdev->pcidev->dev);
1671
1672	netdev->watchdog_timeo = NES_TX_TIMEOUT;
1673	netdev->irq = nesdev->pcidev->irq;
1674	netdev->mtu = ETH_DATA_LEN;
1675	netdev->hard_header_len = ETH_HLEN;
1676	netdev->addr_len = ETH_ALEN;
1677	netdev->type = ARPHRD_ETHER;
1678	netdev->netdev_ops = &nes_netdev_ops;
1679	netdev->ethtool_ops = &nes_ethtool_ops;
1680	netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128);
1681	nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n");
1682
1683	/* Fill in the port structure */
1684	nesvnic->netdev = netdev;
1685	nesvnic->nesdev = nesdev;
1686	nesvnic->msg_enable = netif_msg_init(debug, default_msg);
1687	nesvnic->netdev_index = nesdev->netdev_count;
1688	nesvnic->perfect_filter_index = nesdev->nesadapter->netdev_count;
1689	nesvnic->max_frame_size = netdev->mtu + netdev->hard_header_len + VLAN_HLEN;
1690
1691	curr_qp_map = nic_qp_mapping_per_function[PCI_FUNC(nesdev->pcidev->devfn)];
1692	nesvnic->nic.qp_id = curr_qp_map[nesdev->netdev_count].qpid;
1693	nesvnic->nic_index = curr_qp_map[nesdev->netdev_count].nic_index;
1694	nesvnic->logical_port = curr_qp_map[nesdev->netdev_count].logical_port;
1695
1696	/* Setup the burned in MAC address */
1697	u64temp = (u64)nesdev->nesadapter->mac_addr_low;
1698	u64temp += ((u64)nesdev->nesadapter->mac_addr_high) << 32;
1699	u64temp += nesvnic->nic_index;
1700	netdev->dev_addr[0] = (u8)(u64temp>>40);
1701	netdev->dev_addr[1] = (u8)(u64temp>>32);
1702	netdev->dev_addr[2] = (u8)(u64temp>>24);
1703	netdev->dev_addr[3] = (u8)(u64temp>>16);
1704	netdev->dev_addr[4] = (u8)(u64temp>>8);
1705	netdev->dev_addr[5] = (u8)u64temp;
1706	memcpy(netdev->perm_addr, netdev->dev_addr, 6);
1707
1708	netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX;
1709	if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV))
1710		netdev->hw_features |= NETIF_F_TSO;
1711
1712	netdev->features = netdev->hw_features | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_TX;
1713	netdev->hw_features |= NETIF_F_LRO;
1714
1715	nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d,"
1716			" nic_index = %d, logical_port = %d, mac_index = %d.\n",
1717			nesvnic, (unsigned long)netdev->features, nesvnic->nic.qp_id,
1718			nesvnic->nic_index, nesvnic->logical_port,  nesdev->mac_index);
1719
1720	if (nesvnic->nesdev->nesadapter->port_count == 1 &&
1721		nesvnic->nesdev->nesadapter->adapter_fcn_count == 1) {
1722
1723		nesvnic->qp_nic_index[0] = nesvnic->nic_index;
1724		nesvnic->qp_nic_index[1] = nesvnic->nic_index + 1;
1725		if (nes_drv_opt & NES_DRV_OPT_DUAL_LOGICAL_PORT) {
1726			nesvnic->qp_nic_index[2] = 0xf;
1727			nesvnic->qp_nic_index[3] = 0xf;
1728		} else {
1729			nesvnic->qp_nic_index[2] = nesvnic->nic_index + 2;
1730			nesvnic->qp_nic_index[3] = nesvnic->nic_index + 3;
1731		}
1732	} else {
1733		if (nesvnic->nesdev->nesadapter->port_count == 2 ||
1734			(nesvnic->nesdev->nesadapter->port_count == 1 &&
1735			nesvnic->nesdev->nesadapter->adapter_fcn_count == 2)) {
1736				nesvnic->qp_nic_index[0] = nesvnic->nic_index;
1737				nesvnic->qp_nic_index[1] = nesvnic->nic_index
1738									+ 2;
1739				nesvnic->qp_nic_index[2] = 0xf;
1740				nesvnic->qp_nic_index[3] = 0xf;
1741		} else {
1742			nesvnic->qp_nic_index[0] = nesvnic->nic_index;
1743			nesvnic->qp_nic_index[1] = 0xf;
1744			nesvnic->qp_nic_index[2] = 0xf;
1745			nesvnic->qp_nic_index[3] = 0xf;
1746		}
1747	}
1748	nesvnic->next_qp_nic_index = 0;
1749
1750	if (nesdev->netdev_count == 0) {
1751		nesvnic->rdma_enabled = 1;
1752	} else {
1753		nesvnic->rdma_enabled = 0;
1754	}
1755	nesvnic->nic_cq.cq_number = nesvnic->nic.qp_id;
1756	init_timer(&nesvnic->event_timer);
1757	nesvnic->event_timer.function = NULL;
1758	spin_lock_init(&nesvnic->tx_lock);
1759	spin_lock_init(&nesvnic->port_ibevent_lock);
1760	nesdev->netdev[nesdev->netdev_count] = netdev;
1761
1762	nes_debug(NES_DBG_INIT, "Adding nesvnic (%p) to the adapters nesvnic_list for MAC%d.\n",
1763			nesvnic, nesdev->mac_index);
1764	list_add_tail(&nesvnic->list, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]);
1765
1766	if ((nesdev->netdev_count == 0) &&
1767	    ((PCI_FUNC(nesdev->pcidev->devfn) == nesdev->mac_index) ||
1768	     ((phy_type == NES_PHY_TYPE_PUMA_1G) &&
1769	      (((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) ||
1770	       ((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) {
1771		u32 u32temp;
1772		u32 link_mask = 0;
1773		u32 link_val = 0;
1774		u16 temp_phy_data;
1775		u16 phy_data = 0;
1776		unsigned long flags;
1777
1778		u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
1779				(0x200 * (nesdev->mac_index & 1)));
1780		if (phy_type != NES_PHY_TYPE_PUMA_1G) {
1781			u32temp |= 0x00200000;
1782			nes_write_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
1783				(0x200 * (nesdev->mac_index & 1)), u32temp);
1784		}
1785
1786		/* Check and set linkup here.  This is for back to back */
1787		/* configuration where second port won't get link interrupt */
1788		switch (phy_type) {
1789		case NES_PHY_TYPE_PUMA_1G:
1790			if (nesdev->mac_index < 2) {
1791				link_mask = 0x01010000;
1792				link_val = 0x01010000;
1793			} else {
1794				link_mask = 0x02020000;
1795				link_val = 0x02020000;
1796			}
1797			break;
1798		case NES_PHY_TYPE_SFP_D:
1799			spin_lock_irqsave(&nesdev->nesadapter->phy_lock, flags);
1800			nes_read_10G_phy_reg(nesdev,
1801					     nesdev->nesadapter->phy_index[nesdev->mac_index],
1802					     1, 0x9003);
1803			temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1804			nes_read_10G_phy_reg(nesdev,
1805					     nesdev->nesadapter->phy_index[nesdev->mac_index],
1806					     3, 0x0021);
1807			nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1808			nes_read_10G_phy_reg(nesdev,
1809					     nesdev->nesadapter->phy_index[nesdev->mac_index],
1810					     3, 0x0021);
1811			phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1812			spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
1813			phy_data = (!temp_phy_data && (phy_data == 0x8000)) ? 0x4 : 0x0;
1814			break;
1815		default:
1816			link_mask = 0x0f1f0000;
1817			link_val = 0x0f0f0000;
1818			break;
1819		}
1820
1821		u32temp = nes_read_indexed(nesdev,
1822					   NES_IDX_PHY_PCS_CONTROL_STATUS0 +
1823					   (0x200 * (nesdev->mac_index & 1)));
1824
1825		if (phy_type == NES_PHY_TYPE_SFP_D) {
1826			if (phy_data & 0x0004)
1827				nesvnic->linkup = 1;
1828		} else {
1829			if ((u32temp & link_mask) == link_val)
1830				nesvnic->linkup = 1;
1831		}
1832
1833		/* clear the MAC interrupt status, assumes direct logical to physical mapping */
1834		u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index));
1835		nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp);
1836		nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp);
1837
1838		nes_init_phy(nesdev);
1839	}
1840
1841	nes_vlan_mode(netdev, nesdev, netdev->features);
1842
1843	return netdev;
1844}
1845
1846
1847/**
1848 * nes_netdev_destroy - destroy network device structure
1849 */
1850void nes_netdev_destroy(struct net_device *netdev)
1851{
1852	struct nes_vnic *nesvnic = netdev_priv(netdev);
1853
1854	/* make sure 'stop' method is called by Linux stack */
1855	/* nes_netdev_stop(netdev); */
1856
1857	list_del(&nesvnic->list);
1858
1859	if (nesvnic->of_device_registered) {
1860		nes_destroy_ofa_device(nesvnic->nesibdev);
1861	}
1862
1863	free_netdev(netdev);
1864}
1865
1866
1867/**
1868 * nes_nic_cm_xmit -- CM calls this to send out pkts
1869 */
1870int nes_nic_cm_xmit(struct sk_buff *skb, struct net_device *netdev)
1871{
1872	int ret;
1873
1874	skb->dev = netdev;
1875	ret = dev_queue_xmit(skb);
1876	if (ret) {
1877		nes_debug(NES_DBG_CM, "Bad return code from dev_queue_xmit %d\n", ret);
1878	}
1879
1880	return ret;
1881}
1882