17dd7cddfSDavid du Colombier enum { 2*0b712f6bSDavid du Colombier MaxEther = 48, 37dd7cddfSDavid du Colombier Ntypes = 8, 47dd7cddfSDavid du Colombier }; 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du Colombier typedef struct Ether Ether; 77dd7cddfSDavid du Colombier struct Ether { 87dd7cddfSDavid du Colombier ISAConf; /* hardware info */ 97dd7cddfSDavid du Colombier 107dd7cddfSDavid du Colombier int ctlrno; 117dd7cddfSDavid du Colombier int tbdf; /* type+busno+devno+funcno */ 127dd7cddfSDavid du Colombier uchar ea[Eaddrlen]; 137dd7cddfSDavid du Colombier 147dd7cddfSDavid du Colombier void (*attach)(Ether*); /* filled in by reset routine */ 153ff48bf5SDavid du Colombier void (*detach)(Ether*); 167dd7cddfSDavid du Colombier void (*transmit)(Ether*); 177dd7cddfSDavid du Colombier void (*interrupt)(Ureg*, void*); 187dd7cddfSDavid du Colombier long (*ifstat)(Ether*, void*, long, ulong); 1959cc4ca5SDavid du Colombier long (*ctl)(Ether*, void*, long); /* custom ctl messages */ 203ff48bf5SDavid du Colombier void (*power)(Ether*, int); /* power on/off */ 219a747e4fSDavid du Colombier void (*shutdown)(Ether*); /* shutdown hardware before reboot */ 227dd7cddfSDavid du Colombier void *ctlr; 237dd7cddfSDavid du Colombier 247dd7cddfSDavid du Colombier Queue* oq; 257dd7cddfSDavid du Colombier 267dd7cddfSDavid du Colombier Netif; 277dd7cddfSDavid du Colombier }; 287dd7cddfSDavid du Colombier 297dd7cddfSDavid du Colombier extern Block* etheriq(Ether*, Block*, int); 307dd7cddfSDavid du Colombier extern void addethercard(char*, int(*)(Ether*)); 317dd7cddfSDavid du Colombier extern ulong ethercrc(uchar*, int); 329a747e4fSDavid du Colombier extern int parseether(uchar*, char*); 337dd7cddfSDavid du Colombier 347dd7cddfSDavid du Colombier #define NEXT(x, l) (((x)+1)%(l)) 357dd7cddfSDavid du Colombier #define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) 36