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_vlan.h>
41#include <linux/inet_lro.h>
42#include <linux/slab.h>
43
44#include "nes.h"
45
46static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR;
47module_param(nes_lro_max_aggr, uint, 0444);
48MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation");
49
50static int wide_ppm_offset;
51module_param(wide_ppm_offset, int, 0644);
52MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm");
53
54static u32 crit_err_count;
55u32 int_mod_timer_init;
56u32 int_mod_cq_depth_256;
57u32 int_mod_cq_depth_128;
58u32 int_mod_cq_depth_32;
59u32 int_mod_cq_depth_24;
60u32 int_mod_cq_depth_16;
61u32 int_mod_cq_depth_4;
62u32 int_mod_cq_depth_1;
63static const u8 nes_max_critical_error_count = 100;
64#include "nes_cm.h"
65
66static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq);
67static void nes_init_csr_ne020(struct nes_device *nesdev, u8 hw_rev, u8 port_count);
68static int nes_init_serdes(struct nes_device *nesdev, u8 hw_rev, u8 port_count,
69				struct nes_adapter *nesadapter, u8  OneG_Mode);
70static void nes_nic_napi_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq);
71static void nes_process_aeq(struct nes_device *nesdev, struct nes_hw_aeq *aeq);
72static void nes_process_ceq(struct nes_device *nesdev, struct nes_hw_ceq *ceq);
73static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
74				   struct nes_hw_aeqe *aeqe);
75static void process_critical_error(struct nes_device *nesdev);
76static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number);
77static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode);
78static void nes_terminate_timeout(unsigned long context);
79static void nes_terminate_start_timer(struct nes_qp *nesqp);
80
81#ifdef CONFIG_INFINIBAND_NES_DEBUG
82static unsigned char *nes_iwarp_state_str[] = {
83	"Non-Existent",
84	"Idle",
85	"RTS",
86	"Closing",
87	"RSVD1",
88	"Terminate",
89	"Error",
90	"RSVD2",
91};
92
93static unsigned char *nes_tcp_state_str[] = {
94	"Non-Existent",
95	"Closed",
96	"Listen",
97	"SYN Sent",
98	"SYN Rcvd",
99	"Established",
100	"Close Wait",
101	"FIN Wait 1",
102	"Closing",
103	"Last Ack",
104	"FIN Wait 2",
105	"Time Wait",
106	"RSVD1",
107	"RSVD2",
108	"RSVD3",
109	"RSVD4",
110};
111#endif
112
113static inline void print_ip(struct nes_cm_node *cm_node)
114{
115	unsigned char *rem_addr;
116	if (cm_node) {
117		rem_addr = (unsigned char *)&cm_node->rem_addr;
118		printk(KERN_ERR PFX "Remote IP addr: %pI4\n", rem_addr);
119	}
120}
121
122/**
123 * nes_nic_init_timer_defaults
124 */
125void  nes_nic_init_timer_defaults(struct nes_device *nesdev, u8 jumbomode)
126{
127	unsigned long flags;
128	struct nes_adapter *nesadapter = nesdev->nesadapter;
129	struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
130
131	spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags);
132
133	shared_timer->timer_in_use_min = NES_NIC_FAST_TIMER_LOW;
134	shared_timer->timer_in_use_max = NES_NIC_FAST_TIMER_HIGH;
135	if (jumbomode) {
136		shared_timer->threshold_low    = DEFAULT_JUMBO_NES_QL_LOW;
137		shared_timer->threshold_target = DEFAULT_JUMBO_NES_QL_TARGET;
138		shared_timer->threshold_high   = DEFAULT_JUMBO_NES_QL_HIGH;
139	} else {
140		shared_timer->threshold_low    = DEFAULT_NES_QL_LOW;
141		shared_timer->threshold_target = DEFAULT_NES_QL_TARGET;
142		shared_timer->threshold_high   = DEFAULT_NES_QL_HIGH;
143	}
144
145	/* todo use netdev->mtu to set thresholds */
146	spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
147}
148
149
150/**
151 * nes_nic_init_timer
152 */
153static void  nes_nic_init_timer(struct nes_device *nesdev)
154{
155	unsigned long flags;
156	struct nes_adapter *nesadapter = nesdev->nesadapter;
157	struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
158
159	spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags);
160
161	if (shared_timer->timer_in_use_old == 0) {
162		nesdev->deepcq_count = 0;
163		shared_timer->timer_direction_upward = 0;
164		shared_timer->timer_direction_downward = 0;
165		shared_timer->timer_in_use = NES_NIC_FAST_TIMER;
166		shared_timer->timer_in_use_old = 0;
167
168	}
169	if (shared_timer->timer_in_use != shared_timer->timer_in_use_old) {
170		shared_timer->timer_in_use_old = shared_timer->timer_in_use;
171		nes_write32(nesdev->regs+NES_PERIODIC_CONTROL,
172			0x80000000 | ((u32)(shared_timer->timer_in_use*8)));
173	}
174	/* todo use netdev->mtu to set thresholds */
175	spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
176}
177
178
179/**
180 * nes_nic_tune_timer
181 */
182static void nes_nic_tune_timer(struct nes_device *nesdev)
183{
184	unsigned long flags;
185	struct nes_adapter *nesadapter = nesdev->nesadapter;
186	struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
187	u16 cq_count = nesdev->currcq_count;
188
189	spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags);
190
191	if (shared_timer->cq_count_old <= cq_count)
192		shared_timer->cq_direction_downward = 0;
193	else
194		shared_timer->cq_direction_downward++;
195	shared_timer->cq_count_old = cq_count;
196	if (shared_timer->cq_direction_downward > NES_NIC_CQ_DOWNWARD_TREND) {
197		if (cq_count <= shared_timer->threshold_low &&
198		    shared_timer->threshold_low > 4) {
199			shared_timer->threshold_low = shared_timer->threshold_low/2;
200			shared_timer->cq_direction_downward=0;
201			nesdev->currcq_count = 0;
202			spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
203			return;
204		}
205	}
206
207	if (cq_count > 1) {
208		nesdev->deepcq_count += cq_count;
209		if (cq_count <= shared_timer->threshold_low) {       /* increase timer gently */
210			shared_timer->timer_direction_upward++;
211			shared_timer->timer_direction_downward = 0;
212		} else if (cq_count <= shared_timer->threshold_target) { /* balanced */
213			shared_timer->timer_direction_upward = 0;
214			shared_timer->timer_direction_downward = 0;
215		} else if (cq_count <= shared_timer->threshold_high) {  /* decrease timer gently */
216			shared_timer->timer_direction_downward++;
217			shared_timer->timer_direction_upward = 0;
218		} else if (cq_count <= (shared_timer->threshold_high) * 2) {
219			shared_timer->timer_in_use -= 2;
220			shared_timer->timer_direction_upward = 0;
221			shared_timer->timer_direction_downward++;
222		} else {
223			shared_timer->timer_in_use -= 4;
224			shared_timer->timer_direction_upward = 0;
225			shared_timer->timer_direction_downward++;
226		}
227
228		if (shared_timer->timer_direction_upward > 3 ) {  /* using history */
229			shared_timer->timer_in_use += 3;
230			shared_timer->timer_direction_upward = 0;
231			shared_timer->timer_direction_downward = 0;
232		}
233		if (shared_timer->timer_direction_downward > 5) { /* using history */
234			shared_timer->timer_in_use -= 4 ;
235			shared_timer->timer_direction_downward = 0;
236			shared_timer->timer_direction_upward = 0;
237		}
238	}
239
240	/* boundary checking */
241	if (shared_timer->timer_in_use > shared_timer->threshold_high)
242		shared_timer->timer_in_use = shared_timer->threshold_high;
243	else if (shared_timer->timer_in_use < shared_timer->threshold_low)
244		shared_timer->timer_in_use = shared_timer->threshold_low;
245
246	nesdev->currcq_count = 0;
247
248	spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
249}
250
251
252/**
253 * nes_init_adapter - initialize adapter
254 */
255struct nes_adapter *nes_init_adapter(struct nes_device *nesdev, u8 hw_rev) {
256	struct nes_adapter *nesadapter = NULL;
257	unsigned long num_pds;
258	u32 u32temp;
259	u32 port_count;
260	u16 max_rq_wrs;
261	u16 max_sq_wrs;
262	u32 max_mr;
263	u32 max_256pbl;
264	u32 max_4kpbl;
265	u32 max_qp;
266	u32 max_irrq;
267	u32 max_cq;
268	u32 hte_index_mask;
269	u32 adapter_size;
270	u32 arp_table_size;
271	u16 vendor_id;
272	u16 device_id;
273	u8  OneG_Mode;
274	u8  func_index;
275
276	/* search the list of existing adapters */
277	list_for_each_entry(nesadapter, &nes_adapter_list, list) {
278		nes_debug(NES_DBG_INIT, "Searching Adapter list for PCI devfn = 0x%X,"
279				" adapter PCI slot/bus = %u/%u, pci devices PCI slot/bus = %u/%u, .\n",
280				nesdev->pcidev->devfn,
281				PCI_SLOT(nesadapter->devfn),
282				nesadapter->bus_number,
283				PCI_SLOT(nesdev->pcidev->devfn),
284				nesdev->pcidev->bus->number );
285		if ((PCI_SLOT(nesadapter->devfn) == PCI_SLOT(nesdev->pcidev->devfn)) &&
286				(nesadapter->bus_number == nesdev->pcidev->bus->number)) {
287			nesadapter->ref_count++;
288			return nesadapter;
289		}
290	}
291
292	/* no adapter found */
293	num_pds = pci_resource_len(nesdev->pcidev, BAR_1) >> PAGE_SHIFT;
294	if ((hw_rev != NE020_REV) && (hw_rev != NE020_REV1)) {
295		nes_debug(NES_DBG_INIT, "NE020 driver detected unknown hardware revision 0x%x\n",
296				hw_rev);
297		return NULL;
298	}
299
300	nes_debug(NES_DBG_INIT, "Determine Soft Reset, QP_control=0x%x, CPU0=0x%x, CPU1=0x%x, CPU2=0x%x\n",
301			nes_read_indexed(nesdev, NES_IDX_QP_CONTROL + PCI_FUNC(nesdev->pcidev->devfn) * 8),
302			nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS),
303			nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS + 4),
304			nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS + 8));
305
306	nes_debug(NES_DBG_INIT, "Reset and init NE020\n");
307
308
309	if ((port_count = nes_reset_adapter_ne020(nesdev, &OneG_Mode)) == 0)
310		return NULL;
311
312	max_qp = nes_read_indexed(nesdev, NES_IDX_QP_CTX_SIZE);
313	nes_debug(NES_DBG_INIT, "QP_CTX_SIZE=%u\n", max_qp);
314
315	u32temp = nes_read_indexed(nesdev, NES_IDX_QUAD_HASH_TABLE_SIZE);
316	if (max_qp > ((u32)1 << (u32temp & 0x001f))) {
317		nes_debug(NES_DBG_INIT, "Reducing Max QPs to %u due to hash table size = 0x%08X\n",
318				max_qp, u32temp);
319		max_qp = (u32)1 << (u32temp & 0x001f);
320	}
321
322	hte_index_mask = ((u32)1 << ((u32temp & 0x001f)+1))-1;
323	nes_debug(NES_DBG_INIT, "Max QP = %u, hte_index_mask = 0x%08X.\n",
324			max_qp, hte_index_mask);
325
326	u32temp = nes_read_indexed(nesdev, NES_IDX_IRRQ_COUNT);
327
328	max_irrq = 1 << (u32temp & 0x001f);
329
330	if (max_qp > max_irrq) {
331		max_qp = max_irrq;
332		nes_debug(NES_DBG_INIT, "Reducing Max QPs to %u due to Available Q1s.\n",
333				max_qp);
334	}
335
336	/* there should be no reason to allocate more pds than qps */
337	if (num_pds > max_qp)
338		num_pds = max_qp;
339
340	u32temp = nes_read_indexed(nesdev, NES_IDX_MRT_SIZE);
341	max_mr = (u32)8192 << (u32temp & 0x7);
342
343	u32temp = nes_read_indexed(nesdev, NES_IDX_PBL_REGION_SIZE);
344	max_256pbl = (u32)1 << (u32temp & 0x0000001f);
345	max_4kpbl = (u32)1 << ((u32temp >> 16) & 0x0000001f);
346	max_cq = nes_read_indexed(nesdev, NES_IDX_CQ_CTX_SIZE);
347
348	u32temp = nes_read_indexed(nesdev, NES_IDX_ARP_CACHE_SIZE);
349	arp_table_size = 1 << u32temp;
350
351	adapter_size = (sizeof(struct nes_adapter) +
352			(sizeof(unsigned long)-1)) & (~(sizeof(unsigned long)-1));
353	adapter_size += sizeof(unsigned long) * BITS_TO_LONGS(max_qp);
354	adapter_size += sizeof(unsigned long) * BITS_TO_LONGS(max_mr);
355	adapter_size += sizeof(unsigned long) * BITS_TO_LONGS(max_cq);
356	adapter_size += sizeof(unsigned long) * BITS_TO_LONGS(num_pds);
357	adapter_size += sizeof(unsigned long) * BITS_TO_LONGS(arp_table_size);
358	adapter_size += sizeof(struct nes_qp **) * max_qp;
359
360	/* allocate a new adapter struct */
361	nesadapter = kzalloc(adapter_size, GFP_KERNEL);
362	if (nesadapter == NULL) {
363		return NULL;
364	}
365
366	nes_debug(NES_DBG_INIT, "Allocating new nesadapter @ %p, size = %u (actual size = %u).\n",
367			nesadapter, (u32)sizeof(struct nes_adapter), adapter_size);
368
369	if (nes_read_eeprom_values(nesdev, nesadapter)) {
370		printk(KERN_ERR PFX "Unable to read EEPROM data.\n");
371		kfree(nesadapter);
372		return NULL;
373	}
374
375	nesadapter->vendor_id = (((u32) nesadapter->mac_addr_high) << 8) |
376				(nesadapter->mac_addr_low >> 24);
377
378	pci_bus_read_config_word(nesdev->pcidev->bus, nesdev->pcidev->devfn,
379				 PCI_DEVICE_ID, &device_id);
380	nesadapter->vendor_part_id = device_id;
381
382	if (nes_init_serdes(nesdev, hw_rev, port_count, nesadapter,
383							OneG_Mode)) {
384		kfree(nesadapter);
385		return NULL;
386	}
387	nes_init_csr_ne020(nesdev, hw_rev, port_count);
388
389	memset(nesadapter->pft_mcast_map, 255,
390	       sizeof nesadapter->pft_mcast_map);
391
392	/* populate the new nesadapter */
393	nesadapter->devfn = nesdev->pcidev->devfn;
394	nesadapter->bus_number = nesdev->pcidev->bus->number;
395	nesadapter->ref_count = 1;
396	nesadapter->timer_int_req = 0xffff0000;
397	nesadapter->OneG_Mode = OneG_Mode;
398	nesadapter->doorbell_start = nesdev->doorbell_region;
399
400	/* nesadapter->tick_delta = clk_divisor; */
401	nesadapter->hw_rev = hw_rev;
402	nesadapter->port_count = port_count;
403
404	nesadapter->max_qp = max_qp;
405	nesadapter->hte_index_mask = hte_index_mask;
406	nesadapter->max_irrq = max_irrq;
407	nesadapter->max_mr = max_mr;
408	nesadapter->max_256pbl = max_256pbl - 1;
409	nesadapter->max_4kpbl = max_4kpbl - 1;
410	nesadapter->max_cq = max_cq;
411	nesadapter->free_256pbl = max_256pbl - 1;
412	nesadapter->free_4kpbl = max_4kpbl - 1;
413	nesadapter->max_pd = num_pds;
414	nesadapter->arp_table_size = arp_table_size;
415
416	nesadapter->et_pkt_rate_low = NES_TIMER_ENABLE_LIMIT;
417	if (nes_drv_opt & NES_DRV_OPT_DISABLE_INT_MOD) {
418		nesadapter->et_use_adaptive_rx_coalesce = 0;
419		nesadapter->timer_int_limit = NES_TIMER_INT_LIMIT;
420		nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval;
421	} else {
422		nesadapter->et_use_adaptive_rx_coalesce = 1;
423		nesadapter->timer_int_limit = NES_TIMER_INT_LIMIT_DYNAMIC;
424		nesadapter->et_rx_coalesce_usecs_irq = 0;
425		printk(PFX "%s: Using Adaptive Interrupt Moderation\n", __func__);
426	}
427	/* Setup and enable the periodic timer */
428	if (nesadapter->et_rx_coalesce_usecs_irq)
429		nes_write32(nesdev->regs+NES_PERIODIC_CONTROL, 0x80000000 |
430				((u32)(nesadapter->et_rx_coalesce_usecs_irq * 8)));
431	else
432		nes_write32(nesdev->regs+NES_PERIODIC_CONTROL, 0x00000000);
433
434	nesadapter->base_pd = 1;
435
436	nesadapter->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY |
437				       IB_DEVICE_MEM_WINDOW |
438				       IB_DEVICE_MEM_MGT_EXTENSIONS;
439
440	nesadapter->allocated_qps = (unsigned long *)&(((unsigned char *)nesadapter)
441			[(sizeof(struct nes_adapter)+(sizeof(unsigned long)-1))&(~(sizeof(unsigned long)-1))]);
442	nesadapter->allocated_cqs = &nesadapter->allocated_qps[BITS_TO_LONGS(max_qp)];
443	nesadapter->allocated_mrs = &nesadapter->allocated_cqs[BITS_TO_LONGS(max_cq)];
444	nesadapter->allocated_pds = &nesadapter->allocated_mrs[BITS_TO_LONGS(max_mr)];
445	nesadapter->allocated_arps = &nesadapter->allocated_pds[BITS_TO_LONGS(num_pds)];
446	nesadapter->qp_table = (struct nes_qp **)(&nesadapter->allocated_arps[BITS_TO_LONGS(arp_table_size)]);
447
448
449	/* mark the usual suspect QPs, MR and CQs as in use */
450	for (u32temp = 0; u32temp < NES_FIRST_QPN; u32temp++) {
451		set_bit(u32temp, nesadapter->allocated_qps);
452		set_bit(u32temp, nesadapter->allocated_cqs);
453	}
454	set_bit(0, nesadapter->allocated_mrs);
455
456	for (u32temp = 0; u32temp < 20; u32temp++)
457		set_bit(u32temp, nesadapter->allocated_pds);
458	u32temp = nes_read_indexed(nesdev, NES_IDX_QP_MAX_CFG_SIZES);
459
460	max_rq_wrs = ((u32temp >> 8) & 3);
461	switch (max_rq_wrs) {
462		case 0:
463			max_rq_wrs = 4;
464			break;
465		case 1:
466			max_rq_wrs = 16;
467			break;
468		case 2:
469			max_rq_wrs = 32;
470			break;
471		case 3:
472			max_rq_wrs = 512;
473			break;
474	}
475
476	max_sq_wrs = (u32temp & 3);
477	switch (max_sq_wrs) {
478		case 0:
479			max_sq_wrs = 4;
480			break;
481		case 1:
482			max_sq_wrs = 16;
483			break;
484		case 2:
485			max_sq_wrs = 32;
486			break;
487		case 3:
488			max_sq_wrs = 512;
489			break;
490	}
491	nesadapter->max_qp_wr = min(max_rq_wrs, max_sq_wrs);
492	nesadapter->max_irrq_wr = (u32temp >> 16) & 3;
493
494	nesadapter->max_sge = 4;
495	nesadapter->max_cqe = 32766;
496
497	if (nes_read_eeprom_values(nesdev, nesadapter)) {
498		printk(KERN_ERR PFX "Unable to read EEPROM data.\n");
499		kfree(nesadapter);
500		return NULL;
501	}
502
503	u32temp = nes_read_indexed(nesdev, NES_IDX_TCP_TIMER_CONFIG);
504	nes_write_indexed(nesdev, NES_IDX_TCP_TIMER_CONFIG,
505			(u32temp & 0xff000000) | (nesadapter->tcp_timer_core_clk_divisor & 0x00ffffff));
506
507	/* setup port configuration */
508	if (nesadapter->port_count == 1) {
509		nesadapter->log_port = 0x00000000;
510		if (nes_drv_opt & NES_DRV_OPT_DUAL_LOGICAL_PORT)
511			nes_write_indexed(nesdev, NES_IDX_TX_POOL_SIZE, 0x00000002);
512		else
513			nes_write_indexed(nesdev, NES_IDX_TX_POOL_SIZE, 0x00000003);
514	} else {
515		if (nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G) {
516			nesadapter->log_port = 0x000000D8;
517		} else {
518			if (nesadapter->port_count == 2)
519				nesadapter->log_port = 0x00000044;
520			else
521				nesadapter->log_port = 0x000000e4;
522		}
523		nes_write_indexed(nesdev, NES_IDX_TX_POOL_SIZE, 0x00000003);
524	}
525
526	nes_write_indexed(nesdev, NES_IDX_NIC_LOGPORT_TO_PHYPORT,
527						nesadapter->log_port);
528	nes_debug(NES_DBG_INIT, "Probe time, LOG2PHY=%u\n",
529			nes_read_indexed(nesdev, NES_IDX_NIC_LOGPORT_TO_PHYPORT));
530
531	spin_lock_init(&nesadapter->resource_lock);
532	spin_lock_init(&nesadapter->phy_lock);
533	spin_lock_init(&nesadapter->pbl_lock);
534	spin_lock_init(&nesadapter->periodic_timer_lock);
535
536	INIT_LIST_HEAD(&nesadapter->nesvnic_list[0]);
537	INIT_LIST_HEAD(&nesadapter->nesvnic_list[1]);
538	INIT_LIST_HEAD(&nesadapter->nesvnic_list[2]);
539	INIT_LIST_HEAD(&nesadapter->nesvnic_list[3]);
540
541	if ((!nesadapter->OneG_Mode) && (nesadapter->port_count == 2)) {
542		u32 pcs_control_status0, pcs_control_status1;
543		u32 reset_value;
544		u32 i = 0;
545		u32 int_cnt = 0;
546		u32 ext_cnt = 0;
547		unsigned long flags;
548		u32 j = 0;
549
550		pcs_control_status0 = nes_read_indexed(nesdev,
551			NES_IDX_PHY_PCS_CONTROL_STATUS0);
552		pcs_control_status1 = nes_read_indexed(nesdev,
553			NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
554
555		for (i = 0; i < NES_MAX_LINK_CHECK; i++) {
556			pcs_control_status0 = nes_read_indexed(nesdev,
557					NES_IDX_PHY_PCS_CONTROL_STATUS0);
558			pcs_control_status1 = nes_read_indexed(nesdev,
559					NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
560			if ((0x0F000100 == (pcs_control_status0 & 0x0F000100))
561			    || (0x0F000100 == (pcs_control_status1 & 0x0F000100)))
562				int_cnt++;
563			msleep(1);
564		}
565		if (int_cnt > 1) {
566			spin_lock_irqsave(&nesadapter->phy_lock, flags);
567			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x0000F0C8);
568			mh_detected++;
569			reset_value = nes_read32(nesdev->regs+NES_SOFTWARE_RESET);
570			reset_value |= 0x0000003d;
571			nes_write32(nesdev->regs+NES_SOFTWARE_RESET, reset_value);
572
573			while (((nes_read32(nesdev->regs+NES_SOFTWARE_RESET)
574				& 0x00000040) != 0x00000040) && (j++ < 5000));
575			spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
576
577			pcs_control_status0 = nes_read_indexed(nesdev,
578					NES_IDX_PHY_PCS_CONTROL_STATUS0);
579			pcs_control_status1 = nes_read_indexed(nesdev,
580					NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
581
582			for (i = 0; i < NES_MAX_LINK_CHECK; i++) {
583				pcs_control_status0 = nes_read_indexed(nesdev,
584					NES_IDX_PHY_PCS_CONTROL_STATUS0);
585				pcs_control_status1 = nes_read_indexed(nesdev,
586					NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
587				if ((0x0F000100 == (pcs_control_status0 & 0x0F000100))
588					|| (0x0F000100 == (pcs_control_status1 & 0x0F000100))) {
589					if (++ext_cnt > int_cnt) {
590						spin_lock_irqsave(&nesadapter->phy_lock, flags);
591						nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1,
592								0x0000F088);
593						mh_detected++;
594						reset_value = nes_read32(nesdev->regs+NES_SOFTWARE_RESET);
595						reset_value |= 0x0000003d;
596						nes_write32(nesdev->regs+NES_SOFTWARE_RESET, reset_value);
597
598						while (((nes_read32(nesdev->regs+NES_SOFTWARE_RESET)
599							& 0x00000040) != 0x00000040) && (j++ < 5000));
600						spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
601						break;
602					}
603				}
604				msleep(1);
605			}
606		}
607	}
608
609	if (nesadapter->hw_rev == NE020_REV) {
610		init_timer(&nesadapter->mh_timer);
611		nesadapter->mh_timer.function = nes_mh_fix;
612		nesadapter->mh_timer.expires = jiffies + (HZ/5);  /* 1 second */
613		nesadapter->mh_timer.data = (unsigned long)nesdev;
614		add_timer(&nesadapter->mh_timer);
615	} else {
616		nes_write32(nesdev->regs+NES_INTF_INT_STAT, 0x0f000000);
617	}
618
619	init_timer(&nesadapter->lc_timer);
620	nesadapter->lc_timer.function = nes_clc;
621	nesadapter->lc_timer.expires = jiffies + 3600 * HZ;  /* 1 hour */
622	nesadapter->lc_timer.data = (unsigned long)nesdev;
623	add_timer(&nesadapter->lc_timer);
624
625	list_add_tail(&nesadapter->list, &nes_adapter_list);
626
627	for (func_index = 0; func_index < 8; func_index++) {
628		pci_bus_read_config_word(nesdev->pcidev->bus,
629					PCI_DEVFN(PCI_SLOT(nesdev->pcidev->devfn),
630					func_index), 0, &vendor_id);
631		if (vendor_id == 0xffff)
632			break;
633	}
634	nes_debug(NES_DBG_INIT, "%s %d functions found for %s.\n", __func__,
635		func_index, pci_name(nesdev->pcidev));
636	nesadapter->adapter_fcn_count = func_index;
637
638	return nesadapter;
639}
640
641
642/**
643 * nes_reset_adapter_ne020
644 */
645static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode)
646{
647	u32 port_count;
648	u32 u32temp;
649	u32 i;
650
651	u32temp = nes_read32(nesdev->regs+NES_SOFTWARE_RESET);
652	port_count = ((u32temp & 0x00000300) >> 8) + 1;
653	/* TODO: assuming that both SERDES are set the same for now */
654	*OneG_Mode = (u32temp & 0x00003c00) ? 0 : 1;
655	nes_debug(NES_DBG_INIT, "Initial Software Reset = 0x%08X, port_count=%u\n",
656			u32temp, port_count);
657	if (*OneG_Mode)
658		nes_debug(NES_DBG_INIT, "Running in 1G mode.\n");
659	u32temp &= 0xff00ffc0;
660	switch (port_count) {
661		case 1:
662			u32temp |= 0x00ee0000;
663			break;
664		case 2:
665			u32temp |= 0x00cc0000;
666			break;
667		case 4:
668			u32temp |= 0x00000000;
669			break;
670		default:
671			return 0;
672			break;
673	}
674
675	/* check and do full reset if needed */
676	if (nes_read_indexed(nesdev, NES_IDX_QP_CONTROL+(PCI_FUNC(nesdev->pcidev->devfn)*8))) {
677		nes_debug(NES_DBG_INIT, "Issuing Full Soft reset = 0x%08X\n", u32temp | 0xd);
678		nes_write32(nesdev->regs+NES_SOFTWARE_RESET, u32temp | 0xd);
679
680		i = 0;
681		while (((nes_read32(nesdev->regs+NES_SOFTWARE_RESET) & 0x00000040) == 0) && i++ < 10000)
682			mdelay(1);
683		if (i > 10000) {
684			nes_debug(NES_DBG_INIT, "Did not see full soft reset done.\n");
685			return 0;
686		}
687
688		i = 0;
689		while ((nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS) != 0x80) && i++ < 10000)
690			mdelay(1);
691		if (i > 10000) {
692			printk(KERN_ERR PFX "Internal CPU not ready, status = %02X\n",
693			       nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS));
694			return 0;
695		}
696	}
697
698	/* port reset */
699	switch (port_count) {
700		case 1:
701			u32temp |= 0x00ee0010;
702			break;
703		case 2:
704			u32temp |= 0x00cc0030;
705			break;
706		case 4:
707			u32temp |= 0x00000030;
708			break;
709	}
710
711	nes_debug(NES_DBG_INIT, "Issuing Port Soft reset = 0x%08X\n", u32temp | 0xd);
712	nes_write32(nesdev->regs+NES_SOFTWARE_RESET, u32temp | 0xd);
713
714	i = 0;
715	while (((nes_read32(nesdev->regs+NES_SOFTWARE_RESET) & 0x00000040) == 0) && i++ < 10000)
716		mdelay(1);
717	if (i > 10000) {
718		nes_debug(NES_DBG_INIT, "Did not see port soft reset done.\n");
719		return 0;
720	}
721
722	/* serdes 0 */
723	i = 0;
724	while (((u32temp = (nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS0)
725			& 0x0000000f)) != 0x0000000f) && i++ < 5000)
726		mdelay(1);
727	if (i > 5000) {
728		nes_debug(NES_DBG_INIT, "Serdes 0 not ready, status=%x\n", u32temp);
729		return 0;
730	}
731
732	/* serdes 1 */
733	if (port_count > 1) {
734		i = 0;
735		while (((u32temp = (nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS1)
736				& 0x0000000f)) != 0x0000000f) && i++ < 5000)
737			mdelay(1);
738		if (i > 5000) {
739			nes_debug(NES_DBG_INIT, "Serdes 1 not ready, status=%x\n", u32temp);
740			return 0;
741		}
742	}
743
744	return port_count;
745}
746
747
748/**
749 * nes_init_serdes
750 */
751static int nes_init_serdes(struct nes_device *nesdev, u8 hw_rev, u8 port_count,
752				struct nes_adapter *nesadapter, u8  OneG_Mode)
753{
754	int i;
755	u32 u32temp;
756	u32 sds;
757
758	if (hw_rev != NE020_REV) {
759		/* init serdes 0 */
760		switch (nesadapter->phy_type[0]) {
761		case NES_PHY_TYPE_CX4:
762			if (wide_ppm_offset)
763				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000FFFAA);
764			else
765				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000FF);
766			break;
767		case NES_PHY_TYPE_KR:
768			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000FF);
769			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000);
770			break;
771		case NES_PHY_TYPE_PUMA_1G:
772			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000FF);
773			sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0);
774			sds |= 0x00000100;
775			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, sds);
776			break;
777		default:
778			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000FF);
779			break;
780		}
781
782		if (!OneG_Mode)
783			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE0, 0x11110000);
784
785		if (port_count < 2)
786			return 0;
787
788		/* init serdes 1 */
789		if (!(OneG_Mode && (nesadapter->phy_type[1] != NES_PHY_TYPE_PUMA_1G)))
790			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000000FF);
791
792		switch (nesadapter->phy_type[1]) {
793		case NES_PHY_TYPE_ARGUS:
794		case NES_PHY_TYPE_SFP_D:
795			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000);
796			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000);
797			break;
798		case NES_PHY_TYPE_CX4:
799			if (wide_ppm_offset)
800				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000FFFAA);
801			break;
802		case NES_PHY_TYPE_KR:
803			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000);
804			break;
805		case NES_PHY_TYPE_PUMA_1G:
806			sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1);
807			sds |= 0x000000100;
808			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, sds);
809		}
810		if (!OneG_Mode) {
811			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE1, 0x11110000);
812			sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1);
813			sds &= 0xFFFFFFBF;
814			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, sds);
815		}
816	} else {
817		/* init serdes 0 */
818		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, 0x00000008);
819		i = 0;
820		while (((u32temp = (nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS0)
821				& 0x0000000f)) != 0x0000000f) && i++ < 5000)
822			mdelay(1);
823		if (i > 5000) {
824			nes_debug(NES_DBG_PHY, "Init: serdes 0 not ready, status=%x\n", u32temp);
825			return 1;
826		}
827		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x000bdef7);
828		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_DRIVE0, 0x9ce73000);
829		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_MODE0, 0x0ff00000);
830		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_SIGDET0, 0x00000000);
831		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_BYPASS0, 0x00000000);
832		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_LOOPBACK_CONTROL0, 0x00000000);
833		if (OneG_Mode)
834			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_EQ_CONTROL0, 0xf0182222);
835		else
836			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_EQ_CONTROL0, 0xf0042222);
837
838		nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000ff);
839		if (port_count > 1) {
840			/* init serdes 1 */
841			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x00000048);
842			i = 0;
843			while (((u32temp = (nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS1)
844				& 0x0000000f)) != 0x0000000f) && (i++ < 5000))
845				mdelay(1);
846			if (i > 5000) {
847				printk("%s: Init: serdes 1 not ready, status=%x\n", __func__, u32temp);
848				/* return 1; */
849			}
850			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x000bdef7);
851			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_DRIVE1, 0x9ce73000);
852			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_MODE1, 0x0ff00000);
853			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_SIGDET1, 0x00000000);
854			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_BYPASS1, 0x00000000);
855			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_LOOPBACK_CONTROL1, 0x00000000);
856			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_RX_EQ_CONTROL1, 0xf0002222);
857			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000000ff);
858		}
859	}
860	return 0;
861}
862
863
864/**
865 * nes_init_csr_ne020
866 * Initialize registers for ne020 hardware
867 */
868static void nes_init_csr_ne020(struct nes_device *nesdev, u8 hw_rev, u8 port_count)
869{
870	u32 u32temp;
871
872	nes_debug(NES_DBG_INIT, "port_count=%d\n", port_count);
873
874	nes_write_indexed(nesdev, 0x000001E4, 0x00000007);
875	/* nes_write_indexed(nesdev, 0x000001E8, 0x000208C4); */
876	nes_write_indexed(nesdev, 0x000001E8, 0x00020874);
877	nes_write_indexed(nesdev, 0x000001D8, 0x00048002);
878	/* nes_write_indexed(nesdev, 0x000001D8, 0x0004B002); */
879	nes_write_indexed(nesdev, 0x000001FC, 0x00050005);
880	nes_write_indexed(nesdev, 0x00000600, 0x55555555);
881	nes_write_indexed(nesdev, 0x00000604, 0x55555555);
882
883	/* TODO: move these MAC register settings to NIC bringup */
884	nes_write_indexed(nesdev, 0x00002000, 0x00000001);
885	nes_write_indexed(nesdev, 0x00002004, 0x00000001);
886	nes_write_indexed(nesdev, 0x00002008, 0x0000FFFF);
887	nes_write_indexed(nesdev, 0x0000200C, 0x00000001);
888	nes_write_indexed(nesdev, 0x00002010, 0x000003c1);
889	nes_write_indexed(nesdev, 0x0000201C, 0x75345678);
890	if (port_count > 1) {
891		nes_write_indexed(nesdev, 0x00002200, 0x00000001);
892		nes_write_indexed(nesdev, 0x00002204, 0x00000001);
893		nes_write_indexed(nesdev, 0x00002208, 0x0000FFFF);
894		nes_write_indexed(nesdev, 0x0000220C, 0x00000001);
895		nes_write_indexed(nesdev, 0x00002210, 0x000003c1);
896		nes_write_indexed(nesdev, 0x0000221C, 0x75345678);
897		nes_write_indexed(nesdev, 0x00000908, 0x20000001);
898	}
899	if (port_count > 2) {
900		nes_write_indexed(nesdev, 0x00002400, 0x00000001);
901		nes_write_indexed(nesdev, 0x00002404, 0x00000001);
902		nes_write_indexed(nesdev, 0x00002408, 0x0000FFFF);
903		nes_write_indexed(nesdev, 0x0000240C, 0x00000001);
904		nes_write_indexed(nesdev, 0x00002410, 0x000003c1);
905		nes_write_indexed(nesdev, 0x0000241C, 0x75345678);
906		nes_write_indexed(nesdev, 0x00000910, 0x20000001);
907
908		nes_write_indexed(nesdev, 0x00002600, 0x00000001);
909		nes_write_indexed(nesdev, 0x00002604, 0x00000001);
910		nes_write_indexed(nesdev, 0x00002608, 0x0000FFFF);
911		nes_write_indexed(nesdev, 0x0000260C, 0x00000001);
912		nes_write_indexed(nesdev, 0x00002610, 0x000003c1);
913		nes_write_indexed(nesdev, 0x0000261C, 0x75345678);
914		nes_write_indexed(nesdev, 0x00000918, 0x20000001);
915	}
916
917	nes_write_indexed(nesdev, 0x00005000, 0x00018000);
918	/* nes_write_indexed(nesdev, 0x00005000, 0x00010000); */
919	nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG1, (wqm_quanta << 1) |
920							 0x00000001);
921	nes_write_indexed(nesdev, 0x00005008, 0x1F1F1F1F);
922	nes_write_indexed(nesdev, 0x00005010, 0x1F1F1F1F);
923	nes_write_indexed(nesdev, 0x00005018, 0x1F1F1F1F);
924	nes_write_indexed(nesdev, 0x00005020, 0x1F1F1F1F);
925	nes_write_indexed(nesdev, 0x00006090, 0xFFFFFFFF);
926
927	/* TODO: move this to code, get from EEPROM */
928	nes_write_indexed(nesdev, 0x00000900, 0x20000001);
929	nes_write_indexed(nesdev, 0x000060C0, 0x0000028e);
930	nes_write_indexed(nesdev, 0x000060C8, 0x00000020);
931
932	nes_write_indexed(nesdev, 0x000001EC, 0x7b2625a0);
933	/* nes_write_indexed(nesdev, 0x000001EC, 0x5f2625a0); */
934
935	if (hw_rev != NE020_REV) {
936		u32temp = nes_read_indexed(nesdev, 0x000008e8);
937		u32temp |= 0x80000000;
938		nes_write_indexed(nesdev, 0x000008e8, u32temp);
939		u32temp = nes_read_indexed(nesdev, 0x000021f8);
940		u32temp &= 0x7fffffff;
941		u32temp |= 0x7fff0010;
942		nes_write_indexed(nesdev, 0x000021f8, u32temp);
943		if (port_count > 1) {
944			u32temp = nes_read_indexed(nesdev, 0x000023f8);
945			u32temp &= 0x7fffffff;
946			u32temp |= 0x7fff0010;
947			nes_write_indexed(nesdev, 0x000023f8, u32temp);
948		}
949	}
950}
951
952
953/**
954 * nes_destroy_adapter - destroy the adapter structure
955 */
956void nes_destroy_adapter(struct nes_adapter *nesadapter)
957{
958	struct nes_adapter *tmp_adapter;
959
960	list_for_each_entry(tmp_adapter, &nes_adapter_list, list) {
961		nes_debug(NES_DBG_SHUTDOWN, "Nes Adapter list entry = 0x%p.\n",
962				tmp_adapter);
963	}
964
965	nesadapter->ref_count--;
966	if (!nesadapter->ref_count) {
967		if (nesadapter->hw_rev == NE020_REV) {
968			del_timer(&nesadapter->mh_timer);
969		}
970		del_timer(&nesadapter->lc_timer);
971
972		list_del(&nesadapter->list);
973		kfree(nesadapter);
974	}
975}
976
977
978/**
979 * nes_init_cqp
980 */
981int nes_init_cqp(struct nes_device *nesdev)
982{
983	struct nes_adapter *nesadapter = nesdev->nesadapter;
984	struct nes_hw_cqp_qp_context *cqp_qp_context;
985	struct nes_hw_cqp_wqe *cqp_wqe;
986	struct nes_hw_ceq *ceq;
987	struct nes_hw_ceq *nic_ceq;
988	struct nes_hw_aeq *aeq;
989	void *vmem;
990	dma_addr_t pmem;
991	u32 count=0;
992	u32 cqp_head;
993	u64 u64temp;
994	u32 u32temp;
995
996	/* allocate CQP memory */
997	/* Need to add max_cq to the aeq size once cq overflow checking is added back */
998	/* SQ is 512 byte aligned, others are 256 byte aligned */
999	nesdev->cqp_mem_size = 512 +
1000			(sizeof(struct nes_hw_cqp_wqe) * NES_CQP_SQ_SIZE) +
1001			(sizeof(struct nes_hw_cqe) * NES_CCQ_SIZE) +
1002			max(((u32)sizeof(struct nes_hw_ceqe) * NES_CCEQ_SIZE), (u32)256) +
1003			max(((u32)sizeof(struct nes_hw_ceqe) * NES_NIC_CEQ_SIZE), (u32)256) +
1004			(sizeof(struct nes_hw_aeqe) * nesadapter->max_qp) +
1005			sizeof(struct nes_hw_cqp_qp_context);
1006
1007	nesdev->cqp_vbase = pci_alloc_consistent(nesdev->pcidev, nesdev->cqp_mem_size,
1008			&nesdev->cqp_pbase);
1009	if (!nesdev->cqp_vbase) {
1010		nes_debug(NES_DBG_INIT, "Unable to allocate memory for host descriptor rings\n");
1011		return -ENOMEM;
1012	}
1013	memset(nesdev->cqp_vbase, 0, nesdev->cqp_mem_size);
1014
1015	/* Allocate a twice the number of CQP requests as the SQ size */
1016	nesdev->nes_cqp_requests = kzalloc(sizeof(struct nes_cqp_request) *
1017			2 * NES_CQP_SQ_SIZE, GFP_KERNEL);
1018	if (nesdev->nes_cqp_requests == NULL) {
1019		nes_debug(NES_DBG_INIT, "Unable to allocate memory CQP request entries.\n");
1020		pci_free_consistent(nesdev->pcidev, nesdev->cqp_mem_size, nesdev->cqp.sq_vbase,
1021				nesdev->cqp.sq_pbase);
1022		return -ENOMEM;
1023	}
1024
1025	nes_debug(NES_DBG_INIT, "Allocated CQP structures at %p (phys = %016lX), size = %u.\n",
1026			nesdev->cqp_vbase, (unsigned long)nesdev->cqp_pbase, nesdev->cqp_mem_size);
1027
1028	spin_lock_init(&nesdev->cqp.lock);
1029	init_waitqueue_head(&nesdev->cqp.waitq);
1030
1031	/* Setup Various Structures */
1032	vmem = (void *)(((unsigned long)nesdev->cqp_vbase + (512 - 1)) &
1033			~(unsigned long)(512 - 1));
1034	pmem = (dma_addr_t)(((unsigned long long)nesdev->cqp_pbase + (512 - 1)) &
1035			~(unsigned long long)(512 - 1));
1036
1037	nesdev->cqp.sq_vbase = vmem;
1038	nesdev->cqp.sq_pbase = pmem;
1039	nesdev->cqp.sq_size = NES_CQP_SQ_SIZE;
1040	nesdev->cqp.sq_head = 0;
1041	nesdev->cqp.sq_tail = 0;
1042	nesdev->cqp.qp_id = PCI_FUNC(nesdev->pcidev->devfn);
1043
1044	vmem += (sizeof(struct nes_hw_cqp_wqe) * nesdev->cqp.sq_size);
1045	pmem += (sizeof(struct nes_hw_cqp_wqe) * nesdev->cqp.sq_size);
1046
1047	nesdev->ccq.cq_vbase = vmem;
1048	nesdev->ccq.cq_pbase = pmem;
1049	nesdev->ccq.cq_size = NES_CCQ_SIZE;
1050	nesdev->ccq.cq_head = 0;
1051	nesdev->ccq.ce_handler = nes_cqp_ce_handler;
1052	nesdev->ccq.cq_number = PCI_FUNC(nesdev->pcidev->devfn);
1053
1054	vmem += (sizeof(struct nes_hw_cqe) * nesdev->ccq.cq_size);
1055	pmem += (sizeof(struct nes_hw_cqe) * nesdev->ccq.cq_size);
1056
1057	nesdev->ceq_index = PCI_FUNC(nesdev->pcidev->devfn);
1058	ceq = &nesadapter->ceq[nesdev->ceq_index];
1059	ceq->ceq_vbase = vmem;
1060	ceq->ceq_pbase = pmem;
1061	ceq->ceq_size = NES_CCEQ_SIZE;
1062	ceq->ceq_head = 0;
1063
1064	vmem += max(((u32)sizeof(struct nes_hw_ceqe) * ceq->ceq_size), (u32)256);
1065	pmem += max(((u32)sizeof(struct nes_hw_ceqe) * ceq->ceq_size), (u32)256);
1066
1067	nesdev->nic_ceq_index = PCI_FUNC(nesdev->pcidev->devfn) + 8;
1068	nic_ceq = &nesadapter->ceq[nesdev->nic_ceq_index];
1069	nic_ceq->ceq_vbase = vmem;
1070	nic_ceq->ceq_pbase = pmem;
1071	nic_ceq->ceq_size = NES_NIC_CEQ_SIZE;
1072	nic_ceq->ceq_head = 0;
1073
1074	vmem += max(((u32)sizeof(struct nes_hw_ceqe) * nic_ceq->ceq_size), (u32)256);
1075	pmem += max(((u32)sizeof(struct nes_hw_ceqe) * nic_ceq->ceq_size), (u32)256);
1076
1077	aeq = &nesadapter->aeq[PCI_FUNC(nesdev->pcidev->devfn)];
1078	aeq->aeq_vbase = vmem;
1079	aeq->aeq_pbase = pmem;
1080	aeq->aeq_size = nesadapter->max_qp;
1081	aeq->aeq_head = 0;
1082
1083	/* Setup QP Context */
1084	vmem += (sizeof(struct nes_hw_aeqe) * aeq->aeq_size);
1085	pmem += (sizeof(struct nes_hw_aeqe) * aeq->aeq_size);
1086
1087	cqp_qp_context = vmem;
1088	cqp_qp_context->context_words[0] =
1089			cpu_to_le32((PCI_FUNC(nesdev->pcidev->devfn) << 12) + (2 << 10));
1090	cqp_qp_context->context_words[1] = 0;
1091	cqp_qp_context->context_words[2] = cpu_to_le32((u32)nesdev->cqp.sq_pbase);
1092	cqp_qp_context->context_words[3] = cpu_to_le32(((u64)nesdev->cqp.sq_pbase) >> 32);
1093
1094
1095	/* Write the address to Create CQP */
1096	if ((sizeof(dma_addr_t) > 4)) {
1097		nes_write_indexed(nesdev,
1098				NES_IDX_CREATE_CQP_HIGH + (PCI_FUNC(nesdev->pcidev->devfn) * 8),
1099				((u64)pmem) >> 32);
1100	} else {
1101		nes_write_indexed(nesdev,
1102				NES_IDX_CREATE_CQP_HIGH + (PCI_FUNC(nesdev->pcidev->devfn) * 8), 0);
1103	}
1104	nes_write_indexed(nesdev,
1105			NES_IDX_CREATE_CQP_LOW + (PCI_FUNC(nesdev->pcidev->devfn) * 8),
1106			(u32)pmem);
1107
1108	INIT_LIST_HEAD(&nesdev->cqp_avail_reqs);
1109	INIT_LIST_HEAD(&nesdev->cqp_pending_reqs);
1110
1111	for (count = 0; count < 2*NES_CQP_SQ_SIZE; count++) {
1112		init_waitqueue_head(&nesdev->nes_cqp_requests[count].waitq);
1113		list_add_tail(&nesdev->nes_cqp_requests[count].list, &nesdev->cqp_avail_reqs);
1114	}
1115
1116	/* Write Create CCQ WQE */
1117	cqp_head = nesdev->cqp.sq_head++;
1118	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1119	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1120	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
1121			(NES_CQP_CREATE_CQ | NES_CQP_CQ_CEQ_VALID |
1122			NES_CQP_CQ_CHK_OVERFLOW | ((u32)nesdev->ccq.cq_size << 16)));
1123	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
1124			    (nesdev->ccq.cq_number |
1125			     ((u32)nesdev->ceq_index << 16)));
1126	u64temp = (u64)nesdev->ccq.cq_pbase;
1127	set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1128	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] = 0;
1129	u64temp = (unsigned long)&nesdev->ccq;
1130	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_LOW_IDX] =
1131			cpu_to_le32((u32)(u64temp >> 1));
1132	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] =
1133			cpu_to_le32(((u32)((u64temp) >> 33)) & 0x7FFFFFFF);
1134	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX] = 0;
1135
1136	/* Write Create CEQ WQE */
1137	cqp_head = nesdev->cqp.sq_head++;
1138	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1139	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1140	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
1141			    (NES_CQP_CREATE_CEQ + ((u32)nesdev->ceq_index << 8)));
1142	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_CEQ_WQE_ELEMENT_COUNT_IDX, ceq->ceq_size);
1143	u64temp = (u64)ceq->ceq_pbase;
1144	set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1145
1146	/* Write Create AEQ WQE */
1147	cqp_head = nesdev->cqp.sq_head++;
1148	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1149	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1150	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
1151			(NES_CQP_CREATE_AEQ + ((u32)PCI_FUNC(nesdev->pcidev->devfn) << 8)));
1152	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_AEQ_WQE_ELEMENT_COUNT_IDX, aeq->aeq_size);
1153	u64temp = (u64)aeq->aeq_pbase;
1154	set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1155
1156	/* Write Create NIC CEQ WQE */
1157	cqp_head = nesdev->cqp.sq_head++;
1158	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1159	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1160	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
1161			(NES_CQP_CREATE_CEQ + ((u32)nesdev->nic_ceq_index << 8)));
1162	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_CEQ_WQE_ELEMENT_COUNT_IDX, nic_ceq->ceq_size);
1163	u64temp = (u64)nic_ceq->ceq_pbase;
1164	set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1165
1166	/* Poll until CCQP done */
1167	count = 0;
1168	do {
1169		if (count++ > 1000) {
1170			printk(KERN_ERR PFX "Error creating CQP\n");
1171			pci_free_consistent(nesdev->pcidev, nesdev->cqp_mem_size,
1172					nesdev->cqp_vbase, nesdev->cqp_pbase);
1173			return -1;
1174		}
1175		udelay(10);
1176	} while (!(nes_read_indexed(nesdev,
1177			NES_IDX_QP_CONTROL + (PCI_FUNC(nesdev->pcidev->devfn) * 8)) & (1 << 8)));
1178
1179	nes_debug(NES_DBG_INIT, "CQP Status = 0x%08X\n", nes_read_indexed(nesdev,
1180			NES_IDX_QP_CONTROL+(PCI_FUNC(nesdev->pcidev->devfn)*8)));
1181
1182	u32temp = 0x04800000;
1183	nes_write32(nesdev->regs+NES_WQE_ALLOC, u32temp | nesdev->cqp.qp_id);
1184
1185	/* wait for the CCQ, CEQ, and AEQ to get created */
1186	count = 0;
1187	do {
1188		if (count++ > 1000) {
1189			printk(KERN_ERR PFX "Error creating CCQ, CEQ, and AEQ\n");
1190			pci_free_consistent(nesdev->pcidev, nesdev->cqp_mem_size,
1191					nesdev->cqp_vbase, nesdev->cqp_pbase);
1192			return -1;
1193		}
1194		udelay(10);
1195	} while (((nes_read_indexed(nesdev,
1196			NES_IDX_QP_CONTROL+(PCI_FUNC(nesdev->pcidev->devfn)*8)) & (15<<8)) != (15<<8)));
1197
1198	/* dump the QP status value */
1199	nes_debug(NES_DBG_INIT, "QP Status = 0x%08X\n", nes_read_indexed(nesdev,
1200			NES_IDX_QP_CONTROL+(PCI_FUNC(nesdev->pcidev->devfn)*8)));
1201
1202	nesdev->cqp.sq_tail++;
1203
1204	return 0;
1205}
1206
1207
1208/**
1209 * nes_destroy_cqp
1210 */
1211int nes_destroy_cqp(struct nes_device *nesdev)
1212{
1213	struct nes_hw_cqp_wqe *cqp_wqe;
1214	u32 count = 0;
1215	u32 cqp_head;
1216	unsigned long flags;
1217
1218	do {
1219		if (count++ > 1000)
1220			break;
1221		udelay(10);
1222	} while (!(nesdev->cqp.sq_head == nesdev->cqp.sq_tail));
1223
1224	/* Reset CCQ */
1225	nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_RESET |
1226			nesdev->ccq.cq_number);
1227
1228	/* Disable device interrupts */
1229	nes_write32(nesdev->regs+NES_INT_MASK, 0x7fffffff);
1230
1231	spin_lock_irqsave(&nesdev->cqp.lock, flags);
1232
1233	/* Destroy the AEQ */
1234	cqp_head = nesdev->cqp.sq_head++;
1235	nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;
1236	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1237	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_DESTROY_AEQ |
1238			((u32)PCI_FUNC(nesdev->pcidev->devfn) << 8));
1239	cqp_wqe->wqe_words[NES_CQP_WQE_COMP_CTX_HIGH_IDX] = 0;
1240
1241	/* Destroy the NIC CEQ */
1242	cqp_head = nesdev->cqp.sq_head++;
1243	nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;
1244	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1245	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_DESTROY_CEQ |
1246			((u32)nesdev->nic_ceq_index << 8));
1247
1248	/* Destroy the CEQ */
1249	cqp_head = nesdev->cqp.sq_head++;
1250	nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;
1251	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1252	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_DESTROY_CEQ |
1253			(nesdev->ceq_index << 8));
1254
1255	/* Destroy the CCQ */
1256	cqp_head = nesdev->cqp.sq_head++;
1257	nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;
1258	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1259	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_DESTROY_CQ);
1260	cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(nesdev->ccq.cq_number |
1261			((u32)nesdev->ceq_index << 16));
1262
1263	/* Destroy CQP */
1264	cqp_head = nesdev->cqp.sq_head++;
1265	nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;
1266	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1267	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_DESTROY_QP |
1268			NES_CQP_QP_TYPE_CQP);
1269	cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(nesdev->cqp.qp_id);
1270
1271	barrier();
1272	/* Ring doorbell (5 WQEs) */
1273	nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x05800000 | nesdev->cqp.qp_id);
1274
1275	spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1276
1277	/* wait for the CCQ, CEQ, and AEQ to get destroyed */
1278	count = 0;
1279	do {
1280		if (count++ > 1000) {
1281			printk(KERN_ERR PFX "Function%d: Error destroying CCQ, CEQ, and AEQ\n",
1282					PCI_FUNC(nesdev->pcidev->devfn));
1283			break;
1284		}
1285		udelay(10);
1286	} while (((nes_read_indexed(nesdev,
1287			NES_IDX_QP_CONTROL + (PCI_FUNC(nesdev->pcidev->devfn)*8)) & (15 << 8)) != 0));
1288
1289	/* dump the QP status value */
1290	nes_debug(NES_DBG_SHUTDOWN, "Function%d: QP Status = 0x%08X\n",
1291			PCI_FUNC(nesdev->pcidev->devfn),
1292			nes_read_indexed(nesdev,
1293			NES_IDX_QP_CONTROL+(PCI_FUNC(nesdev->pcidev->devfn)*8)));
1294
1295	kfree(nesdev->nes_cqp_requests);
1296
1297	/* Free the control structures */
1298	pci_free_consistent(nesdev->pcidev, nesdev->cqp_mem_size, nesdev->cqp.sq_vbase,
1299			nesdev->cqp.sq_pbase);
1300
1301	return 0;
1302}
1303
1304
1305/**
1306 * nes_init_1g_phy
1307 */
1308static int nes_init_1g_phy(struct nes_device *nesdev, u8 phy_type, u8 phy_index)
1309{
1310	u32 counter = 0;
1311	u16 phy_data;
1312	int ret = 0;
1313
1314	nes_read_1G_phy_reg(nesdev, 1, phy_index, &phy_data);
1315	nes_write_1G_phy_reg(nesdev, 23, phy_index, 0xb000);
1316
1317	/* Reset the PHY */
1318	nes_write_1G_phy_reg(nesdev, 0, phy_index, 0x8000);
1319	udelay(100);
1320	counter = 0;
1321	do {
1322		nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1323		if (counter++ > 100) {
1324			ret = -1;
1325			break;
1326		}
1327	} while (phy_data & 0x8000);
1328
1329	/* Setting no phy loopback */
1330	phy_data &= 0xbfff;
1331	phy_data |= 0x1140;
1332	nes_write_1G_phy_reg(nesdev, 0, phy_index,  phy_data);
1333	nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1334	nes_read_1G_phy_reg(nesdev, 0x17, phy_index, &phy_data);
1335	nes_read_1G_phy_reg(nesdev, 0x1e, phy_index, &phy_data);
1336
1337	/* Setting the interrupt mask */
1338	nes_read_1G_phy_reg(nesdev, 0x19, phy_index, &phy_data);
1339	nes_write_1G_phy_reg(nesdev, 0x19, phy_index, 0xffee);
1340	nes_read_1G_phy_reg(nesdev, 0x19, phy_index, &phy_data);
1341
1342	/* turning on flow control */
1343	nes_read_1G_phy_reg(nesdev, 4, phy_index, &phy_data);
1344	nes_write_1G_phy_reg(nesdev, 4, phy_index, (phy_data & ~(0x03E0)) | 0xc00);
1345	nes_read_1G_phy_reg(nesdev, 4, phy_index, &phy_data);
1346
1347	/* Clear Half duplex */
1348	nes_read_1G_phy_reg(nesdev, 9, phy_index, &phy_data);
1349	nes_write_1G_phy_reg(nesdev, 9, phy_index, phy_data & ~(0x0100));
1350	nes_read_1G_phy_reg(nesdev, 9, phy_index, &phy_data);
1351
1352	nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1353	nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data | 0x0300);
1354
1355	return ret;
1356}
1357
1358
1359/**
1360 * nes_init_2025_phy
1361 */
1362static int nes_init_2025_phy(struct nes_device *nesdev, u8 phy_type, u8 phy_index)
1363{
1364	u32 temp_phy_data = 0;
1365	u32 temp_phy_data2 = 0;
1366	u32 counter = 0;
1367	u32 sds;
1368	u32 mac_index = nesdev->mac_index;
1369	int ret = 0;
1370	unsigned int first_attempt = 1;
1371
1372	/* Check firmware heartbeat */
1373	nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
1374	temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1375	udelay(1500);
1376	nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
1377	temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1378
1379	if (temp_phy_data != temp_phy_data2) {
1380		nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7fd);
1381		temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1382		if ((temp_phy_data & 0xff) > 0x20)
1383			return 0;
1384		printk(PFX "Reinitialize external PHY\n");
1385	}
1386
1387	/* no heartbeat, configure the PHY */
1388	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0x0000, 0x8000);
1389	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0000);
1390	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A);
1391	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052);
1392
1393	switch (phy_type) {
1394	case NES_PHY_TYPE_ARGUS:
1395		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A);
1396		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052);
1397		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C);
1398		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0008);
1399		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0001);
1400		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0098);
1401		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00);
1402
1403		/* setup LEDs */
1404		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd006, 0x0007);
1405		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd007, 0x000A);
1406		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd008, 0x0009);
1407		break;
1408
1409	case NES_PHY_TYPE_SFP_D:
1410		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A);
1411		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052);
1412		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x0004);
1413		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0038);
1414		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0013);
1415		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0098);
1416		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00);
1417
1418		/* setup LEDs */
1419		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd006, 0x0007);
1420		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd007, 0x000A);
1421		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd008, 0x0009);
1422		break;
1423
1424	case NES_PHY_TYPE_KR:
1425		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A);
1426		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052);
1427		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C);
1428		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0010);
1429		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0013);
1430		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0080);
1431		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00);
1432
1433		/* setup LEDs */
1434		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd006, 0x000B);
1435		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd007, 0x0003);
1436		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd008, 0x0004);
1437
1438		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0022, 0x406D);
1439		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0023, 0x0020);
1440		break;
1441	}
1442
1443	nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0028, 0xA528);
1444
1445	/* Bring PHY out of reset */
1446	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0002);
1447
1448	/* Check for heartbeat */
1449	counter = 0;
1450	mdelay(690);
1451	nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
1452	temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1453	do {
1454		if (counter++ > 150) {
1455			printk(PFX "No PHY heartbeat\n");
1456			break;
1457		}
1458		mdelay(1);
1459		nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
1460		temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1461	} while ((temp_phy_data2 == temp_phy_data));
1462
1463	/* wait for tracking */
1464	counter = 0;
1465	do {
1466		nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7fd);
1467		temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1468		if (counter++ > 300) {
1469			if (((temp_phy_data & 0xff) == 0x0) && first_attempt) {
1470				first_attempt = 0;
1471				counter = 0;
1472				/* reset AMCC PHY and try again */
1473				nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0xe854, 0x00c0);
1474				nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0xe854, 0x0040);
1475				continue;
1476			} else {
1477				ret = 1;
1478				break;
1479			}
1480		}
1481		mdelay(10);
1482	} while ((temp_phy_data & 0xff) < 0x30);
1483
1484	/* setup signal integrity */
1485	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd003, 0x0000);
1486	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00D, 0x00FE);
1487	nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00E, 0x0032);
1488	if (phy_type == NES_PHY_TYPE_KR) {
1489		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00F, 0x000C);
1490	} else {
1491		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00F, 0x0002);
1492		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc314, 0x0063);
1493	}
1494
1495	/* reset serdes */
1496	sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0 + mac_index * 0x200);
1497	sds |= 0x1;
1498	nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0 + mac_index * 0x200, sds);
1499	sds &= 0xfffffffe;
1500	nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0 + mac_index * 0x200, sds);
1501
1502	counter = 0;
1503	while (((nes_read32(nesdev->regs + NES_SOFTWARE_RESET) & 0x00000040) != 0x00000040)
1504			&& (counter++ < 5000))
1505		;
1506
1507	return ret;
1508}
1509
1510
1511/**
1512 * nes_init_phy
1513 */
1514int nes_init_phy(struct nes_device *nesdev)
1515{
1516	struct nes_adapter *nesadapter = nesdev->nesadapter;
1517	u32 mac_index = nesdev->mac_index;
1518	u32 tx_config = 0;
1519	unsigned long flags;
1520	u8  phy_type = nesadapter->phy_type[mac_index];
1521	u8  phy_index = nesadapter->phy_index[mac_index];
1522	int ret = 0;
1523
1524	tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG);
1525	if (phy_type == NES_PHY_TYPE_1G) {
1526		/* setup 1G MDIO operation */
1527		tx_config &= 0xFFFFFFE3;
1528		tx_config |= 0x04;
1529	} else {
1530		/* setup 10G MDIO operation */
1531		tx_config &= 0xFFFFFFE3;
1532		tx_config |= 0x1D;
1533	}
1534	nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config);
1535
1536	spin_lock_irqsave(&nesdev->nesadapter->phy_lock, flags);
1537
1538	switch (phy_type) {
1539	case NES_PHY_TYPE_1G:
1540		ret = nes_init_1g_phy(nesdev, phy_type, phy_index);
1541		break;
1542	case NES_PHY_TYPE_ARGUS:
1543	case NES_PHY_TYPE_SFP_D:
1544	case NES_PHY_TYPE_KR:
1545		ret = nes_init_2025_phy(nesdev, phy_type, phy_index);
1546		break;
1547	}
1548
1549	spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
1550
1551	return ret;
1552}
1553
1554
1555/**
1556 * nes_replenish_nic_rq
1557 */
1558static void nes_replenish_nic_rq(struct nes_vnic *nesvnic)
1559{
1560	unsigned long flags;
1561	dma_addr_t bus_address;
1562	struct sk_buff *skb;
1563	struct nes_hw_nic_rq_wqe *nic_rqe;
1564	struct nes_hw_nic *nesnic;
1565	struct nes_device *nesdev;
1566	struct nes_rskb_cb *cb;
1567	u32 rx_wqes_posted = 0;
1568
1569	nesnic = &nesvnic->nic;
1570	nesdev = nesvnic->nesdev;
1571	spin_lock_irqsave(&nesnic->rq_lock, flags);
1572	if (nesnic->replenishing_rq !=0) {
1573		if (((nesnic->rq_size-1) == atomic_read(&nesvnic->rx_skbs_needed)) &&
1574				(atomic_read(&nesvnic->rx_skb_timer_running) == 0)) {
1575			atomic_set(&nesvnic->rx_skb_timer_running, 1);
1576			spin_unlock_irqrestore(&nesnic->rq_lock, flags);
1577			nesvnic->rq_wqes_timer.expires = jiffies + (HZ/2);	/* 1/2 second */
1578			add_timer(&nesvnic->rq_wqes_timer);
1579		} else
1580		spin_unlock_irqrestore(&nesnic->rq_lock, flags);
1581		return;
1582	}
1583	nesnic->replenishing_rq = 1;
1584	spin_unlock_irqrestore(&nesnic->rq_lock, flags);
1585	do {
1586		skb = dev_alloc_skb(nesvnic->max_frame_size);
1587		if (skb) {
1588			skb->dev = nesvnic->netdev;
1589
1590			bus_address = pci_map_single(nesdev->pcidev,
1591					skb->data, nesvnic->max_frame_size, PCI_DMA_FROMDEVICE);
1592			cb = (struct nes_rskb_cb *)&skb->cb[0];
1593			cb->busaddr = bus_address;
1594			cb->maplen = nesvnic->max_frame_size;
1595
1596			nic_rqe = &nesnic->rq_vbase[nesvnic->nic.rq_head];
1597			nic_rqe->wqe_words[NES_NIC_RQ_WQE_LENGTH_1_0_IDX] =
1598					cpu_to_le32(nesvnic->max_frame_size);
1599			nic_rqe->wqe_words[NES_NIC_RQ_WQE_LENGTH_3_2_IDX] = 0;
1600			nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX] =
1601					cpu_to_le32((u32)bus_address);
1602			nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_HIGH_IDX] =
1603					cpu_to_le32((u32)((u64)bus_address >> 32));
1604			nesnic->rx_skb[nesnic->rq_head] = skb;
1605			nesnic->rq_head++;
1606			nesnic->rq_head &= nesnic->rq_size - 1;
1607			atomic_dec(&nesvnic->rx_skbs_needed);
1608			barrier();
1609			if (++rx_wqes_posted == 255) {
1610				nes_write32(nesdev->regs+NES_WQE_ALLOC, (rx_wqes_posted << 24) | nesnic->qp_id);
1611				rx_wqes_posted = 0;
1612			}
1613		} else {
1614			spin_lock_irqsave(&nesnic->rq_lock, flags);
1615			if (((nesnic->rq_size-1) == atomic_read(&nesvnic->rx_skbs_needed)) &&
1616					(atomic_read(&nesvnic->rx_skb_timer_running) == 0)) {
1617				atomic_set(&nesvnic->rx_skb_timer_running, 1);
1618				spin_unlock_irqrestore(&nesnic->rq_lock, flags);
1619				nesvnic->rq_wqes_timer.expires = jiffies + (HZ/2);	/* 1/2 second */
1620				add_timer(&nesvnic->rq_wqes_timer);
1621			} else
1622				spin_unlock_irqrestore(&nesnic->rq_lock, flags);
1623			break;
1624		}
1625	} while (atomic_read(&nesvnic->rx_skbs_needed));
1626	barrier();
1627	if (rx_wqes_posted)
1628		nes_write32(nesdev->regs+NES_WQE_ALLOC, (rx_wqes_posted << 24) | nesnic->qp_id);
1629	nesnic->replenishing_rq = 0;
1630}
1631
1632
1633/**
1634 * nes_rq_wqes_timeout
1635 */
1636static void nes_rq_wqes_timeout(unsigned long parm)
1637{
1638	struct nes_vnic *nesvnic = (struct nes_vnic *)parm;
1639	printk("%s: Timer fired.\n", __func__);
1640	atomic_set(&nesvnic->rx_skb_timer_running, 0);
1641	if (atomic_read(&nesvnic->rx_skbs_needed))
1642		nes_replenish_nic_rq(nesvnic);
1643}
1644
1645
1646static int nes_lro_get_skb_hdr(struct sk_buff *skb, void **iphdr,
1647			       void **tcph, u64 *hdr_flags, void *priv)
1648{
1649	unsigned int ip_len;
1650	struct iphdr *iph;
1651	skb_reset_network_header(skb);
1652	iph = ip_hdr(skb);
1653	if (iph->protocol != IPPROTO_TCP)
1654		return -1;
1655	ip_len = ip_hdrlen(skb);
1656	skb_set_transport_header(skb, ip_len);
1657	*tcph = tcp_hdr(skb);
1658
1659	*hdr_flags = LRO_IPV4 | LRO_TCP;
1660	*iphdr = iph;
1661	return 0;
1662}
1663
1664
1665/**
1666 * nes_init_nic_qp
1667 */
1668int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
1669{
1670	struct nes_hw_cqp_wqe *cqp_wqe;
1671	struct nes_hw_nic_sq_wqe *nic_sqe;
1672	struct nes_hw_nic_qp_context *nic_context;
1673	struct sk_buff *skb;
1674	struct nes_hw_nic_rq_wqe *nic_rqe;
1675	struct nes_vnic *nesvnic = netdev_priv(netdev);
1676	unsigned long flags;
1677	void *vmem;
1678	dma_addr_t pmem;
1679	u64 u64temp;
1680	int ret;
1681	u32 cqp_head;
1682	u32 counter;
1683	u32 wqe_count;
1684	struct nes_rskb_cb *cb;
1685	u8 jumbomode=0;
1686
1687	/* Allocate fragment, SQ, RQ, and CQ; Reuse CEQ based on the PCI function */
1688	nesvnic->nic_mem_size = 256 +
1689			(NES_NIC_WQ_SIZE * sizeof(struct nes_first_frag)) +
1690			(NES_NIC_WQ_SIZE * sizeof(struct nes_hw_nic_sq_wqe)) +
1691			(NES_NIC_WQ_SIZE * sizeof(struct nes_hw_nic_rq_wqe)) +
1692			(NES_NIC_WQ_SIZE * 2 * sizeof(struct nes_hw_nic_cqe)) +
1693			sizeof(struct nes_hw_nic_qp_context);
1694
1695	nesvnic->nic_vbase = pci_alloc_consistent(nesdev->pcidev, nesvnic->nic_mem_size,
1696			&nesvnic->nic_pbase);
1697	if (!nesvnic->nic_vbase) {
1698		nes_debug(NES_DBG_INIT, "Unable to allocate memory for NIC host descriptor rings\n");
1699		return -ENOMEM;
1700	}
1701	memset(nesvnic->nic_vbase, 0, nesvnic->nic_mem_size);
1702	nes_debug(NES_DBG_INIT, "Allocated NIC QP structures at %p (phys = %016lX), size = %u.\n",
1703			nesvnic->nic_vbase, (unsigned long)nesvnic->nic_pbase, nesvnic->nic_mem_size);
1704
1705	vmem = (void *)(((unsigned long)nesvnic->nic_vbase + (256 - 1)) &
1706			~(unsigned long)(256 - 1));
1707	pmem = (dma_addr_t)(((unsigned long long)nesvnic->nic_pbase + (256 - 1)) &
1708			~(unsigned long long)(256 - 1));
1709
1710	/* Setup the first Fragment buffers */
1711	nesvnic->nic.first_frag_vbase = vmem;
1712
1713	for (counter = 0; counter < NES_NIC_WQ_SIZE; counter++) {
1714		nesvnic->nic.frag_paddr[counter] = pmem;
1715		pmem += sizeof(struct nes_first_frag);
1716	}
1717
1718	/* setup the SQ */
1719	vmem += (NES_NIC_WQ_SIZE * sizeof(struct nes_first_frag));
1720
1721	nesvnic->nic.sq_vbase = (void *)vmem;
1722	nesvnic->nic.sq_pbase = pmem;
1723	nesvnic->nic.sq_head = 0;
1724	nesvnic->nic.sq_tail = 0;
1725	nesvnic->nic.sq_size = NES_NIC_WQ_SIZE;
1726	for (counter = 0; counter < NES_NIC_WQ_SIZE; counter++) {
1727		nic_sqe = &nesvnic->nic.sq_vbase[counter];
1728		nic_sqe->wqe_words[NES_NIC_SQ_WQE_MISC_IDX] =
1729				cpu_to_le32(NES_NIC_SQ_WQE_DISABLE_CHKSUM |
1730				NES_NIC_SQ_WQE_COMPLETION);
1731		nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX] =
1732				cpu_to_le32((u32)NES_FIRST_FRAG_SIZE << 16);
1733		nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX] =
1734				cpu_to_le32((u32)nesvnic->nic.frag_paddr[counter]);
1735		nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX] =
1736				cpu_to_le32((u32)((u64)nesvnic->nic.frag_paddr[counter] >> 32));
1737	}
1738
1739	nesvnic->get_cqp_request = nes_get_cqp_request;
1740	nesvnic->post_cqp_request = nes_post_cqp_request;
1741	nesvnic->mcrq_mcast_filter = NULL;
1742
1743	spin_lock_init(&nesvnic->nic.rq_lock);
1744
1745	/* setup the RQ */
1746	vmem += (NES_NIC_WQ_SIZE * sizeof(struct nes_hw_nic_sq_wqe));
1747	pmem += (NES_NIC_WQ_SIZE * sizeof(struct nes_hw_nic_sq_wqe));
1748
1749
1750	nesvnic->nic.rq_vbase = vmem;
1751	nesvnic->nic.rq_pbase = pmem;
1752	nesvnic->nic.rq_head = 0;
1753	nesvnic->nic.rq_tail = 0;
1754	nesvnic->nic.rq_size = NES_NIC_WQ_SIZE;
1755
1756	/* setup the CQ */
1757	vmem += (NES_NIC_WQ_SIZE * sizeof(struct nes_hw_nic_rq_wqe));
1758	pmem += (NES_NIC_WQ_SIZE * sizeof(struct nes_hw_nic_rq_wqe));
1759
1760	if (nesdev->nesadapter->netdev_count > 2)
1761		nesvnic->mcrq_qp_id = nesvnic->nic_index + 32;
1762	else
1763		nesvnic->mcrq_qp_id = nesvnic->nic.qp_id + 4;
1764
1765	nesvnic->nic_cq.cq_vbase = vmem;
1766	nesvnic->nic_cq.cq_pbase = pmem;
1767	nesvnic->nic_cq.cq_head = 0;
1768	nesvnic->nic_cq.cq_size = NES_NIC_WQ_SIZE * 2;
1769
1770	nesvnic->nic_cq.ce_handler = nes_nic_napi_ce_handler;
1771
1772	/* Send CreateCQ request to CQP */
1773	spin_lock_irqsave(&nesdev->cqp.lock, flags);
1774	cqp_head = nesdev->cqp.sq_head;
1775
1776	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1777	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1778
1779	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(
1780			NES_CQP_CREATE_CQ | NES_CQP_CQ_CEQ_VALID |
1781			((u32)nesvnic->nic_cq.cq_size << 16));
1782	cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(
1783			nesvnic->nic_cq.cq_number | ((u32)nesdev->nic_ceq_index << 16));
1784	u64temp = (u64)nesvnic->nic_cq.cq_pbase;
1785	set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1786	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] =  0;
1787	u64temp = (unsigned long)&nesvnic->nic_cq;
1788	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_LOW_IDX] =  cpu_to_le32((u32)(u64temp >> 1));
1789	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] =
1790			cpu_to_le32(((u32)((u64temp) >> 33)) & 0x7FFFFFFF);
1791	cqp_wqe->wqe_words[NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX] = 0;
1792	if (++cqp_head >= nesdev->cqp.sq_size)
1793		cqp_head = 0;
1794	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
1795	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1796
1797	/* Send CreateQP request to CQP */
1798	nic_context = (void *)(&nesvnic->nic_cq.cq_vbase[nesvnic->nic_cq.cq_size]);
1799	nic_context->context_words[NES_NIC_CTX_MISC_IDX] =
1800			cpu_to_le32((u32)NES_NIC_CTX_SIZE |
1801			((u32)PCI_FUNC(nesdev->pcidev->devfn) << 12));
1802	nes_debug(NES_DBG_INIT, "RX_WINDOW_BUFFER_PAGE_TABLE_SIZE = 0x%08X, RX_WINDOW_BUFFER_SIZE = 0x%08X\n",
1803			nes_read_indexed(nesdev, NES_IDX_RX_WINDOW_BUFFER_PAGE_TABLE_SIZE),
1804			nes_read_indexed(nesdev, NES_IDX_RX_WINDOW_BUFFER_SIZE));
1805	if (nes_read_indexed(nesdev, NES_IDX_RX_WINDOW_BUFFER_SIZE) != 0) {
1806		nic_context->context_words[NES_NIC_CTX_MISC_IDX] |= cpu_to_le32(NES_NIC_BACK_STORE);
1807	}
1808
1809	u64temp = (u64)nesvnic->nic.sq_pbase;
1810	nic_context->context_words[NES_NIC_CTX_SQ_LOW_IDX]  = cpu_to_le32((u32)u64temp);
1811	nic_context->context_words[NES_NIC_CTX_SQ_HIGH_IDX] = cpu_to_le32((u32)(u64temp >> 32));
1812	u64temp = (u64)nesvnic->nic.rq_pbase;
1813	nic_context->context_words[NES_NIC_CTX_RQ_LOW_IDX]  = cpu_to_le32((u32)u64temp);
1814	nic_context->context_words[NES_NIC_CTX_RQ_HIGH_IDX] = cpu_to_le32((u32)(u64temp >> 32));
1815
1816	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_CREATE_QP |
1817			NES_CQP_QP_TYPE_NIC);
1818	cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(nesvnic->nic.qp_id);
1819	u64temp = (u64)nesvnic->nic_cq.cq_pbase +
1820			(nesvnic->nic_cq.cq_size * sizeof(struct nes_hw_nic_cqe));
1821	set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, u64temp);
1822
1823	if (++cqp_head >= nesdev->cqp.sq_size)
1824		cqp_head = 0;
1825	nesdev->cqp.sq_head = cqp_head;
1826
1827	barrier();
1828
1829	/* Ring doorbell (2 WQEs) */
1830	nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x02800000 | nesdev->cqp.qp_id);
1831
1832	spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1833	nes_debug(NES_DBG_INIT, "Waiting for create NIC QP%u to complete.\n",
1834			nesvnic->nic.qp_id);
1835
1836	ret = wait_event_timeout(nesdev->cqp.waitq, (nesdev->cqp.sq_tail == cqp_head),
1837			NES_EVENT_TIMEOUT);
1838	nes_debug(NES_DBG_INIT, "Create NIC QP%u completed, wait_event_timeout ret = %u.\n",
1839			nesvnic->nic.qp_id, ret);
1840	if (!ret) {
1841		nes_debug(NES_DBG_INIT, "NIC QP%u create timeout expired\n", nesvnic->nic.qp_id);
1842		pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase,
1843				nesvnic->nic_pbase);
1844		return -EIO;
1845	}
1846
1847	/* Populate the RQ */
1848	for (counter = 0; counter < (NES_NIC_WQ_SIZE - 1); counter++) {
1849		skb = dev_alloc_skb(nesvnic->max_frame_size);
1850		if (!skb) {
1851			nes_debug(NES_DBG_INIT, "%s: out of memory for receive skb\n", netdev->name);
1852
1853			nes_destroy_nic_qp(nesvnic);
1854			return -ENOMEM;
1855		}
1856
1857		skb->dev = netdev;
1858
1859		pmem = pci_map_single(nesdev->pcidev, skb->data,
1860				nesvnic->max_frame_size, PCI_DMA_FROMDEVICE);
1861		cb = (struct nes_rskb_cb *)&skb->cb[0];
1862		cb->busaddr = pmem;
1863		cb->maplen = nesvnic->max_frame_size;
1864
1865		nic_rqe = &nesvnic->nic.rq_vbase[counter];
1866		nic_rqe->wqe_words[NES_NIC_RQ_WQE_LENGTH_1_0_IDX] = cpu_to_le32(nesvnic->max_frame_size);
1867		nic_rqe->wqe_words[NES_NIC_RQ_WQE_LENGTH_3_2_IDX] = 0;
1868		nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX]  = cpu_to_le32((u32)pmem);
1869		nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_HIGH_IDX] = cpu_to_le32((u32)((u64)pmem >> 32));
1870		nesvnic->nic.rx_skb[counter] = skb;
1871	}
1872
1873	wqe_count = NES_NIC_WQ_SIZE - 1;
1874	nesvnic->nic.rq_head = wqe_count;
1875	barrier();
1876	do {
1877		counter = min(wqe_count, ((u32)255));
1878		wqe_count -= counter;
1879		nes_write32(nesdev->regs+NES_WQE_ALLOC, (counter << 24) | nesvnic->nic.qp_id);
1880	} while (wqe_count);
1881	init_timer(&nesvnic->rq_wqes_timer);
1882	nesvnic->rq_wqes_timer.function = nes_rq_wqes_timeout;
1883	nesvnic->rq_wqes_timer.data = (unsigned long)nesvnic;
1884	nes_debug(NES_DBG_INIT, "NAPI support Enabled\n");
1885	if (nesdev->nesadapter->et_use_adaptive_rx_coalesce)
1886	{
1887		nes_nic_init_timer(nesdev);
1888		if (netdev->mtu > 1500)
1889			jumbomode = 1;
1890		nes_nic_init_timer_defaults(nesdev, jumbomode);
1891	}
1892	if ((nesdev->nesadapter->allow_unaligned_fpdus) &&
1893		(nes_init_mgt_qp(nesdev, netdev, nesvnic))) {
1894			nes_debug(NES_DBG_INIT, "%s: Out of memory for pau nic\n", netdev->name);
1895			nes_destroy_nic_qp(nesvnic);
1896		return -ENOMEM;
1897	}
1898
1899	nesvnic->lro_mgr.max_aggr       = nes_lro_max_aggr;
1900	nesvnic->lro_mgr.max_desc       = NES_MAX_LRO_DESCRIPTORS;
1901	nesvnic->lro_mgr.lro_arr        = nesvnic->lro_desc;
1902	nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr;
1903	nesvnic->lro_mgr.features       = LRO_F_NAPI | LRO_F_EXTRACT_VLAN_ID;
1904	nesvnic->lro_mgr.dev            = netdev;
1905	nesvnic->lro_mgr.ip_summed      = CHECKSUM_UNNECESSARY;
1906	nesvnic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
1907	return 0;
1908}
1909
1910
1911/**
1912 * nes_destroy_nic_qp
1913 */
1914void nes_destroy_nic_qp(struct nes_vnic *nesvnic)
1915{
1916	u64 u64temp;
1917	dma_addr_t bus_address;
1918	struct nes_device *nesdev = nesvnic->nesdev;
1919	struct nes_hw_cqp_wqe *cqp_wqe;
1920	struct nes_hw_nic_sq_wqe *nic_sqe;
1921	__le16 *wqe_fragment_length;
1922	u16  wqe_fragment_index;
1923	u32 cqp_head;
1924	u32 wqm_cfg0;
1925	unsigned long flags;
1926	struct sk_buff *rx_skb;
1927	struct nes_rskb_cb *cb;
1928	int ret;
1929
1930	if (nesdev->nesadapter->allow_unaligned_fpdus)
1931		nes_destroy_mgt(nesvnic);
1932
1933	/* clear wqe stall before destroying NIC QP */
1934	wqm_cfg0 = nes_read_indexed(nesdev, NES_IDX_WQM_CONFIG0);
1935	nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0 & 0xFFFF7FFF);
1936
1937	/* Free remaining NIC receive buffers */
1938	while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) {
1939		rx_skb = nesvnic->nic.rx_skb[nesvnic->nic.rq_tail];
1940		cb = (struct nes_rskb_cb *)&rx_skb->cb[0];
1941		pci_unmap_single(nesdev->pcidev, cb->busaddr, cb->maplen,
1942			PCI_DMA_FROMDEVICE);
1943
1944		dev_kfree_skb(nesvnic->nic.rx_skb[nesvnic->nic.rq_tail++]);
1945		nesvnic->nic.rq_tail &= (nesvnic->nic.rq_size - 1);
1946	}
1947
1948	/* Free remaining NIC transmit buffers */
1949	while (nesvnic->nic.sq_head != nesvnic->nic.sq_tail) {
1950		nic_sqe = &nesvnic->nic.sq_vbase[nesvnic->nic.sq_tail];
1951		wqe_fragment_index = 1;
1952		wqe_fragment_length = (__le16 *)
1953			&nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX];
1954		/* bump past the vlan tag */
1955		wqe_fragment_length++;
1956		if (le16_to_cpu(wqe_fragment_length[wqe_fragment_index]) != 0) {
1957			u64temp = (u64)le32_to_cpu(
1958				nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX+
1959				wqe_fragment_index*2]);
1960			u64temp += ((u64)le32_to_cpu(
1961				nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX
1962				+ wqe_fragment_index*2]))<<32;
1963			bus_address = (dma_addr_t)u64temp;
1964			if (test_and_clear_bit(nesvnic->nic.sq_tail,
1965					nesvnic->nic.first_frag_overflow)) {
1966				pci_unmap_single(nesdev->pcidev,
1967						bus_address,
1968						le16_to_cpu(wqe_fragment_length[
1969							wqe_fragment_index++]),
1970						PCI_DMA_TODEVICE);
1971			}
1972			for (; wqe_fragment_index < 5; wqe_fragment_index++) {
1973				if (wqe_fragment_length[wqe_fragment_index]) {
1974					u64temp = le32_to_cpu(
1975						nic_sqe->wqe_words[
1976						NES_NIC_SQ_WQE_FRAG0_LOW_IDX+
1977						wqe_fragment_index*2]);
1978					u64temp += ((u64)le32_to_cpu(
1979						nic_sqe->wqe_words[
1980						NES_NIC_SQ_WQE_FRAG0_HIGH_IDX+
1981						wqe_fragment_index*2]))<<32;
1982					bus_address = (dma_addr_t)u64temp;
1983					pci_unmap_page(nesdev->pcidev,
1984							bus_address,
1985							le16_to_cpu(
1986							wqe_fragment_length[
1987							wqe_fragment_index]),
1988							PCI_DMA_TODEVICE);
1989				} else
1990					break;
1991			}
1992		}
1993		if (nesvnic->nic.tx_skb[nesvnic->nic.sq_tail])
1994			dev_kfree_skb(
1995				nesvnic->nic.tx_skb[nesvnic->nic.sq_tail]);
1996
1997		nesvnic->nic.sq_tail = (nesvnic->nic.sq_tail + 1)
1998					& (nesvnic->nic.sq_size - 1);
1999	}
2000
2001	spin_lock_irqsave(&nesdev->cqp.lock, flags);
2002
2003	/* Destroy NIC QP */
2004	cqp_head = nesdev->cqp.sq_head;
2005	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
2006	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2007
2008	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
2009		(NES_CQP_DESTROY_QP | NES_CQP_QP_TYPE_NIC));
2010	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
2011		nesvnic->nic.qp_id);
2012
2013	if (++cqp_head >= nesdev->cqp.sq_size)
2014		cqp_head = 0;
2015
2016	cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];
2017
2018	/* Destroy NIC CQ */
2019	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2020	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
2021		(NES_CQP_DESTROY_CQ | ((u32)nesvnic->nic_cq.cq_size << 16)));
2022	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
2023		(nesvnic->nic_cq.cq_number | ((u32)nesdev->nic_ceq_index << 16)));
2024
2025	if (++cqp_head >= nesdev->cqp.sq_size)
2026		cqp_head = 0;
2027
2028	nesdev->cqp.sq_head = cqp_head;
2029	barrier();
2030
2031	/* Ring doorbell (2 WQEs) */
2032	nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x02800000 | nesdev->cqp.qp_id);
2033
2034	spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
2035	nes_debug(NES_DBG_SHUTDOWN, "Waiting for CQP, cqp_head=%u, cqp.sq_head=%u,"
2036			" cqp.sq_tail=%u, cqp.sq_size=%u\n",
2037			cqp_head, nesdev->cqp.sq_head,
2038			nesdev->cqp.sq_tail, nesdev->cqp.sq_size);
2039
2040	ret = wait_event_timeout(nesdev->cqp.waitq, (nesdev->cqp.sq_tail == cqp_head),
2041			NES_EVENT_TIMEOUT);
2042
2043	nes_debug(NES_DBG_SHUTDOWN, "Destroy NIC QP returned, wait_event_timeout ret = %u, cqp_head=%u,"
2044			" cqp.sq_head=%u, cqp.sq_tail=%u\n",
2045			ret, cqp_head, nesdev->cqp.sq_head, nesdev->cqp.sq_tail);
2046	if (!ret) {
2047		nes_debug(NES_DBG_SHUTDOWN, "NIC QP%u destroy timeout expired\n",
2048				nesvnic->nic.qp_id);
2049	}
2050
2051	pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase,
2052			nesvnic->nic_pbase);
2053
2054	/* restore old wqm_cfg0 value */
2055	nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0);
2056}
2057
2058/**
2059 * nes_napi_isr
2060 */
2061int nes_napi_isr(struct nes_device *nesdev)
2062{
2063	struct nes_adapter *nesadapter = nesdev->nesadapter;
2064	u32 int_stat;
2065
2066	if (nesdev->napi_isr_ran) {
2067		/* interrupt status has already been read in ISR */
2068		int_stat = nesdev->int_stat;
2069	} else {
2070		int_stat = nes_read32(nesdev->regs + NES_INT_STAT);
2071		nesdev->int_stat = int_stat;
2072		nesdev->napi_isr_ran = 1;
2073	}
2074
2075	int_stat &= nesdev->int_req;
2076	/* iff NIC, process here, else wait for DPC */
2077	if ((int_stat) && ((int_stat & 0x0000ff00) == int_stat)) {
2078		nesdev->napi_isr_ran = 0;
2079		nes_write32(nesdev->regs + NES_INT_STAT,
2080			(int_stat &
2081			~(NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0 | NES_INT_MAC1 | NES_INT_MAC2 | NES_INT_MAC3)));
2082
2083		/* Process the CEQs */
2084		nes_process_ceq(nesdev, &nesdev->nesadapter->ceq[nesdev->nic_ceq_index]);
2085
2086		if (unlikely((((nesadapter->et_rx_coalesce_usecs_irq) &&
2087					(!nesadapter->et_use_adaptive_rx_coalesce)) ||
2088					((nesadapter->et_use_adaptive_rx_coalesce) &&
2089					 (nesdev->deepcq_count > nesadapter->et_pkt_rate_low))))) {
2090			if ((nesdev->int_req & NES_INT_TIMER) == 0) {
2091				/* Enable Periodic timer interrupts */
2092				nesdev->int_req |= NES_INT_TIMER;
2093				/* ack any pending periodic timer interrupts so we don't get an immediate interrupt */
2094				/* TODO: need to also ack other unused periodic timer values, get from nesadapter */
2095				nes_write32(nesdev->regs+NES_TIMER_STAT,
2096						nesdev->timer_int_req  | ~(nesdev->nesadapter->timer_int_req));
2097				nes_write32(nesdev->regs+NES_INTF_INT_MASK,
2098						~(nesdev->intf_int_req | NES_INTF_PERIODIC_TIMER));
2099			}
2100
2101			if (unlikely(nesadapter->et_use_adaptive_rx_coalesce))
2102			{
2103				nes_nic_init_timer(nesdev);
2104			}
2105			/* Enable interrupts, except CEQs */
2106			nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff | (~nesdev->int_req));
2107		} else {
2108			/* Enable interrupts, make sure timer is off */
2109			nesdev->int_req &= ~NES_INT_TIMER;
2110			nes_write32(nesdev->regs+NES_INTF_INT_MASK, ~(nesdev->intf_int_req));
2111			nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req);
2112		}
2113		nesdev->deepcq_count = 0;
2114		return 1;
2115	} else {
2116		return 0;
2117	}
2118}
2119
2120static void process_critical_error(struct nes_device *nesdev)
2121{
2122	u32 debug_error;
2123	u32 nes_idx_debug_error_masks0 = 0;
2124	u16 error_module = 0;
2125
2126	debug_error = nes_read_indexed(nesdev, NES_IDX_DEBUG_ERROR_CONTROL_STATUS);
2127	printk(KERN_ERR PFX "Critical Error reported by device!!! 0x%02X\n",
2128			(u16)debug_error);
2129	nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_CONTROL_STATUS,
2130			0x01010000 | (debug_error & 0x0000ffff));
2131	if (crit_err_count++ > 10)
2132		nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_MASKS1, 1 << 0x17);
2133	error_module = (u16) (debug_error & 0x1F00) >> 8;
2134	if (++nesdev->nesadapter->crit_error_count[error_module-1] >=
2135			nes_max_critical_error_count) {
2136		printk(KERN_ERR PFX "Masking off critical error for module "
2137			"0x%02X\n", (u16)error_module);
2138		nes_idx_debug_error_masks0 = nes_read_indexed(nesdev,
2139			NES_IDX_DEBUG_ERROR_MASKS0);
2140		nes_write_indexed(nesdev, NES_IDX_DEBUG_ERROR_MASKS0,
2141			nes_idx_debug_error_masks0 | (1 << error_module));
2142	}
2143}
2144/**
2145 * nes_dpc
2146 */
2147void nes_dpc(unsigned long param)
2148{
2149	struct nes_device *nesdev = (struct nes_device *)param;
2150	struct nes_adapter *nesadapter = nesdev->nesadapter;
2151	u32 counter;
2152	u32 loop_counter = 0;
2153	u32 int_status_bit;
2154	u32 int_stat;
2155	u32 timer_stat;
2156	u32 temp_int_stat;
2157	u32 intf_int_stat;
2158	u32 processed_intf_int = 0;
2159	u16 processed_timer_int = 0;
2160	u16 completion_ints = 0;
2161	u16 timer_ints = 0;
2162
2163	/* nes_debug(NES_DBG_ISR, "\n"); */
2164
2165	do {
2166		timer_stat = 0;
2167		if (nesdev->napi_isr_ran) {
2168			nesdev->napi_isr_ran = 0;
2169			int_stat = nesdev->int_stat;
2170		} else
2171			int_stat = nes_read32(nesdev->regs+NES_INT_STAT);
2172		if (processed_intf_int != 0)
2173			int_stat &= nesdev->int_req & ~NES_INT_INTF;
2174		else
2175			int_stat &= nesdev->int_req;
2176		if (processed_timer_int == 0) {
2177			processed_timer_int = 1;
2178			if (int_stat & NES_INT_TIMER) {
2179				timer_stat = nes_read32(nesdev->regs + NES_TIMER_STAT);
2180				if ((timer_stat & nesdev->timer_int_req) == 0) {
2181					int_stat &= ~NES_INT_TIMER;
2182				}
2183			}
2184		} else {
2185			int_stat &= ~NES_INT_TIMER;
2186		}
2187
2188		if (int_stat) {
2189			if (int_stat & ~(NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0|
2190					NES_INT_MAC1|NES_INT_MAC2 | NES_INT_MAC3)) {
2191				/* Ack the interrupts */
2192				nes_write32(nesdev->regs+NES_INT_STAT,
2193					(int_stat & ~(NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0|
2194					NES_INT_MAC1 | NES_INT_MAC2 | NES_INT_MAC3)));
2195			}
2196
2197			temp_int_stat = int_stat;
2198			for (counter = 0, int_status_bit = 1; counter < 16; counter++) {
2199				if (int_stat & int_status_bit) {
2200					nes_process_ceq(nesdev, &nesadapter->ceq[counter]);
2201					temp_int_stat &= ~int_status_bit;
2202					completion_ints = 1;
2203				}
2204				if (!(temp_int_stat & 0x0000ffff))
2205					break;
2206				int_status_bit <<= 1;
2207			}
2208
2209			/* Process the AEQ for this pci function */
2210			int_status_bit = 1 << (16 + PCI_FUNC(nesdev->pcidev->devfn));
2211			if (int_stat & int_status_bit) {
2212				nes_process_aeq(nesdev, &nesadapter->aeq[PCI_FUNC(nesdev->pcidev->devfn)]);
2213			}
2214
2215			/* Process the MAC interrupt for this pci function */
2216			int_status_bit = 1 << (24 + nesdev->mac_index);
2217			if (int_stat & int_status_bit) {
2218				nes_process_mac_intr(nesdev, nesdev->mac_index);
2219			}
2220
2221			if (int_stat & NES_INT_TIMER) {
2222				if (timer_stat & nesdev->timer_int_req) {
2223					nes_write32(nesdev->regs + NES_TIMER_STAT,
2224							(timer_stat & nesdev->timer_int_req) |
2225							~(nesdev->nesadapter->timer_int_req));
2226					timer_ints = 1;
2227				}
2228			}
2229
2230			if (int_stat & NES_INT_INTF) {
2231				processed_intf_int = 1;
2232				intf_int_stat = nes_read32(nesdev->regs+NES_INTF_INT_STAT);
2233				intf_int_stat &= nesdev->intf_int_req;
2234				if (NES_INTF_INT_CRITERR & intf_int_stat) {
2235					process_critical_error(nesdev);
2236				}
2237				if (NES_INTF_INT_PCIERR & intf_int_stat) {
2238					printk(KERN_ERR PFX "PCI Error reported by device!!!\n");
2239					BUG();
2240				}
2241				if (NES_INTF_INT_AEQ_OFLOW & intf_int_stat) {
2242					printk(KERN_ERR PFX "AEQ Overflow reported by device!!!\n");
2243					BUG();
2244				}
2245				nes_write32(nesdev->regs+NES_INTF_INT_STAT, intf_int_stat);
2246			}
2247
2248			if (int_stat & NES_INT_TSW) {
2249			}
2250		}
2251		/* Don't use the interface interrupt bit stay in loop */
2252		int_stat &= ~NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0 |
2253				NES_INT_MAC1 | NES_INT_MAC2 | NES_INT_MAC3;
2254	} while ((int_stat != 0) && (loop_counter++ < MAX_DPC_ITERATIONS));
2255
2256	if (timer_ints == 1) {
2257		if ((nesadapter->et_rx_coalesce_usecs_irq) || (nesadapter->et_use_adaptive_rx_coalesce)) {
2258			if (completion_ints == 0) {
2259				nesdev->timer_only_int_count++;
2260				if (nesdev->timer_only_int_count>=nesadapter->timer_int_limit) {
2261					nesdev->timer_only_int_count = 0;
2262					nesdev->int_req &= ~NES_INT_TIMER;
2263					nes_write32(nesdev->regs + NES_INTF_INT_MASK, ~(nesdev->intf_int_req));
2264					nes_write32(nesdev->regs + NES_INT_MASK, ~nesdev->int_req);
2265				} else {
2266					nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff | (~nesdev->int_req));
2267				}
2268			} else {
2269				if (unlikely(nesadapter->et_use_adaptive_rx_coalesce))
2270				{
2271					nes_nic_init_timer(nesdev);
2272				}
2273				nesdev->timer_only_int_count = 0;
2274				nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff | (~nesdev->int_req));
2275			}
2276		} else {
2277			nesdev->timer_only_int_count = 0;
2278			nesdev->int_req &= ~NES_INT_TIMER;
2279			nes_write32(nesdev->regs+NES_INTF_INT_MASK, ~(nesdev->intf_int_req));
2280			nes_write32(nesdev->regs+NES_TIMER_STAT,
2281					nesdev->timer_int_req | ~(nesdev->nesadapter->timer_int_req));
2282			nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req);
2283		}
2284	} else {
2285		if ( (completion_ints == 1) &&
2286			 (((nesadapter->et_rx_coalesce_usecs_irq) &&
2287			   (!nesadapter->et_use_adaptive_rx_coalesce)) ||
2288			  ((nesdev->deepcq_count > nesadapter->et_pkt_rate_low) &&
2289			   (nesadapter->et_use_adaptive_rx_coalesce) )) ) {
2290			/* nes_debug(NES_DBG_ISR, "Enabling periodic timer interrupt.\n" ); */
2291			nesdev->timer_only_int_count = 0;
2292			nesdev->int_req |= NES_INT_TIMER;
2293			nes_write32(nesdev->regs+NES_TIMER_STAT,
2294					nesdev->timer_int_req | ~(nesdev->nesadapter->timer_int_req));
2295			nes_write32(nesdev->regs+NES_INTF_INT_MASK,
2296					~(nesdev->intf_int_req | NES_INTF_PERIODIC_TIMER));
2297			nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff | (~nesdev->int_req));
2298		} else {
2299			nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req);
2300		}
2301	}
2302	nesdev->deepcq_count = 0;
2303}
2304
2305
2306/**
2307 * nes_process_ceq
2308 */
2309static void nes_process_ceq(struct nes_device *nesdev, struct nes_hw_ceq *ceq)
2310{
2311	u64 u64temp;
2312	struct nes_hw_cq *cq;
2313	u32 head;
2314	u32 ceq_size;
2315
2316	/* nes_debug(NES_DBG_CQ, "\n"); */
2317	head = ceq->ceq_head;
2318	ceq_size = ceq->ceq_size;
2319
2320	do {
2321		if (le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_HIGH_IDX]) &
2322				NES_CEQE_VALID) {
2323			u64temp = (((u64)(le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_HIGH_IDX]))) << 32) |
2324						((u64)(le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_LOW_IDX])));
2325			u64temp <<= 1;
2326			cq = *((struct nes_hw_cq **)&u64temp);
2327			/* nes_debug(NES_DBG_CQ, "pCQ = %p\n", cq); */
2328			barrier();
2329			ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_HIGH_IDX] = 0;
2330
2331			/* call the event handler */
2332			cq->ce_handler(nesdev, cq);
2333
2334			if (++head >= ceq_size)
2335				head = 0;
2336		} else {
2337			break;
2338		}
2339
2340	} while (1);
2341
2342	ceq->ceq_head = head;
2343}
2344
2345
2346/**
2347 * nes_process_aeq
2348 */
2349static void nes_process_aeq(struct nes_device *nesdev, struct nes_hw_aeq *aeq)
2350{
2351	/* u64 u64temp; */
2352	u32 head;
2353	u32 aeq_size;
2354	u32 aeqe_misc;
2355	u32 aeqe_cq_id;
2356	struct nes_hw_aeqe volatile *aeqe;
2357
2358	head = aeq->aeq_head;
2359	aeq_size = aeq->aeq_size;
2360
2361	do {
2362		aeqe = &aeq->aeq_vbase[head];
2363		if ((le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]) & NES_AEQE_VALID) == 0)
2364			break;
2365		aeqe_misc  = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]);
2366		aeqe_cq_id = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]);
2367		if (aeqe_misc & (NES_AEQE_QP|NES_AEQE_CQ)) {
2368			if (aeqe_cq_id >= NES_FIRST_QPN) {
2369				/* dealing with an accelerated QP related AE */
2370				/*
2371				 * u64temp = (((u64)(le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_HIGH_IDX]))) << 32) |
2372				 *	     ((u64)(le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX])));
2373				 */
2374				nes_process_iwarp_aeqe(nesdev, (struct nes_hw_aeqe *)aeqe);
2375			} else {
2376				/* TODO: dealing with a CQP related AE */
2377				nes_debug(NES_DBG_AEQ, "Processing CQP related AE, misc = 0x%04X\n",
2378						(u16)(aeqe_misc >> 16));
2379			}
2380		}
2381
2382		aeqe->aeqe_words[NES_AEQE_MISC_IDX] = 0;
2383
2384		if (++head >= aeq_size)
2385			head = 0;
2386
2387		nes_write32(nesdev->regs + NES_AEQ_ALLOC, 1 << 16);
2388	}
2389	while (1);
2390	aeq->aeq_head = head;
2391}
2392
2393static void nes_reset_link(struct nes_device *nesdev, u32 mac_index)
2394{
2395	struct nes_adapter *nesadapter = nesdev->nesadapter;
2396	u32 reset_value;
2397	u32 i=0;
2398	u32 u32temp;
2399
2400	if (nesadapter->hw_rev == NE020_REV) {
2401		return;
2402	}
2403	mh_detected++;
2404
2405	reset_value = nes_read32(nesdev->regs+NES_SOFTWARE_RESET);
2406
2407	if ((mac_index == 0) || ((mac_index == 1) && (nesadapter->OneG_Mode)))
2408		reset_value |= 0x0000001d;
2409	else
2410		reset_value |= 0x0000002d;
2411
2412	if (4 <= (nesadapter->link_interrupt_count[mac_index] / ((u16)NES_MAX_LINK_INTERRUPTS))) {
2413		if ((!nesadapter->OneG_Mode) && (nesadapter->port_count == 2)) {
2414			nesadapter->link_interrupt_count[0] = 0;
2415			nesadapter->link_interrupt_count[1] = 0;
2416			u32temp = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1);
2417			if (0x00000040 & u32temp)
2418				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x0000F088);
2419			else
2420				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x0000F0C8);
2421
2422			reset_value |= 0x0000003d;
2423		}
2424		nesadapter->link_interrupt_count[mac_index] = 0;
2425	}
2426
2427	nes_write32(nesdev->regs+NES_SOFTWARE_RESET, reset_value);
2428
2429	while (((nes_read32(nesdev->regs+NES_SOFTWARE_RESET)
2430			& 0x00000040) != 0x00000040) && (i++ < 5000));
2431
2432	if (0x0000003d == (reset_value & 0x0000003d)) {
2433		u32 pcs_control_status0, pcs_control_status1;
2434
2435		for (i = 0; i < 10; i++) {
2436			pcs_control_status0 = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0);
2437			pcs_control_status1 = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
2438			if (((0x0F000000 == (pcs_control_status0 & 0x0F000000))
2439			     && (pcs_control_status0 & 0x00100000))
2440			    || ((0x0F000000 == (pcs_control_status1 & 0x0F000000))
2441				&& (pcs_control_status1 & 0x00100000)))
2442				continue;
2443			else
2444				break;
2445		}
2446		if (10 == i) {
2447			u32temp = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1);
2448			if (0x00000040 & u32temp)
2449				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x0000F088);
2450			else
2451				nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x0000F0C8);
2452
2453			nes_write32(nesdev->regs+NES_SOFTWARE_RESET, reset_value);
2454
2455			while (((nes_read32(nesdev->regs + NES_SOFTWARE_RESET)
2456				 & 0x00000040) != 0x00000040) && (i++ < 5000));
2457		}
2458	}
2459}
2460
2461/**
2462 * nes_process_mac_intr
2463 */
2464static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
2465{
2466	unsigned long flags;
2467	u32 pcs_control_status;
2468	struct nes_adapter *nesadapter = nesdev->nesadapter;
2469	struct nes_vnic *nesvnic;
2470	u32 mac_status;
2471	u32 mac_index = nesdev->mac_index;
2472	u32 u32temp;
2473	u16 phy_data;
2474	u16 temp_phy_data;
2475	u32 pcs_val  = 0x0f0f0000;
2476	u32 pcs_mask = 0x0f1f0000;
2477	u32 cdr_ctrl;
2478
2479	spin_lock_irqsave(&nesadapter->phy_lock, flags);
2480	if (nesadapter->mac_sw_state[mac_number] != NES_MAC_SW_IDLE) {
2481		spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
2482		return;
2483	}
2484	nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_INTERRUPT;
2485
2486	/* ack the MAC interrupt */
2487	mac_status = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (mac_index * 0x200));
2488	/* Clear the interrupt */
2489	nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (mac_index * 0x200), mac_status);
2490
2491	nes_debug(NES_DBG_PHY, "MAC%u interrupt status = 0x%X.\n", mac_number, mac_status);
2492
2493	if (mac_status & (NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT)) {
2494		nesdev->link_status_interrupts++;
2495		if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS)))
2496			nes_reset_link(nesdev, mac_index);
2497
2498		/* read the PHY interrupt status register */
2499		if ((nesadapter->OneG_Mode) &&
2500		(nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) {
2501			do {
2502				nes_read_1G_phy_reg(nesdev, 0x1a,
2503						nesadapter->phy_index[mac_index], &phy_data);
2504				nes_debug(NES_DBG_PHY, "Phy%d data from register 0x1a = 0x%X.\n",
2505						nesadapter->phy_index[mac_index], phy_data);
2506			} while (phy_data&0x8000);
2507
2508			temp_phy_data = 0;
2509			do {
2510				nes_read_1G_phy_reg(nesdev, 0x11,
2511						nesadapter->phy_index[mac_index], &phy_data);
2512				nes_debug(NES_DBG_PHY, "Phy%d data from register 0x11 = 0x%X.\n",
2513						nesadapter->phy_index[mac_index], phy_data);
2514				if (temp_phy_data == phy_data)
2515					break;
2516				temp_phy_data = phy_data;
2517			} while (1);
2518
2519			nes_read_1G_phy_reg(nesdev, 0x1e,
2520					nesadapter->phy_index[mac_index], &phy_data);
2521			nes_debug(NES_DBG_PHY, "Phy%d data from register 0x1e = 0x%X.\n",
2522					nesadapter->phy_index[mac_index], phy_data);
2523
2524			nes_read_1G_phy_reg(nesdev, 1,
2525					nesadapter->phy_index[mac_index], &phy_data);
2526			nes_debug(NES_DBG_PHY, "1G phy%u data from register 1 = 0x%X\n",
2527					nesadapter->phy_index[mac_index], phy_data);
2528
2529			if (temp_phy_data & 0x1000) {
2530				nes_debug(NES_DBG_PHY, "The Link is up according to the PHY\n");
2531				phy_data = 4;
2532			} else {
2533				nes_debug(NES_DBG_PHY, "The Link is down according to the PHY\n");
2534			}
2535		}
2536		nes_debug(NES_DBG_PHY, "Eth SERDES Common Status: 0=0x%08X, 1=0x%08X\n",
2537				nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS0),
2538				nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS0+0x200));
2539
2540		if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_PUMA_1G) {
2541			switch (mac_index) {
2542			case 1:
2543			case 3:
2544				pcs_control_status = nes_read_indexed(nesdev,
2545						NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
2546				break;
2547			default:
2548				pcs_control_status = nes_read_indexed(nesdev,
2549						NES_IDX_PHY_PCS_CONTROL_STATUS0);
2550				break;
2551			}
2552		} else {
2553			pcs_control_status = nes_read_indexed(nesdev,
2554					NES_IDX_PHY_PCS_CONTROL_STATUS0 + ((mac_index & 1) * 0x200));
2555			pcs_control_status = nes_read_indexed(nesdev,
2556					NES_IDX_PHY_PCS_CONTROL_STATUS0 + ((mac_index & 1) * 0x200));
2557		}
2558
2559		nes_debug(NES_DBG_PHY, "PCS PHY Control/Status%u: 0x%08X\n",
2560				mac_index, pcs_control_status);
2561		if ((nesadapter->OneG_Mode) &&
2562				(nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) {
2563			u32temp = 0x01010000;
2564			if (nesadapter->port_count > 2) {
2565				u32temp |= 0x02020000;
2566			}
2567			if ((pcs_control_status & u32temp)!= u32temp) {
2568				phy_data = 0;
2569				nes_debug(NES_DBG_PHY, "PCS says the link is down\n");
2570			}
2571		} else {
2572			switch (nesadapter->phy_type[mac_index]) {
2573			case NES_PHY_TYPE_ARGUS:
2574			case NES_PHY_TYPE_SFP_D:
2575			case NES_PHY_TYPE_KR:
2576				/* clear the alarms */
2577				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0x0008);
2578				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc001);
2579				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc002);
2580				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc005);
2581				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc006);
2582				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9003);
2583				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9004);
2584				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9005);
2585				/* check link status */
2586				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9003);
2587				temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
2588
2589				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 3, 0x0021);
2590				nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
2591				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 3, 0x0021);
2592				phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
2593
2594				phy_data = (!temp_phy_data && (phy_data == 0x8000)) ? 0x4 : 0x0;
2595
2596				nes_debug(NES_DBG_PHY, "%s: Phy data = 0x%04X, link was %s.\n",
2597					__func__, phy_data, nesadapter->mac_link_down[mac_index] ? "DOWN" : "UP");
2598				break;
2599
2600			case NES_PHY_TYPE_PUMA_1G:
2601				if (mac_index < 2)
2602					pcs_val = pcs_mask = 0x01010000;
2603				else
2604					pcs_val = pcs_mask = 0x02020000;
2605				/* fall through */
2606			default:
2607				phy_data = (pcs_val == (pcs_control_status & pcs_mask)) ? 0x4 : 0x0;
2608				break;
2609			}
2610		}
2611
2612		if (phy_data & 0x0004) {
2613			if (wide_ppm_offset &&
2614			    (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_CX4) &&
2615			    (nesadapter->hw_rev != NE020_REV)) {
2616				cdr_ctrl = nes_read_indexed(nesdev,
2617							    NES_IDX_ETH_SERDES_CDR_CONTROL0 +
2618							    mac_index * 0x200);
2619				nes_write_indexed(nesdev,
2620						  NES_IDX_ETH_SERDES_CDR_CONTROL0 +
2621						  mac_index * 0x200,
2622						  cdr_ctrl | 0x000F0000);
2623			}
2624			nesadapter->mac_link_down[mac_index] = 0;
2625			list_for_each_entry(nesvnic, &nesadapter->nesvnic_list[mac_index], list) {
2626				nes_debug(NES_DBG_PHY, "The Link is UP!!.  linkup was %d\n",
2627						nesvnic->linkup);
2628				if (nesvnic->linkup == 0) {
2629					printk(PFX "The Link is now up for port %s, netdev %p.\n",
2630							nesvnic->netdev->name, nesvnic->netdev);
2631					if (netif_queue_stopped(nesvnic->netdev))
2632						netif_start_queue(nesvnic->netdev);
2633					nesvnic->linkup = 1;
2634					netif_carrier_on(nesvnic->netdev);
2635
2636					spin_lock(&nesvnic->port_ibevent_lock);
2637					if (nesvnic->of_device_registered) {
2638						if (nesdev->iw_status == 0) {
2639							nesdev->iw_status = 1;
2640							nes_port_ibevent(nesvnic);
2641						}
2642					}
2643					spin_unlock(&nesvnic->port_ibevent_lock);
2644				}
2645			}
2646		} else {
2647			if (wide_ppm_offset &&
2648			    (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_CX4) &&
2649			    (nesadapter->hw_rev != NE020_REV)) {
2650				cdr_ctrl = nes_read_indexed(nesdev,
2651							    NES_IDX_ETH_SERDES_CDR_CONTROL0 +
2652							    mac_index * 0x200);
2653				nes_write_indexed(nesdev,
2654						  NES_IDX_ETH_SERDES_CDR_CONTROL0 +
2655						  mac_index * 0x200,
2656						  cdr_ctrl & 0xFFF0FFFF);
2657			}
2658			nesadapter->mac_link_down[mac_index] = 1;
2659			list_for_each_entry(nesvnic, &nesadapter->nesvnic_list[mac_index], list) {
2660				nes_debug(NES_DBG_PHY, "The Link is Down!!. linkup was %d\n",
2661						nesvnic->linkup);
2662				if (nesvnic->linkup == 1) {
2663					printk(PFX "The Link is now down for port %s, netdev %p.\n",
2664							nesvnic->netdev->name, nesvnic->netdev);
2665					if (!(netif_queue_stopped(nesvnic->netdev)))
2666						netif_stop_queue(nesvnic->netdev);
2667					nesvnic->linkup = 0;
2668					netif_carrier_off(nesvnic->netdev);
2669
2670					spin_lock(&nesvnic->port_ibevent_lock);
2671					if (nesvnic->of_device_registered) {
2672						if (nesdev->iw_status == 1) {
2673							nesdev->iw_status = 0;
2674							nes_port_ibevent(nesvnic);
2675						}
2676					}
2677					spin_unlock(&nesvnic->port_ibevent_lock);
2678				}
2679			}
2680		}
2681		if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_SFP_D) {
2682			if (nesdev->link_recheck)
2683				cancel_delayed_work(&nesdev->work);
2684			nesdev->link_recheck = 1;
2685			schedule_delayed_work(&nesdev->work,
2686					      NES_LINK_RECHECK_DELAY);
2687		}
2688	}
2689
2690	spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
2691
2692	nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_IDLE;
2693}
2694
2695void nes_recheck_link_status(struct work_struct *work)
2696{
2697	unsigned long flags;
2698	struct nes_device *nesdev = container_of(work, struct nes_device, work.work);
2699	struct nes_adapter *nesadapter = nesdev->nesadapter;
2700	struct nes_vnic *nesvnic;
2701	u32 mac_index = nesdev->mac_index;
2702	u16 phy_data;
2703	u16 temp_phy_data;
2704
2705	spin_lock_irqsave(&nesadapter->phy_lock, flags);
2706
2707	/* check link status */
2708	nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9003);
2709	temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
2710
2711	nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 3, 0x0021);
2712	nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
2713	nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 3, 0x0021);
2714	phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
2715
2716	phy_data = (!temp_phy_data && (phy_data == 0x8000)) ? 0x4 : 0x0;
2717
2718	nes_debug(NES_DBG_PHY, "%s: Phy data = 0x%04X, link was %s.\n",
2719		__func__, phy_data,
2720		nesadapter->mac_link_down[mac_index] ? "DOWN" : "UP");
2721
2722	if (phy_data & 0x0004) {
2723		nesadapter->mac_link_down[mac_index] = 0;
2724		list_for_each_entry(nesvnic, &nesadapter->nesvnic_list[mac_index], list) {
2725			if (nesvnic->linkup == 0) {
2726				printk(PFX "The Link is now up for port %s, netdev %p.\n",
2727						nesvnic->netdev->name, nesvnic->netdev);
2728				if (netif_queue_stopped(nesvnic->netdev))
2729					netif_start_queue(nesvnic->netdev);
2730				nesvnic->linkup = 1;
2731				netif_carrier_on(nesvnic->netdev);
2732
2733				spin_lock(&nesvnic->port_ibevent_lock);
2734				if (nesvnic->of_device_registered) {
2735					if (nesdev->iw_status == 0) {
2736						nesdev->iw_status = 1;
2737						nes_port_ibevent(nesvnic);
2738					}
2739				}
2740				spin_unlock(&nesvnic->port_ibevent_lock);
2741			}
2742		}
2743
2744	} else {
2745		nesadapter->mac_link_down[mac_index] = 1;
2746		list_for_each_entry(nesvnic, &nesadapter->nesvnic_list[mac_index], list) {
2747			if (nesvnic->linkup == 1) {
2748				printk(PFX "The Link is now down for port %s, netdev %p.\n",
2749						nesvnic->netdev->name, nesvnic->netdev);
2750				if (!(netif_queue_stopped(nesvnic->netdev)))
2751					netif_stop_queue(nesvnic->netdev);
2752				nesvnic->linkup = 0;
2753				netif_carrier_off(nesvnic->netdev);
2754
2755				spin_lock(&nesvnic->port_ibevent_lock);
2756				if (nesvnic->of_device_registered) {
2757					if (nesdev->iw_status == 1) {
2758						nesdev->iw_status = 0;
2759						nes_port_ibevent(nesvnic);
2760					}
2761				}
2762				spin_unlock(&nesvnic->port_ibevent_lock);
2763			}
2764		}
2765	}
2766	if (nesdev->link_recheck++ < NES_LINK_RECHECK_MAX)
2767		schedule_delayed_work(&nesdev->work, NES_LINK_RECHECK_DELAY);
2768	else
2769		nesdev->link_recheck = 0;
2770
2771	spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
2772}
2773
2774
2775static void nes_nic_napi_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
2776{
2777	struct nes_vnic *nesvnic = container_of(cq, struct nes_vnic, nic_cq);
2778
2779	napi_schedule(&nesvnic->napi);
2780}
2781
2782
2783/* The MAX_RQES_TO_PROCESS defines how many max read requests to complete before
2784* getting out of nic_ce_handler
2785*/
2786#define	MAX_RQES_TO_PROCESS	384
2787
2788/**
2789 * nes_nic_ce_handler
2790 */
2791void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
2792{
2793	u64 u64temp;
2794	dma_addr_t bus_address;
2795	struct nes_hw_nic *nesnic;
2796	struct nes_vnic *nesvnic = container_of(cq, struct nes_vnic, nic_cq);
2797	struct nes_adapter *nesadapter = nesdev->nesadapter;
2798	struct nes_hw_nic_rq_wqe *nic_rqe;
2799	struct nes_hw_nic_sq_wqe *nic_sqe;
2800	struct sk_buff *skb;
2801	struct sk_buff *rx_skb;
2802	struct nes_rskb_cb *cb;
2803	__le16 *wqe_fragment_length;
2804	u32 head;
2805	u32 cq_size;
2806	u32 rx_pkt_size;
2807	u32 cqe_count=0;
2808	u32 cqe_errv;
2809	u32 cqe_misc;
2810	u16 wqe_fragment_index = 1;	/* first fragment (0) is used by copy buffer */
2811	u16 vlan_tag;
2812	u16 pkt_type;
2813	u16 rqes_processed = 0;
2814	u8 sq_cqes = 0;
2815	u8 nes_use_lro = 0;
2816
2817	head = cq->cq_head;
2818	cq_size = cq->cq_size;
2819	cq->cqes_pending = 1;
2820	if (nesvnic->netdev->features & NETIF_F_LRO)
2821		nes_use_lro = 1;
2822	do {
2823		if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) &
2824				NES_NIC_CQE_VALID) {
2825			nesnic = &nesvnic->nic;
2826			cqe_misc = le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]);
2827			if (cqe_misc & NES_NIC_CQE_SQ) {
2828				sq_cqes++;
2829				wqe_fragment_index = 1;
2830				nic_sqe = &nesnic->sq_vbase[nesnic->sq_tail];
2831				skb = nesnic->tx_skb[nesnic->sq_tail];
2832				wqe_fragment_length = (__le16 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX];
2833				/* bump past the vlan tag */
2834				wqe_fragment_length++;
2835				if (le16_to_cpu(wqe_fragment_length[wqe_fragment_index]) != 0) {
2836					u64temp = (u64) le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX +
2837							wqe_fragment_index * 2]);
2838					u64temp += ((u64)le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX +
2839							wqe_fragment_index * 2])) << 32;
2840					bus_address = (dma_addr_t)u64temp;
2841					if (test_and_clear_bit(nesnic->sq_tail, nesnic->first_frag_overflow)) {
2842						pci_unmap_single(nesdev->pcidev,
2843								bus_address,
2844								le16_to_cpu(wqe_fragment_length[wqe_fragment_index++]),
2845								PCI_DMA_TODEVICE);
2846					}
2847					for (; wqe_fragment_index < 5; wqe_fragment_index++) {
2848						if (wqe_fragment_length[wqe_fragment_index]) {
2849							u64temp = le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX +
2850										wqe_fragment_index * 2]);
2851							u64temp += ((u64)le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX
2852										+ wqe_fragment_index * 2])) <<32;
2853							bus_address = (dma_addr_t)u64temp;
2854							pci_unmap_page(nesdev->pcidev,
2855									bus_address,
2856									le16_to_cpu(wqe_fragment_length[wqe_fragment_index]),
2857									PCI_DMA_TODEVICE);
2858						} else
2859							break;
2860					}
2861				}
2862				if (skb)
2863					dev_kfree_skb_any(skb);
2864				nesnic->sq_tail++;
2865				nesnic->sq_tail &= nesnic->sq_size-1;
2866				if (sq_cqes > 128) {
2867					barrier();
2868					/* restart the queue if it had been stopped */
2869					if (netif_queue_stopped(nesvnic->netdev))
2870						netif_wake_queue(nesvnic->netdev);
2871					sq_cqes = 0;
2872				}
2873			} else {
2874				rqes_processed ++;
2875
2876				cq->rx_cqes_completed++;
2877				cq->rx_pkts_indicated++;
2878				rx_pkt_size = cqe_misc & 0x0000ffff;
2879				nic_rqe = &nesnic->rq_vbase[nesnic->rq_tail];
2880				/* Get the skb */
2881				rx_skb = nesnic->rx_skb[nesnic->rq_tail];
2882				nic_rqe = &nesnic->rq_vbase[nesvnic->nic.rq_tail];
2883				bus_address = (dma_addr_t)le32_to_cpu(nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX]);
2884				bus_address += ((u64)le32_to_cpu(nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_HIGH_IDX])) << 32;
2885				pci_unmap_single(nesdev->pcidev, bus_address,
2886						nesvnic->max_frame_size, PCI_DMA_FROMDEVICE);
2887				cb = (struct nes_rskb_cb *)&rx_skb->cb[0];
2888				cb->busaddr = 0;
2889				/* rx_skb->tail = rx_skb->data + rx_pkt_size; */
2890				/* rx_skb->len = rx_pkt_size; */
2891				rx_skb->len = 0;  /* TODO: see if this is necessary */
2892				skb_put(rx_skb, rx_pkt_size);
2893				rx_skb->protocol = eth_type_trans(rx_skb, nesvnic->netdev);
2894				nesnic->rq_tail++;
2895				nesnic->rq_tail &= nesnic->rq_size - 1;
2896
2897				atomic_inc(&nesvnic->rx_skbs_needed);
2898				if (atomic_read(&nesvnic->rx_skbs_needed) > (nesvnic->nic.rq_size>>1)) {
2899					nes_write32(nesdev->regs+NES_CQE_ALLOC,
2900							cq->cq_number | (cqe_count << 16));
2901					/* nesadapter->tune_timer.cq_count += cqe_count; */
2902					nesdev->currcq_count += cqe_count;
2903					cqe_count = 0;
2904					nes_replenish_nic_rq(nesvnic);
2905				}
2906				pkt_type = (u16)(le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_TAG_PKT_TYPE_IDX]));
2907				cqe_errv = (cqe_misc & NES_NIC_CQE_ERRV_MASK) >> NES_NIC_CQE_ERRV_SHIFT;
2908				rx_skb->ip_summed = CHECKSUM_NONE;
2909
2910				if ((NES_PKT_TYPE_TCPV4_BITS == (pkt_type & NES_PKT_TYPE_TCPV4_MASK)) ||
2911						(NES_PKT_TYPE_UDPV4_BITS == (pkt_type & NES_PKT_TYPE_UDPV4_MASK))) {
2912					if ((cqe_errv &
2913							(NES_NIC_ERRV_BITS_IPV4_CSUM_ERR | NES_NIC_ERRV_BITS_TCPUDP_CSUM_ERR |
2914							NES_NIC_ERRV_BITS_IPH_ERR | NES_NIC_ERRV_BITS_WQE_OVERRUN)) == 0) {
2915						if (nesvnic->netdev->features & NETIF_F_RXCSUM)
2916							rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
2917					} else
2918						nes_debug(NES_DBG_CQ, "%s: unsuccessfully checksummed TCP or UDP packet."
2919								" errv = 0x%X, pkt_type = 0x%X.\n",
2920								nesvnic->netdev->name, cqe_errv, pkt_type);
2921
2922				} else if ((pkt_type & NES_PKT_TYPE_IPV4_MASK) == NES_PKT_TYPE_IPV4_BITS) {
2923					if ((cqe_errv &
2924							(NES_NIC_ERRV_BITS_IPV4_CSUM_ERR | NES_NIC_ERRV_BITS_IPH_ERR |
2925							NES_NIC_ERRV_BITS_WQE_OVERRUN)) == 0) {
2926						if (nesvnic->netdev->features & NETIF_F_RXCSUM) {
2927							rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
2928							/* nes_debug(NES_DBG_CQ, "%s: Reporting successfully checksummed IPv4 packet.\n",
2929								  nesvnic->netdev->name); */
2930						}
2931					} else
2932						nes_debug(NES_DBG_CQ, "%s: unsuccessfully checksummed TCP or UDP packet."
2933								" errv = 0x%X, pkt_type = 0x%X.\n",
2934								nesvnic->netdev->name, cqe_errv, pkt_type);
2935					}
2936				/* nes_debug(NES_DBG_CQ, "pkt_type=%x, APBVT_MASK=%x\n",
2937							pkt_type, (pkt_type & NES_PKT_TYPE_APBVT_MASK)); */
2938
2939				if ((pkt_type & NES_PKT_TYPE_APBVT_MASK) == NES_PKT_TYPE_APBVT_BITS) {
2940					if (nes_cm_recv(rx_skb, nesvnic->netdev))
2941						rx_skb = NULL;
2942				}
2943				if (rx_skb == NULL)
2944					goto skip_rx_indicate0;
2945
2946
2947				if (cqe_misc & NES_NIC_CQE_TAG_VALID) {
2948					vlan_tag = (u16)(le32_to_cpu(
2949							cq->cq_vbase[head].cqe_words[NES_NIC_CQE_TAG_PKT_TYPE_IDX])
2950							>> 16);
2951					nes_debug(NES_DBG_CQ, "%s: Reporting stripped VLAN packet. Tag = 0x%04X\n",
2952							nesvnic->netdev->name, vlan_tag);
2953
2954					__vlan_hwaccel_put_tag(rx_skb, vlan_tag);
2955				}
2956				if (nes_use_lro)
2957					lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL);
2958				else
2959					netif_receive_skb(rx_skb);
2960
2961skip_rx_indicate0:
2962				;
2963				/* nesvnic->netstats.rx_packets++; */
2964				/* nesvnic->netstats.rx_bytes += rx_pkt_size; */
2965			}
2966
2967			cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX] = 0;
2968			/* Accounting... */
2969			cqe_count++;
2970			if (++head >= cq_size)
2971				head = 0;
2972			if (cqe_count == 255) {
2973				/* Replenish Nic CQ */
2974				nes_write32(nesdev->regs+NES_CQE_ALLOC,
2975						cq->cq_number | (cqe_count << 16));
2976				/* nesdev->nesadapter->tune_timer.cq_count += cqe_count; */
2977				nesdev->currcq_count += cqe_count;
2978				cqe_count = 0;
2979			}
2980
2981			if (cq->rx_cqes_completed >= nesvnic->budget)
2982				break;
2983		} else {
2984			cq->cqes_pending = 0;
2985			break;
2986		}
2987
2988	} while (1);
2989
2990	if (nes_use_lro)
2991		lro_flush_all(&nesvnic->lro_mgr);
2992	if (sq_cqes) {
2993		barrier();
2994		/* restart the queue if it had been stopped */
2995		if (netif_queue_stopped(nesvnic->netdev))
2996			netif_wake_queue(nesvnic->netdev);
2997	}
2998	cq->cq_head = head;
2999	/* nes_debug(NES_DBG_CQ, "CQ%u Processed = %u cqes, new head = %u.\n",
3000			cq->cq_number, cqe_count, cq->cq_head); */
3001	cq->cqe_allocs_pending = cqe_count;
3002	if (unlikely(nesadapter->et_use_adaptive_rx_coalesce))
3003	{
3004		/* nesdev->nesadapter->tune_timer.cq_count += cqe_count; */
3005		nesdev->currcq_count += cqe_count;
3006		nes_nic_tune_timer(nesdev);
3007	}
3008	if (atomic_read(&nesvnic->rx_skbs_needed))
3009		nes_replenish_nic_rq(nesvnic);
3010}
3011
3012
3013
3014/**
3015 * nes_cqp_ce_handler
3016 */
3017static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
3018{
3019	u64 u64temp;
3020	unsigned long flags;
3021	struct nes_hw_cqp *cqp = NULL;
3022	struct nes_cqp_request *cqp_request;
3023	struct nes_hw_cqp_wqe *cqp_wqe;
3024	u32 head;
3025	u32 cq_size;
3026	u32 cqe_count=0;
3027	u32 error_code;
3028	u32 opcode;
3029	u32 ctx_index;
3030	/* u32 counter; */
3031
3032	head = cq->cq_head;
3033	cq_size = cq->cq_size;
3034
3035	do {
3036		/* process the CQE */
3037		/* nes_debug(NES_DBG_CQP, "head=%u cqe_words=%08X\n", head,
3038			  le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX])); */
3039
3040		opcode = le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX]);
3041		if (opcode & NES_CQE_VALID) {
3042			cqp = &nesdev->cqp;
3043
3044			error_code = le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_CQE_ERROR_CODE_IDX]);
3045			if (error_code) {
3046				nes_debug(NES_DBG_CQP, "Bad Completion code for opcode 0x%02X from CQP,"
3047						" Major/Minor codes = 0x%04X:%04X.\n",
3048						le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX])&0x3f,
3049						(u16)(error_code >> 16),
3050						(u16)error_code);
3051			}
3052
3053			u64temp = (((u64)(le32_to_cpu(cq->cq_vbase[head].
3054					cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX]))) << 32) |
3055					((u64)(le32_to_cpu(cq->cq_vbase[head].
3056					cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX])));
3057
3058			cqp_request = (struct nes_cqp_request *)(unsigned long)u64temp;
3059			if (cqp_request) {
3060				if (cqp_request->waiting) {
3061					/* nes_debug(NES_DBG_CQP, "%s: Waking up requestor\n"); */
3062					cqp_request->major_code = (u16)(error_code >> 16);
3063					cqp_request->minor_code = (u16)error_code;
3064					barrier();
3065					cqp_request->request_done = 1;
3066					wake_up(&cqp_request->waitq);
3067					nes_put_cqp_request(nesdev, cqp_request);
3068				} else {
3069					if (cqp_request->callback)
3070						cqp_request->cqp_callback(nesdev, cqp_request);
3071					nes_free_cqp_request(nesdev, cqp_request);
3072				}
3073			} else {
3074				wake_up(&nesdev->cqp.waitq);
3075			}
3076
3077			cq->cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX] = 0;
3078			nes_write32(nesdev->regs + NES_CQE_ALLOC, cq->cq_number | (1 << 16));
3079			if (++cqp->sq_tail >= cqp->sq_size)
3080				cqp->sq_tail = 0;
3081
3082			/* Accounting... */
3083			cqe_count++;
3084			if (++head >= cq_size)
3085				head = 0;
3086		} else {
3087			break;
3088		}
3089	} while (1);
3090	cq->cq_head = head;
3091
3092	spin_lock_irqsave(&nesdev->cqp.lock, flags);
3093	while ((!list_empty(&nesdev->cqp_pending_reqs)) &&
3094			((((nesdev->cqp.sq_tail+nesdev->cqp.sq_size)-nesdev->cqp.sq_head) &
3095			(nesdev->cqp.sq_size - 1)) != 1)) {
3096		cqp_request = list_entry(nesdev->cqp_pending_reqs.next,
3097				struct nes_cqp_request, list);
3098		list_del_init(&cqp_request->list);
3099		head = nesdev->cqp.sq_head++;
3100		nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;
3101		cqp_wqe = &nesdev->cqp.sq_vbase[head];
3102		memcpy(cqp_wqe, &cqp_request->cqp_wqe, sizeof(*cqp_wqe));
3103		barrier();
3104
3105		opcode = cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX];
3106		if ((opcode & NES_CQP_OPCODE_MASK) == NES_CQP_DOWNLOAD_SEGMENT)
3107			ctx_index = NES_CQP_WQE_DL_COMP_CTX_LOW_IDX;
3108		else
3109			ctx_index = NES_CQP_WQE_COMP_CTX_LOW_IDX;
3110		cqp_wqe->wqe_words[ctx_index] =
3111			cpu_to_le32((u32)((unsigned long)cqp_request));
3112		cqp_wqe->wqe_words[ctx_index + 1] =
3113			cpu_to_le32((u32)(upper_32_bits((unsigned long)cqp_request)));
3114		nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) put on CQPs SQ wqe%u.\n",
3115				cqp_request, le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX])&0x3f, head);
3116		/* Ring doorbell (1 WQEs) */
3117		barrier();
3118		nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x01800000 | nesdev->cqp.qp_id);
3119	}
3120	spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
3121
3122	/* Arm the CCQ */
3123	nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
3124			cq->cq_number);
3125	nes_read32(nesdev->regs+NES_CQE_ALLOC);
3126}
3127
3128static u8 *locate_mpa(u8 *pkt, u32 aeq_info)
3129{
3130	if (aeq_info & NES_AEQE_Q2_DATA_ETHERNET) {
3131		/* skip over ethernet header */
3132		pkt += ETH_HLEN;
3133
3134		/* Skip over IP and TCP headers */
3135		pkt += 4 * (pkt[0] & 0x0f);
3136		pkt += 4 * ((pkt[12] >> 4) & 0x0f);
3137	}
3138	return pkt;
3139}
3140
3141/* Determine if incoming error pkt is rdma layer */
3142static u32 iwarp_opcode(struct nes_qp *nesqp, u32 aeq_info)
3143{
3144	u8 *pkt;
3145	u16 *mpa;
3146	u32 opcode = 0xffffffff;
3147
3148	if (aeq_info & NES_AEQE_Q2_DATA_WRITTEN) {
3149		pkt = nesqp->hwqp.q2_vbase + BAD_FRAME_OFFSET;
3150		mpa = (u16 *)locate_mpa(pkt, aeq_info);
3151		opcode = be16_to_cpu(mpa[1]) & 0xf;
3152	}
3153
3154	return opcode;
3155}
3156
3157/* Build iWARP terminate header */
3158static int nes_bld_terminate_hdr(struct nes_qp *nesqp, u16 async_event_id, u32 aeq_info)
3159{
3160	u8 *pkt = nesqp->hwqp.q2_vbase + BAD_FRAME_OFFSET;
3161	u16 ddp_seg_len;
3162	int copy_len = 0;
3163	u8 is_tagged = 0;
3164	u8 flush_code = 0;
3165	struct nes_terminate_hdr *termhdr;
3166
3167	termhdr = (struct nes_terminate_hdr *)nesqp->hwqp.q2_vbase;
3168	memset(termhdr, 0, 64);
3169
3170	if (aeq_info & NES_AEQE_Q2_DATA_WRITTEN) {
3171
3172		/* Use data from offending packet to fill in ddp & rdma hdrs */
3173		pkt = locate_mpa(pkt, aeq_info);
3174		ddp_seg_len = be16_to_cpu(*(u16 *)pkt);
3175		if (ddp_seg_len) {
3176			copy_len = 2;
3177			termhdr->hdrct = DDP_LEN_FLAG;
3178			if (pkt[2] & 0x80) {
3179				is_tagged = 1;
3180				if (ddp_seg_len >= TERM_DDP_LEN_TAGGED) {
3181					copy_len += TERM_DDP_LEN_TAGGED;
3182					termhdr->hdrct |= DDP_HDR_FLAG;
3183				}
3184			} else {
3185				if (ddp_seg_len >= TERM_DDP_LEN_UNTAGGED) {
3186					copy_len += TERM_DDP_LEN_UNTAGGED;
3187					termhdr->hdrct |= DDP_HDR_FLAG;
3188				}
3189
3190				if (ddp_seg_len >= (TERM_DDP_LEN_UNTAGGED + TERM_RDMA_LEN)) {
3191					if ((pkt[3] & RDMA_OPCODE_MASK) == RDMA_READ_REQ_OPCODE) {
3192						copy_len += TERM_RDMA_LEN;
3193						termhdr->hdrct |= RDMA_HDR_FLAG;
3194					}
3195				}
3196			}
3197		}
3198	}
3199
3200	switch (async_event_id) {
3201	case NES_AEQE_AEID_AMP_UNALLOCATED_STAG:
3202		switch (iwarp_opcode(nesqp, aeq_info)) {
3203		case IWARP_OPCODE_WRITE:
3204			flush_code = IB_WC_LOC_PROT_ERR;
3205			termhdr->layer_etype = (LAYER_DDP << 4) | DDP_TAGGED_BUFFER;
3206			termhdr->error_code = DDP_TAGGED_INV_STAG;
3207			break;
3208		default:
3209			flush_code = IB_WC_REM_ACCESS_ERR;
3210			termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3211			termhdr->error_code = RDMAP_INV_STAG;
3212		}
3213		break;
3214	case NES_AEQE_AEID_AMP_INVALID_STAG:
3215		flush_code = IB_WC_REM_ACCESS_ERR;
3216		termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3217		termhdr->error_code = RDMAP_INV_STAG;
3218		break;
3219	case NES_AEQE_AEID_AMP_BAD_QP:
3220		flush_code = IB_WC_LOC_QP_OP_ERR;
3221		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3222		termhdr->error_code = DDP_UNTAGGED_INV_QN;
3223		break;
3224	case NES_AEQE_AEID_AMP_BAD_STAG_KEY:
3225	case NES_AEQE_AEID_AMP_BAD_STAG_INDEX:
3226		switch (iwarp_opcode(nesqp, aeq_info)) {
3227		case IWARP_OPCODE_SEND_INV:
3228		case IWARP_OPCODE_SEND_SE_INV:
3229			flush_code = IB_WC_REM_OP_ERR;
3230			termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_OP;
3231			termhdr->error_code = RDMAP_CANT_INV_STAG;
3232			break;
3233		default:
3234			flush_code = IB_WC_REM_ACCESS_ERR;
3235			termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3236			termhdr->error_code = RDMAP_INV_STAG;
3237		}
3238		break;
3239	case NES_AEQE_AEID_AMP_BOUNDS_VIOLATION:
3240		if (aeq_info & (NES_AEQE_Q2_DATA_ETHERNET | NES_AEQE_Q2_DATA_MPA)) {
3241			flush_code = IB_WC_LOC_PROT_ERR;
3242			termhdr->layer_etype = (LAYER_DDP << 4) | DDP_TAGGED_BUFFER;
3243			termhdr->error_code = DDP_TAGGED_BOUNDS;
3244		} else {
3245			flush_code = IB_WC_REM_ACCESS_ERR;
3246			termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3247			termhdr->error_code = RDMAP_INV_BOUNDS;
3248		}
3249		break;
3250	case NES_AEQE_AEID_AMP_RIGHTS_VIOLATION:
3251	case NES_AEQE_AEID_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS:
3252	case NES_AEQE_AEID_PRIV_OPERATION_DENIED:
3253		flush_code = IB_WC_REM_ACCESS_ERR;
3254		termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3255		termhdr->error_code = RDMAP_ACCESS;
3256		break;
3257	case NES_AEQE_AEID_AMP_TO_WRAP:
3258		flush_code = IB_WC_REM_ACCESS_ERR;
3259		termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3260		termhdr->error_code = RDMAP_TO_WRAP;
3261		break;
3262	case NES_AEQE_AEID_AMP_BAD_PD:
3263		switch (iwarp_opcode(nesqp, aeq_info)) {
3264		case IWARP_OPCODE_WRITE:
3265			flush_code = IB_WC_LOC_PROT_ERR;
3266			termhdr->layer_etype = (LAYER_DDP << 4) | DDP_TAGGED_BUFFER;
3267			termhdr->error_code = DDP_TAGGED_UNASSOC_STAG;
3268			break;
3269		case IWARP_OPCODE_SEND_INV:
3270		case IWARP_OPCODE_SEND_SE_INV:
3271			flush_code = IB_WC_REM_ACCESS_ERR;
3272			termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3273			termhdr->error_code = RDMAP_CANT_INV_STAG;
3274			break;
3275		default:
3276			flush_code = IB_WC_REM_ACCESS_ERR;
3277			termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_PROT;
3278			termhdr->error_code = RDMAP_UNASSOC_STAG;
3279		}
3280		break;
3281	case NES_AEQE_AEID_LLP_RECEIVED_MARKER_AND_LENGTH_FIELDS_DONT_MATCH:
3282		flush_code = IB_WC_LOC_LEN_ERR;
3283		termhdr->layer_etype = (LAYER_MPA << 4) | DDP_LLP;
3284		termhdr->error_code = MPA_MARKER;
3285		break;
3286	case NES_AEQE_AEID_LLP_RECEIVED_MPA_CRC_ERROR:
3287		flush_code = IB_WC_GENERAL_ERR;
3288		termhdr->layer_etype = (LAYER_MPA << 4) | DDP_LLP;
3289		termhdr->error_code = MPA_CRC;
3290		break;
3291	case NES_AEQE_AEID_LLP_SEGMENT_TOO_LARGE:
3292	case NES_AEQE_AEID_LLP_SEGMENT_TOO_SMALL:
3293		flush_code = IB_WC_LOC_LEN_ERR;
3294		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_CATASTROPHIC;
3295		termhdr->error_code = DDP_CATASTROPHIC_LOCAL;
3296		break;
3297	case NES_AEQE_AEID_DDP_LCE_LOCAL_CATASTROPHIC:
3298	case NES_AEQE_AEID_DDP_NO_L_BIT:
3299		flush_code = IB_WC_FATAL_ERR;
3300		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_CATASTROPHIC;
3301		termhdr->error_code = DDP_CATASTROPHIC_LOCAL;
3302		break;
3303	case NES_AEQE_AEID_DDP_INVALID_MSN_GAP_IN_MSN:
3304	case NES_AEQE_AEID_DDP_INVALID_MSN_RANGE_IS_NOT_VALID:
3305		flush_code = IB_WC_GENERAL_ERR;
3306		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3307		termhdr->error_code = DDP_UNTAGGED_INV_MSN_RANGE;
3308		break;
3309	case NES_AEQE_AEID_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER:
3310		flush_code = IB_WC_LOC_LEN_ERR;
3311		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3312		termhdr->error_code = DDP_UNTAGGED_INV_TOO_LONG;
3313		break;
3314	case NES_AEQE_AEID_DDP_UBE_INVALID_DDP_VERSION:
3315		flush_code = IB_WC_GENERAL_ERR;
3316		if (is_tagged) {
3317			termhdr->layer_etype = (LAYER_DDP << 4) | DDP_TAGGED_BUFFER;
3318			termhdr->error_code = DDP_TAGGED_INV_DDP_VER;
3319		} else {
3320			termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3321			termhdr->error_code = DDP_UNTAGGED_INV_DDP_VER;
3322		}
3323		break;
3324	case NES_AEQE_AEID_DDP_UBE_INVALID_MO:
3325		flush_code = IB_WC_GENERAL_ERR;
3326		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3327		termhdr->error_code = DDP_UNTAGGED_INV_MO;
3328		break;
3329	case NES_AEQE_AEID_DDP_UBE_INVALID_MSN_NO_BUFFER_AVAILABLE:
3330		flush_code = IB_WC_REM_OP_ERR;
3331		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3332		termhdr->error_code = DDP_UNTAGGED_INV_MSN_NO_BUF;
3333		break;
3334	case NES_AEQE_AEID_DDP_UBE_INVALID_QN:
3335		flush_code = IB_WC_GENERAL_ERR;
3336		termhdr->layer_etype = (LAYER_DDP << 4) | DDP_UNTAGGED_BUFFER;
3337		termhdr->error_code = DDP_UNTAGGED_INV_QN;
3338		break;
3339	case NES_AEQE_AEID_RDMAP_ROE_INVALID_RDMAP_VERSION:
3340		flush_code = IB_WC_GENERAL_ERR;
3341		termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_OP;
3342		termhdr->error_code = RDMAP_INV_RDMAP_VER;
3343		break;
3344	case NES_AEQE_AEID_RDMAP_ROE_UNEXPECTED_OPCODE:
3345		flush_code = IB_WC_LOC_QP_OP_ERR;
3346		termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_OP;
3347		termhdr->error_code = RDMAP_UNEXPECTED_OP;
3348		break;
3349	default:
3350		flush_code = IB_WC_FATAL_ERR;
3351		termhdr->layer_etype = (LAYER_RDMA << 4) | RDMAP_REMOTE_OP;
3352		termhdr->error_code = RDMAP_UNSPECIFIED;
3353		break;
3354	}
3355
3356	if (copy_len)
3357		memcpy(termhdr + 1, pkt, copy_len);
3358
3359	if ((flush_code) && ((NES_AEQE_INBOUND_RDMA & aeq_info) == 0)) {
3360		if (aeq_info & NES_AEQE_SQ)
3361			nesqp->term_sq_flush_code = flush_code;
3362		else
3363			nesqp->term_rq_flush_code = flush_code;
3364	}
3365
3366	return sizeof(struct nes_terminate_hdr) + copy_len;
3367}
3368
3369static void nes_terminate_connection(struct nes_device *nesdev, struct nes_qp *nesqp,
3370		 struct nes_hw_aeqe *aeqe, enum ib_event_type eventtype)
3371{
3372	u64 context;
3373	unsigned long flags;
3374	u32 aeq_info;
3375	u16 async_event_id;
3376	u8 tcp_state;
3377	u8 iwarp_state;
3378	u32 termlen = 0;
3379	u32 mod_qp_flags = NES_CQP_QP_IWARP_STATE_TERMINATE |
3380			   NES_CQP_QP_TERM_DONT_SEND_FIN;
3381	struct nes_adapter *nesadapter = nesdev->nesadapter;
3382
3383	if (nesqp->term_flags & NES_TERM_SENT)
3384		return; /* Sanity check */
3385
3386	aeq_info = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]);
3387	tcp_state = (aeq_info & NES_AEQE_TCP_STATE_MASK) >> NES_AEQE_TCP_STATE_SHIFT;
3388	iwarp_state = (aeq_info & NES_AEQE_IWARP_STATE_MASK) >> NES_AEQE_IWARP_STATE_SHIFT;
3389	async_event_id = (u16)aeq_info;
3390
3391	context = (unsigned long)nesadapter->qp_table[le32_to_cpu(
3392		aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]) - NES_FIRST_QPN];
3393	if (!context) {
3394		WARN_ON(!context);
3395		return;
3396	}
3397
3398	nesqp = (struct nes_qp *)(unsigned long)context;
3399	spin_lock_irqsave(&nesqp->lock, flags);
3400	nesqp->hw_iwarp_state = iwarp_state;
3401	nesqp->hw_tcp_state = tcp_state;
3402	nesqp->last_aeq = async_event_id;
3403	nesqp->terminate_eventtype = eventtype;
3404	spin_unlock_irqrestore(&nesqp->lock, flags);
3405
3406	if (nesadapter->send_term_ok)
3407		termlen = nes_bld_terminate_hdr(nesqp, async_event_id, aeq_info);
3408	else
3409		mod_qp_flags |= NES_CQP_QP_TERM_DONT_SEND_TERM_MSG;
3410
3411	if (!nesdev->iw_status)  {
3412		nesqp->term_flags = NES_TERM_DONE;
3413		nes_hw_modify_qp(nesdev, nesqp, NES_CQP_QP_IWARP_STATE_ERROR, 0, 0);
3414		nes_cm_disconn(nesqp);
3415	} else {
3416		nes_terminate_start_timer(nesqp);
3417		nesqp->term_flags |= NES_TERM_SENT;
3418		nes_hw_modify_qp(nesdev, nesqp, mod_qp_flags, termlen, 0);
3419	}
3420}
3421
3422static void nes_terminate_send_fin(struct nes_device *nesdev,
3423			  struct nes_qp *nesqp, struct nes_hw_aeqe *aeqe)
3424{
3425	u32 aeq_info;
3426	u16 async_event_id;
3427	u8 tcp_state;
3428	u8 iwarp_state;
3429	unsigned long flags;
3430
3431	aeq_info = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]);
3432	tcp_state = (aeq_info & NES_AEQE_TCP_STATE_MASK) >> NES_AEQE_TCP_STATE_SHIFT;
3433	iwarp_state = (aeq_info & NES_AEQE_IWARP_STATE_MASK) >> NES_AEQE_IWARP_STATE_SHIFT;
3434	async_event_id = (u16)aeq_info;
3435
3436	spin_lock_irqsave(&nesqp->lock, flags);
3437	nesqp->hw_iwarp_state = iwarp_state;
3438	nesqp->hw_tcp_state = tcp_state;
3439	nesqp->last_aeq = async_event_id;
3440	spin_unlock_irqrestore(&nesqp->lock, flags);
3441
3442	/* Send the fin only */
3443	nes_hw_modify_qp(nesdev, nesqp, NES_CQP_QP_IWARP_STATE_TERMINATE |
3444		NES_CQP_QP_TERM_DONT_SEND_TERM_MSG, 0, 0);
3445}
3446
3447/* Cleanup after a terminate sent or received */
3448static void nes_terminate_done(struct nes_qp *nesqp, int timeout_occurred)
3449{
3450	u32 next_iwarp_state = NES_CQP_QP_IWARP_STATE_ERROR;
3451	unsigned long flags;
3452	struct nes_vnic *nesvnic = to_nesvnic(nesqp->ibqp.device);
3453	struct nes_device *nesdev = nesvnic->nesdev;
3454	u8 first_time = 0;
3455
3456	spin_lock_irqsave(&nesqp->lock, flags);
3457	if (nesqp->hte_added) {
3458		nesqp->hte_added = 0;
3459		next_iwarp_state |= NES_CQP_QP_DEL_HTE;
3460	}
3461
3462	first_time = (nesqp->term_flags & NES_TERM_DONE) == 0;
3463	nesqp->term_flags |= NES_TERM_DONE;
3464	spin_unlock_irqrestore(&nesqp->lock, flags);
3465
3466	/* Make sure we go through this only once */
3467	if (first_time) {
3468		if (timeout_occurred == 0)
3469			del_timer(&nesqp->terminate_timer);
3470		else
3471			next_iwarp_state |= NES_CQP_QP_RESET;
3472
3473		nes_hw_modify_qp(nesdev, nesqp, next_iwarp_state, 0, 0);
3474		nes_cm_disconn(nesqp);
3475	}
3476}
3477
3478static void nes_terminate_received(struct nes_device *nesdev,
3479				struct nes_qp *nesqp, struct nes_hw_aeqe *aeqe)
3480{
3481	u32 aeq_info;
3482	u8 *pkt;
3483	u32 *mpa;
3484	u8 ddp_ctl;
3485	u8 rdma_ctl;
3486	u16 aeq_id = 0;
3487
3488	aeq_info = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]);
3489	if (aeq_info & NES_AEQE_Q2_DATA_WRITTEN) {
3490		/* Terminate is not a performance path so the silicon */
3491		/* did not validate the frame - do it now */
3492		pkt = nesqp->hwqp.q2_vbase + BAD_FRAME_OFFSET;
3493		mpa = (u32 *)locate_mpa(pkt, aeq_info);
3494		ddp_ctl = (be32_to_cpu(mpa[0]) >> 8) & 0xff;
3495		rdma_ctl = be32_to_cpu(mpa[0]) & 0xff;
3496		if ((ddp_ctl & 0xc0) != 0x40)
3497			aeq_id = NES_AEQE_AEID_DDP_LCE_LOCAL_CATASTROPHIC;
3498		else if ((ddp_ctl & 0x03) != 1)
3499			aeq_id = NES_AEQE_AEID_DDP_UBE_INVALID_DDP_VERSION;
3500		else if (be32_to_cpu(mpa[2]) != 2)
3501			aeq_id = NES_AEQE_AEID_DDP_UBE_INVALID_QN;
3502		else if (be32_to_cpu(mpa[3]) != 1)
3503			aeq_id = NES_AEQE_AEID_DDP_INVALID_MSN_GAP_IN_MSN;
3504		else if (be32_to_cpu(mpa[4]) != 0)
3505			aeq_id = NES_AEQE_AEID_DDP_UBE_INVALID_MO;
3506		else if ((rdma_ctl & 0xc0) != 0x40)
3507			aeq_id = NES_AEQE_AEID_RDMAP_ROE_INVALID_RDMAP_VERSION;
3508
3509		if (aeq_id) {
3510			/* Bad terminate recvd - send back a terminate */
3511			aeq_info = (aeq_info & 0xffff0000) | aeq_id;
3512			aeqe->aeqe_words[NES_AEQE_MISC_IDX] = cpu_to_le32(aeq_info);
3513			nes_terminate_connection(nesdev, nesqp, aeqe, IB_EVENT_QP_FATAL);
3514			return;
3515		}
3516	}
3517
3518	nesqp->term_flags |= NES_TERM_RCVD;
3519	nesqp->terminate_eventtype = IB_EVENT_QP_FATAL;
3520	nes_terminate_start_timer(nesqp);
3521	nes_terminate_send_fin(nesdev, nesqp, aeqe);
3522}
3523
3524/* Timeout routine in case terminate fails to complete */
3525static void nes_terminate_timeout(unsigned long context)
3526{
3527	struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context;
3528
3529	nes_terminate_done(nesqp, 1);
3530}
3531
3532/* Set a timer in case hw cannot complete the terminate sequence */
3533static void nes_terminate_start_timer(struct nes_qp *nesqp)
3534{
3535	init_timer(&nesqp->terminate_timer);
3536	nesqp->terminate_timer.function = nes_terminate_timeout;
3537	nesqp->terminate_timer.expires = jiffies + HZ;
3538	nesqp->terminate_timer.data = (unsigned long)nesqp;
3539	add_timer(&nesqp->terminate_timer);
3540}
3541
3542/**
3543 * nes_process_iwarp_aeqe
3544 */
3545static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
3546				   struct nes_hw_aeqe *aeqe)
3547{
3548	u64 context;
3549	unsigned long flags;
3550	struct nes_qp *nesqp;
3551	struct nes_hw_cq *hw_cq;
3552	struct nes_cq *nescq;
3553	int resource_allocated;
3554	struct nes_adapter *nesadapter = nesdev->nesadapter;
3555	u32 aeq_info;
3556	u32 next_iwarp_state = 0;
3557	u32 aeqe_cq_id;
3558	u16 async_event_id;
3559	u8 tcp_state;
3560	u8 iwarp_state;
3561	struct ib_event ibevent;
3562
3563	nes_debug(NES_DBG_AEQ, "\n");
3564	aeq_info = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]);
3565	if ((NES_AEQE_INBOUND_RDMA & aeq_info) || (!(NES_AEQE_QP & aeq_info))) {
3566		context  = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX]);
3567		context += ((u64)le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_HIGH_IDX])) << 32;
3568	} else {
3569		context = (unsigned long)nesadapter->qp_table[le32_to_cpu(
3570						aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]) - NES_FIRST_QPN];
3571		BUG_ON(!context);
3572	}
3573
3574	/* context is nesqp unless async_event_id == CQ ERROR */
3575	nesqp = (struct nes_qp *)(unsigned long)context;
3576	async_event_id = (u16)aeq_info;
3577	tcp_state = (aeq_info & NES_AEQE_TCP_STATE_MASK) >> NES_AEQE_TCP_STATE_SHIFT;
3578	iwarp_state = (aeq_info & NES_AEQE_IWARP_STATE_MASK) >> NES_AEQE_IWARP_STATE_SHIFT;
3579	nes_debug(NES_DBG_AEQ, "aeid = 0x%04X, qp-cq id = %d, aeqe = %p,"
3580			" Tcp state = %s, iWARP state = %s\n",
3581			async_event_id,
3582			le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]), aeqe,
3583			nes_tcp_state_str[tcp_state], nes_iwarp_state_str[iwarp_state]);
3584
3585	aeqe_cq_id = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]);
3586	if (aeq_info & NES_AEQE_QP) {
3587		if (!nes_is_resource_allocated(nesadapter,
3588				nesadapter->allocated_qps,
3589				aeqe_cq_id))
3590			return;
3591	}
3592
3593	switch (async_event_id) {
3594		case NES_AEQE_AEID_LLP_FIN_RECEIVED:
3595			if (nesqp->term_flags)
3596				return; /* Ignore it, wait for close complete */
3597
3598			if (atomic_inc_return(&nesqp->close_timer_started) == 1) {
3599				if ((tcp_state == NES_AEQE_TCP_STATE_CLOSE_WAIT) &&
3600					(nesqp->ibqp_state == IB_QPS_RTS)) {
3601					spin_lock_irqsave(&nesqp->lock, flags);
3602					nesqp->hw_iwarp_state = iwarp_state;
3603					nesqp->hw_tcp_state = tcp_state;
3604					nesqp->last_aeq = async_event_id;
3605					next_iwarp_state = NES_CQP_QP_IWARP_STATE_CLOSING;
3606					nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_CLOSING;
3607					spin_unlock_irqrestore(&nesqp->lock, flags);
3608					nes_hw_modify_qp(nesdev, nesqp, next_iwarp_state, 0, 0);
3609					nes_cm_disconn(nesqp);
3610				}
3611				nesqp->cm_id->add_ref(nesqp->cm_id);
3612				schedule_nes_timer(nesqp->cm_node, (struct sk_buff *)nesqp,
3613						NES_TIMER_TYPE_CLOSE, 1, 0);
3614				nes_debug(NES_DBG_AEQ, "QP%u Not decrementing QP refcount (%d),"
3615						" need ae to finish up, original_last_aeq = 0x%04X."
3616						" last_aeq = 0x%04X, scheduling timer. TCP state = %d\n",
3617						nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3618						async_event_id, nesqp->last_aeq, tcp_state);
3619			}
3620			break;
3621		case NES_AEQE_AEID_LLP_CLOSE_COMPLETE:
3622			spin_lock_irqsave(&nesqp->lock, flags);
3623			nesqp->hw_iwarp_state = iwarp_state;
3624			nesqp->hw_tcp_state = tcp_state;
3625			nesqp->last_aeq = async_event_id;
3626			spin_unlock_irqrestore(&nesqp->lock, flags);
3627			nes_cm_disconn(nesqp);
3628			break;
3629
3630		case NES_AEQE_AEID_RESET_SENT:
3631			tcp_state = NES_AEQE_TCP_STATE_CLOSED;
3632			spin_lock_irqsave(&nesqp->lock, flags);
3633			nesqp->hw_iwarp_state = iwarp_state;
3634			nesqp->hw_tcp_state = tcp_state;
3635			nesqp->last_aeq = async_event_id;
3636			nesqp->hte_added = 0;
3637			spin_unlock_irqrestore(&nesqp->lock, flags);
3638			next_iwarp_state = NES_CQP_QP_IWARP_STATE_ERROR | NES_CQP_QP_DEL_HTE;
3639			nes_hw_modify_qp(nesdev, nesqp, next_iwarp_state, 0, 0);
3640			nes_cm_disconn(nesqp);
3641			break;
3642
3643		case NES_AEQE_AEID_LLP_CONNECTION_RESET:
3644			if (atomic_read(&nesqp->close_timer_started))
3645				return;
3646			spin_lock_irqsave(&nesqp->lock, flags);
3647			nesqp->hw_iwarp_state = iwarp_state;
3648			nesqp->hw_tcp_state = tcp_state;
3649			nesqp->last_aeq = async_event_id;
3650			spin_unlock_irqrestore(&nesqp->lock, flags);
3651			nes_cm_disconn(nesqp);
3652			break;
3653
3654		case NES_AEQE_AEID_TERMINATE_SENT:
3655			nes_terminate_send_fin(nesdev, nesqp, aeqe);
3656			break;
3657
3658		case NES_AEQE_AEID_LLP_TERMINATE_RECEIVED:
3659			nes_terminate_received(nesdev, nesqp, aeqe);
3660			break;
3661
3662		case NES_AEQE_AEID_AMP_BAD_STAG_KEY:
3663		case NES_AEQE_AEID_AMP_BAD_STAG_INDEX:
3664		case NES_AEQE_AEID_AMP_UNALLOCATED_STAG:
3665		case NES_AEQE_AEID_AMP_INVALID_STAG:
3666		case NES_AEQE_AEID_AMP_RIGHTS_VIOLATION:
3667		case NES_AEQE_AEID_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS:
3668		case NES_AEQE_AEID_PRIV_OPERATION_DENIED:
3669		case NES_AEQE_AEID_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER:
3670		case NES_AEQE_AEID_AMP_BOUNDS_VIOLATION:
3671		case NES_AEQE_AEID_AMP_TO_WRAP:
3672			printk(KERN_ERR PFX "QP[%u] async_event_id=0x%04X IB_EVENT_QP_ACCESS_ERR\n",
3673					nesqp->hwqp.qp_id, async_event_id);
3674			nes_terminate_connection(nesdev, nesqp, aeqe, IB_EVENT_QP_ACCESS_ERR);
3675			break;
3676
3677		case NES_AEQE_AEID_LLP_SEGMENT_TOO_LARGE:
3678		case NES_AEQE_AEID_LLP_SEGMENT_TOO_SMALL:
3679		case NES_AEQE_AEID_DDP_UBE_INVALID_MO:
3680		case NES_AEQE_AEID_DDP_UBE_INVALID_QN:
3681			if (iwarp_opcode(nesqp, aeq_info) > IWARP_OPCODE_TERM) {
3682				aeq_info &= 0xffff0000;
3683				aeq_info |= NES_AEQE_AEID_RDMAP_ROE_UNEXPECTED_OPCODE;
3684				aeqe->aeqe_words[NES_AEQE_MISC_IDX] = cpu_to_le32(aeq_info);
3685			}
3686
3687		case NES_AEQE_AEID_RDMAP_ROE_BAD_LLP_CLOSE:
3688		case NES_AEQE_AEID_LLP_TOO_MANY_RETRIES:
3689		case NES_AEQE_AEID_DDP_UBE_INVALID_MSN_NO_BUFFER_AVAILABLE:
3690		case NES_AEQE_AEID_LLP_RECEIVED_MPA_CRC_ERROR:
3691		case NES_AEQE_AEID_AMP_BAD_QP:
3692		case NES_AEQE_AEID_LLP_RECEIVED_MARKER_AND_LENGTH_FIELDS_DONT_MATCH:
3693		case NES_AEQE_AEID_DDP_LCE_LOCAL_CATASTROPHIC:
3694		case NES_AEQE_AEID_DDP_NO_L_BIT:
3695		case NES_AEQE_AEID_DDP_INVALID_MSN_GAP_IN_MSN:
3696		case NES_AEQE_AEID_DDP_INVALID_MSN_RANGE_IS_NOT_VALID:
3697		case NES_AEQE_AEID_DDP_UBE_INVALID_DDP_VERSION:
3698		case NES_AEQE_AEID_RDMAP_ROE_INVALID_RDMAP_VERSION:
3699		case NES_AEQE_AEID_RDMAP_ROE_UNEXPECTED_OPCODE:
3700		case NES_AEQE_AEID_AMP_BAD_PD:
3701		case NES_AEQE_AEID_AMP_FASTREG_SHARED:
3702		case NES_AEQE_AEID_AMP_FASTREG_VALID_STAG:
3703		case NES_AEQE_AEID_AMP_FASTREG_MW_STAG:
3704		case NES_AEQE_AEID_AMP_FASTREG_INVALID_RIGHTS:
3705		case NES_AEQE_AEID_AMP_FASTREG_PBL_TABLE_OVERFLOW:
3706		case NES_AEQE_AEID_AMP_FASTREG_INVALID_LENGTH:
3707		case NES_AEQE_AEID_AMP_INVALIDATE_SHARED:
3708		case NES_AEQE_AEID_AMP_INVALIDATE_MR_WITH_BOUND_WINDOWS:
3709		case NES_AEQE_AEID_AMP_MWBIND_VALID_STAG:
3710		case NES_AEQE_AEID_AMP_MWBIND_OF_MR_STAG:
3711		case NES_AEQE_AEID_AMP_MWBIND_TO_ZERO_BASED_STAG:
3712		case NES_AEQE_AEID_AMP_MWBIND_TO_MW_STAG:
3713		case NES_AEQE_AEID_AMP_MWBIND_INVALID_RIGHTS:
3714		case NES_AEQE_AEID_AMP_MWBIND_INVALID_BOUNDS:
3715		case NES_AEQE_AEID_AMP_MWBIND_TO_INVALID_PARENT:
3716		case NES_AEQE_AEID_AMP_MWBIND_BIND_DISABLED:
3717		case NES_AEQE_AEID_BAD_CLOSE:
3718		case NES_AEQE_AEID_RDMA_READ_WHILE_ORD_ZERO:
3719		case NES_AEQE_AEID_STAG_ZERO_INVALID:
3720		case NES_AEQE_AEID_ROE_INVALID_RDMA_READ_REQUEST:
3721		case NES_AEQE_AEID_ROE_INVALID_RDMA_WRITE_OR_READ_RESP:
3722			printk(KERN_ERR PFX "QP[%u] async_event_id=0x%04X IB_EVENT_QP_FATAL\n",
3723					nesqp->hwqp.qp_id, async_event_id);
3724			print_ip(nesqp->cm_node);
3725			if (!atomic_read(&nesqp->close_timer_started))
3726				nes_terminate_connection(nesdev, nesqp, aeqe, IB_EVENT_QP_FATAL);
3727			break;
3728
3729		case NES_AEQE_AEID_CQ_OPERATION_ERROR:
3730			context <<= 1;
3731			nes_debug(NES_DBG_AEQ, "Processing an NES_AEQE_AEID_CQ_OPERATION_ERROR event on CQ%u, %p\n",
3732					le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]), (void *)(unsigned long)context);
3733			resource_allocated = nes_is_resource_allocated(nesadapter, nesadapter->allocated_cqs,
3734					le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]));
3735			if (resource_allocated) {
3736				printk(KERN_ERR PFX "%s: Processing an NES_AEQE_AEID_CQ_OPERATION_ERROR event on CQ%u\n",
3737						__func__, le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]));
3738				hw_cq = (struct nes_hw_cq *)(unsigned long)context;
3739				if (hw_cq) {
3740					nescq = container_of(hw_cq, struct nes_cq, hw_cq);
3741					if (nescq->ibcq.event_handler) {
3742						ibevent.device = nescq->ibcq.device;
3743						ibevent.event = IB_EVENT_CQ_ERR;
3744						ibevent.element.cq = &nescq->ibcq;
3745						nescq->ibcq.event_handler(&ibevent, nescq->ibcq.cq_context);
3746					}
3747				}
3748			}
3749			break;
3750
3751		default:
3752			nes_debug(NES_DBG_AEQ, "Processing an iWARP related AE for QP, misc = 0x%04X\n",
3753					async_event_id);
3754			break;
3755	}
3756
3757}
3758
3759/**
3760 * nes_iwarp_ce_handler
3761 */
3762void nes_iwarp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *hw_cq)
3763{
3764	struct nes_cq *nescq = container_of(hw_cq, struct nes_cq, hw_cq);
3765
3766	/* nes_debug(NES_DBG_CQ, "Processing completion event for iWARP CQ%u.\n",
3767			nescq->hw_cq.cq_number); */
3768	nes_write32(nesdev->regs+NES_CQ_ACK, nescq->hw_cq.cq_number);
3769
3770	if (nescq->ibcq.comp_handler)
3771		nescq->ibcq.comp_handler(&nescq->ibcq, nescq->ibcq.cq_context);
3772
3773	return;
3774}
3775
3776
3777/**
3778 * nes_manage_apbvt()
3779 */
3780int nes_manage_apbvt(struct nes_vnic *nesvnic, u32 accel_local_port,
3781		u32 nic_index, u32 add_port)
3782{
3783	struct nes_device *nesdev = nesvnic->nesdev;
3784	struct nes_hw_cqp_wqe *cqp_wqe;
3785	struct nes_cqp_request *cqp_request;
3786	int ret = 0;
3787	u16 major_code;
3788
3789	/* Send manage APBVT request to CQP */
3790	cqp_request = nes_get_cqp_request(nesdev);
3791	if (cqp_request == NULL) {
3792		nes_debug(NES_DBG_QP, "Failed to get a cqp_request.\n");
3793		return -ENOMEM;
3794	}
3795	cqp_request->waiting = 1;
3796	cqp_wqe = &cqp_request->cqp_wqe;
3797
3798	nes_debug(NES_DBG_QP, "%s APBV for local port=%u(0x%04x), nic_index=%u\n",
3799			(add_port == NES_MANAGE_APBVT_ADD) ? "ADD" : "DEL",
3800			accel_local_port, accel_local_port, nic_index);
3801
3802	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
3803	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, (NES_CQP_MANAGE_APBVT |
3804			((add_port == NES_MANAGE_APBVT_ADD) ? NES_CQP_APBVT_ADD : 0)));
3805	set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
3806			((nic_index << NES_CQP_APBVT_NIC_SHIFT) | accel_local_port));
3807
3808	nes_debug(NES_DBG_QP, "Waiting for CQP completion for APBVT.\n");
3809
3810	atomic_set(&cqp_request->refcount, 2);
3811	nes_post_cqp_request(nesdev, cqp_request);
3812
3813	if (add_port == NES_MANAGE_APBVT_ADD)
3814		ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
3815				NES_EVENT_TIMEOUT);
3816	nes_debug(NES_DBG_QP, "Completed, ret=%u,  CQP Major:Minor codes = 0x%04X:0x%04X\n",
3817			ret, cqp_request->major_code, cqp_request->minor_code);
3818	major_code = cqp_request->major_code;
3819
3820	nes_put_cqp_request(nesdev, cqp_request);
3821
3822	if (!ret)
3823		return -ETIME;
3824	else if (major_code)
3825		return -EIO;
3826	else
3827		return 0;
3828}
3829
3830
3831/**
3832 * nes_manage_arp_cache
3833 */
3834void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr,
3835		u32 ip_addr, u32 action)
3836{
3837	struct nes_hw_cqp_wqe *cqp_wqe;
3838	struct nes_vnic *nesvnic = netdev_priv(netdev);
3839	struct nes_device *nesdev;
3840	struct nes_cqp_request *cqp_request;
3841	int arp_index;
3842
3843	nesdev = nesvnic->nesdev;
3844	arp_index = nes_arp_table(nesdev, ip_addr, mac_addr, action);
3845	if (arp_index == -1) {
3846		return;
3847	}
3848
3849	/* update the ARP entry */
3850	cqp_request = nes_get_cqp_request(nesdev);
3851	if (cqp_request == NULL) {
3852		nes_debug(NES_DBG_NETDEV, "Failed to get a cqp_request.\n");
3853		return;
3854	}
3855	cqp_request->waiting = 0;
3856	cqp_wqe = &cqp_request->cqp_wqe;
3857	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
3858
3859	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(
3860			NES_CQP_MANAGE_ARP_CACHE | NES_CQP_ARP_PERM);
3861	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] |= cpu_to_le32(
3862			(u32)PCI_FUNC(nesdev->pcidev->devfn) << NES_CQP_ARP_AEQ_INDEX_SHIFT);
3863	cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(arp_index);
3864
3865	if (action == NES_ARP_ADD) {
3866		cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] |= cpu_to_le32(NES_CQP_ARP_VALID);
3867		cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_ADDR_LOW_IDX] = cpu_to_le32(
3868				(((u32)mac_addr[2]) << 24) | (((u32)mac_addr[3]) << 16) |
3869				(((u32)mac_addr[4]) << 8)  | (u32)mac_addr[5]);
3870		cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = cpu_to_le32(
3871				(((u32)mac_addr[0]) << 16) | (u32)mac_addr[1]);
3872	} else {
3873		cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_ADDR_LOW_IDX] = 0;
3874		cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = 0;
3875	}
3876
3877	nes_debug(NES_DBG_NETDEV, "Not waiting for CQP, cqp.sq_head=%u, cqp.sq_tail=%u\n",
3878			nesdev->cqp.sq_head, nesdev->cqp.sq_tail);
3879
3880	atomic_set(&cqp_request->refcount, 1);
3881	nes_post_cqp_request(nesdev, cqp_request);
3882}
3883
3884
3885/**
3886 * flush_wqes
3887 */
3888void flush_wqes(struct nes_device *nesdev, struct nes_qp *nesqp,
3889		u32 which_wq, u32 wait_completion)
3890{
3891	struct nes_cqp_request *cqp_request;
3892	struct nes_hw_cqp_wqe *cqp_wqe;
3893	u32 sq_code = (NES_IWARP_CQE_MAJOR_FLUSH << 16) | NES_IWARP_CQE_MINOR_FLUSH;
3894	u32 rq_code = (NES_IWARP_CQE_MAJOR_FLUSH << 16) | NES_IWARP_CQE_MINOR_FLUSH;
3895	int ret;
3896
3897	cqp_request = nes_get_cqp_request(nesdev);
3898	if (cqp_request == NULL) {
3899		nes_debug(NES_DBG_QP, "Failed to get a cqp_request.\n");
3900		return;
3901	}
3902	if (wait_completion) {
3903		cqp_request->waiting = 1;
3904		atomic_set(&cqp_request->refcount, 2);
3905	} else {
3906		cqp_request->waiting = 0;
3907	}
3908	cqp_wqe = &cqp_request->cqp_wqe;
3909	nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
3910
3911	/* If wqe in error was identified, set code to be put into cqe */
3912	if ((nesqp->term_sq_flush_code) && (which_wq & NES_CQP_FLUSH_SQ)) {
3913		which_wq |= NES_CQP_FLUSH_MAJ_MIN;
3914		sq_code = (CQE_MAJOR_DRV << 16) | nesqp->term_sq_flush_code;
3915		nesqp->term_sq_flush_code = 0;
3916	}
3917
3918	if ((nesqp->term_rq_flush_code) && (which_wq & NES_CQP_FLUSH_RQ)) {
3919		which_wq |= NES_CQP_FLUSH_MAJ_MIN;
3920		rq_code = (CQE_MAJOR_DRV << 16) | nesqp->term_rq_flush_code;
3921		nesqp->term_rq_flush_code = 0;
3922	}
3923
3924	if (which_wq & NES_CQP_FLUSH_MAJ_MIN) {
3925		cqp_wqe->wqe_words[NES_CQP_QP_WQE_FLUSH_SQ_CODE] = cpu_to_le32(sq_code);
3926		cqp_wqe->wqe_words[NES_CQP_QP_WQE_FLUSH_RQ_CODE] = cpu_to_le32(rq_code);
3927	}
3928
3929	cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] =
3930			cpu_to_le32(NES_CQP_FLUSH_WQES | which_wq);
3931	cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(nesqp->hwqp.qp_id);
3932
3933	nes_post_cqp_request(nesdev, cqp_request);
3934
3935	if (wait_completion) {
3936		/* Wait for CQP */
3937		ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
3938				NES_EVENT_TIMEOUT);
3939		nes_debug(NES_DBG_QP, "Flush SQ QP WQEs completed, ret=%u,"
3940				" CQP Major:Minor codes = 0x%04X:0x%04X\n",
3941				ret, cqp_request->major_code, cqp_request->minor_code);
3942		nes_put_cqp_request(nesdev, cqp_request);
3943	}
3944}
3945