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