"Der Herr Hofr.at" wrote:
> is your code with the ne2000 available on the net ??
> I would like to get two boxes connected via a realtime link
> on a minimum system.

I haven't put it on the web ...
but you I give you in attached file the source.
This source has been inspired of the linux-kernel source.
!! Carefull , I don't support reception of message with
size > 1 ring_page !! But it is a real-time driver,
which means very short message.

Target:

- ISA NE2000 Compatible only.
- SMP dual-PIII.
- RTAI-0.7 + kernel 2.2.12

Todo with this file :

- include from rt-module file ( with init_module , cleanup_module )
- initialize the 'dev' struct with the io and the irq of the card
(no auto find .....)
- initialize the 'ne2000_get' semaphore which is pulled up when a valid
packet
is arrived.

- call 'FindNE2000()' to initialise dev struct
- call 'NE2000Start()' to start listening
   (or reset receive ring if blocked du to large packet)
- call 'ne2000_sender' to send packet in 'ne2000_buffer_send' struct
- pullup of 'ne2000_get' SEM when a packet is ready in
'ne2000_buffer_get'


Good Luck.

PS: This source is for RTAI ... but little changes needed for RTL.

--
Kumsta Christophe
<[EMAIL PROTECTED]>
Real-Time System developper
RT-Linux/RTAI ( Use the Source Luck !)

#define TX_2X_PAGES 12
#define TX_PAGES    TX_2X_PAGES

/* Some generic ethernet register configurations. */
#define E8390_TX_IRQ_MASK       0xa     /* For register EN0_ISR */
#define E8390_RX_IRQ_MASK       0x5
#define E8390_RXCONFIG          0x06
//#define E8390_RXCONFIG                0x4     /* EN0_RXCR: broadcasts, no 
multicast,errors */
#define E8390_RXOFF             0x20    /* EN0_RXCR: Accept no packets */
#define E8390_TXCONFIG          0x00    /* EN0_TXCR: Normal transmit mode */
#define E8390_TXOFF             0x02    /* EN0_TXCR: Transmitter off */

/*  Register accessed at EN_CMD, the 8390 base addr.  */
#define E8390_STOP      0x01    /* Stop and reset the chip */
#define E8390_START     0x02    /* Start the chip, clear reset */
#define E8390_TRANS     0x04    /* Transmit a frame */
#define E8390_RREAD     0x08    /* Remote read */
#define E8390_RWRITE    0x10    /* Remote write  */
#define E8390_NODMA     0x20    /* Remote DMA */
#define E8390_PAGE0     0x00    /* Select page chip registers */
#define E8390_PAGE1     0x40    /* using the two high-order bits */
#define E8390_PAGE2     0x80    /* Page 3 is invalid. */
 
#define E8390_CMD       0x00  /* The command register (for all pages) */

/* Page 0 register offsets. */
#define EN0_CLDALO      0x01    /* Low byte of current local dma addr  RD */
#define EN0_STARTPG     0x01    /* Starting page of ring bfr WR */
#define EN0_CLDAHI      0x02    /* High byte of current local dma addr  RD */
#define EN0_STOPPG      0x02    /* Ending page +1 of ring bfr WR */
#define EN0_BOUNDARY    0x03    /* Boundary page of ring bfr RD WR */
#define EN0_TSR         0x04    /* Transmit status reg RD */
#define EN0_TPSR        0x04    /* Transmit starting page WR */
#define EN0_NCR         0x05    /* Number of collision reg RD */
#define EN0_TCNTLO      0x05    /* Low  byte of tx byte count WR */
#define EN0_FIFO        0x06    /* FIFO RD */
#define EN0_TCNTHI      0x06    /* High byte of tx byte count WR */
#define EN0_ISR         0x07    /* Interrupt status reg RD WR */
#define EN0_CRDALO      0x08    /* low byte of current remote dma address RD */
#define EN0_RSARLO      0x08    /* Remote start address reg 0 */
#define EN0_CRDAHI      0x09    /* high byte, current remote dma address RD */
#define EN0_RSARHI      0x09    /* Remote start address reg 1 */
#define EN0_RCNTLO      0x0a    /* Remote byte count reg WR */
#define EN0_RCNTHI      0x0b    /* Remote byte count reg WR */
#define EN0_RSR         0x0c    /* rx status reg RD */
#define EN0_RXCR        0x0c    /* RX configuration reg WR */
#define EN0_TXCR        0x0d    /* TX configuration reg WR */
#define EN0_COUNTER0    0x0d    /* Rcv alignment error counter RD */
#define EN0_DCFG        0x0e    /* Data configuration reg WR */
#define EN0_COUNTER1    0x0e    /* Rcv CRC error counter RD */
#define EN0_IMR         0x0f    /* Interrupt mask reg WR */
#define EN0_COUNTER2    0x0f    /* Rcv missed frame error counter RD */

/* Bits in EN0_ISR - Interrupt status register */
#define ENISR_RX        0x01    /* Receiver, no error */
#define ENISR_TX        0x02    /* Transmitter, no error */
#define ENISR_RX_ERR    0x04    /* Receiver, with error */
#define ENISR_TX_ERR    0x08    /* Transmitter, with error */
#define ENISR_OVER      0x10    /* Receiver overwrote the ring */
#define ENISR_COUNTERS  0x20    /* Counters need emptying */
#define ENISR_RDC       0x40    /* remote dma complete */
#define ENISR_RESET     0x80    /* Reset completed */
#define ENISR_ALL       0x3f    /* Interrupts we will enable */

/* Bits in EN0_DCFG - Data config register */
#define ENDCFG_WTS      0x01    /* word transfer mode selection */

/* Page 1 register offsets. */
#define EN1_PHYS           0x01 /* This board's physical enet addr RD WR */
#define EN1_PHYS_SHIFT(i)  i+1  /* Get and set mac address */
#define EN1_CURPAG         0x07 /* Current memory page RD WR */
#define EN1_MULT           0x08 /* Multicast filter mask array (8 bytes) RD WR */
#define EN1_MULT_SHIFT(i)  8+i  /* Get and set multicast filter */

#define NE_BASE      (dev.io)
#define NE_CMD       0x00
#define NE_DATAPORT  0x10
#define NE_RESET     0x1f // read to reset / write to clear
#define NE_IO_EXTENT 0x20

#define NE1SM_START_PG 0x20 // first page of TX buffer
#define NE1SM_STOP_PG  0x40 // last page+1 of RX ring
#define NESM_START_PG  0x40
#define NESM_STOP_PG   0x80

typedef struct
{
  unsigned char dst[6] ;   // Hardware addr of dest ethernet card
  unsigned char src[6] ;   // Hardware addr of source ethernet card
  unsigned char proto[2] ; // neither TCP nor UDP ... just own (0x9000)
  unsigned char taille ;   // size of data
  unsigned char data[1000] ;
} Tne2000_mess ;

volatile Tne2000_mess ne2000_buffer_get ;
volatile Tne2000_mess ne2000_buffer_send ;

typedef struct
{
  int           io  ;
  int           irq ;
  int           wordsize ;
  unsigned char tx_start_page ;
  unsigned char rx_start_page ;
  unsigned char start_page ;
  unsigned char stop_page ;
  unsigned char current_page ;
  short         tx1,tx2 ;
  unsigned char SA_prom[32] ;
  unsigned char HWaddr[6] ;
  char         *buffread ;
  char         *buffwrite ;
} TNE2000 ;

/* The 8390 specific per-packet-header format. */
typedef struct {
  unsigned char status; /* status */
  unsigned char next;   /* pointer to next packet. */
  unsigned short count; /* header + packet length in bytes */
} THeader ;

static TNE2000 NE2000dev ;

volatile static int irqtest = 0 ;
volatile static int transmit = 0 ;

static SEM ne2000_get ;

/******************************************************/
/*                                                    */
/*       Gestion des ERREURS de message               */
/*                                                    */
/*                                                    */
/******************************************************/
#define INT_PACKET_RECEIVED     0x01
#define INT_PACKET_TRANSMITTED  0x02
#define INT_RECEIVE_ERROR       0x04
#define INT_TRANSMIT_ERROR      0x08
#define INT_OVERWRITE_WARNING   0x10
#define INT_COUNTER_OVERFLOW    0x20
#define INT_REMOTE_DMA_COMPLETE 0x40
#define INT_RESET_STATUS        0x80

/* Bits in received packet status byte and EN0_RSR*/
#define ENRSR_RXOK      0x01    /* Received a good packet */
#define ENRSR_CRC       0x02    /* CRC error */
#define ENRSR_FAE       0x04    /* frame alignment error */
#define ENRSR_FO        0x08    /* FIFO overrun */
#define ENRSR_MPA       0x10    /* missed pkt */
#define ENRSR_PHY       0x20    /* physical/multicast address */
#define ENRSR_DIS       0x40    /* receiver disable. set in monitor mode */
#define ENRSR_DEF       0x80    /* deferring */

/* Transmitted packet status, EN0_TSR. */
#define ENTSR_PTX 0x01  /* Packet transmitted without error */
#define ENTSR_ND  0x02  /* The transmit wasn't deferred. */
#define ENTSR_COL 0x04  /* The transmit collided at least once. */
#define ENTSR_ABT 0x08  /* The transmit collided 16 times, and was deferred. */
#define ENTSR_CRS 0x10  /* The carrier sense was lost. */
#define ENTSR_FU  0x20  /* A "FIFO underrun" occurred during transmit. */
#define ENTSR_CDH 0x40  /* The collision detect "heartbeat" signal was lost. */
#define ENTSR_OWC 0x80  /* There was an out-of-window collision. */

/******************************************************/
/*                                                    */
/*       Interrupt Handling                           */
/*                                                    */
/*                                                    */
/******************************************************/

//#define debugirq(x) printk("[NE2000 :0x%3.3x:#%2.2d] <IRQ_HANDLER> -> 
%s.\n",dev.io,dev.irq,x)
#define debugirq(x)

static void IrqHandlerNE2000()
{
  unsigned char which , test ;
  //printk("NE2000 :[CPU#%d] IRQ BEGIN\n",hard_cpu_id()) ;
  outb_p(0x00,NE_BASE+EN0_IMR) ; // mask all
  rt_disable_irq(dev.irq) ;
  which = inb_p(NE_BASE+EN0_ISR) ;
  irqtest = which ;
  while(which)
    {
      if(which & INT_PACKET_RECEIVED)
        {
          unsigned char frame, frame_next ;
          THeader header ;
          which ^= INT_PACKET_RECEIVED ;
          /* Get the rx page (incoming packet pointer). */
          outb_p(E8390_NODMA+E8390_PAGE1, NE_BASE + E8390_CMD);
          frame_next = inb_p(NE_BASE + EN1_CURPAG);
          outb_p(E8390_NODMA+E8390_PAGE0, NE_BASE + E8390_CMD);
          frame = dev.current_page ;
/*        printk("NE2000 : RECEIVING FRAME : %i\n",dev.io,dev.irq,frame) ; */
          // get HEADER of 8390
          outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, NE_BASE+ NE_CMD);
          outb_p(sizeof(header)                     , NE_BASE + EN0_RCNTLO);
          outb_p(0                                  , NE_BASE + EN0_RCNTHI);
          outb_p(0                                  , NE_BASE + EN0_RSARLO); /* On 
page boundary */
          outb_p(frame                              , NE_BASE + EN0_RSARHI);
          outb_p(E8390_RREAD+E8390_START            , NE_BASE + NE_CMD);          
          insb(NE_BASE + NE_DATAPORT, &header, sizeof(header));
          outb_p(ENISR_RDC, NE_BASE + EN0_ISR); /* Ack intr. */
          
          // get datas    
          outb_p(E8390_NODMA+E8390_PAGE0+E8390_START , NE_BASE + NE_CMD);
          outb_p((header.count-sizeof(header)) & 0xff, NE_BASE + EN0_RCNTLO);
          outb_p((header.count-sizeof(header)) >> 8  , NE_BASE + EN0_RCNTHI);
          outb_p(((frame<<8)+sizeof(header)) & 0xff  , NE_BASE + EN0_RSARLO);
          outb_p(((frame<<8)+sizeof(header)) >> 8    , NE_BASE + EN0_RSARHI);
          outb_p(E8390_RREAD+E8390_START             , NE_BASE + NE_CMD);         
          insb(NE_BASE + NE_DATAPORT, dev.buffread, header.count);
          outb_p(ENISR_RDC, NE_BASE + EN0_ISR);
          
          NE2000dev.current_page = frame_next ;
          outb_p(frame,NE_BASE+EN0_BOUNDARY) ;
          
          outb_p(E8390_RXCONFIG,NE_BASE+EN0_RXCR) ;
/*        printk("NE2000 : GET TERMINATED.\n",dev.io,dev.irq) ; */
          if((ne2000_buffer_get.proto[0]==0x90)&&(ne2000_buffer_get.proto[1]==0x00))
            rt_sem_signal(&ne2000_get) ;
          else
            printk("NE2000 : ####### BAD PROTOCOL DETECTED !! ###(%2.2x%2.2x)###\n",
                   ne2000_buffer_get.proto[0],ne2000_buffer_get.proto[1]) ;
        }
      if(which & INT_RECEIVE_ERROR)
        {
          which ^= INT_RECEIVE_ERROR ;
          test = inb_p(NE_BASE+EN0_RSR) ;
          if(test & ENRSR_RXOK)
            printk("NE2000 : RECEIVE STATUS : RECEIVE_OK\n") ;
          if(test & ENRSR_CRC)
            printk("NE2000 : RECEIVE STATUS : CRC_ERROR\n") ;
          if(test & ENRSR_FAE)
            printk("NE2000 : RECEIVE STATUS : FRAME_ALIGN_ERROR\n") ;
          if(test & ENRSR_FO)
            printk("NE2000 : RECEIVE STATUS : FIFO_OVERRUN\n") ;
          if(test & ENRSR_MPA)
            printk("NE2000 : RECEIVE STATUS : MISSED_PACKET\n") ;
          if(test & ENRSR_PHY)
            printk("NE2000 : RECEIVE STATUS : PHYS/MULTI_ADDRESS\n") ;
          if(test & ENRSR_DIS)
            printk("NE2000 : RECEIVE STATUS : RECEIVER_DISABLED\n") ;
          if(test & ENRSR_DEF)
            printk("NE2000 : RECEIVE STATUS : DEFERRING\n") ;
          outb_p(E8390_RXCONFIG,NE_BASE+EN0_RXCR) ;
        }
      if(which & INT_PACKET_TRANSMITTED)
        {
          which ^= INT_PACKET_TRANSMITTED ;
          //printk("NE2000 : IRQ_TRANSMIT_OK\n") ;
          transmit = 0 ;
        }
      if(which & INT_TRANSMIT_ERROR)
        {
          which ^= INT_TRANSMIT_ERROR ;
          test = inb_p(NE_BASE+EN0_TSR) ;
          if(test & ENTSR_PTX)
            printk("NE2000 : TRANSMIT STATUS : TRANSMIT_OK\n") ;
          if(test & ENTSR_ND)
            printk("NE2000 : TRANSMIT STATUS : NOT_DEFERRED\n") ;
          if(test & ENTSR_COL)
            printk("NE2000 : TRANSMIT STATUS : COLLISION\n") ;
          if(test & ENTSR_ABT)
            printk("NE2000 : TRANSMIT STATUS : COLLISION>16\n") ;
          if(test & ENTSR_CRS)
            printk("NE2000 : TRANSMIT STATUS : CARRIER_LOST\n") ;
          if(test & ENTSR_FU)
            printk("NE2000 : TRANSMIT STATUS : FIFO_UNDERRUN\n") ;
          if(test & ENTSR_CDH)
            printk("NE2000 : TRANSMIT STATUS : HEARTBEAT_LOST\n") ;
          if(test & ENTSR_OWC)
            printk("NE2000 : TRANSMIT STATUS : OUT_OF_WINDOW\n") ;
          outb_p(E8390_TXCONFIG,NE_BASE+EN0_TXCR) ;
          transmit = 0 ;
        }
      if(which & INT_OVERWRITE_WARNING)
        {
          which ^= INT_OVERWRITE_WARNING ;
          debugirq("INT_OVERWRITE_WARNING") ;
        }
      if(which & INT_COUNTER_OVERFLOW)
        {
          which ^= INT_COUNTER_OVERFLOW ;
          debugirq("INT_COUNTER_OVERFLOW") ;
        }
      if(which & INT_REMOTE_DMA_COMPLETE)
        {
          which ^= INT_REMOTE_DMA_COMPLETE ;
          debugirq("INT_REMOTE_DMA_COMPLETE") ;
        } 
      if(which & INT_RESET_STATUS)
        {
          which ^= INT_RESET_STATUS ;
          debugirq("INT_RESET_STATUS") ;
        }
    }
  outb_p(0xFF,NE_BASE+EN0_ISR) ; // acknowledge
  rt_enable_irq(dev.irq) ;
  outb_p(ENISR_ALL,NE_BASE+EN0_IMR) ;
/*   printk("<<<<IRQ END>>>>\n") ; */
  
}

/******************************************************/
/*                                                    */
/*       Send function                                */
/*                                                    */
/*                                                    */
/******************************************************/

void ne2000_sender(void)
{
  int mess_count ;

  if(transmit==0)
    {
      transmit = 1 ;
      
      mess_count = ne2000_buffer_send.taille + 15 ;
          
      outb_p(E8390_PAGE0+E8390_START+E8390_NODMA,NE_BASE+NE_CMD) ;
      outb_p(ENISR_RDC,NE_BASE+EN0_ISR) ;
          
      outb_p(mess_count & 0xFF,NE_BASE+EN0_RCNTLO) ;
      outb_p(mess_count >> 8  ,NE_BASE+EN0_RCNTHI) ;
      outb_p(0x00             ,NE_BASE+EN0_RSARLO) ;
      outb_p(dev.start_page   ,NE_BASE+EN0_RSARHI) ;
      
      outb_p(E8390_RWRITE+E8390_START,NE_BASE+NE_CMD) ;
      
      outsb(NE_BASE+NE_DATAPORT,dev.buffwrite,mess_count) ;
          
      outb_p(ENISR_RDC,NE_BASE+EN0_ISR) ;
      
      /* paquet sending ... */
      
      outb_p(E8390_NODMA+E8390_PAGE0, NE_BASE+E8390_CMD); 
      outb_p(mess_count & 0xff, NE_BASE + EN0_TCNTLO);
      outb_p(mess_count >> 8, NE_BASE + EN0_TCNTHI);
      outb_p(dev.start_page, NE_BASE + EN0_TPSR);
      outb_p(E8390_NODMA+E8390_TRANS+E8390_START, NE_BASE+E8390_CMD);
      
    }
}

/******************************************************/
/*                                                    */
/*       Initialisation                               */
/*                                                    */
/*                                                    */
/******************************************************/


static void NE2000Init()
{
  int i ;
  // initialisation de la carte reseau ...
  outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP,NE_BASE+E8390_CMD) ;
  outb_p(0x48,NE_BASE+EN0_DCFG) ;
  // clear remote byte count regiters
  outb_p(0x00,NE_BASE+EN0_RCNTLO) ;
  outb_p(0x00,NE_BASE+EN0_RCNTHI) ;
  // set monitor and loopback mode ... indispensable !
  outb_p(E8390_RXOFF,NE_BASE+EN0_RXCR) ;
  outb_p(E8390_TXOFF,NE_BASE+EN0_TXCR) ;
  // set transmit page and receive ring
  outb_p(dev.tx_start_page,NE_BASE+EN0_TPSR) ;
  dev.tx1 = dev.tx2 = 0 ;
  outb_p(dev.rx_start_page,NE_BASE+EN0_STARTPG) ;
  outb_p(dev.stop_page-1,NE_BASE+EN0_BOUNDARY) ;
  dev.current_page = dev.rx_start_page ;
  outb_p(dev.stop_page,NE_BASE+EN0_STOPPG) ;
  // clear pending irq and mask
  outb_p(0xFF,NE_BASE+EN0_ISR) ;
  outb_p(0x00,NE_BASE+EN0_IMR) ;
  // copy of HWaddr
  outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP,NE_BASE+E8390_CMD) ;
  for(i=0;i<6;i++)
    {
      ne2000_buffer_send.src[i] = dev.HWaddr[i] ;
      outb_p(dev.HWaddr[i],NE_BASE+EN1_PHYS_SHIFT(i)) ;
      if(inb_p(NE_BASE+EN1_PHYS_SHIFT(i)) != dev.HWaddr[i])
        printk("NE2000 : 0x%3.3x:#%2.2d -> HWaddr read/write mismap 
%d\n",dev.io,dev.irq,i) ;
    }
  
  ne2000_buffer_send.proto[0] = 0x90 ;
  ne2000_buffer_send.proto[1] = 0x00 ;

  printk("NE2000 : HWaddr [") ;
  for(i=0;i<6;i++)
    printk("%2.2x",inb_p(NE_BASE+EN1_PHYS_SHIFT(i))) ;
  printk("]\n") ;

  outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP,NE_BASE+E8390_CMD) ;
  outb_p(dev.rx_start_page,NE_BASE+EN1_CURPAG) ;
  outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP,NE_BASE+E8390_CMD) ;
  printk("NE2000 : Initialisation done.\n") ;
}

/******************************************************/
/*                                                    */
/*       Starting  ...                                */
/*                                                    */
/*                                                    */
/******************************************************/

static void NE2000Start()
{
  outb_p(E8390_NODMA+E8390_PAGE0+E8390_START,NE_BASE+E8390_CMD) ;
  outb_p(0xFF,NE_BASE+EN0_ISR) ;
  outb_p(E8390_TXCONFIG,NE_BASE+EN0_TXCR) ;
  outb_p(E8390_RXCONFIG,NE_BASE+EN0_RXCR) ;
  outb_p(ENISR_ALL,NE_BASE+EN0_IMR) ;
  printk("NE2000 : Startup done.\n") ;
}

/******************************************************/
/*                                                    */
/*     network card finding  ...                      */
/*                                                    */
/*                                                    */
/******************************************************/


static int FindNE2000()
{
  int regd,reg0 ;
  dev.wordsize = 2 ;

  // preliminary check ...

  if(inb_p(dev.io)==0xFF)
    return -1 ;
  reg0 = inb_p(dev.io) ;
  outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP,dev.io+E8390_CMD) ;
  regd = inb_p(dev.io+0x0d) ;
  outb_p(0xff,dev.io+0x0d) ;
  outb_p(E8390_NODMA+E8390_PAGE0,dev.io+E8390_CMD) ;
  inb_p(dev.io+EN0_COUNTER0) ; // nettoyage du compteur en faisant une lecture ...
  if(inb_p(dev.io+EN0_COUNTER0)!=0)
    {
      outb_p(reg0,dev.io) ;
      outb_p(regd,dev.io+0x0d) ;
      return -1 ;
    }
  // check the SA PROM ...
  {
    int i ;
    struct {unsigned char value, offset; }
    program_seq[]=
    {
      {E8390_NODMA+E8390_PAGE0+E8390_STOP,E8390_CMD },
      {0x48                              ,EN0_DCFG  },
      {0x00                              ,EN0_RCNTLO},
      {0x00                              ,EN0_RCNTHI},
      {0x00                              ,EN0_IMR   },
      {0xFF                              ,EN0_ISR   },
      {E8390_RXOFF                       ,EN0_RXCR  },
      {E8390_TXOFF                       ,EN0_TXCR  },
      {32                                ,EN0_RCNTLO},
      {0x00                              ,EN0_RCNTHI},
      {0x00                              ,EN0_RSARLO},
      {0x00                              ,EN0_RSARHI},
      {E8390_RREAD+E8390_START           ,E8390_CMD },
    } ;

    for(i=0;i<sizeof(program_seq)/sizeof(program_seq[0]);i++)
      outb_p(program_seq[i].value,dev.io+program_seq[i].offset) ;

    for(i=0;i<32;i+=2)
      {
        dev.SA_prom[i]   = inb(dev.io+NE_DATAPORT) ;
        dev.SA_prom[i+1] = inb(dev.io+NE_DATAPORT) ; // lecture en word ...
        if(dev.SA_prom[i] != dev.SA_prom[i+1])
          dev.wordsize = 1 ;
      }

    if(dev.wordsize==2)
      {
        for(i=0;i<16;i++)
          dev.SA_prom[i] = dev.SA_prom[i+i] ;
        // set to word mode ...
        outb_p(0x49,dev.io+EN0_DCFG) ;
        dev.start_page = NESM_START_PG ;
        dev.stop_page  = NESM_STOP_PG ;
      }
    else
      {
        // set to byte mode ...
        dev.start_page = NE1SM_START_PG ;
        dev.stop_page  = NE1SM_STOP_PG ;
      }
    
    
    if((dev.SA_prom[14]==0x57)&&(dev.SA_prom[15]==0x57))
      printk("NE2000 : 0x%3.3x:#%2.2d -> Signature of NE2000 compatible 
found.\n",dev.io,dev.irq) ;
    if((dev.SA_prom[0]==0x00)&&(dev.SA_prom[1]==0x00)&&(dev.SA_prom[2]==0x1d))
      printk("NE2000 : 0x%3.3x:#%2.2d -> Signature of CTRON found.\n",dev.io,dev.irq) ;
    if((dev.SA_prom[14]==0x49)&&(dev.SA_prom[15]==0x00))
      printk("NE2000 : 0x%3.3x:#%2.2d -> Signature of COPAN found.\n",dev.io,dev.irq) ;

    rt_reset_irq_to_sym_mode(dev.irq) ;
/*     rt_assign_irq_to_cpu (dev.irq,0) ; */
    if(rt_request_global_irq(dev.irq,&IrqHandlerNE2000)<0)
      {
        printk("NE2000 : 0x%3.3x:#%2.2d -> Attaching Irq Handler Failed 
!\n",dev.io,dev.irq) ;
        return -1 ;
      }
    rt_enable_irq(dev.irq) ;
    
    if(machine==0)
      for(i=0;i<6;i++)
        dev.HWaddr[i] = dev.SA_prom[i] ;
    else
      {
        dev.HWaddr[0] = 0x63 ;
        dev.HWaddr[1] = 0x63 ;
        dev.HWaddr[2] = 0x27 ;
        dev.HWaddr[3] = 0x70 ;
        dev.HWaddr[4] = (unsigned char)(machine>>8) ;
        dev.HWaddr[5] = (unsigned char)(machine) ;
      }

    dev.tx_start_page = dev.start_page ;
    dev.rx_start_page = dev.start_page+TX_PAGES ;

    dev.buffread = (unsigned char *)&ne2000_buffer_get ;
    dev.buffwrite = (unsigned char *)&ne2000_buffer_send ;

    return 0 ;
  }
}

Reply via email to