enum {
MaxEther = 4,
Ntypes = 8,
};
typedef struct Ether Ether;
struct Ether {
ISAConf; /* hardware info */
void (*attach)(Ether*); /* filled in by reset routine */
long (*write)(Ether*, void*, long);
void (*interrupt)(Ether*);
void *private;
Etherpkt tpkt; /* transmit buffer */
Etherpkt rpkt; /* receive buffer */
QLock tlock; /* lock for grabbing transmitter queue */
Rendez tr; /* wait here for free xmit buffer */
long tlen; /* length of data in tb for txfifo management */
Netif;
};
typedef struct {
uchar bit16; /* true if a 16 bit interface */
uchar ram; /* true if card has shared memory */
ulong dp8390; /* I/O address of 8390 */
ulong data; /* I/O data port if no shared memory */
uchar nxtpkt; /* receive: software bndry */
uchar busy; /* transmit: busy */
uchar tstart; /* 8390 ring addresses */
uchar pstart;
uchar pstop;
} Dp8390;
#define Dp8390BufSz 256
extern int dp8390reset(Ether*);
extern void dp8390getea(Ether*);
extern void dp8390setea(Ether*);
#define NEXT(x, l) (((x)+1)%(l))
#define HOWMANY(x, y) (((x)+((y)-1))/(y))
#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y))
extern void addethercard(char*, int(*)(Ether*));