1*98a68993SDavid du Colombier typedef struct RingBuf { 2*98a68993SDavid du Colombier uchar owner; 3*98a68993SDavid du Colombier uchar unused; 4*98a68993SDavid du Colombier ushort len; 5*98a68993SDavid du Colombier uchar pkt[sizeof(Etherpkt)]; 6*98a68993SDavid du Colombier } RingBuf; 7*98a68993SDavid du Colombier 8*98a68993SDavid du Colombier enum { 9*98a68993SDavid du Colombier Host = 0, /* buffer owned by host */ 10*98a68993SDavid du Colombier Interface = 1, /* buffer owned by card */ 11*98a68993SDavid du Colombier 12*98a68993SDavid du Colombier Nrb = 32, /* default number of receive buffers */ 13*98a68993SDavid du Colombier Ntb = 8, /* default number of transmit buffers */ 14*98a68993SDavid du Colombier }; 15*98a68993SDavid du Colombier 16*98a68993SDavid du Colombier /* 17*98a68993SDavid du Colombier * a parsed .ini line 18*98a68993SDavid du Colombier */ 19*98a68993SDavid du Colombier #define ISAOPTLEN 32 20*98a68993SDavid du Colombier #define NISAOPT 8 21*98a68993SDavid du Colombier #define NAMELEN 28 22*98a68993SDavid du Colombier 23*98a68993SDavid du Colombier typedef struct ISAConf { 24*98a68993SDavid du Colombier char type[NAMELEN]; 25*98a68993SDavid du Colombier ulong port; 26*98a68993SDavid du Colombier // ulong irq; 27*98a68993SDavid du Colombier ulong mem; 28*98a68993SDavid du Colombier ulong size; 29*98a68993SDavid du Colombier uchar ea[6]; 30*98a68993SDavid du Colombier 31*98a68993SDavid du Colombier int nopt; 32*98a68993SDavid du Colombier char opt[NISAOPT][ISAOPTLEN]; 33*98a68993SDavid du Colombier } ISAConf; 34*98a68993SDavid du Colombier 35*98a68993SDavid du Colombier #define CONFADDR (0x2200) /* above ppc vectors */ 36*98a68993SDavid du Colombier #define BOOTLINE ((char*)CONFADDR) 37*98a68993SDavid du Colombier 38*98a68993SDavid du Colombier typedef struct Ether Ether; 39*98a68993SDavid du Colombier struct Ether { 40*98a68993SDavid du Colombier ISAConf; /* hardware info */ 41*98a68993SDavid du Colombier ushort ctlrno; 42*98a68993SDavid du Colombier ushort state; /* 0: unfound, 1: found, 2: attaching */ 43*98a68993SDavid du Colombier 44*98a68993SDavid du Colombier void (*attach)(Ether*); /* filled in by reset routine */ 45*98a68993SDavid du Colombier void (*transmit)(Ether*); 46*98a68993SDavid du Colombier int (*interrupt)(ulong bit); 47*98a68993SDavid du Colombier void (*detach)(Ether*); 48*98a68993SDavid du Colombier void *ctlr; 49*98a68993SDavid du Colombier 50*98a68993SDavid du Colombier ushort nrb; /* number of software receive buffers */ 51*98a68993SDavid du Colombier ushort ntb; /* number of software transmit buffers */ 52*98a68993SDavid du Colombier RingBuf *rb; /* software receive buffers */ 53*98a68993SDavid du Colombier RingBuf *tb; /* software transmit buffers */ 54*98a68993SDavid du Colombier 55*98a68993SDavid du Colombier ushort rh; /* first receive buffer belonging to host */ 56*98a68993SDavid du Colombier ushort ri; /* first receive buffer belonging to card */ 57*98a68993SDavid du Colombier 58*98a68993SDavid du Colombier ushort th; /* first transmit buffer belonging to host */ 59*98a68993SDavid du Colombier ushort ti; /* first transmit buffer belonging to card */ 60*98a68993SDavid du Colombier ushort tbusy; /* transmitter is busy */ 61*98a68993SDavid du Colombier ushort mbps; /* zero means link down */ 62*98a68993SDavid du Colombier }; 63*98a68993SDavid du Colombier 64*98a68993SDavid du Colombier extern void etherrloop(Ether*, Etherpkt*, long); 65*98a68993SDavid du Colombier extern void addethercard(char*, int(*)(Ether*)); 66*98a68993SDavid du Colombier 67*98a68993SDavid du Colombier #define NEXT(x, l) (((x)+1)%(l)) 68*98a68993SDavid du Colombier #define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) 69