summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorClaudio Jeker <claudio@cvs.openbsd.org>2007-05-29 18:21:20 +0000
committerClaudio Jeker <claudio@cvs.openbsd.org>2007-05-29 18:21:20 +0000
commitc1821f5cc50d3d5d3a99c8d48845e59a0bfffdd0 (patch)
tree4461b7190aec61a7df4d36ad81bcde1cabefaa45 /sys/dev
parentc696e5ff82ab384bb17f374d81f93705b2a5dc26 (diff)
Move tokenring support to the attic where it can join the cards that where
decomissioned aeon ago. We will not miss it at all. OK dlg@ henning@ and a lot of cheers by other in the room
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/tropic.c1732
-rw-r--r--sys/dev/ic/tropicreg.h556
-rw-r--r--sys/dev/ic/tropicvar.h105
-rw-r--r--sys/dev/isa/files.isa9
-rw-r--r--sys/dev/isa/if_tr_isa.c257
-rw-r--r--sys/dev/isa/if_tribm_isa.c175
-rw-r--r--sys/dev/isa/if_trtcm_isa.c359
7 files changed, 1 insertions, 3192 deletions
diff --git a/sys/dev/ic/tropic.c b/sys/dev/ic/tropic.c
index ad431ce61f5..e69de29bb2d 100644
--- a/sys/dev/ic/tropic.c
+++ b/sys/dev/ic/tropic.c
@@ -1,1732 +0,0 @@
-/* $OpenBSD: tropic.c,v 1.12 2006/07/09 22:10:05 mk Exp $ */
-/* $NetBSD: tropic.c,v 1.6 1999/12/17 08:26:31 fvdl Exp $ */
-
-/*
- * Ported to NetBSD by Onno van der Linden
- * Many thanks to Larry Lile for sending me the IBM TROPIC documentation.
- *
- * Mach Operating System
- * Copyright (c) 1991 Carnegie Mellon University
- * Copyright (c) 1991 IBM Corporation
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation,
- * and that the name IBM not be used in advertising or publicity
- * pertaining to distribution of the software without specific, written
- * prior permission.
- *
- * CARNEGIE MELLON AND IBM ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON AND IBM DISCLAIM ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
-
-#include "bpfilter.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/mbuf.h>
-#include <sys/buf.h>
-#include <sys/socket.h>
-#include <sys/syslog.h>
-#include <sys/ioctl.h>
-#include <sys/errno.h>
-#include <sys/device.h>
-#include <sys/timeout.h>
-
-#include <net/if.h>
-#include <net/if_llc.h>
-#include <net/if_media.h>
-#include <net/netisr.h>
-#include <net/route.h>
-
-#ifdef INET
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/if_ether.h>
-#include <netinet/ip.h>
-#include <netinet/in_var.h>
-#include <net/if_token.h>
-#endif
-
-#if NBPFILTER > 0
-#include <net/bpf.h>
-#endif
-
-#ifndef ifr_mtu
-#define ifr_mtu ifr_metric
-#endif
-
-#include <machine/cpu.h>
-#include <machine/bus.h>
-
-#include <dev/ic/tropicreg.h>
-#include <dev/ic/tropicvar.h>
-
-static void tr_shutdown(void *);
-
-void tr_rint(struct tr_softc *);
-void tr_xint(struct tr_softc *);
-void tr_oldxint(struct tr_softc *);
-struct mbuf *tr_get(struct tr_softc *, int, struct ifnet *);
-void tr_opensap(struct tr_softc *, u_char);
-int tr_mbcopy(struct tr_softc *, bus_size_t, struct mbuf *);
-void tr_bcopy(struct tr_softc *, u_char *, int);
-void tr_start(struct ifnet *);
-void tr_oldstart(struct ifnet *);
-void tr_watchdog(struct ifnet *);
-int tr_mediachange(struct ifnet *);
-void tr_mediastatus(struct ifnet *, struct ifmediareq *);
-int tropic_mediachange(struct tr_softc *);
-void tropic_mediastatus(struct tr_softc *, struct ifmediareq *);
-void tr_reinit(void *);
-
-struct cfdriver tr_cd = {
- NULL, "tr", DV_IFNET
-};
-
-/*
- * TODO:
- * clean up tr_intr: more subroutines
- * IFF_LINK0 == IFM_TOK_SRCRT change to link flag implies media flag change
- * IFF_LINK1 == IFM_TOK_ALLR change to link flag implies media flag change
- * XXX Create receive_done queue to kill "ASB not free", but does this ever
- * XXX happen ?
- */
-
-static int media[] = {
- IFM_TOKEN | IFM_TOK_UTP4,
- IFM_TOKEN | IFM_TOK_STP4,
- IFM_TOKEN | IFM_TOK_UTP16,
- IFM_TOKEN | IFM_TOK_STP16,
- IFM_TOKEN | IFM_TOK_UTP4,
- IFM_TOKEN | IFM_TOK_UTP16,
- IFM_TOKEN | IFM_TOK_STP4,
- IFM_TOKEN | IFM_TOK_STP16
-};
-
-int
-tropic_mediachange(sc)
- struct tr_softc *sc;
-{
- if (IFM_TYPE(sc->sc_media.ifm_media) != IFM_TOKEN)
- return EINVAL;
-
- switch (IFM_SUBTYPE(sc->sc_media.ifm_media)) {
- case IFM_TOK_STP16:
- case IFM_TOK_UTP16:
- if ((sc->sc_init_status & RSP_16) == 0) {
- tr_stop(sc);
- if (tr_setspeed(sc, 16))
- return EINVAL;
- if (tr_reset(sc))
- return EINVAL;
- if (tr_config(sc))
- return EINVAL;
- }
- break;
- case IFM_TOK_STP4:
- case IFM_TOK_UTP4:
- if ((sc->sc_init_status & RSP_16) != 0) {
- tr_stop(sc);
- if (tr_setspeed(sc, 4))
- return EINVAL;
- if (tr_reset(sc))
- return EINVAL;
- if (tr_config(sc))
- return EINVAL;
- }
- break;
- }
-/*
- * XXX Handle Early Token Release !!!!
- */
- return 0;
-}
-
-void
-tropic_mediastatus(sc, ifmr)
- struct tr_softc *sc;
- struct ifmediareq *ifmr;
-{
- struct ifmedia *ifm = &sc->sc_media;
-
- ifmr->ifm_active = ifm->ifm_cur->ifm_media;
-}
-
-int
-tr_config(sc)
- struct tr_softc *sc;
-{
- if (sc->sc_init_status & FAST_PATH_TRANSMIT) {
- int i;
-
- for (i=0; i < SRB_CFP_CMDSIZE; i++)
- SRB_OUTB(sc, sc->sc_srb, i, 0);
-
- SRB_OUTB(sc, sc->sc_srb, SRB_CMD, DIR_CONFIG_FAST_PATH_RAM);
-
- SRB_OUTW(sc, sc->sc_srb, SRB_CFP_RAMSIZE,
- (16 + (sc->sc_nbuf * FP_BUF_LEN) / 8));
- SRB_OUTW(sc, sc->sc_srb, SRB_CFP_BUFSIZE, FP_BUF_LEN);
-
- /* tell adapter: command in SRB */
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
-
- for (i = 0; i < 30000; i++) {
- if (ACA_RDB(sc, ACA_ISRP_o) & SRB_RESP_INT)
- break;
- delay(100);
- }
-
- if (i == 30000 && sc->sc_srb == ACA_RDW(sc, ACA_WRBR)) {
- printf("No response for fast path cfg\n");
- return 1;
- }
-
- ACA_RSTB(sc, ACA_ISRP_o, ~(SRB_RESP_INT));
-
-
- if ((SRB_INB(sc, sc->sc_srb, SRB_RETCODE) != 0)) {
- printf("cfg fast path returned: %02x\n",
- SRB_INB(sc, sc->sc_srb, SRB_RETCODE));
- return 1;
- }
-
- sc->sc_txca = SRB_INW(sc, sc->sc_srb, SRB_CFPRESP_FPXMIT);
- sc->sc_srb = SRB_INW(sc, sc->sc_srb, SRB_CFPRESP_SRBADDR);
- }
- else {
- if (sc->sc_init_status & RSP_16)
- sc->sc_maxmtu = sc->sc_dhb16maxsz;
- else
- sc->sc_maxmtu = sc->sc_dhb4maxsz;
-/*
- * XXX Not completely true because Fast Path Transmit has 514 byte buffers
- * XXX and TR_MAX_LINK_HDR is only correct when source-routing is used.
- * XXX depending on whether source routing is used change the calculation
- * XXX use IFM_TOK_SRCRT (IFF_LINK0)
- * XXX recompute sc_minbuf !!
- */
- sc->sc_maxmtu -= TR_MAX_LINK_HDR;
- }
- return 0;
-}
-
-int
-tr_attach(sc)
- struct tr_softc *sc;
-{
- int nmedia, *mediaptr, *defmediaptr;
- int i, temp;
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
-
- if (sc->sc_init_status & FAST_PATH_TRANSMIT) {
- bus_size_t srb;
- int nbuf = 0;
-
- srb = sc->sc_srb;
-
- switch (sc->sc_memsize) {
- case 65536:
- nbuf = 58;
- sc->sc_maxmtu = IPMTU_4MBIT_MAX;
- break;
- case 32768:
- nbuf = 29;
- sc->sc_maxmtu = IPMTU_4MBIT_MAX;
- break;
- case 16384:
- nbuf = 13;
- sc->sc_maxmtu = IPMTU_4MBIT_MAX;
- break;
- case 8192:
- nbuf = 5;
- sc->sc_maxmtu = ISO88025_MTU;
- }
-
- sc->sc_minbuf = ((sc->sc_maxmtu + 511) / 512) + 1;
- sc->sc_nbuf = nbuf;
-
-/*
- * Create circular queues caching the buffer pointers ?
- */
- }
- else {
-/*
- * MAX_MACFRAME_SIZE = DHB_SIZE - 6
- * IPMTU = MAX_MACFRAME_SIZE - (14 + 18 + 8)
- * (14 = header, 18 = sroute, 8 = llcsnap)
- */
-
- switch (sc->sc_memsize) {
- case 8192:
- sc->sc_dhb4maxsz = 2048;
- sc->sc_dhb16maxsz = 2048;
- break;
- case 16384:
- sc->sc_dhb4maxsz = 4096;
- sc->sc_dhb16maxsz = 4096;
- break;
- case 32768:
- sc->sc_dhb4maxsz = 4464;
- sc->sc_dhb16maxsz = 8192;
- break;
- case 65536:
- sc->sc_dhb4maxsz = 4464;
- sc->sc_dhb16maxsz = 8192;
- break;
- }
- switch (MM_INB(sc, TR_DHB4_OFFSET)) {
- case 0xF:
- if (sc->sc_dhb4maxsz > 2048)
- sc->sc_dhb4maxsz = 2048;
- break;
- case 0xE:
- if (sc->sc_dhb4maxsz > 4096)
- sc->sc_dhb4maxsz = 4096;
- break;
- case 0xD:
- if (sc->sc_dhb4maxsz > 4464)
- sc->sc_dhb4maxsz = 4464;
- break;
- }
-
- switch (MM_INB(sc, TR_DHB16_OFFSET)) {
- case 0xF:
- if (sc->sc_dhb16maxsz > 2048)
- sc->sc_dhb16maxsz = 2048;
- break;
- case 0xE:
- if (sc->sc_dhb16maxsz > 4096)
- sc->sc_dhb16maxsz = 4096;
- break;
- case 0xD:
- if (sc->sc_dhb16maxsz > 8192)
- sc->sc_dhb16maxsz = 8192;
- break;
- case 0xC:
- if (sc->sc_dhb16maxsz > 8192)
- sc->sc_dhb16maxsz = 8192;
- break;
- case 0xB:
- if (sc->sc_dhb16maxsz > 8192)
- sc->sc_dhb16maxsz = 8192;
- break;
- }
- }
-
- if (tr_config(sc))
- return 1;
-
- /*
- * init network-visible interface
- */
- bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
- ifp->if_softc = sc;
- ifp->if_ioctl = tr_ioctl;
- if (sc->sc_init_status & FAST_PATH_TRANSMIT)
- ifp->if_start = tr_start;
- else
- ifp->if_start = tr_oldstart;
- ifp->if_flags = IFF_BROADCAST | IFF_NOTRAILERS;
- ifp->if_watchdog = tr_watchdog;
- IFQ_SET_READY(&ifp->if_snd);
-
- switch (MM_INB(sc, TR_MEDIAS_OFFSET)) {
- case 0xF:
- nmedia = 1;
- mediaptr = &media[6];
- break;
- case 0xE:
- nmedia = 2;
- mediaptr = &media[0];
- break;
- case 0xD:
- nmedia = 1;
- mediaptr = &media[4];
- break;
- default:
- nmedia = 0;
- mediaptr = NULL;
- }
-
- switch (MM_INB(sc, TR_RATES_OFFSET)) {
- case 0xF:
- /* 4 Mbps */
- break;
- case 0xE:
- /* 16 Mbps */
- if (mediaptr)
- mediaptr += nmedia;
- break;
- case 0xD:
- /* 4/16 Mbps */
- nmedia *= 2;
- break;
- }
-
- switch (MM_INB(sc, TR_MEDIA_OFFSET)) {
- case 0xF:
- /* STP */
- defmediaptr = &media[6];
- break;
- case 0xE:
- /* UTP */
- defmediaptr = &media[4];
- break;
- case 0xD:
- /* STP and UTP == a single shielded RJ45 which supports both */
- /* XXX additional types in net/if_media.h ?? */
- defmediaptr = &media[4];
- break;
- default:
- defmediaptr = NULL;
- }
-
- if (defmediaptr && (sc->sc_init_status & RSP_16))
- ++defmediaptr;
-
- if (sc->sc_mediachange == NULL && sc->sc_mediastatus == NULL) {
- switch (MM_INB(sc, TR_TYP_OFFSET)) {
- case 0x0D:
- case 0x0C:
- sc->sc_mediachange = tropic_mediachange;
- sc->sc_mediastatus = tropic_mediastatus;
- }
- }
-
- ifmedia_init(&sc->sc_media, 0, tr_mediachange, tr_mediastatus);
- if (mediaptr != NULL) {
- for (i = 0; i < nmedia; i++)
- ifmedia_add(&sc->sc_media, mediaptr[i], 0, NULL);
- if (defmediaptr)
- ifmedia_set(&sc->sc_media, *defmediaptr);
- else
- ifmedia_set(&sc->sc_media, 0);
- }
- else {
- ifmedia_add(&sc->sc_media, IFM_TOKEN | IFM_MANUAL, 0, NULL);
- ifmedia_set(&sc->sc_media, IFM_TOKEN | IFM_MANUAL);
- }
-
- if_attach(ifp);
-
- for (i = 0, temp = 0; i < ISO88025_ADDR_LEN; i++, temp += 4) {
- sc->sc_arpcom.ac_enaddr[i] =
- (MM_INB(sc, (TR_MAC_OFFSET + temp)) & 0xf) << 4;
- sc->sc_arpcom.ac_enaddr[i] |=
- MM_INB(sc, (TR_MAC_OFFSET + temp + 2)) & 0xf;
- }
-
- token_ifattach(ifp);
-
- printf("\n%s: address %s ring speed %d Mbps\n",
- sc->sc_dev.dv_xname, token_sprintf(sc->sc_arpcom.ac_enaddr),
- (sc->sc_init_status & RSP_16) ? 16 : 4);
-
-#if NBPFILTER > 0
- bpfattach(&ifp->if_bpf, ifp, DLT_IEEE802, sizeof(struct token_header));
-#endif
-
-/*
- * XXX rnd stuff
- */
- shutdownhook_establish(tr_shutdown, sc);
- return 0;
-}
-
-int
-tr_setspeed(sc, speed)
-struct tr_softc *sc;
-u_int8_t speed;
-{
- SRB_OUTB(sc, sc->sc_srb, SRB_CMD, DIR_SET_DEFAULT_RING_SPEED);
- SRB_OUTB(sc, sc->sc_srb, CMD_RETCODE, 0xfe);
- SRB_OUTB(sc, sc->sc_srb, SRB_SET_DEFRSP, speed);
- /* Tell adapter: command in SRB. */
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
-
- /* Wait for it to complete. */
- tr_sleep(sc);
-
- if ((SRB_INB(sc, sc->sc_srb, SRB_RETCODE) != 0)) {
- printf("set default ringspeed returned: %02x\n",
- SRB_INB(sc, sc->sc_srb, SRB_RETCODE));
- return 1;
- }
- return 0;
-}
-
-int
-tr_mediachange(ifp)
- struct ifnet *ifp;
-{
- struct tr_softc *sc = ifp->if_softc;
-
- if (sc->sc_mediachange)
- return ((*sc->sc_mediachange)(sc));
- return EINVAL;
-}
-
-void
-tr_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct tr_softc *sc = ifp->if_softc;
-
-/* set LINK0 and/or LINK1 */
- if (sc->sc_mediastatus)
- (*sc->sc_mediastatus)(sc, ifmr);
-}
-
-int
-tr_reset(sc)
-struct tr_softc *sc;
-{
- int i;
-
- sc->sc_srb = 0;
-
- /*
- * Reset the card.
- */
- /* latch on an unconditional adapter reset */
- bus_space_write_1(sc->sc_piot, sc->sc_pioh, TR_RESET, 0);
- delay(50000); /* delay 50ms */
- /*
- * XXX set paging if we have the right type of card
- */
- /* turn off adapter reset */
- bus_space_write_1(sc->sc_piot, sc->sc_pioh, TR_RELEASE, 0);
-
- /* Enable interrupts. */
-
- ACA_SETB(sc, ACA_ISRP_e, INT_ENABLE);
-
- /* Wait for an answer from the adapter. */
-
- for (i = 0; i < 35000; i++) {
- if (ACA_RDB(sc, ACA_ISRP_o) & SRB_RESP_INT)
- break;
- delay(100);
- }
-
- if (i == 35000 && sc->sc_srb == 0) {
- printf("No response from adapter after reset\n");
- return 1;
- }
-
- ACA_RSTB(sc, ACA_ISRP_o, ~(SRB_RESP_INT));
-
- ACA_OUTB(sc, ACA_RRR_e, (sc->sc_maddr >> 12));
- sc->sc_srb = ACA_RDW(sc, ACA_WRBR);
- if (SRB_INB(sc, sc->sc_srb, SRB_CMD) != 0x80) {
- printf("Initialization incomplete, status: %02x\n",
- SRB_INB(sc, sc->sc_srb, SRB_CMD));
- return 1;
- }
- if (SRB_INB(sc, sc->sc_srb, SRB_INIT_BUC) != 0) {
- printf("Bring Up Code %02x\n",
- SRB_INB(sc, sc->sc_srb, SRB_INIT_BUC));
- return 1;
- }
-
- sc->sc_init_status = SRB_INB(sc, sc->sc_srb, SRB_INIT_STATUS);
-
- sc->sc_xmit_head = sc->sc_xmit_tail = 0;
-
- /* XXX should depend on sc_resvdmem. */
- if (MM_INB(sc, TR_RAM_OFFSET) == 0xB && sc->sc_memsize == 65536)
- for (i = 0; i < 512; i++)
- SR_OUTB(sc, 0xfe00 + i, 0);
- return 0;
-}
-
-/*
- * tr_stop - stop interface (issue a DIR CLOSE ADAPTER command)
- */
-void
-tr_stop(sc)
-struct tr_softc *sc;
-{
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
-
- if ((ifp->if_flags & IFF_RUNNING) != 0) {
-/*
- * transmitter cannot be used from now on
- */
- ifp->if_flags |= IFF_OACTIVE;
-
- /* Close command. */
- SRB_OUTB(sc, sc->sc_srb, SRB_CMD, DIR_CLOSE);
- /* Tell adapter: command in SRB. */
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
-
- /* Wait for it to complete. */
- tr_sleep(sc);
- sc->sc_srb = ACA_RDW(sc, ACA_WRBR);
- }
-}
-
-static void
-tr_shutdown(arg)
- void *arg;
-{
- struct tr_softc *sc = arg;
-
- tr_stop(sc);
-}
-
-void
-tr_reinit(arg)
- void *arg;
-{
- if (tr_reset((struct tr_softc *) arg))
- return;
- if (tr_config((struct tr_softc *) arg))
- return;
- tr_init(arg);
-}
-
-/*
- * tr_init - initialize network interface, open adapter for packet
- * reception and start any pending output
- */
-void
-tr_init(arg)
- void *arg;
-{
- struct tr_softc *sc = arg;
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
- bus_size_t open_srb;
- int s, num_dhb;
- int resvdmem, availmem, dhbsize;
-
- if ((ifp->if_flags & IFF_RUNNING) != 0)
- return;
-
- s = splnet();
-
- ifp->if_flags &= ~IFF_OACTIVE;
- sc->sc_xmit_head = sc->sc_xmit_tail = 0; /* XXX tr_reset() */
-
- open_srb = sc->sc_srb;
-
- /* Zero SRB. */
- bus_space_set_region_1(sc->sc_memt, sc->sc_sramh,
- open_srb, 0, SRB_OPEN_CMDSIZE);
-
- /* Open command. */
- SRB_OUTB(sc, open_srb, SRB_CMD, DIR_OPEN_ADAPTER);
-/*
- * XXX handle IFM_TOK_ETR !!!!
- */
- /* Set open parameters in SRB. */
- SRB_OUTW(sc, open_srb, SRB_OPEN_OPTIONS, OPEN_PASS_BCON_MAC);
-
- num_dhb = 1;
-
- if ((sc->sc_init_status & FAST_PATH_TRANSMIT) == 0) {
- availmem = sc->sc_memsize;
- resvdmem = RESVDMEM_SIZE + sc->sc_memreserved;
-
- /* allow MAX of two SAPS */
- SRB_OUTB(sc, open_srb, SRB_OPEN_DLCMAXSAP, 2);
- resvdmem += 2 * SAPCB_SIZE;
-
- /* allow MAX of 4 stations */
- SRB_OUTB(sc, open_srb, SRB_OPEN_DLCMAXSTA, 4);
- resvdmem += 4 * LSCB_SIZE;
-
- if (sc->sc_init_status & RSP_16) {
- dhbsize = sc->sc_dhb16maxsz;
- }
- else {
- dhbsize = sc->sc_dhb4maxsz;
- }
-#if 0 /* XXXchb unneeded? */
- if (dhbsize > 2048)
- num_dhb = 2;
-#endif
- SRB_OUTW(sc, open_srb, SRB_OPEN_DHBLEN, dhbsize);
- sc->sc_nbuf = (dhbsize + 511) / 512;
- /*
- * Try to leave room for two fullsized packets when
- * requesting DHBs.
- */
- availmem -= resvdmem;
- num_dhb = (availmem / dhbsize) - 2;
- if (num_dhb > 2)
- num_dhb = 2; /* firmware can't cope with more DHBs */
- if (num_dhb < 1)
- num_dhb = 1; /* we need at least one */
- }
- else
- SRB_OUTW(sc, open_srb, SRB_OPEN_DHBLEN, DHB_LENGTH);
-
- SRB_OUTB(sc, open_srb, SRB_OPEN_NUMDHB, num_dhb);
- SRB_OUTW(sc, open_srb, SRB_OPEN_RCVBUFLEN, RCV_BUF_LEN);
- SRB_OUTW(sc, open_srb, SRB_OPEN_NUMRCVBUF, sc->sc_nbuf);
-
- /* Tell adapter: command in SRB. */
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
-
- splx(s);
-}
-
-/*
- * tr_oldstart - Present transmit request to adapter
- */
-void
-tr_oldstart(ifp)
-struct ifnet *ifp;
-{
- struct tr_softc *sc = ifp->if_softc;
- bus_size_t srb = sc->sc_srb;
-
- if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
- return;
-
- ifp->if_flags |= IFF_OACTIVE;
-
- /* Load SRB to request transmit. */
- SRB_OUTB(sc, srb, SRB_CMD, XMIT_UI_FRM);
- SRB_OUTW(sc, srb, XMIT_STATIONID, sc->exsap_station);
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
-}
-
-void
-tr_start(ifp)
-struct ifnet *ifp;
-{
- struct tr_softc *sc = ifp->if_softc;
- bus_size_t first_txbuf, txbuf;
- struct mbuf *m0, *m;
- int size, bufspace;
- bus_size_t framedata;
-
- if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
- return;
-
-
-next:
- if (sc->sc_xmit_buffers < sc->sc_minbuf)
- return;
-
- /* if data in queue, copy mbuf chain to fast path buffers */
- IFQ_DEQUEUE(&ifp->if_snd, m0);
-
- if (m0 == 0)
- return;
-#if NBPFILTER > 0
- if (ifp->if_bpf)
- bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT);
-#endif
- first_txbuf = txbuf = TXCA_INW(sc, TXCA_FREE_QUEUE_HEAD) - XMIT_NEXTBUF;
- framedata = txbuf + XMIT_FP_DATA;
- size = 0;
- bufspace = FP_BUF_LEN - XMIT_FP_DATA;
- --sc->sc_xmit_buffers;
- for (m = m0; m; m = m->m_next) {
- int len = m->m_len;
- char *ptr = mtod(m, char *);
-
- while (len >= bufspace) {
- --sc->sc_xmit_buffers;
- bus_space_write_region_1(sc->sc_memt, sc->sc_sramh,
- framedata, ptr, bufspace);
- size += bufspace;
- ptr += bufspace;
- len -= bufspace;
- TXB_OUTW(sc, txbuf, XMIT_BUFLEN,
- (FP_BUF_LEN - XMIT_FP_DATA));
- txbuf = TXB_INW(sc, txbuf, XMIT_NEXTBUF) - XMIT_NEXTBUF;
- framedata = txbuf + XMIT_FP_DATA;
- bufspace = FP_BUF_LEN - XMIT_FP_DATA;
- }
- if (len > 0) {
- bus_space_write_region_1(sc->sc_memt, sc->sc_sramh,
- framedata, ptr, len);
- size += len;
- bufspace -= len;
- framedata += len;
- }
- }
- TXB_OUTW(sc, txbuf, XMIT_BUFLEN, (FP_BUF_LEN - XMIT_FP_DATA - bufspace));
- m_freem(m0); /* free mbuf chain */
-
- TXB_OUTB(sc, first_txbuf, XMIT_RETCODE, 0xfe);
- TXB_OUTW(sc, first_txbuf, XMIT_FRAMELEN, size);
- TXB_OUTW(sc, first_txbuf, XMIT_LASTBUF, (txbuf + XMIT_NEXTBUF));
- TXB_OUTB(sc, first_txbuf, XMIT_CMD, XMIT_DIR_FRAME);
- TXB_OUTW(sc, first_txbuf, XMIT_STATIONID, 0);
- TXB_OUTB(sc, first_txbuf, XMIT_CMDCORR, sc->sc_xmit_correlator);
- sc->sc_xmit_correlator = (sc->sc_xmit_correlator + 1) & 0x7f;
-
- /*
- * To prevent race conditions on 8-bit cards when reading or writing
- * 16-bit values. See page 4-12 of the IBM manual.
- */
- TXCA_OUTW(sc, TXCA_FREE_QUEUE_HEAD, 1);
- TXCA_OUTW(sc, TXCA_FREE_QUEUE_HEAD, TXB_INW(sc, txbuf, XMIT_NEXTBUF));
-
- ACA_SETB(sc, ACA_ISRA_o, XMIT_REQ);
-
- ifp->if_flags |= IFF_OACTIVE;
- ifp->if_opackets++;
-#if 1
-/* XXX do while construction */
- goto next;
-#endif
-}
-
-/*
- * tr_intr - interrupt handler. Find the cause of the interrupt and
- * service it.
- */
-int
-tr_intr(arg)
- void *arg;
-{
- struct tr_softc *sc = arg;
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
- u_char status; /* holds status from adapter status register */
- u_char command; /* holds command from status or request block */
- u_char retcode; /* holds return value from status or request block */
- int rc = 0; /* 0 = unclaimed interrupt, 1 = interrupt claimed */
-
- status = ACA_RDB(sc, ACA_ISRP_o);
- while (status != 0) {
-
- /* Is this interrupt caused by an adapter check? */
- if (status & ADAP_CHK_INT) {
- printf("%s: adapter check 0x%04x\n",
- sc->sc_dev.dv_xname,
- (unsigned int)ntohs(ACA_RDW(sc, ACA_WWCR)));
-
- /* Clear this interrupt bit */
- ACA_RSTB(sc, ACA_ISRP_o, ~(ADAP_CHK_INT));
-
- rc = 1; /* Claim interrupt. */
- break; /* Terminate loop. */
- }
- else if (status & XMIT_COMPLETE) {
- ACA_RSTB(sc, ACA_ISRP_o, ~(XMIT_COMPLETE));
- tr_xint(sc);
- rc = 1;
- }
-
- /*
- * Process SRB_RESP_INT, ASB_FREE_INT, ARB_CMD_INT
- * & SSB_RESP_INT in that order, ISRP-L Hi to Lo
- */
- else if (status & SRB_RESP_INT) { /* Adapter response in SRB? */
- bus_size_t sap_srb;
- bus_size_t srb;
-#ifdef TROPICDEBUG
- bus_size_t log_srb;
-#endif
- if (sc->sc_srb == 0)
- sc->sc_srb = ACA_RDW(sc, ACA_WRBR);
- srb = sc->sc_srb; /* pointer to SRB */
- retcode = SRB_INB(sc, srb, SRB_RETCODE);
- command = SRB_INB(sc, srb, SRB_CMD);
- switch (command) {
- case 0x80: /* 0x80 == initialization complete */
- case DIR_CONFIG_FAST_PATH_RAM:
- break;
- case XMIT_DIR_FRAME: /* Response to xmit request */
- case XMIT_UI_FRM: /* Response to xmit request */
- /* Response not valid? */
- if (retcode != 0xff)
- printf("%s: error on xmit request =%x\n",
- sc->sc_dev.dv_xname, retcode);
- break;
-
- case DIR_OPEN_ADAPTER: /* open-adapter-cmd response */
- /* Open successful? */
- if (retcode == 0) {
- ifp->if_flags |= IFF_UP | IFF_RUNNING;
- /* Save new ACA ctrl block addresses */
- sc->sc_ssb = SRB_INW(sc, srb,
- SRB_OPENRESP_SSBADDR);
- sc->sc_arb = SRB_INW(sc, srb,
- SRB_OPENRESP_ARBADDR);
- sc->sc_srb = SRB_INW(sc, srb,
- SRB_OPENRESP_SRBADDR);
- sc->sc_asb = SRB_INW(sc, srb,
- SRB_OPENRESP_ASBADDR);
-
- /*
- * XXX, what about LLC_{X25,ISO}_LSAP ?
- * open two more saps .....
- */
- if (sc->sc_init_status &
- FAST_PATH_TRANSMIT) {
- sc->sc_xmit_buffers =
- TXCA_INW(sc, TXCA_BUFFER_COUNT);
- sc->sc_nbuf =
- sc->sc_xmit_buffers;
-#ifdef TROPICDEBUG
- printf("buffers = %d\n",
- sc->sc_xmit_buffers);
-#endif
- sc->sc_xmit_correlator = 0;
- wakeup(&sc->tr_sleepevent);
- }
- else
- tr_opensap(sc, LLC_SNAP_LSAP);
- }
- else {
- printf("%s: Open error = %x\n",
- sc->sc_dev.dv_xname,
- SRB_INB(sc, srb, SRB_RETCODE));
- ifp->if_flags &= ~IFF_RUNNING;
- ifp->if_flags &= ~IFF_UP;
-/*
- * XXX untimeout depending on the error, timeout in other cases
- * XXX error 0x24 && autospeed mode: open again !!!!
- */
- if (!timeout_initialized(&sc->init_timeout))
- timeout_set(&sc->init_timeout,
- tr_init, sc);
- timeout_add(&sc->init_timeout, hz * 30);
- }
- break;
-
- case DIR_CLOSE: /* Response to close adapter command */
- /* Close not successful? */
- if (retcode != 0)
- printf("%s: close error = %x\n",
- sc->sc_dev.dv_xname, retcode);
- else {
- ifp->if_flags &= ~IFF_RUNNING;
- ifp->if_flags &= ~IFF_UP;
- ifp->if_flags &= ~IFF_OACTIVE;
- wakeup(&sc->tr_sleepevent);
- }
- break;
- case DIR_SET_DEFAULT_RING_SPEED:
- wakeup(&sc->tr_sleepevent);
- break;
-
- case DLC_OPEN_SAP: /* Response to open sap cmd */
- sap_srb = sc->sc_srb;
- if (SRB_INB(sc, sap_srb, SRB_OPNSAP_SAPVALUE)
- == LLC_SNAP_LSAP)
- sc->exsap_station =
- SRB_INW(sc, sap_srb,
- SRB_OPNSAP_STATIONID);
- printf("%s: Token Ring opened\n",
- sc->sc_dev.dv_xname);
- wakeup(&sc->tr_sleepevent);
- break;
-/* XXX DLC_CLOSE_SAP not needed ? */
- case DLC_CLOSE_SAP: /* Response to close sap cmd */
- break;
- case DIR_READ_LOG: /* Response to read log */
- /* Cmd not successful? */
- if (retcode != 0)
- printf("%s: read error log cmd err =%x\n",
- sc->sc_dev.dv_xname, retcode);
-#ifdef TROPICDEBUG
- log_srb = sc->sc_srb;
- printf("%s: ERROR LOG:\n",sc->sc_dev.dv_xname);
- printf("%s: Line=%d, Internal=%d, Burst=%d\n",
- sc->sc_dev.dv_xname,
- (SRB_INB(sc, log_srb, SRB_LOG_LINEERRS)),
- (SRB_INB(sc, log_srb, SRB_LOG_INTERRS)),
- (SRB_INB(sc, log_srb, SRB_LOG_BRSTERRS)));
- printf("%s: A/C=%d, Abort=%d, Lost frames=%d\n",
- sc->sc_dev.dv_xname,
- (SRB_INB(sc, log_srb, SRB_LOG_ACERRS)),
- (SRB_INB(sc, log_srb, SRB_LOG_ABRTERRS)),
- (SRB_INB(sc, log_srb, SRB_LOG_LOSTFRMS)));
- printf("%s: Receive congestion=%d, Frame copied=%d, Frequency=%d\n",
- sc->sc_dev.dv_xname,
- (SRB_INB(sc, log_srb, SRB_LOG_RCVCONG)),
- (SRB_INB(sc, log_srb, SRB_LOG_FCPYERRS)),
- (SRB_INB(sc, log_srb, SRB_LOG_FREQERRS)));
- printf("%s: Token=%d\n",sc->sc_dev.dv_xname,
- (SRB_INB(sc, log_srb, SRB_LOG_TOKENERRS)));
-#endif /* TROPICDEBUG */
- ifp->if_flags &= ~IFF_OACTIVE;
- break;
- default:
- printf("%s: bad SRB command encountered %x\n",
- sc->sc_dev.dv_xname, command);
- break;
- }
- /* clear the SRB-response interrupt bit */
- ACA_RSTB(sc, ACA_ISRP_o, ~(SRB_RESP_INT));
-
- }
-
- else if (status & ASB_FREE_INT) { /* Is ASB Free? */
- bus_size_t asb = sc->sc_asb;
-
- /*
- * Remove message from asb queue, first element in
- * structure is the command. command == REC_DATA?
- * size = 8 : size = 10
- * reply in isra_l with (RESP_IN_ASB | ASB_FREE)
- */
- retcode = ASB_INB(sc, asb, CMD_RETCODE);
- command = ASB_INB(sc, asb, CMD_CMD);
- switch (command) {
- case REC_DATA: /* Receive */
- /* Response not valid? */
- if (retcode != 0xff)
- printf("%s: ASB bad receive response =%x\n",
- sc->sc_dev.dv_xname, retcode);
- break;
- case XMIT_DIR_FRAME: /* Transmit */
- case XMIT_UI_FRM: /* Transmit */
- /* Response not valid? */
- if (retcode != 0xff)
- printf("%s: ASB response err on xmit =%x\n",
- sc->sc_dev.dv_xname, retcode);
- break;
- default:
- printf("%s: Invalid command in ASB =%x\n",
- sc->sc_dev.dv_xname, command);
- break;
- }
- /* Clear this interrupt bit */
- ACA_RSTB(sc, ACA_ISRP_o, ~(ASB_FREE_INT));
- }
- else if (status & ARB_CMD_INT) { /* Command for PC to handle? */
- bus_size_t arb = sc->sc_arb;
-
- command = ARB_INB(sc, arb, ARB_CMD);
- switch (command) {
- case DLC_STATUS: /* DLC status change */
- printf("%s: ARB new DLC status = 0x%x\n",
- sc->sc_dev.dv_xname,
- ARB_INW(sc, arb, ARB_DLCSTAT_STATUS));
- break;
- case REC_DATA: /* Adapter has data for PC */
- /* Call receive interrupt handler */
- tr_rint(sc);
- break;
-
- case RING_STAT_CHANGE: /* Ring status change */
- if (ARB_INW(sc, arb, ARB_RINGSTATUS) &
- (SIGNAL_LOSS + LOBE_FAULT)){
- printf("%s: SIGNAL LOSS/LOBE FAULT\n",
- sc->sc_dev.dv_xname);
- ifp->if_flags &= ~IFF_RUNNING;
- ifp->if_flags &= ~IFF_UP;
- IFQ_PURGE(&ifp->if_snd);
- if (!timeout_initialized(&sc->reinit_timeout))
- timeout_set(&sc->reinit_timeout,
- tr_reinit, sc);
- timeout_add(&sc->reinit_timeout, hz * 30);
- }
- else {
-#ifdef TROPICDEBUG
- if (ARB_INW(sc, arb, ARB_RINGSTATUS) &
- ~(SOFT_ERR))
- printf(
- "%s: ARB new ring status = 0x%x\n",
- sc->sc_dev.dv_xname,
- ARB_INW(sc, arb,
- ARB_RINGSTATUS));
-#endif /* TROPICDEBUG */
- }
- if (ARB_INW(sc, arb, ARB_RINGSTATUS) &
- LOG_OFLOW){
-/*
- * XXX CMD_IN_SRB, handle with SRB_FREE_INT ?
- */
- ifp->if_flags |= IFF_OACTIVE;
- SRB_OUTB(sc, sc->sc_srb, SRB_CMD,
- DIR_READ_LOG);
- /* Read & reset err log cmnd in SRB. */
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
- }
- break;
-
- case XMIT_DATA_REQ: /* Adapter wants data to transmit */
- /* Call transmit interrupt handler */
- tr_oldxint(sc);
- break;
-
- default:
- printf("%s: Invalid command in ARB =%x\n",
- sc->sc_dev.dv_xname, command);
- break;
- }
-
- /* Clear this interrupt bit */
- ACA_RSTB(sc, ACA_ISRP_o, ~(ARB_CMD_INT));
-
- /* Tell adapter that ARB is now free */
- ACA_SETB(sc, ACA_ISRA_o, ARB_FREE);
- }
-
-
- else if (status & SSB_RESP_INT) { /* SSB resp. to SRB cmd? */
- bus_size_t ssb = sc->sc_ssb;
-
- retcode = SSB_INB(sc, ssb, SSB_RETCODE);
- command = SSB_INB(sc, ssb, SSB_CMD);
- switch (command) {
- case XMIT_UI_FRM:
- case XMIT_DIR_FRAME: /* SSB response to SRB xmit cmd */
- /* collect status on last packet */
- if (retcode != 0) {
- printf("xmit return code = 0x%x\n",
- retcode);
- /* XXXchb */
- if (retcode == 0x22) {
- printf("FS = 0x%2x\n",
- SSB_INB(sc, ssb,
- SSB_XMITERR));
- }
- ifp->if_oerrors++;
- }
- else
- ifp->if_opackets++;
-
- ifp->if_flags &= ~IFF_OACTIVE;
-/*
- * XXX should this be done here ?
- */
- /* if data on send queue */
- if (!IFQ_IS_EMPTY(&ifp->if_snd))
- tr_oldstart(ifp);
- break;
-
- case XMIT_XID_CMD:
- printf("tr_int: xmit XID return code = 0x%x\n",
- retcode);
- break;
- default:
- printf("%s: SSB error, invalid command =%x\n",
- sc->sc_dev.dv_xname, command);
- }
- /* clear this interrupt bit */
- ACA_RSTB(sc, ACA_ISRP_o, ~(SSB_RESP_INT));
-
- /* tell adapter that SSB is available */
- ACA_SETB(sc, ACA_ISRA_o, SSB_FREE);
- }
- rc = 1; /* Claim responsibility for interrupt */
- status = ACA_RDB(sc, ACA_ISRP_o);
- }
- /* Is this interrupt caused by an adapter error or access violation? */
- if (ACA_RDB(sc, ACA_ISRP_e) & (TCR_INT | ERR_INT | ACCESS_INT)) {
- printf("%s: adapter error, ISRP_e = %x\n",
- sc->sc_dev.dv_xname, ACA_RDB(sc, ACA_ISRP_e));
-
- /* Clear these interrupt bits */
- ACA_RSTB(sc, ACA_ISRP_e, ~(TCR_INT | ERR_INT | ACCESS_INT));
- rc = 1; /* Claim responsibility for interrupt */
-
- }
-
- /* Clear IRQ latch in order to reenable interrupts. */
- bus_space_write_1(sc->sc_piot, sc->sc_pioh, TR_CLEARINT, 0);
- return (rc);
-}
-
-#ifdef notyet
-int asb_reply_rcv()
-{
-}
-
-int asb_reply_xmit()
-{
-}
-
-int asb_response(bus_size_t asb, size_t len)
-{
- if (empty_queue) {
- answer with RESP_IN_ASB | ASB_FREE
- }
- else {
- put asb in queue
- }
-}
-#endif
-
-
-/*
- * U-B receive interrupt.
- *
- * in the original version, this routine had three tasks:
- *
- * 1. move the data into the receive buffer and set up various pointers
- * in the tr_softc struct
- * 2. switch on the type field for ip and arp, dropping all else
- * 3. resetting the adaptor status block info (asb) and updating the
- * tr_softc struct
- * determine lan message type, pull packet off interface and
- * pass to an appropriate higher-level routine
- *
- */
-void
-tr_rint(sc)
-struct tr_softc *sc;
-{
- bus_size_t arb = sc->sc_arb;
- bus_size_t asb = sc->sc_asb;
- struct rbcb *rbc = &sc->rbc;
- struct mbuf *m;
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
-
-#ifdef TROPICDEBUG
- printf("tr_rint: arb.command = %x, arb.station_id= %x\n",
- ARB_INB(sc, arb, ARB_CMD), ARB_INW(sc, arb, ARB_STATIONID));
- printf("arb.buf_addr = %x, arb.lan_hdr_len = %x\n",
- ARB_INW(sc, arb, ARB_RXD_BUFADDR),
- ARB_INB(sc, arb, ARB_RXD_LANHDRLEN));
- printf("arb.dlc_hdr_len = %d, arb.frame_len = %d\n",
- ARB_INB(sc, arb, ARB_RXD_DLCHDRLEN),
- ARB_INW(sc, arb, ARB_RXD_FRAMELEN));
- printf("arb.msg_type = %x\n", ARB_INB(sc, arb, ARB_RXD_MSGTYPE));
-#endif /* TROPICDEBUG */
- /*
- * copy the offset in RAM of the first receive buffer from the
- * receive-data block of the adapter request block associated
- * with the unit's softc struct into the receive control block.
- */
- rbc->rbufp = ARB_INW(sc, arb, ARB_RXD_BUFADDR);
-
- /*
- * copy the pointer to data in first receive buffer
- */
- rbc->rbuf_datap = rbc->rbufp + RB_DATA;
- /*
- * the token-ring header is viewed as two header structs: the physical
- * header (aka TR header) with access, frame, dest, src, and routing
- * information, and the logical link control header (aka LLC header)
- * with dsap, ssap, llc, proto and type fields.
- *
- * rfc1042 requires support for unnumbered information (UI) commands,
- * but does not specify a required semantic, so we'll discard them.
- *
- */
-
- /*
- * if there is a second receive buffer, set up the next pointer
- */
- if (RB_INW(sc, rbc->rbufp, RB_NEXTBUF))
- rbc->rbufp_next = RB_INW(sc, rbc->rbufp, RB_NEXTBUF) -
- RB_NEXTBUF;
- else
- rbc->rbufp_next = 0; /* we're finished */
-
- rbc->data_len = RB_INW(sc, rbc->rbufp, RB_BUFLEN);
- /*
- * At this point we move the packet from the adapter to a chain
- * of mbufs
- */
- m = tr_get(sc, ARB_INW(sc, arb, ARB_RXD_FRAMELEN), ifp);
-/*
- * XXX Clear ARB interrupt here?
- */
-/*
- * XXX create a queue where the responses are buffered
- * XXX but is it really needed ?
- */
-
- if (ASB_INB(sc, asb, RECV_RETCODE) != 0xff)
- printf("tr_rint: ASB IS NOT FREE!!!\n");
- /*
- * Load receive response into ASB.
- */
- ASB_OUTB(sc, asb, RECV_CMD, REC_DATA);
- ASB_OUTW(sc, asb, RECV_STATIONID, ARB_INW(sc, arb, ARB_STATIONID));
- ASB_OUTW(sc, asb, RECV_RESP_RECBUFADDR,
- ARB_INW(sc, arb, ARB_RXD_BUFADDR));
-
- if (m == 0) {
- /*
- * Tell adapter data lost, no mbufs.
- */
- ASB_OUTB(sc, asb, RECV_RETCODE, 0x20);
- ACA_SETB(sc, ACA_ISRA_o, RESP_IN_ASB);
- ++ifp->if_ierrors;
-#ifdef TROPICDEBUG
- printf("tr_rint: packet dropped\n");
-#endif /* TROPICDEBUG */
- }
- else {
- /*
- * Indicate successful receive.
- */
- ASB_OUTB(sc, asb, RECV_RETCODE, 0);
- ACA_SETB(sc, ACA_ISRA_o, RESP_IN_ASB);
- ++ifp->if_ipackets;
-
-#if NBPFILTER > 0
- if (ifp->if_bpf)
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
- token_input(ifp, m);
- }
-}
-
-/*
- * Interrupt handler for old style "adapter requires data to transmit".
- */
-void
-tr_oldxint(sc)
-struct tr_softc *sc;
-{
- bus_size_t arb = sc->sc_arb; /* pointer to ARB */
- bus_size_t asb = sc->sc_asb; /* pointer to ASB */
- bus_size_t dhb; /* pointer to DHB */
- struct mbuf *m0; /* pointer to top of mbuf chain */
- u_short size = 0;
- char command;
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
- struct token_header *trh;
- int i;
- u_int8_t hlen;
-
-/*
- * XXX xmit_asb_response()
- */
- if (ASB_INB(sc, asb, XMIT_RETCODE) != 0xff)
- printf("tr_oldxint: ASB IS NOT FREE!!!\n");
-
- /* load parameters into ASB */
- ASB_OUTB(sc, asb, XMIT_CMDCORR, ARB_INB(sc, arb, ARB_XMT_CMDCORR));
- ASB_OUTW(sc, asb, XMIT_STATIONID, ARB_INW(sc, arb, ARB_STATIONID));
- ASB_OUTB(sc, asb, XMIT_RETCODE, 0);
-/*
- * XXX LLC_{X25,ISO}_LSAP
- */
- ASB_OUTB(sc, asb, XMIT_REMSAP, LLC_SNAP_LSAP);
-
- /* XXX if num_dhb == 2 this should alternate between the two buffers */
- dhb = ARB_INW(sc, arb, ARB_XMT_DHBADDR);
-
- command = SRB_INB(sc, sc->sc_srb, SRB_CMD);
-
- if (command == XMIT_XID_CMD || command == XMIT_TEST_CMD) {
- ASB_OUTB(sc, asb, XMIT_CMD, command);
- ASB_OUTW(sc, asb, XMIT_FRAMELEN, 0x11);
-/*
- * XXX 0xe == sizeof(struct token_header)
- */
- ASB_OUTB(sc, asb, XMIT_HDRLEN, 0x0e);
-
- SR_OUTB(sc, (dhb + 0), TOKEN_AC);
- SR_OUTB(sc, (dhb + 1), TOKEN_FC);
- /* Load destination and source addresses. */
- for (i=0; i < ISO88025_ADDR_LEN; i++) {
- SR_OUTB(sc, (dhb + 2 + i), 0xff);
- SR_OUTB(sc, (dhb + 8 + i), 0x00);
- }
- }
- else {
-/*
- * XXX what's command here ? command = 0x0d (always ?)
- */
- /* if data in queue, copy mbuf chain to DHB */
- IFQ_DEQUEUE(&ifp->if_snd, m0);
- if (m0 != 0) {
-#if NBPFILTER > 0
- if (ifp->if_bpf)
- bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT);
-#endif
- /* Pull packet off interface send queue, fill DHB. */
- trh = mtod(m0, struct token_header *);
- hlen = sizeof(struct token_header);
- if (trh->token_shost[0] & TOKEN_RI_PRESENT) {
-/*
- * XXX assumes route info is in the same mbuf as the token-ring header
- */
- struct token_rif *rif;
-
- rif = TOKEN_RIF(trh);
- hlen += ((ntohs(rif->tr_rcf) & TOKEN_RCF_LEN_MASK) >> 8);
- }
- size = tr_mbcopy(sc, dhb, m0);
- m_freem(m0);
-
- ASB_OUTB(sc, asb, XMIT_CMD, XMIT_UI_FRM);
- ASB_OUTB(sc, asb, XMIT_HDRLEN, hlen);
-
- /* Set size of transmission frame in ASB. */
- ASB_OUTW(sc, asb, XMIT_FRAMELEN, size);
- }
- else {
- printf("%s: unexpected empty mbuf send queue\n",
- sc->sc_dev.dv_xname);
-
- /* Set size of transmission frame in ASB to zero. */
- ASB_OUTW(sc, asb, XMIT_FRAMELEN, 0);
- }
- }
-/*
- * XXX asb_response(void *asb, len)
- */
- /* tell adapter that there is a response in the ASB */
- ACA_SETB(sc, ACA_ISRA_o, RESP_IN_ASB);
-}
-
-/*
- * Interrupt handler for fast path transmit complete
- */
-void
-tr_xint(sc)
-struct tr_softc *sc;
-{
- u_short tail;
- struct ifnet *ifp = &sc->sc_arpcom.ac_if;
- bus_size_t txbuf;
-
- /*
- * To prevent race conditions on 8-bit cards when reading or writing
- * 16-bit values. See page 4-12 of the IBM manual.
- * XXX use volatile ?
- */
- do {
- tail = TXCA_INW(sc, TXCA_COMPLETION_QUEUE_TAIL);
- } while (tail != TXCA_INW(sc, TXCA_COMPLETION_QUEUE_TAIL));
- while (tail != TXCA_INW(sc, TXCA_FREE_QUEUE_TAIL)) {
- txbuf = TXCA_INW(sc, TXCA_FREE_QUEUE_TAIL) - XMIT_NEXTBUF;
- txbuf = TXB_INW(sc, txbuf, XMIT_NEXTBUF) - XMIT_NEXTBUF;
- if (TXB_INB(sc, txbuf, XMIT_RETCODE) != 0) {
- ifp->if_oerrors++;
- printf("tx: retcode = %x\n",
- TXB_INB(sc, txbuf, XMIT_RETCODE));
- }
- sc->sc_xmit_buffers +=
- (TXB_INW(sc, txbuf, XMIT_FRAMELEN) + 514 - 1) / 514;
- tail = TXB_INW(sc, txbuf, XMIT_LASTBUF);
- TXCA_OUTW(sc, TXCA_FREE_QUEUE_TAIL, tail);
- tail = TXCA_INW(sc, TXCA_COMPLETION_QUEUE_TAIL);
- do {
- tail = TXCA_INW(sc, TXCA_COMPLETION_QUEUE_TAIL);
- } while (tail != TXCA_INW(sc, TXCA_COMPLETION_QUEUE_TAIL));
- }
- if (sc->sc_xmit_buffers == sc->sc_nbuf)
- ifp->if_flags &= ~IFF_OACTIVE;
- tr_start(ifp);
-}
-
-
-/*
- * copy out the packet byte-by-byte in reasonably optimal fashion
- */
-int
-tr_mbcopy(sc, dhb, m0)
-struct tr_softc *sc;
-bus_size_t dhb;
-struct mbuf *m0;
-{
- bus_size_t addr = dhb;
- int len, size = 0;
- char *ptr;
- struct mbuf *m;
-
- for (m = m0; m; m = m->m_next) {
- len = m->m_len;
- ptr = mtod(m, char *);
-
- bus_space_write_region_1(sc->sc_memt, sc->sc_sramh,
- addr, ptr, len);
- size += len;
- addr += len;
- }
- return (size);
-}
-
-/*
- * Pull read data off an interface.
- * Len is length of data, with local net header stripped.
- * Off is non-zero if a trailer protocol was used, and
- * gives the offset of the trailer information.
- * XXX trailer information, really ????
- * We copy the trailer information and then all the normal
- * data into mbufs.
- *
- * called from tr_rint - receive interrupt routine
- */
-struct mbuf *
-tr_get(sc, totlen, ifp)
-struct tr_softc *sc;
-int totlen;
-struct ifnet *ifp;
-{
- int len;
- struct mbuf *m, *m0, *newm;
-
- MGETHDR(m0, M_DONTWAIT, MT_DATA);
- if (m0 == 0)
- return (0);
-
- m0->m_pkthdr.rcvif = ifp;
- m0->m_pkthdr.len = totlen;
- len = MHLEN;
-
- m = m0;
- while (totlen > 0) {
- if (totlen >= MINCLSIZE) {
- MCLGET(m, M_DONTWAIT);
- if ((m->m_flags & M_EXT) == 0) {
- m_free(m0);
- return 0;
- }
- len = MCLBYTES;
- }
-
- /*
- * Make sure data after the MAC header is aligned.
- */
- if (m == m0) {
- caddr_t newdata = (caddr_t)
- ALIGN(m->m_data + sizeof(struct token_header)) -
- sizeof(struct token_header);
- len -= newdata - m->m_data;
- m->m_data = newdata;
- }
- m->m_len = len = min(totlen, len);
- tr_bcopy(sc, mtod(m, char *), len);
- totlen -= len;
- if (totlen > 0) {
- MGET(newm, M_DONTWAIT, MT_DATA);
- if (newm == 0){
- m_freem(m0);
- return (0);
- }
- m->m_next = newm;
- m = newm;
- len = MLEN;
- }
- /*
- * ignore trailers case again
- */
- }
- return (m0);
-}
-
-/*
- * tr_ioctl - process an ioctl request
- */
-int
-tr_ioctl(ifp, cmd, data)
-struct ifnet *ifp;
-u_long cmd;
-caddr_t data;
-{
- struct tr_softc *sc = ifp->if_softc;
- struct ifreq *ifr = (struct ifreq *) data;
- struct ifaddr *ifa = (struct ifaddr *) data;
- int s;
- int error = 0;
-
- s = splnet();
-
- switch (cmd) {
- case SIOCSIFADDR:
-
- switch (ifa->ifa_addr->sa_family) {
-#ifdef INET
- case AF_INET:
- /* XXX if not running */
- if ((ifp->if_flags & IFF_RUNNING) == 0) {
- tr_init(sc); /* before arp_ifinit */
- tr_sleep(sc);
- }
- arp_ifinit(&sc->sc_arpcom, ifa);
- break;
-#endif /* INET */
- default:
- /* XXX if not running */
- if ((ifp->if_flags & IFF_RUNNING) == 0) {
- tr_init(sc); /* before arpwhohas */
- tr_sleep(sc);
- }
- break;
- }
- break;
- case SIOCSIFFLAGS:
- /*
- * 1- If the adapter is DOWN , turn the device off
- * ie. adapter down but still running
- * 2- If the adapter is UP, turn the device on
- * ie. adapter up but not running yet
- */
- if ((ifp->if_flags & (IFF_RUNNING | IFF_UP)) == IFF_RUNNING) {
- tr_stop(sc);
- ifp->if_flags &= ~IFF_RUNNING;
- }
- else if ((ifp->if_flags & (IFF_RUNNING | IFF_UP)) == IFF_UP) {
- tr_init(sc);
- tr_sleep(sc);
- }
- else {
-/*
- * XXX handle other flag changes
- */
- }
- break;
- case SIOCGIFMEDIA:
- case SIOCSIFMEDIA:
- error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
- break;
-#ifdef SIOCSIFMTU
- case SIOCSIFMTU:
- if (ifr->ifr_mtu > sc->sc_maxmtu)
- error = EINVAL;
- else
- ifp->if_mtu = ifr->ifr_mtu;
- break;
-#endif
- default:
- error = EINVAL;
- }
- splx(s);
- return (error);
-}
-
-
-/*
- * tr_bcopy - like bcopy except that it knows about the structure of
- * adapter receive buffers.
- */
-void
-tr_bcopy(sc, dest, len)
-struct tr_softc *sc; /* pointer to softc struct for this adapter */
-u_char *dest; /* destination address */
-int len; /* number of bytes to copy */
-{
- struct rbcb *rbc = &sc->rbc; /* pointer to rec buf ctl blk */
-
- /* While amount of data needed >= amount in current receive buffer. */
- while (len >= rbc->data_len) {
- /* Copy all data from receive buffer to destination. */
-
- bus_space_read_region_1(sc->sc_memt, sc->sc_sramh,
- rbc->rbuf_datap, dest, (bus_size_t)rbc->data_len);
- len -= rbc->data_len; /* update length left to transfer */
- dest += rbc->data_len; /* update destination address */
-
- /* Make next receive buffer current receive buffer. */
- rbc->rbufp = rbc->rbufp_next;
- if (rbc->rbufp != 0) { /* More receive buffers? */
-
- /* Calculate pointer to next receive buffer. */
- rbc->rbufp_next = RB_INW(sc, rbc->rbufp, RB_NEXTBUF);
- if (rbc->rbufp_next != 0)
- rbc->rbufp_next -= RB_NEXTBUF;
-
- /* Get pointer to data in current receive buffer. */
- rbc->rbuf_datap = rbc->rbufp + RB_DATA;
-
- /* Get length of data in current receive buffer. */
- rbc->data_len = RB_INW(sc, rbc->rbufp, RB_BUFLEN);
- }
- else {
- if (len != 0) /* len should equal zero. */
- printf("tr_bcopy: residual data not copied\n");
- return;
- }
- }
-
- /* Amount of data needed is < amount in current receive buffer. */
-
- bus_space_read_region_1(sc->sc_memt, sc->sc_sramh,
- rbc->rbuf_datap, dest, (bus_size_t)len);
- rbc->data_len -= len; /* Update count of data in receive buffer. */
- rbc->rbuf_datap += len; /* Update pointer to receive buffer data. */
-}
-
-/*
- * tr_opensap - open the token ring SAP interface
- */
-void
-tr_opensap(sc, type)
-struct tr_softc *sc;
-u_char type;
-{
- bus_size_t srb = sc->sc_srb;
-
-/************************************************************************
- ** To use the SAP level interface, we will have to execute a **
- ** DLC.OPEN.SAP (pg.6-61 of the Token Ring Tech. Ref.) after we have **
- ** received a good return code from the DIR.OPEN.ADAPTER command. **
- ** We will open the IP SAP x'aa'. **
- ** **
- ** STEPS: **
- ** 1) Reset SRB response interrupt bit **
- ** 2) Use the open_sap srb. **
- ** 3) Fill the following fields: **
- ** command - x'15' **
- ** sap_value - x'aa' **
- ** sap_options- x'24' **
- ** **
- ***********************************************************************/
-
- ACA_RSTB(sc, ACA_ISRP_o, ~(SRB_RESP_INT));
-
- SRB_OUTB(sc, srb, SRB_CMD, DLC_OPEN_SAP);
- SRB_OUTB(sc, srb, SRB_RETCODE, 0x00);
- SRB_OUTW(sc, srb, SRB_OPNSAP_STATIONID, 0x0000);
- SRB_OUTB(sc, srb, SRB_OPNSAP_TIMERT1, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_TIMERT2, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_TIMERTI, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_MAXOUT, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_MAXIN, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_MAXOUTINCR, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_MAXRETRY, 0x00);
- SRB_OUTB(sc, srb, SRB_OPNSAP_GSAPMAXMEMB, 0x00);
- SRB_OUTW(sc, srb, SRB_OPNSAP_MAXIFIELD, 0x0088);
- SRB_OUTB(sc, srb, SRB_OPNSAP_SAPVALUE, type);
- SRB_OUTB(sc, srb, SRB_OPNSAP_SAPOPTIONS, 0x24);
- SRB_OUTB(sc, srb, SRB_OPNSAP_STATIONCNT, 0x01);
- SRB_OUTB(sc, srb, SRB_OPNSAP_SAPGSAPMEMB, 0x00);
-
- ACA_SETB(sc, ACA_ISRP_e, INT_ENABLE);
- ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);
-}
-
-/*
- * tr_sleep - sleep to wait for adapter to open
- */
-void
-tr_sleep(sc)
-struct tr_softc *sc;
-{
- int error;
-
- error = tsleep(&sc->tr_sleepevent, 1, "trsleep", hz * 30);
- if (error == EWOULDBLOCK)
- printf("%s: sleep event timeout\n", sc->sc_dev.dv_xname);
-}
-
-void
-tr_watchdog(ifp)
-struct ifnet *ifp;
-{
- struct tr_softc *sc = ifp->if_softc;
-
- log(LOG_ERR,"%s: device timeout\n", sc->sc_dev.dv_xname);
- ++ifp->if_oerrors;
-
- tr_reset(sc);
-}
diff --git a/sys/dev/ic/tropicreg.h b/sys/dev/ic/tropicreg.h
index adfd10df95d..e69de29bb2d 100644
--- a/sys/dev/ic/tropicreg.h
+++ b/sys/dev/ic/tropicreg.h
@@ -1,556 +0,0 @@
-/* $OpenBSD: tropicreg.h,v 1.2 2003/10/21 18:58:50 jmc Exp $ */
-/* $NetBSD: tropicreg.h,v 1.3 1999/10/17 23:53:45 cgd Exp $ */
-
-/*
- * Mach Operating System
- * Copyright (c) 1991 Carnegie Mellon University
- * Copyright (c) 1991 IBM Corporation
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation,
- * and that the name IBM not be used in advertising or publicity
- * pertaining to distribution of the software without specific, written
- * prior permission.
- *
- * CARNEGIE MELLON AND IBM ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON AND IBM DISCLAIM ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
-
-/* $ACIS:if_lanreg.h 12.0$ */
-
-#define TR_SWITCH 0
-#define TR_RESET 1
-#define TR_RELEASE 2
-#define TR_CLEARINT 3
-
-/* macros to deal with accessing the MMIO region */
-#define MM_OUTB(sc, off, val) \
- bus_space_write_1((sc)->sc_memt, (sc)->sc_mmioh, (off), (val))
-#define MM_OUTW(sc, off, val) \
- bus_space_write_2((sc)->sc_memt, (sc)->sc_mmioh, (off), htons((val)))
-#define MM_INB(sc, off) \
- bus_space_read_1((sc)->sc_memt, (sc)->sc_mmioh, (off))
-#define MM_INW(sc, off) \
- ntohs(bus_space_read_2((sc)->sc_memt, (sc)->sc_mmioh, (off)))
-
-/* macros to deal with accesses to the shared ram */
-#define SR_INB(sc, off) \
- bus_space_read_1(sc->sc_memt, sc->sc_sramh, (off))
-#define SR_INW(sc, off) \
- htons(bus_space_read_2(sc->sc_memt, sc->sc_sramh, (off)))
-#define SR_OUTB(sc, off, val) \
- bus_space_write_1((sc)->sc_memt, (sc)->sc_sramh, (off), (val))
-#define SR_OUTW(sc, off, val) \
- bus_space_write_2((sc)->sc_memt, (sc)->sc_sramh, (off), htons((val)))
-
-/* macros to deal with accesses to the recv buffers */
-#define RB_INB(sc, rb, reg) SR_INB(sc, (rb)+(reg))
-#define RB_INW(sc, rb, reg) SR_INW(sc, (rb)+(reg))
-
-/* macros to deal with the ACA */
-#define ACA_RDB(sc, reg) MM_INB(sc, ((sc->sc_aca+(reg))|ACA_RW))
-#define ACA_RDW(sc, reg) MM_INW(sc, ((sc->sc_aca+(reg))|ACA_RW))
-#define ACA_OUTB(sc, reg, val) MM_OUTB(sc, ((sc->sc_aca+(reg))|ACA_RW), (val))
-#define ACA_SETB(sc, reg, val) MM_OUTB(sc, ((sc->sc_aca+(reg))|ACA_SET), (val))
-#define ACA_RSTB(sc, reg, val) MM_OUTB(sc, ((sc->sc_aca+(reg))|ACA_RST), (val))
-
-/* macros to deal with the SSB */
-#define SSB_INB(sc, ssb, reg) SR_INB(sc, (ssb)+(reg))
-
-/* macros to deal with the ARB */
-#define ARB_INB(sc, arb, reg) SR_INB(sc, (arb)+(reg))
-#define ARB_INW(sc, arb, reg) SR_INW(sc, (arb)+(reg))
-
-/* macros to deal with the SRB */
-#define SRB_INB(sc, srb, reg) SR_INB(sc, (srb)+(reg))
-#define SRB_INW(sc, srb, reg) SR_INW(sc, (srb)+(reg))
-#define SRB_OUTB(sc, srb, reg, val) SR_OUTB(sc, (srb)+(reg), (val))
-#define SRB_OUTW(sc, srb, reg, val) SR_OUTW(sc, (srb)+(reg), (val))
-
-/* macros to deal with the ASB */
-#define ASB_INB(sc, asb, reg) SR_INB(sc, (asb)+(reg))
-#define ASB_INW(sc, asb, reg) SR_INW(sc, (asb)+(reg))
-#define ASB_OUTB(sc, asb, reg, val) SR_OUTB(sc, (asb)+(reg), (val))
-#define ASB_OUTW(sc, asb, reg, val) SR_OUTW(sc, (asb)+(reg), (val))
-
-/* macros to deal with the TXCA */
-#define TXCA_INW(sc, reg) SR_INW(sc, sc->sc_txca+(reg))
-#define TXCA_OUTW(sc, reg, val) SR_OUTW(sc, sc->sc_txca+(reg), (val))
-
-/* macros to deal with the txbuffers */
-#define TXB_INB(sc, buf, reg) SR_INB(sc, (buf)+(reg))
-#define TXB_INW(sc, buf, reg) SR_INW(sc, (buf)+(reg))
-#define TXB_OUTB(sc, buf, reg, val) SR_OUTB(sc, (buf)+(reg), (val))
-#define TXB_OUTW(sc, buf, reg, val) SR_OUTW(sc, (buf)+(reg), (val))
-
-/* ACA registers */
-#define ACA_RRR 0
-#define ACA_RRR_e ACA_RRR
-#define ACA_RRR_o (ACA_RRR+1)
-#define ACA_WRBR 2
-#define ACA_WRBR_e ACA_WRBR
-#define ACA_WRBR_o (ACA_WRBR+1)
-#define ACA_WWOR 4
-#define ACA_WWOR_e ACA_WWOR
-#define ACA_WWOR_o (ACA_WWOR+1)
-#define ACA_WWCR 6
-#define ACA_WWCR_e ACA_WWCR
-#define ACA_WWCR_o (ACA_WWCR+1)
-#define ACA_ISRP 8
-#define ACA_ISRP_e ACA_ISRP
-#define ACA_ISRP_o (ACA_ISRP+1)
-#define ACA_ISRA 10
-#define ACA_ISRA_e ACA_ISRA
-#define ACA_ISRA_o (ACA_ISRA+1)
-#define ACA_TCR 12
-#define ACA_TCR_e ACA_TCR
-#define ACA_TCR_o (ACA_TCR+1)
-#define ACA_TVR 14
-#define ACA_TVR_e ACA_TVR
-#define ACA_TVR_o (ACA_TVR+1)
-
-/* access flags; to be or-ed into offset */
-#define ACA_RW 0
-#define ACA_RST 0x20
-#define ACA_SET 0x40
-
-/* offsets valid for all command blocks */
-#define CMD_CMD 0
-#define CMD_RETCODE 2
-
-/*
- * Structure of SSB (System Status Block)
- */
-#define SSB_SIZE 20 /* size of SSB */
-#define SSB_CMD 0
-#define SSB_CMDCORR 1
-#define SSB_RETCODE 2
-#define SSB_STATIONID 4
-#define SSB_XMITERR 6
-
-/*
- * Structure of ARB (Adapter Request Block)
- */
-#define ARB_SIZE 28 /* size of ARB */
-#define ARB_CMD 0
-#define ARB_STATIONID 4 /* ID of receiving station */
-
-/* receive data command block */
-#define ARB_RXD_BUFADDR 6 /* RAM offset of 1st rec buf */
-#define ARB_RXD_LANHDRLEN 8 /* Length of LAN header */
-#define ARB_RXD_DLCHDRLEN 9 /* Length of DLC header */
-#define ARB_RXD_FRAMELEN 10 /* Length of entire frame */
-#define ARB_RXD_MSGTYPE 12 /* Category of message */
-
-/* transmit data command block */
-#define ARB_XMT_CMDCORR 1
-#define ARB_XMT_DHBADDR 6
-
-/* ring status change information block */
-#define ARB_RINGSTATUS 6
-
-/* DLC status change response block */
-#define ARB_DLCSTAT_STATUS 6 /* status info field */
-#define ARB_DLCSTAT_FRMRDATA 8 /* 5 bytes */
-#define ARB_DLCSTAT_ACCPRIO 13
-#define ARB_DLCSTAT_REMADDR 14 /* remote address */
-#define ARB_DLCSTAT_REMSAP 20 /* remote sap */
-
-/*
- * Structure of SRB (System Request Block)
- */
-#define SRB_SIZE 28 /* size of SRB */
-#define SRB_CMD 0
-#define SRB_RETCODE 2
-
-/* contents of SRB after adapter reset */
-#define INIT_COMPL 0x80 /* in SRB_CMD */
-#define SRB_INIT_STATUS 1
-#define RSP_DETECT 0x40
-#define FAST_PATH_TRANSMIT 0x20
-#define RING_MEASUREMENT 0x08
-#define RPL 0x02
-#define RSP_16 0x01
-#define SRB_INIT_STATUS2 2
-#define PNP 0x80
-#define SET_DEF_RSP 0x40
-#define AUTO_DEF_RSP_UPDATE 0x20
-#define SRB_INIT_BUC 6 /* bring up code */
-#define SRB_INIT_ENCADDR 8 /* offset of adapter's */
- /* permanent encoded address */
-#define SRB_INIT_LVLADDR 10 /* offset of adapter's */
- /* microcode level */
-#define SRB_INIT_ADAPADDR 12 /* offset of adapter addresses */
-#define SRB_INIT_PARMSADDR 14 /* offset of adapter parameters */
-#define SRB_INIT_MACADDR 16 /* offset of adapter MAC buffer */
-#define SRB_INIT_UTILADDR 18 /* offset of ring utilization measurement */
-
-/* config fast path ram command block */
-#define SRB_CFP_CMDSIZE 12 /* length of command block */
-#define SRB_CFP_RAMSIZE 8
-#define SRB_CFP_BUFSIZE 10
-
-/* config fast path transmit response block */
-#define SRB_CFPRESP_FPXMIT 8 /* offset to transmit control area */
-#define SRB_CFPRESP_SRBADDR 10 /* offset for the next SRB address */
-
-/* open command block */
-#define SRB_OPEN_CMDSIZE 60
-#define SRB_OPEN_OPTIONS 8 /* open options */
-#define SRB_OPEN_NODEADDR 10 /* adapter's ring address */
-#define SRB_OPEN_GROUPADDR 16 /* adapter's group address */
-#define SRB_OPEN_FUNCTADDR 20 /* adapter's functional address */
-#define SRB_OPEN_NUMRCVBUF 24 /* number of receive buffers */
-#define SRB_OPEN_RCVBUFLEN 26 /* length of receive buffers */
-#define SRB_OPEN_DHBLEN 28 /* length of DHBs */
-#define SRB_OPEN_NUMDHB 30 /* number of DHBs */
-#define SRB_OPEN_DLCMAXSAP 32 /* max. number of SAPs */
-#define SRB_OPEN_DLCMAXSTA 33 /* max. number of link stations */
-#define SRB_OPEN_DLCMAXGSAP 34 /* max. number of group SAPs */
-#define SRB_OPEN_DLCMAXGMEM 35 /* max. members per group SAP */
-#define SRB_OPEN_DLCT1TICK1 36 /* timer T1 intvl. group one */
-#define SRB_OPEN_DLCT2TICK1 37 /* timer T7 intvl. group one */
-#define SRB_OPEN_DLCTITICK1 38 /* timer Ti intvl. group one */
-#define SRB_OPEN_DLCT1TICK2 39 /* timer T1 intvl. group two */
-#define SRB_OPEN_DLCT2TICK2 40 /* timer T7 intvl. group two */
-#define SRB_OPEN_DLCTITICK2 41 /* timer Ti intvl. group two */
-#define SRB_OPEN_PODUCTID 42 /* product id (18 bytes) */
-
-/* open command response block */
-#define SRB_OPENRESP_ERRCODE 6
-#define SRB_OPENRESP_ASBADDR 8 /* offset of ASB */
-#define SRB_OPENRESP_SRBADDR 10 /* offset of SRB */
-#define SRB_OPENRESP_ARBADDR 12 /* offset of ARB */
-#define SRB_OPENRESP_SSBADDR 14 /* offset of SSB */
-
-/* open sap command and response block */
-#define SRB_OPNSAP_STATIONID 4 /* ID of SAP after open */
-#define SRB_OPNSAP_TIMERT1 6 /* response timer */
-#define SRB_OPNSAP_TIMERT2 7 /* acknowledge timer */
-#define SRB_OPNSAP_TIMERTI 8 /* inactivity timer */
-#define SRB_OPNSAP_MAXOUT 9 /* max. xmits without ack */
-#define SRB_OPNSAP_MAXIN 10 /* max. recvs without ack */
-#define SRB_OPNSAP_MAXOUTINCR 11 /* window increment value */
-#define SRB_OPNSAP_MAXRETRY 12 /* N2 value */
-#define SRB_OPNSAP_GSAPMAXMEMB 13 /* max. SAPs for a group SAP */
-#define SRB_OPNSAP_MAXIFIELD 14 /* max recv info field length */
-#define SRB_OPNSAP_SAPVALUE 16 /* SAP to be opened */
-#define SRB_OPNSAP_SAPOPTIONS 17 /* options to be set */
-#define SRB_OPNSAP_STATIONCNT 18 /* num of link stations to reserve */
-#define SRB_OPNSAP_SAPGSAPMEMB 19 /* number of GSAP members */
-#define SRB_OPNSAP_GSAP1 20 /* first gsap request */
-
-/* read log command and response block */
-#define SRB_RLOG_LOGDATA 14 /* 14 bytes of log data */
-#define SRB_LOG_LINEERRS (SRB_RLOG_LOGDATA+0) /* line errors */
-#define SRB_LOG_INTERRS (SRB_RLOG_LOGDATA+1) /* internal errors */
-#define SRB_LOG_BRSTERRS (SRB_RLOG_LOGDATA+2) /* burst errors */
-#define SRB_LOG_ACERRS (SRB_RLOG_LOGDATA+3) /* AC errors */
-#define SRB_LOG_ABRTERRS (SRB_RLOG_LOGDATA+4) /* abort errors */
-#define SRB_LOG_LOSTFRMS (SRB_RLOG_LOGDATA+6) /* lost frames */
-#define SRB_LOG_RCVCONG (SRB_RLOG_LOGDATA+7) /* receive congestion count */
-#define SRB_LOG_FCPYERRS (SRB_RLOG_LOGDATA+8) /* frame copied errors */
-#define SRB_LOG_FREQERRS (SRB_RLOG_LOGDATA+9) /* frequency erros */
-#define SRB_LOG_TOKENERRS (SRB_RLOG_LOGDATA+10) /* token errors */
-
-/* set default ring speed command */
-#define SRB_SET_DEFRSP 6
-
-/*
- * Structure of ASB (Adapter Status Block)
- */
-#define ASB_SIZE 12 /* size of ASB */
-#define RECV_CMD 0
-#define RECV_RETCODE 2
-#define RECV_STATIONID 4
-
-#define RECV_RESP_RECBUFADDR 6
-
-/* host response to xmit-req-data command */
-#define XMIT_CMD 0
-#define XMIT_CMDCORR 1 /* command correlator */
-#define XMIT_RETCODE 2 /* return code */
-#define XMIT_STATIONID 4 /* id of sending station */
-#define XMIT_FRAMELEN 6 /* length of entire frame */
-#define XMIT_HDRLEN 8 /* length of LAN header */
-#define XMIT_REMSAP 9 /* remote SAP */
-#define XMIT_DATA 10 /* offset of first data byte */
-/* fast path specific data */
-#define XMIT_LASTBUF 12
-#define XMIT_FRAMEPTR 14
-#define XMIT_NEXTBUF 16
-#define XMIT_STATUS 18
-#define XMIT_STRIPFS 19
-#define XMIT_BUFLEN 20
-#define XMIT_FP_DATA 22 /* offset of first data byte */
-
-#if 0 /* XXXchb unused? */
-/*
- * Adapter addresses
- */
-struct adapt_addr {
- unsigned char node_addr[6]; /* Adapter node address */
- unsigned char grp_addr[4]; /* Adapter group address */
- unsigned char func_addr[4]; /* Adapter functional address */
-};
-
-/*
- * Adapter parameters
- */
-struct param_addr {
- unsigned char phys_addr[4]; /* Adapter physical address */
- unsigned char up_node_addr[6]; /* Next active upstream node
- * addr */
- unsigned char up_phys_addr[4]; /* Next active upstream phys
- * addr */
- unsigned char poll_addr[6]; /* Last poll address */
- unsigned char res0[2];/* Reserved */
- unsigned char acc_priority[2]; /* Transmit access priority */
- unsigned char src_class[2]; /* Source class authorization */
- unsigned char att_code[2]; /* Last attention code */
- unsigned char src_addr[6]; /* Last source address */
- unsigned char bcon_type[2]; /* Last beacon type */
- unsigned char major_vector[2]; /* Last major vector */
- unsigned char ring_stat[2]; /* ring status */
- unsigned char soft_error[2]; /* soft error timer value */
- unsigned char fe_error[2]; /* front end error counter */
- unsigned char next_state[2]; /* next state indicator */
- unsigned char mon_error[2]; /* Monitor error code */
- unsigned char bcon_xmit[2]; /* Beacon transmit type */
- unsigned char bcon_receive[2]; /* Beacon receive type */
- unsigned char frame_correl[2]; /* Frame correlator save */
- unsigned char bcon_naun[6]; /* beacon station NAUN */
- unsigned char res1[4];/* Reserved */
- unsigned char bcon_phys[4]; /* Beacon station physical addr */
-};
-#endif
-
-#define TXCA_BUFFER_COUNT 0
-#define TXCA_FREE_QUEUE_HEAD 2
-#define TXCA_FREE_QUEUE_TAIL 4
-#define TXCA_ADAPTER_QUEUE_HEAD 6
-#define TXCA_BUFFER_SIZE 8
-#define TXCA_COMPLETION_QUEUE_TAIL 10
-
-/* Adapter receive buffer structure */
-#define RB_NEXTBUF 2 /* offset of next buf plus 2 in sram */
-#define RB_FS 5 /* FS/addr match (last buf only) */
-#define RB_BUFLEN 6 /* length of data in this buffer */
-#define RB_DATA 8 /* RCV_BUF_DLEN bytes frame data */
-
-/* Misc. structure sizes. */
-#define SAPCB_SIZE 64 /* size of SAP control block */
-#define LSCB_SIZE 144 /* size of DLC link station control block */
-
-/* memory in shared ram area that is reserved by the adapter */
-#define PRIVRAM_SIZE 1416 /* adapter private ram area */
-#define RESVDMEM_SIZE (PRIVRAM_SIZE+ARB_SIZE+SSB_SIZE+SRB_SIZE+ASB_SIZE)
-
-/* Memory offsets of adapter control areas */
-
-#define TR_SRAM_DEFAULT 0xd8000
-
-/* Offset of MMIO region */
-#define TR_MMIO_OFFSET 0x80000
-#define TR_MMIO_MINADDR 0xc0000
-#define TR_MMIO_MAXADDR 0xde000
-#define TR_MMIO_SIZE 8192
-
-#define TR_ACA_OFFSET 0x1e00 /* Offset of ACA in MMIO region */
-/*
- * XXX Create AIP structure
- */
-#define TR_MAC_OFFSET 0x1f00 /* Offset of MAC address in MMIO region */
-#define TR_ID_OFFSET 0x1f30 /* Offset of ID in MMIO region */
-#define TR_TYP_OFFSET 0x1fa0 /* Offset of TYP in MMIO region */
-#define TR_RATES_OFFSET 0x1fa2 /* Offset of supported speeds in MMIO region */
-#define TR_RAM_OFFSET 0x1fa6 /* Offset of available shared RAM */
-#define TR_PAGE_OFFSET 0x1fa8 /* Offset of shared-RAM paging support */
-#define TR_DHB4_OFFSET 0x1faa /* Offset of available DHB size at 4Mbit */
-#define TR_DHB16_OFFSET 0x1fac /* Offset of available DHB size at 16Mbit */
-#define TR_MEDIAS_OFFSET 0x1fb6 /* Offset of supported media types in MMIO */
-#define TR_MEDIA_OFFSET 0x1fb8 /* Offset of selected media type in MMIO */
-#define TR_IRQ_OFFSET 0x1fba /* Offset of IRQs supported in MMIO region */
-
-/* Bring-Up Test results */
-
-#define BUT_OK 0x0000 /* Initialization completed OK */
-#define BUT_PROCESSOR_FAIL 0x0020 /* Failed processor initialization */
-#define BUT_ROM_FAIL 0x0022 /* Failed ROM test diagnostic */
-#define BUT_RAM_FAIL 0x0024 /* Failed RAM test diagnostic */
-#define BUT_INST_FAIL 0x0026 /* Failed instruction test diag. */
-#define BUT_INTER_FAIL 0x0028 /* Failed interrupt test diagnostic */
-#define BUT_MEM_FAIL 0x002a /* Failed memory interface diag. */
-#define BUT_PROTOCOL_FAIL 0x002c /* Failed protocol handler diag. */
-
-
-/* Direct PC-to-adapter commands */
-
-#define DIR_INTERRUPT 0x00 /* Cause adapter to interrupt the PC */
-#define DIR_MOD_OPEN_PARAMS 0x01 /* Modify open options */
-#define DIR_RESTORE_OPEN_PARMS 0x02 /* Restore open options */
-#define DIR_OPEN_ADAPTER 0x03 /* Open the adapter card */
-#define DIR_CLOSE 0x04 /* Close adapter card */
-#define DIR_SET_GRP_ADDR 0x06 /* Set adapter group address */
-#define DIR_SET_FUNC_ADDR 0x07 /* Set adapter functional addr */
-#define DIR_READ_LOG 0x08 /* Read and reset error counters */
-#define DIR_SET_BRIDGE_PARMS 0x09
-#define DIR_CONFIG_BRIDGE_RAM 0x0c
-#define DIR_CONFIG_FAST_PATH_RAM 0x12
-#define DIR_SINGLE_ROUTE_BROADCAST 0x1f
-#define DIR_SET_DEFAULT_RING_SPEED 0x21
-
-#define XMIT_DIR_FRAME 0x0a /* Direct station transmit */
-#define XMIT_I_FRAME 0x0b
-#define XMIT_UI_FRM 0x0d /* transmit unnumbered info frame */
-#define XMIT_XID_CMD 0x0e /* transmit XID command */
-#define XMIT_XID_RESP_FINAL 0x0f
-#define XMIT_XID_RESP_NOT_FINAL 0x10
-#define XMIT_TEST_CMD 0x11 /* transmit TEST command */
-
-
-/* Adapter-Card-to-PC commands */
-
-#define REC_DATA 0x81 /* Data received from ring station */
-#define XMIT_DATA_REQ 0x82 /* Adapter needs data to xmit */
-#define DLC_STATUS 0x83 /* DLC status has changed */
-#define RING_STAT_CHANGE 0x84 /* Adapter has new ring-status info */
-#define REC_BRIDGE_DATA 0x85
-#define REXMIT_DATA_REQ 0x86
-
-/* Open options */
-
-#define OPEN_WRAP 0x8000 /* Wrap xmit data to receive data */
-#define OPEN_NO_HARD_ERR 0x4000 /* Ring hard error and xmit beacon */
- /* conditions do not cause interrupt */
-#define OPEN_NO_SOFT_ERR 0x2000 /* Ring soft errors do not cause */
- /* interrupt */
-#define OPEN_PASS_MAC 0x1000 /* Pass all adapter-class MAC frames */
- /* received but not supported by the */
- /* adapter */
-#define OPEN_PASS_ATTN_MAC 0x0800 /* Pass all attention-class MAC */
- /* frames != the previously received */
- /* attention MAC frame */
-#define OPEN_PASS_BCON_MAC 0x0100 /* Pass the first beacon MAC frame */
- /* and all subsequent beacon MAC */
- /* frames that have a change in */
- /* source address or beacon type */
-#define OPEN_CONT 0x0080 /* Adapter will participate in */
- /* monitor contention */
-
-#define NUM_RCV_BUF 4 /* Number of receive buffers in */
- /* shared RAM needed for adapter to */
- /* open */
-#define RCV_BUF_LEN 520 /* Length of each receive buffer */
-#define RCV_BUF_DLEN RCV_BUF_LEN - 8 /* Length of data in rec buf */
-
-#define DHB_LENGTH 512 /* Length of each transmit buffer */
-#define FP_BUF_LEN 536 /* length of each FP transmit buffer */
-
-/*
- * Integrity cannot be guaranteed if number of dhbs > 2
- */
-#define NUM_DHB 1 /* Number of transmit buffers */
-
-#define DLC_MAX_SAP 0 /* MAX number of SAPs */
-#define DLC_MAX_STA 0 /* MAX number of link stations */
-#define DLC_MAX_GSAP 0 /* MAX number of group SAPs */
-#define DLC_MAX_GMEM 0 /* MAX number of SAPs that can be */
- /* assigned to any given group */
-#define DLC_TICK 0 /* Zero selects default of 40ms */
-
-
-/* Open return codes */
-
-#define OPEN_OK 0x00 /* Open completed successfully */
-#define OPEN_BAD_COMMAND 0x01 /* Invalid command code */
-#define OPEN_ALREADY 0x03 /* Adapter is ALREADY open */
-#define OPEN_MISSING_PARAMS 0x05 /* Required parameters missing */
-#define OPEN_UNRECOV_FAIL 0x07 /* Unrecoverable failure occurred */
-#define OPEN_INAD_REC_BUFS 0x30 /* Inadequate receive buffers */
-#define OPEN_BAD_NODE_ADDR 0x32 /* Invalid NODE address */
-#define OPEN_BAD_REC_BUF_LEN 0x33 /* Invalid receive buffer length */
-#define OPEN_BAD_XMIT_BUF_LEN 0x43 /* Invalid transmit buffer length */
-
-/* Bit definitions of ISRA High Byte, (Adapter Status) */
-#define PARITY_ERROR 0x80 /* Parity error on the adapter's internal bus */
-#define TIMER_STAT 0x40 /* A Timer Control Reg. has an interrupt */
-#define ACCESS_STAT 0x20 /* Shared RAM or MMIO access violation */
-#define DEADMAN_TIMER 0x10 /* The deadman timer has expired */
-#define PROCESSOR_CK 0x08 /* Adapter Processor Check */
-#define H_INT_MASK 0x02 /* When on, no adapter hardware interrupts */
-#define S_INT_MASK 0x01 /* When on, no adapter software interrupts */
-
-/* Bit definitions of ISRA Low Byte, (Used by PC to interrupt adapter) */
-#define XMIT_REQ 0x40 /* Transmit frame in fast path transmit buf */
-#define CMD_IN_SRB 0x20 /* Inform adapter of command in SRB */
-#define RESP_IN_ASB 0x10 /* Inform adapter of response in ASB */
-#define SRB_FREE 0x08 /* Inform PC when SRB is FREE */
-#define ASB_FREE 0x04 /* Inform PC when ASB is FREE */
-#define ARB_FREE 0x02 /* Inform adapter ARB is FREE */
-#define SSB_FREE 0x01 /* Inform adapter SSB is FREE */
-
-/* Bit definitions of ISRP High Byte, (PC interrupts and interrupt control) */
-#define NMI_INT_CTL 0x80 /* 1 = all interrupts to PC interrupt level */
- /* 0 = error and timer interrupts to PC NMI */
-#define INT_ENABLE 0x40 /* Allow adapter to interrupt the PC */
-#define TCR_INT 0x10 /* Timer Control Reg. has interrupt for PC */
-#define ERR_INT 0x08 /* Adap machine check, deadman timer, overrun */
-#define ACCESS_INT 0x04 /* Shared RAM or MMIO access violation */
-#define SHARED_INT_BLK 0x02 /* Shared interrupt blocked */
-#define PRIM_ALT_ADDR 0x01 /* 0 = primary adapter address */
- /* 1 = alternate adapter address */
-
-/* Bit definitions of ISRP Low Byte, (PC interrupts) */
-#define ADAP_CHK_INT 0x40 /* The adapter has an unrecoverable error */
-#define SRB_RESP_INT 0x20 /* Adapter has placed a response in the SRB */
-#define ASB_FREE_INT 0x10 /* Adapter has read response in ARB */
-#define ARB_CMD_INT 0x08 /* ARB has command for PC to act on */
-#define SSB_RESP_INT 0x04 /* SSB has response to previous SRB command */
-#define XMIT_COMPLETE 0x02 /* Fast path transmit frame complete */
-
-
-/* Constants for Token-Ring physical header */
-#define DLC_HDR_LEN 0x3 /* Length of DLC header */
-#define SNAP_LENGTH 0x05 /* SNAP field length */
- /* protocol id = 3 bytes */
- /* ethertype = 2 bytes */
-#define HDR_LNGTH_NOROUTE 14 /* length of header with no route info */
-#define SKIP_DSAP_SSAP 0x02 /* length of dsap and ssap in llc frame */
-#define TR_MAX_LINK_HDR 46 /* max length of link header with route info */
-
-/* SAP DLC SRB commands (page 6-50 Token Ring Tech. Ref.) */
-#define DLC_RESET 0x14
-#define DLC_OPEN_SAP 0x15 /* activate service access point */
-#define DLC_CLOSE_SAP 0x16 /* de-activate SAP */
-#define DLC_REALLOCATE 0x17
-#define DLC_OPEN_STATION 0x19
-#define DLC_CLOSE_STATION 0x1a
-#define DLC_CONNECT_STATION 0x1b
-#define DLC_MODIFY 0x1c
-#define DLC_FLOW_CONTROL 0x1d
-#define DLC_STATISTICS 0x1e
-
-
-/* ARB RING STATUS CHANGE */
-#define SIGNAL_LOSS 0x8000 /* signal loss */
-#define HARD_ERR 0x4000 /* beacon frames sent */
-#define SOFT_ERR 0x2000 /* soft error */
-#define LOBE_FAULT 0x0800 /* lobe wire fault */
-#define LOG_OFLOW 0x0080 /* adapter error log counter overflow */
-#define SINGLE_STATION 0x0040 /* single station on ring */
diff --git a/sys/dev/ic/tropicvar.h b/sys/dev/ic/tropicvar.h
index 97537d3f347..e69de29bb2d 100644
--- a/sys/dev/ic/tropicvar.h
+++ b/sys/dev/ic/tropicvar.h
@@ -1,105 +0,0 @@
-/* $OpenBSD: tropicvar.h,v 1.3 2002/03/14 01:26:55 millert Exp $ */
-/* $NetBSD: tropicvar.h,v 1.4 1999/10/17 23:53:45 cgd Exp $ */
-
-/*
- * Mach Operating System
- * Copyright (c) 1991 Carnegie Mellon University
- * Copyright (c) 1991 IBM Corporation
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation,
- * and that the name IBM not be used in advertising or publicity
- * pertaining to distribution of the software without specific, written
- * prior permission.
- *
- * CARNEGIE MELLON AND IBM ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON AND IBM DISCLAIM ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
-
-/* $ACIS:if_lanvar.h 12.0$ */
-
-/*
- * This file contains structures used in the "tr" driver for the
- * IBM TOKEN-RING NETWORK PC ADAPTER
- */
-
-/* Receive buffer control block */
-struct rbcb {
- bus_size_t rbufp; /* offset of current receive buffer */
- bus_size_t rbufp_next; /* offset of next receive buffer */
- bus_size_t rbuf_datap; /* offset of data in receive buffer */
- unsigned short data_len; /* amount of data in this rec buffer */
-};
-
-/*
- * Token-Ring software status per adapter
- */
-struct tr_softc {
- struct device sc_dev;
- void *sc_ih;
- struct arpcom sc_arpcom;
- struct ifmedia sc_media;
- u_char sc_xmit_correlator;
- int sc_xmit_buffers;
-#if 1
- int sc_xmit_head;
- int sc_xmit_tail;
-#endif
- int sc_minbuf;
- int sc_nbuf;
- bus_size_t sc_txca;
-
- bus_space_tag_t sc_piot;
- bus_space_tag_t sc_memt;
- bus_space_handle_t sc_pioh; /* handle pio area */
- bus_space_handle_t sc_sramh; /* handle for the shared ram area */
- bus_space_handle_t sc_mmioh; /* handle for the bios/mmio area */
-
- struct timeout init_timeout;
- struct timeout reinit_timeout;
-
- int (*sc_mediachange)(struct tr_softc *);
- void (*sc_mediastatus)(struct tr_softc *, struct ifmediareq *);
- struct rbcb rbc; /* receiver buffer control block */
- bus_size_t sc_aca; /* offset of adapter ACA */
- bus_size_t sc_ssb; /* offset of System Status Block */
- bus_size_t sc_arb; /* offset of Adapter Request Block */
- bus_size_t sc_srb; /* offset of System Request Block */
- bus_size_t sc_asb; /* offset of Adapter Status Block */
- u_int sc_maddr; /* mapped shared memory address */
- u_int sc_memwinsz; /* mapped shared memory window size */
- u_int sc_memsize; /* memory installed on adapter */
- u_int sc_memreserved; /* reserved memory on adapter */
- int sc_dhb4maxsz; /* max. dhb size at 4MBIT ring speed */
- int sc_dhb16maxsz; /* max. dbh size at 16MBIT ring speed */
- int sc_maxmtu; /* max. MTU supported by adapter */
- unsigned char sc_init_status;
- caddr_t tr_sleepevent; /* tr event signalled on successful */
- /* open of adapter */
- unsigned short exsap_station; /* station assigned by open sap cmd */
-};
-
-int tr_config(struct tr_softc *);
-int tr_attach(struct tr_softc *);
-int tr_intr(void *);
-void tr_init(void *);
-int tr_ioctl(struct ifnet *, u_long, caddr_t);
-void tr_stop(struct tr_softc *);
-int tr_reset(struct tr_softc *);
-void tr_sleep(struct tr_softc *);
-int tr_setspeed(struct tr_softc *, u_int8_t);
diff --git a/sys/dev/isa/files.isa b/sys/dev/isa/files.isa
index 600a149d25d..9e883c70d20 100644
--- a/sys/dev/isa/files.isa
+++ b/sys/dev/isa/files.isa
@@ -1,4 +1,4 @@
-# $OpenBSD: files.isa,v 1.95 2007/05/28 02:13:44 krw Exp $
+# $OpenBSD: files.isa,v 1.96 2007/05/29 18:21:19 claudio Exp $
# $NetBSD: files.isa,v 1.21 1996/05/16 03:45:55 mycroft Exp $
#
# Config file and device description for machine-independent ISA code.
@@ -236,13 +236,6 @@ file dev/isa/if_sm_isa.c sm_isa
attach rln at isa with rln_isa
file dev/isa/if_rln_isa.c rln_isa
-# TROPIC based Token-Ring (IBM/3COM)
-define tr_isa
-file dev/isa/if_tr_isa.c tr_isa
-attach tr at isa with tr_isa: tr_isa, elink
-file dev/isa/if_tribm_isa.c tr_isa
-file dev/isa/if_trtcm_isa.c tr_isa
-
#
# ISA Sound hardware
#
diff --git a/sys/dev/isa/if_tr_isa.c b/sys/dev/isa/if_tr_isa.c
index b20b451fb58..e69de29bb2d 100644
--- a/sys/dev/isa/if_tr_isa.c
+++ b/sys/dev/isa/if_tr_isa.c
@@ -1,257 +0,0 @@
-/* $OpenBSD: if_tr_isa.c,v 1.3 2002/03/14 01:26:56 millert Exp $ */
-/* $NetBSD: if_tr_isa.c,v 1.4 1999/04/30 15:29:24 bad Exp $ */
-
-#undef TRISADEBUG
-/*
- * Copyright (c) 1999 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Onno van der Linden.
- *
- * 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by The NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/socket.h>
-#include <sys/device.h>
-#include <sys/timeout.h>
-
-#include <net/if.h>
-#include <net/if_media.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-
-#include <machine/cpu.h>
-#include <machine/bus.h>
-#include <machine/intr.h>
-
-#include <dev/isa/isavar.h>
-
-#include <dev/ic/tropicreg.h>
-#include <dev/ic/tropicvar.h>
-
-
-int tr_isa_probe(struct device *, void *, void *);
-int trtcm_isa_probe(struct device *, void *, void *);
-int tribm_isa_probe(struct device *, void *, void *);
-void tr_isa_attach(struct device *, struct device *, void *);
-int tr_isa_map_io(struct isa_attach_args *, bus_space_handle_t *,
- bus_space_handle_t *);
-void tr_isa_unmap_io(struct isa_attach_args *, bus_space_handle_t,
- bus_space_handle_t);
-int trtcm_isa_mediachange(struct tr_softc *);
-void trtcm_isa_mediastatus(struct tr_softc *, struct ifmediareq *);
-#ifdef TRISADEBUG
-void tr_isa_dumpaip(bus_space_tag_t, bus_space_handle_t);
-#endif
-
-/*
- * List of manufacturer specific probe routines. Order is important.
- */
-int (*tr_isa_probe_list[])(struct device *, void *, void *) = {
- trtcm_isa_probe,
- tribm_isa_probe,
- 0
- };
-
-struct cfattach tr_isa_ca = {
- sizeof(struct tr_softc), tr_isa_probe, tr_isa_attach
-};
-
-int
-tr_isa_map_io(ia, pioh, mmioh)
-struct isa_attach_args *ia;
-bus_space_handle_t *pioh, *mmioh;
-{
- bus_size_t mmio;
- u_int8_t s;
-
- if (bus_space_map(ia->ia_iot, ia->ia_iobase, ia->ia_iosize, 0, pioh)) {
- printf("tr_isa_map_io: can't map PIO ports\n");
- return 1;
- }
-
- /* Read adapter switches and calculate addresses of MMIO. */
- s = bus_space_read_1(ia->ia_iot, *pioh, TR_SWITCH);
-
- if ((s & 0xfc) < ((TR_MMIO_MINADDR - TR_MMIO_OFFSET) >> 11) ||
- (s & 0xfc) > ((TR_MMIO_MAXADDR - TR_MMIO_OFFSET) >> 11)) {
- bus_space_unmap(ia->ia_iot, *pioh, ia->ia_iosize);
- return 1;
- }
-
- mmio = ((s & 0xfc) << 11) + TR_MMIO_OFFSET;
- if (bus_space_map(ia->ia_memt, mmio, TR_MMIO_SIZE, 0, mmioh)) {
- printf("tr_isa_map_io: can't map MMIO region 0x%05lx/%d\n",
- mmio, TR_MMIO_SIZE);
- bus_space_unmap(ia->ia_iot, *pioh, ia->ia_iosize);
- return 1;
- }
- return 0;
-}
-
-void
-tr_isa_unmap_io(ia, pioh, mmioh)
-struct isa_attach_args *ia;
-bus_space_handle_t pioh, mmioh;
-{
- bus_space_unmap(ia->ia_memt, mmioh, TR_MMIO_SIZE);
- bus_space_unmap(ia->ia_iot, pioh, ia->ia_iosize);
-}
-
-static u_char tr_isa_id[] = {
- 5, 0, 4, 9, 4, 3, 4, 15, 3, 6, 3, 1, 3, 1, 3, 0, 3, 9, 3, 9, 3, 0, 2, 0
-};
-
-/*
- * XXX handle multiple IBM TR cards (sram mapping !!)
- */
-
-int
-tr_isa_probe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- struct isa_attach_args *ia = aux;
- int i;
- bus_size_t tr_id;
- bus_space_handle_t sramh, pioh, mmioh;
- int probecode;
- int matched = 0;
-
- for (i = 0; tr_isa_probe_list[i] != 0; i++) {
- probecode = tr_isa_probe_list[i](parent, match, aux);
- if (probecode < 0)
- return 0; /* Fail instantly. */
- if (probecode > 0)
- break; /* We have a match. */
- }
- if (tr_isa_probe_list[i] == 0)
- return 0; /* Nothing matched. */
- if (tr_isa_map_io(ia, &pioh, &mmioh))
- return 0;
- tr_id = TR_ID_OFFSET;
- matched = 1;
- for (i = 0; i < sizeof(tr_isa_id); i++) {
- if (bus_space_read_1(ia->ia_memt, mmioh, tr_id) !=
- tr_isa_id[i])
- matched = 0;
- tr_id += 2;
- }
-#ifdef TRISADEBUG
- tr_isa_dumpaip(ia->ia_memt, mmioh);
-#endif
- tr_isa_unmap_io(ia, pioh, mmioh);
- if (!matched) {
- return 0;
- }
- if (bus_space_map(ia->ia_memt, ia->ia_maddr, ia->ia_msize, 0, &sramh)) {
- printf("tr_isa_probe: can't map shared ram\n");
- return 0;
- }
- bus_space_unmap(ia->ia_memt, sramh, ia->ia_msize);
- return 1;
-}
-
-int trtcm_setspeed(struct tr_softc *, int);
-
-void
-tr_isa_attach(parent, self, aux)
- struct device *parent, *self;
- void *aux;
-{
- struct tr_softc *sc = (void *) self;
- struct isa_attach_args *ia = aux;
-
- sc->sc_piot = ia->ia_iot;
- sc->sc_memt = ia->ia_memt;
- if (tr_isa_map_io(ia, &sc->sc_pioh, &sc->sc_mmioh)) {
- printf("tr_isa_attach: IO space vanished\n");
- return;
- }
- if (bus_space_map(sc->sc_memt, ia->ia_maddr, ia->ia_msize, 0,
- &sc->sc_sramh)) {
- printf("tr_isa_attach: shared ram space vanished\n");
- return;
- }
- /* set ACA offset */
- sc->sc_aca = TR_ACA_OFFSET;
- sc->sc_memwinsz = ia->ia_msize;
- sc->sc_maddr = ia->ia_maddr;
- /*
- * Determine total RAM on adapter and decide how much to use.
- * XXX Since we don't use RAM paging, use sc_memwinsz for now.
- */
- sc->sc_memsize = sc->sc_memwinsz;
- sc->sc_memreserved = 0;
-
- if (tr_reset(sc) != 0)
- return;
-
- if (ia->ia_aux != NULL) {
- sc->sc_mediastatus = trtcm_isa_mediastatus;
- sc->sc_mediachange = trtcm_isa_mediachange;
- }
- else {
- sc->sc_mediastatus = NULL;
- sc->sc_mediachange = NULL;
- }
-
- if (tr_attach(sc) != 0)
- return;
-
-/*
- * XXX 3Com 619 can use LEVEL intr
- */
- sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
- IPL_NET, tr_intr, sc, sc->sc_dev.dv_xname);
-}
-
-#ifdef TRISADEBUG
-/*
- * Dump the adapters AIP
- */
-void
-tr_isa_dumpaip(memt, mmioh)
- bus_space_tag_t memt;
- bus_space_handle_t mmioh;
-{
- unsigned int off, val;
- printf("AIP contents:");
- for (off=0; off < 256; off++) {
- val = bus_space_read_1(memt, mmioh, TR_MAC_OFFSET + off);
- if ((off % 16) == 0)
- printf("\n");
- printf("%02x ", val);
- }
- printf("\n");
-}
-#endif
diff --git a/sys/dev/isa/if_tribm_isa.c b/sys/dev/isa/if_tribm_isa.c
index 57cfc1c5b94..e69de29bb2d 100644
--- a/sys/dev/isa/if_tribm_isa.c
+++ b/sys/dev/isa/if_tribm_isa.c
@@ -1,175 +0,0 @@
-/* $OpenBSD: if_tribm_isa.c,v 1.3 2002/03/14 01:26:56 millert Exp $ */
-/* $NetBSD: if_tribm_isa.c,v 1.2 1999/03/22 23:01:37 bad Exp $ */
-
-/*
- * Copyright (c) 1999 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Onno van der Linden.
- *
- * 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by The NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/socket.h>
-#include <sys/device.h>
-#include <sys/timeout.h>
-
-#include <net/if.h>
-#include <net/if_media.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-
-#include <machine/bus.h>
-
-#include <dev/isa/isavar.h>
-
-#include <dev/ic/tropicreg.h>
-#include <dev/ic/tropicvar.h>
-
-int tribm_isa_probe(struct device *, void *, void *);
-int tr_isa_map_io(struct isa_attach_args *, bus_space_handle_t *,
- bus_space_handle_t *);
-void tr_isa_unmap_io(struct isa_attach_args *, bus_space_handle_t,
- bus_space_handle_t);
-
-int
-tribm_isa_probe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- struct isa_attach_args *ia = aux;
- static int irq_f[4] = { 9, 3, 6, 7 };
- static int irq_e[4] = { 9, 3, 10, 11 };
- bus_space_tag_t piot = ia->ia_iot;
- bus_space_tag_t memt = ia->ia_memt;
- bus_space_handle_t pioh, mmioh;
- int i, irq;
- u_int8_t s;
-
-#ifdef notyet
-/* XXX Try both 0xa20 and 0xa24 and store that info like 3com */
- if (ia->ia_iobase == IOBASEUNK)
- ia->ia_iobase = 0xa20;
-#else
- if (ia->ia_iobase == IOBASEUNK)
- return 0;
-#endif
-
- ia->ia_iosize = 4;
- ia->ia_aux = NULL;
-
- if (tr_isa_map_io(ia, &pioh, &mmioh))
- return 0;
-
-/*
- * F = Token-Ring Network PC Adapter
- * Token-Ring Network PC Adapter II
- * Token-Ring Network Adapter/A
- * E = Token-Ring Network 16/4 Adapter/A (long card)
- * Token-Ring Network 16/4 Adapter
- * D = Token-Ring Network 16/4 Adapter/A (short card)
- * 16/4 ISA-16 Adapter
- * C = Auto 16/4 Token-Ring ISA Adapter
- * Auto 16/4 Token-Ring MC Adapter
- */
-/*
- * XXX Both 0xD and 0xC types should be able to use 16-bit read and writes
- */
- switch (bus_space_read_1(memt, mmioh, TR_TYP_OFFSET)) {
- case 0xF:
- case 0xE:
- case 0xD:
- if (ia->ia_maddr == MADDRUNK)
-#ifdef notyet
- ia->ia_maddr = TR_SRAM_DEFAULT;
-#else
- return 0;
-#endif
- break;
- case 0xC:
- i = bus_space_read_1(memt, mmioh, TR_ACA_OFFSET) << 12;
- if (ia->ia_maddr == MADDRUNK)
- ia->ia_maddr = i;
- else if (ia->ia_maddr != i) {
- printf(
-"tribm_isa_probe: sram mismatch; kernel configured %x != board configured %x\n",
- ia->ia_maddr, i);
- tr_isa_unmap_io(ia, pioh, mmioh);
- return 0;
- }
- break;
- default:
- printf("tribm_isa_probe: unknown type code %x\n",
- bus_space_read_1(memt, mmioh, TR_TYP_OFFSET));
- tr_isa_unmap_io(ia, pioh, mmioh);
- return 0;
- }
-
- s = bus_space_read_1(piot, pioh, TR_SWITCH);
-
- switch (bus_space_read_1(memt, mmioh, TR_IRQ_OFFSET)) {
- case 0xF:
- irq = irq_f[s & 3];
- break;
- case 0xE:
- irq = irq_e[s & 3];
- break;
- default:
- printf("tribm_isa_probe: Unknown IRQ code %x\n",
- bus_space_read_1(memt, mmioh, TR_IRQ_OFFSET));
- tr_isa_unmap_io(ia, pioh, mmioh);
- return 0;
- }
-
- if (ia->ia_irq == IRQUNK)
- ia->ia_irq = irq;
- else if (ia->ia_irq != irq) {
- printf(
-"tribm_isa_probe: irq mismatch; kernel configured %d != board configured %d\n",
- ia->ia_irq, irq);
- tr_isa_unmap_io(ia, pioh, mmioh);
- return 0;
- }
-/*
- * XXX 0x0c == MSIZEMASK (MSIZEBITS)
- */
- ia->ia_msize = 8192 <<
- ((bus_space_read_1(memt, mmioh, TR_ACA_OFFSET + 1) & 0x0c) >> 2);
- tr_isa_unmap_io(ia, pioh, mmioh);
- /* Check alignment of membase. */
- if ((ia->ia_maddr & (ia->ia_msize-1)) != 0) {
- printf("tribm_isa_probe: SRAM unaligned 0x%04x/%d\n",
- ia->ia_maddr, ia->ia_msize);
- return 0;
- }
- return 1;
-}
diff --git a/sys/dev/isa/if_trtcm_isa.c b/sys/dev/isa/if_trtcm_isa.c
index 7dcd8c20f4a..e69de29bb2d 100644
--- a/sys/dev/isa/if_trtcm_isa.c
+++ b/sys/dev/isa/if_trtcm_isa.c
@@ -1,359 +0,0 @@
-/* $OpenBSD: if_trtcm_isa.c,v 1.4 2006/03/05 21:48:56 miod Exp $ */
-/* $NetBSD: if_trtcm_isa.c,v 1.3 1999/04/30 15:29:24 bad Exp $ */
-
-#undef TRTCMISADEBUG
-/*
- * Copyright (c) 1999 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Onno van der Linden.
- *
- * 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by The NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/socket.h>
-#include <sys/device.h>
-#include <sys/malloc.h>
-#include <sys/timeout.h>
-
-#include <net/if.h>
-#include <net/if_media.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-
-#include <machine/bus.h>
-
-#include <dev/isa/isavar.h>
-#include <dev/isa/elink.h>
-
-#include <dev/ic/tropicreg.h>
-#include <dev/ic/tropicvar.h>
-
-#include <dev/ic/elink3reg.h>
-
-u_int16_t tcmreadeeprom(bus_space_tag_t, bus_space_handle_t, int);
-#ifdef TRTCMISADEBUG
-void tcmdumpeeprom(bus_space_tag_t, bus_space_handle_t);
-#endif
-
-int trtcm_isa_probe(struct device *, void *, void *);
-
-int trtcm_isa_mediachange(struct tr_softc *);
-void trtcm_isa_mediastatus(struct tr_softc *, struct ifmediareq *);
-
-/*
- * TODO:
- *
- * if_media handling in the 3com case
- * mediachange() and mediastatus() function
- * certain newer cards can set their speed on the fly via
- * DIR_SET_DEFAULT_RING_SPEED or set the speed in the eeprom ??
- */
-
-static void tcmaddcard(int, int, int, int, u_int, int, int);
-
-/*
- * This keeps track of which ISAs have been through a 3com probe sequence.
- * A simple static variable isn't enough, since it's conceivable that
- * a system might have more than one ISA bus.
- *
- * The "tcm_bus" member is the unit number of the parent ISA bus, e.g. "0"
- * for "isa0".
- */
-struct tcm_isa_done_probe {
- LIST_ENTRY(tcm_isa_done_probe) tcm_link;
- int tcm_bus;
-};
-static LIST_HEAD(, tcm_isa_done_probe) tcm_isa_all_probes;
-static int tcm_isa_probes_initialized;
-
-#define MAXTCMCARDS 20 /* if you have more than 20, you lose */
-
-static struct tcmcard {
- int bus;
- int iobase;
- int irq;
- int maddr;
- u_int msize;
- long model;
- char available;
- char pnpmode;
-} tcmcards[MAXTCMCARDS];
-
-static int ntcmcards = 0;
-
-static void
-tcmaddcard(bus, iobase, irq, maddr, msize, model, pnpmode)
- int bus, iobase, irq, maddr;
- u_int msize;
- int model, pnpmode;
-{
-
- if (ntcmcards >= MAXTCMCARDS)
- return;
- tcmcards[ntcmcards].bus = bus;
- tcmcards[ntcmcards].iobase = iobase;
- tcmcards[ntcmcards].irq = irq;
- tcmcards[ntcmcards].maddr = maddr;
- tcmcards[ntcmcards].msize = msize;
- tcmcards[ntcmcards].model = model;
- tcmcards[ntcmcards].available = 1;
- tcmcards[ntcmcards].pnpmode = pnpmode;
- ntcmcards++;
-}
-
-/*
- * We get eeprom data from the id_port given an offset into the
- * eeprom. Basically; after the ID_sequence is sent to all of
- * the cards; they enter the ID_CMD state where they will accept
- * command requests. 0x80-0xbf loads the eeprom data. We then
- * read the port 16 times and with every read; the cards check
- * for contention (ie: if one card writes a 0 bit and another
- * writes a 1 bit then the host sees a 0. At the end of the cycle;
- * each card compares the data on the bus; if there is a difference
- * then that card goes into ID_WAIT state again). In the meantime;
- * one bit of data is returned in the AX register which is conveniently
- * returned to us by bus_space_read_1(). Hence; we read 16 times getting one
- * bit of data with each read.
- *
- * NOTE: the caller must provide an i/o handle for ELINK_ID_PORT!
- */
-u_int16_t
-tcmreadeeprom(iot, ioh, offset)
- bus_space_tag_t iot;
- bus_space_handle_t ioh;
- int offset;
-{
- u_int16_t data = 0;
- int i;
-
- bus_space_write_1(iot, ioh, 0, 0x80 + offset);
- delay(1000);
- for (i = 0; i < 16; i++)
- data = (data << 1) | (bus_space_read_2(iot, ioh, 0) & 1);
- return (data);
-}
-
-#ifdef TRTCMISADEBUG
-/*
- * Dump the contents of the EEPROM to the console.
- */
-void
-tcmdumpeeprom(iot, ioh)
- bus_space_tag_t iot;
- bus_space_handle_t ioh;
-{
- unsigned int off, val;
-
- printf("EEPROM contents:");
- for (off=0; off < 32; off++) {
- val = tcmreadeeprom(iot, ioh, off);
- if ((off % 8) == 0)
- printf("\n");
- printf("%04x ", val);
- }
- printf("\n");
-}
-#endif
-
-int
-trtcm_isa_mediachange(sc)
- struct tr_softc *sc;
-{
- return EINVAL;
-}
-
-void
-trtcm_isa_mediastatus(sc, ifmr)
- struct tr_softc *sc;
- struct ifmediareq *ifmr;
-{
- struct ifmedia *ifm = &sc->sc_media;
-
- ifmr->ifm_active = ifm->ifm_cur->ifm_media;
-}
-
-/* XXX hard coded constants in readeeprom elink_idseq */
-
-int
-trtcm_isa_probe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- struct isa_attach_args *ia = aux;
- int bus = parent->dv_unit;
- bus_space_tag_t iot = ia->ia_iot;
- bus_space_handle_t ioh;
- u_int msize;
- int slot, iobase, irq, i, maddr, rsrccfg, pnpmode;
- u_int16_t vendor, model;
- struct tcm_isa_done_probe *tcm;
- static int irqs[] = { 7, 15, 6, 11, 3, 10, 9, 5 };
-
- if (tcm_isa_probes_initialized == 0) {
- LIST_INIT(&tcm_isa_all_probes);
- tcm_isa_probes_initialized = 1;
- }
-
- /*
- * Probe this bus if we haven't done so already.
- */
- LIST_FOREACH(tcm, &tcm_isa_all_probes, tcm_link)
- if (tcm->tcm_bus == bus)
- goto bus_probed;
-
- /*
- * Mark this bus so we don't probe it again.
- */
- tcm = (struct tcm_isa_done_probe *)
- malloc(sizeof(struct tcm_isa_done_probe), M_DEVBUF, M_NOWAIT);
- if (tcm == NULL) {
- printf("trtcm_isa_probe: can't allocate state storage");
- return 0;
- }
-
- tcm->tcm_bus = bus;
- LIST_INSERT_HEAD(&tcm_isa_all_probes, tcm, tcm_link);
-
- /*
- * Map the TokenLink ID port for the probe sequence.
- */
- if (bus_space_map(iot, ELINK_ID_PORT, 1, 0, &ioh)) {
- printf("trtcm_isa_probe: can't map TokenLink ID port\n");
- return 0;
- }
-
- for (slot = 0; slot < MAXTCMCARDS; slot++) {
- pnpmode = 0;
- elink_reset(iot, ioh, bus);
- elink_idseq(iot, ioh, TLINK_619_POLY);
-
- /* Untag all the adapters so they will talk to us. */
- if (slot == 0)
- bus_space_write_1(iot, ioh, 0, TAG_ADAPTER + 0);
-
- vendor = htons(tcmreadeeprom(iot, ioh, EEPROM_MFG_ID));
- if (vendor != MFG_ID)
- continue;
-
- model = htons(tcmreadeeprom(iot, ioh, EEPROM_PROD_ID));
- if (((model & 0xfff0) != 0x6190) &&
- ((model & 0xfff0) != 0x3190)) { /* XXX hardcoded */
-#if 0
- printf("trtcm: unknown model 0x%04x\n", model);
-#endif
- continue;
- }
-#ifdef TRTCMISADEBUG
- tcmdumpeeprom(iot, ioh);
-
- printf("speed: %d\n", (tcmreadeeprom(iot,ioh,8) & 2) ? 4 : 16);
-#endif
-
- rsrccfg = iobase = tcmreadeeprom(iot, ioh, EEPROM_RESOURCE_CFG);
- if (iobase & 0x20)
- iobase = tcmreadeeprom(iot, ioh, EEPROM_ADDR_CFG) & 1 ?
- 0xa20 : 0xa24;
- else
- iobase = (iobase & 0x1f) * 0x10 + 0x200;
-
- maddr = ((tcmreadeeprom(iot, ioh, EEPROM_OEM_ADDR0) & 0xfc00)
- << 3) + 0x80000;
- msize = 65536 >> ((tcmreadeeprom(iot, ioh, 8) & 0x0c) >> 2);
-
- irq = tcmreadeeprom(iot, ioh, EEPROM_ADDR_CFG) & 0x180;
- irq |= (tcmreadeeprom(iot, ioh, EEPROM_RESOURCE_CFG) & 0x40);
- irq = irqs[irq >> 6];
-
- /* Tag card so it will not respond to contention again. */
- bus_space_write_1(iot, ioh, 0, TAG_ADAPTER + 1);
-
- /*
- * Don't attach a 3c319 in PnP mode.
- *
- * XXX Testing for the 13th bit in iobase being 0 might not
- * be the right thing to do, but the EEPROM of the 3C319 is
- * undocumented according to 3COM and this is one of the
- * three bits that changed when I put the card in PnP mode. -chb
- */
- if (((model & 0xffff0) == 0x3190) &&
- ((rsrccfg & 0x1000) == 0)) {
- printf("3COM 3C319 TokenLink Velocity in PnP mode\n");
- pnpmode = 1;
- }
- else {
- /*
- * XXX: this should probably not be done here
- * because it enables the drq/irq lines from
- * the board. Perhaps it should be done after
- * we have checked for irq/drq collisions?
- */
- bus_space_write_1(iot, ioh, 0,
- ACTIVATE_ADAPTER_TO_CONFIG);
- }
- tcmaddcard(bus, iobase, irq, maddr, msize, model, pnpmode);
- }
- bus_space_unmap(iot, ioh, 1);
-
-bus_probed:
-
- for (i = 0; i < ntcmcards; i++) {
- if (tcmcards[i].bus != bus)
- continue;
- if (tcmcards[i].available == 0)
- continue;
- if (ia->ia_iobase != IOBASEUNK &&
- ia->ia_iobase != tcmcards[i].iobase)
- continue;
- if (ia->ia_irq != IRQUNK &&
- ia->ia_irq != tcmcards[i].irq)
- continue;
- goto good;
- }
- return 0;
-
-good:
- tcmcards[i].available = 0;
- if (tcmcards[i].pnpmode)
- return -1; /* XXX Don't actually probe this card. */
- ia->ia_iobase = tcmcards[i].iobase;
- ia->ia_irq = tcmcards[i].irq;
- /* XXX probably right, but ...... */
- if (ia->ia_iobase == 0xa20 || ia->ia_iobase == 0x0a24)
- ia->ia_iosize = 4;
- else
- ia->ia_iosize = 16;
- ia->ia_maddr = tcmcards[i].maddr;
- ia->ia_msize = tcmcards[i].msize;
- ia->ia_aux = (void *) tcmcards[i].model;
- return 1;
-}