Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Ctlr for the boards using the National Semiconductor DP8390
 * and SMC 83C90 Network Interface Controller.
 * Common code is in ether8390.c.
 */
typedef struct {
        Lock;

        ulong   port;                   /* I/O address of 8390 */
        ulong   data;                   /* I/O data port if no shared memory */

        uchar   width;                  /* data transfer width in bytes */
        uchar   ram;                    /* true if card has shared memory */
        uchar   dummyrr;                /* do dummy remote read */

        uchar   nxtpkt;                 /* receive: software bndry */
        uchar   pstart;
        uchar   pstop;

        int     txbusy;                 /* transmit */
        uchar   tstart;                 /* 8390 ring addresses */

        uchar   mar[8];                 /* shadow multicast address registers */
        int     mref[64];               /* reference counts for multicast groups */
} Dp8390;

#define Dp8390BufSz     256

extern int dp8390reset(Ether*);
extern void *dp8390read(Dp8390*, void*, ulong, ulong);
extern void dp8390getea(Ether*, uchar*);
extern void dp8390setea(Ether*);

/*
 * x86-specific code.
 */
#define regr(c, r)      inb((c)->port+(r))
#define regw(c, r, v)   outb((c)->port+(r), (v))

static void
rdread(Dp8390* ctlr, void* to, int len)
{
        switch(ctlr->width){
        default:
                panic("dp8390 rdread: width %d\n", ctlr->width);
                break;

        case 2:
                inss(ctlr->data, to, len/2);
                break;

        case 1:
                insb(ctlr->data, to, len);
                break;
        }
}

static void
rdwrite(Dp8390* ctlr, void* from, int len)
{
        switch(ctlr->width){
        default:
                panic("dp8390 rdwrite: width %d\n", ctlr->width);
                break;

        case 2:
                outss(ctlr->data, from, len/2);
                break;

        case 1:
                outsb(ctlr->data, from, len);
                break;
        }
}