1*f43f8ee6SDavid du Colombier enum { 2*f43f8ee6SDavid du Colombier MaxEther = 2, 3*f43f8ee6SDavid du Colombier Ntypes = 8, 4*f43f8ee6SDavid du Colombier }; 5*f43f8ee6SDavid du Colombier 6*f43f8ee6SDavid du Colombier typedef struct Ether Ether; 7*f43f8ee6SDavid du Colombier struct Ether { 8*f43f8ee6SDavid du Colombier int ctlrno; 9*f43f8ee6SDavid du Colombier int port; 10*f43f8ee6SDavid du Colombier int irq; 11*f43f8ee6SDavid du Colombier int tbdf; /* type+busno+devno+funcno */ 12*f43f8ee6SDavid du Colombier 13*f43f8ee6SDavid du Colombier void *ctlr; 14*f43f8ee6SDavid du Colombier Queue* oq; 15*f43f8ee6SDavid du Colombier uchar ea[Eaddrlen]; 16*f43f8ee6SDavid du Colombier 17*f43f8ee6SDavid du Colombier long (*ifstat)(Ether*, void*, long, ulong); 18*f43f8ee6SDavid du Colombier #ifdef MULTIETHERTYPES 19*f43f8ee6SDavid du Colombier void (*attach)(Ether*); /* filled in by reset routine */ 20*f43f8ee6SDavid du Colombier void (*detach)(Ether*); 21*f43f8ee6SDavid du Colombier void (*transmit)(Ether*); 22*f43f8ee6SDavid du Colombier void (*interrupt)(Ureg*, void*); 23*f43f8ee6SDavid du Colombier long (*ctl)(Ether*, void*, long); /* custom ctl messages */ 24*f43f8ee6SDavid du Colombier void (*power)(Ether*, int); /* power on/off */ 25*f43f8ee6SDavid du Colombier void (*shutdown)(Ether*); /* shutdown hardware before reboot */ 26*f43f8ee6SDavid du Colombier #endif 27*f43f8ee6SDavid du Colombier Netif; 28*f43f8ee6SDavid du Colombier }; 29*f43f8ee6SDavid du Colombier 30*f43f8ee6SDavid du Colombier extern Block* etheriq(Ether*, Block*, int); 31*f43f8ee6SDavid du Colombier extern void addethercard(char*, int(*)(Ether*)); 32*f43f8ee6SDavid du Colombier extern ulong ethercrc(uchar*, int); 33*f43f8ee6SDavid du Colombier extern int parseether(uchar*, char*); 34*f43f8ee6SDavid du Colombier 35*f43f8ee6SDavid du Colombier #define NEXT(x, l) (((x)+1)%(l)) 36*f43f8ee6SDavid du Colombier #define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) 37