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