typedef struct Ether Ether;
struct Ether {
       ISAConf;                        /* hardware info */

       int     ctlrno;
       char    iname[NAMELEN];
       char    oname[NAMELEN];
       int     tbdf;                   /* type+busno+devno+funcno */
       int     mbps;                   /* Mbps */
       uchar   ea[Easize];

       void    (*attach)(Ether*);      /* filled in by reset routine */
       void    (*transmit)(Ether*);
       void    (*interrupt)(Ureg*, void*);
       void    *ctlr;

       Ifc     ifc;

       Lock    rqlock;
       Msgbuf* rqhead;
       Msgbuf* rqtail;
       Rendez  rqr;

       Lock    tqlock;
       Msgbuf* tqhead;
       Msgbuf* tqtail;
       Rendez  tqr;
};

#define NEXT(x, l)      (((x)+1)%(l))
#define PREV(x, l)      (((x) == 0) ? (l)-1: (x)-1)
#define HOWMANY(x, y)   (((x)+((y)-1))/(y))
#define ROUNDUP(x, y)   (HOWMANY((x), (y))*(y))

extern void etheriq(Ether*, Msgbuf*);
extern Msgbuf* etheroq(Ether*);