diff -Naru linux-2.6.16_orig/drivers/net/netxen/netxen_nic_init.c 
linux-2.6.16/drivers/net/netxen/netxen_nic_init.c
--- linux-2.6.16_orig/drivers/net/netxen/netxen_nic_init.c      1969-12-31 
16:00:00.000000000 -0800
+++ linux-2.6.16/drivers/net/netxen/netxen_nic_init.c   2006-03-24 
14:13:57.000000000 -0800
@@ -0,0 +1,718 @@
+/*
+ * Copyright (C) 2003 - 2006 NetXen Inc.
+ * All rights reserved.
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *                            
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *                                   
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.
+ * 
+ * Contact Information:
+ *    [EMAIL PROTECTED]
+ * NetXen, 3965 Freedom Circle, Fourth Floor,
+ * Santa Clara, CA 95054
+ */
+/*
+ * Source file for NIC routines to initialize the Phantom Hardware
+ *
+ * $Id: netxen_nic_init.c,v 1.26.6.9 2006/03/11 12:09:37 pradeep Exp $
+ *
+ */
+#include <linux/netdevice.h>
+#include <linux/delay.h>
+#include "netxen_nic.h"
+#include "netxen_nic_hw.h"
+#include "nic_cmn.h"
+#include "netxen_nic_ioctl.h"
+
+struct crb_addr_pair { 
+        long addr;
+        long data;
+};
+
+#define MAX_CRB_XFORM 60
+static unsigned int crb_addr_xform[MAX_CRB_XFORM];
+#define ADDR_ERROR ((unsigned long ) 0xffffffff )
+
+#define crb_addr_transform(name) \
+        crb_addr_xform[NetXen_HW_PX_MAP_CRB_##name] = \
+        NetXen_HW_CRB_HUB_AGT_ADR_##name << 20
+static void
+crb_addr_transform_setup(void)
+{
+        crb_addr_transform(XDMA);
+        crb_addr_transform(TIMR);
+        crb_addr_transform(SRE);
+        crb_addr_transform(SQN3);
+        crb_addr_transform(SQN2);
+        crb_addr_transform(SQN1);
+        crb_addr_transform(SQN0);
+        crb_addr_transform(SQS3);
+        crb_addr_transform(SQS2);
+        crb_addr_transform(SQS1);
+        crb_addr_transform(SQS0);
+        crb_addr_transform(RPMX7);
+        crb_addr_transform(RPMX6);
+        crb_addr_transform(RPMX5);
+        crb_addr_transform(RPMX4);
+        crb_addr_transform(RPMX3);
+        crb_addr_transform(RPMX2);
+        crb_addr_transform(RPMX1);
+        crb_addr_transform(RPMX0);
+        crb_addr_transform(ROMUSB);
+        crb_addr_transform(SN);
+        crb_addr_transform(QMN);
+        crb_addr_transform(QMS);
+        crb_addr_transform(PGNI);
+        crb_addr_transform(PGND);
+        crb_addr_transform(PGN3);
+        crb_addr_transform(PGN2);
+        crb_addr_transform(PGN1);
+        crb_addr_transform(PGN0);
+        crb_addr_transform(PGSI);
+        crb_addr_transform(PGSD);
+        crb_addr_transform(PGS3);
+        crb_addr_transform(PGS2);
+        crb_addr_transform(PGS1);
+        crb_addr_transform(PGS0);
+        crb_addr_transform(PS);
+        crb_addr_transform(PH);
+        crb_addr_transform(NIU);
+        crb_addr_transform(I2Q);
+        crb_addr_transform(EG);
+        crb_addr_transform(MN);
+        crb_addr_transform(MS);
+        crb_addr_transform(CAS2);
+        crb_addr_transform(CAS1);
+        crb_addr_transform(CAS0);
+        crb_addr_transform(CAM);
+        crb_addr_transform(C2C1);
+        crb_addr_transform(C2C0);
+}
+
+/*
+ * decode_crb_addr(0 - utility to translate from internal Phantom CRB address
+ * to external PCI CRB address.
+ */
+unsigned long
+decode_crb_addr (unsigned long addr)
+{
+        int i;
+        unsigned long base_addr, offset, pci_base;
+
+        crb_addr_transform_setup();
+
+        pci_base = ADDR_ERROR;
+        base_addr = addr & 0xfff00000;
+        offset = addr & 0x000fffff;
+
+        for (i=0; i< MAX_CRB_XFORM; i++) {
+                if (crb_addr_xform[i] == base_addr) {
+                        pci_base = i << 20;
+                        break;
+                }
+        }
+        if (pci_base == ADDR_ERROR) {
+                return pci_base;
+        } else {
+                return (pci_base + offset);
+        }
+}
+
+static long rom_max_timeout= 10000;
+
+int
+wait_rom_done (netxen_adapter *adapter)
+{
+        long timeout=0;
+        long done=0 ;
+
+        /*DPRINTK(1,INFO,"WAIT ROM DONE \n");*/
+        /*printk(KERN_INFO "WAIT ROM DONE \n");*/
+
+        while (done == 0) {
+                done = netxen_nic_reg_read(adapter, NetXen_ROMUSB_GLB_STATUS);
+                done &=2;
+                timeout++;
+                if (timeout >= rom_max_timeout) {
+                        /* printk( "Timeout reached  waiting for rom done");*/
+                        return -1;
+                }
+        }
+        return 0;
+}
+
+int
+rom_fast_read (netxen_adapter *adapter, int addr)
+{
+        int val;
+
+        /*DPRINTK(1,INFO,"ROM FAST READ \n");*/
+        netxen_nic_reg_write(adapter, NetXen_ROMUSB_ROM_ADDRESS, addr);
+        netxen_nic_reg_write(adapter, NetXen_ROMUSB_ROM_ABYTE_CNT, 3);
+        udelay(100);   /* prevent bursting on CRB */
+        netxen_nic_reg_write(adapter, NetXen_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
+        netxen_nic_reg_write(adapter, NetXen_ROMUSB_ROM_INSTR_OPCODE, 0xb);
+        if (wait_rom_done(adapter)) {
+                /* printk("Error waiting for rom done\n"); */
+                return -1;
+        }
+        //reset abyte_cnt and dummy_byte_cnt
+        netxen_nic_reg_write(adapter, NetXen_ROMUSB_ROM_ABYTE_CNT, 0);
+        udelay(100);   /* prevent bursting on CRB */
+        netxen_nic_reg_write(adapter, NetXen_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
+
+        val = netxen_nic_reg_read(adapter, NetXen_ROMUSB_ROM_RDATA);
+        return val;
+}
+
+
+/* Error codes */
+#define FPGA_NO_ERROR 0
+#define FPGA_FILE_ERROR 1 
+#define FPGA_ILLEGAL_PARAMETER 2 
+#define FPGA_MEMORY_ERROR 3
+
+/* macros */
+#ifdef VIRTEX
+#define RESET_STATE  changeState(adapter,1,32)
+#else
+#define RESET_STATE  changeState(adapter,1,5)
+#endif
+
+#define GO_TO_RTI RESET_STATE;\
+                  changeState(adapter,0,1)
+
+/* 
+ *  TCLK = GPIO0 = 0x60
+ *  TRST = GPIO1 = 0x64
+ *  TMS  = GPIO4 = 0x70
+ *  TDO  = GPIO5 = 0xc
+ *  TDI  = GPIO8 = 0x80
+ *
+ */
+#define TCLK (NetXen_CRB_ROMUSB + 0x60)
+#define TRST (NetXen_CRB_ROMUSB + 0x64)
+#define TMS  (NetXen_CRB_ROMUSB + 0x70)
+#define TDI  (NetXen_CRB_ROMUSB + 0x80)
+#define TDO  (NetXen_CRB_ROMUSB + 0xc)
+
+#define TDO_SHIFT 5
+
+#define ASSERT_TRST   \
+        do { \
+                netxen_nic_reg_write(adapter, TRST, 2);\
+                netxen_nic_reg_write(adapter, TMS, 2); \
+                netxen_nic_reg_write(adapter, TDI, 2); \
+                netxen_nic_reg_write(adapter, TCLK, 2);\
+                netxen_nic_reg_write(adapter, TRST, 3);\
+        } while (0)
+
+#define CLOCK_IN_BIT(tdi,tms)  \
+        do { \
+                netxen_nic_reg_write(adapter, TRST, 3); \
+                netxen_nic_reg_write(adapter, TMS, 2 | (tms)); \
+                netxen_nic_reg_write(adapter, TDI, 2 | (tdi)); \
+                netxen_nic_reg_write(adapter, TCLK, 2); \
+                netxen_nic_reg_write(adapter, TCLK, 3); \
+                netxen_nic_reg_write(adapter, TCLK, 2);\
+        } while (0)
+
+#define CLOCK_OUT_BIT(bit,tms) \
+        do { \
+                netxen_nic_reg_write(adapter, TRST, 3); \
+                netxen_nic_reg_write(adapter, TMS, 2 | (tms)); \
+                netxen_nic_reg_write(adapter, TDI, 2); \
+                netxen_nic_reg_write(adapter, TCLK, 2); \
+                netxen_nic_reg_write(adapter, TCLK, 3); \
+                netxen_nic_reg_write(adapter, TCLK, 2); \
+                (bit) = (netxen_nic_reg_read(adapter, TDO) >> TDO_SHIFT) & 1; \
+        } while (0)
+
+/* boundary scan instructions */
+#define CMD_EXTEST    0x0
+#define CMD_CAPTURE   0x1
+#define CMD_IDCODE    0x2
+#define CMD_SAMPLE    0x3
+
+//Memory BIST
+#define CMD_MBSEL     0x4
+#define CMD_MBRES     0x5
+
+//Logic BIST
+#define CMD_LBSEL     0x6
+#define CMD_LBRES     0x7
+#define CMD_LBRUN    0x18 
+
+//Memory Interface
+#define CMD_MEM_WDAT  0x8
+#define CMD_MEM_ACTL  0x9
+#define CMD_MEM_READ  0xa
+
+//Memory Interface
+#define CMD_CRB_WDAT  0xb
+#define CMD_CRB_ACTL  0xc
+#define CMD_CRB_READ  0xd
+
+#define CMD_TRISTATE  0xe
+#define CMD_CLAMP     0xf
+
+#define CMD_STATUS    0x10
+#define CMD_XG_SCAN   0x11
+#define CMD_BYPASS    0x1f 
+
+#ifdef VIRTEX
+#define CMD_LENGTH_BITS 6
+#else
+#define CMD_LENGTH_BITS 5
+#endif
+
+
+/* This is the TDI bit that will be clocked out for don't care value */
+#define TDI_DONT_CARE 0
+
+#define TMS_LOW  0
+#define TMS_HIGH 1
+
+#define ID_REGISTER_SIZE_BITS 32
+
+#define EXIT_IR 1
+#define NO_EXIT_IR 0
+
+#define TAP_DELAY() 
+
+__inline__ void
+changeState(netxen_adapter *adapter,int tms,int tck) 
+{
+        int i;
+        DPRINTK(1, INFO, "changing state tms: %d tck: %d\n", tms, tck);
+        for (i = 0; i< tck; i++)
+        {
+                CLOCK_IN_BIT(TDI_DONT_CARE,tms);
+        }
+}
+
+// Assumes we are in RTI, will return to RTI
+__inline__ int 
+loadInstr(netxen_adapter *adapter,int instr,int exit_ir)
+{
+        int i,j;
+
+        DPRINTK(1, INFO, "in loaderinstr instr: %d exit_ir %d\n", instr,
+                                exit_ir);
+
+        // go to Select-IR
+        changeState(adapter,1,2);
+
+        // go to Shift-IR
+        changeState(adapter,0,2);
+
+#ifdef VIRTEX 
+        for (i = 0; i< (CMD_LENGTH_BITS * 7); i++)
+        {
+                CLOCK_IN_BIT(1,TMS_LOW);
+        }
+#endif
+        for (i = 0; i< (CMD_LENGTH_BITS-1); i++)
+        {
+                j= (instr>>i) & 1;
+                CLOCK_IN_BIT(j,TMS_LOW);
+        }
+
+        /* clock out last bit, and transition to next state */
+        j= (instr >> (CMD_LENGTH_BITS-1)) & 1;
+        // last bit, exit into Exit1-IR
+        CLOCK_IN_BIT(j,1);
+        // go to Update-IR
+        changeState(adapter,1,1);
+        // go to RTI 
+        changeState(adapter,0,1);
+        return FPGA_NO_ERROR;
+}
+
+int
+getData(netxen_adapter *adapter,u32 *data,int len, int more)
+{
+        u32 temp=0;
+        int i, bit;
+        DPRINTK(1, INFO, "doing getData data: %p len: %d more: %d\n", 
+                                data, len,more);
+        // go to Select-DR-Scan
+        changeState(adapter,1,1);
+        // go to shift-DR
+        changeState(adapter,0,1);
+#ifdef VIRTEX 
+        // dummy reads
+        for (i=0; i< 6; i++) {
+                CLOCK_OUT_BIT(bit,0);
+        }
+#endif
+        for (i=0; i< (len); i++) {
+                CLOCK_OUT_BIT(bit,0);
+                temp |= (bit << i);
+        }
+        if (!more) {
+                // go to Exit1-DR
+                changeState(adapter,1,1);
+                // go to Update DR
+                changeState(adapter,1,1);
+                // go to RTI
+                changeState(adapter,0,1);
+        }
+
+        *data = temp;
+
+        return 0;
+} 
+
+
+int
+get_status(netxen_adapter *adapter)
+{
+        int status;
+
+        DPRINTK(1, INFO, "doing get_status: %p\n", adapter);
+        // tap_inst_wr(INST_STATUS)
+        loadInstr(adapter,CMD_STATUS,EXIT_IR); 
+        getData(adapter,&status,1,0);
+        //printf("Status: 0x%02x\n",status);
+        return status;
+}
+// assumes start in RTI, will return to RTI unless more is set
+int
+getData64(netxen_adapter *adapter,u64 *data,int len, int more)
+{
+        u64 temp=0;
+        u64 i, bit;
+        DPRINTK(1, INFO, "getData64 data %p, len %d more %d\n",
+                                data, len, more);
+        // go to Select-DR-Scan
+        changeState(adapter,1,1);
+        // go to shift-DR
+        changeState(adapter,0,1);
+#ifdef VIRTEX 
+        // dummy reads
+        for (i=0; i< 6; i++) {
+                CLOCK_OUT_BIT(bit,0);
+        }
+#endif
+        for (i=0; i< (len); i++) {
+                CLOCK_OUT_BIT(bit,0);
+                temp |= (bit << i);
+        }
+
+        if (!more) {
+                // go to Exit1-DR
+                changeState(adapter,1,1);
+                // go to Update DR
+                changeState(adapter,1,1);
+                // go to RTI
+                changeState(adapter,0,1);
+        }
+
+        //temp |= (bit << (len - 1));
+        //printf("Data read: 0x%016llx\n",temp);
+        *data = temp;
+        return 0;
+} 
+
+// assumes start in shift_DR, will return to RTI unless more is set
+int
+loadData (netxen_adapter *adapter,u64 data, int len, int more)
+{
+        int i, bit;
+
+        DPRINTK(1, INFO, "loading data %llx data %d more %d\n",
+                data, len, more);
+        for (i=0; i< (len-1); i++) {
+                bit = (data >> i) & 1;
+                CLOCK_IN_BIT(bit,0);
+        }
+        if (more) {
+                bit = (data >> (len-1)) & 1;
+                CLOCK_IN_BIT(bit,0);
+        } else {
+                bit = (data>>(len - 1)) & 1;
+                // last data, go to Exit1-DR
+                CLOCK_IN_BIT(bit,1);
+                // go to Update DR
+                changeState(adapter,1,1);
+                // go to RTI
+                changeState(adapter,0,1);
+        }
+
+        return 0;
+}
+
+#define CRB_REG_EX_PC                   0x3c
+
+int pinit_from_rom(netxen_adapter *adapter, int verbose)
+{
+        int addr, val,status;
+        int n, i;
+        struct crb_addr_pair *buf;
+        unsigned long off;
+        unsigned long flags;
+
+
+        struct crb_addr_pair {
+                long addr;
+                long data;
+        };
+
+        // resetall
+        status = netxen_nic_get_board_info(adapter);
+        if (status)
+                printk ("%s: pinit_from_rom: Error getting board 
info\n",netxen_nic_driver_name);
+
+        NetXen_CRB_WRITELIT_ADAPTER(NetXen_ROMUSB_GLB_SW_RESET, 0xffffffff, 
adapter);
+
+        if (verbose) {
+                printk("P2 ROM board type: 0x%08x\n",rom_fast_read(adapter,
+                                                                    0x4008));
+                printk("P2 ROM board  num: 0x%08x\n",rom_fast_read(adapter,
+                                                                    0x400c));
+                printk("P2 ROM chip   num: 0x%08x\n",rom_fast_read(adapter,
+                                                                    0x4010));
+        }
+
+        n = rom_fast_read(adapter, 0);
+        if (n & 0x800000000ULL) {
+                n &= ~0x80000000ULL;
+                if (n  < 1024) {
+                        if (verbose) printk("%s: %d CRB init values found"
+                                                " in 
ROM.\n",netxen_nic_driver_name, n);
+                } else {
+                       printk("%s:n=0x%x Error! NetXen card flash not"
+                                        " initialized.\n", __FUNCTION__, n);
+                        return -1;
+                }
+                buf = kmalloc(n*sizeof(struct crb_addr_pair), GFP_KERNEL);
+                if (buf==NULL) {
+                        printk("%s: pinit_from_rom: Unable to malloc 
memory.\n",
+                               netxen_nic_driver_name);
+                        return -1;
+                }
+                for  (i=0; i< n; i++) {
+                        val = rom_fast_read(adapter, 8*i + 4);
+                        addr = rom_fast_read(adapter, 8*i + 8);
+                        buf[i].addr=addr;
+                        buf[i].data=val;
+
+                        if (verbose)
+                                printk("%s: PCI:     0x%08x == 0x%08x\n",
+                                       netxen_nic_driver_name,
+                                        (unsigned int)decode_crb_addr(
+                                                       (unsigned long)addr),
+                                        val);
+                }
+                for  (i=0; i< n; i++) {
+                        /*netxen_crb_writelit(decode_crb_addr((unsigned long)
+                                                                buf[i].addr) +
+                                                NetXen_PCI_CRBSPACE, 
buf[i].data);*/
+
+                        off = decode_crb_addr((unsigned long)buf[i].addr) + 
NetXen_PCI_CRBSPACE;
+                        if (ADDR_IN_WINDOW1(off))
+                        {
+                                read_lock(&adapter->adapter_lock);
+                                NetXen_NIC_PCI_WRITE_32(buf[i].data, 
CRB_NORMALIZE(adapter, off));
+                                read_unlock(&adapter->adapter_lock);
+                        }
+                        else
+                        {
+                                write_lock_irqsave(&adapter->adapter_lock, 
flags);
+                                //_netxen_nic_write_crb(adapter, off, 
buf[i].data);
+                                netxen_nic_pci_change_crbwindow(adapter, 0);
+                                off = adapter->ahw.pci_base + off;
+                                NetXen_NIC_PCI_WRITE_32(buf[i].data, (void 
*)off);
+                                netxen_nic_pci_change_crbwindow(adapter, 1);
+                                
write_unlock_irqrestore(&adapter->adapter_lock, flags);
+                        }
+
+                        msleep(1);
+                }
+                kfree(buf);
+
+                // disable_peg_cache_all
+                // unreset_net_cache
+                val = NetXen_CRB_READ_VAL_ADAPTER(NetXen_ROMUSB_GLB_SW_RESET, 
adapter);
+                NetXen_CRB_WRITELIT_ADAPTER(NetXen_ROMUSB_GLB_SW_RESET, (val & 
0xffffff0f),adapter);
+                // p2dn replyCount
+                NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_D+0xec, 
0x1e,adapter);
+                // disable_peg_cache 0
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_D+0x4c,8,adapter);
+                // disable_peg_cache 1
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_I+0x4c,8,adapter);
+
+                // peg_clr_all
+                // peg_clr 0
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_0+0x8,0,adapter);
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_0+0xc,0,adapter);
+                // peg_clr 1
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_1+0x8,0,adapter);
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_1+0xc,0,adapter);
+                // peg_clr 2
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_2+0x8,0,adapter);
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_2+0xc,0,adapter);
+                // peg_clr 3
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_3+0x8,0,adapter);
+                
NetXen_CRB_WRITELIT_ADAPTER(NetXen_CRB_PEG_NET_3+0xc,0,adapter);
+
+        }
+        return 0;
+}
+
+int load_crbinit_from_rom(netxen_adapter *adapter, int verbose)
+{
+        int addr, val,status;
+        int n, i;
+        struct crb_addr_pair *buf;
+        unsigned long off;
+        unsigned long flags;
+
+        struct crb_addr_pair {
+                long addr;
+                long data;
+        };
+
+        // resetall
+        status = netxen_nic_get_board_info(adapter);
+        if (status)
+                printk ("%s: load_crbinit_from_rom: Error getting board 
info\n",
+                       netxen_nic_driver_name);
+
+
+        if (verbose) {
+                printk("P2 ROM board type: 0x%08x\n",rom_fast_read(adapter,
+                                                                    0x4008));
+                printk("P2 ROM board  num: 0x%08x\n",rom_fast_read(adapter,
+                                                                    0x400c));
+                printk("P2 ROM chip   num: 0x%08x\n",rom_fast_read(adapter,
+                                                                    0x4010));
+        }
+        n = rom_fast_read(adapter, 0);
+        if (n & 0x800000000ULL) {
+                n &= ~0x80000000ULL;
+                if (n  < 1024) {
+                        if (verbose) 
+                                printk("%d CRB init values found in ROM.\n",
+                                                n);
+                } else {
+                       printk("%s:n=0x%x Error! NetXen card flash not"
+                                " initialized.\n", __FUNCTION__, n);
+                        return -1;
+                }
+                buf = kmalloc(n*sizeof(struct crb_addr_pair), GFP_KERNEL);
+                if (buf==NULL) {
+                        printk("load_crbinit_from_rom: Unable to malloc"
+                                " memory.\n");
+                        return -1;
+                }
+                for  (i=0; i< n; i++) {
+                        val = rom_fast_read(adapter, 8*i + 4);
+                        addr = rom_fast_read(adapter, 8*i + 8);
+                        buf[i].addr=addr;
+                        buf[i].data=val;
+
+                        if (verbose)
+                                printk("PCI:         0x%08x == 0x%08x\n",
+                                        (unsigned int)decode_crb_addr(
+                                                       (unsigned long)addr),
+                                        val);
+                }
+                for  (i=0; i< n; i++) {
+                        /*netxen_crb_writelit(decode_crb_addr((unsigned long)
+                                                                buf[i].addr) +
+                                                NetXen_PCI_CRBSPACE, 
buf[i].data);*/
+                        off = decode_crb_addr((unsigned long)buf[i].addr) + 
NetXen_PCI_CRBSPACE;
+                        if (ADDR_IN_WINDOW1(off))
+                        {
+                                read_lock(&adapter->adapter_lock);
+                                NetXen_NIC_PCI_WRITE_32(buf[i].data, 
CRB_NORMALIZE(adapter, off));
+                                read_unlock(&adapter->adapter_lock);
+                        }
+                        else
+                        {
+                                write_lock_irqsave(&adapter->adapter_lock, 
flags);
+                                netxen_nic_pci_change_crbwindow(adapter, 0);
+                                off = adapter->ahw.pci_base + off;
+                                NetXen_NIC_PCI_WRITE_32(buf[i].data, (void 
*)off);
+                                netxen_nic_pci_change_crbwindow(adapter, 1);
+                                
write_unlock_irqrestore(&adapter->adapter_lock, flags);
+                        }
+
+                        msleep(1);
+                }
+                kfree(buf);
+
+        }
+        return 0;
+}
+
+#define CACHE_DISABLE 1
+#define CACHE_ENABLE  0
+
+void
+phantom_init(struct netxen_adapter_s *adapter)
+{
+    long data = 0;
+
+    msleep(200);
+    if (netxen_crb_read_adapter(NetXen_ROMUSB_GLB_SW_RESET,&data, adapter)) {
+        printk("netxen_init_module: netxen_crb_read failed, using deaddead\n");
+        data = 0xdeaddead;
+    }
+    //netxen_crb_writelit(NetXen_ROMUSB_GLB_SW_RESET, data & 0xfffffffe);
+    read_lock(&adapter->adapter_lock);
+    NetXen_NIC_PCI_WRITE_32(data & 0xfffffffe, CRB_NORMALIZE(adapter,
+                                                NetXen_ROMUSB_GLB_SW_RESET));
+    read_unlock(&adapter->adapter_lock);
+
+    return;
+}
+
+#define FLASH_BASE               (0x8000)
+#define PHANTOM_MEM_BASE         (0x8000)
+
+void
+load_firmware(struct netxen_adapter_s *adapter)
+{
+        int  i;
+        long data, size = 0;
+        long flashaddr = FLASH_BASE, memaddr = PHANTOM_MEM_BASE;
+
+        size = (12*1024)/4;
+        //netxen_crb_writelit(NetXen_ROMUSB_GLB_CAS_RST, 1);
+        read_lock(&adapter->adapter_lock);
+        NetXen_NIC_PCI_WRITE_32(1, CRB_NORMALIZE(adapter,
+                                                NetXen_ROMUSB_GLB_CAS_RST));
+        read_unlock(&adapter->adapter_lock);
+
+        for (i = 0; i < size; i++) {
+                data = rom_fast_read(adapter, flashaddr);
+                netxen_nic_pci_mem_write(adapter, memaddr, &data, 4);
+                flashaddr += 4;
+                memaddr   += 4;
+        }
+        udelay(100);
+        //netxen_crb_writelit(NetXen_ROMUSB_GLB_CAS_RST, 0);
+        read_lock(&adapter->adapter_lock);
+        NetXen_NIC_PCI_WRITE_32(0, CRB_NORMALIZE(adapter,
+                                                NetXen_ROMUSB_GLB_CAS_RST));
+        read_unlock(&adapter->adapter_lock);
+
+        udelay(10000);
+}
--- linux-2.6.16_orig/drivers/net/Kconfig       2006-03-24 14:58:19.000000000 
-0800
+++ linux-2.6.16/drivers/net/Kconfig    2006-03-24 15:02:02.000000000 -0800
@@ -2313,6 +2313,12 @@
 
          If in doubt, say N.
 
+config NetXen_NIC
+        tristate "NetXen Gigabit Ethernet"
+        help
+          This enables the support for NetXen's 1G / 10G
+          Ethernet card.
+
 endmenu
 
 if !UML
diff -Naru linux-2.6.16_orig/drivers/net/Makefile 
linux-2.6.16/drivers/net/Makefile
--- linux-2.6.16_orig/drivers/net/Makefile      2006-03-19 21:53:29.000000000 
-0800
+++ linux-2.6.16/drivers/net/Makefile   2006-03-24 08:06:47.000000000 -0800
@@ -12,6 +12,7 @@
 obj-$(CONFIG_CHELSIO_T1) += chelsio/
 obj-$(CONFIG_BONDING) += bonding/
 obj-$(CONFIG_GIANFAR) += gianfar_driver.o
+obj-$(CONFIG_NetXen_NIC) += netxen/
 
 gianfar_driver-objs := gianfar.o \
                gianfar_ethtool.o \
diff -Naru linux-2.6.16_orig/drivers/net/netxen/Makefile 
linux-2.6.16/drivers/net/netxen/Makefile
--- linux-2.6.16_orig/drivers/net/netxen/Makefile       1969-12-31 
16:00:00.000000000 -0800
+++ linux-2.6.16/drivers/net/netxen/Makefile    2006-03-24 14:25:53.000000000 
-0800
@@ -0,0 +1,40 @@
+# Copyright (C) 2003 - 2006 NetXen Inc.
+# All rights reserved.
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#                            
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#                                   
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+# MA  02111-1307, USA.
+# 
+# The full GNU General Public License is included in this distribution
+# in the file called LICENSE.
+# 
+# Contact Information:
+#    [EMAIL PROTECTED]
+# NetXen, 3965 Freedom Circle, Fourth Floor,
+# Santa Clara, CA 95054
+#
+# Makefile for the NetXen NIC Driver
+#
+
+BUILD_PLATFORM=$(shell uname -p)
+
+CFLAGS  += -DP2
+
+ifeq ($(BUILD_PLATFORM),x86_64)
+       CFLAGS += -mcmodel=kernel -mno-red-zone -fno-unit-at-a-time 
-fno-reorder-blocks
+endif
+
+obj-$(CONFIG_NetXen_NIC) += netxen_nic.o
+
+netxen_nic-objs := netxen_nic_hw.o netxen_nic_main.o netxen_nic_ethtool.o 
niu.o netxen_nic_init.o netxen_nic_isr.o xge_mdio.o
diff -Naru linux-2.6.16_orig/drivers/net/netxen/README 
linux-2.6.16/drivers/net/netxen/README
--- linux-2.6.16_orig/drivers/net/netxen/README 1969-12-31 16:00:00.000000000 
-0800
+++ linux-2.6.16/drivers/net/netxen/README      2006-03-24 14:10:24.000000000 
-0800
@@ -0,0 +1,10 @@
+This contains the source file for the NetXen Linux driver. It is released
+under the GPL license. This is released without any warrany. See the
+GPL notice in the individual files for more details.
+
+
+To build the driver, do the following:
+
+1.  untar the archive.
+2.  cd /lib/modules/$(uname -r)/build (or wherever your kernel tree is)
+3.  make SUBDIRS=dir-path-to-netxen-driver modules

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to