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