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