1*74a4d8c2SCharles.Forsyth /* 2*74a4d8c2SCharles.Forsyth * All the goo for PC ethernet cards. 3*74a4d8c2SCharles.Forsyth */ 4*74a4d8c2SCharles.Forsyth typedef struct Card Card; 5*74a4d8c2SCharles.Forsyth typedef struct Type Type; 6*74a4d8c2SCharles.Forsyth typedef struct Ctlr Ctlr; 7*74a4d8c2SCharles.Forsyth 8*74a4d8c2SCharles.Forsyth /* 9*74a4d8c2SCharles.Forsyth * Hardware interface. 10*74a4d8c2SCharles.Forsyth */ 11*74a4d8c2SCharles.Forsyth struct Card { 12*74a4d8c2SCharles.Forsyth ISAConf; 13*74a4d8c2SCharles.Forsyth 14*74a4d8c2SCharles.Forsyth int (*reset)(Ctlr*); 15*74a4d8c2SCharles.Forsyth void (*attach)(Ctlr*); 16*74a4d8c2SCharles.Forsyth 17*74a4d8c2SCharles.Forsyth void *(*read)(Ctlr*, void*, ulong, ulong); 18*74a4d8c2SCharles.Forsyth void *(*write)(Ctlr*, ulong, void*, ulong); 19*74a4d8c2SCharles.Forsyth 20*74a4d8c2SCharles.Forsyth void (*receive)(Ctlr*); 21*74a4d8c2SCharles.Forsyth void (*transmit)(Ctlr*); 22*74a4d8c2SCharles.Forsyth void (*intr)(Ureg*, void*); 23*74a4d8c2SCharles.Forsyth void (*overflow)(Ctlr*); 24*74a4d8c2SCharles.Forsyth 25*74a4d8c2SCharles.Forsyth uchar bit16; /* true if a 16 bit interface */ 26*74a4d8c2SCharles.Forsyth uchar ram; /* true if card has shared memory */ 27*74a4d8c2SCharles.Forsyth 28*74a4d8c2SCharles.Forsyth ulong dp8390; /* I/O address of 8390 (if any) */ 29*74a4d8c2SCharles.Forsyth ulong data; /* I/O data port if no shared memory */ 30*74a4d8c2SCharles.Forsyth uchar nxtpkt; /* software bndry */ 31*74a4d8c2SCharles.Forsyth uchar tstart; /* 8390 ring addresses */ 32*74a4d8c2SCharles.Forsyth uchar pstart; 33*74a4d8c2SCharles.Forsyth uchar pstop; 34*74a4d8c2SCharles.Forsyth 35*74a4d8c2SCharles.Forsyth uchar dummyrr; /* do dummy remote read */ 36*74a4d8c2SCharles.Forsyth }; 37*74a4d8c2SCharles.Forsyth 38*74a4d8c2SCharles.Forsyth /* 39*74a4d8c2SCharles.Forsyth * Software controller. 40*74a4d8c2SCharles.Forsyth */ 41*74a4d8c2SCharles.Forsyth struct Ctlr { 42*74a4d8c2SCharles.Forsyth Card card; /* hardware info */ 43*74a4d8c2SCharles.Forsyth int ctlrno; 44*74a4d8c2SCharles.Forsyth int present; 45*74a4d8c2SCharles.Forsyth 46*74a4d8c2SCharles.Forsyth Queue* iq; 47*74a4d8c2SCharles.Forsyth Queue* oq; 48*74a4d8c2SCharles.Forsyth 49*74a4d8c2SCharles.Forsyth int inpackets; 50*74a4d8c2SCharles.Forsyth int outpackets; 51*74a4d8c2SCharles.Forsyth int crcs; /* input crc errors */ 52*74a4d8c2SCharles.Forsyth int oerrs; /* output errors */ 53*74a4d8c2SCharles.Forsyth int frames; /* framing errors */ 54*74a4d8c2SCharles.Forsyth int overflows; /* packet overflows */ 55*74a4d8c2SCharles.Forsyth int buffs; /* buffering errors */ 56*74a4d8c2SCharles.Forsyth }; 57*74a4d8c2SCharles.Forsyth 58*74a4d8c2SCharles.Forsyth extern int sccethreset(Ctlr*); 59*74a4d8c2SCharles.Forsyth extern int etheriq(Ctlr*, Block*, int); 60