]> pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
authorLinus Torvalds <torvalds@woody.osdl.org>
Fri, 29 Dec 2006 18:03:54 +0000 (10:03 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Fri, 29 Dec 2006 18:03:54 +0000 (10:03 -0800)
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (42 commits)
  r8169: extraneous Cmd{Tx/Rx}Enb write
  forcedeth: modified comment header
  NetXen: Reducing ring sizes for IOMMU issue.
  NetXen: Fix for PPC machines.
  NetXen: work queue fixes.
  NetXen: Link status message correction for quad port cards.
  NetXen: Multiple adapter fix.
  NetXen: Using correct CHECKSUM flag.
  NetXen: driver reload fix for newer firmware.
  NetXen: Adding new device ids.
  PHY probe not working properly for ibm_emac (PPC4xx)
  ep93xx: some minor cleanups to the ep93xx eth driver
  sky2: phy power down needs PCI config write enabled
  sky2: power management/MSI workaround
  sky2: dual port NAPI problem
  via-velocity uses INET interfaces
  e1000: Do not truncate TSO TCP header with 82544 workaround
  myri10ge: handle failures in suspend and resume
  myri10ge: no need to save MSI and PCIe state in the driver
  myri10ge: make msi configurable at runtime through sysfs
  ...

1  2 
drivers/net/netxen/netxen_nic.h
drivers/net/netxen/netxen_nic_hw.c
drivers/net/netxen/netxen_nic_init.c
drivers/net/netxen/netxen_nic_main.c

index b4c4fc0c7218e1b0639c5a60785dd69b2590777c,edd725ea7747973a22c142de3683121519c42eb2..6490acf053053fbc644630fbce8d10a3aa67d212
@@@ -63,7 -63,7 +63,7 @@@
  
  #include "netxen_nic_hw.h"
  
- #define NETXEN_NIC_BUILD_NO     "1"
+ #define NETXEN_NIC_BUILD_NO     "4"
  #define _NETXEN_NIC_LINUX_MAJOR 3
  #define _NETXEN_NIC_LINUX_MINOR 3
  #define _NETXEN_NIC_LINUX_SUBVERSION 2
@@@ -137,7 -137,7 +137,7 @@@ extern struct workqueue_struct *netxen_
  #define THIRD_PAGE_GROUP_SIZE  THIRD_PAGE_GROUP_END - THIRD_PAGE_GROUP_START
  
  #define MAX_RX_BUFFER_LENGTH          1760
- #define MAX_RX_JUMBO_BUFFER_LENGTH    9046
+ #define MAX_RX_JUMBO_BUFFER_LENGTH    8062
  #define MAX_RX_LRO_BUFFER_LENGTH      ((48*1024)-512)
  #define RX_DMA_MAP_LEN                        (MAX_RX_BUFFER_LENGTH - 2)
  #define RX_JUMBO_DMA_MAP_LEN  \
@@@ -199,9 -199,9 +199,9 @@@ enum 
                        (RCV_DESC_NORMAL)))
  
  #define MAX_CMD_DESCRIPTORS           1024
- #define MAX_RCV_DESCRIPTORS           32768
- #define MAX_JUMBO_RCV_DESCRIPTORS     4096
- #define MAX_LRO_RCV_DESCRIPTORS               2048
+ #define MAX_RCV_DESCRIPTORS           16384
+ #define MAX_JUMBO_RCV_DESCRIPTORS     1024
+ #define MAX_LRO_RCV_DESCRIPTORS               64
  #define MAX_RCVSTATUS_DESCRIPTORS     MAX_RCV_DESCRIPTORS
  #define MAX_JUMBO_RCV_DESC    MAX_JUMBO_RCV_DESCRIPTORS
  #define MAX_RCV_DESC          MAX_RCV_DESCRIPTORS
@@@ -852,8 -852,6 +852,6 @@@ struct netxen_adapter 
        spinlock_t tx_lock;
        spinlock_t lock;
        struct work_struct watchdog_task;
-       struct work_struct tx_timeout_task;
-       struct net_device *netdev;
        struct timer_list watchdog_timer;
  
        u32 curr_window;
        struct netxen_recv_context recv_ctx[MAX_RCV_CTX];
  
        int is_up;
-       int number;
        struct netxen_dummy_dma dummy_dma;
  
        /* Context interface shared between card and host */
@@@ -950,6 -947,7 +947,7 @@@ struct netxen_port 
        struct pci_dev *pdev;
        struct net_device_stats net_stats;
        struct netxen_port_stats stats;
+       struct work_struct tx_timeout_task;
  };
  
  #define PCI_OFFSET_FIRST_RANGE(adapter, off)    \
@@@ -1027,6 -1025,14 +1025,6 @@@ int netxen_nic_hw_read_wx(struct netxen
                          int len);
  int netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data,
                           int len);
 -int netxen_nic_hw_read_ioctl(struct netxen_adapter *adapter, u64 off,
 -                           void *data, int len);
 -int netxen_nic_hw_write_ioctl(struct netxen_adapter *adapter, u64 off,
 -                            void *data, int len);
 -int netxen_nic_pci_mem_write_ioctl(struct netxen_adapter *adapter,
 -                                 u64 off, void *data, int size);
 -int netxen_nic_pci_mem_read_ioctl(struct netxen_adapter *adapter,
 -                                u64 off, void *data, int size);
  void netxen_crb_writelit_adapter(struct netxen_adapter *adapter,
                                 unsigned long off, int data);
  
@@@ -1059,6 -1065,9 +1057,6 @@@ void netxen_tso_check(struct netxen_ada
                      struct cmd_desc_type0 *desc, struct sk_buff *skb);
  int netxen_nic_hw_resources(struct netxen_adapter *adapter);
  void netxen_nic_clear_stats(struct netxen_adapter *adapter);
 -int
 -netxen_nic_do_ioctl(struct netxen_adapter *adapter, void *u_data,
 -                  struct netxen_port *port);
  int netxen_nic_rx_has_work(struct netxen_adapter *adapter);
  int netxen_nic_tx_has_work(struct netxen_adapter *adapter);
  void netxen_watchdog_task(struct work_struct *work);
index 5dac50c870752f93585e969fe866c29ffb6b75d7,f2850bf318ca37429293202f9583611efafb554b..c0c31d1914a7e6c9485f2a6f78e4cc1474b9bfc4
@@@ -376,7 -376,7 +376,7 @@@ void netxen_tso_check(struct netxen_ada
                    ((skb->nh.iph)->ihl * sizeof(u32)) +
                    ((skb->h.th)->doff * sizeof(u32));
                netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO);
-       } else if (skb->ip_summed == CHECKSUM_COMPLETE) {
+       } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
                if (skb->nh.iph->protocol == IPPROTO_TCP) {
                        netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT);
                } else if (skb->nh.iph->protocol == IPPROTO_UDP) {
@@@ -997,3 -997,297 +997,3 @@@ void netxen_nic_flash_print(struct netx
                       fw_major, fw_minor);
  }
  
 -int netxen_crb_read_val(struct netxen_adapter *adapter, unsigned long off)
 -{
 -      int data;
 -      netxen_nic_hw_read_wx(adapter, off, &data, 4);
 -      return data;
 -}
 -
 -int netxen_nic_hw_write_ioctl(struct netxen_adapter *adapter, u64 off,
 -                            void *data, int len)
 -{
 -      void *addr;
 -      u64 offset = off;
 -      u8 *mem_ptr = NULL;
 -      unsigned long mem_base;
 -      unsigned long mem_page;
 -
 -      if (ADDR_IN_WINDOW1(off)) {
 -              addr = NETXEN_CRB_NORMALIZE(adapter, off);
 -              if (!addr) {
 -                      mem_base = pci_resource_start(adapter->ahw.pdev, 0);
 -                      offset = NETXEN_CRB_NORMAL(off);
 -                      mem_page = offset & PAGE_MASK;
 -                      if (mem_page != ((offset + len - 1) & PAGE_MASK))
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE * 2);
 -                      else
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE);
 -                      if (mem_ptr == 0UL) {
 -                              return 1;
 -                      }
 -                      addr = mem_ptr;
 -                      addr += offset & (PAGE_SIZE - 1);
 -              }
 -      } else {
 -              addr = pci_base_offset(adapter, off);
 -              if (!addr) {
 -                      mem_base = pci_resource_start(adapter->ahw.pdev, 0);
 -                      mem_page = off & PAGE_MASK;
 -                      if (mem_page != ((off + len - 1) & PAGE_MASK))
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE * 2);
 -                      else
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE);
 -                      if (mem_ptr == 0UL) {
 -                              return 1;
 -                      }
 -                      addr = mem_ptr;
 -                      addr += off & (PAGE_SIZE - 1);
 -              }
 -              netxen_nic_pci_change_crbwindow(adapter, 0);
 -      }
 -      switch (len) {
 -      case 1:
 -              writeb(*(u8 *) data, addr);
 -              break;
 -      case 2:
 -              writew(*(u16 *) data, addr);
 -              break;
 -      case 4:
 -              writel(*(u32 *) data, addr);
 -              break;
 -      case 8:
 -              writeq(*(u64 *) data, addr);
 -              break;
 -      default:
 -              DPRINTK(INFO,
 -                      "writing data %lx to offset %llx, num words=%d\n",
 -                      *(unsigned long *)data, off, (len >> 3));
 -
 -              netxen_nic_hw_block_write64((u64 __iomem *) data, addr,
 -                                          (len >> 3));
 -              break;
 -      }
 -
 -      if (!ADDR_IN_WINDOW1(off))
 -              netxen_nic_pci_change_crbwindow(adapter, 1);
 -      if (mem_ptr)
 -              iounmap(mem_ptr);
 -      return 0;
 -}
 -
 -int netxen_nic_hw_read_ioctl(struct netxen_adapter *adapter, u64 off,
 -                           void *data, int len)
 -{
 -      void *addr;
 -      u64 offset;
 -      u8 *mem_ptr = NULL;
 -      unsigned long mem_base;
 -      unsigned long mem_page;
 -
 -      if (ADDR_IN_WINDOW1(off)) {
 -              addr = NETXEN_CRB_NORMALIZE(adapter, off);
 -              if (!addr) {
 -                      mem_base = pci_resource_start(adapter->ahw.pdev, 0);
 -                      offset = NETXEN_CRB_NORMAL(off);
 -                      mem_page = offset & PAGE_MASK;
 -                      if (mem_page != ((offset + len - 1) & PAGE_MASK))
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE * 2);
 -                      else
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE);
 -                      if (mem_ptr == 0UL) {
 -                              *(u8 *) data = 0;
 -                              return 1;
 -                      }
 -                      addr = mem_ptr;
 -                      addr += offset & (PAGE_SIZE - 1);
 -              }
 -      } else {
 -              addr = pci_base_offset(adapter, off);
 -              if (!addr) {
 -                      mem_base = pci_resource_start(adapter->ahw.pdev, 0);
 -                      mem_page = off & PAGE_MASK;
 -                      if (mem_page != ((off + len - 1) & PAGE_MASK))
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE * 2);
 -                      else
 -                              mem_ptr =
 -                                  ioremap(mem_base + mem_page, PAGE_SIZE);
 -                      if (mem_ptr == 0UL)
 -                              return 1;
 -                      addr = mem_ptr;
 -                      addr += off & (PAGE_SIZE - 1);
 -              }
 -              netxen_nic_pci_change_crbwindow(adapter, 0);
 -      }
 -      switch (len) {
 -      case 1:
 -              *(u8 *) data = readb(addr);
 -              break;
 -      case 2:
 -              *(u16 *) data = readw(addr);
 -              break;
 -      case 4:
 -              *(u32 *) data = readl(addr);
 -              break;
 -      case 8:
 -              *(u64 *) data = readq(addr);
 -              break;
 -      default:
 -              netxen_nic_hw_block_read64((u64 __iomem *) data, addr,
 -                                         (len >> 3));
 -              break;
 -      }
 -      if (!ADDR_IN_WINDOW1(off))
 -              netxen_nic_pci_change_crbwindow(adapter, 1);
 -      if (mem_ptr)
 -              iounmap(mem_ptr);
 -      return 0;
 -}
 -
 -int netxen_nic_pci_mem_write_ioctl(struct netxen_adapter *adapter, u64 off,
 -                                 void *data, int size)
 -{
 -      void *addr;
 -      int ret = 0;
 -      u8 *mem_ptr = NULL;
 -      unsigned long mem_base;
 -      unsigned long mem_page;
 -
 -      if (data == NULL || off > (128 * 1024 * 1024)) {
 -              printk(KERN_ERR "%s: data: %p off:%llx\n",
 -                     netxen_nic_driver_name, data, off);
 -              return 1;
 -      }
 -      off = netxen_nic_pci_set_window(adapter, off);
 -      /* Corner case : Malicious user tried to break the driver by reading
 -         last few bytes in ranges and tries to read further addresses.
 -       */
 -      if (!pci_base(adapter, off + size - 1) && pci_base(adapter, off)) {
 -              printk(KERN_ERR "%s: Invalid access to memory address range"
 -                     " 0x%llx - 0x%llx\n", netxen_nic_driver_name, off,
 -                     off + size);
 -              return 1;
 -      }
 -      addr = pci_base_offset(adapter, off);
 -      DPRINTK(INFO, "writing data %llx to offset %llx\n",
 -              *(unsigned long long *)data, off);
 -      if (!addr) {
 -              mem_base = pci_resource_start(adapter->ahw.pdev, 0);
 -              mem_page = off & PAGE_MASK;
 -              /* Map two pages whenever user tries to access addresses in two
 -                 consecutive pages.
 -               */
 -              if (mem_page != ((off + size - 1) & PAGE_MASK))
 -                      mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2);
 -              else
 -                      mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE);
 -              if (mem_ptr == 0UL) {
 -                      return 1;
 -              }
 -              addr = mem_ptr;
 -              addr += off & (PAGE_SIZE - 1);
 -      }
 -      switch (size) {
 -      case 1:
 -              writeb(*(u8 *) data, addr);
 -              break;
 -      case 2:
 -              writew(*(u16 *) data, addr);
 -              break;
 -      case 4:
 -              writel(*(u32 *) data, addr);
 -              break;
 -      case 8:
 -              writeq(*(u64 *) data, addr);
 -              break;
 -      default:
 -              DPRINTK(INFO,
 -                      "writing data %lx to offset %llx, num words=%d\n",
 -                      *(unsigned long *)data, off, (size >> 3));
 -
 -              netxen_nic_hw_block_write64((u64 __iomem *) data, addr,
 -                                          (size >> 3));
 -              break;
 -      }
 -
 -      if (mem_ptr)
 -              iounmap(mem_ptr);
 -      DPRINTK(INFO, "wrote %llx\n", *(unsigned long long *)data);
 -
 -      return ret;
 -}
 -
 -int netxen_nic_pci_mem_read_ioctl(struct netxen_adapter *adapter,
 -                                u64 off, void *data, int size)
 -{
 -      void *addr;
 -      int ret = 0;
 -      u8 *mem_ptr = NULL;
 -      unsigned long mem_base;
 -      unsigned long mem_page;
 -
 -      if (data == NULL || off > (128 * 1024 * 1024)) {
 -              printk(KERN_ERR "%s: data: %p off:%llx\n",
 -                     netxen_nic_driver_name, data, off);
 -              return 1;
 -      }
 -      off = netxen_nic_pci_set_window(adapter, off);
 -      /* Corner case : Malicious user tried to break the driver by reading
 -         last few bytes in ranges and tries to read further addresses.
 -       */
 -      if (!pci_base(adapter, off + size - 1) && pci_base(adapter, off)) {
 -              printk(KERN_ERR "%s: Invalid access to memory address range"
 -                     " 0x%llx - 0x%llx\n", netxen_nic_driver_name, off,
 -                     off + size);
 -              return 1;
 -      }
 -      addr = pci_base_offset(adapter, off);
 -      if (!addr) {
 -              mem_base = pci_resource_start(adapter->ahw.pdev, 0);
 -              mem_page = off & PAGE_MASK;
 -              /* Map two pages whenever user tries to access addresses in two
 -                 consecutive pages.
 -               */
 -              if (mem_page != ((off + size - 1) & PAGE_MASK))
 -                      mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2);
 -              else
 -                      mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE);
 -              if (mem_ptr == 0UL) {
 -                      *(u8 *) data = 0;
 -                      return 1;
 -              }
 -              addr = mem_ptr;
 -              addr += off & (PAGE_SIZE - 1);
 -      }
 -      switch (size) {
 -      case 1:
 -              *(u8 *) data = readb(addr);
 -              break;
 -      case 2:
 -              *(u16 *) data = readw(addr);
 -              break;
 -      case 4:
 -              *(u32 *) data = readl(addr);
 -              break;
 -      case 8:
 -              *(u64 *) data = readq(addr);
 -              break;
 -      default:
 -              netxen_nic_hw_block_read64((u64 __iomem *) data, addr,
 -                                         (size >> 3));
 -              break;
 -      }
 -
 -      if (mem_ptr)
 -              iounmap(mem_ptr);
 -      DPRINTK(INFO, "read %llx\n", *(unsigned long long *)data);
 -
 -      return ret;
 -}
index deacc61e199c68f06c7e0e84b6556a213eaea458,c0cbc30964abf02e7ea9fd8aff2b86e5a8c2d9c9..c3e41f368554b6e3c321e21e66041fc77bd72013
@@@ -35,6 -35,7 +35,6 @@@
  #include <linux/delay.h>
  #include "netxen_nic.h"
  #include "netxen_nic_hw.h"
 -#include "netxen_nic_ioctl.h"
  #include "netxen_nic_phan_reg.h"
  
  struct crb_addr_pair {
@@@ -927,7 -928,7 +927,7 @@@ u32 netxen_process_rcv_ring(struct netx
                }
                netxen_process_rcv(adapter, ctxid, desc);
                netxen_clear_sts_owner(desc);
-               netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM);
+               netxen_set_sts_owner(desc, cpu_to_le16(STATUS_OWNER_PHANTOM));
                consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1);
                count++;
        }
@@@ -1022,7 -1023,7 +1022,7 @@@ int netxen_process_cmd_ring(unsigned lo
                             && netif_carrier_ok(port->netdev))
                    && ((jiffies - port->netdev->trans_start) >
                        port->netdev->watchdog_timeo)) {
-                       SCHEDULE_WORK(&port->adapter->tx_timeout_task);
+                       SCHEDULE_WORK(&port->tx_timeout_task);
                }
  
                last_consumer = get_next_index(last_consumer,
@@@ -1137,13 -1138,13 +1137,13 @@@ void netxen_post_rx_buffers(struct netx
                 */
                dma = pci_map_single(pdev, skb->data, rcv_desc->dma_size,
                                     PCI_DMA_FROMDEVICE);
-               pdesc->addr_buffer = dma;
+               pdesc->addr_buffer = cpu_to_le64(dma);
                buffer->skb = skb;
                buffer->state = NETXEN_BUFFER_BUSY;
                buffer->dma = dma;
                /* make a rcv descriptor  */
-               pdesc->reference_handle = buffer->ref_handle;
-               pdesc->buffer_length = rcv_desc->dma_size;
+               pdesc->reference_handle = cpu_to_le16(buffer->ref_handle);
+               pdesc->buffer_length = cpu_to_le32(rcv_desc->dma_size);
                DPRINTK(INFO, "done writing descripter\n");
                producer =
                    get_next_index(producer, rcv_desc->max_rx_desc_count);
@@@ -1231,8 -1232,8 +1231,8 @@@ void netxen_post_rx_buffers_nodb(struc
                                             PCI_DMA_FROMDEVICE);
  
                /* make a rcv descriptor  */
-               pdesc->reference_handle = le16_to_cpu(buffer->ref_handle);
-               pdesc->buffer_length = le16_to_cpu(rcv_desc->dma_size);
+               pdesc->reference_handle = cpu_to_le16(buffer->ref_handle);
+               pdesc->buffer_length = cpu_to_le16(rcv_desc->dma_size);
                pdesc->addr_buffer = cpu_to_le64(buffer->dma);
                DPRINTK(INFO, "done writing descripter\n");
                producer =
@@@ -1272,6 -1273,52 +1272,6 @@@ int netxen_nic_tx_has_work(struct netxe
        return 0;
  }
  
 -int
 -netxen_nic_fill_statistics(struct netxen_adapter *adapter,
 -                         struct netxen_port *port,
 -                         struct netxen_statistics *netxen_stats)
 -{
 -      void __iomem *addr;
 -
 -      if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
 -              netxen_nic_pci_change_crbwindow(adapter, 0);
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_TX_BYTE_CNT,
 -                                         &(netxen_stats->tx_bytes));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_TX_FRAME_CNT,
 -                                         &(netxen_stats->tx_packets));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_RX_BYTE_CNT,
 -                                         &(netxen_stats->rx_bytes));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_RX_FRAME_CNT,
 -                                         &(netxen_stats->rx_packets));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_AGGR_ERROR_CNT,
 -                                         &(netxen_stats->rx_errors));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_CRC_ERROR_CNT,
 -                                         &(netxen_stats->rx_crc_errors));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_OVERSIZE_FRAME_ERR,
 -                                         &(netxen_stats->
 -                                           rx_long_length_error));
 -              NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_XGE_UNDERSIZE_FRAME_ERR,
 -                                         &(netxen_stats->
 -                                           rx_short_length_error));
 -
 -              netxen_nic_pci_change_crbwindow(adapter, 1);
 -      } else {
 -              spin_lock_bh(&adapter->tx_lock);
 -              netxen_stats->tx_bytes = port->stats.txbytes;
 -              netxen_stats->tx_packets = port->stats.xmitedframes +
 -                  port->stats.xmitfinished;
 -              netxen_stats->rx_bytes = port->stats.rxbytes;
 -              netxen_stats->rx_packets = port->stats.no_rcv;
 -              netxen_stats->rx_errors = port->stats.rcvdbadskb;
 -              netxen_stats->tx_errors = port->stats.nocmddescriptor;
 -              netxen_stats->rx_short_length_error = port->stats.uplcong;
 -              netxen_stats->rx_long_length_error = port->stats.uphcong;
 -              netxen_stats->rx_crc_errors = 0;
 -              netxen_stats->rx_mac_errors = 0;
 -              spin_unlock_bh(&adapter->tx_lock);
 -      }
 -      return 0;
 -}
  
  void netxen_nic_clear_stats(struct netxen_adapter *adapter)
  {
        }
  }
  
 -int
 -netxen_nic_clear_statistics(struct netxen_adapter *adapter,
 -                          struct netxen_port *port)
 -{
 -      int data = 0;
 -
 -      netxen_nic_pci_change_crbwindow(adapter, 0);
 -
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_TX_BYTE_CNT, &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_TX_FRAME_CNT,
 -                                  &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_RX_BYTE_CNT, &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_RX_FRAME_CNT,
 -                                  &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_AGGR_ERROR_CNT,
 -                                  &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_CRC_ERROR_CNT,
 -                                  &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_OVERSIZE_FRAME_ERR,
 -                                  &data);
 -      netxen_nic_locked_write_reg(adapter, NETXEN_NIU_XGE_UNDERSIZE_FRAME_ERR,
 -                                  &data);
 -
 -      netxen_nic_pci_change_crbwindow(adapter, 1);
 -      netxen_nic_clear_stats(adapter);
 -      return 0;
 -}
 -
 -int
 -netxen_nic_do_ioctl(struct netxen_adapter *adapter, void *u_data,
 -                  struct netxen_port *port)
 -{
 -      struct netxen_nic_ioctl_data data;
 -      struct netxen_nic_ioctl_data *up_data;
 -      int retval = 0;
 -      struct netxen_statistics netxen_stats;
 -
 -      up_data = (void *)u_data;
 -
 -      DPRINTK(INFO, "doing ioctl for %p\n", adapter);
 -      if (copy_from_user(&data, (void __user *)up_data, sizeof(data))) {
 -              /* evil user tried to crash the kernel */
 -              DPRINTK(ERR, "bad copy from userland: %d\n", (int)sizeof(data));
 -              retval = -EFAULT;
 -              goto error_out;
 -      }
 -
 -      /* Shouldn't access beyond legal limits of  "char u[64];" member */
 -      if (!data.ptr && (data.size > sizeof(data.u))) {
 -              /* evil user tried to crash the kernel */
 -              DPRINTK(ERR, "bad size: %d\n", data.size);
 -              retval = -EFAULT;
 -              goto error_out;
 -      }
 -
 -      switch (data.cmd) {
 -      case netxen_nic_cmd_pci_read:
 -              if ((retval = netxen_nic_hw_read_ioctl(adapter, data.off,
 -                                                     &(data.u), data.size)))
 -                      goto error_out;
 -              if (copy_to_user
 -                  ((void __user *)&(up_data->u), &(data.u), data.size)) {
 -                      DPRINTK(ERR, "bad copy to userland: %d\n",
 -                              (int)sizeof(data));
 -                      retval = -EFAULT;
 -                      goto error_out;
 -              }
 -              data.rv = 0;
 -              break;
 -
 -      case netxen_nic_cmd_pci_write:
 -              if ((retval = netxen_nic_hw_write_ioctl(adapter, data.off,
 -                                                      &(data.u), data.size)))
 -                      goto error_out;
 -              data.rv = 0;
 -              break;
 -
 -      case netxen_nic_cmd_pci_mem_read:
 -              if (netxen_nic_pci_mem_read_ioctl(adapter, data.off, &(data.u),
 -                                                data.size)) {
 -                      DPRINTK(ERR, "Failed to read the data.\n");
 -                      retval = -EFAULT;
 -                      goto error_out;
 -              }
 -              if (copy_to_user
 -                  ((void __user *)&(up_data->u), &(data.u), data.size)) {
 -                      DPRINTK(ERR, "bad copy to userland: %d\n",
 -                              (int)sizeof(data));
 -                      retval = -EFAULT;
 -                      goto error_out;
 -              }
 -              data.rv = 0;
 -              break;
 -
 -      case netxen_nic_cmd_pci_mem_write:
 -              if ((retval = netxen_nic_pci_mem_write_ioctl(adapter, data.off,
 -                                                           &(data.u),
 -                                                           data.size)))
 -                      goto error_out;
 -              data.rv = 0;
 -              break;
 -
 -      case netxen_nic_cmd_pci_config_read:
 -              switch (data.size) {
 -              case 1:
 -                      data.rv = pci_read_config_byte(adapter->ahw.pdev,
 -                                                     data.off,
 -                                                     (char *)&(data.u));
 -                      break;
 -              case 2:
 -                      data.rv = pci_read_config_word(adapter->ahw.pdev,
 -                                                     data.off,
 -                                                     (short *)&(data.u));
 -                      break;
 -              case 4:
 -                      data.rv = pci_read_config_dword(adapter->ahw.pdev,
 -                                                      data.off,
 -                                                      (u32 *) & (data.u));
 -                      break;
 -              }
 -              if (copy_to_user
 -                  ((void __user *)&(up_data->u), &(data.u), data.size)) {
 -                      DPRINTK(ERR, "bad copy to userland: %d\n",
 -                              (int)sizeof(data));
 -                      retval = -EFAULT;
 -                      goto error_out;
 -              }
 -              break;
 -
 -      case netxen_nic_cmd_pci_config_write:
 -              switch (data.size) {
 -              case 1:
 -                      data.rv = pci_write_config_byte(adapter->ahw.pdev,
 -                                                      data.off,
 -                                                      *(char *)&(data.u));
 -                      break;
 -              case 2:
 -                      data.rv = pci_write_config_word(adapter->ahw.pdev,
 -                                                      data.off,
 -                                                      *(short *)&(data.u));
 -                      break;
 -              case 4:
 -                      data.rv = pci_write_config_dword(adapter->ahw.pdev,
 -                                                       data.off,
 -                                                       *(u32 *) & (data.u));
 -                      break;
 -              }
 -              break;
 -
 -      case netxen_nic_cmd_get_stats:
 -              data.rv =
 -                  netxen_nic_fill_statistics(adapter, port, &netxen_stats);
 -              if (copy_to_user
 -                  ((void __user *)(up_data->ptr), (void *)&netxen_stats,
 -                   sizeof(struct netxen_statistics))) {
 -                      DPRINTK(ERR, "bad copy to userland: %d\n",
 -                              (int)sizeof(netxen_stats));
 -                      retval = -EFAULT;
 -                      goto error_out;
 -              }
 -              up_data->rv = data.rv;
 -              break;
 -
 -      case netxen_nic_cmd_clear_stats:
 -              data.rv = netxen_nic_clear_statistics(adapter, port);
 -              up_data->rv = data.rv;
 -              break;
 -
 -      case netxen_nic_cmd_get_version:
 -              if (copy_to_user
 -                  ((void __user *)&(up_data->u), NETXEN_NIC_LINUX_VERSIONID,
 -                   sizeof(NETXEN_NIC_LINUX_VERSIONID))) {
 -                      DPRINTK(ERR, "bad copy to userland: %d\n",
 -                              (int)sizeof(data));
 -                      retval = -EFAULT;
 -                      goto error_out;
 -              }
 -              break;
 -
 -      default:
 -              DPRINTK(INFO, "bad command %d for %p\n", data.cmd, adapter);
 -              retval = -EOPNOTSUPP;
 -              goto error_out;
 -      }
 -      put_user(data.rv, (&(up_data->rv)));
 -      DPRINTK(INFO, "done ioctl for %p well.\n", adapter);
 -
 -      error_out:
 -      return retval;
 -}
index 1658ca1fa230684428251f6c3e78048fd33959b8,aecc07d5170cc0d8f508f84ce91524fbe8b292b5..8a5792fea774147cb7c7761eb89203a088ea9386
@@@ -38,6 -38,7 +38,6 @@@
  #include "netxen_nic.h"
  #define DEFINE_GLOBAL_RECV_CRB
  #include "netxen_nic_phan_reg.h"
 -#include "netxen_nic_ioctl.h"
  
  #include <linux/dma-mapping.h>
  #include <linux/vmalloc.h>
@@@ -52,8 -53,6 +52,6 @@@ char netxen_nic_driver_name[] = "netxen
  static char netxen_nic_driver_string[] = "NetXen Network Driver version "
      NETXEN_NIC_LINUX_VERSIONID;
  
- struct netxen_adapter *g_adapter = NULL;
  #define NETXEN_NETDEV_WEIGHT 120
  #define NETXEN_ADAPTER_UP_MAGIC 777
  #define NETXEN_NIC_PEG_TUNE 0
@@@ -74,6 -73,8 +72,6 @@@ static void netxen_tx_timeout(struct ne
  static void netxen_tx_timeout_task(struct work_struct *work);
  static void netxen_watchdog(unsigned long);
  static int netxen_handle_int(struct netxen_adapter *, struct net_device *);
 -static int netxen_nic_ioctl(struct net_device *netdev,
 -                          struct ifreq *ifr, int cmd);
  static int netxen_nic_poll(struct net_device *dev, int *budget);
  #ifdef CONFIG_NET_POLL_CONTROLLER
  static void netxen_nic_poll_controller(struct net_device *netdev);
@@@ -87,6 -88,8 +85,8 @@@ static struct pci_device_id netxen_pci_
        {PCI_DEVICE(0x4040, 0x0003)},
        {PCI_DEVICE(0x4040, 0x0004)},
        {PCI_DEVICE(0x4040, 0x0005)},
+       {PCI_DEVICE(0x4040, 0x0024)},
+       {PCI_DEVICE(0x4040, 0x0025)},
        {0,}
  };
  
@@@ -126,7 -129,6 +126,6 @@@ netxen_nic_probe(struct pci_dev *pdev, 
        struct netxen_cmd_buffer *cmd_buf_arr = NULL;
        u64 mac_addr[FLASH_NUM_PORTS + 1];
        int valid_mac = 0;
-       static int netxen_cards_found = 0;
  
        printk(KERN_INFO "%s \n", netxen_nic_driver_string);
        /* In current scheme, we use only PCI function 0 */
                goto err_out_dbunmap;
        }
  
-       if (netxen_cards_found == 0) {
-               g_adapter = adapter;
-       }
        adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS;
        adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS;
        adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
                netdev->set_multicast_list = netxen_nic_set_multi;
                netdev->set_mac_address = netxen_nic_set_mac;
                netdev->change_mtu = netxen_nic_change_mtu;
 -              netdev->do_ioctl = netxen_nic_ioctl;
                netdev->tx_timeout = netxen_tx_timeout;
                netdev->watchdog_timeo = HZ;
  
                                                             netdev->dev_addr);
                        }
                }
-               adapter->netdev = netdev;
-               INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
+               INIT_WORK(&port->tx_timeout_task, netxen_tx_timeout_task);
                netif_carrier_off(netdev);
                netif_stop_queue(netdev);
  
                adapter->port[i] = port;
        }
  
+       writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
+       netxen_pinit_from_rom(adapter, 0);
+       udelay(500);
+       netxen_load_firmware(adapter);
+       netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
        /*
         * delay a while to ensure that the Pegs are up & running.
         * Otherwise, we might see some flaky behaviour.
                break;
        }
  
-       adapter->number = netxen_cards_found;
        adapter->driver_mismatch = 0;
  
        return 0;
@@@ -527,6 -530,8 +526,8 @@@ static void __devexit netxen_nic_remove
  
        netxen_nic_stop_all_ports(adapter);
        /* leave the hw in the same state as reboot */
+       netxen_pinit_from_rom(adapter, 0);
+       writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
        netxen_load_firmware(adapter);
        netxen_free_adapter_offload(adapter);
  
@@@ -817,8 -822,8 +818,8 @@@ static int netxen_nic_xmit_frame(struc
        /* Take skb->data itself */
        pbuf = &adapter->cmd_buf_arr[producer];
        if ((netdev->features & NETIF_F_TSO) && skb_shinfo(skb)->gso_size > 0) {
-               pbuf->mss = skb_shinfo(skb)->gso_size;
-               hwdesc->mss = skb_shinfo(skb)->gso_size;
+               pbuf->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
+               hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
        } else {
                pbuf->mss = 0;
                hwdesc->mss = 0;
  static void netxen_watchdog(unsigned long v)
  {
        struct netxen_adapter *adapter = (struct netxen_adapter *)v;
-       if (adapter != g_adapter) {
-               printk("%s: ***BUG*** adapter[%p] != g_adapter[%p]\n",
-                      __FUNCTION__, adapter, g_adapter);
-               return;
-       }
  
        SCHEDULE_WORK(&adapter->watchdog_task);
  }
@@@ -965,23 -965,23 +961,23 @@@ static void netxen_tx_timeout(struct ne
  {
        struct netxen_port *port = (struct netxen_port *)netdev_priv(netdev);
  
-       SCHEDULE_WORK(&port->adapter->tx_timeout_task);
+       SCHEDULE_WORK(&port->tx_timeout_task);
  }
  
  static void netxen_tx_timeout_task(struct work_struct *work)
  {
-       struct netxen_adapter *adapter =
-               container_of(work, struct netxen_adapter, tx_timeout_task);
-       struct net_device *netdev = adapter->netdev;
+       struct netxen_port *port =
+               container_of(work, struct netxen_port, tx_timeout_task);
+       struct net_device *netdev = port->netdev;
        unsigned long flags;
  
        printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
               netxen_nic_driver_name, netdev->name);
  
-       spin_lock_irqsave(&adapter->lock, flags);
+       spin_lock_irqsave(&port->adapter->lock, flags);
        netxen_nic_close(netdev);
        netxen_nic_open(netdev);
-       spin_unlock_irqrestore(&adapter->lock, flags);
+       spin_unlock_irqrestore(&port->adapter->lock, flags);
        netdev->trans_start = jiffies;
        netif_wake_queue(netdev);
  }
@@@ -1133,6 -1133,47 +1129,6 @@@ static void netxen_nic_poll_controller(
        enable_irq(adapter->irq);
  }
  #endif
 -/*
 - * netxen_nic_ioctl ()    We provide the tcl/phanmon support through these
 - * ioctls.
 - */
 -static int
 -netxen_nic_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
 -{
 -      int err = 0;
 -      unsigned long nr_bytes = 0;
 -      struct netxen_port *port = netdev_priv(netdev);
 -      struct netxen_adapter *adapter = port->adapter;
 -      char dev_name[NETXEN_NIC_NAME_LEN];
 -
 -      DPRINTK(INFO, "doing ioctl for %s\n", netdev->name);
 -      switch (cmd) {
 -      case NETXEN_NIC_CMD:
 -              err = netxen_nic_do_ioctl(adapter, (void *)ifr->ifr_data, port);
 -              break;
 -
 -      case NETXEN_NIC_NAME:
 -              DPRINTK(INFO, "ioctl cmd for NetXen\n");
 -              if (ifr->ifr_data) {
 -                      sprintf(dev_name, "%s-%d", NETXEN_NIC_NAME_RSP,
 -                              port->portnum);
 -                      nr_bytes =
 -                          copy_to_user((char __user *)ifr->ifr_data, dev_name,
 -                                       NETXEN_NIC_NAME_LEN);
 -                      if (nr_bytes)
 -                              err = -EIO;
 -
 -              }
 -              break;
 -
 -      default:
 -              DPRINTK(INFO, "ioctl cmd %x not supported\n", cmd);
 -              err = -EOPNOTSUPP;
 -              break;
 -      }
 -
 -      return err;
 -}
  
  static struct pci_driver netxen_driver = {
        .name = netxen_nic_driver_name,