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