diff options
author | Claudio Jeker <claudio@cvs.openbsd.org> | 2007-05-29 18:21:20 +0000 |
---|---|---|
committer | Claudio Jeker <claudio@cvs.openbsd.org> | 2007-05-29 18:21:20 +0000 |
commit | c1821f5cc50d3d5d3a99c8d48845e59a0bfffdd0 (patch) | |
tree | 4461b7190aec61a7df4d36ad81bcde1cabefaa45 /sys/dev | |
parent | c696e5ff82ab384bb17f374d81f93705b2a5dc26 (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.c | 1732 | ||||
-rw-r--r-- | sys/dev/ic/tropicreg.h | 556 | ||||
-rw-r--r-- | sys/dev/ic/tropicvar.h | 105 | ||||
-rw-r--r-- | sys/dev/isa/files.isa | 9 | ||||
-rw-r--r-- | sys/dev/isa/if_tr_isa.c | 257 | ||||
-rw-r--r-- | sys/dev/isa/if_tribm_isa.c | 175 | ||||
-rw-r--r-- | sys/dev/isa/if_trtcm_isa.c | 359 |
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; -} |