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