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