141004Swilliam /*- 2*63364Sbostic * Copyright (c) 1991, 1993 3*63364Sbostic * The Regents of the University of California. All rights reserved. 441004Swilliam * 541004Swilliam * This code is derived from software contributed to Berkeley by 649617Sbostic * Tim L. Tucker. 741004Swilliam * 849617Sbostic * %sccs.include.redist.c% 941004Swilliam * 10*63364Sbostic * @(#)if_wereg.h 8.1 (Berkeley) 06/11/93 1141004Swilliam */ 1241004Swilliam 1341004Swilliam /* 1441004Swilliam * Western Digital 8003 ethernet/starlan adapter 1541004Swilliam */ 1641004Swilliam 1741004Swilliam /* 1841004Swilliam * Memory Select Register (MSR) 1941004Swilliam */ 2045542Sbill union we_mem_sel { 2141004Swilliam struct memory_decode { 2241004Swilliam u_char msd_addr:6, /* Memory decode bits */ 2341004Swilliam msd_enable:1, /* Memory (RAM) enable */ 2441004Swilliam msd_reset:1; /* Software reset */ 2541004Swilliam } msd_decode; 2641004Swilliam #define ms_addr msd_decode.msd_addr 2741004Swilliam #define ms_enable msd_decode.msd_enable 2841004Swilliam #define ms_reset msd_decode.msd_reset 2941004Swilliam u_char ms_byte; /* entire byte */ 3041004Swilliam }; 3141004Swilliam 3241004Swilliam /* 3341004Swilliam * receive ring discriptor 3441004Swilliam * 3545542Sbill * The National Semiconductor DS8390 Network interface controller uses 3641004Swilliam * the following receive ring headers. The way this works is that the 3741004Swilliam * memory on the interface card is chopped up into 256 bytes blocks. 3845542Sbill * A contiguous portion of those blocks are marked for receive packets 3941004Swilliam * by setting start and end block #'s in the NIC. For each packet that 4041004Swilliam * is put into the receive ring, one of these headers (4 bytes each) is 4141004Swilliam * tacked onto the front. 4241004Swilliam */ 4345542Sbill struct we_ring { 4445542Sbill struct wer_status { /* received packet status */ 4541004Swilliam u_char rs_prx:1, /* packet received intack */ 4641004Swilliam rs_crc:1, /* crc error */ 4741004Swilliam rs_fae:1, /* frame alignment error */ 4841004Swilliam rs_fo:1, /* fifo overrun */ 4941004Swilliam rs_mpa:1, /* packet received intack */ 5041004Swilliam rs_phy:1, /* packet received intack */ 5141004Swilliam rs_dis:1, /* packet received intack */ 5241004Swilliam rs_dfr:1; /* packet received intack */ 5345542Sbill } we_rcv_status; /* received packet status */ 5445542Sbill u_char we_next_packet; /* pointer to next packet */ 5545542Sbill u_short we_count; /* bytes in packet (length + 4) */ 5641004Swilliam }; 5741004Swilliam 5841004Swilliam /* 5941004Swilliam * Command word definition 6041004Swilliam */ 6145542Sbill union we_command { 6241004Swilliam struct command_decode { 6341004Swilliam u_char csd_stp:1, /* STOP! */ 6441004Swilliam csd_sta:1, /* START! */ 6541004Swilliam csd_txp:1, /* Transmit packet */ 6641004Swilliam csd_rd:3, /* Remote DMA command */ 6741004Swilliam csd_ps:2; /* Page select */ 6841004Swilliam } csd_decode; 6941004Swilliam #define cs_stp csd_decode.csd_stp 7041004Swilliam #define cs_sta csd_decode.csd_sta 7141004Swilliam #define cs_txp csd_decode.csd_txp 7241004Swilliam #define cs_rd csd_decode.csd_rd 7341004Swilliam #define cs_ps csd_decode.csd_ps 7441004Swilliam u_char cs_byte; /* entire command byte */ 7541004Swilliam }; 7641004Swilliam 7741004Swilliam /* 7841004Swilliam * Interrupt status definition 7941004Swilliam */ 8045542Sbill union we_interrupt { 8141004Swilliam struct interrupt_decode { 8241004Swilliam u_char isd_prx:1, /* Packet received */ 8341004Swilliam isd_ptx:1, /* Packet transmitted */ 8441004Swilliam isd_rxe:1, /* Receive error */ 8541004Swilliam isd_txe:1, /* Transmit error */ 8641004Swilliam isd_ovw:1, /* Overwrite warning */ 8741004Swilliam isd_cnt:1, /* Counter overflow */ 8841004Swilliam isd_rdc:1, /* Remote DMA complete */ 8941004Swilliam isd_rst:1; /* Reset status */ 9041004Swilliam } isd_decode; 9141004Swilliam #define is_prx isd_decode.isd_prx 9241004Swilliam #define is_ptx isd_decode.isd_ptx 9341004Swilliam #define is_rxe isd_decode.isd_rxe 9441004Swilliam #define is_txe isd_decode.isd_txe 9541004Swilliam #define is_ovw isd_decode.isd_ovw 9641004Swilliam #define is_cnt isd_decode.isd_cnt 9741004Swilliam #define is_rdc isd_decode.isd_rdc 9841004Swilliam #define is_rst isd_decode.isd_rst 9941004Swilliam u_char is_byte; /* entire interrupt byte */ 10041004Swilliam }; 10141004Swilliam 10241004Swilliam /* 10341004Swilliam * Status word definition (transmit) 10441004Swilliam */ 10545542Sbill union wet_status { 10641004Swilliam struct tstat { 10741004Swilliam u_char tsd_ptx:1, /* Packet transmitted intack */ 10841004Swilliam tsd_dfr:1, /* Non deferred transmition */ 10941004Swilliam tsd_col:1, /* Transmit Collided */ 11041004Swilliam tsd_abt:1, /* Transmit Aborted (coll > 16) */ 11141004Swilliam tsd_crs:1, /* Carrier Sense Lost */ 11241004Swilliam tsd_fu:1, /* Fifo Underrun */ 11341004Swilliam tsd_chd:1, /* CD Heartbeat */ 11441004Swilliam tsd_owc:1; /* Out of Window Collision */ 11541004Swilliam } tsd_decode; 11641004Swilliam #define ts_ptx tsd_decode.tsd_ptx 11741004Swilliam #define ts_dfr tsd_decode.tsd_dfr 11841004Swilliam #define ts_col tsd_decode.tsd_col 11941004Swilliam #define ts_abt tsd_decode.tsd_abt 12041004Swilliam #define ts_crs tsd_decode.tsd_crs 12141004Swilliam #define ts_fu tsd_decode.tsd_fu 12241004Swilliam #define ts_chd tsd_decode.tsd_chd 12341004Swilliam #define ts_owc tsd_decode.tsd_owc 12441004Swilliam u_char ts_byte; /* entire transmit byte */ 12541004Swilliam }; 12641004Swilliam 12741004Swilliam /* 12841004Swilliam * General constant definitions 12941004Swilliam */ 13041004Swilliam #define WD_STARLAN 0x02 /* WD8003S Identification */ 13141004Swilliam #define WD_ETHER 0x03 /* WD8003E Identification */ 13245542Sbill #define WD_ETHER2 0x05 /* WD8003EBT Identification */ 13341004Swilliam #define WD_CHECKSUM 0xFF /* Checksum byte */ 13441004Swilliam #define WD_PAGE_SIZE 256 /* Size of RAM pages in bytes */ 13541004Swilliam #define WD_TXBUF_SIZE 6 /* Size of TX buffer in pages */ 13641004Swilliam #define WD_ROM_OFFSET 8 /* i/o base offset to ROM */ 13741004Swilliam #define WD_IO_PORTS 32 /* # of i/o addresses used */ 13841004Swilliam #define WD_NIC_OFFSET 16 /* i/o base offset to NIC */ 13941004Swilliam 14041004Swilliam /* 14141004Swilliam * Page register offset values 14241004Swilliam */ 14341004Swilliam #define WD_P0_COMMAND 0x00 /* Command register */ 14441004Swilliam #define WD_P0_PSTART 0x01 /* Page Start register */ 14541004Swilliam #define WD_P0_PSTOP 0x02 /* Page Stop register */ 14641004Swilliam #define WD_P0_BNRY 0x03 /* Boundary Pointer */ 14741004Swilliam #define WD_P0_TSR 0x04 /* Transmit Status (read-only) */ 14841004Swilliam #define WD_P0_TPSR WD_P0_TSR /* Transmit Page (write-only) */ 14941004Swilliam #define WD_P0_TBCR0 0x05 /* Transmit Byte count, low WO */ 15041004Swilliam #define WD_P0_TBCR1 0x06 /* Transmit Byte count, high WO */ 15141004Swilliam #define WD_P0_ISR 0x07 /* Interrupt status register */ 15241004Swilliam #define WD_P0_RBCR0 0x0A /* Remote byte count low WO */ 15341004Swilliam #define WD_P0_RBCR1 0x0B /* Remote byte count high WO */ 15441004Swilliam #define WD_P0_RSR 0x0C /* Receive status RO */ 15541004Swilliam #define WD_P0_RCR WD_P0_RSR /* Receive configuration WO */ 15641004Swilliam #define WD_P0_TCR 0x0D /* Transmit configuration WO */ 15741004Swilliam #define WD_P0_DCR 0x0E /* Data configuration WO */ 15841004Swilliam #define WD_P0_IMR 0x0F /* Interrupt masks WO */ 15941004Swilliam #define WD_P1_COMMAND 0x00 /* Command register */ 16041004Swilliam #define WD_P1_PAR0 0x01 /* Physical address register 0 */ 16141004Swilliam #define WD_P1_PAR1 0x02 /* Physical address register 1 */ 16241004Swilliam #define WD_P1_PAR2 0x03 /* Physical address register 2 */ 16341004Swilliam #define WD_P1_PAR3 0x04 /* Physical address register 3 */ 16441004Swilliam #define WD_P1_PAR4 0x05 /* Physical address register 4 */ 16541004Swilliam #define WD_P1_PAR5 0x06 /* Physical address register 5 */ 16641004Swilliam #define WD_P1_CURR 0x07 /* Current page (receive unit) */ 16741004Swilliam #define WD_P1_MAR0 0x08 /* Multicast address register 0 */ 16841004Swilliam 16941004Swilliam /* 17041004Swilliam * Configuration constants (receive unit) 17141004Swilliam */ 17241004Swilliam #define WD_R_SEP 0x01 /* Save error packets */ 17341004Swilliam #define WD_R_AR 0x02 /* Accept Runt packets */ 17441004Swilliam #define WD_R_AB 0x04 /* Accept Broadcast packets */ 17541004Swilliam #define WD_R_AM 0x08 /* Accept Multicast packets */ 17641004Swilliam #define WD_R_PRO 0x10 /* Promiscuous physical */ 17741004Swilliam #define WD_R_MON 0x20 /* Monitor mode */ 17841004Swilliam #define WD_R_RES1 0x40 /* reserved... */ 17941004Swilliam #define WD_R_RES2 0x80 /* reserved... */ 18041004Swilliam #define WD_R_CONFIG (WD_R_AB) 18141004Swilliam 18241004Swilliam /* 18341004Swilliam * Configuration constants (transmit unit) 18441004Swilliam */ 18541004Swilliam #define WD_T_CRC 0x01 /* Inhibit CRC */ 18641004Swilliam #define WD_T_LB0 0x02 /* Encoded Loopback Control */ 18741004Swilliam #define WD_T_LB1 0x04 /* Encoded Loopback Control */ 18841004Swilliam #define WD_T_ATD 0x08 /* Auto Transmit Disable */ 18941004Swilliam #define WD_T_OFST 0x10 /* Collision Offset Enable */ 19041004Swilliam #define WD_T_RES1 0x20 /* reserved... */ 19141004Swilliam #define WD_T_RES2 0x40 /* reserved... */ 19241004Swilliam #define WD_T_RES3 0x80 /* reserved... */ 19341004Swilliam #define WD_T_CONFIG (0) 19441004Swilliam 19541004Swilliam /* 19641004Swilliam * Configuration constants (data unit) 19741004Swilliam */ 19841004Swilliam #define WD_D_WTS 0x01 /* Word Transfer Select */ 19941004Swilliam #define WD_D_BOS 0x02 /* Byte Order Select */ 20041004Swilliam #define WD_D_LAS 0x04 /* Long Address Select */ 20141004Swilliam #define WD_D_BMS 0x08 /* Burst Mode Select */ 20241004Swilliam #define WD_D_AR 0x10 /* Autoinitialize Remote */ 20341004Swilliam #define WD_D_FT0 0x20 /* Fifo Threshold Select */ 20441004Swilliam #define WD_D_FT1 0x40 /* Fifo Threshold Select */ 20541004Swilliam #define WD_D_RES 0x80 /* reserved... */ 20641004Swilliam #define WD_D_CONFIG (WD_D_FT1|WD_D_BMS) 20741004Swilliam 20841004Swilliam /* 20941004Swilliam * Configuration constants (interrupt mask register) 21041004Swilliam */ 21141004Swilliam #define WD_I_PRXE 0x01 /* Packet received enable */ 21241004Swilliam #define WD_I_PTXE 0x02 /* Packet transmitted enable */ 21341004Swilliam #define WD_I_RXEE 0x04 /* Receive error enable */ 21441004Swilliam #define WD_I_TXEE 0x08 /* Transmit error enable */ 21541004Swilliam #define WD_I_OVWE 0x10 /* Overwrite warning enable */ 21641004Swilliam #define WD_I_CNTE 0x20 /* Counter overflow enable */ 21741004Swilliam #define WD_I_RDCE 0x40 /* Dma complete enable */ 21841004Swilliam #define WD_I_RES 0x80 /* reserved... */ 21945542Sbill #define WD_I_CONFIG (WD_I_PRXE|WD_I_PTXE|WD_I_RXEE|WD_I_TXEE) 220