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