2  * Copyright (C) 2003 - 2006 NetXen, Inc.
 
   5  * This program is free software; you can redistribute it and/or
 
   6  * modify it under the terms of the GNU General Public License
 
   7  * as published by the Free Software Foundation; either version 2
 
   8  * of the License, or (at your option) any later version.
 
  10  * This program is distributed in the hope that it will be useful, but
 
  11  * WITHOUT ANY WARRANTY; without even the implied warranty of
 
  12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  13  * GNU General Public License for more details.
 
  15  * You should have received a copy of the GNU General Public License
 
  16  * along with this program; if not, write to the Free Software
 
  17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 
  20  * The full GNU General Public License is included in this distribution
 
  21  * in the file called LICENSE.
 
  23  * Contact Information:
 
  26  * 3965 Freedom Circle, Fourth floor,
 
  27  * Santa Clara, CA 95054
 
  30  *  Main source file for NetXen NIC Driver on Linux
 
  34 #include <linux/vmalloc.h>
 
  35 #include <linux/highmem.h>
 
  36 #include "netxen_nic_hw.h"
 
  38 #include "netxen_nic.h"
 
  39 #include "netxen_nic_phan_reg.h"
 
  41 #include <linux/dma-mapping.h>
 
  44 MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver");
 
  45 MODULE_LICENSE("GPL");
 
  46 MODULE_VERSION(NETXEN_NIC_LINUX_VERSIONID);
 
  48 char netxen_nic_driver_name[] = "netxen_nic";
 
  49 static char netxen_nic_driver_string[] = "NetXen Network Driver version "
 
  50     NETXEN_NIC_LINUX_VERSIONID;
 
  52 static int port_mode = NETXEN_PORT_MODE_AUTO_NEG;
 
  54 /* Default to restricted 1G auto-neg mode */
 
  55 static int wol_port_mode = 5;
 
  57 static int use_msi = 1;
 
  59 static int use_msi_x = 1;
 
  61 /* Local functions to NetXen NIC driver */
 
  62 static int __devinit netxen_nic_probe(struct pci_dev *pdev,
 
  63                 const struct pci_device_id *ent);
 
  64 static void __devexit netxen_nic_remove(struct pci_dev *pdev);
 
  65 static int netxen_nic_open(struct net_device *netdev);
 
  66 static int netxen_nic_close(struct net_device *netdev);
 
  67 static int netxen_nic_xmit_frame(struct sk_buff *, struct net_device *);
 
  68 static void netxen_tx_timeout(struct net_device *netdev);
 
  69 static void netxen_tx_timeout_task(struct work_struct *work);
 
  70 static void netxen_watchdog(unsigned long);
 
  71 static int netxen_nic_poll(struct napi_struct *napi, int budget);
 
  72 #ifdef CONFIG_NET_POLL_CONTROLLER
 
  73 static void netxen_nic_poll_controller(struct net_device *netdev);
 
  75 static irqreturn_t netxen_intr(int irq, void *data);
 
  76 static irqreturn_t netxen_msi_intr(int irq, void *data);
 
  78 /*  PCI Device ID Table  */
 
  79 #define ENTRY(device) \
 
  80         {PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \
 
  81         .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
 
  83 static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
 
  84         ENTRY(PCI_DEVICE_ID_NX2031_10GXSR),
 
  85         ENTRY(PCI_DEVICE_ID_NX2031_10GCX4),
 
  86         ENTRY(PCI_DEVICE_ID_NX2031_4GCU),
 
  87         ENTRY(PCI_DEVICE_ID_NX2031_IMEZ),
 
  88         ENTRY(PCI_DEVICE_ID_NX2031_HMEZ),
 
  89         ENTRY(PCI_DEVICE_ID_NX2031_XG_MGMT),
 
  90         ENTRY(PCI_DEVICE_ID_NX2031_XG_MGMT2),
 
  91         ENTRY(PCI_DEVICE_ID_NX3031),
 
  95 MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
 
  98  * In netxen_nic_down(), we must wait for any pending callback requests into
 
  99  * netxen_watchdog_task() to complete; eg otherwise the watchdog_timer could be
 
 100  * reenabled right after it is deleted in netxen_nic_down().
 
 101  * FLUSH_SCHEDULED_WORK()  does this synchronization.
 
 103  * Normally, schedule_work()/flush_scheduled_work() could have worked, but
 
 104  * netxen_nic_close() is invoked with kernel rtnl lock held. netif_carrier_off()
 
 105  * call in netxen_nic_close() triggers a schedule_work(&linkwatch_work), and a
 
 106  * subsequent call to flush_scheduled_work() in netxen_nic_down() would cause
 
 107  * linkwatch_event() to be executed which also attempts to acquire the rtnl
 
 108  * lock thus causing a deadlock.
 
 111 static struct workqueue_struct *netxen_workq;
 
 112 #define SCHEDULE_WORK(tp)       queue_work(netxen_workq, tp)
 
 113 #define FLUSH_SCHEDULED_WORK()  flush_workqueue(netxen_workq)
 
 115 static void netxen_watchdog(unsigned long);
 
 117 static uint32_t crb_cmd_producer[4] = {
 
 118         CRB_CMD_PRODUCER_OFFSET, CRB_CMD_PRODUCER_OFFSET_1,
 
 119         CRB_CMD_PRODUCER_OFFSET_2, CRB_CMD_PRODUCER_OFFSET_3
 
 123 netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
 
 124                 uint32_t crb_producer)
 
 126         adapter->pci_write_normalize(adapter,
 
 127                         adapter->crb_addr_cmd_producer, crb_producer);
 
 130 static uint32_t crb_cmd_consumer[4] = {
 
 131         CRB_CMD_CONSUMER_OFFSET, CRB_CMD_CONSUMER_OFFSET_1,
 
 132         CRB_CMD_CONSUMER_OFFSET_2, CRB_CMD_CONSUMER_OFFSET_3
 
 136 netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
 
 139         adapter->pci_write_normalize(adapter,
 
 140                         adapter->crb_addr_cmd_consumer, crb_consumer);
 
 143 static uint32_t msi_tgt_status[8] = {
 
 144         ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
 
 145         ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
 
 146         ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
 
 147         ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
 
 150 static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG;
 
 152 static inline void netxen_nic_disable_int(struct netxen_adapter *adapter)
 
 154         adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0);
 
 157 static inline void netxen_nic_enable_int(struct netxen_adapter *adapter)
 
 159         adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0x1);
 
 161         if (!NETXEN_IS_MSI_FAMILY(adapter))
 
 162                 adapter->pci_write_immediate(adapter,
 
 163                                 adapter->legacy_intr.tgt_mask_reg, 0xfbff);
 
 166 static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
 
 168         struct pci_dev *pdev = adapter->pdev;
 
 173         adapter->dma_mask = DMA_32BIT_MASK;
 
 175         if (revision_id >= NX_P3_B0) {
 
 176                 /* should go to DMA_64BIT_MASK */
 
 177                 adapter->dma_mask = DMA_39BIT_MASK;
 
 178                 mask = DMA_39BIT_MASK;
 
 179         } else if (revision_id == NX_P3_A2) {
 
 180                 adapter->dma_mask = DMA_39BIT_MASK;
 
 181                 mask = DMA_39BIT_MASK;
 
 182         } else if (revision_id == NX_P2_C1) {
 
 183                 adapter->dma_mask = DMA_35BIT_MASK;
 
 184                 mask = DMA_35BIT_MASK;
 
 186                 adapter->dma_mask = DMA_32BIT_MASK;
 
 187                 mask = DMA_32BIT_MASK;
 
 188                 goto set_32_bit_mask;
 
 192          * Consistent DMA mask is set to 32 bit because it cannot be set to
 
 193          * 35 bits. For P3 also leave it at 32 bits for now. Only the rings
 
 194          * come off this pool.
 
 196         if (pci_set_dma_mask(pdev, mask) == 0 &&
 
 197                 pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) == 0) {
 
 198                 adapter->pci_using_dac = 1;
 
 201 #endif /* CONFIG_IA64 */
 
 204         err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
 
 206                 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
 
 208                 DPRINTK(ERR, "No usable DMA configuration, aborting:%d\n", err);
 
 212         adapter->pci_using_dac = 0;
 
 216 static void netxen_check_options(struct netxen_adapter *adapter)
 
 218         switch (adapter->ahw.boardcfg.board_type) {
 
 219         case NETXEN_BRDTYPE_P3_HMEZ:
 
 220         case NETXEN_BRDTYPE_P3_XG_LOM:
 
 221         case NETXEN_BRDTYPE_P3_10G_CX4:
 
 222         case NETXEN_BRDTYPE_P3_10G_CX4_LP:
 
 223         case NETXEN_BRDTYPE_P3_IMEZ:
 
 224         case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
 
 225         case NETXEN_BRDTYPE_P3_10G_SFP_QT:
 
 226         case NETXEN_BRDTYPE_P3_10G_SFP_CT:
 
 227         case NETXEN_BRDTYPE_P3_10G_XFP:
 
 228         case NETXEN_BRDTYPE_P3_10000_BASE_T:
 
 229                 adapter->msix_supported = !!use_msi_x;
 
 230                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
 
 233         case NETXEN_BRDTYPE_P2_SB31_10G:
 
 234         case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
 
 235         case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
 
 236         case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
 
 237                 adapter->msix_supported = 0;
 
 238                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
 
 241         case NETXEN_BRDTYPE_P3_REF_QG:
 
 242         case NETXEN_BRDTYPE_P3_4_GB:
 
 243         case NETXEN_BRDTYPE_P3_4_GB_MM:
 
 244                 adapter->msix_supported = !!use_msi_x;
 
 245                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
 
 248         case NETXEN_BRDTYPE_P2_SB35_4G:
 
 249         case NETXEN_BRDTYPE_P2_SB31_2G:
 
 250                 adapter->msix_supported = 0;
 
 251                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
 
 255                 adapter->msix_supported = 0;
 
 256                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
 
 258                 printk(KERN_WARNING "Unknown board type(0x%x)\n",
 
 259                                 adapter->ahw.boardcfg.board_type);
 
 263         adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS_HOST;
 
 264         adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
 
 265         adapter->max_lro_rx_desc_count = MAX_LRO_RCV_DESCRIPTORS;
 
 267         adapter->max_possible_rss_rings = 1;
 
 272 netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
 
 276         if (first_boot == 0x55555555) {
 
 277                 /* This is the first boot after power up */
 
 279                 /* PCI bus master workaround */
 
 280                 adapter->hw_read_wx(adapter,
 
 281                         NETXEN_PCIE_REG(0x4), &first_boot, 4);
 
 282                 if (!(first_boot & 0x4)) {
 
 284                         adapter->hw_write_wx(adapter,
 
 285                                 NETXEN_PCIE_REG(0x4), &first_boot, 4);
 
 286                         adapter->hw_read_wx(adapter,
 
 287                                 NETXEN_PCIE_REG(0x4), &first_boot, 4);
 
 290                 /* This is the first boot after power up */
 
 291                 adapter->hw_read_wx(adapter,
 
 292                         NETXEN_ROMUSB_GLB_SW_RESET, &first_boot, 4);
 
 293                 if (first_boot != 0x80000f) {
 
 294                         /* clear the register for future unloads/loads */
 
 295                         adapter->pci_write_normalize(adapter,
 
 296                                         NETXEN_CAM_RAM(0x1fc), 0);
 
 300                 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
 
 301                         /* Start P2 boot loader */
 
 302                         adapter->pci_write_normalize(adapter,
 
 303                                 NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
 
 304                         adapter->pci_write_normalize(adapter,
 
 305                                         NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
 
 311 static void netxen_set_port_mode(struct netxen_adapter *adapter)
 
 315         val = adapter->ahw.boardcfg.board_type;
 
 316         if ((val == NETXEN_BRDTYPE_P3_HMEZ) ||
 
 317                 (val == NETXEN_BRDTYPE_P3_XG_LOM)) {
 
 318                 if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
 
 319                         data = NETXEN_PORT_MODE_802_3_AP;
 
 320                         adapter->hw_write_wx(adapter,
 
 321                                 NETXEN_PORT_MODE_ADDR, &data, 4);
 
 322                 } else if (port_mode == NETXEN_PORT_MODE_XG) {
 
 323                         data = NETXEN_PORT_MODE_XG;
 
 324                         adapter->hw_write_wx(adapter,
 
 325                                 NETXEN_PORT_MODE_ADDR, &data, 4);
 
 326                 } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_1G) {
 
 327                         data = NETXEN_PORT_MODE_AUTO_NEG_1G;
 
 328                         adapter->hw_write_wx(adapter,
 
 329                                 NETXEN_PORT_MODE_ADDR, &data, 4);
 
 330                 } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_XG) {
 
 331                         data = NETXEN_PORT_MODE_AUTO_NEG_XG;
 
 332                         adapter->hw_write_wx(adapter,
 
 333                                 NETXEN_PORT_MODE_ADDR, &data, 4);
 
 335                         data = NETXEN_PORT_MODE_AUTO_NEG;
 
 336                         adapter->hw_write_wx(adapter,
 
 337                                 NETXEN_PORT_MODE_ADDR, &data, 4);
 
 340                 if ((wol_port_mode != NETXEN_PORT_MODE_802_3_AP) &&
 
 341                         (wol_port_mode != NETXEN_PORT_MODE_XG) &&
 
 342                         (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_1G) &&
 
 343                         (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_XG)) {
 
 344                         wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG;
 
 346                 adapter->hw_write_wx(adapter, NETXEN_WOL_PORT_MODE,
 
 351 #define PCI_CAP_ID_GEN  0x10
 
 353 static void netxen_pcie_strap_init(struct netxen_adapter *adapter)
 
 360         struct pci_dev *pdev;
 
 362         pdev = adapter->pdev;
 
 364         adapter->hw_read_wx(adapter,
 
 365                 NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
 
 366         /* clear chicken3.25:24 */
 
 367         chicken &= 0xFCFFFFFF;
 
 369          * if gen1 and B0, set F1020 - if gen 2, do nothing
 
 370          * if gen2 set to F1000
 
 372         pos = pci_find_capability(pdev, PCI_CAP_ID_GEN);
 
 374                 pci_read_config_dword(pdev, pos + 0x10, &control);
 
 375                 if ((control & 0x000F0000) != 0x00020000) {
 
 376                         /*  set chicken3.24 if gen1 */
 
 377                         chicken |= 0x01000000;
 
 379                 printk(KERN_INFO "%s Gen2 strapping detected\n",
 
 380                                 netxen_nic_driver_name);
 
 383                 /* set chicken3.24 if gen1 */
 
 384                 chicken |= 0x01000000;
 
 385                 printk(KERN_INFO "%s Gen1 strapping detected\n",
 
 386                                 netxen_nic_driver_name);
 
 387                 if (adapter->ahw.revision_id == NX_P3_B0)
 
 393         adapter->hw_write_wx(adapter,
 
 394                 NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
 
 399         pdevfuncsave = pdev->devfn;
 
 400         if (pdevfuncsave & 0x07)
 
 403         for (i = 0; i < 8; i++) {
 
 404                 pci_read_config_dword(pdev, pos + 8, &control);
 
 405                 pci_read_config_dword(pdev, pos + 8, &control);
 
 406                 pci_write_config_dword(pdev, pos + 8, c8c9value);
 
 409         pdev->devfn = pdevfuncsave;
 
 412 static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
 
 417         pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
 
 419                 pci_read_config_dword(pdev, pos, &control);
 
 421                         control |= PCI_MSIX_FLAGS_ENABLE;
 
 424                 pci_write_config_dword(pdev, pos, control);
 
 428 static void netxen_init_msix_entries(struct netxen_adapter *adapter)
 
 432         for (i = 0; i < MSIX_ENTRIES_PER_ADAPTER; i++)
 
 433                 adapter->msix_entries[i].entry = i;
 
 437 netxen_read_mac_addr(struct netxen_adapter *adapter)
 
 442         DECLARE_MAC_BUF(mac);
 
 443         struct net_device *netdev = adapter->netdev;
 
 444         struct pci_dev *pdev = adapter->pdev;
 
 446         if (netxen_is_flash_supported(adapter) != 0)
 
 449         if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
 
 450                 if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)
 
 453                 if (netxen_get_flash_mac_addr(adapter, &mac_addr) != 0)
 
 457         p = (unsigned char *)&mac_addr;
 
 458         for (i = 0; i < 6; i++)
 
 459                 netdev->dev_addr[i] = *(p + 5 - i);
 
 461         memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
 
 463         /* set station address */
 
 465         if (!is_valid_ether_addr(netdev->perm_addr)) {
 
 466                 dev_warn(&pdev->dev, "Bad MAC address %s.\n",
 
 467                                 print_mac(mac, netdev->dev_addr));
 
 469                 adapter->macaddr_set(adapter, netdev->dev_addr);
 
 477  * The Linux system will invoke this after identifying the vendor ID and
 
 478  * device Id in the pci_tbl supported by this module.
 
 480  * A quad port card has one operational PCI config space, (function 0),
 
 481  * which is used to access all four ports.
 
 483  * This routine will initialize the adapter, and setup the global parameters
 
 484  * along with the port's specific structure.
 
 487 netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 489         struct net_device *netdev = NULL;
 
 490         struct netxen_adapter *adapter = NULL;
 
 491         void __iomem *mem_ptr0 = NULL;
 
 492         void __iomem *mem_ptr1 = NULL;
 
 493         void __iomem *mem_ptr2 = NULL;
 
 494         unsigned long first_page_group_end;
 
 495         unsigned long first_page_group_start;
 
 498         u8 __iomem *db_ptr = NULL;
 
 499         unsigned long mem_base, mem_len, db_base, db_len, pci_len0 = 0;
 
 501         int first_driver, first_boot;
 
 503         int pci_func_id = PCI_FUNC(pdev->devfn);
 
 504         struct netxen_legacy_intr_set *legacy_intrp;
 
 507         if (pci_func_id == 0)
 
 508                 printk(KERN_INFO "%s\n", netxen_nic_driver_string);
 
 510         if (pdev->class != 0x020000) {
 
 511                 printk(KERN_DEBUG "NetXen function %d, class %x will not "
 
 512                                 "be enabled.\n",pci_func_id, pdev->class);
 
 516         if (pdev->revision >= NX_P3_A0 && pdev->revision < NX_P3_B1) {
 
 517                 printk(KERN_WARNING "NetXen chip revisions between 0x%x-0x%x"
 
 518                                 "will not be enabled.\n",
 
 523         if ((err = pci_enable_device(pdev)))
 
 526         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
 
 528                 goto err_out_disable_pdev;
 
 531         if ((err = pci_request_regions(pdev, netxen_nic_driver_name)))
 
 532                 goto err_out_disable_pdev;
 
 534         pci_set_master(pdev);
 
 536         netdev = alloc_etherdev(sizeof(struct netxen_adapter));
 
 538                 printk(KERN_ERR"%s: Failed to allocate memory for the "
 
 539                                 "device block.Check system memory resource"
 
 540                                 " usage.\n", netxen_nic_driver_name);
 
 541                 goto err_out_free_res;
 
 544         SET_NETDEV_DEV(netdev, &pdev->dev);
 
 546         adapter = netdev->priv;
 
 547         adapter->netdev  = netdev;
 
 548         adapter->pdev    = pdev;
 
 549         adapter->ahw.pci_func  = pci_func_id;
 
 551         revision_id = pdev->revision;
 
 552         adapter->ahw.revision_id = revision_id;
 
 554         err = nx_set_dma_mask(adapter, revision_id);
 
 556                 goto err_out_free_netdev;
 
 558         rwlock_init(&adapter->adapter_lock);
 
 559         adapter->ahw.qdr_sn_window = -1;
 
 560         adapter->ahw.ddr_mn_window = -1;
 
 562         /* remap phys address */
 
 563         mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
 
 564         mem_len = pci_resource_len(pdev, 0);
 
 567         adapter->hw_write_wx = netxen_nic_hw_write_wx_128M;
 
 568         adapter->hw_read_wx = netxen_nic_hw_read_wx_128M;
 
 569         adapter->pci_read_immediate = netxen_nic_pci_read_immediate_128M;
 
 570         adapter->pci_write_immediate = netxen_nic_pci_write_immediate_128M;
 
 571         adapter->pci_read_normalize = netxen_nic_pci_read_normalize_128M;
 
 572         adapter->pci_write_normalize = netxen_nic_pci_write_normalize_128M;
 
 573         adapter->pci_set_window = netxen_nic_pci_set_window_128M;
 
 574         adapter->pci_mem_read = netxen_nic_pci_mem_read_128M;
 
 575         adapter->pci_mem_write = netxen_nic_pci_mem_write_128M;
 
 577         /* 128 Meg of memory */
 
 578         if (mem_len == NETXEN_PCI_128MB_SIZE) {
 
 579                 mem_ptr0 = ioremap(mem_base, FIRST_PAGE_GROUP_SIZE);
 
 580                 mem_ptr1 = ioremap(mem_base + SECOND_PAGE_GROUP_START,
 
 581                                 SECOND_PAGE_GROUP_SIZE);
 
 582                 mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START,
 
 583                                 THIRD_PAGE_GROUP_SIZE);
 
 584                 first_page_group_start = FIRST_PAGE_GROUP_START;
 
 585                 first_page_group_end   = FIRST_PAGE_GROUP_END;
 
 586         } else if (mem_len == NETXEN_PCI_32MB_SIZE) {
 
 587                 mem_ptr1 = ioremap(mem_base, SECOND_PAGE_GROUP_SIZE);
 
 588                 mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START -
 
 589                         SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE);
 
 590                 first_page_group_start = 0;
 
 591                 first_page_group_end   = 0;
 
 592         } else if (mem_len == NETXEN_PCI_2MB_SIZE) {
 
 593                 adapter->hw_write_wx = netxen_nic_hw_write_wx_2M;
 
 594                 adapter->hw_read_wx = netxen_nic_hw_read_wx_2M;
 
 595                 adapter->pci_read_immediate = netxen_nic_pci_read_immediate_2M;
 
 596                 adapter->pci_write_immediate =
 
 597                         netxen_nic_pci_write_immediate_2M;
 
 598                 adapter->pci_read_normalize = netxen_nic_pci_read_normalize_2M;
 
 599                 adapter->pci_write_normalize =
 
 600                         netxen_nic_pci_write_normalize_2M;
 
 601                 adapter->pci_set_window = netxen_nic_pci_set_window_2M;
 
 602                 adapter->pci_mem_read = netxen_nic_pci_mem_read_2M;
 
 603                 adapter->pci_mem_write = netxen_nic_pci_mem_write_2M;
 
 605                 mem_ptr0 = ioremap(mem_base, mem_len);
 
 607                 first_page_group_start = 0;
 
 608                 first_page_group_end   = 0;
 
 610                 adapter->ahw.ddr_mn_window = 0;
 
 611                 adapter->ahw.qdr_sn_window = 0;
 
 613                 adapter->ahw.mn_win_crb = 0x100000 + PCIX_MN_WINDOW +
 
 614                         (pci_func_id * 0x20);
 
 615                 adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW;
 
 617                         adapter->ahw.ms_win_crb += (pci_func_id * 0x20);
 
 619                         adapter->ahw.ms_win_crb +=
 
 620                                         0xA0 + ((pci_func_id - 4) * 0x10);
 
 623                 goto err_out_free_netdev;
 
 626         dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20));
 
 628         db_base = pci_resource_start(pdev, 4);  /* doorbell is on bar 4 */
 
 629         db_len = pci_resource_len(pdev, 4);
 
 632                 printk(KERN_ERR "%s: doorbell is disabled\n",
 
 633                                 netxen_nic_driver_name);
 
 635                 goto err_out_iounmap;
 
 637         DPRINTK(INFO, "doorbell ioremap from %lx a size of %lx\n", db_base,
 
 640         db_ptr = ioremap(db_base, NETXEN_DB_MAPSIZE_BYTES);
 
 642                 printk(KERN_ERR "%s: Failed to allocate doorbell map.",
 
 643                                 netxen_nic_driver_name);
 
 645                 goto err_out_iounmap;
 
 647         DPRINTK(INFO, "doorbell ioremaped at %p\n", db_ptr);
 
 649         adapter->ahw.pci_base0 = mem_ptr0;
 
 650         adapter->ahw.pci_len0 = pci_len0;
 
 651         adapter->ahw.first_page_group_start = first_page_group_start;
 
 652         adapter->ahw.first_page_group_end   = first_page_group_end;
 
 653         adapter->ahw.pci_base1 = mem_ptr1;
 
 654         adapter->ahw.pci_base2 = mem_ptr2;
 
 655         adapter->ahw.db_base = db_ptr;
 
 656         adapter->ahw.db_len = db_len;
 
 658         netif_napi_add(netdev, &adapter->napi,
 
 659                         netxen_nic_poll, NETXEN_NETDEV_WEIGHT);
 
 661         if (revision_id >= NX_P3_B0)
 
 662                 legacy_intrp = &legacy_intr[pci_func_id];
 
 664                 legacy_intrp = &legacy_intr[0];
 
 666         adapter->legacy_intr.int_vec_bit = legacy_intrp->int_vec_bit;
 
 667         adapter->legacy_intr.tgt_status_reg = legacy_intrp->tgt_status_reg;
 
 668         adapter->legacy_intr.tgt_mask_reg = legacy_intrp->tgt_mask_reg;
 
 669         adapter->legacy_intr.pci_int_reg = legacy_intrp->pci_int_reg;
 
 671         /* this will be read from FW later */
 
 672         adapter->intr_scheme = -1;
 
 673         adapter->msi_mode = -1;
 
 675         /* This will be reset for mezz cards  */
 
 676         adapter->portnum = pci_func_id;
 
 677         adapter->status   &= ~NETXEN_NETDEV_STATUS;
 
 678         adapter->rx_csum = 1;
 
 679         adapter->mc_enabled = 0;
 
 680         if (NX_IS_REVISION_P3(revision_id))
 
 681                 adapter->max_mc_count = 38;
 
 683                 adapter->max_mc_count = 16;
 
 685         netdev->open               = netxen_nic_open;
 
 686         netdev->stop               = netxen_nic_close;
 
 687         netdev->hard_start_xmit    = netxen_nic_xmit_frame;
 
 688         netdev->get_stats          = netxen_nic_get_stats;
 
 689         if (NX_IS_REVISION_P3(revision_id))
 
 690                 netdev->set_multicast_list = netxen_p3_nic_set_multi;
 
 692                 netdev->set_multicast_list = netxen_p2_nic_set_multi;
 
 693         netdev->set_mac_address    = netxen_nic_set_mac;
 
 694         netdev->change_mtu         = netxen_nic_change_mtu;
 
 695         netdev->tx_timeout         = netxen_tx_timeout;
 
 696         netdev->watchdog_timeo     = 2*HZ;
 
 698         netxen_nic_change_mtu(netdev, netdev->mtu);
 
 700         SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
 
 701 #ifdef CONFIG_NET_POLL_CONTROLLER
 
 702         netdev->poll_controller = netxen_nic_poll_controller;
 
 704         /* ScatterGather support */
 
 705         netdev->features = NETIF_F_SG;
 
 706         netdev->features |= NETIF_F_IP_CSUM;
 
 707         netdev->features |= NETIF_F_TSO;
 
 708         if (NX_IS_REVISION_P3(revision_id)) {
 
 709                 netdev->features |= NETIF_F_IPV6_CSUM;
 
 710                 netdev->features |= NETIF_F_TSO6;
 
 713         if (adapter->pci_using_dac)
 
 714                 netdev->features |= NETIF_F_HIGHDMA;
 
 717          * Set the CRB window to invalid. If any register in window 0 is
 
 718          * accessed it should set the window to 0 and then reset it to 1.
 
 720         adapter->curr_window = 255;
 
 722         if (netxen_nic_get_board_info(adapter) != 0) {
 
 723                 printk("%s: Error getting board config info.\n",
 
 724                                 netxen_nic_driver_name);
 
 726                 goto err_out_iounmap;
 
 729         netxen_initialize_adapter_ops(adapter);
 
 731         /* Mezz cards have PCI function 0,2,3 enabled */
 
 732         switch (adapter->ahw.boardcfg.board_type) {
 
 733         case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
 
 734         case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
 
 735                 if (pci_func_id >= 2)
 
 736                         adapter->portnum = pci_func_id - 2;
 
 743          * This call will setup various max rx/tx counts.
 
 744          * It must be done before any buffer/ring allocations.
 
 746         netxen_check_options(adapter);
 
 749         if (NX_IS_REVISION_P3(revision_id)) {
 
 750                 if (adapter->ahw.pci_func == 0)
 
 753                 if (adapter->portnum == 0)
 
 758                 first_boot = adapter->pci_read_normalize(adapter,
 
 759                                 NETXEN_CAM_RAM(0x1fc));
 
 761                 err = netxen_check_hw_init(adapter, first_boot);
 
 763                         printk(KERN_ERR "%s: error in init HW init sequence\n",
 
 764                                         netxen_nic_driver_name);
 
 765                         goto err_out_iounmap;
 
 768                 if (NX_IS_REVISION_P3(revision_id))
 
 769                         netxen_set_port_mode(adapter);
 
 771                 if (first_boot != 0x55555555) {
 
 772                         adapter->pci_write_normalize(adapter,
 
 773                                                 CRB_CMDPEG_STATE, 0);
 
 774                         netxen_pinit_from_rom(adapter, 0);
 
 776                         netxen_load_firmware(adapter);
 
 779                 if (NX_IS_REVISION_P3(revision_id))
 
 780                         netxen_pcie_strap_init(adapter);
 
 782                 if (NX_IS_REVISION_P2(revision_id)) {
 
 784                         /* Initialize multicast addr pool owners */
 
 786                         if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
 
 788                         netxen_crb_writelit_adapter(adapter,
 
 789                                         NETXEN_MAC_ADDR_CNTL_REG, val);
 
 793                 if ((first_boot == 0x55555555) &&
 
 794                         (NX_IS_REVISION_P2(revision_id))) {
 
 795                         /* Unlock the HW, prompting the boot sequence */
 
 796                         adapter->pci_write_normalize(adapter,
 
 797                                         NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
 
 800                 err = netxen_initialize_adapter_offload(adapter);
 
 802                         goto err_out_iounmap;
 
 805                  * Tell the hardware our version number.
 
 807                 i = (_NETXEN_NIC_LINUX_MAJOR << 16)
 
 808                         | ((_NETXEN_NIC_LINUX_MINOR << 8))
 
 809                         | (_NETXEN_NIC_LINUX_SUBVERSION);
 
 810                 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
 
 812                 /* Handshake with the card before we register the devices. */
 
 813                 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
 
 817         netxen_nic_flash_print(adapter);
 
 819         if (NX_IS_REVISION_P3(revision_id)) {
 
 820                 adapter->hw_read_wx(adapter,
 
 821                                 NETXEN_MIU_MN_CONTROL, &val, 4);
 
 822                 adapter->ahw.cut_through = (val & 0x4) ? 1 : 0;
 
 823                 dev_info(&pdev->dev, "firmware running in %s mode\n",
 
 824                 adapter->ahw.cut_through ? "cut through" : "legacy");
 
 828          * See if the firmware gave us a virtual-physical port mapping.
 
 830         adapter->physical_port = adapter->portnum;
 
 831         i = adapter->pci_read_normalize(adapter, CRB_V2P(adapter->portnum));
 
 833                 adapter->physical_port = i;
 
 835         adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
 
 837         netxen_set_msix_bit(pdev, 0);
 
 839         if (NX_IS_REVISION_P3(revision_id)) {
 
 840                 if ((mem_len != NETXEN_PCI_128MB_SIZE) &&
 
 841                         mem_len != NETXEN_PCI_2MB_SIZE)
 
 842                         adapter->msix_supported = 0;
 
 845         if (adapter->msix_supported) {
 
 847                 netxen_init_msix_entries(adapter);
 
 849                 if (pci_enable_msix(pdev, adapter->msix_entries,
 
 850                                         MSIX_ENTRIES_PER_ADAPTER))
 
 853                 adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
 
 854                 netxen_set_msix_bit(pdev, 1);
 
 855                 dev_info(&pdev->dev, "using msi-x interrupts\n");
 
 859                 if (use_msi && !pci_enable_msi(pdev)) {
 
 860                         adapter->flags |= NETXEN_NIC_MSI_ENABLED;
 
 861                         dev_info(&pdev->dev, "using msi interrupts\n");
 
 863                         dev_info(&pdev->dev, "using legacy interrupts\n");
 
 866         if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
 
 867                 netdev->irq = adapter->msix_entries[0].vector;
 
 869                 netdev->irq = pdev->irq;
 
 871         err = netxen_receive_peg_ready(adapter);
 
 873                 goto err_out_disable_msi;
 
 875         init_timer(&adapter->watchdog_timer);
 
 876         adapter->watchdog_timer.function = &netxen_watchdog;
 
 877         adapter->watchdog_timer.data = (unsigned long)adapter;
 
 878         INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task);
 
 879         INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
 
 881         err = netxen_read_mac_addr(adapter);
 
 883                 dev_warn(&pdev->dev, "failed to read mac addr\n");
 
 885         netif_carrier_off(netdev);
 
 886         netif_stop_queue(netdev);
 
 888         if ((err = register_netdev(netdev))) {
 
 889                 printk(KERN_ERR "%s: register_netdev failed port #%d"
 
 890                                " aborting\n", netxen_nic_driver_name,
 
 893                 goto err_out_disable_msi;
 
 896         pci_set_drvdata(pdev, adapter);
 
 898         switch (adapter->ahw.board_type) {
 
 900                 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
 
 901                                 adapter->netdev->name);
 
 903         case NETXEN_NIC_XGBE:
 
 904                 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
 
 905                                 adapter->netdev->name);
 
 912         if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
 
 913                 pci_disable_msix(pdev);
 
 914         if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
 
 915                 pci_disable_msi(pdev);
 
 918                 netxen_free_adapter_offload(adapter);
 
 935         pci_release_regions(pdev);
 
 937 err_out_disable_pdev:
 
 938         pci_set_drvdata(pdev, NULL);
 
 939         pci_disable_device(pdev);
 
 943 static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
 945         struct netxen_adapter *adapter;
 
 946         struct net_device *netdev;
 
 948         adapter = pci_get_drvdata(pdev);
 
 952         netdev = adapter->netdev;
 
 954         unregister_netdev(netdev);
 
 956         if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
 
 957                 netxen_free_hw_resources(adapter);
 
 958                 netxen_release_rx_buffers(adapter);
 
 959                 netxen_free_sw_resources(adapter);
 
 962         if (adapter->portnum == 0)
 
 963                 netxen_free_adapter_offload(adapter);
 
 966                 free_irq(adapter->irq, adapter);
 
 968         if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
 
 969                 pci_disable_msix(pdev);
 
 970         if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
 
 971                 pci_disable_msi(pdev);
 
 973         iounmap(adapter->ahw.db_base);
 
 974         iounmap(adapter->ahw.pci_base0);
 
 975         iounmap(adapter->ahw.pci_base1);
 
 976         iounmap(adapter->ahw.pci_base2);
 
 978         pci_release_regions(pdev);
 
 979         pci_disable_device(pdev);
 
 980         pci_set_drvdata(pdev, NULL);
 
 986  * Called when a network interface is made active
 
 987  * @returns 0 on success, negative value on failure
 
 989 static int netxen_nic_open(struct net_device *netdev)
 
 991         struct netxen_adapter *adapter = (struct netxen_adapter *)netdev->priv;
 
 994         irq_handler_t handler;
 
 995         unsigned long flags = IRQF_SAMPLE_RANDOM;
 
 997         if (adapter->driver_mismatch)
 
1000         if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) {
 
1001                 err = netxen_init_firmware(adapter);
 
1003                         printk(KERN_ERR "Failed to init firmware\n");
 
1007                 if (adapter->fw_major < 4)
 
1008                         adapter->max_rds_rings = 3;
 
1010                         adapter->max_rds_rings = 2;
 
1012                 err = netxen_alloc_sw_resources(adapter);
 
1014                         printk(KERN_ERR "%s: Error in setting sw resources\n",
 
1019                 netxen_nic_clear_stats(adapter);
 
1021                 err = netxen_alloc_hw_resources(adapter);
 
1023                         printk(KERN_ERR "%s: Error in setting hw resources\n",
 
1025                         goto err_out_free_sw;
 
1028                 if ((adapter->msi_mode != MSI_MODE_MULTIFUNC) ||
 
1029                         (adapter->intr_scheme != INTR_SCHEME_PERPORT)) {
 
1030                         printk(KERN_ERR "%s: Firmware interrupt scheme is "
 
1031                                         "incompatible with driver\n",
 
1033                         adapter->driver_mismatch = 1;
 
1034                         goto err_out_free_hw;
 
1037                 if (adapter->fw_major < 4) {
 
1038                         adapter->crb_addr_cmd_producer =
 
1039                                 crb_cmd_producer[adapter->portnum];
 
1040                         adapter->crb_addr_cmd_consumer =
 
1041                                 crb_cmd_consumer[adapter->portnum];
 
1043                         netxen_nic_update_cmd_producer(adapter, 0);
 
1044                         netxen_nic_update_cmd_consumer(adapter, 0);
 
1047                 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
 
1048                         for (ring = 0; ring < adapter->max_rds_rings; ring++)
 
1049                                 netxen_post_rx_buffers(adapter, ctx, ring);
 
1051                 if (NETXEN_IS_MSI_FAMILY(adapter))
 
1052                         handler = netxen_msi_intr;
 
1054                         flags |= IRQF_SHARED;
 
1055                         handler = netxen_intr;
 
1057                 adapter->irq = netdev->irq;
 
1058                 err = request_irq(adapter->irq, handler,
 
1059                                   flags, netdev->name, adapter);
 
1061                         printk(KERN_ERR "request_irq failed with: %d\n", err);
 
1062                         goto err_out_free_rxbuf;
 
1065                 adapter->is_up = NETXEN_ADAPTER_UP_MAGIC;
 
1068         /* Done here again so that even if phantom sw overwrote it,
 
1070         err = adapter->init_port(adapter, adapter->physical_port);
 
1072                 printk(KERN_ERR "%s: Failed to initialize port %d\n",
 
1073                                 netxen_nic_driver_name, adapter->portnum);
 
1074                 goto err_out_free_irq;
 
1076         adapter->macaddr_set(adapter, netdev->dev_addr);
 
1078         netxen_nic_set_link_parameters(adapter);
 
1080         netdev->set_multicast_list(netdev);
 
1081         if (adapter->set_mtu)
 
1082                 adapter->set_mtu(adapter, netdev->mtu);
 
1084         adapter->ahw.linkup = 0;
 
1085         mod_timer(&adapter->watchdog_timer, jiffies);
 
1087         napi_enable(&adapter->napi);
 
1088         netxen_nic_enable_int(adapter);
 
1090         netif_start_queue(netdev);
 
1095         free_irq(adapter->irq, adapter);
 
1097         netxen_release_rx_buffers(adapter);
 
1099         netxen_free_hw_resources(adapter);
 
1101         netxen_free_sw_resources(adapter);
 
1106  * netxen_nic_close - Disables a network interface entry point
 
1108 static int netxen_nic_close(struct net_device *netdev)
 
1110         struct netxen_adapter *adapter = netdev_priv(netdev);
 
1112         netif_carrier_off(netdev);
 
1113         netif_stop_queue(netdev);
 
1114         napi_disable(&adapter->napi);
 
1116         if (adapter->stop_port)
 
1117                 adapter->stop_port(adapter);
 
1119         netxen_nic_disable_int(adapter);
 
1121         netxen_release_tx_buffers(adapter);
 
1123         FLUSH_SCHEDULED_WORK();
 
1124         del_timer_sync(&adapter->watchdog_timer);
 
1129 void netxen_tso_check(struct netxen_adapter *adapter,
 
1130                       struct cmd_desc_type0 *desc, struct sk_buff *skb)
 
1133                 desc->total_hdr_length = (sizeof(struct ethhdr) +
 
1134                                           ip_hdrlen(skb) + tcp_hdrlen(skb));
 
1136                 if ((NX_IS_REVISION_P3(adapter->ahw.revision_id)) &&
 
1137                                 (skb->protocol == htons(ETH_P_IPV6)))
 
1138                         netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO6);
 
1140                         netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO);
 
1142         } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
 
1143                 if (ip_hdr(skb)->protocol == IPPROTO_TCP)
 
1144                         netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT);
 
1145                 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
 
1146                         netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT);
 
1150         desc->tcp_hdr_offset = skb_transport_offset(skb);
 
1151         desc->ip_hdr_offset = skb_network_offset(skb);
 
1154 static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
 
1156         struct netxen_adapter *adapter = netdev_priv(netdev);
 
1157         struct netxen_hardware_context *hw = &adapter->ahw;
 
1158         unsigned int first_seg_len = skb->len - skb->data_len;
 
1159         struct netxen_skb_frag *buffrag;
 
1162         u32 producer, consumer;
 
1163         u32 saved_producer = 0;
 
1164         struct cmd_desc_type0 *hwdesc;
 
1166         struct netxen_cmd_buffer *pbuf = NULL;
 
1169         u32 num_txd = adapter->max_tx_desc_count;
 
1171         frag_count = skb_shinfo(skb)->nr_frags + 1;
 
1173         /* There 4 fragments per descriptor */
 
1174         no_of_desc = (frag_count + 3) >> 2;
 
1175         if (netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) {
 
1176                 if (skb_shinfo(skb)->gso_size > 0) {
 
1179                         if ((ip_hdrlen(skb) + tcp_hdrlen(skb) +
 
1180                              sizeof(struct ethhdr)) >
 
1181                             (sizeof(struct cmd_desc_type0) - 2)) {
 
1187         producer = adapter->cmd_producer;
 
1189         consumer = adapter->last_cmd_consumer;
 
1190         if ((no_of_desc+2) > find_diff_among(producer, consumer, num_txd)) {
 
1191                 netif_stop_queue(netdev);
 
1193                 return NETDEV_TX_BUSY;
 
1196         /* Copy the descriptors into the hardware    */
 
1197         saved_producer = producer;
 
1198         hwdesc = &hw->cmd_desc_head[producer];
 
1199         memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
 
1200         /* Take skb->data itself */
 
1201         pbuf = &adapter->cmd_buf_arr[producer];
 
1202         if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) &&
 
1203                         skb_shinfo(skb)->gso_size > 0) {
 
1204                 pbuf->mss = skb_shinfo(skb)->gso_size;
 
1205                 hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
 
1210         pbuf->total_length = skb->len;
 
1212         pbuf->cmd = TX_ETHER_PKT;
 
1213         pbuf->frag_count = frag_count;
 
1214         pbuf->port = adapter->portnum;
 
1215         buffrag = &pbuf->frag_array[0];
 
1216         buffrag->dma = pci_map_single(adapter->pdev, skb->data, first_seg_len,
 
1218         buffrag->length = first_seg_len;
 
1219         netxen_set_cmd_desc_totallength(hwdesc, skb->len);
 
1220         netxen_set_cmd_desc_num_of_buff(hwdesc, frag_count);
 
1221         netxen_set_cmd_desc_opcode(hwdesc, TX_ETHER_PKT);
 
1223         netxen_set_cmd_desc_port(hwdesc, adapter->portnum);
 
1224         netxen_set_cmd_desc_ctxid(hwdesc, adapter->portnum);
 
1225         hwdesc->buffer1_length = cpu_to_le16(first_seg_len);
 
1226         hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma);
 
1228         for (i = 1, k = 1; i < frag_count; i++, k++) {
 
1229                 struct skb_frag_struct *frag;
 
1231                 unsigned long offset;
 
1232                 dma_addr_t temp_dma;
 
1234                 /* move to next desc. if there is a need */
 
1235                 if ((i & 0x3) == 0) {
 
1237                         producer = get_next_index(producer, num_txd);
 
1238                         hwdesc = &hw->cmd_desc_head[producer];
 
1239                         memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
 
1240                         pbuf = &adapter->cmd_buf_arr[producer];
 
1243                 frag = &skb_shinfo(skb)->frags[i - 1];
 
1245                 offset = frag->page_offset;
 
1248                 temp_dma = pci_map_page(adapter->pdev, frag->page, offset,
 
1249                                         len, PCI_DMA_TODEVICE);
 
1252                 buffrag->dma = temp_dma;
 
1253                 buffrag->length = temp_len;
 
1257                         hwdesc->buffer1_length = cpu_to_le16(temp_len);
 
1258                         hwdesc->addr_buffer1 = cpu_to_le64(temp_dma);
 
1261                         hwdesc->buffer2_length = cpu_to_le16(temp_len);
 
1262                         hwdesc->addr_buffer2 = cpu_to_le64(temp_dma);
 
1265                         hwdesc->buffer3_length = cpu_to_le16(temp_len);
 
1266                         hwdesc->addr_buffer3 = cpu_to_le64(temp_dma);
 
1269                         hwdesc->buffer4_length = cpu_to_le16(temp_len);
 
1270                         hwdesc->addr_buffer4 = cpu_to_le64(temp_dma);
 
1275         producer = get_next_index(producer, num_txd);
 
1277         /* might change opcode to TX_TCP_LSO */
 
1278         netxen_tso_check(adapter, &hw->cmd_desc_head[saved_producer], skb);
 
1280         /* For LSO, we need to copy the MAC/IP/TCP headers into
 
1281          * the descriptor ring
 
1283         if (netxen_get_cmd_desc_opcode(&hw->cmd_desc_head[saved_producer])
 
1285                 int hdr_len, first_hdr_len, more_hdr;
 
1286                 hdr_len = hw->cmd_desc_head[saved_producer].total_hdr_length;
 
1287                 if (hdr_len > (sizeof(struct cmd_desc_type0) - 2)) {
 
1288                         first_hdr_len = sizeof(struct cmd_desc_type0) - 2;
 
1291                         first_hdr_len = hdr_len;
 
1294                 /* copy the MAC/IP/TCP headers to the cmd descriptor list */
 
1295                 hwdesc = &hw->cmd_desc_head[producer];
 
1296                 pbuf = &adapter->cmd_buf_arr[producer];
 
1299                 /* copy the first 64 bytes */
 
1300                 memcpy(((void *)hwdesc) + 2,
 
1301                        (void *)(skb->data), first_hdr_len);
 
1302                 producer = get_next_index(producer, num_txd);
 
1305                         hwdesc = &hw->cmd_desc_head[producer];
 
1306                         pbuf = &adapter->cmd_buf_arr[producer];
 
1308                         /* copy the next 64 bytes - should be enough except
 
1309                          * for pathological case
 
1311                         skb_copy_from_linear_data_offset(skb, first_hdr_len,
 
1315                         producer = get_next_index(producer, num_txd);
 
1319         adapter->cmd_producer = producer;
 
1320         adapter->stats.txbytes += skb->len;
 
1322         netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer);
 
1324         adapter->stats.xmitcalled++;
 
1325         netdev->trans_start = jiffies;
 
1327         return NETDEV_TX_OK;
 
1330 static int netxen_nic_check_temp(struct netxen_adapter *adapter)
 
1332         struct net_device *netdev = adapter->netdev;
 
1333         uint32_t temp, temp_state, temp_val;
 
1336         temp = adapter->pci_read_normalize(adapter, CRB_TEMP_STATE);
 
1338         temp_state = nx_get_temp_state(temp);
 
1339         temp_val = nx_get_temp_val(temp);
 
1341         if (temp_state == NX_TEMP_PANIC) {
 
1343                        "%s: Device temperature %d degrees C exceeds"
 
1344                        " maximum allowed. Hardware has been shut down.\n",
 
1345                        netxen_nic_driver_name, temp_val);
 
1347                 netif_carrier_off(netdev);
 
1348                 netif_stop_queue(netdev);
 
1350         } else if (temp_state == NX_TEMP_WARN) {
 
1351                 if (adapter->temp == NX_TEMP_NORMAL) {
 
1353                                "%s: Device temperature %d degrees C "
 
1354                                "exceeds operating range."
 
1355                                " Immediate action needed.\n",
 
1356                                netxen_nic_driver_name, temp_val);
 
1359                 if (adapter->temp == NX_TEMP_WARN) {
 
1361                                "%s: Device temperature is now %d degrees C"
 
1362                                " in normal range.\n", netxen_nic_driver_name,
 
1366         adapter->temp = temp_state;
 
1370 static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
 
1372         struct net_device *netdev = adapter->netdev;
 
1373         u32 val, port, linkup;
 
1375         port = adapter->physical_port;
 
1377         if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
 
1378                 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE_P3);
 
1379                 val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
 
1380                 linkup = (val == XG_LINK_UP_P3);
 
1382                 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE);
 
1383                 if (adapter->ahw.board_type == NETXEN_NIC_GBE)
 
1384                         linkup = (val >> port) & 1;
 
1386                         val = (val >> port*8) & 0xff;
 
1387                         linkup = (val == XG_LINK_UP);
 
1391         if (adapter->ahw.linkup && !linkup) {
 
1392                 printk(KERN_INFO "%s: %s NIC Link is down\n",
 
1393                        netxen_nic_driver_name, netdev->name);
 
1394                 adapter->ahw.linkup = 0;
 
1395                 if (netif_running(netdev)) {
 
1396                         netif_carrier_off(netdev);
 
1397                         netif_stop_queue(netdev);
 
1399         } else if (!adapter->ahw.linkup && linkup) {
 
1400                 printk(KERN_INFO "%s: %s NIC Link is up\n",
 
1401                        netxen_nic_driver_name, netdev->name);
 
1402                 adapter->ahw.linkup = 1;
 
1403                 if (netif_running(netdev)) {
 
1404                         netif_carrier_on(netdev);
 
1405                         netif_wake_queue(netdev);
 
1410 static void netxen_watchdog(unsigned long v)
 
1412         struct netxen_adapter *adapter = (struct netxen_adapter *)v;
 
1414         SCHEDULE_WORK(&adapter->watchdog_task);
 
1417 void netxen_watchdog_task(struct work_struct *work)
 
1419         struct netxen_adapter *adapter =
 
1420                 container_of(work, struct netxen_adapter, watchdog_task);
 
1422         if ((adapter->portnum  == 0) && netxen_nic_check_temp(adapter))
 
1425         netxen_nic_handle_phy_intr(adapter);
 
1427         if (netif_running(adapter->netdev))
 
1428                 mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
 
1431 static void netxen_tx_timeout(struct net_device *netdev)
 
1433         struct netxen_adapter *adapter = (struct netxen_adapter *)
 
1434                                                 netdev_priv(netdev);
 
1435         SCHEDULE_WORK(&adapter->tx_timeout_task);
 
1438 static void netxen_tx_timeout_task(struct work_struct *work)
 
1440         struct netxen_adapter *adapter =
 
1441                 container_of(work, struct netxen_adapter, tx_timeout_task);
 
1443         printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
 
1444                netxen_nic_driver_name, adapter->netdev->name);
 
1446         netxen_nic_disable_int(adapter);
 
1447         napi_disable(&adapter->napi);
 
1449         adapter->netdev->trans_start = jiffies;
 
1451         napi_enable(&adapter->napi);
 
1452         netxen_nic_enable_int(adapter);
 
1453         netif_wake_queue(adapter->netdev);
 
1457  * netxen_nic_get_stats - Get System Network Statistics
 
1458  * @netdev: network interface device structure
 
1460 struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
 
1462         struct netxen_adapter *adapter = netdev_priv(netdev);
 
1463         struct net_device_stats *stats = &adapter->net_stats;
 
1465         memset(stats, 0, sizeof(*stats));
 
1467         /* total packets received   */
 
1468         stats->rx_packets = adapter->stats.no_rcv;
 
1469         /* total packets transmitted    */
 
1470         stats->tx_packets = adapter->stats.xmitedframes +
 
1471                 adapter->stats.xmitfinished;
 
1472         /* total bytes received     */
 
1473         stats->rx_bytes = adapter->stats.rxbytes;
 
1474         /* total bytes transmitted  */
 
1475         stats->tx_bytes = adapter->stats.txbytes;
 
1476         /* bad packets received     */
 
1477         stats->rx_errors = adapter->stats.rcvdbadskb;
 
1478         /* packet transmit problems */
 
1479         stats->tx_errors = adapter->stats.nocmddescriptor;
 
1480         /* no space in linux buffers    */
 
1481         stats->rx_dropped = adapter->stats.rxdropped;
 
1482         /* no space available in linux  */
 
1483         stats->tx_dropped = adapter->stats.txdropped;
 
1488 static irqreturn_t netxen_intr(int irq, void *data)
 
1490         struct netxen_adapter *adapter = data;
 
1493         status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR);
 
1495         if (!(status & adapter->legacy_intr.int_vec_bit))
 
1498         if (adapter->ahw.revision_id >= NX_P3_B1) {
 
1499                 /* check interrupt state machine, to be sure */
 
1500                 status = adapter->pci_read_immediate(adapter,
 
1502                 if (!ISR_LEGACY_INT_TRIGGERED(status))
 
1506                 unsigned long our_int = 0;
 
1508                 our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR);
 
1510                 /* not our interrupt */
 
1511                 if (!test_and_clear_bit((7 + adapter->portnum), &our_int))
 
1514                 /* claim interrupt */
 
1515                 adapter->pci_write_normalize(adapter,
 
1516                                 CRB_INT_VECTOR, (our_int & 0xffffffff));
 
1519         /* clear interrupt */
 
1520         if (adapter->fw_major < 4)
 
1521                 netxen_nic_disable_int(adapter);
 
1523         adapter->pci_write_immediate(adapter,
 
1524                         adapter->legacy_intr.tgt_status_reg,
 
1526         /* read twice to ensure write is flushed */
 
1527         adapter->pci_read_immediate(adapter, ISR_INT_VECTOR);
 
1528         adapter->pci_read_immediate(adapter, ISR_INT_VECTOR);
 
1530         napi_schedule(&adapter->napi);
 
1535 static irqreturn_t netxen_msi_intr(int irq, void *data)
 
1537         struct netxen_adapter *adapter = data;
 
1539         /* clear interrupt */
 
1540         adapter->pci_write_immediate(adapter,
 
1541                         msi_tgt_status[adapter->ahw.pci_func], 0xffffffff);
 
1543         napi_schedule(&adapter->napi);
 
1547 static int netxen_nic_poll(struct napi_struct *napi, int budget)
 
1549         struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi);
 
1554         tx_complete = netxen_process_cmd_ring(adapter);
 
1557         for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
 
1559                  * Fairness issue. This will give undue weight to the
 
1560                  * receive context 0.
 
1564                  * To avoid starvation, we give each of our receivers,
 
1565                  * a fraction of the quota. Sometimes, it might happen that we
 
1566                  * have enough quota to process every packet, but since all the
 
1567                  * packets are on one context, it gets only half of the quota,
 
1568                  * and ends up not processing it.
 
1570                 work_done += netxen_process_rcv_ring(adapter, ctx,
 
1571                                                      budget / MAX_RCV_CTX);
 
1574         if ((work_done < budget) && tx_complete) {
 
1575                 netif_rx_complete(adapter->netdev, &adapter->napi);
 
1576                 netxen_nic_enable_int(adapter);
 
1582 #ifdef CONFIG_NET_POLL_CONTROLLER
 
1583 static void netxen_nic_poll_controller(struct net_device *netdev)
 
1585         struct netxen_adapter *adapter = netdev_priv(netdev);
 
1586         disable_irq(adapter->irq);
 
1587         netxen_intr(adapter->irq, adapter);
 
1588         enable_irq(adapter->irq);
 
1592 static struct pci_driver netxen_driver = {
 
1593         .name = netxen_nic_driver_name,
 
1594         .id_table = netxen_pci_tbl,
 
1595         .probe = netxen_nic_probe,
 
1596         .remove = __devexit_p(netxen_nic_remove)
 
1599 /* Driver Registration on NetXen card    */
 
1601 static int __init netxen_init_module(void)
 
1603         if ((netxen_workq = create_singlethread_workqueue("netxen")) == NULL)
 
1606         return pci_register_driver(&netxen_driver);
 
1609 module_init(netxen_init_module);
 
1611 static void __exit netxen_exit_module(void)
 
1613         pci_unregister_driver(&netxen_driver);
 
1614         destroy_workqueue(netxen_workq);
 
1617 module_exit(netxen_exit_module);