linux/drivers/net/netxen/netxen_nic_main.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2003 - 2009 NetXen, Inc.
   3 * Copyright (C) 2009 - QLogic Corporation.
   4 * All rights reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License
   8 * as published by the Free Software Foundation; either version 2
   9 * of the License, or (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful, but
  12 * WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  19 * MA  02111-1307, USA.
  20 *
  21 * The full GNU General Public License is included in this distribution
  22 * in the file called LICENSE.
  23 *
  24 */
  25
  26#include <linux/vmalloc.h>
  27#include <linux/interrupt.h>
  28#include "netxen_nic_hw.h"
  29
  30#include "netxen_nic.h"
  31
  32#include <linux/dma-mapping.h>
  33#include <linux/if_vlan.h>
  34#include <net/ip.h>
  35#include <linux/ipv6.h>
  36#include <linux/inetdevice.h>
  37
  38MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver");
  39MODULE_LICENSE("GPL");
  40MODULE_VERSION(NETXEN_NIC_LINUX_VERSIONID);
  41
  42char netxen_nic_driver_name[] = "netxen_nic";
  43static char netxen_nic_driver_string[] = "NetXen Network Driver version "
  44    NETXEN_NIC_LINUX_VERSIONID;
  45
  46static int port_mode = NETXEN_PORT_MODE_AUTO_NEG;
  47
  48/* Default to restricted 1G auto-neg mode */
  49static int wol_port_mode = 5;
  50
  51static int use_msi = 1;
  52
  53static int use_msi_x = 1;
  54
  55/* Local functions to NetXen NIC driver */
  56static int __devinit netxen_nic_probe(struct pci_dev *pdev,
  57                const struct pci_device_id *ent);
  58static void __devexit netxen_nic_remove(struct pci_dev *pdev);
  59static int netxen_nic_open(struct net_device *netdev);
  60static int netxen_nic_close(struct net_device *netdev);
  61static netdev_tx_t netxen_nic_xmit_frame(struct sk_buff *,
  62                                               struct net_device *);
  63static void netxen_tx_timeout(struct net_device *netdev);
  64static void netxen_tx_timeout_task(struct work_struct *work);
  65static void netxen_fw_poll_work(struct work_struct *work);
  66static void netxen_schedule_work(struct netxen_adapter *adapter,
  67                work_func_t func, int delay);
  68static void netxen_cancel_fw_work(struct netxen_adapter *adapter);
  69static int netxen_nic_poll(struct napi_struct *napi, int budget);
  70#ifdef CONFIG_NET_POLL_CONTROLLER
  71static void netxen_nic_poll_controller(struct net_device *netdev);
  72#endif
  73
  74static void netxen_create_sysfs_entries(struct netxen_adapter *adapter);
  75static void netxen_remove_sysfs_entries(struct netxen_adapter *adapter);
  76
  77static int nx_decr_dev_ref_cnt(struct netxen_adapter *adapter);
  78static int netxen_can_start_firmware(struct netxen_adapter *adapter);
  79
  80static irqreturn_t netxen_intr(int irq, void *data);
  81static irqreturn_t netxen_msi_intr(int irq, void *data);
  82static irqreturn_t netxen_msix_intr(int irq, void *data);
  83
  84static void netxen_config_indev_addr(struct net_device *dev, unsigned long);
  85
  86/*  PCI Device ID Table  */
  87#define ENTRY(device) \
  88        {PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \
  89        .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
  90
  91static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
  92        ENTRY(PCI_DEVICE_ID_NX2031_10GXSR),
  93        ENTRY(PCI_DEVICE_ID_NX2031_10GCX4),
  94        ENTRY(PCI_DEVICE_ID_NX2031_4GCU),
  95        ENTRY(PCI_DEVICE_ID_NX2031_IMEZ),
  96        ENTRY(PCI_DEVICE_ID_NX2031_HMEZ),
  97        ENTRY(PCI_DEVICE_ID_NX2031_XG_MGMT),
  98        ENTRY(PCI_DEVICE_ID_NX2031_XG_MGMT2),
  99        ENTRY(PCI_DEVICE_ID_NX3031),
 100        {0,}
 101};
 102
 103MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
 104
 105static uint32_t crb_cmd_producer[4] = {
 106        CRB_CMD_PRODUCER_OFFSET, CRB_CMD_PRODUCER_OFFSET_1,
 107        CRB_CMD_PRODUCER_OFFSET_2, CRB_CMD_PRODUCER_OFFSET_3
 108};
 109
 110void
 111netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
 112                struct nx_host_tx_ring *tx_ring)
 113{
 114        NXWRIO(adapter, tx_ring->crb_cmd_producer, tx_ring->producer);
 115
 116        if (netxen_tx_avail(tx_ring) <= TX_STOP_THRESH) {
 117                netif_stop_queue(adapter->netdev);
 118                smp_mb();
 119        }
 120}
 121
 122static uint32_t crb_cmd_consumer[4] = {
 123        CRB_CMD_CONSUMER_OFFSET, CRB_CMD_CONSUMER_OFFSET_1,
 124        CRB_CMD_CONSUMER_OFFSET_2, CRB_CMD_CONSUMER_OFFSET_3
 125};
 126
 127static inline void
 128netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
 129                struct nx_host_tx_ring *tx_ring)
 130{
 131        NXWRIO(adapter, tx_ring->crb_cmd_consumer, tx_ring->sw_consumer);
 132}
 133
 134static uint32_t msi_tgt_status[8] = {
 135        ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
 136        ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
 137        ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
 138        ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
 139};
 140
 141static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG;
 142
 143static inline void netxen_nic_disable_int(struct nx_host_sds_ring *sds_ring)
 144{
 145        struct netxen_adapter *adapter = sds_ring->adapter;
 146
 147        NXWRIO(adapter, sds_ring->crb_intr_mask, 0);
 148}
 149
 150static inline void netxen_nic_enable_int(struct nx_host_sds_ring *sds_ring)
 151{
 152        struct netxen_adapter *adapter = sds_ring->adapter;
 153
 154        NXWRIO(adapter, sds_ring->crb_intr_mask, 0x1);
 155
 156        if (!NETXEN_IS_MSI_FAMILY(adapter))
 157                NXWRIO(adapter, adapter->tgt_mask_reg, 0xfbff);
 158}
 159
 160static int
 161netxen_alloc_sds_rings(struct netxen_recv_context *recv_ctx, int count)
 162{
 163        int size = sizeof(struct nx_host_sds_ring) * count;
 164
 165        recv_ctx->sds_rings = kzalloc(size, GFP_KERNEL);
 166
 167        return (recv_ctx->sds_rings == NULL);
 168}
 169
 170static void
 171netxen_free_sds_rings(struct netxen_recv_context *recv_ctx)
 172{
 173        if (recv_ctx->sds_rings != NULL)
 174                kfree(recv_ctx->sds_rings);
 175
 176        recv_ctx->sds_rings = NULL;
 177}
 178
 179static int
 180netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
 181{
 182        int ring;
 183        struct nx_host_sds_ring *sds_ring;
 184        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 185
 186        if (netxen_alloc_sds_rings(recv_ctx, adapter->max_sds_rings))
 187                return -ENOMEM;
 188
 189        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 190                sds_ring = &recv_ctx->sds_rings[ring];
 191                netif_napi_add(netdev, &sds_ring->napi,
 192                                netxen_nic_poll, NETXEN_NETDEV_WEIGHT);
 193        }
 194
 195        return 0;
 196}
 197
 198static void
 199netxen_napi_del(struct netxen_adapter *adapter)
 200{
 201        int ring;
 202        struct nx_host_sds_ring *sds_ring;
 203        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 204
 205        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 206                sds_ring = &recv_ctx->sds_rings[ring];
 207                netif_napi_del(&sds_ring->napi);
 208        }
 209
 210        netxen_free_sds_rings(&adapter->recv_ctx);
 211}
 212
 213static void
 214netxen_napi_enable(struct netxen_adapter *adapter)
 215{
 216        int ring;
 217        struct nx_host_sds_ring *sds_ring;
 218        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 219
 220        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 221                sds_ring = &recv_ctx->sds_rings[ring];
 222                napi_enable(&sds_ring->napi);
 223                netxen_nic_enable_int(sds_ring);
 224        }
 225}
 226
 227static void
 228netxen_napi_disable(struct netxen_adapter *adapter)
 229{
 230        int ring;
 231        struct nx_host_sds_ring *sds_ring;
 232        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 233
 234        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 235                sds_ring = &recv_ctx->sds_rings[ring];
 236                netxen_nic_disable_int(sds_ring);
 237                napi_synchronize(&sds_ring->napi);
 238                napi_disable(&sds_ring->napi);
 239        }
 240}
 241
 242static int nx_set_dma_mask(struct netxen_adapter *adapter)
 243{
 244        struct pci_dev *pdev = adapter->pdev;
 245        uint64_t mask, cmask;
 246
 247        adapter->pci_using_dac = 0;
 248
 249        mask = DMA_BIT_MASK(32);
 250        cmask = DMA_BIT_MASK(32);
 251
 252        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
 253#ifndef CONFIG_IA64
 254                mask = DMA_BIT_MASK(35);
 255#endif
 256        } else {
 257                mask = DMA_BIT_MASK(39);
 258                cmask = mask;
 259        }
 260
 261        if (pci_set_dma_mask(pdev, mask) == 0 &&
 262                pci_set_consistent_dma_mask(pdev, cmask) == 0) {
 263                adapter->pci_using_dac = 1;
 264                return 0;
 265        }
 266
 267        return -EIO;
 268}
 269
 270/* Update addressable range if firmware supports it */
 271static int
 272nx_update_dma_mask(struct netxen_adapter *adapter)
 273{
 274        int change, shift, err;
 275        uint64_t mask, old_mask, old_cmask;
 276        struct pci_dev *pdev = adapter->pdev;
 277
 278        change = 0;
 279
 280        shift = NXRD32(adapter, CRB_DMA_SHIFT);
 281        if (shift > 32)
 282                return 0;
 283
 284        if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9))
 285                change = 1;
 286        else if ((adapter->ahw.revision_id == NX_P2_C1) && (shift <= 4))
 287                change = 1;
 288
 289        if (change) {
 290                old_mask = pdev->dma_mask;
 291                old_cmask = pdev->dev.coherent_dma_mask;
 292
 293                mask = DMA_BIT_MASK(32+shift);
 294
 295                err = pci_set_dma_mask(pdev, mask);
 296                if (err)
 297                        goto err_out;
 298
 299                if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
 300
 301                        err = pci_set_consistent_dma_mask(pdev, mask);
 302                        if (err)
 303                                goto err_out;
 304                }
 305                dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift);
 306        }
 307
 308        return 0;
 309
 310err_out:
 311        pci_set_dma_mask(pdev, old_mask);
 312        pci_set_consistent_dma_mask(pdev, old_cmask);
 313        return err;
 314}
 315
 316static int
 317netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
 318{
 319        u32 val, timeout;
 320
 321        if (first_boot == 0x55555555) {
 322                /* This is the first boot after power up */
 323                NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
 324
 325                if (!NX_IS_REVISION_P2(adapter->ahw.revision_id))
 326                        return 0;
 327
 328                /* PCI bus master workaround */
 329                first_boot = NXRD32(adapter, NETXEN_PCIE_REG(0x4));
 330                if (!(first_boot & 0x4)) {
 331                        first_boot |= 0x4;
 332                        NXWR32(adapter, NETXEN_PCIE_REG(0x4), first_boot);
 333                        first_boot = NXRD32(adapter, NETXEN_PCIE_REG(0x4));
 334                }
 335
 336                /* This is the first boot after power up */
 337                first_boot = NXRD32(adapter, NETXEN_ROMUSB_GLB_SW_RESET);
 338                if (first_boot != 0x80000f) {
 339                        /* clear the register for future unloads/loads */
 340                        NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), 0);
 341                        return -EIO;
 342                }
 343
 344                /* Start P2 boot loader */
 345                val = NXRD32(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
 346                NXWR32(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
 347                timeout = 0;
 348                do {
 349                        msleep(1);
 350                        val = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
 351
 352                        if (++timeout > 5000)
 353                                return -EIO;
 354
 355                } while (val == NETXEN_BDINFO_MAGIC);
 356        }
 357        return 0;
 358}
 359
 360static void netxen_set_port_mode(struct netxen_adapter *adapter)
 361{
 362        u32 val, data;
 363
 364        val = adapter->ahw.board_type;
 365        if ((val == NETXEN_BRDTYPE_P3_HMEZ) ||
 366                (val == NETXEN_BRDTYPE_P3_XG_LOM)) {
 367                if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
 368                        data = NETXEN_PORT_MODE_802_3_AP;
 369                        NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
 370                } else if (port_mode == NETXEN_PORT_MODE_XG) {
 371                        data = NETXEN_PORT_MODE_XG;
 372                        NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
 373                } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_1G) {
 374                        data = NETXEN_PORT_MODE_AUTO_NEG_1G;
 375                        NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
 376                } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_XG) {
 377                        data = NETXEN_PORT_MODE_AUTO_NEG_XG;
 378                        NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
 379                } else {
 380                        data = NETXEN_PORT_MODE_AUTO_NEG;
 381                        NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
 382                }
 383
 384                if ((wol_port_mode != NETXEN_PORT_MODE_802_3_AP) &&
 385                        (wol_port_mode != NETXEN_PORT_MODE_XG) &&
 386                        (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_1G) &&
 387                        (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_XG)) {
 388                        wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG;
 389                }
 390                NXWR32(adapter, NETXEN_WOL_PORT_MODE, wol_port_mode);
 391        }
 392}
 393
 394static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
 395{
 396        u32 control;
 397        int pos;
 398
 399        pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
 400        if (pos) {
 401                pci_read_config_dword(pdev, pos, &control);
 402                if (enable)
 403                        control |= PCI_MSIX_FLAGS_ENABLE;
 404                else
 405                        control = 0;
 406                pci_write_config_dword(pdev, pos, control);
 407        }
 408}
 409
 410static void netxen_init_msix_entries(struct netxen_adapter *adapter, int count)
 411{
 412        int i;
 413
 414        for (i = 0; i < count; i++)
 415                adapter->msix_entries[i].entry = i;
 416}
 417
 418static int
 419netxen_read_mac_addr(struct netxen_adapter *adapter)
 420{
 421        int i;
 422        unsigned char *p;
 423        __le64 mac_addr;
 424        struct net_device *netdev = adapter->netdev;
 425        struct pci_dev *pdev = adapter->pdev;
 426
 427        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
 428                if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)
 429                        return -EIO;
 430        } else {
 431                if (netxen_get_flash_mac_addr(adapter, &mac_addr) != 0)
 432                        return -EIO;
 433        }
 434
 435        p = (unsigned char *)&mac_addr;
 436        for (i = 0; i < 6; i++)
 437                netdev->dev_addr[i] = *(p + 5 - i);
 438
 439        memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
 440        memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len);
 441
 442        /* set station address */
 443
 444        if (!is_valid_ether_addr(netdev->perm_addr))
 445                dev_warn(&pdev->dev, "Bad MAC address %pM.\n", netdev->dev_addr);
 446
 447        return 0;
 448}
 449
 450int netxen_nic_set_mac(struct net_device *netdev, void *p)
 451{
 452        struct netxen_adapter *adapter = netdev_priv(netdev);
 453        struct sockaddr *addr = p;
 454
 455        if (!is_valid_ether_addr(addr->sa_data))
 456                return -EINVAL;
 457
 458        if (netif_running(netdev)) {
 459                netif_device_detach(netdev);
 460                netxen_napi_disable(adapter);
 461        }
 462
 463        memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len);
 464        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
 465        adapter->macaddr_set(adapter, addr->sa_data);
 466
 467        if (netif_running(netdev)) {
 468                netif_device_attach(netdev);
 469                netxen_napi_enable(adapter);
 470        }
 471        return 0;
 472}
 473
 474static void netxen_set_multicast_list(struct net_device *dev)
 475{
 476        struct netxen_adapter *adapter = netdev_priv(dev);
 477
 478        adapter->set_multi(dev);
 479}
 480
 481static const struct net_device_ops netxen_netdev_ops = {
 482        .ndo_open          = netxen_nic_open,
 483        .ndo_stop          = netxen_nic_close,
 484        .ndo_start_xmit    = netxen_nic_xmit_frame,
 485        .ndo_get_stats     = netxen_nic_get_stats,
 486        .ndo_validate_addr = eth_validate_addr,
 487        .ndo_set_multicast_list = netxen_set_multicast_list,
 488        .ndo_set_mac_address    = netxen_nic_set_mac,
 489        .ndo_change_mtu    = netxen_nic_change_mtu,
 490        .ndo_tx_timeout    = netxen_tx_timeout,
 491#ifdef CONFIG_NET_POLL_CONTROLLER
 492        .ndo_poll_controller = netxen_nic_poll_controller,
 493#endif
 494};
 495
 496static void
 497netxen_setup_intr(struct netxen_adapter *adapter)
 498{
 499        struct netxen_legacy_intr_set *legacy_intrp;
 500        struct pci_dev *pdev = adapter->pdev;
 501        int err, num_msix;
 502
 503        if (adapter->rss_supported) {
 504                num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ?
 505                        MSIX_ENTRIES_PER_ADAPTER : 2;
 506        } else
 507                num_msix = 1;
 508
 509        adapter->max_sds_rings = 1;
 510
 511        adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
 512
 513        if (adapter->ahw.revision_id >= NX_P3_B0)
 514                legacy_intrp = &legacy_intr[adapter->ahw.pci_func];
 515        else
 516                legacy_intrp = &legacy_intr[0];
 517
 518        adapter->int_vec_bit = legacy_intrp->int_vec_bit;
 519        adapter->tgt_status_reg = netxen_get_ioaddr(adapter,
 520                        legacy_intrp->tgt_status_reg);
 521        adapter->tgt_mask_reg = netxen_get_ioaddr(adapter,
 522                        legacy_intrp->tgt_mask_reg);
 523        adapter->pci_int_reg = netxen_get_ioaddr(adapter,
 524                        legacy_intrp->pci_int_reg);
 525        adapter->isr_int_vec = netxen_get_ioaddr(adapter, ISR_INT_VECTOR);
 526
 527        if (adapter->ahw.revision_id >= NX_P3_B1)
 528                adapter->crb_int_state_reg = netxen_get_ioaddr(adapter,
 529                        ISR_INT_STATE_REG);
 530        else
 531                adapter->crb_int_state_reg = netxen_get_ioaddr(adapter,
 532                        CRB_INT_VECTOR);
 533
 534        netxen_set_msix_bit(pdev, 0);
 535
 536        if (adapter->msix_supported) {
 537
 538                netxen_init_msix_entries(adapter, num_msix);
 539                err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
 540                if (err == 0) {
 541                        adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
 542                        netxen_set_msix_bit(pdev, 1);
 543
 544                        if (adapter->rss_supported)
 545                                adapter->max_sds_rings = num_msix;
 546
 547                        dev_info(&pdev->dev, "using msi-x interrupts\n");
 548                        return;
 549                }
 550
 551                if (err > 0)
 552                        pci_disable_msix(pdev);
 553
 554                /* fall through for msi */
 555        }
 556
 557        if (use_msi && !pci_enable_msi(pdev)) {
 558                adapter->flags |= NETXEN_NIC_MSI_ENABLED;
 559                adapter->tgt_status_reg = netxen_get_ioaddr(adapter,
 560                                msi_tgt_status[adapter->ahw.pci_func]);
 561                dev_info(&pdev->dev, "using msi interrupts\n");
 562                adapter->msix_entries[0].vector = pdev->irq;
 563                return;
 564        }
 565
 566        dev_info(&pdev->dev, "using legacy interrupts\n");
 567        adapter->msix_entries[0].vector = pdev->irq;
 568}
 569
 570static void
 571netxen_teardown_intr(struct netxen_adapter *adapter)
 572{
 573        if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
 574                pci_disable_msix(adapter->pdev);
 575        if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
 576                pci_disable_msi(adapter->pdev);
 577}
 578
 579static void
 580netxen_cleanup_pci_map(struct netxen_adapter *adapter)
 581{
 582        if (adapter->ahw.db_base != NULL)
 583                iounmap(adapter->ahw.db_base);
 584        if (adapter->ahw.pci_base0 != NULL)
 585                iounmap(adapter->ahw.pci_base0);
 586        if (adapter->ahw.pci_base1 != NULL)
 587                iounmap(adapter->ahw.pci_base1);
 588        if (adapter->ahw.pci_base2 != NULL)
 589                iounmap(adapter->ahw.pci_base2);
 590}
 591
 592static int
 593netxen_setup_pci_map(struct netxen_adapter *adapter)
 594{
 595        void __iomem *mem_ptr0 = NULL;
 596        void __iomem *mem_ptr1 = NULL;
 597        void __iomem *mem_ptr2 = NULL;
 598        void __iomem *db_ptr = NULL;
 599
 600        resource_size_t mem_base, db_base;
 601        unsigned long mem_len, db_len = 0, pci_len0 = 0;
 602
 603        struct pci_dev *pdev = adapter->pdev;
 604        int pci_func = adapter->ahw.pci_func;
 605
 606        int err = 0;
 607
 608        /*
 609         * Set the CRB window to invalid. If any register in window 0 is
 610         * accessed it should set the window to 0 and then reset it to 1.
 611         */
 612        adapter->curr_window = 255;
 613        adapter->ahw.qdr_sn_window = -1;
 614        adapter->ahw.ddr_mn_window = -1;
 615
 616        /* remap phys address */
 617        mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
 618        mem_len = pci_resource_len(pdev, 0);
 619        pci_len0 = 0;
 620
 621        /* 128 Meg of memory */
 622        if (mem_len == NETXEN_PCI_128MB_SIZE) {
 623                mem_ptr0 = ioremap(mem_base, FIRST_PAGE_GROUP_SIZE);
 624                mem_ptr1 = ioremap(mem_base + SECOND_PAGE_GROUP_START,
 625                                SECOND_PAGE_GROUP_SIZE);
 626                mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START,
 627                                THIRD_PAGE_GROUP_SIZE);
 628        } else if (mem_len == NETXEN_PCI_32MB_SIZE) {
 629                mem_ptr1 = ioremap(mem_base, SECOND_PAGE_GROUP_SIZE);
 630                mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START -
 631                        SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE);
 632        } else if (mem_len == NETXEN_PCI_2MB_SIZE) {
 633
 634                mem_ptr0 = pci_ioremap_bar(pdev, 0);
 635                if (mem_ptr0 == NULL) {
 636                        dev_err(&pdev->dev, "failed to map PCI bar 0\n");
 637                        return -EIO;
 638                }
 639                pci_len0 = mem_len;
 640
 641                adapter->ahw.ddr_mn_window = 0;
 642                adapter->ahw.qdr_sn_window = 0;
 643
 644                adapter->ahw.mn_win_crb = NETXEN_PCI_CRBSPACE +
 645                        0x100000 + PCIX_MN_WINDOW + (pci_func * 0x20);
 646                adapter->ahw.ms_win_crb = NETXEN_PCI_CRBSPACE +
 647                        0x100000 + PCIX_SN_WINDOW;
 648                if (pci_func < 4)
 649                        adapter->ahw.ms_win_crb += (pci_func * 0x20);
 650                else
 651                        adapter->ahw.ms_win_crb +=
 652                                        0xA0 + ((pci_func - 4) * 0x10);
 653        } else {
 654                return -EIO;
 655        }
 656
 657        netxen_setup_hwops(adapter);
 658
 659        dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20));
 660
 661        adapter->ahw.pci_base0 = mem_ptr0;
 662        adapter->ahw.pci_len0 = pci_len0;
 663        adapter->ahw.pci_base1 = mem_ptr1;
 664        adapter->ahw.pci_base2 = mem_ptr2;
 665
 666        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
 667                goto skip_doorbell;
 668
 669        db_base = pci_resource_start(pdev, 4);  /* doorbell is on bar 4 */
 670        db_len = pci_resource_len(pdev, 4);
 671
 672        if (db_len == 0) {
 673                printk(KERN_ERR "%s: doorbell is disabled\n",
 674                                netxen_nic_driver_name);
 675                err = -EIO;
 676                goto err_out;
 677        }
 678
 679        db_ptr = ioremap(db_base, NETXEN_DB_MAPSIZE_BYTES);
 680        if (!db_ptr) {
 681                printk(KERN_ERR "%s: Failed to allocate doorbell map.",
 682                                netxen_nic_driver_name);
 683                err = -EIO;
 684                goto err_out;
 685        }
 686
 687skip_doorbell:
 688        adapter->ahw.db_base = db_ptr;
 689        adapter->ahw.db_len = db_len;
 690        return 0;
 691
 692err_out:
 693        netxen_cleanup_pci_map(adapter);
 694        return err;
 695}
 696
 697static void
 698netxen_check_options(struct netxen_adapter *adapter)
 699{
 700        u32 fw_major, fw_minor, fw_build;
 701        char brd_name[NETXEN_MAX_SHORT_NAME];
 702        char serial_num[32];
 703        int i, offset, val;
 704        int *ptr32;
 705        struct pci_dev *pdev = adapter->pdev;
 706
 707        adapter->driver_mismatch = 0;
 708
 709        ptr32 = (int *)&serial_num;
 710        offset = NX_FW_SERIAL_NUM_OFFSET;
 711        for (i = 0; i < 8; i++) {
 712                if (netxen_rom_fast_read(adapter, offset, &val) == -1) {
 713                        dev_err(&pdev->dev, "error reading board info\n");
 714                        adapter->driver_mismatch = 1;
 715                        return;
 716                }
 717                ptr32[i] = cpu_to_le32(val);
 718                offset += sizeof(u32);
 719        }
 720
 721        fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
 722        fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
 723        fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
 724
 725        adapter->fw_version = NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build);
 726
 727        if (adapter->portnum == 0) {
 728                get_brd_name_by_type(adapter->ahw.board_type, brd_name);
 729
 730                printk(KERN_INFO "NetXen %s Board S/N %s  Chip rev 0x%x\n",
 731                                brd_name, serial_num, adapter->ahw.revision_id);
 732        }
 733
 734        if (adapter->fw_version < NETXEN_VERSION_CODE(3, 4, 216)) {
 735                adapter->driver_mismatch = 1;
 736                dev_warn(&pdev->dev, "firmware version %d.%d.%d unsupported\n",
 737                                fw_major, fw_minor, fw_build);
 738                return;
 739        }
 740
 741        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
 742                i = NXRD32(adapter, NETXEN_SRE_MISC);
 743                adapter->ahw.cut_through = (i & 0x8000) ? 1 : 0;
 744        }
 745
 746        dev_info(&pdev->dev, "firmware v%d.%d.%d [%s]\n",
 747                        fw_major, fw_minor, fw_build,
 748                        adapter->ahw.cut_through ? "cut-through" : "legacy");
 749
 750        if (adapter->fw_version >= NETXEN_VERSION_CODE(4, 0, 222))
 751                adapter->capabilities = NXRD32(adapter, CRB_FW_CAPABILITIES_1);
 752
 753        adapter->flags &= ~NETXEN_NIC_LRO_ENABLED;
 754
 755        if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
 756                adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
 757                adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
 758        } else if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
 759                adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
 760                adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
 761        }
 762
 763        adapter->msix_supported = 0;
 764        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
 765                adapter->msix_supported = !!use_msi_x;
 766                adapter->rss_supported = !!use_msi_x;
 767        } else if (adapter->fw_version >= NETXEN_VERSION_CODE(3, 4, 336)) {
 768                switch (adapter->ahw.board_type) {
 769                case NETXEN_BRDTYPE_P2_SB31_10G:
 770                case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
 771                        adapter->msix_supported = !!use_msi_x;
 772                        adapter->rss_supported = !!use_msi_x;
 773                        break;
 774                default:
 775                        break;
 776                }
 777        }
 778
 779        adapter->num_txd = MAX_CMD_DESCRIPTORS;
 780
 781        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
 782                adapter->num_lro_rxd = MAX_LRO_RCV_DESCRIPTORS;
 783                adapter->max_rds_rings = 3;
 784        } else {
 785                adapter->num_lro_rxd = 0;
 786                adapter->max_rds_rings = 2;
 787        }
 788}
 789
 790static int
 791netxen_start_firmware(struct netxen_adapter *adapter)
 792{
 793        int val, err, first_boot;
 794        struct pci_dev *pdev = adapter->pdev;
 795
 796        /* required for NX2031 dummy dma */
 797        err = nx_set_dma_mask(adapter);
 798        if (err)
 799                return err;
 800
 801        if (!netxen_can_start_firmware(adapter))
 802                goto wait_init;
 803
 804        first_boot = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
 805
 806        err = netxen_check_hw_init(adapter, first_boot);
 807        if (err) {
 808                dev_err(&pdev->dev, "error in init HW init sequence\n");
 809                return err;
 810        }
 811
 812        netxen_request_firmware(adapter);
 813
 814        err = netxen_need_fw_reset(adapter);
 815        if (err < 0)
 816                goto err_out;
 817        if (err == 0)
 818                goto ready;
 819
 820        if (first_boot != 0x55555555) {
 821                NXWR32(adapter, CRB_CMDPEG_STATE, 0);
 822                netxen_pinit_from_rom(adapter, 0);
 823                msleep(1);
 824        }
 825
 826        NXWR32(adapter, CRB_DMA_SHIFT, 0x55555555);
 827        NXWR32(adapter, NETXEN_PEG_HALT_STATUS1, 0);
 828        NXWR32(adapter, NETXEN_PEG_HALT_STATUS2, 0);
 829
 830        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
 831                netxen_set_port_mode(adapter);
 832
 833        err = netxen_load_firmware(adapter);
 834        if (err)
 835                goto err_out;
 836
 837        netxen_release_firmware(adapter);
 838
 839        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
 840
 841                /* Initialize multicast addr pool owners */
 842                val = 0x7654;
 843                if (adapter->ahw.port_type == NETXEN_NIC_XGBE)
 844                        val |= 0x0f000000;
 845                NXWR32(adapter, NETXEN_MAC_ADDR_CNTL_REG, val);
 846
 847        }
 848
 849        err = netxen_init_dummy_dma(adapter);
 850        if (err)
 851                goto err_out;
 852
 853        /*
 854         * Tell the hardware our version number.
 855         */
 856        val = (_NETXEN_NIC_LINUX_MAJOR << 16)
 857                | ((_NETXEN_NIC_LINUX_MINOR << 8))
 858                | (_NETXEN_NIC_LINUX_SUBVERSION);
 859        NXWR32(adapter, CRB_DRIVER_VERSION, val);
 860
 861ready:
 862        NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_READY);
 863
 864wait_init:
 865        /* Handshake with the card before we register the devices. */
 866        err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
 867        if (err) {
 868                netxen_free_dummy_dma(adapter);
 869                goto err_out;
 870        }
 871
 872        nx_update_dma_mask(adapter);
 873
 874        netxen_check_options(adapter);
 875
 876        adapter->need_fw_reset = 0;
 877
 878        /* fall through and release firmware */
 879
 880err_out:
 881        netxen_release_firmware(adapter);
 882        return err;
 883}
 884
 885static int
 886netxen_nic_request_irq(struct netxen_adapter *adapter)
 887{
 888        irq_handler_t handler;
 889        struct nx_host_sds_ring *sds_ring;
 890        int err, ring;
 891
 892        unsigned long flags = IRQF_SAMPLE_RANDOM;
 893        struct net_device *netdev = adapter->netdev;
 894        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 895
 896        if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
 897                handler = netxen_msix_intr;
 898        else if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
 899                handler = netxen_msi_intr;
 900        else {
 901                flags |= IRQF_SHARED;
 902                handler = netxen_intr;
 903        }
 904        adapter->irq = netdev->irq;
 905
 906        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 907                sds_ring = &recv_ctx->sds_rings[ring];
 908                sprintf(sds_ring->name, "%s[%d]", netdev->name, ring);
 909                err = request_irq(sds_ring->irq, handler,
 910                                  flags, sds_ring->name, sds_ring);
 911                if (err)
 912                        return err;
 913        }
 914
 915        return 0;
 916}
 917
 918static void
 919netxen_nic_free_irq(struct netxen_adapter *adapter)
 920{
 921        int ring;
 922        struct nx_host_sds_ring *sds_ring;
 923
 924        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
 925
 926        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 927                sds_ring = &recv_ctx->sds_rings[ring];
 928                free_irq(sds_ring->irq, sds_ring);
 929        }
 930}
 931
 932static void
 933netxen_nic_init_coalesce_defaults(struct netxen_adapter *adapter)
 934{
 935        adapter->coal.flags = NETXEN_NIC_INTR_DEFAULT;
 936        adapter->coal.normal.data.rx_time_us =
 937                NETXEN_DEFAULT_INTR_COALESCE_RX_TIME_US;
 938        adapter->coal.normal.data.rx_packets =
 939                NETXEN_DEFAULT_INTR_COALESCE_RX_PACKETS;
 940        adapter->coal.normal.data.tx_time_us =
 941                NETXEN_DEFAULT_INTR_COALESCE_TX_TIME_US;
 942        adapter->coal.normal.data.tx_packets =
 943                NETXEN_DEFAULT_INTR_COALESCE_TX_PACKETS;
 944}
 945
 946static int
 947netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
 948{
 949        int err;
 950
 951        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
 952                return -EIO;
 953
 954        err = adapter->init_port(adapter, adapter->physical_port);
 955        if (err) {
 956                printk(KERN_ERR "%s: Failed to initialize port %d\n",
 957                                netxen_nic_driver_name, adapter->portnum);
 958                return err;
 959        }
 960        if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
 961                adapter->macaddr_set(adapter, adapter->mac_addr);
 962
 963        adapter->set_multi(netdev);
 964        adapter->set_mtu(adapter, netdev->mtu);
 965
 966        adapter->ahw.linkup = 0;
 967
 968        if (adapter->max_sds_rings > 1)
 969                netxen_config_rss(adapter, 1);
 970
 971        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
 972                netxen_config_intr_coalesce(adapter);
 973
 974        if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)
 975                netxen_config_hw_lro(adapter, NETXEN_NIC_LRO_ENABLED);
 976
 977        netxen_napi_enable(adapter);
 978
 979        if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)
 980                netxen_linkevent_request(adapter, 1);
 981        else
 982                netxen_nic_set_link_parameters(adapter);
 983
 984        set_bit(__NX_DEV_UP, &adapter->state);
 985        return 0;
 986}
 987
 988static void
 989netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
 990{
 991        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
 992                return;
 993
 994        clear_bit(__NX_DEV_UP, &adapter->state);
 995
 996        spin_lock(&adapter->tx_clean_lock);
 997        netif_carrier_off(netdev);
 998        netif_tx_disable(netdev);
 999
1000        if (adapter->stop_port)
1001                adapter->stop_port(adapter);
1002
1003        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1004                netxen_p3_free_mac_list(adapter);
1005
1006        adapter->set_promisc(adapter, NETXEN_NIU_NON_PROMISC_MODE);
1007
1008        netxen_napi_disable(adapter);
1009
1010        netxen_release_tx_buffers(adapter);
1011        spin_unlock(&adapter->tx_clean_lock);
1012}
1013
1014
1015static int
1016netxen_nic_attach(struct netxen_adapter *adapter)
1017{
1018        struct net_device *netdev = adapter->netdev;
1019        struct pci_dev *pdev = adapter->pdev;
1020        int err, ring;
1021        struct nx_host_rds_ring *rds_ring;
1022        struct nx_host_tx_ring *tx_ring;
1023
1024        if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC)
1025                return 0;
1026
1027        err = netxen_init_firmware(adapter);
1028        if (err)
1029                return err;
1030
1031        err = netxen_napi_add(adapter, netdev);
1032        if (err)
1033                return err;
1034
1035        err = netxen_alloc_sw_resources(adapter);
1036        if (err) {
1037                printk(KERN_ERR "%s: Error in setting sw resources\n",
1038                                netdev->name);
1039                return err;
1040        }
1041
1042        err = netxen_alloc_hw_resources(adapter);
1043        if (err) {
1044                printk(KERN_ERR "%s: Error in setting hw resources\n",
1045                                netdev->name);
1046                goto err_out_free_sw;
1047        }
1048
1049        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1050                tx_ring = adapter->tx_ring;
1051                tx_ring->crb_cmd_producer = netxen_get_ioaddr(adapter,
1052                                crb_cmd_producer[adapter->portnum]);
1053                tx_ring->crb_cmd_consumer = netxen_get_ioaddr(adapter,
1054                                crb_cmd_consumer[adapter->portnum]);
1055
1056                tx_ring->producer = 0;
1057                tx_ring->sw_consumer = 0;
1058
1059                netxen_nic_update_cmd_producer(adapter, tx_ring);
1060                netxen_nic_update_cmd_consumer(adapter, tx_ring);
1061        }
1062
1063        for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1064                rds_ring = &adapter->recv_ctx.rds_rings[ring];
1065                netxen_post_rx_buffers(adapter, ring, rds_ring);
1066        }
1067
1068        err = netxen_nic_request_irq(adapter);
1069        if (err) {
1070                dev_err(&pdev->dev, "%s: failed to setup interrupt\n",
1071                                netdev->name);
1072                goto err_out_free_rxbuf;
1073        }
1074
1075        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1076                netxen_nic_init_coalesce_defaults(adapter);
1077
1078        netxen_create_sysfs_entries(adapter);
1079
1080        adapter->is_up = NETXEN_ADAPTER_UP_MAGIC;
1081        return 0;
1082
1083err_out_free_rxbuf:
1084        netxen_release_rx_buffers(adapter);
1085        netxen_free_hw_resources(adapter);
1086err_out_free_sw:
1087        netxen_free_sw_resources(adapter);
1088        return err;
1089}
1090
1091static void
1092netxen_nic_detach(struct netxen_adapter *adapter)
1093{
1094        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
1095                return;
1096
1097        netxen_remove_sysfs_entries(adapter);
1098
1099        netxen_free_hw_resources(adapter);
1100        netxen_release_rx_buffers(adapter);
1101        netxen_nic_free_irq(adapter);
1102        netxen_napi_del(adapter);
1103        netxen_free_sw_resources(adapter);
1104
1105        adapter->is_up = 0;
1106}
1107
1108int
1109netxen_nic_reset_context(struct netxen_adapter *adapter)
1110{
1111        int err = 0;
1112        struct net_device *netdev = adapter->netdev;
1113
1114        if (test_and_set_bit(__NX_RESETTING, &adapter->state))
1115                return -EBUSY;
1116
1117        if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
1118
1119                netif_device_detach(netdev);
1120
1121                if (netif_running(netdev))
1122                        netxen_nic_down(adapter, netdev);
1123
1124                netxen_nic_detach(adapter);
1125
1126                if (netif_running(netdev)) {
1127                        err = netxen_nic_attach(adapter);
1128                        if (!err)
1129                                err = netxen_nic_up(adapter, netdev);
1130
1131                        if (err)
1132                                goto done;
1133                }
1134
1135                netif_device_attach(netdev);
1136        }
1137
1138done:
1139        clear_bit(__NX_RESETTING, &adapter->state);
1140        return err;
1141}
1142
1143static int
1144netxen_setup_netdev(struct netxen_adapter *adapter,
1145                struct net_device *netdev)
1146{
1147        int err = 0;
1148        struct pci_dev *pdev = adapter->pdev;
1149
1150        adapter->rx_csum = 1;
1151        adapter->mc_enabled = 0;
1152        if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1153                adapter->max_mc_count = 38;
1154        else
1155                adapter->max_mc_count = 16;
1156
1157        netdev->netdev_ops         = &netxen_netdev_ops;
1158        netdev->watchdog_timeo     = 2*HZ;
1159
1160        netxen_nic_change_mtu(netdev, netdev->mtu);
1161
1162        SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
1163
1164        netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
1165        netdev->features |= (NETIF_F_GRO);
1166        netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
1167
1168        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1169                netdev->features |= (NETIF_F_IPV6_CSUM | NETIF_F_TSO6);
1170                netdev->vlan_features |= (NETIF_F_IPV6_CSUM | NETIF_F_TSO6);
1171        }
1172
1173        if (adapter->pci_using_dac) {
1174                netdev->features |= NETIF_F_HIGHDMA;
1175                netdev->vlan_features |= NETIF_F_HIGHDMA;
1176        }
1177
1178        if (adapter->capabilities & NX_FW_CAPABILITY_FVLANTX)
1179                netdev->features |= (NETIF_F_HW_VLAN_TX);
1180
1181        if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)
1182                netdev->features |= NETIF_F_LRO;
1183
1184        netdev->irq = adapter->msix_entries[0].vector;
1185
1186        INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
1187
1188        if (netxen_read_mac_addr(adapter))
1189                dev_warn(&pdev->dev, "failed to read mac addr\n");
1190
1191        netif_carrier_off(netdev);
1192        netif_stop_queue(netdev);
1193
1194        err = register_netdev(netdev);
1195        if (err) {
1196                dev_err(&pdev->dev, "failed to register net device\n");
1197                return err;
1198        }
1199
1200        return 0;
1201}
1202
1203static int __devinit
1204netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1205{
1206        struct net_device *netdev = NULL;
1207        struct netxen_adapter *adapter = NULL;
1208        int i = 0, err;
1209        int pci_func_id = PCI_FUNC(pdev->devfn);
1210        uint8_t revision_id;
1211
1212        if (pdev->class != 0x020000) {
1213                printk(KERN_DEBUG "NetXen function %d, class %x will not "
1214                                "be enabled.\n",pci_func_id, pdev->class);
1215                return -ENODEV;
1216        }
1217
1218        if (pdev->revision >= NX_P3_A0 && pdev->revision < NX_P3_B1) {
1219                printk(KERN_WARNING "NetXen chip revisions between 0x%x-0x%x"
1220                                "will not be enabled.\n",
1221                                NX_P3_A0, NX_P3_B1);
1222                return -ENODEV;
1223        }
1224
1225        if ((err = pci_enable_device(pdev)))
1226                return err;
1227
1228        if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
1229                err = -ENODEV;
1230                goto err_out_disable_pdev;
1231        }
1232
1233        if ((err = pci_request_regions(pdev, netxen_nic_driver_name)))
1234                goto err_out_disable_pdev;
1235
1236        pci_set_master(pdev);
1237
1238        netdev = alloc_etherdev(sizeof(struct netxen_adapter));
1239        if(!netdev) {
1240                dev_err(&pdev->dev, "failed to allocate net_device\n");
1241                err = -ENOMEM;
1242                goto err_out_free_res;
1243        }
1244
1245        SET_NETDEV_DEV(netdev, &pdev->dev);
1246
1247        adapter = netdev_priv(netdev);
1248        adapter->netdev  = netdev;
1249        adapter->pdev    = pdev;
1250        adapter->ahw.pci_func  = pci_func_id;
1251
1252        revision_id = pdev->revision;
1253        adapter->ahw.revision_id = revision_id;
1254
1255        rwlock_init(&adapter->adapter_lock);
1256        spin_lock_init(&adapter->tx_clean_lock);
1257        INIT_LIST_HEAD(&adapter->mac_list);
1258
1259        err = netxen_setup_pci_map(adapter);
1260        if (err)
1261                goto err_out_free_netdev;
1262
1263        /* This will be reset for mezz cards  */
1264        adapter->portnum = pci_func_id;
1265
1266        err = netxen_nic_get_board_info(adapter);
1267        if (err) {
1268                dev_err(&pdev->dev, "Error getting board config info.\n");
1269                goto err_out_iounmap;
1270        }
1271
1272        /* Mezz cards have PCI function 0,2,3 enabled */
1273        switch (adapter->ahw.board_type) {
1274        case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
1275        case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
1276                if (pci_func_id >= 2)
1277                        adapter->portnum = pci_func_id - 2;
1278                break;
1279        default:
1280                break;
1281        }
1282
1283        err = netxen_start_firmware(adapter);
1284        if (err)
1285                goto err_out_iounmap;
1286
1287        /*
1288         * See if the firmware gave us a virtual-physical port mapping.
1289         */
1290        adapter->physical_port = adapter->portnum;
1291        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1292                i = NXRD32(adapter, CRB_V2P(adapter->portnum));
1293                if (i != 0x55555555)
1294                        adapter->physical_port = i;
1295        }
1296
1297        netxen_nic_clear_stats(adapter);
1298
1299        netxen_setup_intr(adapter);
1300
1301        err = netxen_setup_netdev(adapter, netdev);
1302        if (err)
1303                goto err_out_disable_msi;
1304
1305        pci_set_drvdata(pdev, adapter);
1306
1307        netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
1308
1309        switch (adapter->ahw.port_type) {
1310        case NETXEN_NIC_GBE:
1311                dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
1312                                adapter->netdev->name);
1313                break;
1314        case NETXEN_NIC_XGBE:
1315                dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
1316                                adapter->netdev->name);
1317                break;
1318        }
1319
1320        return 0;
1321
1322err_out_disable_msi:
1323        netxen_teardown_intr(adapter);
1324
1325        netxen_free_dummy_dma(adapter);
1326
1327        nx_decr_dev_ref_cnt(adapter);
1328
1329err_out_iounmap:
1330        netxen_cleanup_pci_map(adapter);
1331
1332err_out_free_netdev:
1333        free_netdev(netdev);
1334
1335err_out_free_res:
1336        pci_release_regions(pdev);
1337
1338err_out_disable_pdev:
1339        pci_set_drvdata(pdev, NULL);
1340        pci_disable_device(pdev);
1341        return err;
1342}
1343
1344static void __devexit netxen_nic_remove(struct pci_dev *pdev)
1345{
1346        struct netxen_adapter *adapter;
1347        struct net_device *netdev;
1348
1349        adapter = pci_get_drvdata(pdev);
1350        if (adapter == NULL)
1351                return;
1352
1353        netdev = adapter->netdev;
1354
1355        netxen_cancel_fw_work(adapter);
1356
1357        unregister_netdev(netdev);
1358
1359        cancel_work_sync(&adapter->tx_timeout_task);
1360
1361        netxen_nic_detach(adapter);
1362
1363        nx_decr_dev_ref_cnt(adapter);
1364
1365        if (adapter->portnum == 0)
1366                netxen_free_dummy_dma(adapter);
1367
1368        clear_bit(__NX_RESETTING, &adapter->state);
1369
1370        netxen_teardown_intr(adapter);
1371
1372        netxen_cleanup_pci_map(adapter);
1373
1374        netxen_release_firmware(adapter);
1375
1376        pci_release_regions(pdev);
1377        pci_disable_device(pdev);
1378        pci_set_drvdata(pdev, NULL);
1379
1380        free_netdev(netdev);
1381}
1382static int __netxen_nic_shutdown(struct pci_dev *pdev)
1383{
1384        struct netxen_adapter *adapter = pci_get_drvdata(pdev);
1385        struct net_device *netdev = adapter->netdev;
1386        int retval;
1387
1388        netif_device_detach(netdev);
1389
1390        netxen_cancel_fw_work(adapter);
1391
1392        if (netif_running(netdev))
1393                netxen_nic_down(adapter, netdev);
1394
1395        cancel_work_sync(&adapter->tx_timeout_task);
1396
1397        netxen_nic_detach(adapter);
1398
1399        if (adapter->portnum == 0)
1400                netxen_free_dummy_dma(adapter);
1401
1402        nx_decr_dev_ref_cnt(adapter);
1403
1404        clear_bit(__NX_RESETTING, &adapter->state);
1405
1406        retval = pci_save_state(pdev);
1407        if (retval)
1408                return retval;
1409
1410        if (netxen_nic_wol_supported(adapter)) {
1411                pci_enable_wake(pdev, PCI_D3cold, 1);
1412                pci_enable_wake(pdev, PCI_D3hot, 1);
1413        }
1414
1415        pci_disable_device(pdev);
1416
1417        return 0;
1418}
1419static void netxen_nic_shutdown(struct pci_dev *pdev)
1420{
1421        if (__netxen_nic_shutdown(pdev))
1422                return;
1423}
1424#ifdef CONFIG_PM
1425static int
1426netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
1427{
1428        int retval;
1429
1430        retval = __netxen_nic_shutdown(pdev);
1431        if (retval)
1432                return retval;
1433
1434        pci_set_power_state(pdev, pci_choose_state(pdev, state));
1435        return 0;
1436}
1437
1438static int
1439netxen_nic_resume(struct pci_dev *pdev)
1440{
1441        struct netxen_adapter *adapter = pci_get_drvdata(pdev);
1442        struct net_device *netdev = adapter->netdev;
1443        int err;
1444
1445        pci_set_power_state(pdev, PCI_D0);
1446        pci_restore_state(pdev);
1447
1448        err = pci_enable_device(pdev);
1449        if (err)
1450                return err;
1451
1452        adapter->curr_window = 255;
1453
1454        err = netxen_start_firmware(adapter);
1455        if (err) {
1456                dev_err(&pdev->dev, "failed to start firmware\n");
1457                return err;
1458        }
1459
1460        if (netif_running(netdev)) {
1461                err = netxen_nic_attach(adapter);
1462                if (err)
1463                        goto err_out;
1464
1465                err = netxen_nic_up(adapter, netdev);
1466                if (err)
1467                        goto err_out_detach;
1468
1469                netif_device_attach(netdev);
1470
1471                netxen_config_indev_addr(netdev, NETDEV_UP);
1472        }
1473
1474        netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
1475        return 0;
1476
1477err_out_detach:
1478        netxen_nic_detach(adapter);
1479err_out:
1480        nx_decr_dev_ref_cnt(adapter);
1481        return err;
1482}
1483#endif
1484
1485static int netxen_nic_open(struct net_device *netdev)
1486{
1487        struct netxen_adapter *adapter = netdev_priv(netdev);
1488        int err = 0;
1489
1490        if (adapter->driver_mismatch)
1491                return -EIO;
1492
1493        err = netxen_nic_attach(adapter);
1494        if (err)
1495                return err;
1496
1497        err = netxen_nic_up(adapter, netdev);
1498        if (err)
1499                goto err_out;
1500
1501        netif_start_queue(netdev);
1502
1503        return 0;
1504
1505err_out:
1506        netxen_nic_detach(adapter);
1507        return err;
1508}
1509
1510/*
1511 * netxen_nic_close - Disables a network interface entry point
1512 */
1513static int netxen_nic_close(struct net_device *netdev)
1514{
1515        struct netxen_adapter *adapter = netdev_priv(netdev);
1516
1517        netxen_nic_down(adapter, netdev);
1518        return 0;
1519}
1520
1521static void
1522netxen_tso_check(struct net_device *netdev,
1523                struct nx_host_tx_ring *tx_ring,
1524                struct cmd_desc_type0 *first_desc,
1525                struct sk_buff *skb)
1526{
1527        u8 opcode = TX_ETHER_PKT;
1528        __be16 protocol = skb->protocol;
1529        u16 flags = 0, vid = 0;
1530        u32 producer;
1531        int copied, offset, copy_len, hdr_len = 0, tso = 0, vlan_oob = 0;
1532        struct cmd_desc_type0 *hwdesc;
1533        struct vlan_ethhdr *vh;
1534
1535        if (protocol == cpu_to_be16(ETH_P_8021Q)) {
1536
1537                vh = (struct vlan_ethhdr *)skb->data;
1538                protocol = vh->h_vlan_encapsulated_proto;
1539                flags = FLAGS_VLAN_TAGGED;
1540
1541        } else if (vlan_tx_tag_present(skb)) {
1542
1543                flags = FLAGS_VLAN_OOB;
1544                vid = vlan_tx_tag_get(skb);
1545                netxen_set_tx_vlan_tci(first_desc, vid);
1546                vlan_oob = 1;
1547        }
1548
1549        if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) &&
1550                        skb_shinfo(skb)->gso_size > 0) {
1551
1552                hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
1553
1554                first_desc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
1555                first_desc->total_hdr_length = hdr_len;
1556                if (vlan_oob) {
1557                        first_desc->total_hdr_length += VLAN_HLEN;
1558                        first_desc->tcp_hdr_offset = VLAN_HLEN;
1559                        first_desc->ip_hdr_offset = VLAN_HLEN;
1560                        /* Only in case of TSO on vlan device */
1561                        flags |= FLAGS_VLAN_TAGGED;
1562                }
1563
1564                opcode = (protocol == cpu_to_be16(ETH_P_IPV6)) ?
1565                                TX_TCP_LSO6 : TX_TCP_LSO;
1566                tso = 1;
1567
1568        } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
1569                u8 l4proto;
1570
1571                if (protocol == cpu_to_be16(ETH_P_IP)) {
1572                        l4proto = ip_hdr(skb)->protocol;
1573
1574                        if (l4proto == IPPROTO_TCP)
1575                                opcode = TX_TCP_PKT;
1576                        else if(l4proto == IPPROTO_UDP)
1577                                opcode = TX_UDP_PKT;
1578                } else if (protocol == cpu_to_be16(ETH_P_IPV6)) {
1579                        l4proto = ipv6_hdr(skb)->nexthdr;
1580
1581                        if (l4proto == IPPROTO_TCP)
1582                                opcode = TX_TCPV6_PKT;
1583                        else if(l4proto == IPPROTO_UDP)
1584                                opcode = TX_UDPV6_PKT;
1585                }
1586        }
1587
1588        first_desc->tcp_hdr_offset += skb_transport_offset(skb);
1589        first_desc->ip_hdr_offset += skb_network_offset(skb);
1590        netxen_set_tx_flags_opcode(first_desc, flags, opcode);
1591
1592        if (!tso)
1593                return;
1594
1595        /* For LSO, we need to copy the MAC/IP/TCP headers into
1596         * the descriptor ring
1597         */
1598        producer = tx_ring->producer;
1599        copied = 0;
1600        offset = 2;
1601
1602        if (vlan_oob) {
1603                /* Create a TSO vlan header template for firmware */
1604
1605                hwdesc = &tx_ring->desc_head[producer];
1606                tx_ring->cmd_buf_arr[producer].skb = NULL;
1607
1608                copy_len = min((int)sizeof(struct cmd_desc_type0) - offset,
1609                                hdr_len + VLAN_HLEN);
1610
1611                vh = (struct vlan_ethhdr *)((char *)hwdesc + 2);
1612                skb_copy_from_linear_data(skb, vh, 12);
1613                vh->h_vlan_proto = htons(ETH_P_8021Q);
1614                vh->h_vlan_TCI = htons(vid);
1615                skb_copy_from_linear_data_offset(skb, 12,
1616                                (char *)vh + 16, copy_len - 16);
1617
1618                copied = copy_len - VLAN_HLEN;
1619                offset = 0;
1620
1621                producer = get_next_index(producer, tx_ring->num_desc);
1622        }
1623
1624        while (copied < hdr_len) {
1625
1626                copy_len = min((int)sizeof(struct cmd_desc_type0) - offset,
1627                                (hdr_len - copied));
1628
1629                hwdesc = &tx_ring->desc_head[producer];
1630                tx_ring->cmd_buf_arr[producer].skb = NULL;
1631
1632                skb_copy_from_linear_data_offset(skb, copied,
1633                                 (char *)hwdesc + offset, copy_len);
1634
1635                copied += copy_len;
1636                offset = 0;
1637
1638                producer = get_next_index(producer, tx_ring->num_desc);
1639        }
1640
1641        tx_ring->producer = producer;
1642        barrier();
1643}
1644
1645static int
1646netxen_map_tx_skb(struct pci_dev *pdev,
1647                struct sk_buff *skb, struct netxen_cmd_buffer *pbuf)
1648{
1649        struct netxen_skb_frag *nf;
1650        struct skb_frag_struct *frag;
1651        int i, nr_frags;
1652        dma_addr_t map;
1653
1654        nr_frags = skb_shinfo(skb)->nr_frags;
1655        nf = &pbuf->frag_array[0];
1656
1657        map = pci_map_single(pdev, skb->data,
1658                        skb_headlen(skb), PCI_DMA_TODEVICE);
1659        if (pci_dma_mapping_error(pdev, map))
1660                goto out_err;
1661
1662        nf->dma = map;
1663        nf->length = skb_headlen(skb);
1664
1665        for (i = 0; i < nr_frags; i++) {
1666                frag = &skb_shinfo(skb)->frags[i];
1667                nf = &pbuf->frag_array[i+1];
1668
1669                map = pci_map_page(pdev, frag->page, frag->page_offset,
1670                                frag->size, PCI_DMA_TODEVICE);
1671                if (pci_dma_mapping_error(pdev, map))
1672                        goto unwind;
1673
1674                nf->dma = map;
1675                nf->length = frag->size;
1676        }
1677
1678        return 0;
1679
1680unwind:
1681        while (--i >= 0) {
1682                nf = &pbuf->frag_array[i+1];
1683                pci_unmap_page(pdev, nf->dma, nf->length, PCI_DMA_TODEVICE);
1684        }
1685
1686        nf = &pbuf->frag_array[0];
1687        pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE);
1688
1689out_err:
1690        return -ENOMEM;
1691}
1692
1693static inline void
1694netxen_clear_cmddesc(u64 *desc)
1695{
1696        desc[0] = 0ULL;
1697        desc[2] = 0ULL;
1698}
1699
1700static netdev_tx_t
1701netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
1702{
1703        struct netxen_adapter *adapter = netdev_priv(netdev);
1704        struct nx_host_tx_ring *tx_ring = adapter->tx_ring;
1705        struct netxen_cmd_buffer *pbuf;
1706        struct netxen_skb_frag *buffrag;
1707        struct cmd_desc_type0 *hwdesc, *first_desc;
1708        struct pci_dev *pdev;
1709        int i, k;
1710
1711        u32 producer;
1712        int frag_count, no_of_desc;
1713        u32 num_txd = tx_ring->num_desc;
1714
1715        frag_count = skb_shinfo(skb)->nr_frags + 1;
1716
1717        /* 4 fragments per cmd des */
1718        no_of_desc = (frag_count + 3) >> 2;
1719
1720        if (unlikely(no_of_desc + 2 > netxen_tx_avail(tx_ring))) {
1721                netif_stop_queue(netdev);
1722                return NETDEV_TX_BUSY;
1723        }
1724
1725        producer = tx_ring->producer;
1726        pbuf = &tx_ring->cmd_buf_arr[producer];
1727
1728        pdev = adapter->pdev;
1729
1730        if (netxen_map_tx_skb(pdev, skb, pbuf))
1731                goto drop_packet;
1732
1733        pbuf->skb = skb;
1734        pbuf->frag_count = frag_count;
1735
1736        first_desc = hwdesc = &tx_ring->desc_head[producer];
1737        netxen_clear_cmddesc((u64 *)hwdesc);
1738
1739        netxen_set_tx_frags_len(first_desc, frag_count, skb->len);
1740        netxen_set_tx_port(first_desc, adapter->portnum);
1741
1742        for (i = 0; i < frag_count; i++) {
1743
1744                k = i % 4;
1745
1746                if ((k == 0) && (i > 0)) {
1747                        /* move to next desc.*/
1748                        producer = get_next_index(producer, num_txd);
1749                        hwdesc = &tx_ring->desc_head[producer];
1750                        netxen_clear_cmddesc((u64 *)hwdesc);
1751                        tx_ring->cmd_buf_arr[producer].skb = NULL;
1752                }
1753
1754                buffrag = &pbuf->frag_array[i];
1755
1756                hwdesc->buffer_length[k] = cpu_to_le16(buffrag->length);
1757                switch (k) {
1758                case 0:
1759                        hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma);
1760                        break;
1761                case 1:
1762                        hwdesc->addr_buffer2 = cpu_to_le64(buffrag->dma);
1763                        break;
1764                case 2:
1765                        hwdesc->addr_buffer3 = cpu_to_le64(buffrag->dma);
1766                        break;
1767                case 3:
1768                        hwdesc->addr_buffer4 = cpu_to_le64(buffrag->dma);
1769                        break;
1770                }
1771        }
1772
1773        tx_ring->producer = get_next_index(producer, num_txd);
1774
1775        netxen_tso_check(netdev, tx_ring, first_desc, skb);
1776
1777        netxen_nic_update_cmd_producer(adapter, tx_ring);
1778
1779        adapter->stats.txbytes += skb->len;
1780        adapter->stats.xmitcalled++;
1781
1782        return NETDEV_TX_OK;
1783
1784drop_packet:
1785        adapter->stats.txdropped++;
1786        dev_kfree_skb_any(skb);
1787        return NETDEV_TX_OK;
1788}
1789
1790static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1791{
1792        struct net_device *netdev = adapter->netdev;
1793        uint32_t temp, temp_state, temp_val;
1794        int rv = 0;
1795
1796        temp = NXRD32(adapter, CRB_TEMP_STATE);
1797
1798        temp_state = nx_get_temp_state(temp);
1799        temp_val = nx_get_temp_val(temp);
1800
1801        if (temp_state == NX_TEMP_PANIC) {
1802                printk(KERN_ALERT
1803                       "%s: Device temperature %d degrees C exceeds"
1804                       " maximum allowed. Hardware has been shut down.\n",
1805                       netdev->name, temp_val);
1806                rv = 1;
1807        } else if (temp_state == NX_TEMP_WARN) {
1808                if (adapter->temp == NX_TEMP_NORMAL) {
1809                        printk(KERN_ALERT
1810                               "%s: Device temperature %d degrees C "
1811                               "exceeds operating range."
1812                               " Immediate action needed.\n",
1813                               netdev->name, temp_val);
1814                }
1815        } else {
1816                if (adapter->temp == NX_TEMP_WARN) {
1817                        printk(KERN_INFO
1818                               "%s: Device temperature is now %d degrees C"
1819                               " in normal range.\n", netdev->name,
1820                               temp_val);
1821                }
1822        }
1823        adapter->temp = temp_state;
1824        return rv;
1825}
1826
1827void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
1828{
1829        struct net_device *netdev = adapter->netdev;
1830
1831        if (adapter->ahw.linkup && !linkup) {
1832                printk(KERN_INFO "%s: %s NIC Link is down\n",
1833                       netxen_nic_driver_name, netdev->name);
1834                adapter->ahw.linkup = 0;
1835                if (netif_running(netdev)) {
1836                        netif_carrier_off(netdev);
1837                        netif_stop_queue(netdev);
1838                }
1839                adapter->link_changed = !adapter->has_link_events;
1840        } else if (!adapter->ahw.linkup && linkup) {
1841                printk(KERN_INFO "%s: %s NIC Link is up\n",
1842                       netxen_nic_driver_name, netdev->name);
1843                adapter->ahw.linkup = 1;
1844                if (netif_running(netdev)) {
1845                        netif_carrier_on(netdev);
1846                        netif_wake_queue(netdev);
1847                }
1848                adapter->link_changed = !adapter->has_link_events;
1849        }
1850}
1851
1852static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1853{
1854        u32 val, port, linkup;
1855
1856        port = adapter->physical_port;
1857
1858        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1859                val = NXRD32(adapter, CRB_XG_STATE_P3);
1860                val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
1861                linkup = (val == XG_LINK_UP_P3);
1862        } else {
1863                val = NXRD32(adapter, CRB_XG_STATE);
1864                if (adapter->ahw.port_type == NETXEN_NIC_GBE)
1865                        linkup = (val >> port) & 1;
1866                else {
1867                        val = (val >> port*8) & 0xff;
1868                        linkup = (val == XG_LINK_UP);
1869                }
1870        }
1871
1872        netxen_advert_link_change(adapter, linkup);
1873}
1874
1875static void netxen_tx_timeout(struct net_device *netdev)
1876{
1877        struct netxen_adapter *adapter = netdev_priv(netdev);
1878
1879        if (test_bit(__NX_RESETTING, &adapter->state))
1880                return;
1881
1882        dev_err(&netdev->dev, "transmit timeout, resetting.\n");
1883        schedule_work(&adapter->tx_timeout_task);
1884}
1885
1886static void netxen_tx_timeout_task(struct work_struct *work)
1887{
1888        struct netxen_adapter *adapter =
1889                container_of(work, struct netxen_adapter, tx_timeout_task);
1890
1891        if (!netif_running(adapter->netdev))
1892                return;
1893
1894        if (test_and_set_bit(__NX_RESETTING, &adapter->state))
1895                return;
1896
1897        if (++adapter->tx_timeo_cnt >= NX_MAX_TX_TIMEOUTS)
1898                goto request_reset;
1899
1900        if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1901                /* try to scrub interrupt */
1902                netxen_napi_disable(adapter);
1903
1904                adapter->netdev->trans_start = jiffies;
1905
1906                netxen_napi_enable(adapter);
1907
1908                netif_wake_queue(adapter->netdev);
1909
1910                clear_bit(__NX_RESETTING, &adapter->state);
1911
1912        } else {
1913                clear_bit(__NX_RESETTING, &adapter->state);
1914                if (!netxen_nic_reset_context(adapter)) {
1915                        adapter->netdev->trans_start = jiffies;
1916                        return;
1917                }
1918
1919                /* context reset failed, fall through for fw reset */
1920        }
1921
1922request_reset:
1923        adapter->need_fw_reset = 1;
1924        clear_bit(__NX_RESETTING, &adapter->state);
1925}
1926
1927struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
1928{
1929        struct netxen_adapter *adapter = netdev_priv(netdev);
1930        struct net_device_stats *stats = &adapter->net_stats;
1931
1932        memset(stats, 0, sizeof(*stats));
1933
1934        stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
1935        stats->tx_packets = adapter->stats.xmitfinished;
1936        stats->rx_bytes = adapter->stats.rxbytes;
1937        stats->tx_bytes = adapter->stats.txbytes;
1938        stats->rx_dropped = adapter->stats.rxdropped;
1939        stats->tx_dropped = adapter->stats.txdropped;
1940
1941        return stats;
1942}
1943
1944static irqreturn_t netxen_intr(int irq, void *data)
1945{
1946        struct nx_host_sds_ring *sds_ring = data;
1947        struct netxen_adapter *adapter = sds_ring->adapter;
1948        u32 status = 0;
1949
1950        status = readl(adapter->isr_int_vec);
1951
1952        if (!(status & adapter->int_vec_bit))
1953                return IRQ_NONE;
1954
1955        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1956                /* check interrupt state machine, to be sure */
1957                status = readl(adapter->crb_int_state_reg);
1958                if (!ISR_LEGACY_INT_TRIGGERED(status))
1959                        return IRQ_NONE;
1960
1961        } else {
1962                unsigned long our_int = 0;
1963
1964                our_int = readl(adapter->crb_int_state_reg);
1965
1966                /* not our interrupt */
1967                if (!test_and_clear_bit((7 + adapter->portnum), &our_int))
1968                        return IRQ_NONE;
1969
1970                /* claim interrupt */
1971                writel((our_int & 0xffffffff), adapter->crb_int_state_reg);
1972
1973                /* clear interrupt */
1974                netxen_nic_disable_int(sds_ring);
1975        }
1976
1977        writel(0xffffffff, adapter->tgt_status_reg);
1978        /* read twice to ensure write is flushed */
1979        readl(adapter->isr_int_vec);
1980        readl(adapter->isr_int_vec);
1981
1982        napi_schedule(&sds_ring->napi);
1983
1984        return IRQ_HANDLED;
1985}
1986
1987static irqreturn_t netxen_msi_intr(int irq, void *data)
1988{
1989        struct nx_host_sds_ring *sds_ring = data;
1990        struct netxen_adapter *adapter = sds_ring->adapter;
1991
1992        /* clear interrupt */
1993        writel(0xffffffff, adapter->tgt_status_reg);
1994
1995        napi_schedule(&sds_ring->napi);
1996        return IRQ_HANDLED;
1997}
1998
1999static irqreturn_t netxen_msix_intr(int irq, void *data)
2000{
2001        struct nx_host_sds_ring *sds_ring = data;
2002
2003        napi_schedule(&sds_ring->napi);
2004        return IRQ_HANDLED;
2005}
2006
2007static int netxen_nic_poll(struct napi_struct *napi, int budget)
2008{
2009        struct nx_host_sds_ring *sds_ring =
2010                container_of(napi, struct nx_host_sds_ring, napi);
2011
2012        struct netxen_adapter *adapter = sds_ring->adapter;
2013
2014        int tx_complete;
2015        int work_done;
2016
2017        tx_complete = netxen_process_cmd_ring(adapter);
2018
2019        work_done = netxen_process_rcv_ring(sds_ring, budget);
2020
2021        if ((work_done < budget) && tx_complete) {
2022                napi_complete(&sds_ring->napi);
2023                if (netif_running(adapter->netdev))
2024                        netxen_nic_enable_int(sds_ring);
2025        }
2026
2027        return work_done;
2028}
2029
2030#ifdef CONFIG_NET_POLL_CONTROLLER
2031static void netxen_nic_poll_controller(struct net_device *netdev)
2032{
2033        struct netxen_adapter *adapter = netdev_priv(netdev);
2034        disable_irq(adapter->irq);
2035        netxen_intr(adapter->irq, adapter);
2036        enable_irq(adapter->irq);
2037}
2038#endif
2039
2040static int
2041nx_incr_dev_ref_cnt(struct netxen_adapter *adapter)
2042{
2043        int count;
2044        if (netxen_api_lock(adapter))
2045                return -EIO;
2046
2047        count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
2048
2049        NXWR32(adapter, NX_CRB_DEV_REF_COUNT, ++count);
2050
2051        netxen_api_unlock(adapter);
2052        return count;
2053}
2054
2055static int
2056nx_decr_dev_ref_cnt(struct netxen_adapter *adapter)
2057{
2058        int count;
2059        if (netxen_api_lock(adapter))
2060                return -EIO;
2061
2062        count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
2063        WARN_ON(count == 0);
2064
2065        NXWR32(adapter, NX_CRB_DEV_REF_COUNT, --count);
2066
2067        if (count == 0)
2068                NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_COLD);
2069
2070        netxen_api_unlock(adapter);
2071        return count;
2072}
2073
2074static void
2075nx_dev_request_reset(struct netxen_adapter *adapter)
2076{
2077        u32 state;
2078
2079        if (netxen_api_lock(adapter))
2080                return;
2081
2082        state = NXRD32(adapter, NX_CRB_DEV_STATE);
2083
2084        if (state != NX_DEV_INITALIZING)
2085                NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_NEED_RESET);
2086
2087        netxen_api_unlock(adapter);
2088}
2089
2090static int
2091netxen_can_start_firmware(struct netxen_adapter *adapter)
2092{
2093        int count;
2094        int can_start = 0;
2095
2096        if (netxen_api_lock(adapter))
2097                return 0;
2098
2099        count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
2100
2101        if ((count < 0) || (count >= NX_MAX_PCI_FUNC))
2102                count = 0;
2103
2104        if (count == 0) {
2105                can_start = 1;
2106                NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_INITALIZING);
2107        }
2108
2109        NXWR32(adapter, NX_CRB_DEV_REF_COUNT, ++count);
2110
2111        netxen_api_unlock(adapter);
2112
2113        return can_start;
2114}
2115
2116static void
2117netxen_schedule_work(struct netxen_adapter *adapter,
2118                work_func_t func, int delay)
2119{
2120        INIT_DELAYED_WORK(&adapter->fw_work, func);
2121        schedule_delayed_work(&adapter->fw_work, delay);
2122}
2123
2124static void
2125netxen_cancel_fw_work(struct netxen_adapter *adapter)
2126{
2127        while (test_and_set_bit(__NX_RESETTING, &adapter->state))
2128                msleep(10);
2129
2130        cancel_delayed_work_sync(&adapter->fw_work);
2131}
2132
2133static void
2134netxen_attach_work(struct work_struct *work)
2135{
2136        struct netxen_adapter *adapter = container_of(work,
2137                                struct netxen_adapter, fw_work.work);
2138        struct net_device *netdev = adapter->netdev;
2139        int err = 0;
2140
2141        if (netif_running(netdev)) {
2142                err = netxen_nic_attach(adapter);
2143                if (err)
2144                        goto done;
2145
2146                err = netxen_nic_up(adapter, netdev);
2147                if (err) {
2148                        netxen_nic_detach(adapter);
2149                        goto done;
2150                }
2151
2152                netxen_config_indev_addr(netdev, NETDEV_UP);
2153        }
2154
2155        netif_device_attach(netdev);
2156
2157done:
2158        adapter->fw_fail_cnt = 0;
2159        clear_bit(__NX_RESETTING, &adapter->state);
2160        netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
2161}
2162
2163static void
2164netxen_fwinit_work(struct work_struct *work)
2165{
2166        struct netxen_adapter *adapter = container_of(work,
2167                                struct netxen_adapter, fw_work.work);
2168        int dev_state;
2169
2170        dev_state = NXRD32(adapter, NX_CRB_DEV_STATE);
2171
2172        switch (dev_state) {
2173        case NX_DEV_COLD:
2174        case NX_DEV_READY:
2175                if (!netxen_start_firmware(adapter)) {
2176                        netxen_schedule_work(adapter, netxen_attach_work, 0);
2177                        return;
2178                }
2179                break;
2180
2181        case NX_DEV_INITALIZING:
2182                if (++adapter->fw_wait_cnt < FW_POLL_THRESH) {
2183                        netxen_schedule_work(adapter,
2184                                        netxen_fwinit_work, 2 * FW_POLL_DELAY);
2185                        return;
2186                }
2187                break;
2188
2189        case NX_DEV_FAILED:
2190        default:
2191                break;
2192        }
2193
2194        nx_incr_dev_ref_cnt(adapter);
2195        clear_bit(__NX_RESETTING, &adapter->state);
2196}
2197
2198static void
2199netxen_detach_work(struct work_struct *work)
2200{
2201        struct netxen_adapter *adapter = container_of(work,
2202                                struct netxen_adapter, fw_work.work);
2203        struct net_device *netdev = adapter->netdev;
2204        int ref_cnt, delay;
2205        u32 status;
2206
2207        netif_device_detach(netdev);
2208
2209        if (netif_running(netdev))
2210                netxen_nic_down(adapter, netdev);
2211
2212        netxen_nic_detach(adapter);
2213
2214        status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1);
2215
2216        ref_cnt = nx_decr_dev_ref_cnt(adapter);
2217
2218        if (status & NX_RCODE_FATAL_ERROR)
2219                return;
2220
2221        if (adapter->temp == NX_TEMP_PANIC)
2222                return;
2223
2224        delay = (ref_cnt == 0) ? 0 : (2 * FW_POLL_DELAY);
2225
2226        adapter->fw_wait_cnt = 0;
2227        netxen_schedule_work(adapter, netxen_fwinit_work, delay);
2228}
2229
2230static int
2231netxen_check_health(struct netxen_adapter *adapter)
2232{
2233        u32 state, heartbit;
2234        struct net_device *netdev = adapter->netdev;
2235
2236        if (netxen_nic_check_temp(adapter))
2237                goto detach;
2238
2239        if (adapter->need_fw_reset) {
2240                nx_dev_request_reset(adapter);
2241                goto detach;
2242        }
2243
2244        state = NXRD32(adapter, NX_CRB_DEV_STATE);
2245        if (state == NX_DEV_NEED_RESET)
2246                goto detach;
2247
2248        if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2249                return 0;
2250
2251        heartbit = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
2252        if (heartbit != adapter->heartbit) {
2253                adapter->heartbit = heartbit;
2254                adapter->fw_fail_cnt = 0;
2255                return 0;
2256        }
2257
2258        if (++adapter->fw_fail_cnt < FW_FAIL_THRESH)
2259                return 0;
2260
2261        clear_bit(__NX_FW_ATTACHED, &adapter->state);
2262
2263        dev_info(&netdev->dev, "firmware hang detected\n");
2264
2265detach:
2266        if (!test_and_set_bit(__NX_RESETTING, &adapter->state))
2267                netxen_schedule_work(adapter, netxen_detach_work, 0);
2268        return 1;
2269}
2270
2271static void
2272netxen_fw_poll_work(struct work_struct *work)
2273{
2274        struct netxen_adapter *adapter = container_of(work,
2275                                struct netxen_adapter, fw_work.work);
2276
2277        if (test_bit(__NX_RESETTING, &adapter->state))
2278                goto reschedule;
2279
2280        if (test_bit(__NX_DEV_UP, &adapter->state)) {
2281                if (!adapter->has_link_events) {
2282
2283                        netxen_nic_handle_phy_intr(adapter);
2284
2285                        if (adapter->link_changed)
2286                                netxen_nic_set_link_parameters(adapter);
2287                }
2288        }
2289
2290        if (netxen_check_health(adapter))
2291                return;
2292
2293reschedule:
2294        netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
2295}
2296
2297static ssize_t
2298netxen_store_bridged_mode(struct device *dev,
2299                struct device_attribute *attr, const char *buf, size_t len)
2300{
2301        struct net_device *net = to_net_dev(dev);
2302        struct netxen_adapter *adapter = netdev_priv(net);
2303        unsigned long new;
2304        int ret = -EINVAL;
2305
2306        if (!(adapter->capabilities & NX_FW_CAPABILITY_BDG))
2307                goto err_out;
2308
2309        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
2310                goto err_out;
2311
2312        if (strict_strtoul(buf, 2, &new))
2313                goto err_out;
2314
2315        if (!netxen_config_bridged_mode(adapter, !!new))
2316                ret = len;
2317
2318err_out:
2319        return ret;
2320}
2321
2322static ssize_t
2323netxen_show_bridged_mode(struct device *dev,
2324                struct device_attribute *attr, char *buf)
2325{
2326        struct net_device *net = to_net_dev(dev);
2327        struct netxen_adapter *adapter;
2328        int bridged_mode = 0;
2329
2330        adapter = netdev_priv(net);
2331
2332        if (adapter->capabilities & NX_FW_CAPABILITY_BDG)
2333                bridged_mode = !!(adapter->flags & NETXEN_NIC_BRIDGE_ENABLED);
2334
2335        return sprintf(buf, "%d\n", bridged_mode);
2336}
2337
2338static struct device_attribute dev_attr_bridged_mode = {
2339       .attr = {.name = "bridged_mode", .mode = (S_IRUGO | S_IWUSR)},
2340       .show = netxen_show_bridged_mode,
2341       .store = netxen_store_bridged_mode,
2342};
2343
2344static void
2345netxen_create_sysfs_entries(struct netxen_adapter *adapter)
2346{
2347        struct net_device *netdev = adapter->netdev;
2348        struct device *dev = &netdev->dev;
2349
2350        if (adapter->capabilities & NX_FW_CAPABILITY_BDG) {
2351                /* bridged_mode control */
2352                if (device_create_file(dev, &dev_attr_bridged_mode)) {
2353                        dev_warn(&netdev->dev,
2354                                "failed to create bridged_mode sysfs entry\n");
2355                }
2356        }
2357}
2358
2359static void
2360netxen_remove_sysfs_entries(struct netxen_adapter *adapter)
2361{
2362        struct net_device *netdev = adapter->netdev;
2363        struct device *dev = &netdev->dev;
2364
2365        if (adapter->capabilities & NX_FW_CAPABILITY_BDG)
2366                device_remove_file(dev, &dev_attr_bridged_mode);
2367}
2368
2369#ifdef CONFIG_INET
2370
2371#define is_netxen_netdev(dev) (dev->netdev_ops == &netxen_netdev_ops)
2372
2373static int
2374netxen_destip_supported(struct netxen_adapter *adapter)
2375{
2376        if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2377                return 0;
2378
2379        if (adapter->ahw.cut_through)
2380                return 0;
2381
2382        return 1;
2383}
2384
2385static void
2386netxen_config_indev_addr(struct net_device *dev, unsigned long event)
2387{
2388        struct in_device *indev;
2389        struct netxen_adapter *adapter = netdev_priv(dev);
2390
2391        if (!netxen_destip_supported(adapter))
2392                return;
2393
2394        indev = in_dev_get(dev);
2395        if (!indev)
2396                return;
2397
2398        for_ifa(indev) {
2399                switch (event) {
2400                case NETDEV_UP:
2401                        netxen_config_ipaddr(adapter,
2402                                        ifa->ifa_address, NX_IP_UP);
2403                        break;
2404                case NETDEV_DOWN:
2405                        netxen_config_ipaddr(adapter,
2406                                        ifa->ifa_address, NX_IP_DOWN);
2407                        break;
2408                default:
2409                        break;
2410                }
2411        } endfor_ifa(indev);
2412
2413        in_dev_put(indev);
2414        return;
2415}
2416
2417static int netxen_netdev_event(struct notifier_block *this,
2418                                 unsigned long event, void *ptr)
2419{
2420        struct netxen_adapter *adapter;
2421        struct net_device *dev = (struct net_device *)ptr;
2422
2423recheck:
2424        if (dev == NULL)
2425                goto done;
2426
2427        if (dev->priv_flags & IFF_802_1Q_VLAN) {
2428                dev = vlan_dev_real_dev(dev);
2429                goto recheck;
2430        }
2431
2432        if (!is_netxen_netdev(dev))
2433                goto done;
2434
2435        adapter = netdev_priv(dev);
2436
2437        if (!adapter)
2438                goto done;
2439
2440        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
2441                goto done;
2442
2443        netxen_config_indev_addr(dev, event);
2444done:
2445        return NOTIFY_DONE;
2446}
2447
2448static int
2449netxen_inetaddr_event(struct notifier_block *this,
2450                unsigned long event, void *ptr)
2451{
2452        struct netxen_adapter *adapter;
2453        struct net_device *dev;
2454
2455        struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
2456
2457        dev = ifa->ifa_dev ? ifa->ifa_dev->dev : NULL;
2458
2459recheck:
2460        if (dev == NULL || !netif_running(dev))
2461                goto done;
2462
2463        if (dev->priv_flags & IFF_802_1Q_VLAN) {
2464                dev = vlan_dev_real_dev(dev);
2465                goto recheck;
2466        }
2467
2468        if (!is_netxen_netdev(dev))
2469                goto done;
2470
2471        adapter = netdev_priv(dev);
2472
2473        if (!adapter || !netxen_destip_supported(adapter))
2474                goto done;
2475
2476        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
2477                goto done;
2478
2479        switch (event) {
2480        case NETDEV_UP:
2481                netxen_config_ipaddr(adapter, ifa->ifa_address, NX_IP_UP);
2482                break;
2483        case NETDEV_DOWN:
2484                netxen_config_ipaddr(adapter, ifa->ifa_address, NX_IP_DOWN);
2485                break;
2486        default:
2487                break;
2488        }
2489
2490done:
2491        return NOTIFY_DONE;
2492}
2493
2494static struct notifier_block    netxen_netdev_cb = {
2495        .notifier_call = netxen_netdev_event,
2496};
2497
2498static struct notifier_block netxen_inetaddr_cb = {
2499        .notifier_call = netxen_inetaddr_event,
2500};
2501#else
2502static void
2503netxen_config_indev_addr(struct net_device *dev, unsigned long event)
2504{ }
2505#endif
2506
2507static struct pci_driver netxen_driver = {
2508        .name = netxen_nic_driver_name,
2509        .id_table = netxen_pci_tbl,
2510        .probe = netxen_nic_probe,
2511        .remove = __devexit_p(netxen_nic_remove),
2512#ifdef CONFIG_PM
2513        .suspend = netxen_nic_suspend,
2514        .resume = netxen_nic_resume,
2515#endif
2516        .shutdown = netxen_nic_shutdown
2517};
2518
2519static int __init netxen_init_module(void)
2520{
2521        printk(KERN_INFO "%s\n", netxen_nic_driver_string);
2522
2523#ifdef CONFIG_INET
2524        register_netdevice_notifier(&netxen_netdev_cb);
2525        register_inetaddr_notifier(&netxen_inetaddr_cb);
2526#endif
2527
2528        return pci_register_driver(&netxen_driver);
2529}
2530
2531module_init(netxen_init_module);
2532
2533static void __exit netxen_exit_module(void)
2534{
2535        pci_unregister_driver(&netxen_driver);
2536
2537#ifdef CONFIG_INET
2538        unregister_inetaddr_notifier(&netxen_inetaddr_cb);
2539        unregister_netdevice_notifier(&netxen_netdev_cb);
2540#endif
2541}
2542
2543module_exit(netxen_exit_module);
2544
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.