]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 26 Mar 2009 22:54:36 +0000 (15:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 26 Mar 2009 22:54:36 +0000 (15:54 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1750 commits)
  ixgbe: Allow Priority Flow Control settings to survive a device reset
  net: core: remove unneeded include in net/core/utils.c.
  e1000e: update version number
  e1000e: fix close interrupt race
  e1000e: fix loss of multicast packets
  e1000e: commonize tx cleanup routine to match e1000 & igb
  netfilter: fix nf_logger name in ebt_ulog.
  netfilter: fix warning in ebt_ulog init function.
  netfilter: fix warning about invalid const usage
  e1000: fix close race with interrupt
  e1000: cleanup clean_tx_irq routine so that it completely cleans ring
  e1000: fix tx hang detect logic and address dma mapping issues
  bridge: bad error handling when adding invalid ether address
  bonding: select current active slave when enslaving device for mode tlb and alb
  gianfar: reallocate skb when headroom is not enough for fcb
  Bump release date to 25Mar2009 and version to 0.22
  r6040: Fix second PHY address
  qeth: fix wait_event_timeout handling
  qeth: check for completion of a running recovery
  qeth: unregister MAC addresses during recovery.
  ...

Manually fixed up conflicts in:
drivers/infiniband/hw/cxgb3/cxio_hal.h
drivers/infiniband/hw/nes/nes_nic.c

1  2 
arch/arm/mach-orion5x/common.c
drivers/infiniband/hw/cxgb3/cxio_hal.c
drivers/infiniband/hw/cxgb3/cxio_hal.h
drivers/infiniband/hw/nes/nes_hw.c
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/ulp/ipoib/ipoib_main.c

index 1a1df24f419ef6f512b7f2bb24eaaeec6264e44c,8373736c24dde6cc49474d253f503ab9503fa452..68cc3efae56736a47894c4fd304e55d3f4126012
@@@ -31,7 -31,6 +31,7 @@@
  #include <plat/ehci-orion.h>
  #include <plat/mv_xor.h>
  #include <plat/orion_nand.h>
 +#include <plat/orion5x_wdt.h>
  #include <plat/time.h>
  #include "common.h"
  
@@@ -220,14 -219,17 +220,17 @@@ static struct platform_device orion5x_s
  
  void __init orion5x_eth_switch_init(struct dsa_platform_data *d, int irq)
  {
+       int i;
        if (irq != NO_IRQ) {
                orion5x_switch_resources[0].start = irq;
                orion5x_switch_resources[0].end = irq;
                orion5x_switch_device.num_resources = 1;
        }
  
-       d->mii_bus = &orion5x_eth_shared.dev;
        d->netdev = &orion5x_eth.dev;
+       for (i = 0; i < d->nr_chips; i++)
+               d->chip[i].mii_bus = &orion5x_eth_shared.dev;
        orion5x_switch_device.dev.platform_data = d;
  
        platform_device_register(&orion5x_switch_device);
@@@ -533,29 -535,6 +536,29 @@@ void __init orion5x_xor_init(void
  }
  
  
 +/*****************************************************************************
 + * Watchdog
 + ****************************************************************************/
 +static struct orion5x_wdt_platform_data orion5x_wdt_data = {
 +      .tclk                   = 0,
 +};
 +
 +static struct platform_device orion5x_wdt_device = {
 +      .name           = "orion5x_wdt",
 +      .id             = -1,
 +      .dev            = {
 +              .platform_data  = &orion5x_wdt_data,
 +      },
 +      .num_resources  = 0,
 +};
 +
 +void __init orion5x_wdt_init(void)
 +{
 +      orion5x_wdt_data.tclk = orion5x_tclk;
 +      platform_device_register(&orion5x_wdt_device);
 +}
 +
 +
  /*****************************************************************************
   * Time handling
   ****************************************************************************/
@@@ -655,11 -634,6 +658,11 @@@ void __init orion5x_init(void
                printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n");
                disable_hlt();
        }
 +
 +      /*
 +       * Register watchdog driver
 +       */
 +      orion5x_wdt_init();
  }
  
  /*
index d4d7204c11ede4aa52815e19beee228bd36e924e,11efd3528ce4e8e9943153c3914d45de3467e02e..a4a82bff71004a48ce39ce138bac27e683765d21
@@@ -450,7 -450,7 +450,7 @@@ static int cqe_completes_wr(struct t3_c
        if ((CQE_OPCODE(*cqe) == T3_READ_RESP) && SQ_TYPE(*cqe))
                return 0;
  
 -      if ((CQE_OPCODE(*cqe) == T3_SEND) && RQ_TYPE(*cqe) &&
 +      if (CQE_SEND_OPCODE(*cqe) && RQ_TYPE(*cqe) &&
            Q_EMPTY(wq->rq_rptr, wq->rq_wptr))
                return 0;
  
@@@ -701,6 -701,9 +701,9 @@@ static int __cxio_tpt_op(struct cxio_rd
        u32 stag_idx;
        u32 wptr;
  
+       if (rdev_p->flags)
+               return -EIO;
        stag_state = stag_state > 0;
        stag_idx = (*stag) >> 8;
  
@@@ -938,23 -941,6 +941,23 @@@ int cxio_rdev_open(struct cxio_rdev *rd
        if (!rdev_p->t3cdev_p)
                rdev_p->t3cdev_p = dev2t3cdev(netdev_p);
        rdev_p->t3cdev_p->ulp = (void *) rdev_p;
 +
 +      err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, GET_EMBEDDED_INFO,
 +                                       &(rdev_p->fw_info));
 +      if (err) {
 +              printk(KERN_ERR "%s t3cdev_p(%p)->ctl returned error %d.\n",
 +                   __func__, rdev_p->t3cdev_p, err);
 +              goto err1;
 +      }
 +      if (G_FW_VERSION_MAJOR(rdev_p->fw_info.fw_vers) != CXIO_FW_MAJ) {
 +              printk(KERN_ERR MOD "fatal firmware version mismatch: "
 +                     "need version %u but adapter has version %u\n",
 +                     CXIO_FW_MAJ,
 +                     G_FW_VERSION_MAJOR(rdev_p->fw_info.fw_vers));
 +              err = -EINVAL;
 +              goto err1;
 +      }
 +
        err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_GET_PARAMS,
                                         &(rdev_p->rnic_info));
        if (err) {
@@@ -1221,12 -1207,11 +1224,12 @@@ int cxio_poll_cq(struct t3_wq *wq, stru
                }
  
                /* incoming SEND with no receive posted failures */
 -              if ((CQE_OPCODE(*hw_cqe) == T3_SEND) && RQ_TYPE(*hw_cqe) &&
 +              if (CQE_SEND_OPCODE(*hw_cqe) && RQ_TYPE(*hw_cqe) &&
                    Q_EMPTY(wq->rq_rptr, wq->rq_wptr)) {
                        ret = -1;
                        goto skip_cqe;
                }
 +              BUG_ON((*cqe_flushed == 0) && !SW_CQE(*hw_cqe));
                goto proc_cqe;
        }
  
                 * then we complete this with TPT_ERR_MSN and mark the wq in
                 * error.
                 */
 +
 +              if (Q_EMPTY(wq->rq_rptr, wq->rq_wptr)) {
 +                      wq->error = 1;
 +                      ret = -1;
 +                      goto skip_cqe;
 +              }
 +
                if (unlikely((CQE_WRID_MSN(*hw_cqe) != (wq->rq_rptr + 1)))) {
                        wq->error = 1;
                        hw_cqe->header |= htonl(V_CQE_STATUS(TPT_ERR_MSN));
@@@ -1302,7 -1280,6 +1305,7 @@@ proc_cqe
                        cxio_hal_pblpool_free(wq->rdev,
                                wq->rq[Q_PTR2IDX(wq->rq_rptr,
                                wq->rq_size_log2)].pbl_addr, T3_STAG0_PBL_SIZE);
 +              BUG_ON(Q_EMPTY(wq->rq_rptr, wq->rq_wptr));
                wq->rq_rptr++;
        }
  
index e44dc22894717d2a82c90481bf933d8895f58520,9ed65b055171e331fda71fc32302de55106682c8..094a66d1480c1dea4e971178b269f22a8287a85b
@@@ -61,8 -61,6 +61,8 @@@
  
  #define T3_MAX_DEV_NAME_LEN 32
  
 +#define CXIO_FW_MAJ 7
 +
  struct cxio_hal_ctrl_qp {
        u32 wptr;
        u32 rptr;
@@@ -110,7 -108,8 +110,9 @@@ struct cxio_rdev 
        struct gen_pool *pbl_pool;
        struct gen_pool *rqt_pool;
        struct list_head entry;
 +      struct ch_embedded_info fw_info;
+       u32     flags;
+ #define       CXIO_ERROR_FATAL        1
  };
  
  static inline int cxio_num_stags(struct cxio_rdev *rdev_p)
index 9a51f25c6cee937fa5aeb75fa8745e6fda671fd2,53df9de23423bdcb9a96a7d4ea0992e6694bde43..52e734042b8e5bd2558be21e724ec54d7348b347
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Copyright (c) 2006 - 2008 NetEffect, Inc. All rights reserved.
 + * Copyright (c) 2006 - 2009 Intel-NE, Inc.  All rights reserved.
   *
   * This software is available to you under a choice of one of two
   * licenses.  You may choose to be licensed under the terms of the GNU
@@@ -254,7 -254,6 +254,7 @@@ struct nes_adapter *nes_init_adapter(st
        u32 adapter_size;
        u32 arp_table_size;
        u16 vendor_id;
 +      u16 device_id;
        u8  OneG_Mode;
        u8  func_index;
  
                return NULL;
        }
  
 +      nesadapter->vendor_id = (((u32) nesadapter->mac_addr_high) << 8) |
 +                              (nesadapter->mac_addr_low >> 24);
 +
 +      pci_bus_read_config_word(nesdev->pcidev->bus, nesdev->pcidev->devfn,
 +                               PCI_DEVICE_ID, &device_id);
 +      nesadapter->vendor_part_id = device_id;
 +
        if (nes_init_serdes(nesdev, hw_rev, port_count, nesadapter,
                                                        OneG_Mode)) {
                kfree(nesadapter);
@@@ -1644,6 -1636,7 +1644,6 @@@ int nes_init_nic_qp(struct nes_device *
        nesvnic->post_cqp_request = nes_post_cqp_request;
        nesvnic->mcrq_mcast_filter = NULL;
  
 -      spin_lock_init(&nesvnic->nic.sq_lock);
        spin_lock_init(&nesvnic->nic.rq_lock);
  
        /* setup the RQ */
@@@ -2268,8 -2261,6 +2268,8 @@@ static void nes_process_aeq(struct nes_
  
                if (++head >= aeq_size)
                        head = 0;
 +
 +              nes_write32(nesdev->regs + NES_AEQ_ALLOC, 1 << 16);
        }
        while (1);
        aeq->aeq_head = head;
@@@ -2550,7 -2541,7 +2550,7 @@@ static void nes_nic_napi_ce_handler(str
  {
        struct nes_vnic *nesvnic = container_of(cq, struct nes_vnic, nic_cq);
  
-       netif_rx_schedule(&nesvnic->napi);
+       napi_schedule(&nesvnic->napi);
  }
  
  
@@@ -2631,9 -2622,9 +2631,9 @@@ void nes_nic_ce_handler(struct nes_devi
                                                } else
                                                        break;
                                        }
 -                                      if (skb)
 -                                              dev_kfree_skb_any(skb);
                                }
 +                              if (skb)
 +                                      dev_kfree_skb_any(skb);
                                nesnic->sq_tail++;
                                nesnic->sq_tail &= nesnic->sq_size-1;
                                if (sq_cqes > 128) {
index 025ed9f7d9c2ff92fe45eea0f4ffd120ddc2f558,ae8c6888b533a8e244265c154b9b3f47b1f5c6d6..8d3e4c6f237eb8b341c681557d9c07e90fe0a5f5
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Copyright (c) 2006 - 2008 NetEffect, Inc. All rights reserved.
 + * Copyright (c) 2006 - 2009 Intel-NE, Inc.  All rights reserved.
   *
   * This software is available to you under a choice of one of two
   * licenses.  You may choose to be licensed under the terms of the GNU
@@@ -111,7 -111,7 +111,7 @@@ static int nes_netdev_poll(struct napi_
        nes_nic_ce_handler(nesdev, nescq);
  
        if (nescq->cqes_pending == 0) {
-               netif_rx_complete(napi);
+               napi_complete(napi);
                /* clear out completed cqes and arm */
                nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
                                nescq->cq_number | (nescq->cqe_allocs_pending << 16));
@@@ -400,7 -400,8 +400,7 @@@ static int nes_nic_send(struct sk_buff 
        if (skb_headlen(skb) == skb->len) {
                if (skb_headlen(skb) <= NES_FIRST_FRAG_SIZE) {
                        nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_2_1_IDX] = 0;
 -                      nesnic->tx_skb[nesnic->sq_head] = NULL;
 -                      dev_kfree_skb(skb);
 +                      nesnic->tx_skb[nesnic->sq_head] = skb;
                }
        } else {
                /* Deal with Fragments */
@@@ -452,6 -453,7 +452,6 @@@ static int nes_netdev_start_xmit(struc
        u32 wqe_count=1;
        u32 send_rc;
        struct iphdr *iph;
 -      unsigned long flags;
        __le16 *wqe_fragment_length;
        u32 nr_frags;
        u32 original_first_length;
        if (netif_queue_stopped(netdev))
                return NETDEV_TX_BUSY;
  
 -      local_irq_save(flags);
 -      if (!spin_trylock(&nesnic->sq_lock)) {
 -              local_irq_restore(flags);
 -              nesvnic->sq_locked++;
 -              return NETDEV_TX_LOCKED;
 -      }
 -
        /* Check if SQ is full */
        if ((((nesnic->sq_tail+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) == 1) {
                if (!netif_queue_stopped(netdev)) {
                        }
                }
                nesvnic->sq_full++;
 -              spin_unlock_irqrestore(&nesnic->sq_lock, flags);
                return NETDEV_TX_BUSY;
        }
  
@@@ -521,6 -531,7 +521,6 @@@ sq_no_longer_full
                                        }
                                }
                                nesvnic->sq_full++;
 -                              spin_unlock_irqrestore(&nesnic->sq_lock, flags);
                                nes_debug(NES_DBG_NIC_TX, "%s: HNIC SQ full- TSO request has too many frags!\n",
                                                netdev->name);
                                return NETDEV_TX_BUSY;
@@@ -645,13 -656,17 +645,13 @@@ tso_sq_no_longer_full
                        skb_set_transport_header(skb, hoffset);
                        skb_set_network_header(skb, nhoffset);
                        send_rc = nes_nic_send(skb, netdev);
 -                      if (send_rc != NETDEV_TX_OK) {
 -                              spin_unlock_irqrestore(&nesnic->sq_lock, flags);
 +                      if (send_rc != NETDEV_TX_OK)
                                return NETDEV_TX_OK;
 -                      }
                }
        } else {
                send_rc = nes_nic_send(skb, netdev);
 -              if (send_rc != NETDEV_TX_OK) {
 -                      spin_unlock_irqrestore(&nesnic->sq_lock, flags);
 +              if (send_rc != NETDEV_TX_OK)
                        return NETDEV_TX_OK;
 -              }
        }
  
        barrier();
                                (wqe_count << 24) | (1 << 23) | nesvnic->nic.qp_id);
  
        netdev->trans_start = jiffies;
 -      spin_unlock_irqrestore(&nesnic->sq_lock, flags);
  
        return NETDEV_TX_OK;
  }
@@@ -996,6 -1012,7 +996,6 @@@ static const char nes_ethtool_stringset
        "Pause Frames Received",
        "Internal Routing Errors",
        "SQ SW Dropped SKBs",
 -      "SQ Locked",
        "SQ Full",
        "Segmented TSO Requests",
        "Rx Symbol Errors",
@@@ -1112,17 -1129,16 +1112,17 @@@ static void nes_netdev_get_ethtool_stat
        struct nes_device *nesdev = nesvnic->nesdev;
        u32 nic_count;
        u32 u32temp;
 +      u32 index = 0;
  
        target_ethtool_stats->n_stats = NES_ETHTOOL_STAT_COUNT;
 -      target_stat_values[0] = nesvnic->nesdev->link_status_interrupts;
 -      target_stat_values[1] = nesvnic->linearized_skbs;
 -      target_stat_values[2] = nesvnic->tso_requests;
 +      target_stat_values[index] = nesvnic->nesdev->link_status_interrupts;
 +      target_stat_values[++index] = nesvnic->linearized_skbs;
 +      target_stat_values[++index] = nesvnic->tso_requests;
  
        u32temp = nes_read_indexed(nesdev,
                        NES_IDX_MAC_TX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200));
        nesvnic->nesdev->mac_pause_frames_sent += u32temp;
 -      target_stat_values[3] = nesvnic->nesdev->mac_pause_frames_sent;
 +      target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_sent;
  
        u32temp = nes_read_indexed(nesdev,
                        NES_IDX_MAC_RX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200));
                nesvnic->endnode_ipv4_tcp_retransmits += u32temp;
        }
  
 -      target_stat_values[4] = nesvnic->nesdev->mac_pause_frames_received;
 -      target_stat_values[5] = nesdev->nesadapter->nic_rx_eth_route_err;
 -      target_stat_values[6] = nesvnic->tx_sw_dropped;
 -      target_stat_values[7] = nesvnic->sq_locked;
 -      target_stat_values[8] = nesvnic->sq_full;
 -      target_stat_values[9] = nesvnic->segmented_tso_requests;
 -      target_stat_values[10] = nesvnic->nesdev->mac_rx_symbol_err_frames;
 -      target_stat_values[11] = nesvnic->nesdev->mac_rx_jabber_frames;
 -      target_stat_values[12] = nesvnic->nesdev->mac_rx_oversized_frames;
 -      target_stat_values[13] = nesvnic->nesdev->mac_rx_short_frames;
 -      target_stat_values[14] = nesvnic->endnode_nstat_rx_discard;
 -      target_stat_values[15] = nesvnic->endnode_nstat_rx_octets;
 -      target_stat_values[16] = nesvnic->endnode_nstat_rx_frames;
 -      target_stat_values[17] = nesvnic->endnode_nstat_tx_octets;
 -      target_stat_values[18] = nesvnic->endnode_nstat_tx_frames;
 -      target_stat_values[19] = mh_detected;
 -      target_stat_values[20] = mh_pauses_sent;
 -      target_stat_values[21] = nesvnic->endnode_ipv4_tcp_retransmits;
 -      target_stat_values[22] = atomic_read(&cm_connects);
 -      target_stat_values[23] = atomic_read(&cm_accepts);
 -      target_stat_values[24] = atomic_read(&cm_disconnects);
 -      target_stat_values[25] = atomic_read(&cm_connecteds);
 -      target_stat_values[26] = atomic_read(&cm_connect_reqs);
 -      target_stat_values[27] = atomic_read(&cm_rejects);
 -      target_stat_values[28] = atomic_read(&mod_qp_timouts);
 -      target_stat_values[29] = atomic_read(&qps_created);
 -      target_stat_values[30] = atomic_read(&sw_qps_destroyed);
 -      target_stat_values[31] = atomic_read(&qps_destroyed);
 -      target_stat_values[32] = atomic_read(&cm_closes);
 -      target_stat_values[33] = cm_packets_sent;
 -      target_stat_values[34] = cm_packets_bounced;
 -      target_stat_values[35] = cm_packets_created;
 -      target_stat_values[36] = cm_packets_received;
 -      target_stat_values[37] = cm_packets_dropped;
 -      target_stat_values[38] = cm_packets_retrans;
 -      target_stat_values[39] = cm_listens_created;
 -      target_stat_values[40] = cm_listens_destroyed;
 -      target_stat_values[41] = cm_backlog_drops;
 -      target_stat_values[42] = atomic_read(&cm_loopbacks);
 -      target_stat_values[43] = atomic_read(&cm_nodes_created);
 -      target_stat_values[44] = atomic_read(&cm_nodes_destroyed);
 -      target_stat_values[45] = atomic_read(&cm_accel_dropped_pkts);
 -      target_stat_values[46] = atomic_read(&cm_resets_recvd);
 -      target_stat_values[47] = int_mod_timer_init;
 -      target_stat_values[48] = int_mod_cq_depth_1;
 -      target_stat_values[49] = int_mod_cq_depth_4;
 -      target_stat_values[50] = int_mod_cq_depth_16;
 -      target_stat_values[51] = int_mod_cq_depth_24;
 -      target_stat_values[52] = int_mod_cq_depth_32;
 -      target_stat_values[53] = int_mod_cq_depth_128;
 -      target_stat_values[54] = int_mod_cq_depth_256;
 -      target_stat_values[55] = nesvnic->lro_mgr.stats.aggregated;
 -      target_stat_values[56] = nesvnic->lro_mgr.stats.flushed;
 -      target_stat_values[57] = nesvnic->lro_mgr.stats.no_desc;
 +      target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_received;
 +      target_stat_values[++index] = nesdev->nesadapter->nic_rx_eth_route_err;
 +      target_stat_values[++index] = nesvnic->tx_sw_dropped;
 +      target_stat_values[++index] = nesvnic->sq_full;
 +      target_stat_values[++index] = nesvnic->segmented_tso_requests;
 +      target_stat_values[++index] = nesvnic->nesdev->mac_rx_symbol_err_frames;
 +      target_stat_values[++index] = nesvnic->nesdev->mac_rx_jabber_frames;
 +      target_stat_values[++index] = nesvnic->nesdev->mac_rx_oversized_frames;
 +      target_stat_values[++index] = nesvnic->nesdev->mac_rx_short_frames;
 +      target_stat_values[++index] = nesvnic->endnode_nstat_rx_discard;
 +      target_stat_values[++index] = nesvnic->endnode_nstat_rx_octets;
 +      target_stat_values[++index] = nesvnic->endnode_nstat_rx_frames;
 +      target_stat_values[++index] = nesvnic->endnode_nstat_tx_octets;
 +      target_stat_values[++index] = nesvnic->endnode_nstat_tx_frames;
 +      target_stat_values[++index] = mh_detected;
 +      target_stat_values[++index] = mh_pauses_sent;
 +      target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits;
 +      target_stat_values[++index] = atomic_read(&cm_connects);
 +      target_stat_values[++index] = atomic_read(&cm_accepts);
 +      target_stat_values[++index] = atomic_read(&cm_disconnects);
 +      target_stat_values[++index] = atomic_read(&cm_connecteds);
 +      target_stat_values[++index] = atomic_read(&cm_connect_reqs);
 +      target_stat_values[++index] = atomic_read(&cm_rejects);
 +      target_stat_values[++index] = atomic_read(&mod_qp_timouts);
 +      target_stat_values[++index] = atomic_read(&qps_created);
 +      target_stat_values[++index] = atomic_read(&sw_qps_destroyed);
 +      target_stat_values[++index] = atomic_read(&qps_destroyed);
 +      target_stat_values[++index] = atomic_read(&cm_closes);
 +      target_stat_values[++index] = cm_packets_sent;
 +      target_stat_values[++index] = cm_packets_bounced;
 +      target_stat_values[++index] = cm_packets_created;
 +      target_stat_values[++index] = cm_packets_received;
 +      target_stat_values[++index] = cm_packets_dropped;
 +      target_stat_values[++index] = cm_packets_retrans;
 +      target_stat_values[++index] = cm_listens_created;
 +      target_stat_values[++index] = cm_listens_destroyed;
 +      target_stat_values[++index] = cm_backlog_drops;
 +      target_stat_values[++index] = atomic_read(&cm_loopbacks);
 +      target_stat_values[++index] = atomic_read(&cm_nodes_created);
 +      target_stat_values[++index] = atomic_read(&cm_nodes_destroyed);
 +      target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts);
 +      target_stat_values[++index] = atomic_read(&cm_resets_recvd);
 +      target_stat_values[++index] = int_mod_timer_init;
 +      target_stat_values[++index] = int_mod_cq_depth_1;
 +      target_stat_values[++index] = int_mod_cq_depth_4;
 +      target_stat_values[++index] = int_mod_cq_depth_16;
 +      target_stat_values[++index] = int_mod_cq_depth_24;
 +      target_stat_values[++index] = int_mod_cq_depth_32;
 +      target_stat_values[++index] = int_mod_cq_depth_128;
 +      target_stat_values[++index] = int_mod_cq_depth_256;
 +      target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated;
 +      target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed;
 +      target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc;
  
  }
  
@@@ -1551,6 -1568,19 +1551,19 @@@ static void nes_netdev_vlan_rx_register
        spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
  }
  
+ static const struct net_device_ops nes_netdev_ops = {
+       .ndo_open               = nes_netdev_open,
+       .ndo_stop               = nes_netdev_stop,
+       .ndo_start_xmit         = nes_netdev_start_xmit,
+       .ndo_get_stats          = nes_netdev_get_stats,
+       .ndo_tx_timeout         = nes_netdev_tx_timeout,
+       .ndo_set_mac_address    = nes_netdev_set_mac_address,
+       .ndo_set_multicast_list = nes_netdev_set_multicast_list,
+       .ndo_change_mtu         = nes_netdev_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_vlan_rx_register   = nes_netdev_vlan_rx_register,
+ };
  
  /**
   * nes_netdev_init - initialize network device
@@@ -1559,7 -1589,7 +1572,7 @@@ struct net_device *nes_netdev_init(stru
                void __iomem *mmio_addr)
  {
        u64 u64temp;
--      struct nes_vnic *nesvnic = NULL;
++      struct nes_vnic *nesvnic;
        struct net_device *netdev;
        struct nic_qp_map *curr_qp_map;
        u32 u32temp;
                printk(KERN_ERR PFX "nesvnic etherdev alloc failed");
                return NULL;
        }
++      nesvnic = netdev_priv(netdev);
  
        nes_debug(NES_DBG_INIT, "netdev = %p, %s\n", netdev, netdev->name);
  
        SET_NETDEV_DEV(netdev, &nesdev->pcidev->dev);
  
-       nesvnic = netdev_priv(netdev);
-       memset(nesvnic, 0, sizeof(*nesvnic));
-       netdev->open = nes_netdev_open;
-       netdev->stop = nes_netdev_stop;
-       netdev->hard_start_xmit = nes_netdev_start_xmit;
-       netdev->get_stats = nes_netdev_get_stats;
-       netdev->tx_timeout = nes_netdev_tx_timeout;
-       netdev->set_mac_address = nes_netdev_set_mac_address;
-       netdev->set_multicast_list = nes_netdev_set_multicast_list;
-       netdev->change_mtu = nes_netdev_change_mtu;
        netdev->watchdog_timeo = NES_TX_TIMEOUT;
        netdev->irq = nesdev->pcidev->irq;
        netdev->mtu = ETH_DATA_LEN;
        netdev->addr_len = ETH_ALEN;
        netdev->type = ARPHRD_ETHER;
        netdev->features = NETIF_F_HIGHDMA;
+       netdev->netdev_ops = &nes_netdev_ops;
        netdev->ethtool_ops = &nes_ethtool_ops;
        netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128);
        nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n");
        netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 +      netdev->vlan_rx_register = nes_netdev_vlan_rx_register;
+       netdev->features |= NETIF_F_LLTX;
  
        /* Fill in the port structure */
 -      nesvnic = netdev_priv(netdev);
        nesvnic->netdev = netdev;
        nesvnic->nesdev = nesdev;
        nesvnic->msg_enable = netif_msg_init(debug, default_msg);
index 353c13b91e8fb1115b62253ef6a40e69fcd67dfd,ca837b0a889ba9ef031d094e0c3375f6cb82d9e4..421a6640c9bd00918e5a3b2eb3d12fa403db51fd
@@@ -660,12 -660,8 +660,12 @@@ static void unicast_arp_send(struct sk_
  
        path = __path_find(dev, phdr->hwaddr + 4);
        if (!path || !path->valid) {
 -              if (!path)
 +              int new_path = 0;
 +
 +              if (!path) {
                        path = path_rec_create(dev, phdr->hwaddr + 4);
 +                      new_path = 1;
 +              }
                if (path) {
                        /* put pseudoheader back on for next time */
                        skb_push(skb, sizeof *phdr);
  
                        if (!path->query && path_rec_start(dev, path)) {
                                spin_unlock_irqrestore(&priv->lock, flags);
 -                              path_free(dev, path);
 +                              if (new_path)
 +                                      path_free(dev, path);
                                return;
                        } else
                                __path_add(dev, path);
@@@ -1021,18 -1016,22 +1021,22 @@@ static void ipoib_lro_setup(struct ipoi
        priv->lro.lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
  }
  
+ static const struct net_device_ops ipoib_netdev_ops = {
+       .ndo_open                = ipoib_open,
+       .ndo_stop                = ipoib_stop,
+       .ndo_change_mtu          = ipoib_change_mtu,
+       .ndo_start_xmit          = ipoib_start_xmit,
+       .ndo_tx_timeout          = ipoib_timeout,
+       .ndo_set_multicast_list  = ipoib_set_mcast_list,
+       .ndo_neigh_setup         = ipoib_neigh_setup_dev,
+ };
  static void ipoib_setup(struct net_device *dev)
  {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
  
-       dev->open                = ipoib_open;
-       dev->stop                = ipoib_stop;
-       dev->change_mtu          = ipoib_change_mtu;
-       dev->hard_start_xmit     = ipoib_start_xmit;
-       dev->tx_timeout          = ipoib_timeout;
+       dev->netdev_ops          = &ipoib_netdev_ops;
        dev->header_ops          = &ipoib_header_ops;
-       dev->set_multicast_list  = ipoib_set_mcast_list;
-       dev->neigh_setup         = ipoib_neigh_setup_dev;
  
        ipoib_set_ethtool_ops(dev);