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