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