linux/drivers/infiniband/hw/nes/nes_nic.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_arp.h>
  41#include <linux/if_vlan.h>
  42#include <linux/ethtool.h>
  43#include <linux/slab.h>
  44#include <net/tcp.h>
  45
  46#include <net/inet_common.h>
  47#include <linux/inet.h>
  48
  49#include "nes.h"
  50
  51static struct nic_qp_map nic_qp_mapping_0[] = {
  52        {16,0,0,1},{24,4,0,0},{28,8,0,0},{32,12,0,0},
  53        {20,2,2,1},{26,6,2,0},{30,10,2,0},{34,14,2,0},
  54        {18,1,1,1},{25,5,1,0},{29,9,1,0},{33,13,1,0},
  55        {22,3,3,1},{27,7,3,0},{31,11,3,0},{35,15,3,0}
  56};
  57
  58static struct nic_qp_map nic_qp_mapping_1[] = {
  59        {18,1,1,1},{25,5,1,0},{29,9,1,0},{33,13,1,0},
  60        {22,3,3,1},{27,7,3,0},{31,11,3,0},{35,15,3,0}
  61};
  62
  63static struct nic_qp_map nic_qp_mapping_2[] = {
  64        {20,2,2,1},{26,6,2,0},{30,10,2,0},{34,14,2,0}
  65};
  66
  67static struct nic_qp_map nic_qp_mapping_3[] = {
  68        {22,3,3,1},{27,7,3,0},{31,11,3,0},{35,15,3,0}
  69};
  70
  71static struct nic_qp_map nic_qp_mapping_4[] = {
  72        {28,8,0,0},{32,12,0,0}
  73};
  74
  75static struct nic_qp_map nic_qp_mapping_5[] = {
  76        {29,9,1,0},{33,13,1,0}
  77};
  78
  79static struct nic_qp_map nic_qp_mapping_6[] = {
  80        {30,10,2,0},{34,14,2,0}
  81};
  82
  83static struct nic_qp_map nic_qp_mapping_7[] = {
  84        {31,11,3,0},{35,15,3,0}
  85};
  86
  87static struct nic_qp_map *nic_qp_mapping_per_function[] = {
  88        nic_qp_mapping_0, nic_qp_mapping_1, nic_qp_mapping_2, nic_qp_mapping_3,
  89        nic_qp_mapping_4, nic_qp_mapping_5, nic_qp_mapping_6, nic_qp_mapping_7
  90};
  91
  92static const u32 default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK
  93                | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN;
  94static int debug = -1;
  95static int nics_per_function = 1;
  96
  97/**
  98 * nes_netdev_poll
  99 */
 100static int nes_netdev_poll(struct napi_struct *napi, int budget)
 101{
 102        struct nes_vnic *nesvnic = container_of(napi, struct nes_vnic, napi);
 103        struct nes_device *nesdev = nesvnic->nesdev;
 104        struct nes_hw_nic_cq *nescq = &nesvnic->nic_cq;
 105
 106        nesvnic->budget = budget;
 107        nescq->cqes_pending = 0;
 108        nescq->rx_cqes_completed = 0;
 109        nescq->cqe_allocs_pending = 0;
 110        nescq->rx_pkts_indicated = 0;
 111
 112        nes_nic_ce_handler(nesdev, nescq);
 113
 114        if (nescq->cqes_pending == 0) {
 115                napi_complete(napi);
 116                /* clear out completed cqes and arm */
 117                nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
 118                                nescq->cq_number | (nescq->cqe_allocs_pending << 16));
 119                nes_read32(nesdev->regs+NES_CQE_ALLOC);
 120        } else {
 121                /* clear out completed cqes but don't arm */
 122                nes_write32(nesdev->regs+NES_CQE_ALLOC,
 123                                nescq->cq_number | (nescq->cqe_allocs_pending << 16));
 124                nes_debug(NES_DBG_NETDEV, "%s: exiting with work pending\n",
 125                                nesvnic->netdev->name);
 126        }
 127        return nescq->rx_pkts_indicated;
 128}
 129
 130
 131/**
 132 * nes_netdev_open - Activate the network interface; ifconfig
 133 * ethx up.
 134 */
 135static int nes_netdev_open(struct net_device *netdev)
 136{
 137        u32 macaddr_low;
 138        u16 macaddr_high;
 139        struct nes_vnic *nesvnic = netdev_priv(netdev);
 140        struct nes_device *nesdev = nesvnic->nesdev;
 141        int ret;
 142        int i;
 143        struct nes_vnic *first_nesvnic = NULL;
 144        u32 nic_active_bit;
 145        u32 nic_active;
 146        struct list_head *list_pos, *list_temp;
 147        unsigned long flags;
 148
 149        assert(nesdev != NULL);
 150
 151        if (nesvnic->netdev_open == 1)
 152                return 0;
 153
 154        if (netif_msg_ifup(nesvnic))
 155                printk(KERN_INFO PFX "%s: enabling interface\n", netdev->name);
 156
 157        ret = nes_init_nic_qp(nesdev, netdev);
 158        if (ret) {
 159                return ret;
 160        }
 161
 162        netif_carrier_off(netdev);
 163        netif_stop_queue(netdev);
 164
 165        if ((!nesvnic->of_device_registered) && (nesvnic->rdma_enabled)) {
 166                nesvnic->nesibdev = nes_init_ofa_device(netdev);
 167                if (nesvnic->nesibdev == NULL) {
 168                        printk(KERN_ERR PFX "%s: nesvnic->nesibdev alloc failed", netdev->name);
 169                } else {
 170                        nesvnic->nesibdev->nesvnic = nesvnic;
 171                        ret = nes_register_ofa_device(nesvnic->nesibdev);
 172                        if (ret) {
 173                                printk(KERN_ERR PFX "%s: Unable to register RDMA device, ret = %d\n",
 174                                                netdev->name, ret);
 175                        }
 176                }
 177        }
 178        /* Set packet filters */
 179        nic_active_bit = 1 << nesvnic->nic_index;
 180        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_ACTIVE);
 181        nic_active |= nic_active_bit;
 182        nes_write_indexed(nesdev, NES_IDX_NIC_ACTIVE, nic_active);
 183        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE);
 184        nic_active |= nic_active_bit;
 185        nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE, nic_active);
 186        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON);
 187        nic_active |= nic_active_bit;
 188        nes_write_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON, nic_active);
 189
 190        macaddr_high  = ((u16)netdev->dev_addr[0]) << 8;
 191        macaddr_high += (u16)netdev->dev_addr[1];
 192
 193        macaddr_low   = ((u32)netdev->dev_addr[2]) << 24;
 194        macaddr_low  += ((u32)netdev->dev_addr[3]) << 16;
 195        macaddr_low  += ((u32)netdev->dev_addr[4]) << 8;
 196        macaddr_low  += (u32)netdev->dev_addr[5];
 197
 198        /* Program the various MAC regs */
 199        for (i = 0; i < NES_MAX_PORT_COUNT; i++) {
 200                if (nesvnic->qp_nic_index[i] == 0xf) {
 201                        break;
 202                }
 203                nes_debug(NES_DBG_NETDEV, "i=%d, perfect filter table index= %d, PERF FILTER LOW"
 204                                " (Addr:%08X) = %08X, HIGH = %08X.\n",
 205                                i, nesvnic->qp_nic_index[i],
 206                                NES_IDX_PERFECT_FILTER_LOW+
 207                                        (nesvnic->qp_nic_index[i] * 8),
 208                                macaddr_low,
 209                                (u32)macaddr_high | NES_MAC_ADDR_VALID |
 210                                ((((u32)nesvnic->nic_index) << 16)));
 211                nes_write_indexed(nesdev,
 212                                NES_IDX_PERFECT_FILTER_LOW + (nesvnic->qp_nic_index[i] * 8),
 213                                macaddr_low);
 214                nes_write_indexed(nesdev,
 215                                NES_IDX_PERFECT_FILTER_HIGH + (nesvnic->qp_nic_index[i] * 8),
 216                                (u32)macaddr_high | NES_MAC_ADDR_VALID |
 217                                ((((u32)nesvnic->nic_index) << 16)));
 218        }
 219
 220
 221        nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
 222                        nesvnic->nic_cq.cq_number);
 223        nes_read32(nesdev->regs+NES_CQE_ALLOC);
 224        list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
 225                first_nesvnic = container_of(list_pos, struct nes_vnic, list);
 226                if (first_nesvnic->netdev_open == 1)
 227                        break;
 228        }
 229        if (first_nesvnic->netdev_open == 0) {
 230                nes_debug(NES_DBG_INIT, "Setting up MAC interrupt mask.\n");
 231                nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK + (0x200 * nesdev->mac_index),
 232                                ~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
 233                                NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
 234                first_nesvnic = nesvnic;
 235        }
 236
 237        if (first_nesvnic->linkup) {
 238                /* Enable network packets */
 239                nesvnic->linkup = 1;
 240                netif_start_queue(netdev);
 241                netif_carrier_on(netdev);
 242        }
 243
 244        spin_lock_irqsave(&nesdev->nesadapter->phy_lock, flags);
 245        if (nesdev->nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_SFP_D) {
 246                nesdev->link_recheck = 1;
 247                mod_delayed_work(system_wq, &nesdev->work,
 248                                 NES_LINK_RECHECK_DELAY);
 249        }
 250        spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
 251
 252        spin_lock_irqsave(&nesvnic->port_ibevent_lock, flags);
 253        if (nesvnic->of_device_registered) {
 254                nesdev->nesadapter->send_term_ok = 1;
 255                if (nesvnic->linkup == 1) {
 256                        if (nesdev->iw_status == 0) {
 257                                nesdev->iw_status = 1;
 258                                nes_port_ibevent(nesvnic);
 259                        }
 260                } else {
 261                        nesdev->iw_status = 0;
 262                }
 263        }
 264        spin_unlock_irqrestore(&nesvnic->port_ibevent_lock, flags);
 265
 266        napi_enable(&nesvnic->napi);
 267        nesvnic->netdev_open = 1;
 268
 269        return 0;
 270}
 271
 272
 273/**
 274 * nes_netdev_stop
 275 */
 276static int nes_netdev_stop(struct net_device *netdev)
 277{
 278        struct nes_vnic *nesvnic = netdev_priv(netdev);
 279        struct nes_device *nesdev = nesvnic->nesdev;
 280        u32 nic_active_mask;
 281        u32 nic_active;
 282        struct nes_vnic *first_nesvnic = NULL;
 283        struct list_head *list_pos, *list_temp;
 284        unsigned long flags;
 285
 286        nes_debug(NES_DBG_SHUTDOWN, "nesvnic=%p, nesdev=%p, netdev=%p %s\n",
 287                        nesvnic, nesdev, netdev, netdev->name);
 288        if (nesvnic->netdev_open == 0)
 289                return 0;
 290
 291        if (netif_msg_ifdown(nesvnic))
 292                printk(KERN_INFO PFX "%s: disabling interface\n", netdev->name);
 293        netif_carrier_off(netdev);
 294
 295        /* Disable network packets */
 296        napi_disable(&nesvnic->napi);
 297        netif_stop_queue(netdev);
 298        list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
 299                first_nesvnic = container_of(list_pos, struct nes_vnic, list);
 300                if ((first_nesvnic->netdev_open == 1) && (first_nesvnic != nesvnic))
 301                        break;
 302        }
 303
 304        if ((first_nesvnic->netdev_open == 1) && (first_nesvnic != nesvnic)  &&
 305                (PCI_FUNC(first_nesvnic->nesdev->pcidev->devfn) !=
 306                PCI_FUNC(nesvnic->nesdev->pcidev->devfn))) {
 307                        nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK+
 308                                (0x200*nesdev->mac_index), 0xffffffff);
 309                        nes_write_indexed(first_nesvnic->nesdev,
 310                                NES_IDX_MAC_INT_MASK+
 311                                (0x200*first_nesvnic->nesdev->mac_index),
 312                        ~(NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT |
 313                        NES_MAC_INT_TX_UNDERFLOW | NES_MAC_INT_TX_ERROR));
 314        } else {
 315                nes_write_indexed(nesdev, NES_IDX_MAC_INT_MASK+(0x200*nesdev->mac_index), 0xffffffff);
 316        }
 317
 318        nic_active_mask = ~((u32)(1 << nesvnic->nic_index));
 319        nes_write_indexed(nesdev, NES_IDX_PERFECT_FILTER_HIGH+
 320                        (nesvnic->perfect_filter_index*8), 0);
 321        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_ACTIVE);
 322        nic_active &= nic_active_mask;
 323        nes_write_indexed(nesdev, NES_IDX_NIC_ACTIVE, nic_active);
 324        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
 325        nic_active &= nic_active_mask;
 326        nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
 327        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE);
 328        nic_active &= nic_active_mask;
 329        nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ENABLE, nic_active);
 330        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
 331        nic_active &= nic_active_mask;
 332        nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
 333        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON);
 334        nic_active &= nic_active_mask;
 335        nes_write_indexed(nesdev, NES_IDX_NIC_BROADCAST_ON, nic_active);
 336
 337        spin_lock_irqsave(&nesvnic->port_ibevent_lock, flags);
 338        if (nesvnic->of_device_registered) {
 339                nesdev->nesadapter->send_term_ok = 0;
 340                nesdev->iw_status = 0;
 341                if (nesvnic->linkup == 1)
 342                        nes_port_ibevent(nesvnic);
 343        }
 344        del_timer_sync(&nesvnic->event_timer);
 345        nesvnic->event_timer.function = NULL;
 346        spin_unlock_irqrestore(&nesvnic->port_ibevent_lock, flags);
 347
 348        nes_destroy_nic_qp(nesvnic);
 349
 350        nesvnic->netdev_open = 0;
 351
 352        return 0;
 353}
 354
 355
 356/**
 357 * nes_nic_send
 358 */
 359static bool nes_nic_send(struct sk_buff *skb, struct net_device *netdev)
 360{
 361        struct nes_vnic *nesvnic = netdev_priv(netdev);
 362        struct nes_device *nesdev = nesvnic->nesdev;
 363        struct nes_hw_nic *nesnic = &nesvnic->nic;
 364        struct nes_hw_nic_sq_wqe *nic_sqe;
 365        struct tcphdr *tcph;
 366        __le16 *wqe_fragment_length;
 367        u32 wqe_misc;
 368        u16 wqe_fragment_index = 1;     /* first fragment (0) is used by copy buffer */
 369        u16 skb_fragment_index;
 370        dma_addr_t bus_address;
 371
 372        nic_sqe = &nesnic->sq_vbase[nesnic->sq_head];
 373        wqe_fragment_length = (__le16 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX];
 374
 375        /* setup the VLAN tag if present */
 376        if (skb_vlan_tag_present(skb)) {
 377                nes_debug(NES_DBG_NIC_TX, "%s: VLAN packet to send... VLAN = %08X\n",
 378                                netdev->name, skb_vlan_tag_get(skb));
 379                wqe_misc = NES_NIC_SQ_WQE_TAGVALUE_ENABLE;
 380                wqe_fragment_length[0] = (__force __le16) skb_vlan_tag_get(skb);
 381        } else
 382                wqe_misc = 0;
 383
 384        /* bump past the vlan tag */
 385        wqe_fragment_length++;
 386        /*      wqe_fragment_address = (u64 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX]; */
 387        wqe_misc |= NES_NIC_SQ_WQE_COMPLETION;
 388
 389        if (skb->ip_summed == CHECKSUM_PARTIAL) {
 390                if (skb_is_gso(skb)) {
 391                        tcph = tcp_hdr(skb);
 392                        /* nes_debug(NES_DBG_NIC_TX, "%s: TSO request... is_gso = %u seg size = %u\n",
 393                                        netdev->name, skb_is_gso(skb), skb_shinfo(skb)->gso_size); */
 394                        wqe_misc |= NES_NIC_SQ_WQE_LSO_ENABLE | (u16)skb_shinfo(skb)->gso_size;
 395                        set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_LSO_INFO_IDX,
 396                                        ((u32)tcph->doff) |
 397                                        (((u32)(((unsigned char *)tcph) - skb->data)) << 4));
 398                }
 399        } else {        /* CHECKSUM_HW */
 400                wqe_misc |= NES_NIC_SQ_WQE_DISABLE_CHKSUM;
 401        }
 402
 403        set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_TOTAL_LENGTH_IDX,
 404                                skb->len);
 405        memcpy(&nesnic->first_frag_vbase[nesnic->sq_head].buffer,
 406                        skb->data, min(((unsigned int)NES_FIRST_FRAG_SIZE), skb_headlen(skb)));
 407        wqe_fragment_length[0] = cpu_to_le16(min(((unsigned int)NES_FIRST_FRAG_SIZE),
 408                        skb_headlen(skb)));
 409        wqe_fragment_length[1] = 0;
 410        if (skb_headlen(skb) > NES_FIRST_FRAG_SIZE) {
 411                if ((skb_shinfo(skb)->nr_frags + 1) > 4) {
 412                        nes_debug(NES_DBG_NIC_TX, "%s: Packet with %u fragments not sent, skb_headlen=%u\n",
 413                                        netdev->name, skb_shinfo(skb)->nr_frags + 2, skb_headlen(skb));
 414                        kfree_skb(skb);
 415                        nesvnic->tx_sw_dropped++;
 416                        return false;
 417                }
 418                set_bit(nesnic->sq_head, nesnic->first_frag_overflow);
 419                bus_address = pci_map_single(nesdev->pcidev, skb->data + NES_FIRST_FRAG_SIZE,
 420                                skb_headlen(skb) - NES_FIRST_FRAG_SIZE, PCI_DMA_TODEVICE);
 421                wqe_fragment_length[wqe_fragment_index++] =
 422                                cpu_to_le16(skb_headlen(skb) - NES_FIRST_FRAG_SIZE);
 423                wqe_fragment_length[wqe_fragment_index] = 0;
 424                set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG1_LOW_IDX,
 425                                ((u64)(bus_address)));
 426                nesnic->tx_skb[nesnic->sq_head] = skb;
 427        }
 428
 429        if (skb_headlen(skb) == skb->len) {
 430                if (skb_headlen(skb) <= NES_FIRST_FRAG_SIZE) {
 431                        nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_2_1_IDX] = 0;
 432                        nesnic->tx_skb[nesnic->sq_head] = skb;
 433                }
 434        } else {
 435                /* Deal with Fragments */
 436                nesnic->tx_skb[nesnic->sq_head] = skb;
 437                for (skb_fragment_index = 0; skb_fragment_index < skb_shinfo(skb)->nr_frags;
 438                                skb_fragment_index++) {
 439                        skb_frag_t *frag =
 440                                &skb_shinfo(skb)->frags[skb_fragment_index];
 441                        bus_address = skb_frag_dma_map(&nesdev->pcidev->dev,
 442                                                       frag, 0, skb_frag_size(frag),
 443                                                       DMA_TO_DEVICE);
 444                        wqe_fragment_length[wqe_fragment_index] =
 445                                        cpu_to_le16(skb_frag_size(&skb_shinfo(skb)->frags[skb_fragment_index]));
 446                        set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG0_LOW_IDX+(2*wqe_fragment_index),
 447                                bus_address);
 448                        wqe_fragment_index++;
 449                        if (wqe_fragment_index < 5)
 450                                wqe_fragment_length[wqe_fragment_index] = 0;
 451                }
 452        }
 453
 454        set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_MISC_IDX, wqe_misc);
 455        nesnic->sq_head++;
 456        nesnic->sq_head &= nesnic->sq_size - 1;
 457        return true;
 458}
 459
 460
 461/**
 462 * nes_netdev_start_xmit
 463 */
 464static int nes_netdev_start_xmit(struct sk_buff *skb, struct net_device *netdev)
 465{
 466        struct nes_vnic *nesvnic = netdev_priv(netdev);
 467        struct nes_device *nesdev = nesvnic->nesdev;
 468        struct nes_hw_nic *nesnic = &nesvnic->nic;
 469        struct nes_hw_nic_sq_wqe *nic_sqe;
 470        struct tcphdr *tcph;
 471        /* struct udphdr *udph; */
 472#define NES_MAX_TSO_FRAGS MAX_SKB_FRAGS
 473        /* 64K segment plus overflow on each side */
 474        dma_addr_t tso_bus_address[NES_MAX_TSO_FRAGS];
 475        dma_addr_t bus_address;
 476        u32 tso_frag_index;
 477        u32 tso_frag_count;
 478        u32 tso_wqe_length;
 479        u32 curr_tcp_seq;
 480        u32 wqe_count=1;
 481        struct iphdr *iph;
 482        __le16 *wqe_fragment_length;
 483        u32 nr_frags;
 484        u32 original_first_length;
 485        /* u64 *wqe_fragment_address; */
 486        /* first fragment (0) is used by copy buffer */
 487        u16 wqe_fragment_index=1;
 488        u16 hoffset;
 489        u16 nhoffset;
 490        u16 wqes_needed;
 491        u16 wqes_available;
 492        u32 wqe_misc;
 493
 494        /*
 495         * nes_debug(NES_DBG_NIC_TX, "%s Request to tx NIC packet length %u, headlen %u,"
 496         *              " (%u frags), tso_size=%u\n",
 497         *              netdev->name, skb->len, skb_headlen(skb),
 498         *              skb_shinfo(skb)->nr_frags, skb_is_gso(skb));
 499         */
 500
 501        if (netif_queue_stopped(netdev))
 502                return NETDEV_TX_BUSY;
 503
 504        /* Check if SQ is full */
 505        if ((((nesnic->sq_tail+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) == 1) {
 506                if (!netif_queue_stopped(netdev)) {
 507                        netif_stop_queue(netdev);
 508                        barrier();
 509                        if ((((((volatile u16)nesnic->sq_tail)+(nesnic->sq_size*2))-nesnic->sq_head) & (nesnic->sq_size - 1)) != 1) {
 510                                netif_start_queue(netdev);
 511                                goto sq_no_longer_full;
 512                        }
 513                }
 514                nesvnic->sq_full++;
 515                return NETDEV_TX_BUSY;
 516        }
 517
 518sq_no_longer_full:
 519        nr_frags = skb_shinfo(skb)->nr_frags;
 520        if (skb_headlen(skb) > NES_FIRST_FRAG_SIZE) {
 521                nr_frags++;
 522        }
 523        /* Check if too many fragments */
 524        if (unlikely((nr_frags > 4))) {
 525                if (skb_is_gso(skb)) {
 526                        nesvnic->segmented_tso_requests++;
 527                        nesvnic->tso_requests++;
 528                        /* Basically 4 fragments available per WQE with extended fragments */
 529                        wqes_needed = nr_frags >> 2;
 530                        wqes_needed += (nr_frags&3)?1:0;
 531                        wqes_available = (((nesnic->sq_tail+nesnic->sq_size)-nesnic->sq_head) - 1) &
 532                                        (nesnic->sq_size - 1);
 533
 534                        if (unlikely(wqes_needed > wqes_available)) {
 535                                if (!netif_queue_stopped(netdev)) {
 536                                        netif_stop_queue(netdev);
 537                                        barrier();
 538                                        wqes_available = (((((volatile u16)nesnic->sq_tail)+nesnic->sq_size)-nesnic->sq_head) - 1) &
 539                                                (nesnic->sq_size - 1);
 540                                        if (wqes_needed <= wqes_available) {
 541                                                netif_start_queue(netdev);
 542                                                goto tso_sq_no_longer_full;
 543                                        }
 544                                }
 545                                nesvnic->sq_full++;
 546                                nes_debug(NES_DBG_NIC_TX, "%s: HNIC SQ full- TSO request has too many frags!\n",
 547                                                netdev->name);
 548                                return NETDEV_TX_BUSY;
 549                        }
 550tso_sq_no_longer_full:
 551                        /* Map all the buffers */
 552                        for (tso_frag_count=0; tso_frag_count < skb_shinfo(skb)->nr_frags;
 553                                        tso_frag_count++) {
 554                                skb_frag_t *frag =
 555                                        &skb_shinfo(skb)->frags[tso_frag_count];
 556                                tso_bus_address[tso_frag_count] =
 557                                        skb_frag_dma_map(&nesdev->pcidev->dev,
 558                                                         frag, 0, skb_frag_size(frag),
 559                                                         DMA_TO_DEVICE);
 560                        }
 561
 562                        tso_frag_index = 0;
 563                        curr_tcp_seq = ntohl(tcp_hdr(skb)->seq);
 564                        hoffset = skb_transport_header(skb) - skb->data;
 565                        nhoffset = skb_network_header(skb) - skb->data;
 566                        original_first_length = hoffset + ((((struct tcphdr *)skb_transport_header(skb))->doff)<<2);
 567
 568                        for (wqe_count=0; wqe_count<((u32)wqes_needed); wqe_count++) {
 569                                tso_wqe_length = 0;
 570                                nic_sqe = &nesnic->sq_vbase[nesnic->sq_head];
 571                                wqe_fragment_length =
 572                                                (__le16 *)&nic_sqe->wqe_words[NES_NIC_SQ_WQE_LENGTH_0_TAG_IDX];
 573                                /* setup the VLAN tag if present */
 574                                if (skb_vlan_tag_present(skb)) {
 575                                        nes_debug(NES_DBG_NIC_TX, "%s: VLAN packet to send... VLAN = %08X\n",
 576                                                        netdev->name,
 577                                                  skb_vlan_tag_get(skb));
 578                                        wqe_misc = NES_NIC_SQ_WQE_TAGVALUE_ENABLE;
 579                                        wqe_fragment_length[0] = (__force __le16) skb_vlan_tag_get(skb);
 580                                } else
 581                                        wqe_misc = 0;
 582
 583                                /* bump past the vlan tag */
 584                                wqe_fragment_length++;
 585
 586                                /* Assumes header totally fits in allocated buffer and is in first fragment */
 587                                if (original_first_length > NES_FIRST_FRAG_SIZE) {
 588                                        nes_debug(NES_DBG_NIC_TX, "ERROR: SKB header too big, headlen=%u, FIRST_FRAG_SIZE=%u\n",
 589                                                        original_first_length, NES_FIRST_FRAG_SIZE);
 590                                        nes_debug(NES_DBG_NIC_TX, "%s Request to tx NIC packet length %u, headlen %u,"
 591                                                        " (%u frags), is_gso = %u tso_size=%u\n",
 592                                                        netdev->name,
 593                                                        skb->len, skb_headlen(skb),
 594                                                        skb_shinfo(skb)->nr_frags, skb_is_gso(skb), skb_shinfo(skb)->gso_size);
 595                                }
 596                                memcpy(&nesnic->first_frag_vbase[nesnic->sq_head].buffer,
 597                                                skb->data, min(((unsigned int)NES_FIRST_FRAG_SIZE),
 598                                                original_first_length));
 599                                iph = (struct iphdr *)
 600                                (&nesnic->first_frag_vbase[nesnic->sq_head].buffer[nhoffset]);
 601                                tcph = (struct tcphdr *)
 602                                (&nesnic->first_frag_vbase[nesnic->sq_head].buffer[hoffset]);
 603                                if ((wqe_count+1)!=(u32)wqes_needed) {
 604                                        tcph->fin = 0;
 605                                        tcph->psh = 0;
 606                                        tcph->rst = 0;
 607                                        tcph->urg = 0;
 608                                }
 609                                if (wqe_count) {
 610                                        tcph->syn = 0;
 611                                }
 612                                tcph->seq = htonl(curr_tcp_seq);
 613                                wqe_fragment_length[0] = cpu_to_le16(min(((unsigned int)NES_FIRST_FRAG_SIZE),
 614                                                original_first_length));
 615
 616                                wqe_fragment_index = 1;
 617                                if ((wqe_count==0) && (skb_headlen(skb) > original_first_length)) {
 618                                        set_bit(nesnic->sq_head, nesnic->first_frag_overflow);
 619                                        bus_address = pci_map_single(nesdev->pcidev, skb->data + original_first_length,
 620                                                        skb_headlen(skb) - original_first_length, PCI_DMA_TODEVICE);
 621                                        wqe_fragment_length[wqe_fragment_index++] =
 622                                                cpu_to_le16(skb_headlen(skb) - original_first_length);
 623                                        wqe_fragment_length[wqe_fragment_index] = 0;
 624                                        set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG1_LOW_IDX,
 625                                                                        bus_address);
 626                                        tso_wqe_length += skb_headlen(skb) -
 627                                                        original_first_length;
 628                                }
 629                                while (wqe_fragment_index < 5) {
 630                                        wqe_fragment_length[wqe_fragment_index] =
 631                                                        cpu_to_le16(skb_frag_size(&skb_shinfo(skb)->frags[tso_frag_index]));
 632                                        set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG0_LOW_IDX+(2*wqe_fragment_index),
 633                                                (u64)tso_bus_address[tso_frag_index]);
 634                                        wqe_fragment_index++;
 635                                        tso_wqe_length += skb_frag_size(&skb_shinfo(skb)->frags[tso_frag_index++]);
 636                                        if (wqe_fragment_index < 5)
 637                                                wqe_fragment_length[wqe_fragment_index] = 0;
 638                                        if (tso_frag_index == tso_frag_count)
 639                                                break;
 640                                }
 641                                if ((wqe_count+1) == (u32)wqes_needed) {
 642                                        nesnic->tx_skb[nesnic->sq_head] = skb;
 643                                } else {
 644                                        nesnic->tx_skb[nesnic->sq_head] = NULL;
 645                                }
 646                                wqe_misc |= NES_NIC_SQ_WQE_COMPLETION | (u16)skb_shinfo(skb)->gso_size;
 647                                if ((tso_wqe_length + original_first_length) > skb_shinfo(skb)->gso_size) {
 648                                        wqe_misc |= NES_NIC_SQ_WQE_LSO_ENABLE;
 649                                } else {
 650                                        iph->tot_len = htons(tso_wqe_length + original_first_length - nhoffset);
 651                                }
 652
 653                                set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_MISC_IDX,
 654                                                 wqe_misc);
 655                                set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_LSO_INFO_IDX,
 656                                                ((u32)tcph->doff) | (((u32)hoffset) << 4));
 657
 658                                set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_TOTAL_LENGTH_IDX,
 659                                                tso_wqe_length + original_first_length);
 660                                curr_tcp_seq += tso_wqe_length;
 661                                nesnic->sq_head++;
 662                                nesnic->sq_head &= nesnic->sq_size-1;
 663                        }
 664                } else {
 665                        hoffset = skb_transport_header(skb) - skb->data;
 666                        nhoffset = skb_network_header(skb) - skb->data;
 667                        if (skb_linearize(skb)) {
 668                                nesvnic->tx_sw_dropped++;
 669                                kfree_skb(skb);
 670                                return NETDEV_TX_OK;
 671                        }
 672                        nesvnic->linearized_skbs++;
 673                        skb_set_transport_header(skb, hoffset);
 674                        skb_set_network_header(skb, nhoffset);
 675                        if (!nes_nic_send(skb, netdev))
 676                                return NETDEV_TX_OK;
 677                }
 678        } else {
 679                if (!nes_nic_send(skb, netdev))
 680                        return NETDEV_TX_OK;
 681        }
 682
 683        barrier();
 684
 685        if (wqe_count)
 686                nes_write32(nesdev->regs+NES_WQE_ALLOC,
 687                                (wqe_count << 24) | (1 << 23) | nesvnic->nic.qp_id);
 688
 689        netif_trans_update(netdev);
 690
 691        return NETDEV_TX_OK;
 692}
 693
 694
 695/**
 696 * nes_netdev_get_stats
 697 */
 698static struct net_device_stats *nes_netdev_get_stats(struct net_device *netdev)
 699{
 700        struct nes_vnic *nesvnic = netdev_priv(netdev);
 701        struct nes_device *nesdev = nesvnic->nesdev;
 702        u64 u64temp;
 703        u32 u32temp;
 704
 705        u32temp = nes_read_indexed(nesdev,
 706                        NES_IDX_ENDNODE0_NSTAT_RX_DISCARD + (nesvnic->nic_index*0x200));
 707        nesvnic->netstats.rx_dropped += u32temp;
 708        nesvnic->endnode_nstat_rx_discard += u32temp;
 709
 710        u64temp = (u64)nes_read_indexed(nesdev,
 711                        NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_LO + (nesvnic->nic_index*0x200));
 712        u64temp += ((u64)nes_read_indexed(nesdev,
 713                        NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_HI + (nesvnic->nic_index*0x200))) << 32;
 714
 715        nesvnic->endnode_nstat_rx_octets += u64temp;
 716        nesvnic->netstats.rx_bytes += u64temp;
 717
 718        u64temp = (u64)nes_read_indexed(nesdev,
 719                        NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_LO + (nesvnic->nic_index*0x200));
 720        u64temp += ((u64)nes_read_indexed(nesdev,
 721                        NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_HI + (nesvnic->nic_index*0x200))) << 32;
 722
 723        nesvnic->endnode_nstat_rx_frames += u64temp;
 724        nesvnic->netstats.rx_packets += u64temp;
 725
 726        u64temp = (u64)nes_read_indexed(nesdev,
 727                        NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_LO + (nesvnic->nic_index*0x200));
 728        u64temp += ((u64)nes_read_indexed(nesdev,
 729                        NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI + (nesvnic->nic_index*0x200))) << 32;
 730
 731        nesvnic->endnode_nstat_tx_octets += u64temp;
 732        nesvnic->netstats.tx_bytes += u64temp;
 733
 734        u64temp = (u64)nes_read_indexed(nesdev,
 735                        NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO + (nesvnic->nic_index*0x200));
 736        u64temp += ((u64)nes_read_indexed(nesdev,
 737                        NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI + (nesvnic->nic_index*0x200))) << 32;
 738
 739        nesvnic->endnode_nstat_tx_frames += u64temp;
 740        nesvnic->netstats.tx_packets += u64temp;
 741
 742        u32temp = nes_read_indexed(nesdev,
 743                        NES_IDX_MAC_RX_SHORT_FRAMES + (nesvnic->nesdev->mac_index*0x200));
 744        nesvnic->netstats.rx_dropped += u32temp;
 745        nesvnic->nesdev->mac_rx_errors += u32temp;
 746        nesvnic->nesdev->mac_rx_short_frames += u32temp;
 747
 748        u32temp = nes_read_indexed(nesdev,
 749                        NES_IDX_MAC_RX_OVERSIZED_FRAMES + (nesvnic->nesdev->mac_index*0x200));
 750        nesvnic->netstats.rx_dropped += u32temp;
 751        nesvnic->nesdev->mac_rx_errors += u32temp;
 752        nesvnic->nesdev->mac_rx_oversized_frames += u32temp;
 753
 754        u32temp = nes_read_indexed(nesdev,
 755                        NES_IDX_MAC_RX_JABBER_FRAMES + (nesvnic->nesdev->mac_index*0x200));
 756        nesvnic->netstats.rx_dropped += u32temp;
 757        nesvnic->nesdev->mac_rx_errors += u32temp;
 758        nesvnic->nesdev->mac_rx_jabber_frames += u32temp;
 759
 760        u32temp = nes_read_indexed(nesdev,
 761                        NES_IDX_MAC_RX_SYMBOL_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
 762        nesvnic->netstats.rx_dropped += u32temp;
 763        nesvnic->nesdev->mac_rx_errors += u32temp;
 764        nesvnic->nesdev->mac_rx_symbol_err_frames += u32temp;
 765
 766        u32temp = nes_read_indexed(nesdev,
 767                        NES_IDX_MAC_RX_LENGTH_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
 768        nesvnic->netstats.rx_length_errors += u32temp;
 769        nesvnic->nesdev->mac_rx_errors += u32temp;
 770
 771        u32temp = nes_read_indexed(nesdev,
 772                        NES_IDX_MAC_RX_CRC_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
 773        nesvnic->nesdev->mac_rx_errors += u32temp;
 774        nesvnic->nesdev->mac_rx_crc_errors += u32temp;
 775        nesvnic->netstats.rx_crc_errors += u32temp;
 776
 777        u32temp = nes_read_indexed(nesdev,
 778                        NES_IDX_MAC_TX_ERRORS + (nesvnic->nesdev->mac_index*0x200));
 779        nesvnic->nesdev->mac_tx_errors += u32temp;
 780        nesvnic->netstats.tx_errors += u32temp;
 781
 782        return &nesvnic->netstats;
 783}
 784
 785
 786/**
 787 * nes_netdev_tx_timeout
 788 */
 789static void nes_netdev_tx_timeout(struct net_device *netdev)
 790{
 791        struct nes_vnic *nesvnic = netdev_priv(netdev);
 792
 793        if (netif_msg_timer(nesvnic))
 794                nes_debug(NES_DBG_NIC_TX, "%s: tx timeout\n", netdev->name);
 795}
 796
 797
 798/**
 799 * nes_netdev_set_mac_address
 800 */
 801static int nes_netdev_set_mac_address(struct net_device *netdev, void *p)
 802{
 803        struct nes_vnic *nesvnic = netdev_priv(netdev);
 804        struct nes_device *nesdev = nesvnic->nesdev;
 805        struct sockaddr *mac_addr = p;
 806        int i;
 807        u32 macaddr_low;
 808        u16 macaddr_high;
 809
 810        if (!is_valid_ether_addr(mac_addr->sa_data))
 811                return -EADDRNOTAVAIL;
 812
 813        memcpy(netdev->dev_addr, mac_addr->sa_data, netdev->addr_len);
 814        printk(PFX "%s: Address length = %d, Address = %pM\n",
 815               __func__, netdev->addr_len, mac_addr->sa_data);
 816        macaddr_high  = ((u16)netdev->dev_addr[0]) << 8;
 817        macaddr_high += (u16)netdev->dev_addr[1];
 818        macaddr_low   = ((u32)netdev->dev_addr[2]) << 24;
 819        macaddr_low  += ((u32)netdev->dev_addr[3]) << 16;
 820        macaddr_low  += ((u32)netdev->dev_addr[4]) << 8;
 821        macaddr_low  += (u32)netdev->dev_addr[5];
 822
 823        for (i = 0; i < NES_MAX_PORT_COUNT; i++) {
 824                if (nesvnic->qp_nic_index[i] == 0xf) {
 825                        break;
 826                }
 827                nes_write_indexed(nesdev,
 828                                NES_IDX_PERFECT_FILTER_LOW + (nesvnic->qp_nic_index[i] * 8),
 829                                macaddr_low);
 830                nes_write_indexed(nesdev,
 831                                NES_IDX_PERFECT_FILTER_HIGH + (nesvnic->qp_nic_index[i] * 8),
 832                                (u32)macaddr_high | NES_MAC_ADDR_VALID |
 833                                ((((u32)nesvnic->nic_index) << 16)));
 834        }
 835        return 0;
 836}
 837
 838
 839static void set_allmulti(struct nes_device *nesdev, u32 nic_active_bit)
 840{
 841        u32 nic_active;
 842
 843        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
 844        nic_active |= nic_active_bit;
 845        nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
 846        nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
 847        nic_active &= ~nic_active_bit;
 848        nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
 849}
 850
 851#define get_addr(addrs, index) ((addrs) + (index) * ETH_ALEN)
 852
 853/**
 854 * nes_netdev_set_multicast_list
 855 */
 856static void nes_netdev_set_multicast_list(struct net_device *netdev)
 857{
 858        struct nes_vnic *nesvnic = netdev_priv(netdev);
 859        struct nes_device *nesdev = nesvnic->nesdev;
 860        struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
 861        u32 nic_active_bit;
 862        u32 nic_active;
 863        u32 perfect_filter_register_address;
 864        u32 macaddr_low;
 865        u16 macaddr_high;
 866        u8 mc_all_on = 0;
 867        u8 mc_index;
 868        int mc_nic_index = -1;
 869        u8 pft_entries_preallocated = max(nesadapter->adapter_fcn_count *
 870                                        nics_per_function, 4);
 871        u8 max_pft_entries_avaiable = NES_PFT_SIZE - pft_entries_preallocated;
 872        unsigned long flags;
 873        int mc_count = netdev_mc_count(netdev);
 874
 875        spin_lock_irqsave(&nesadapter->resource_lock, flags);
 876        nic_active_bit = 1 << nesvnic->nic_index;
 877
 878        if (netdev->flags & IFF_PROMISC) {
 879                nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
 880                nic_active |= nic_active_bit;
 881                nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
 882                nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
 883                nic_active |= nic_active_bit;
 884                nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
 885                mc_all_on = 1;
 886        } else if ((netdev->flags & IFF_ALLMULTI) ||
 887                           (nesvnic->nic_index > 3)) {
 888                set_allmulti(nesdev, nic_active_bit);
 889                mc_all_on = 1;
 890        } else {
 891                nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
 892                nic_active &= ~nic_active_bit;
 893                nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
 894                nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
 895                nic_active &= ~nic_active_bit;
 896                nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
 897        }
 898
 899        nes_debug(NES_DBG_NIC_RX, "Number of MC entries = %d, Promiscuous = %d, All Multicast = %d.\n",
 900                  mc_count, !!(netdev->flags & IFF_PROMISC),
 901                  !!(netdev->flags & IFF_ALLMULTI));
 902        if (!mc_all_on) {
 903                char *addrs;
 904                int i;
 905                struct netdev_hw_addr *ha;
 906
 907                addrs = kmalloc(ETH_ALEN * mc_count, GFP_ATOMIC);
 908                if (!addrs) {
 909                        set_allmulti(nesdev, nic_active_bit);
 910                        goto unlock;
 911                }
 912                i = 0;
 913                netdev_for_each_mc_addr(ha, netdev)
 914                        memcpy(get_addr(addrs, i++), ha->addr, ETH_ALEN);
 915
 916                perfect_filter_register_address = NES_IDX_PERFECT_FILTER_LOW +
 917                                                pft_entries_preallocated * 0x8;
 918                for (i = 0, mc_index = 0; mc_index < max_pft_entries_avaiable;
 919                     mc_index++) {
 920                        while (i < mc_count && nesvnic->mcrq_mcast_filter &&
 921                        ((mc_nic_index = nesvnic->mcrq_mcast_filter(nesvnic,
 922                                        get_addr(addrs, i++))) == 0));
 923                        if (mc_nic_index < 0)
 924                                mc_nic_index = nesvnic->nic_index;
 925                        while (nesadapter->pft_mcast_map[mc_index] < 16 &&
 926                                nesadapter->pft_mcast_map[mc_index] !=
 927                                        nesvnic->nic_index &&
 928                                        mc_index < max_pft_entries_avaiable) {
 929                                nes_debug(NES_DBG_NIC_RX,
 930                                          "mc_index=%d skipping nic_index=%d, used for=%d\n",
 931                                          mc_index, nesvnic->nic_index,
 932                                          nesadapter->pft_mcast_map[mc_index]);
 933                                mc_index++;
 934                        }
 935                        if (mc_index >= max_pft_entries_avaiable)
 936                                break;
 937                        if (i < mc_count) {
 938                                char *addr = get_addr(addrs, i++);
 939
 940                                nes_debug(NES_DBG_NIC_RX, "Assigning MC Address %pM to register 0x%04X nic_idx=%d\n",
 941                                          addr,
 942                                          perfect_filter_register_address+(mc_index * 8),
 943                                          mc_nic_index);
 944                                macaddr_high  = ((u8) addr[0]) << 8;
 945                                macaddr_high += (u8) addr[1];
 946                                macaddr_low   = ((u8) addr[2]) << 24;
 947                                macaddr_low  += ((u8) addr[3]) << 16;
 948                                macaddr_low  += ((u8) addr[4]) << 8;
 949                                macaddr_low  += (u8) addr[5];
 950
 951                                nes_write_indexed(nesdev,
 952                                                perfect_filter_register_address+(mc_index * 8),
 953                                                macaddr_low);
 954                                nes_write_indexed(nesdev,
 955                                                perfect_filter_register_address+4+(mc_index * 8),
 956                                                (u32)macaddr_high | NES_MAC_ADDR_VALID |
 957                                                ((((u32)(1<<mc_nic_index)) << 16)));
 958                                nesadapter->pft_mcast_map[mc_index] =
 959                                                        nesvnic->nic_index;
 960                        } else {
 961                                nes_debug(NES_DBG_NIC_RX, "Clearing MC Address at register 0x%04X\n",
 962                                                  perfect_filter_register_address+(mc_index * 8));
 963                                nes_write_indexed(nesdev,
 964                                                perfect_filter_register_address+4+(mc_index * 8),
 965                                                0);
 966                                nesadapter->pft_mcast_map[mc_index] = 255;
 967                        }
 968                }
 969                kfree(addrs);
 970                /* PFT is not large enough */
 971                if (i < mc_count)
 972                        set_allmulti(nesdev, nic_active_bit);
 973        }
 974
 975unlock:
 976        spin_unlock_irqrestore(&nesadapter->resource_lock, flags);
 977}
 978
 979
 980/**
 981 * nes_netdev_change_mtu
 982 */
 983static int nes_netdev_change_mtu(struct net_device *netdev, int new_mtu)
 984{
 985        struct nes_vnic *nesvnic = netdev_priv(netdev);
 986        struct nes_device *nesdev = nesvnic->nesdev;
 987        u8 jumbomode = 0;
 988        u32 nic_active;
 989        u32 nic_active_bit;
 990        u32 uc_all_active;
 991        u32 mc_all_active;
 992
 993        netdev->mtu = new_mtu;
 994        nesvnic->max_frame_size = new_mtu + VLAN_ETH_HLEN;
 995
 996        if (netdev->mtu > ETH_DATA_LEN) {
 997                jumbomode=1;
 998        }
 999        nes_nic_init_timer_defaults(nesdev, jumbomode);
1000
1001        if (netif_running(netdev)) {
1002                nic_active_bit = 1 << nesvnic->nic_index;
1003                mc_all_active = nes_read_indexed(nesdev,
1004                                NES_IDX_NIC_MULTICAST_ALL) & nic_active_bit;
1005                uc_all_active = nes_read_indexed(nesdev,
1006                                NES_IDX_NIC_UNICAST_ALL)  & nic_active_bit;
1007
1008                nes_netdev_stop(netdev);
1009                nes_netdev_open(netdev);
1010
1011                nic_active = nes_read_indexed(nesdev,
1012                                        NES_IDX_NIC_MULTICAST_ALL);
1013                nic_active |= mc_all_active;
1014                nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL,
1015                                                        nic_active);
1016
1017                nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
1018                nic_active |= uc_all_active;
1019                nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
1020        }
1021
1022        return 0;
1023}
1024
1025
1026static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = {
1027        "Link Change Interrupts",
1028        "Linearized SKBs",
1029        "T/GSO Requests",
1030        "Pause Frames Sent",
1031        "Pause Frames Received",
1032        "Internal Routing Errors",
1033        "SQ SW Dropped SKBs",
1034        "SQ Full",
1035        "Segmented TSO Requests",
1036        "Rx Symbol Errors",
1037        "Rx Jabber Errors",
1038        "Rx Oversized Frames",
1039        "Rx Short Frames",
1040        "Rx Length Errors",
1041        "Rx CRC Errors",
1042        "Rx Port Discard",
1043        "Endnode Rx Discards",
1044        "Endnode Rx Octets",
1045        "Endnode Rx Frames",
1046        "Endnode Tx Octets",
1047        "Endnode Tx Frames",
1048        "Tx Errors",
1049        "mh detected",
1050        "mh pauses",
1051        "Retransmission Count",
1052        "CM Connects",
1053        "CM Accepts",
1054        "Disconnects",
1055        "Connected Events",
1056        "Connect Requests",
1057        "CM Rejects",
1058        "ModifyQP Timeouts",
1059        "CreateQPs",
1060        "SW DestroyQPs",
1061        "DestroyQPs",
1062        "CM Closes",
1063        "CM Packets Sent",
1064        "CM Packets Bounced",
1065        "CM Packets Created",
1066        "CM Packets Rcvd",
1067        "CM Packets Dropped",
1068        "CM Packets Retrans",
1069        "CM Listens Created",
1070        "CM Listens Destroyed",
1071        "CM Backlog Drops",
1072        "CM Loopbacks",
1073        "CM Nodes Created",
1074        "CM Nodes Destroyed",
1075        "CM Accel Drops",
1076        "CM Resets Received",
1077        "Free 4Kpbls",
1078        "Free 256pbls",
1079        "Timer Inits",
1080        "PAU CreateQPs",
1081        "PAU DestroyQPs",
1082};
1083#define NES_ETHTOOL_STAT_COUNT  ARRAY_SIZE(nes_ethtool_stringset)
1084
1085
1086/**
1087 * nes_netdev_get_sset_count
1088 */
1089static int nes_netdev_get_sset_count(struct net_device *netdev, int stringset)
1090{
1091        if (stringset == ETH_SS_STATS)
1092                return NES_ETHTOOL_STAT_COUNT;
1093        else
1094                return -EINVAL;
1095}
1096
1097
1098/**
1099 * nes_netdev_get_strings
1100 */
1101static void nes_netdev_get_strings(struct net_device *netdev, u32 stringset,
1102                u8 *ethtool_strings)
1103{
1104        if (stringset == ETH_SS_STATS)
1105                memcpy(ethtool_strings,
1106                                &nes_ethtool_stringset,
1107                                sizeof(nes_ethtool_stringset));
1108}
1109
1110
1111/**
1112 * nes_netdev_get_ethtool_stats
1113 */
1114
1115static void nes_netdev_get_ethtool_stats(struct net_device *netdev,
1116                struct ethtool_stats *target_ethtool_stats, u64 *target_stat_values)
1117{
1118        u64 u64temp;
1119        struct nes_vnic *nesvnic = netdev_priv(netdev);
1120        struct nes_device *nesdev = nesvnic->nesdev;
1121        struct nes_adapter *nesadapter = nesdev->nesadapter;
1122        u32 nic_count;
1123        u32 u32temp;
1124        u32 index = 0;
1125
1126        target_ethtool_stats->n_stats = NES_ETHTOOL_STAT_COUNT;
1127        target_stat_values[index] = nesvnic->nesdev->link_status_interrupts;
1128        target_stat_values[++index] = nesvnic->linearized_skbs;
1129        target_stat_values[++index] = nesvnic->tso_requests;
1130
1131        u32temp = nes_read_indexed(nesdev,
1132                        NES_IDX_MAC_TX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1133        nesvnic->nesdev->mac_pause_frames_sent += u32temp;
1134        target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_sent;
1135
1136        u32temp = nes_read_indexed(nesdev,
1137                        NES_IDX_MAC_RX_PAUSE_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1138        nesvnic->nesdev->mac_pause_frames_received += u32temp;
1139
1140        u32temp = nes_read_indexed(nesdev,
1141                        NES_IDX_PORT_RX_DISCARDS + (nesvnic->nesdev->mac_index*0x40));
1142        nesvnic->nesdev->port_rx_discards += u32temp;
1143        nesvnic->netstats.rx_dropped += u32temp;
1144
1145        u32temp = nes_read_indexed(nesdev,
1146                        NES_IDX_PORT_TX_DISCARDS + (nesvnic->nesdev->mac_index*0x40));
1147        nesvnic->nesdev->port_tx_discards += u32temp;
1148        nesvnic->netstats.tx_dropped += u32temp;
1149
1150        u32temp = nes_read_indexed(nesdev,
1151                        NES_IDX_MAC_RX_SHORT_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1152        nesvnic->netstats.rx_dropped += u32temp;
1153        nesvnic->nesdev->mac_rx_errors += u32temp;
1154        nesvnic->nesdev->mac_rx_short_frames += u32temp;
1155
1156        u32temp = nes_read_indexed(nesdev,
1157                        NES_IDX_MAC_RX_OVERSIZED_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1158        nesvnic->netstats.rx_dropped += u32temp;
1159        nesvnic->nesdev->mac_rx_errors += u32temp;
1160        nesvnic->nesdev->mac_rx_oversized_frames += u32temp;
1161
1162        u32temp = nes_read_indexed(nesdev,
1163                        NES_IDX_MAC_RX_JABBER_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1164        nesvnic->netstats.rx_dropped += u32temp;
1165        nesvnic->nesdev->mac_rx_errors += u32temp;
1166        nesvnic->nesdev->mac_rx_jabber_frames += u32temp;
1167
1168        u32temp = nes_read_indexed(nesdev,
1169                        NES_IDX_MAC_RX_SYMBOL_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1170        nesvnic->netstats.rx_dropped += u32temp;
1171        nesvnic->nesdev->mac_rx_errors += u32temp;
1172        nesvnic->nesdev->mac_rx_symbol_err_frames += u32temp;
1173
1174        u32temp = nes_read_indexed(nesdev,
1175                        NES_IDX_MAC_RX_LENGTH_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1176        nesvnic->netstats.rx_length_errors += u32temp;
1177        nesvnic->nesdev->mac_rx_errors += u32temp;
1178
1179        u32temp = nes_read_indexed(nesdev,
1180                        NES_IDX_MAC_RX_CRC_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200));
1181        nesvnic->nesdev->mac_rx_errors += u32temp;
1182        nesvnic->nesdev->mac_rx_crc_errors += u32temp;
1183        nesvnic->netstats.rx_crc_errors += u32temp;
1184
1185        u32temp = nes_read_indexed(nesdev,
1186                        NES_IDX_MAC_TX_ERRORS + (nesvnic->nesdev->mac_index*0x200));
1187        nesvnic->nesdev->mac_tx_errors += u32temp;
1188        nesvnic->netstats.tx_errors += u32temp;
1189
1190        for (nic_count = 0; nic_count < NES_MAX_PORT_COUNT; nic_count++) {
1191                if (nesvnic->qp_nic_index[nic_count] == 0xf)
1192                        break;
1193
1194                u32temp = nes_read_indexed(nesdev,
1195                                NES_IDX_ENDNODE0_NSTAT_RX_DISCARD +
1196                                (nesvnic->qp_nic_index[nic_count]*0x200));
1197                nesvnic->netstats.rx_dropped += u32temp;
1198                nesvnic->endnode_nstat_rx_discard += u32temp;
1199
1200                u64temp = (u64)nes_read_indexed(nesdev,
1201                                NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_LO +
1202                                (nesvnic->qp_nic_index[nic_count]*0x200));
1203                u64temp += ((u64)nes_read_indexed(nesdev,
1204                                NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_HI +
1205                                (nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1206
1207                nesvnic->endnode_nstat_rx_octets += u64temp;
1208                nesvnic->netstats.rx_bytes += u64temp;
1209
1210                u64temp = (u64)nes_read_indexed(nesdev,
1211                                NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_LO +
1212                                (nesvnic->qp_nic_index[nic_count]*0x200));
1213                u64temp += ((u64)nes_read_indexed(nesdev,
1214                                NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_HI +
1215                                (nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1216
1217                nesvnic->endnode_nstat_rx_frames += u64temp;
1218                nesvnic->netstats.rx_packets += u64temp;
1219
1220                u64temp = (u64)nes_read_indexed(nesdev,
1221                                NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_LO +
1222                                (nesvnic->qp_nic_index[nic_count]*0x200));
1223                u64temp += ((u64)nes_read_indexed(nesdev,
1224                                NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI +
1225                                (nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1226
1227                nesvnic->endnode_nstat_tx_octets += u64temp;
1228                nesvnic->netstats.tx_bytes += u64temp;
1229
1230                u64temp = (u64)nes_read_indexed(nesdev,
1231                                NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO +
1232                                (nesvnic->qp_nic_index[nic_count]*0x200));
1233                u64temp += ((u64)nes_read_indexed(nesdev,
1234                                NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI +
1235                                (nesvnic->qp_nic_index[nic_count]*0x200))) << 32;
1236
1237                nesvnic->endnode_nstat_tx_frames += u64temp;
1238                nesvnic->netstats.tx_packets += u64temp;
1239
1240                u32temp = nes_read_indexed(nesdev,
1241                                NES_IDX_IPV4_TCP_REXMITS + (nesvnic->qp_nic_index[nic_count]*0x200));
1242                nesvnic->endnode_ipv4_tcp_retransmits += u32temp;
1243        }
1244
1245        target_stat_values[++index] = nesvnic->nesdev->mac_pause_frames_received;
1246        target_stat_values[++index] = nesdev->nesadapter->nic_rx_eth_route_err;
1247        target_stat_values[++index] = nesvnic->tx_sw_dropped;
1248        target_stat_values[++index] = nesvnic->sq_full;
1249        target_stat_values[++index] = nesvnic->segmented_tso_requests;
1250        target_stat_values[++index] = nesvnic->nesdev->mac_rx_symbol_err_frames;
1251        target_stat_values[++index] = nesvnic->nesdev->mac_rx_jabber_frames;
1252        target_stat_values[++index] = nesvnic->nesdev->mac_rx_oversized_frames;
1253        target_stat_values[++index] = nesvnic->nesdev->mac_rx_short_frames;
1254        target_stat_values[++index] = nesvnic->netstats.rx_length_errors;
1255        target_stat_values[++index] = nesvnic->nesdev->mac_rx_crc_errors;
1256        target_stat_values[++index] = nesvnic->nesdev->port_rx_discards;
1257        target_stat_values[++index] = nesvnic->endnode_nstat_rx_discard;
1258        target_stat_values[++index] = nesvnic->endnode_nstat_rx_octets;
1259        target_stat_values[++index] = nesvnic->endnode_nstat_rx_frames;
1260        target_stat_values[++index] = nesvnic->endnode_nstat_tx_octets;
1261        target_stat_values[++index] = nesvnic->endnode_nstat_tx_frames;
1262        target_stat_values[++index] = nesvnic->nesdev->mac_tx_errors;
1263        target_stat_values[++index] = mh_detected;
1264        target_stat_values[++index] = mh_pauses_sent;
1265        target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits;
1266        target_stat_values[++index] = atomic_read(&cm_connects);
1267        target_stat_values[++index] = atomic_read(&cm_accepts);
1268        target_stat_values[++index] = atomic_read(&cm_disconnects);
1269        target_stat_values[++index] = atomic_read(&cm_connecteds);
1270        target_stat_values[++index] = atomic_read(&cm_connect_reqs);
1271        target_stat_values[++index] = atomic_read(&cm_rejects);
1272        target_stat_values[++index] = atomic_read(&mod_qp_timouts);
1273        target_stat_values[++index] = atomic_read(&qps_created);
1274        target_stat_values[++index] = atomic_read(&sw_qps_destroyed);
1275        target_stat_values[++index] = atomic_read(&qps_destroyed);
1276        target_stat_values[++index] = atomic_read(&cm_closes);
1277        target_stat_values[++index] = cm_packets_sent;
1278        target_stat_values[++index] = cm_packets_bounced;
1279        target_stat_values[++index] = cm_packets_created;
1280        target_stat_values[++index] = cm_packets_received;
1281        target_stat_values[++index] = cm_packets_dropped;
1282        target_stat_values[++index] = cm_packets_retrans;
1283        target_stat_values[++index] = atomic_read(&cm_listens_created);
1284        target_stat_values[++index] = atomic_read(&cm_listens_destroyed);
1285        target_stat_values[++index] = cm_backlog_drops;
1286        target_stat_values[++index] = atomic_read(&cm_loopbacks);
1287        target_stat_values[++index] = atomic_read(&cm_nodes_created);
1288        target_stat_values[++index] = atomic_read(&cm_nodes_destroyed);
1289        target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts);
1290        target_stat_values[++index] = atomic_read(&cm_resets_recvd);
1291        target_stat_values[++index] = nesadapter->free_4kpbl;
1292        target_stat_values[++index] = nesadapter->free_256pbl;
1293        target_stat_values[++index] = int_mod_timer_init;
1294        target_stat_values[++index] = atomic_read(&pau_qps_created);
1295        target_stat_values[++index] = atomic_read(&pau_qps_destroyed);
1296}
1297
1298/**
1299 * nes_netdev_get_drvinfo
1300 */
1301static void nes_netdev_get_drvinfo(struct net_device *netdev,
1302                struct ethtool_drvinfo *drvinfo)
1303{
1304        struct nes_vnic *nesvnic = netdev_priv(netdev);
1305        struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
1306
1307        strlcpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
1308        strlcpy(drvinfo->bus_info, pci_name(nesvnic->nesdev->pcidev),
1309                sizeof(drvinfo->bus_info));
1310        snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
1311                 "%u.%u", nesadapter->firmware_version >> 16,
1312                 nesadapter->firmware_version & 0x000000ff);
1313        strlcpy(drvinfo->version, DRV_VERSION, sizeof(drvinfo->version));
1314}
1315
1316
1317/**
1318 * nes_netdev_set_coalesce
1319 */
1320static int nes_netdev_set_coalesce(struct net_device *netdev,
1321                struct ethtool_coalesce *et_coalesce)
1322{
1323        struct nes_vnic *nesvnic = netdev_priv(netdev);
1324        struct nes_device *nesdev = nesvnic->nesdev;
1325        struct nes_adapter *nesadapter = nesdev->nesadapter;
1326        struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
1327        unsigned long flags;
1328
1329        spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags);
1330        if (et_coalesce->rx_max_coalesced_frames_low) {
1331                shared_timer->threshold_low = et_coalesce->rx_max_coalesced_frames_low;
1332        }
1333        if (et_coalesce->rx_max_coalesced_frames_irq) {
1334                shared_timer->threshold_target = et_coalesce->rx_max_coalesced_frames_irq;
1335        }
1336        if (et_coalesce->rx_max_coalesced_frames_high) {
1337                shared_timer->threshold_high = et_coalesce->rx_max_coalesced_frames_high;
1338        }
1339        if (et_coalesce->rx_coalesce_usecs_low) {
1340                shared_timer->timer_in_use_min = et_coalesce->rx_coalesce_usecs_low;
1341        }
1342        if (et_coalesce->rx_coalesce_usecs_high) {
1343                shared_timer->timer_in_use_max = et_coalesce->rx_coalesce_usecs_high;
1344        }
1345        spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
1346
1347        /* using this to drive total interrupt moderation */
1348        nesadapter->et_rx_coalesce_usecs_irq = et_coalesce->rx_coalesce_usecs_irq;
1349        if (et_coalesce->use_adaptive_rx_coalesce) {
1350                nesadapter->et_use_adaptive_rx_coalesce = 1;
1351                nesadapter->timer_int_limit = NES_TIMER_INT_LIMIT_DYNAMIC;
1352                nesadapter->et_rx_coalesce_usecs_irq = 0;
1353                if (et_coalesce->pkt_rate_low) {
1354                        nesadapter->et_pkt_rate_low = et_coalesce->pkt_rate_low;
1355                }
1356        } else {
1357                nesadapter->et_use_adaptive_rx_coalesce = 0;
1358                nesadapter->timer_int_limit = NES_TIMER_INT_LIMIT;
1359                if (nesadapter->et_rx_coalesce_usecs_irq) {
1360                        nes_write32(nesdev->regs+NES_PERIODIC_CONTROL,
1361                                        0x80000000 | ((u32)(nesadapter->et_rx_coalesce_usecs_irq*8)));
1362                }
1363        }
1364        return 0;
1365}
1366
1367
1368/**
1369 * nes_netdev_get_coalesce
1370 */
1371static int nes_netdev_get_coalesce(struct net_device *netdev,
1372                struct ethtool_coalesce *et_coalesce)
1373{
1374        struct nes_vnic *nesvnic = netdev_priv(netdev);
1375        struct nes_device *nesdev = nesvnic->nesdev;
1376        struct nes_adapter *nesadapter = nesdev->nesadapter;
1377        struct ethtool_coalesce temp_et_coalesce;
1378        struct nes_hw_tune_timer *shared_timer = &nesadapter->tune_timer;
1379        unsigned long flags;
1380
1381        memset(&temp_et_coalesce, 0, sizeof(temp_et_coalesce));
1382        temp_et_coalesce.rx_coalesce_usecs_irq    = nesadapter->et_rx_coalesce_usecs_irq;
1383        temp_et_coalesce.use_adaptive_rx_coalesce = nesadapter->et_use_adaptive_rx_coalesce;
1384        temp_et_coalesce.rate_sample_interval     = nesadapter->et_rate_sample_interval;
1385        temp_et_coalesce.pkt_rate_low = nesadapter->et_pkt_rate_low;
1386        spin_lock_irqsave(&nesadapter->periodic_timer_lock,     flags);
1387        temp_et_coalesce.rx_max_coalesced_frames_low  = shared_timer->threshold_low;
1388        temp_et_coalesce.rx_max_coalesced_frames_irq  = shared_timer->threshold_target;
1389        temp_et_coalesce.rx_max_coalesced_frames_high = shared_timer->threshold_high;
1390        temp_et_coalesce.rx_coalesce_usecs_low  = shared_timer->timer_in_use_min;
1391        temp_et_coalesce.rx_coalesce_usecs_high = shared_timer->timer_in_use_max;
1392        if (nesadapter->et_use_adaptive_rx_coalesce) {
1393                temp_et_coalesce.rx_coalesce_usecs_irq = shared_timer->timer_in_use;
1394        }
1395        spin_unlock_irqrestore(&nesadapter->periodic_timer_lock, flags);
1396        memcpy(et_coalesce, &temp_et_coalesce, sizeof(*et_coalesce));
1397        return 0;
1398}
1399
1400
1401/**
1402 * nes_netdev_get_pauseparam
1403 */
1404static void nes_netdev_get_pauseparam(struct net_device *netdev,
1405                struct ethtool_pauseparam *et_pauseparam)
1406{
1407        struct nes_vnic *nesvnic = netdev_priv(netdev);
1408
1409        et_pauseparam->autoneg = 0;
1410        et_pauseparam->rx_pause = (nesvnic->nesdev->disable_rx_flow_control == 0) ? 1:0;
1411        et_pauseparam->tx_pause = (nesvnic->nesdev->disable_tx_flow_control == 0) ? 1:0;
1412}
1413
1414
1415/**
1416 * nes_netdev_set_pauseparam
1417 */
1418static int nes_netdev_set_pauseparam(struct net_device *netdev,
1419                struct ethtool_pauseparam *et_pauseparam)
1420{
1421        struct nes_vnic *nesvnic = netdev_priv(netdev);
1422        struct nes_device *nesdev = nesvnic->nesdev;
1423        u32 u32temp;
1424
1425        if (et_pauseparam->autoneg) {
1426                /* TODO: should return unsupported */
1427                return 0;
1428        }
1429        if ((et_pauseparam->tx_pause == 1) && (nesdev->disable_tx_flow_control == 1)) {
1430                u32temp = nes_read_indexed(nesdev,
1431                                NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
1432                u32temp |= NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
1433                nes_write_indexed(nesdev,
1434                                NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200), u32temp);
1435                nesdev->disable_tx_flow_control = 0;
1436        } else if ((et_pauseparam->tx_pause == 0) && (nesdev->disable_tx_flow_control == 0)) {
1437                u32temp = nes_read_indexed(nesdev,
1438                                NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
1439                u32temp &= ~NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
1440                nes_write_indexed(nesdev,
1441                                NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200), u32temp);
1442                nesdev->disable_tx_flow_control = 1;
1443        }
1444        if ((et_pauseparam->rx_pause == 1) && (nesdev->disable_rx_flow_control == 1)) {
1445                u32temp = nes_read_indexed(nesdev,
1446                                NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40));
1447                u32temp &= ~NES_IDX_MPP_DEBUG_PORT_DISABLE_PAUSE;
1448                nes_write_indexed(nesdev,
1449                                NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40), u32temp);
1450                nesdev->disable_rx_flow_control = 0;
1451        } else if ((et_pauseparam->rx_pause == 0) && (nesdev->disable_rx_flow_control == 0)) {
1452                u32temp = nes_read_indexed(nesdev,
1453                                NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40));
1454                u32temp |= NES_IDX_MPP_DEBUG_PORT_DISABLE_PAUSE;
1455                nes_write_indexed(nesdev,
1456                                NES_IDX_MPP_DEBUG + (nesdev->mac_index*0x40), u32temp);
1457                nesdev->disable_rx_flow_control = 1;
1458        }
1459
1460        return 0;
1461}
1462
1463
1464/**
1465 * nes_netdev_get_settings
1466 */
1467static int nes_netdev_get_link_ksettings(struct net_device *netdev,
1468                                         struct ethtool_link_ksettings *cmd)
1469{
1470        struct nes_vnic *nesvnic = netdev_priv(netdev);
1471        struct nes_device *nesdev = nesvnic->nesdev;
1472        struct nes_adapter *nesadapter = nesdev->nesadapter;
1473        u32 mac_index = nesdev->mac_index;
1474        u8 phy_type = nesadapter->phy_type[mac_index];
1475        u8 phy_index = nesadapter->phy_index[mac_index];
1476        u16 phy_data;
1477        u32 supported, advertising;
1478
1479        cmd->base.duplex = DUPLEX_FULL;
1480        cmd->base.port   = PORT_MII;
1481
1482        if (nesadapter->OneG_Mode) {
1483                cmd->base.speed = SPEED_1000;
1484                if (phy_type == NES_PHY_TYPE_PUMA_1G) {
1485                        supported   = SUPPORTED_1000baseT_Full;
1486                        advertising = ADVERTISED_1000baseT_Full;
1487                        cmd->base.autoneg     = AUTONEG_DISABLE;
1488                        cmd->base.phy_address = mac_index;
1489                } else {
1490                        unsigned long flags;
1491
1492                        supported = SUPPORTED_1000baseT_Full
1493                                | SUPPORTED_Autoneg;
1494                        advertising = ADVERTISED_1000baseT_Full
1495                                | ADVERTISED_Autoneg;
1496                        spin_lock_irqsave(&nesadapter->phy_lock, flags);
1497                        nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1498                        spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
1499                        if (phy_data & 0x1000)
1500                                cmd->base.autoneg = AUTONEG_ENABLE;
1501                        else
1502                                cmd->base.autoneg = AUTONEG_DISABLE;
1503                        cmd->base.phy_address = phy_index;
1504                }
1505                ethtool_convert_legacy_u32_to_link_mode(
1506                        cmd->link_modes.supported, supported);
1507                ethtool_convert_legacy_u32_to_link_mode(
1508                        cmd->link_modes.advertising, advertising);
1509                return 0;
1510        }
1511        if ((phy_type == NES_PHY_TYPE_ARGUS) ||
1512            (phy_type == NES_PHY_TYPE_SFP_D) ||
1513            (phy_type == NES_PHY_TYPE_KR)) {
1514                cmd->base.port        = PORT_FIBRE;
1515                supported   = SUPPORTED_FIBRE;
1516                advertising = ADVERTISED_FIBRE;
1517                cmd->base.phy_address = phy_index;
1518        } else {
1519                supported   = SUPPORTED_10000baseT_Full;
1520                advertising = ADVERTISED_10000baseT_Full;
1521                cmd->base.phy_address = mac_index;
1522        }
1523        cmd->base.speed = SPEED_10000;
1524        cmd->base.autoneg = AUTONEG_DISABLE;
1525        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
1526                                                supported);
1527        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
1528                                                advertising);
1529
1530        return 0;
1531}
1532
1533
1534/**
1535 * nes_netdev_set_settings
1536 */
1537static int
1538nes_netdev_set_link_ksettings(struct net_device *netdev,
1539                              const struct ethtool_link_ksettings *cmd)
1540{
1541        struct nes_vnic *nesvnic = netdev_priv(netdev);
1542        struct nes_device *nesdev = nesvnic->nesdev;
1543        struct nes_adapter *nesadapter = nesdev->nesadapter;
1544
1545        if ((nesadapter->OneG_Mode) &&
1546            (nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) {
1547                unsigned long flags;
1548                u16 phy_data;
1549                u8 phy_index = nesadapter->phy_index[nesdev->mac_index];
1550
1551                spin_lock_irqsave(&nesadapter->phy_lock, flags);
1552                nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
1553                if (cmd->base.autoneg) {
1554                        /* Turn on Full duplex, Autoneg, and restart autonegotiation */
1555                        phy_data |= 0x1300;
1556                } else {
1557                        /* Turn off autoneg */
1558                        phy_data &= ~0x1000;
1559                }
1560                nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data);
1561                spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
1562        }
1563
1564        return 0;
1565}
1566
1567
1568static const struct ethtool_ops nes_ethtool_ops = {
1569        .get_link = ethtool_op_get_link,
1570        .get_strings = nes_netdev_get_strings,
1571        .get_sset_count = nes_netdev_get_sset_count,
1572        .get_ethtool_stats = nes_netdev_get_ethtool_stats,
1573        .get_drvinfo = nes_netdev_get_drvinfo,
1574        .get_coalesce = nes_netdev_get_coalesce,
1575        .set_coalesce = nes_netdev_set_coalesce,
1576        .get_pauseparam = nes_netdev_get_pauseparam,
1577        .set_pauseparam = nes_netdev_set_pauseparam,
1578        .get_link_ksettings = nes_netdev_get_link_ksettings,
1579        .set_link_ksettings = nes_netdev_set_link_ksettings,
1580};
1581
1582static void nes_vlan_mode(struct net_device *netdev, struct nes_device *nesdev, netdev_features_t features)
1583{
1584        struct nes_adapter *nesadapter = nesdev->nesadapter;
1585        u32 u32temp;
1586        unsigned long flags;
1587
1588        spin_lock_irqsave(&nesadapter->phy_lock, flags);
1589
1590        nes_debug(NES_DBG_NETDEV, "%s: %s\n", __func__, netdev->name);
1591
1592        /* Enable/Disable VLAN Stripping */
1593        u32temp = nes_read_indexed(nesdev, NES_IDX_PCIX_DIAG);
1594        if (features & NETIF_F_HW_VLAN_CTAG_RX)
1595                u32temp &= 0xfdffffff;
1596        else
1597                u32temp |= 0x02000000;
1598
1599        nes_write_indexed(nesdev, NES_IDX_PCIX_DIAG, u32temp);
1600        spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
1601}
1602
1603static netdev_features_t nes_fix_features(struct net_device *netdev, netdev_features_t features)
1604{
1605        /*
1606         * Since there is no support for separate rx/tx vlan accel
1607         * enable/disable make sure tx flag is always in same state as rx.
1608         */
1609        if (features & NETIF_F_HW_VLAN_CTAG_RX)
1610                features |= NETIF_F_HW_VLAN_CTAG_TX;
1611        else
1612                features &= ~NETIF_F_HW_VLAN_CTAG_TX;
1613
1614        return features;
1615}
1616
1617static int nes_set_features(struct net_device *netdev, netdev_features_t features)
1618{
1619        struct nes_vnic *nesvnic = netdev_priv(netdev);
1620        struct nes_device *nesdev = nesvnic->nesdev;
1621        u32 changed = netdev->features ^ features;
1622
1623        if (changed & NETIF_F_HW_VLAN_CTAG_RX)
1624                nes_vlan_mode(netdev, nesdev, features);
1625
1626        return 0;
1627}
1628
1629static const struct net_device_ops nes_netdev_ops = {
1630        .ndo_open               = nes_netdev_open,
1631        .ndo_stop               = nes_netdev_stop,
1632        .ndo_start_xmit         = nes_netdev_start_xmit,
1633        .ndo_get_stats          = nes_netdev_get_stats,
1634        .ndo_tx_timeout         = nes_netdev_tx_timeout,
1635        .ndo_set_mac_address    = nes_netdev_set_mac_address,
1636        .ndo_set_rx_mode        = nes_netdev_set_multicast_list,
1637        .ndo_change_mtu         = nes_netdev_change_mtu,
1638        .ndo_validate_addr      = eth_validate_addr,
1639        .ndo_fix_features       = nes_fix_features,
1640        .ndo_set_features       = nes_set_features,
1641};
1642
1643/**
1644 * nes_netdev_init - initialize network device
1645 */
1646struct net_device *nes_netdev_init(struct nes_device *nesdev,
1647                void __iomem *mmio_addr)
1648{
1649        u64 u64temp;
1650        struct nes_vnic *nesvnic;
1651        struct net_device *netdev;
1652        struct nic_qp_map *curr_qp_map;
1653        u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index];
1654
1655        netdev = alloc_etherdev(sizeof(struct nes_vnic));
1656        if (!netdev) {
1657                printk(KERN_ERR PFX "nesvnic etherdev alloc failed");
1658                return NULL;
1659        }
1660        nesvnic = netdev_priv(netdev);
1661
1662        nes_debug(NES_DBG_INIT, "netdev = %p, %s\n", netdev, netdev->name);
1663
1664        SET_NETDEV_DEV(netdev, &nesdev->pcidev->dev);
1665
1666        netdev->watchdog_timeo = NES_TX_TIMEOUT;
1667        netdev->irq = nesdev->pcidev->irq;
1668        netdev->max_mtu = NES_MAX_MTU;
1669        netdev->hard_header_len = ETH_HLEN;
1670        netdev->addr_len = ETH_ALEN;
1671        netdev->type = ARPHRD_ETHER;
1672        netdev->netdev_ops = &nes_netdev_ops;
1673        netdev->ethtool_ops = &nes_ethtool_ops;
1674        netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128);
1675        nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n");
1676
1677        /* Fill in the port structure */
1678        nesvnic->netdev = netdev;
1679        nesvnic->nesdev = nesdev;
1680        nesvnic->msg_enable = netif_msg_init(debug, default_msg);
1681        nesvnic->netdev_index = nesdev->netdev_count;
1682        nesvnic->perfect_filter_index = nesdev->nesadapter->netdev_count;
1683        nesvnic->max_frame_size = netdev->mtu + netdev->hard_header_len + VLAN_HLEN;
1684
1685        curr_qp_map = nic_qp_mapping_per_function[PCI_FUNC(nesdev->pcidev->devfn)];
1686        nesvnic->nic.qp_id = curr_qp_map[nesdev->netdev_count].qpid;
1687        nesvnic->nic_index = curr_qp_map[nesdev->netdev_count].nic_index;
1688        nesvnic->logical_port = curr_qp_map[nesdev->netdev_count].logical_port;
1689
1690        /* Setup the burned in MAC address */
1691        u64temp = (u64)nesdev->nesadapter->mac_addr_low;
1692        u64temp += ((u64)nesdev->nesadapter->mac_addr_high) << 32;
1693        u64temp += nesvnic->nic_index;
1694        netdev->dev_addr[0] = (u8)(u64temp>>40);
1695        netdev->dev_addr[1] = (u8)(u64temp>>32);
1696        netdev->dev_addr[2] = (u8)(u64temp>>24);
1697        netdev->dev_addr[3] = (u8)(u64temp>>16);
1698        netdev->dev_addr[4] = (u8)(u64temp>>8);
1699        netdev->dev_addr[5] = (u8)u64temp;
1700
1701        netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_RX;
1702        if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV))
1703                netdev->hw_features |= NETIF_F_TSO;
1704
1705        netdev->features = netdev->hw_features | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_CTAG_TX;
1706
1707        nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d,"
1708                        " nic_index = %d, logical_port = %d, mac_index = %d.\n",
1709                        nesvnic, (unsigned long)netdev->features, nesvnic->nic.qp_id,
1710                        nesvnic->nic_index, nesvnic->logical_port,  nesdev->mac_index);
1711
1712        if (nesvnic->nesdev->nesadapter->port_count == 1 &&
1713                nesvnic->nesdev->nesadapter->adapter_fcn_count == 1) {
1714
1715                nesvnic->qp_nic_index[0] = nesvnic->nic_index;
1716                nesvnic->qp_nic_index[1] = nesvnic->nic_index + 1;
1717                if (nes_drv_opt & NES_DRV_OPT_DUAL_LOGICAL_PORT) {
1718                        nesvnic->qp_nic_index[2] = 0xf;
1719                        nesvnic->qp_nic_index[3] = 0xf;
1720                } else {
1721                        nesvnic->qp_nic_index[2] = nesvnic->nic_index + 2;
1722                        nesvnic->qp_nic_index[3] = nesvnic->nic_index + 3;
1723                }
1724        } else {
1725                if (nesvnic->nesdev->nesadapter->port_count == 2 ||
1726                        (nesvnic->nesdev->nesadapter->port_count == 1 &&
1727                        nesvnic->nesdev->nesadapter->adapter_fcn_count == 2)) {
1728                                nesvnic->qp_nic_index[0] = nesvnic->nic_index;
1729                                nesvnic->qp_nic_index[1] = nesvnic->nic_index
1730                                                                        + 2;
1731                                nesvnic->qp_nic_index[2] = 0xf;
1732                                nesvnic->qp_nic_index[3] = 0xf;
1733                } else {
1734                        nesvnic->qp_nic_index[0] = nesvnic->nic_index;
1735                        nesvnic->qp_nic_index[1] = 0xf;
1736                        nesvnic->qp_nic_index[2] = 0xf;
1737                        nesvnic->qp_nic_index[3] = 0xf;
1738                }
1739        }
1740        nesvnic->next_qp_nic_index = 0;
1741
1742        if (nesdev->netdev_count == 0) {
1743                nesvnic->rdma_enabled = 1;
1744        } else {
1745                nesvnic->rdma_enabled = 0;
1746        }
1747        nesvnic->nic_cq.cq_number = nesvnic->nic.qp_id;
1748        timer_setup(&nesvnic->event_timer, NULL, 0);
1749        spin_lock_init(&nesvnic->tx_lock);
1750        spin_lock_init(&nesvnic->port_ibevent_lock);
1751        nesdev->netdev[nesdev->netdev_count] = netdev;
1752
1753        nes_debug(NES_DBG_INIT, "Adding nesvnic (%p) to the adapters nesvnic_list for MAC%d.\n",
1754                        nesvnic, nesdev->mac_index);
1755        list_add_tail(&nesvnic->list, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]);
1756
1757        if ((nesdev->netdev_count == 0) &&
1758            ((PCI_FUNC(nesdev->pcidev->devfn) == nesdev->mac_index) ||
1759             ((phy_type == NES_PHY_TYPE_PUMA_1G) &&
1760              (((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) ||
1761               ((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) {
1762                u32 u32temp;
1763                u32 link_mask = 0;
1764                u32 link_val = 0;
1765                u16 temp_phy_data;
1766                u16 phy_data = 0;
1767                unsigned long flags;
1768
1769                u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
1770                                (0x200 * (nesdev->mac_index & 1)));
1771                if (phy_type != NES_PHY_TYPE_PUMA_1G) {
1772                        u32temp |= 0x00200000;
1773                        nes_write_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
1774                                (0x200 * (nesdev->mac_index & 1)), u32temp);
1775                }
1776
1777                /* Check and set linkup here.  This is for back to back */
1778                /* configuration where second port won't get link interrupt */
1779                switch (phy_type) {
1780                case NES_PHY_TYPE_PUMA_1G:
1781                        if (nesdev->mac_index < 2) {
1782                                link_mask = 0x01010000;
1783                                link_val = 0x01010000;
1784                        } else {
1785                                link_mask = 0x02020000;
1786                                link_val = 0x02020000;
1787                        }
1788                        break;
1789                case NES_PHY_TYPE_SFP_D:
1790                        spin_lock_irqsave(&nesdev->nesadapter->phy_lock, flags);
1791                        nes_read_10G_phy_reg(nesdev,
1792                                             nesdev->nesadapter->phy_index[nesdev->mac_index],
1793                                             1, 0x9003);
1794                        temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1795                        nes_read_10G_phy_reg(nesdev,
1796                                             nesdev->nesadapter->phy_index[nesdev->mac_index],
1797                                             3, 0x0021);
1798                        nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1799                        nes_read_10G_phy_reg(nesdev,
1800                                             nesdev->nesadapter->phy_index[nesdev->mac_index],
1801                                             3, 0x0021);
1802                        phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
1803                        spin_unlock_irqrestore(&nesdev->nesadapter->phy_lock, flags);
1804                        phy_data = (!temp_phy_data && (phy_data == 0x8000)) ? 0x4 : 0x0;
1805                        break;
1806                default:
1807                        link_mask = 0x0f1f0000;
1808                        link_val = 0x0f0f0000;
1809                        break;
1810                }
1811
1812                u32temp = nes_read_indexed(nesdev,
1813                                           NES_IDX_PHY_PCS_CONTROL_STATUS0 +
1814                                           (0x200 * (nesdev->mac_index & 1)));
1815
1816                if (phy_type == NES_PHY_TYPE_SFP_D) {
1817                        if (phy_data & 0x0004)
1818                                nesvnic->linkup = 1;
1819                } else {
1820                        if ((u32temp & link_mask) == link_val)
1821                                nesvnic->linkup = 1;
1822                }
1823
1824                /* clear the MAC interrupt status, assumes direct logical to physical mapping */
1825                u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index));
1826                nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp);
1827                nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp);
1828
1829                nes_init_phy(nesdev);
1830        }
1831
1832        nes_vlan_mode(netdev, nesdev, netdev->features);
1833
1834        return netdev;
1835}
1836
1837
1838/**
1839 * nes_netdev_destroy - destroy network device structure
1840 */
1841void nes_netdev_destroy(struct net_device *netdev)
1842{
1843        struct nes_vnic *nesvnic = netdev_priv(netdev);
1844
1845        /* make sure 'stop' method is called by Linux stack */
1846        /* nes_netdev_stop(netdev); */
1847
1848        list_del(&nesvnic->list);
1849
1850        if (nesvnic->of_device_registered) {
1851                nes_destroy_ofa_device(nesvnic->nesibdev);
1852        }
1853
1854        free_netdev(netdev);
1855}
1856
1857
1858/**
1859 * nes_nic_cm_xmit -- CM calls this to send out pkts
1860 */
1861int nes_nic_cm_xmit(struct sk_buff *skb, struct net_device *netdev)
1862{
1863        int ret;
1864
1865        skb->dev = netdev;
1866        ret = dev_queue_xmit(skb);
1867        if (ret) {
1868                nes_debug(NES_DBG_CM, "Bad return code from dev_queue_xmit %d\n", ret);
1869        }
1870
1871        return ret;
1872}
1873