/*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Computer Consoles Inc. * * %sccs.include.redist.c% * * @(#)if_enpreg.h 7.2 (Berkeley) 05/08/91 */ /* Copyright (c) 1984 by Communication Machinery Corporation * * This file contains material which is proprietary to * Communication Machinery Corporation (CMC) and which * may not be divulged without the written permission * of CMC. * * ENP-10 Ram Definition * * 3/15/85 Jon Phares * Update 7/10/85 S. Holmgren * ENP-10 update 7/21/85 J. Mullen * ENP-20 update 8/11/85 J. Mullen * Mods for CCI TAHOE system 8/14/85 J. Mullen */ #define K *1024 struct ether_addr { u_char ea_addr[6]; }; typedef struct ethlist { int e_listsize; /* active addr entries */ struct ether_addr e_baseaddr; /* addr lance is working with */ struct ether_addr e_addrs[16]; /* possible addresses */ } ETHLIST; typedef struct { u_long e_xmit_successful; /* Successful transmissions */ u_long e_mult_retry; /* multiple retries on xmit */ u_long e_one_retry; /* single retries */ u_long e_fail_retry; /* too many retries */ u_long e_deferrals; /* xmit delayed 'cuz cable busy */ u_long e_xmit_buff_err; /* xmit data chaining failed -- "can't happen" */ u_long e_silo_underrun; /* transmit data fetch failed */ u_long e_late_coll; /* collision after xmit */ u_long e_lost_carrier; u_long e_babble; /* xmit length > 1518 */ u_long e_collision; u_long e_xmit_mem_err; u_long e_rcv_successful; /* good receptions */ u_long e_rcv_missed; /* no recv buff available */ u_long e_crc_err; /* checksum failed */ u_long e_frame_err; /* crc error & data length != 0 mod 8 */ u_long e_rcv_buff_err; /* rcv data chain failure -- "can't happen" */ u_long e_silo_overrun; /* receive data store failed */ u_long e_rcv_mem_err; } ENPSTAT; typedef struct RING { short r_rdidx; short r_wrtidx; short r_size; short r_pad; int r_slot[1]; } RING; typedef struct RING32 { short r_rdidx; short r_wrtidx; short r_size; short r_pad; /* to make VAXen happy */ int r_slot[32]; } RING32; /* * ENP Ram data layout */ /* * Note: paged window (4 K) is identity mapped by ENP kernel to provide * 124 K contiguous RAM (as reflected in RAM_SIZE) */ #define RAM_WINDOW (128 K) #define IOACCESS_WINDOW (512) #define FIXED_WINDOW (RAM_WINDOW - IOACCESS_WINDOW) #define RAMROM_SWAP (4 K) #define RAM_SIZE (FIXED_WINDOW - RAMROM_SWAP) #define HOST_RAMSIZE (48 K) #define ENP_RAMSIZE (20 K) typedef struct iow20 { char pad0; char hst2enp_interrupt; char pad1[510]; } iow20; struct enpdevice { #ifdef notdef char enp_ram_rom[4 K]; #endif notdef union { char all_ram[RAM_SIZE]; struct { u_int t_go; u_int t_pstart; } t; struct { char nram[RAM_SIZE - (HOST_RAMSIZE + ENP_RAMSIZE)]; char hram[HOST_RAMSIZE]; char kram[ENP_RAMSIZE]; } u_ram; struct { char pad7[0x100]; /* starts 0x1100 - 0x2000 */ short e_enpstate; /* 1102 */ short e_enpmode; /* 1104 */ int e_enpbase; /* 1104 */ int e_enprun; /* 1108 */ u_short e_intrvec; u_short e_dummy[3]; RING32 h_toenp; /* 110C */ RING32 h_hostfree; RING32 e_tohost; RING32 e_enpfree; ENPSTAT e_stat; ETHLIST e_netaddr; } iface; } enp_u; iow20 enp_iow; }; #define enp_ram enp_u.all_ram #define enp_nram enp_u.u_ram.nram #define enp_hram enp_u.u_ram.hram #define enp_kram enp_u.u_ram.kram #define enp_go enp_u.t.t_go #define enp_prog_start enp_u.t.t_pstart #define enp_intrvec enp_u.iface.e_intrvec #define enp_state enp_u.iface.e_enpstate #define enp_mode enp_u.iface.e_enpmode #define enp_base enp_u.iface.e_enpbase #define enp_enprun enp_u.iface.e_enprun #define enp_toenp enp_u.iface.h_toenp #define enp_hostfree enp_u.iface.h_hostfree #define enp_tohost enp_u.iface.e_tohost #define enp_enpfree enp_u.iface.e_enpfree #define enp_freembuf enp_u.iface.h_freembuf #define enp_stat enp_u.iface.e_stat #define enp_addr enp_u.iface.e_netaddr #define ENPVAL 0xff /* enp_iow.hst2enp_interrupt poke value */ #define RESETVAL 0x00 /* enp_iow.enp2hst_clear_intr poke value */ #define INTR_ENP(addr) (addr->enp_iow.hst2enp_interrupt = ENPVAL) #if ENP == 30 #define ACK_ENP_INTR(addr) (addr->enp_iow.enp2hst_clear_intr = RESETVAL) #define IS_ENP_INTR(addr) (addr->enp_iow.enp2hst_clear_intr&0x80) #endif #ifdef notdef #define RESET_ENP(addr) (addr->enp_iow.hst2enp_reset = 01) #else #ifdef lint #define RESET_ENP(addr) ((addr) = (addr)) #else #define RESET_ENP(addr) #endif lint #endif notdef #ifdef tahoe #define ENP_GO(addr,start) { \ int v = start; \ enpcopy((u_char *)&v, (u_char *)&addr->enp_prog_start, sizeof(v) ); \ v = 0x80800000; \ enpcopy((u_char *)&v, (u_char *)&addr->enp_go, sizeof(v) ); \ } #else #define ENP_GO(addr,start,intvec ) { \ addr->enp_prog_start = (u_int)(start); \ addr->enp_intrvec = (u_short) intvec; \ addr->enp_go = 0x80800000; \ } #endif tahoe /* * State bits */ #define S_ENPRESET 01 /* enp is in reset state */ #define S_ENPRUN 02 /* enp is in run state */ /* * Mode bits */ #define E_SWAP16 0x1 /* swap two octets within 16 */ #define E_SWAP32 0x2 /* swap 16s within 32 */ #define E_SWAPRD 0x4 /* swap on read */ #define E_SWAPWRT 0x8 /* swap on write */ #define E_DMA 0x10 /* enp does data moving */ #define E_EXAM_LIST 0x80000000 /* enp should examine addrlist */ #define E_ADDR_SUPP 0x40000000 /* enp should use supplied addr */ /* * Download ioctl definitions */ #define ENPIOGO _IO('S',1) /* start the enp */ #define ENPIORESET _IO('S',2) /* reset the enp */ /* * The ENP Data Buffer Structure */ typedef struct BCB { struct BCB *b_link; short b_stat; short b_len; u_char *b_addr; short b_msglen; short b_reserved; } BCB;