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