1*41004Swilliam /*- 2*41004Swilliam * Copyright (c) 1990 The Regents of the University of California. 3*41004Swilliam * All rights reserved. 4*41004Swilliam * 5*41004Swilliam * This code is derived from software contributed to Berkeley by 6*41004Swilliam * Tim L. Tucker 7*41004Swilliam * 8*41004Swilliam * %sccs.include.noredist.c% 9*41004Swilliam * 10*41004Swilliam * @(#)if_wereg.h 5.1 (Berkeley) 04/22/90 11*41004Swilliam */ 12*41004Swilliam 13*41004Swilliam /* 14*41004Swilliam * Western Digital 8003 ethernet/starlan adapter 15*41004Swilliam */ 16*41004Swilliam 17*41004Swilliam /* 18*41004Swilliam * Memory Select Register (MSR) 19*41004Swilliam */ 20*41004Swilliam union wd_mem_sel { 21*41004Swilliam struct memory_decode { 22*41004Swilliam u_char msd_addr:6, /* Memory decode bits */ 23*41004Swilliam msd_enable:1, /* Memory (RAM) enable */ 24*41004Swilliam msd_reset:1; /* Software reset */ 25*41004Swilliam } msd_decode; 26*41004Swilliam #define ms_addr msd_decode.msd_addr 27*41004Swilliam #define ms_enable msd_decode.msd_enable 28*41004Swilliam #define ms_reset msd_decode.msd_reset 29*41004Swilliam u_char ms_byte; /* entire byte */ 30*41004Swilliam }; 31*41004Swilliam 32*41004Swilliam /* 33*41004Swilliam * receive ring discriptor 34*41004Swilliam * 35*41004Swilliam * The National Semiconductor NS32490 Network interface controller uses 36*41004Swilliam * the following receive ring headers. The way this works is that the 37*41004Swilliam * memory on the interface card is chopped up into 256 bytes blocks. 38*41004Swilliam * A contiuguous portion of those blocks are marked for receive packets 39*41004Swilliam * by setting start and end block #'s in the NIC. For each packet that 40*41004Swilliam * is put into the receive ring, one of these headers (4 bytes each) is 41*41004Swilliam * tacked onto the front. 42*41004Swilliam */ 43*41004Swilliam struct wd_ring { 44*41004Swilliam struct wdr_status { /* received packet status */ 45*41004Swilliam u_char rs_prx:1, /* packet received intack */ 46*41004Swilliam rs_crc:1, /* crc error */ 47*41004Swilliam rs_fae:1, /* frame alignment error */ 48*41004Swilliam rs_fo:1, /* fifo overrun */ 49*41004Swilliam rs_mpa:1, /* packet received intack */ 50*41004Swilliam rs_phy:1, /* packet received intack */ 51*41004Swilliam rs_dis:1, /* packet received intack */ 52*41004Swilliam rs_dfr:1; /* packet received intack */ 53*41004Swilliam } wd_rcv_status; /* received packet status */ 54*41004Swilliam u_char wd_next_packet; /* pointer to next packet */ 55*41004Swilliam u_short wd_count; /* bytes in packet (length + 4) */ 56*41004Swilliam }; 57*41004Swilliam 58*41004Swilliam /* 59*41004Swilliam * Command word definition 60*41004Swilliam */ 61*41004Swilliam union wd_command { 62*41004Swilliam struct command_decode { 63*41004Swilliam u_char csd_stp:1, /* STOP! */ 64*41004Swilliam csd_sta:1, /* START! */ 65*41004Swilliam csd_txp:1, /* Transmit packet */ 66*41004Swilliam csd_rd:3, /* Remote DMA command */ 67*41004Swilliam csd_ps:2; /* Page select */ 68*41004Swilliam } csd_decode; 69*41004Swilliam #define cs_stp csd_decode.csd_stp 70*41004Swilliam #define cs_sta csd_decode.csd_sta 71*41004Swilliam #define cs_txp csd_decode.csd_txp 72*41004Swilliam #define cs_rd csd_decode.csd_rd 73*41004Swilliam #define cs_ps csd_decode.csd_ps 74*41004Swilliam u_char cs_byte; /* entire command byte */ 75*41004Swilliam }; 76*41004Swilliam 77*41004Swilliam /* 78*41004Swilliam * Interrupt status definition 79*41004Swilliam */ 80*41004Swilliam union wd_interrupt { 81*41004Swilliam struct interrupt_decode { 82*41004Swilliam u_char isd_prx:1, /* Packet received */ 83*41004Swilliam isd_ptx:1, /* Packet transmitted */ 84*41004Swilliam isd_rxe:1, /* Receive error */ 85*41004Swilliam isd_txe:1, /* Transmit error */ 86*41004Swilliam isd_ovw:1, /* Overwrite warning */ 87*41004Swilliam isd_cnt:1, /* Counter overflow */ 88*41004Swilliam isd_rdc:1, /* Remote DMA complete */ 89*41004Swilliam isd_rst:1; /* Reset status */ 90*41004Swilliam } isd_decode; 91*41004Swilliam #define is_prx isd_decode.isd_prx 92*41004Swilliam #define is_ptx isd_decode.isd_ptx 93*41004Swilliam #define is_rxe isd_decode.isd_rxe 94*41004Swilliam #define is_txe isd_decode.isd_txe 95*41004Swilliam #define is_ovw isd_decode.isd_ovw 96*41004Swilliam #define is_cnt isd_decode.isd_cnt 97*41004Swilliam #define is_rdc isd_decode.isd_rdc 98*41004Swilliam #define is_rst isd_decode.isd_rst 99*41004Swilliam u_char is_byte; /* entire interrupt byte */ 100*41004Swilliam }; 101*41004Swilliam 102*41004Swilliam /* 103*41004Swilliam * Status word definition (transmit) 104*41004Swilliam */ 105*41004Swilliam union wdt_status { 106*41004Swilliam struct tstat { 107*41004Swilliam u_char tsd_ptx:1, /* Packet transmitted intack */ 108*41004Swilliam tsd_dfr:1, /* Non deferred transmition */ 109*41004Swilliam tsd_col:1, /* Transmit Collided */ 110*41004Swilliam tsd_abt:1, /* Transmit Aborted (coll > 16) */ 111*41004Swilliam tsd_crs:1, /* Carrier Sense Lost */ 112*41004Swilliam tsd_fu:1, /* Fifo Underrun */ 113*41004Swilliam tsd_chd:1, /* CD Heartbeat */ 114*41004Swilliam tsd_owc:1; /* Out of Window Collision */ 115*41004Swilliam } tsd_decode; 116*41004Swilliam #define ts_ptx tsd_decode.tsd_ptx 117*41004Swilliam #define ts_dfr tsd_decode.tsd_dfr 118*41004Swilliam #define ts_col tsd_decode.tsd_col 119*41004Swilliam #define ts_abt tsd_decode.tsd_abt 120*41004Swilliam #define ts_crs tsd_decode.tsd_crs 121*41004Swilliam #define ts_fu tsd_decode.tsd_fu 122*41004Swilliam #define ts_chd tsd_decode.tsd_chd 123*41004Swilliam #define ts_owc tsd_decode.tsd_owc 124*41004Swilliam u_char ts_byte; /* entire transmit byte */ 125*41004Swilliam }; 126*41004Swilliam 127*41004Swilliam /* 128*41004Swilliam * General constant definitions 129*41004Swilliam */ 130*41004Swilliam #define WD_STARLAN 0x02 /* WD8003S Identification */ 131*41004Swilliam #define WD_ETHER 0x03 /* WD8003E Identification */ 132*41004Swilliam #define WD_CHECKSUM 0xFF /* Checksum byte */ 133*41004Swilliam #define WD_PAGE_SIZE 256 /* Size of RAM pages in bytes */ 134*41004Swilliam #define WD_TXBUF_SIZE 6 /* Size of TX buffer in pages */ 135*41004Swilliam #define WD_ROM_OFFSET 8 /* i/o base offset to ROM */ 136*41004Swilliam #define WD_IO_PORTS 32 /* # of i/o addresses used */ 137*41004Swilliam #define WD_NIC_OFFSET 16 /* i/o base offset to NIC */ 138*41004Swilliam 139*41004Swilliam /* 140*41004Swilliam * Page register offset values 141*41004Swilliam */ 142*41004Swilliam #define WD_P0_COMMAND 0x00 /* Command register */ 143*41004Swilliam #define WD_P0_PSTART 0x01 /* Page Start register */ 144*41004Swilliam #define WD_P0_PSTOP 0x02 /* Page Stop register */ 145*41004Swilliam #define WD_P0_BNRY 0x03 /* Boundary Pointer */ 146*41004Swilliam #define WD_P0_TSR 0x04 /* Transmit Status (read-only) */ 147*41004Swilliam #define WD_P0_TPSR WD_P0_TSR /* Transmit Page (write-only) */ 148*41004Swilliam #define WD_P0_TBCR0 0x05 /* Transmit Byte count, low WO */ 149*41004Swilliam #define WD_P0_TBCR1 0x06 /* Transmit Byte count, high WO */ 150*41004Swilliam #define WD_P0_ISR 0x07 /* Interrupt status register */ 151*41004Swilliam #define WD_P0_RBCR0 0x0A /* Remote byte count low WO */ 152*41004Swilliam #define WD_P0_RBCR1 0x0B /* Remote byte count high WO */ 153*41004Swilliam #define WD_P0_RSR 0x0C /* Receive status RO */ 154*41004Swilliam #define WD_P0_RCR WD_P0_RSR /* Receive configuration WO */ 155*41004Swilliam #define WD_P0_TCR 0x0D /* Transmit configuration WO */ 156*41004Swilliam #define WD_P0_DCR 0x0E /* Data configuration WO */ 157*41004Swilliam #define WD_P0_IMR 0x0F /* Interrupt masks WO */ 158*41004Swilliam #define WD_P1_COMMAND 0x00 /* Command register */ 159*41004Swilliam #define WD_P1_PAR0 0x01 /* Physical address register 0 */ 160*41004Swilliam #define WD_P1_PAR1 0x02 /* Physical address register 1 */ 161*41004Swilliam #define WD_P1_PAR2 0x03 /* Physical address register 2 */ 162*41004Swilliam #define WD_P1_PAR3 0x04 /* Physical address register 3 */ 163*41004Swilliam #define WD_P1_PAR4 0x05 /* Physical address register 4 */ 164*41004Swilliam #define WD_P1_PAR5 0x06 /* Physical address register 5 */ 165*41004Swilliam #define WD_P1_CURR 0x07 /* Current page (receive unit) */ 166*41004Swilliam #define WD_P1_MAR0 0x08 /* Multicast address register 0 */ 167*41004Swilliam 168*41004Swilliam /* 169*41004Swilliam * Configuration constants (receive unit) 170*41004Swilliam */ 171*41004Swilliam #define WD_R_SEP 0x01 /* Save error packets */ 172*41004Swilliam #define WD_R_AR 0x02 /* Accept Runt packets */ 173*41004Swilliam #define WD_R_AB 0x04 /* Accept Broadcast packets */ 174*41004Swilliam #define WD_R_AM 0x08 /* Accept Multicast packets */ 175*41004Swilliam #define WD_R_PRO 0x10 /* Promiscuous physical */ 176*41004Swilliam #define WD_R_MON 0x20 /* Monitor mode */ 177*41004Swilliam #define WD_R_RES1 0x40 /* reserved... */ 178*41004Swilliam #define WD_R_RES2 0x80 /* reserved... */ 179*41004Swilliam #define WD_R_CONFIG (WD_R_AB) 180*41004Swilliam 181*41004Swilliam /* 182*41004Swilliam * Configuration constants (transmit unit) 183*41004Swilliam */ 184*41004Swilliam #define WD_T_CRC 0x01 /* Inhibit CRC */ 185*41004Swilliam #define WD_T_LB0 0x02 /* Encoded Loopback Control */ 186*41004Swilliam #define WD_T_LB1 0x04 /* Encoded Loopback Control */ 187*41004Swilliam #define WD_T_ATD 0x08 /* Auto Transmit Disable */ 188*41004Swilliam #define WD_T_OFST 0x10 /* Collision Offset Enable */ 189*41004Swilliam #define WD_T_RES1 0x20 /* reserved... */ 190*41004Swilliam #define WD_T_RES2 0x40 /* reserved... */ 191*41004Swilliam #define WD_T_RES3 0x80 /* reserved... */ 192*41004Swilliam #define WD_T_CONFIG (0) 193*41004Swilliam 194*41004Swilliam /* 195*41004Swilliam * Configuration constants (data unit) 196*41004Swilliam */ 197*41004Swilliam #define WD_D_WTS 0x01 /* Word Transfer Select */ 198*41004Swilliam #define WD_D_BOS 0x02 /* Byte Order Select */ 199*41004Swilliam #define WD_D_LAS 0x04 /* Long Address Select */ 200*41004Swilliam #define WD_D_BMS 0x08 /* Burst Mode Select */ 201*41004Swilliam #define WD_D_AR 0x10 /* Autoinitialize Remote */ 202*41004Swilliam #define WD_D_FT0 0x20 /* Fifo Threshold Select */ 203*41004Swilliam #define WD_D_FT1 0x40 /* Fifo Threshold Select */ 204*41004Swilliam #define WD_D_RES 0x80 /* reserved... */ 205*41004Swilliam #define WD_D_CONFIG (WD_D_FT1|WD_D_BMS) 206*41004Swilliam 207*41004Swilliam /* 208*41004Swilliam * Configuration constants (interrupt mask register) 209*41004Swilliam */ 210*41004Swilliam #define WD_I_PRXE 0x01 /* Packet received enable */ 211*41004Swilliam #define WD_I_PTXE 0x02 /* Packet transmitted enable */ 212*41004Swilliam #define WD_I_RXEE 0x04 /* Receive error enable */ 213*41004Swilliam #define WD_I_TXEE 0x08 /* Transmit error enable */ 214*41004Swilliam #define WD_I_OVWE 0x10 /* Overwrite warning enable */ 215*41004Swilliam #define WD_I_CNTE 0x20 /* Counter overflow enable */ 216*41004Swilliam #define WD_I_RDCE 0x40 /* Dma complete enable */ 217*41004Swilliam #define WD_I_RES 0x80 /* reserved... */ 218*41004Swilliam #define WD_I_CONFIG (WD_I_PRXE|WD_I_PTXE|WD_I_RXEE|WD_I_TXEE) 219