root/sys/dev/bi/if_nireg.h
/*      $NetBSD: if_nireg.h,v 1.6 2005/12/11 12:21:15 christos Exp $    */
/*
 * Copyright (c) 1988 Regents of the University of California.
 * All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Chris Torek.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      @(#)nireg.h     7.3 (Berkeley) 6/28/90
 */

/*
 * Registers for the DEBNA and DEBNK Ethernet interfaces
 * (DEC calls these Network Interfaces, hence nireg.h)
 */

/*
 * this seems to be intended to be more general, but I have no details,
 * so it goes here for now
 *
 * BI Vax Port (BVP) stuff first:
 */
#ifdef notdef
struct bvpregs {
        u_long  p_pcr;          /* port control register */
        u_long  p_psr;          /* port status register */
        u_long  p_per;          /* port error register */
        u_long  p_pdr;          /* port data register */
};

/*
 * BI node space registers
 */
struct ni_regs {
        struct  biiregs ni_bi;  /* BIIC registers, except GPRs */
        struct  bvpregs ni_tkp; /* tk50 port control via BIIC GPRs */
        u_long  ni_xxx[64];     /* unused */
        u_long  ni_rxcd;        /* receive console data */
        struct  bvpregs ni_nip; /* NI port control via BCI3 GPRs */
        u_long  ni_pudr;        /* power-up diagnostic register */
};
#endif

#define NI_PCR  0x204
#define NI_PSR  0x208
#define NI_PER  0x20c
#define NI_PDR  0x210
#define NI_PUDR 0x204

/* bits in PCR */
#define PCR_OWN         0x80
#define PCR_MFREEQ      0x000
#define PCR_DFREEQ      0x100
#define PCR_RFREEQ      0x200
#define PCR_IFREEQ      0x300
#define PCR_CMDQ0       PCR_MFREEQ
#define PCR_CMDQ1       PCR_DFREEQ
#define PCR_CMDQ2       PCR_RFREEQ
#define PCR_CMDQ3       PCR_IFREEQ
#define PCR_RESTART     11
#define PCR_FREEQNE     7
#define PCR_CMDQNE      6
#define PCR_SHUTDOWN    4
#define PCR_ENABLE      2
#define PCR_INIT        1

/* bits in PSR */
#define PSR_OWN         0x80000000
#define PSR_STATE       0x00070000
#define PSR_STOPPED     0x00060000
#define PSR_ENABLED     0x00040000
#define PSR_INITED      0x00020000
#define PSR_UNDEF       0x00010000
#define PSR_RSQ         0x00000080
#define PSR_ERR         0x00000040

/*
 * The DEBNx uses a very weird (set of) structure(s) to communicate
 * with something as simple as an ethernet controller. This is not
 * very different to the way communication is done over CI with disks.
 */

/* Message packet */
struct ni_msg {
        u_int32_t       nm_forw;
        u_int32_t       nm_back;
        u_int32_t       nm_pad1;
        u_int8_t        nm_pad2;
        u_int8_t        nm_status;
        u_int8_t        nm_opcode;
        u_int8_t        nm_pad3;
        u_int16_t       nm_len;
        u_int8_t        nm_opcode2;
        u_int8_t        nm_status2;
        u_int32_t       nm_pad4;
        u_int8_t        nm_text[128];
};

/* Datagram packet */
struct ni_dg {
        u_int32_t       nd_forw;
        u_int32_t       nd_back;
        u_int32_t       nd_pad1;
        u_int8_t        nd_pad2;
        u_int8_t        nd_status;
        u_int8_t        nd_opcode;
        u_int8_t        nd_pad3;
        u_int16_t       nd_len;
        u_int16_t       nd_status2;
        u_int32_t       nd_cmdref;
        u_int32_t       nd_ptdbidx;
        struct {
                u_int16_t       _offset;
                u_int16_t       _len;
                u_int16_t       _index;
                u_int16_t       _key;
        } bufs[NTXFRAGS];
};

#define NIDG_CHAIN      0x8000

/* NI parameter block */
struct ni_param {
        u_int8_t        np_dpa[8];
        u_int8_t        np_apa[8];
        u_int8_t        np_lsa[8];
        u_int8_t        np_bvc[8];
        u_int16_t       np_curaddr;
        u_int16_t       np_maxaddr;
        u_int16_t       np_curptt;
        u_int16_t       np_maxptt;
        u_int16_t       np_curfq;
        u_int16_t       np_maxfq;
        u_int32_t       np_sid;
        u_int32_t       np_mop;
        u_int32_t       np_flags;
        u_int32_t       np_rcto;
        u_int32_t       np_xmto;
};

#define NP_ECT          0x01
#define NP_PAD          0x02
#define NP_BOO          0x04
#define NP_CAR          0x08
#define NP_ILP          0x10
#define NP_ELP          0x20
#define NP_DCRC         0x40
#define NP_THRU         0x80

/* Protocol type definition block */
struct ni_ptdb {
        u_int16_t       np_type;        /* Protocol type */
        u_int8_t        np_fque;        /* Free queue */
        u_int8_t        np_flags;       /* See below */
        u_int32_t       np_index;       /* protocol type index */
        u_int16_t       np_adrlen;      /* # of multicast addresses */
        u_int16_t       np_802;         /* for IEEE 802 packets */
        u_int8_t        np_mcast[16][8];/* Multicast (direct match) array */
};

#define PTDB_PROMISC    0x08
#define PTDB_802        0x10
#define PTDB_BDC        0x20
#define PTDB_UNKN       0x40
#define PTDB_AMC        0x80

/* Buffer descriptor */
struct ni_bbd {
        u_int16_t       nb_status;      /* Offset, valid etc */
        u_int16_t       nb_key;
        u_int32_t       nb_len;         /* Buffer length */
        u_int32_t       nb_pte;         /* start (vax) PTE for this buffer */
        u_int32_t       nb_pad;
};
#define NIBD_OFFSET     0x1ff
#define NIBD_VALID      0x8000


/* Free Queue Block */
struct ni_fqb {
        u_int32_t       nf_mlen;
        u_int32_t       nf_mpad;
        u_int32_t       nf_mforw;
        u_int32_t       nf_mback;
        u_int32_t       nf_dlen;
        u_int32_t       nf_dpad;
        u_int32_t       nf_dforw;
        u_int32_t       nf_dback;
        u_int32_t       nf_rlen;
        u_int32_t       nf_rpad;
        u_int32_t       nf_rforw;
        u_int32_t       nf_rback;
        u_int32_t       nf_ilen;
        u_int32_t       nf_ipad;
        u_int32_t       nf_iforw;
        u_int32_t       nf_iback;
};

/* DEBNx specific part of Generic VAX Port */
struct ni_pqb {
        u_int16_t       np_veclvl;      /* Interrupt vector + level */
        u_int16_t       np_node;        /* Where to interrupt */
        u_int32_t       np_freeq;
        u_int32_t       np_vfqb;        /* Free queue block pointer */
        u_int32_t       np_pad1[39];
        u_int32_t       np_bvplvl;
        u_int32_t       np_vpqb;        /* Virtual address of Generic PQB */
        u_int32_t       np_vbdt;        /* Virtual address of descriptors */
        u_int32_t       np_nbdr;        /* Number of descriptors */
        u_int32_t       np_spt;         /* System Page Table */
        u_int32_t       np_sptlen;      /* System Page Table length */
        u_int32_t       np_gpt;         /* Global Page Table */
        u_int32_t       np_gptlen;      /* Global Page Table length */
        u_int32_t       np_mask;
        u_int32_t       np_pad2[67];
};

/* "Generic VAX Port Control Block" whatever it means */
struct ni_gvppqb {
        u_int32_t       nc_forw0;
        u_int32_t       nc_back0;
        u_int32_t       nc_forw1;
        u_int32_t       nc_back1;
        u_int32_t       nc_forw2;
        u_int32_t       nc_back2;
        u_int32_t       nc_forw3;
        u_int32_t       nc_back3;
        u_int32_t       nc_forwr;
        u_int32_t       nc_backr;
        struct ni_pqb   nc_pqb;         /* DEBNx specific part of struct */
};


/* BVP opcodes, should be somewhere else */
#define BVP_DGRAM       1
#define BVP_MSG         2
#define BVP_DGRAMI      3
#define BVP_DGRAMRX     33
#define BVP_MSGRX       34
#define BVP_DGRAMIRX    35

/* NI-specific sub-opcodes */
#define NI_WSYSID       1
#define NI_RSYSID       2
#define NI_WPARAM       3
#define NI_RPARAM       4
#define NI_RCCNTR       5
#define NI_RDCNTR       6
#define NI_STPTDB       7
#define NI_CLPTDB       8

/* bits in ni_pudr */
#define PUDR_TAPE       0x40000000      /* tk50 & assoc logic ok */
#define PUDR_PATCH      0x20000000      /* patch logic ok */
#define PUDR_VRAM       0x10000000      /* DEBNx onboard RAM ok */
#define PUDR_VROM1      0x08000000      /* uVax ROM 1 ok */ /* ? */
#define PUDR_VROM2      0x04000000      /* uVax ROM 2 ok */
#define PUDR_VROM3      0x02000000      /* uVax ROM 3 ok */
#define PUDR_VROM4      0x01000000      /* uVax ROM 4 ok */
#define PUDR_UVAX       0x00800000      /* uVax passes self test */
#define PUDR_BI         0x00400000      /* BIIC and BCI3 chips ok */
#define PUDR_TMR        0x00200000      /* interval timer ok */
#define PUDR_IRQ        0x00100000      /* no IRQ lines stuck */
#define PUDR_NI         0x00080000      /* Ethernet ctlr ok */
#define PUDR_TK50       0x00040000      /* tk50 present */
#define PUDR_PRES       0x00001000      /* tk50 present (again?!) */
#define PUDR_UVINT      0x00000800      /* uVax-to-80186 intr logic ok */
#define PUDR_BUSHD      0x00000400      /* no bus hold errors */
#define PUDR_II32       0x00000200      /* II32 transceivers ok */
#define PUDR_MPSC       0x00000100      /* MPSC logic ok */
#define PUDR_GAP        0x00000080      /* gap-detect logic ok */
#define PUDR_MISC       0x00000040      /* misc. registers ok */
#define PUDR_UNEXP      0x00000020      /* unexpected interrupt trapped */
#define PUDR_80186      0x00000010      /* 80186 ok */
#define PUDR_PATCH2     0x00000008      /* patch logic ok (again) */
#define PUDR_8RAM       0x00000004      /* 80186 RAM ok */
#define PUDR_8ROM2      0x00000002      /* 80186 ROM1 ok */
#define PUDR_8ROM1      0x00000001      /* 80186 ROM2 ok */