1154abd99SDavid du Colombier enum 2154abd99SDavid du Colombier { 3154abd99SDavid du Colombier MaxEther = 2, 4154abd99SDavid du Colombier Ntypes = 8, 5154abd99SDavid du Colombier }; 6154abd99SDavid du Colombier 7154abd99SDavid du Colombier typedef struct Ether Ether; 8154abd99SDavid du Colombier struct Ether { 9154abd99SDavid du Colombier RWlock; /* TO DO */ 10154abd99SDavid du Colombier ISAConf; /* hardware info */ 11154abd99SDavid du Colombier int ctlrno; 12154abd99SDavid du Colombier int minmtu; 13154abd99SDavid du Colombier int maxmtu; 14154abd99SDavid du Colombier uchar ea[Eaddrlen]; 15154abd99SDavid du Colombier void *address; 16154abd99SDavid du Colombier int tbusy; 17154abd99SDavid du Colombier 18154abd99SDavid du Colombier void (*attach)(Ether*); /* filled in by reset routine */ 19154abd99SDavid du Colombier void (*closed)(Ether*); 20154abd99SDavid du Colombier void (*detach)(Ether*); 21154abd99SDavid du Colombier void (*transmit)(Ether*); 22154abd99SDavid du Colombier void (*interrupt)(Ureg*, void*); 23154abd99SDavid du Colombier long (*ifstat)(Ether*, void*, long, ulong); 24154abd99SDavid du Colombier long (*ctl)(Ether*, void*, long); /* custom ctl messages */ 25154abd99SDavid du Colombier void (*power)(Ether*, int); /* power on/off */ 26154abd99SDavid du Colombier void (*shutdown)(Ether*); /* shutdown hardware before reboot */ 27154abd99SDavid du Colombier void *ctlr; 28154abd99SDavid du Colombier int pcmslot; /* PCMCIA */ 29154abd99SDavid du Colombier int fullduplex; /* non-zero if full duplex */ 30*c6569576SDavid du Colombier int linkchg; /* link status changed? */ 31*c6569576SDavid du Colombier uvlong starttime; /* last activity time */ 32154abd99SDavid du Colombier 33154abd99SDavid du Colombier Queue* oq; 34154abd99SDavid du Colombier 35154abd99SDavid du Colombier /* statistics */ 36154abd99SDavid du Colombier ulong interrupts; 37154abd99SDavid du Colombier ulong dmarxintr; 38154abd99SDavid du Colombier ulong dmatxintr; 39154abd99SDavid du Colombier ulong promisc; 40154abd99SDavid du Colombier ulong pktsdropped; 41154abd99SDavid du Colombier ulong pktsmisaligned; 42154abd99SDavid du Colombier ulong resets; /* after initialisation */ 43154abd99SDavid du Colombier ulong bcasts; /* broadcast pkts rcv'd */ 44154abd99SDavid du Colombier ulong mcasts; /* multicast pkts rcv'd */ 45154abd99SDavid du Colombier 46154abd99SDavid du Colombier Netif; 47154abd99SDavid du Colombier }; 48154abd99SDavid du Colombier 49154abd99SDavid du Colombier extern Block* etheriq(Ether*, Block*, int); 50154abd99SDavid du Colombier extern void addethercard(char*, int(*)(Ether*)); 51154abd99SDavid du Colombier extern ulong ethercrc(uchar*, int); 52154abd99SDavid du Colombier extern int parseether(uchar*, char*); 53154abd99SDavid du Colombier 54154abd99SDavid du Colombier #define NEXT(x, l) (((x)+1)%(l)) 55154abd99SDavid du Colombier #define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) 56