From ce6da4401ad3576cfbb0ea50741b33a65a392053 Mon Sep 17 00:00:00 2001 From: Hasso Tepper Date: Mon, 27 Aug 2007 13:15:14 +0000 Subject: [PATCH] Nuke ARCnet support. --- share/man/man4/Makefile | 3 +- share/man/man4/cm.4 | 162 ------- sys/conf/files | 3 +- sys/config/LINT | 6 +- sys/dev/netif/cm/if_cm_isa.c | 127 ----- sys/dev/netif/cm/smc90cx6.c | 939 ------------------------------------ sys/dev/netif/cm/smc90cx6reg.h | 92 ---- sys/dev/netif/cm/smc90cx6var.h | 102 ---- sys/net/if.c | 4 +- sys/net/if_arc.h | 152 ------ sys/net/if_arcsubr.c | 816 ------------------------------- sys/netinet/if_ether.c | 32 +- sys/netinet6/in6_ifattach.c | 19 +- sys/netinet6/nd6.c | 11 +- sys/netinet6/nd6_nbr.c | 3 +- sys/platform/pc32/i386/userconfig.c | 3 +- 16 files changed, 13 insertions(+), 2461 deletions(-) delete mode 100644 share/man/man4/cm.4 delete mode 100644 sys/dev/netif/cm/if_cm_isa.c delete mode 100644 sys/dev/netif/cm/smc90cx6.c delete mode 100644 sys/dev/netif/cm/smc90cx6reg.h delete mode 100644 sys/dev/netif/cm/smc90cx6var.h delete mode 100644 sys/net/if_arc.h delete mode 100644 sys/net/if_arcsubr.c diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index f00c0847c7..52d0b16e4e 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -1,6 +1,6 @@ # @(#)Makefile 8.1 (Berkeley) 6/18/93 # $FreeBSD: src/share/man/man4/Makefile,v 1.83.2.66 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/share/man/man4/Makefile,v 1.62 2007/08/16 20:38:33 hasso Exp $ +# $DragonFly: src/share/man/man4/Makefile,v 1.63 2007/08/27 13:15:13 hasso Exp $ MAN= aac.4 \ acpi.4 \ @@ -40,7 +40,6 @@ MAN= aac.4 \ cd.4 \ ch.4 \ ciss.4 \ - cm.4 \ crypto.4 \ csa.4 \ cue.4 \ diff --git a/share/man/man4/cm.4 b/share/man/man4/cm.4 deleted file mode 100644 index bb50613913..0000000000 --- a/share/man/man4/cm.4 +++ /dev/null @@ -1,162 +0,0 @@ -.\" -.\" Copyright (c) 2004 Tom Rhodes -.\" All rights reserved. -.\" -.\" 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. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. -.\" -.\" $FreeBSD: src/share/man/man4/cm.4,v 1.9 2005/10/07 02:32:15 trhodes Exp $ -.\" $DragonFly: src/share/man/man4/Attic/cm.4,v 1.2 2006/11/11 18:50:04 swildner Exp $ -.\" -.Dd July 16, 2005 -.Dt CM 4 -.Os -.Sh NAME -.Nm cm -.Nd "SMC Arcnet Ethernet device driver" -.Sh SYNOPSIS -To compile this driver into the kernel, -place the following lines in your kernel -configuration file: -.Bd -ragged -offset indent -.Cd "device isa" -.Cd "device cm" -.Cd "pseudo-device arcnet" -.Ed -.Sh DESCRIPTION -The -.Nm -driver provides support for the -.Tn Arcnet -.Tn ISA -network adapters. -.Sh HARDWARE -The -.Nm -driver supports the following -card models: -.Pp -.Bl -bullet -compact -.It -SMC90c26 -.It -SMC90c56 -.It -SMC90c66 in '56 compatibility mode. -.El -.Sh IMPLEMENTATION NOTES -When the -.Va IFF_NOARP -flag is set on the -.Nm -interface, -it does not employ the address resolution protocol described in -.Xr arp 4 -to dynamically map between Internet and Ethernet addresses on -the local network. -Instead it uses the least significant 8 bits of the -.Tn IP -address as the hardware address -like described in -.Tn RFC -1051 -and -.Tn RFC -1201. -.Pp -With the -.Dv IFF_LINK0 -flag cleared -.Tn IP/ARP/RARP -encoding is done according to -.Tn RFC -1201 -that is, with Packet Header Definition Standard header and packet type -212 / 213. -The -.Tn MTU -is normally 1500. -The -.Dv IFF_LINK0 -flag is cleared by default. -.Pp -With the -.Dv IFF_LINK0 -flag set, -.Tn IP -and -.Tn ARP -encoding is done according to the deprecated -.Tn RFC -1051 encoding, that is with simple header, packet type 240 / 241, -and the -.Tn MTU -is 507. -.Pp -When switching between the two modes, use -.Dl ifconfig interfacename down up -to switch the -.Tn MTU . -.Sh DIAGNOSTICS -The following driver specific error messages -may be reported: -.Bl -diag -.It "reset: card reset, link addr = 0x%02x (cm%d)" -The card is being reset and a new link address assigned. -.It "srint: restarted rx on buf cm%d" -The rx buffer has been emptied and will be reset. -.El -.Sh SEE ALSO -.Xr netintro 4 , -.Xr ifconfig 8 -.Sh HISTORY -The -.Nm -device was ported from -.Nx -by -.An Max Khon Aq fjoe@FreeBSD.org -and first appeared in -.Fx 4.6 . -This manual page first appeared in -.Fx 5.3 . -.Sh AUTHORS -.An -nosplit -This manual page was written by -.An Tom Rhodes Aq trhodes@FreeBSD.org . -The -.Sx IMPLEMENTATION NOTES -section was submitted by -.An Max Khon Aq fjoe@FreeBSD.org -and originated from -.Nx . -.Sh BUGS -The -.Nm -driver code could do with a bit of improvement, -it would be nice if some one could come along and take care of this. -.Pp -The -.Sx IMPLEMENTATION NOTES -section is specific to all Arcnet -devices (see -.Pa sys/net/if_arcsubr.c ) -and should be moved to a more generic location. diff --git a/sys/conf/files b/sys/conf/files index 3ee4785fb4..0a8688a604 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/sys/conf/files,v 1.174 2007/08/16 20:38:33 hasso Exp $ +# $DragonFly: src/sys/conf/files,v 1.175 2007/08/27 13:15:13 hasso Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -699,7 +699,6 @@ net/bridge/if_bridge.c optional bridge net/bridge/bridgestp.c optional bridge net/bsd_comp.c optional ppp_bsdcomp net/if.c standard -net/if_arcsubr.c optional arcnet net/if_atmsubr.c optional atm net/disc/if_disc.c optional disc net/ef/if_ef.c optional ef diff --git a/sys/config/LINT b/sys/config/LINT index 6efc58ea18..382ce33417 100644 --- a/sys/config/LINT +++ b/sys/config/LINT @@ -3,7 +3,7 @@ # as much of the source tree as it can. # # $FreeBSD: src/sys/i386/conf/LINT,v 1.749.2.144 2003/06/04 17:56:59 sam Exp $ -# $DragonFly: src/sys/config/LINT,v 1.124 2007/08/18 18:16:24 swildner Exp $ +# $DragonFly: src/sys/config/LINT,v 1.125 2007/08/27 13:15:14 hasso Exp $ # # NB: You probably don't want to try running a kernel built from this # file. Instead, you should start from GENERIC, and add options from @@ -515,7 +515,6 @@ device mn # Munich32x/Falc54 Nx64kbit/sec cards. # Ethernets; it is MANDATORY when a Ethernet device driver is # configured or token-ring is enabled. # The 'fddi' pseudo-device provides generic code to support FDDI. -# The `arcnet' pseudo-device provides generic code to support Arcnet. # The `sppp' pseudo-device serves a similar role for certain types # of synchronous PPP links (like `cx', `ar'). # The `sl' pseudo-device implements the Serial Line IP (SLIP) service. @@ -550,7 +549,6 @@ pseudo-device vlan 1 #VLAN support pseudo-device bridge #Bridging support pseudo-device token #Generic TokenRing pseudo-device fddi #Generic FDDI -pseudo-device arcnet #Generic Arcnet pseudo-device sppp #Generic Synchronous PPP pseudo-device loop #Network loopback device pseudo-device bpf #Berkeley packet filter @@ -1378,8 +1376,6 @@ options PUC_FASTINTR # Network interfaces: `cx', `ed', `el', `ep', `ie', `is', `le', `lnc' # # ar: Arnet SYNC/570i hdlc sync 2/4 port V.35/X.21 serial driver (requires sppp) -# cm: Arcnet SMC COM90c26 / SMC COM90c56 -# (and SMC COM90c66 in '56 compatibility mode) adapters. # cs: IBM Etherjet and other Crystal Semi CS89x0-based adapters # cx: Cronyx/Sigma multiport sync/async (with Cisco or PPP framing) # ed: Western Digital and SMC 80xx; Novell NE1000 and NE2000; 3Com 3C503 diff --git a/sys/dev/netif/cm/if_cm_isa.c b/sys/dev/netif/cm/if_cm_isa.c deleted file mode 100644 index 1af61884cf..0000000000 --- a/sys/dev/netif/cm/if_cm_isa.c +++ /dev/null @@ -1,127 +0,0 @@ -/* $NetBSD: if_bah_zbus.c,v 1.6 2000/01/23 21:06:12 aymeric Exp $ */ -/* $FreeBSD: src/sys/dev/cm/if_cm_isa.c,v 1.1.2.1 2002/02/13 22:33:41 fjoe Exp $ */ -/* $DragonFly: src/sys/dev/netif/cm/Attic/if_cm_isa.c,v 1.16 2006/10/25 20:55:56 dillon Exp $ */ - -/*- - * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Ignatios Souvatzis. - * - * 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 -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "smc90cx6var.h" - -static int cm_isa_probe (device_t); -static int cm_isa_attach (device_t); - -static int -cm_isa_probe(device_t dev) -{ - int error; - - error = cm_probe(dev); - if (error == 0) - error = cm_alloc_irq(dev, 0); - - cm_release_resources(dev); - return (error); -} - -static int -cm_isa_attach(device_t dev) -{ - struct cm_softc *sc = device_get_softc(dev); - int error; - - cm_alloc_port(dev, sc->port_rid, sc->port_used); - cm_alloc_memory(dev, sc->mem_rid, sc->mem_used); - cm_alloc_irq(dev, sc->irq_rid); - - error = cm_attach(dev); - if (error) - return error; - - error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE, - cmintr, sc, &sc->irq_handle, - sc->sc_arccom.ac_if.if_serializer); - if (error) { - arc_ifdetach(&sc->sc_arccom.ac_if); - cm_release_resources(dev); - return (error); - } - - return 0; -} - -static int -cm_isa_detach(device_t dev) -{ - struct cm_softc *sc = device_get_softc(dev); - - lwkt_serialize_enter(sc->sc_arccom.ac_if.if_serializer); - cm_stop(sc); - bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); - lwkt_serialize_exit(sc->sc_arccom.ac_if.if_serializer); - - arc_ifdetach(&sc->sc_arccom.ac_if); - cm_release_resources(dev); - - return (0); -} - -static device_method_t cm_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, cm_isa_probe), - DEVMETHOD(device_attach, cm_isa_attach), - DEVMETHOD(device_detach, cm_isa_detach), - - { 0, 0 } -}; - -static driver_t cm_isa_driver = { - "cm", - cm_isa_methods, - sizeof(struct cm_softc) -}; - -DRIVER_MODULE(if_cm, isa, cm_isa_driver, cm_devclass, 0, 0); diff --git a/sys/dev/netif/cm/smc90cx6.c b/sys/dev/netif/cm/smc90cx6.c deleted file mode 100644 index 6f8fe5f503..0000000000 --- a/sys/dev/netif/cm/smc90cx6.c +++ /dev/null @@ -1,939 +0,0 @@ -/* $NetBSD: smc90cx6.c,v 1.38 2001/07/07 15:57:53 thorpej Exp $ */ -/* $FreeBSD: src/sys/dev/cm/smc90cx6.c,v 1.1.2.3 2003/02/05 18:42:14 fjoe Exp $ */ -/* $DragonFly: src/sys/dev/netif/cm/Attic/smc90cx6.c,v 1.23 2007/05/17 08:19:02 swildner Exp $ */ - -/*- - * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Ignatios Souvatzis. - * - * 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. - */ - -/* - * Chip core driver for the SMC90c26 / SMC90c56 (and SMC90c66 in '56 - * compatibility mode) boards - */ - -#define CMRETRANSMIT /**/ -/* #define CM_DEBUG */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "smc90cx6reg.h" -#include "smc90cx6var.h" - -DECLARE_DUMMY_MODULE(if_cm); -MODULE_DEPEND(if_cm, arcnet, 1, 1, 1); - -/* these should be elsewhere */ - -#define ARC_MIN_LEN 1 -#define ARC_MIN_FORBID_LEN 254 -#define ARC_MAX_FORBID_LEN 256 -#define ARC_MAX_LEN 508 -#define ARC_ADDR_LEN 1 - -/* for watchdog timer. This should be more than enough. */ -#define ARCTIMEOUT (5*IFNET_SLOWHZ) - -/* short notation */ - -#define GETREG(off) \ - bus_space_read_1(rman_get_bustag((sc)->port_res), \ - rman_get_bushandle((sc)->port_res), \ - (off)) -#define PUTREG(off, value) \ - bus_space_write_1(rman_get_bustag((sc)->port_res), \ - rman_get_bushandle((sc)->port_res), \ - (off), (value)) -#define GETMEM(off) \ - bus_space_read_1(rman_get_bustag((sc)->mem_res), \ - rman_get_bushandle((sc)->mem_res), \ - (off)) -#define PUTMEM(off, value) \ - bus_space_write_1(rman_get_bustag((sc)->mem_res), \ - rman_get_bushandle((sc)->mem_res), \ - (off), (value)) - -devclass_t cm_devclass; - -/* - * This currently uses 2 bufs for tx, 2 for rx - * - * New rx protocol: - * - * rx has a fillcount variable. If fillcount > (NRXBUF-1), - * rx can be switched off from rx hard int. - * Else rx is restarted on the other receiver. - * rx soft int counts down. if it is == (NRXBUF-1), it restarts - * the receiver. - * To ensure packet ordering (we need that for 1201 later), we have a counter - * which is incremented modulo 256 on each receive and a per buffer - * variable, which is set to the counter on filling. The soft int can - * compare both values to determine the older packet. - * - * Transmit direction: - * - * cm_start checks tx_fillcount - * case 2: return - * - * else fill tx_act ^ 1 && inc tx_fillcount - * - * check tx_fillcount again. - * case 2: set IFF_OACTIVE to stop arc_output from filling us. - * case 1: start tx - * - * tint clears IFF_OCATIVE, decrements and checks tx_fillcount - * case 1: start tx on tx_act ^ 1, softcall cm_start - * case 0: softcall cm_start - * - * #define fill(i) get mbuf && copy mbuf to chip(i) - */ - -void cm_init (void *); -void cm_reset (struct cm_softc *); -void cm_start (struct ifnet *); -int cm_ioctl (struct ifnet *, unsigned long, caddr_t, struct ucred *); -void cm_watchdog (struct ifnet *); -void cm_srint (void *vsc); -static void cm_tint (struct cm_softc *, int); -void cm_reconwatch(void *); - -int -cm_probe(device_t dev) -{ - int error; - struct cm_softc *sc = device_get_softc(dev); - - error = cm_alloc_port(dev, 0, CM_IO_PORTS); - if (error) - return error; - - if (GETREG(CMSTAT) == 0xff) - return ENXIO; - - error = cm_alloc_memory(dev, 0, 0x800); - if (error) - return error; - - return 0; -} - -/* - * Allocate a port resource with the given resource id. - */ -int -cm_alloc_port(device_t dev, int rid, int size) -{ - struct cm_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - 0ul, ~0ul, size, RF_ACTIVE); - if (res) { - sc->port_rid = rid; - sc->port_res = res; - sc->port_used = size; - return (0); - } else { - return (ENOENT); - } -} - -/* - * Allocate a memory resource with the given resource id. - */ -int -cm_alloc_memory(device_t dev, int rid, int size) -{ - struct cm_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0ul, ~0ul, size, RF_ACTIVE); - if (res) { - sc->mem_rid = rid; - sc->mem_res = res; - sc->mem_used = size; - return (0); - } else { - return (ENOENT); - } -} - -/* - * Allocate an irq resource with the given resource id. - */ -int -cm_alloc_irq(device_t dev, int rid) -{ - struct cm_softc *sc = device_get_softc(dev); - struct resource *res; - - res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); - if (res) { - sc->irq_rid = rid; - sc->irq_res = res; - return (0); - } else { - return (ENOENT); - } -} - -/* - * Release all resources - */ -void -cm_release_resources(device_t dev) -{ - struct cm_softc *sc = device_get_softc(dev); - - if (sc->port_res) { - bus_deactivate_resource(dev, SYS_RES_IOPORT, - sc->port_rid, sc->port_res); - bus_release_resource(dev, SYS_RES_IOPORT, - sc->port_rid, sc->port_res); - sc->port_res = 0; - } - if (sc->mem_res) { - bus_deactivate_resource(dev, SYS_RES_MEMORY, - sc->mem_rid, sc->mem_res); - bus_release_resource(dev, SYS_RES_MEMORY, - sc->mem_rid, sc->mem_res); - sc->mem_res = 0; - } - if (sc->irq_res) { - bus_deactivate_resource(dev, SYS_RES_IRQ, - sc->irq_rid, sc->irq_res); - bus_release_resource(dev, SYS_RES_IRQ, - sc->irq_rid, sc->irq_res); - sc->irq_res = 0; - } -} - -int -cm_attach(device_t dev) -{ - struct cm_softc *sc = device_get_softc(dev); - struct ifnet *ifp = &sc->sc_arccom.ac_if; - u_int8_t linkaddress; - - /* - * read the arcnet address from the board - */ - - GETREG(CMRESET); - do { - DELAY(200); - } while (!(GETREG(CMSTAT) & CM_POR)); - - linkaddress = GETMEM(CMMACOFF); - - /* clear the int mask... */ - - sc->sc_intmask = 0; - PUTREG(CMSTAT, 0); - - PUTREG(CMCMD, CM_CONF(CONF_LONG)); - PUTREG(CMCMD, CM_CLR(CLR_POR|CLR_RECONFIG)); - sc->sc_recontime = sc->sc_reconcount = 0; - - callout_init(&sc->sc_recon_ch); - - /* - * set interface to stopped condition (reset) - */ - cm_stop(sc); - - ifp->if_softc = sc; - if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_start = cm_start; - ifp->if_ioctl = cm_ioctl; - ifp->if_watchdog = cm_watchdog; - ifp->if_init = cm_init; - ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; - ifp->if_timer = 0; - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX; - - arc_ifattach(ifp, linkaddress, NULL); - return 0; -} - -/* - * Initialize device - * - */ -void -cm_init(void *xsc) -{ - struct cm_softc *sc = (struct cm_softc *)xsc; - struct ifnet *ifp = &sc->sc_arccom.ac_if; - - if ((ifp->if_flags & IFF_RUNNING) == 0) { - ifp->if_flags |= IFF_RUNNING; - cm_reset(sc); - cm_start(ifp); - } -} - -/* - * Reset the interface... - * - * this assumes that it is called inside a critical section... - * - */ -void -cm_reset(struct cm_softc *sc) -{ - struct ifnet *ifp; - int linkaddress; - - ifp = &sc->sc_arccom.ac_if; - -#ifdef CM_DEBUG - if_printf(ifp, "reset\n"); -#endif - /* stop and restart hardware */ - - GETREG(CMRESET); - do { - DELAY(200); - } while (!(GETREG(CMSTAT) & CM_POR)); - - linkaddress = GETMEM(CMMACOFF); - -#if defined(CM_DEBUG) && (CM_DEBUG > 2) - if_printf(ifp, "reset: card reset, link addr = 0x%02x (%d)\n", - linkaddress, linkaddress); -#endif - - /* tell the routing level about the (possibly changed) link address */ - arc_storelladdr(ifp, linkaddress); - arc_frag_init(ifp); - - /* POR is NMI, but we need it below: */ - sc->sc_intmask = CM_RECON|CM_POR; - PUTREG(CMSTAT, sc->sc_intmask); - PUTREG(CMCMD, CM_CONF(CONF_LONG)); - -#ifdef CM_DEBUG - if_printf(ifp, "reset: chip configured, status=0x%02x\n", - GETREG(CMSTAT)); -#endif - PUTREG(CMCMD, CM_CLR(CLR_POR|CLR_RECONFIG)); - -#ifdef CM_DEBUG - if_printf(ifp, "reset: bits cleared, status=0x%02x\n", GETREG(CMSTAT)); -#endif - - sc->sc_reconcount_excessive = ARC_EXCESSIVE_RECONS; - - /* start receiver */ - - sc->sc_intmask |= CM_RI; - sc->sc_rx_fillcount = 0; - sc->sc_rx_act = 2; - - PUTREG(CMCMD, CM_RXBC(2)); - PUTREG(CMSTAT, sc->sc_intmask); - -#ifdef CM_DEBUG - if_printf(ifp, "reset: started receiver, status=0x%02x\n", - GETREG(CMSTAT)); -#endif - - /* and init transmitter status */ - sc->sc_tx_act = 0; - sc->sc_tx_fillcount = 0; - - ifp->if_flags |= IFF_RUNNING; - ifp->if_flags &= ~IFF_OACTIVE; - - cm_start(ifp); -} - -/* - * Take interface offline - */ -void -cm_stop(struct cm_softc *sc) -{ - struct ifnet *ifp = &sc->sc_arccom.ac_if; - - /* Stop the interrupts */ - PUTREG(CMSTAT, 0); - - /* Stop the interface */ - GETREG(CMRESET); - - /* Stop watchdog timer */ - ifp->if_timer = 0; - - callout_stop(&sc->sc_recon_ch); - ifp->if_flags &= ~IFF_RUNNING; -} - -/* - * Start output on interface. Get another datagram to send - * off the interface queue, and copy it to the - * interface becore starting the output - * - * this assumes that it is called inside a critical section... - * XXX hm... does it still? - * - */ -void -cm_start(struct ifnet *ifp) -{ - struct cm_softc *sc = ifp->if_softc; - struct mbuf *m,*mp; - - int cm_ram_ptr, len, tlen, offset, buffer; -#ifdef CMTIMINGS - u_long copystart, lencopy, perbyte; -#endif - -#if defined(CM_DEBUG) && (CM_DEBUG > 3) - if_printf(ifp, "start(%p)\n", ifp); -#endif - - if ((ifp->if_flags & IFF_RUNNING) == 0) - return; - - if (sc->sc_tx_fillcount >= 2) - return; - - m = arc_frag_next(ifp); - buffer = sc->sc_tx_act ^ 1; - - if (m == 0) - return; - -#ifdef CM_DEBUG - if (m->m_len < ARC_HDRLEN) - m = m_pullup(m, ARC_HDRLEN);/* gcc does structure padding */ - if_printf(ifp, "start: filling %d from %d to %d type %d\n", - buffer, mtod(m, u_char *)[0], - mtod(m, u_char *)[1], mtod(m, u_char *)[2]); -#else - if (m->m_len < 2) - m = m_pullup(m, 2); -#endif - cm_ram_ptr = buffer * 512; - - if (m == 0) - return; - - /* write the addresses to RAM and throw them away */ - - /* - * Hardware does this: Yet Another Microsecond Saved. - * (btw, timing code says usually 2 microseconds) - * PUTMEM(cm_ram_ptr + 0, mtod(m, u_char *)[0]); - */ - - PUTMEM(cm_ram_ptr + 1, mtod(m, u_char *)[1]); - m_adj(m, 2); - - /* get total length left at this point */ - tlen = m->m_pkthdr.len; - if (tlen < ARC_MIN_FORBID_LEN) { - offset = 256 - tlen; - PUTMEM(cm_ram_ptr + 2, offset); - } else { - PUTMEM(cm_ram_ptr + 2, 0); - if (tlen <= ARC_MAX_FORBID_LEN) - offset = 255; /* !!! */ - else { - if (tlen > ARC_MAX_LEN) - tlen = ARC_MAX_LEN; - offset = 512 - tlen; - } - PUTMEM(cm_ram_ptr + 3, offset); - - } - cm_ram_ptr += offset; - - /* lets loop through the mbuf chain */ - - for (mp = m; mp; mp = mp->m_next) { - if ((len = mp->m_len)) { /* YAMS */ - bus_space_write_region_1( - rman_get_bustag(sc->mem_res), - rman_get_bushandle(sc->mem_res), - cm_ram_ptr, mtod(mp, caddr_t), len); - - cm_ram_ptr += len; - } - } - - sc->sc_broadcast[buffer] = (m->m_flags & M_BCAST) != 0; - sc->sc_retransmits[buffer] = (m->m_flags & M_BCAST) ? 1 : 5; - - /* actually transmit the packet */ - - if (++sc->sc_tx_fillcount > 1) { - /* - * We are filled up to the rim. No more bufs for the moment, - * please. - */ - ifp->if_flags |= IFF_OACTIVE; - } else { -#ifdef CM_DEBUG - if_printf(ifp, "start: starting transmitter on buffer %d\n", - buffer); -#endif - /* Transmitter was off, start it */ - sc->sc_tx_act = buffer; - - /* - * We still can accept another buf, so don't: - * ifp->if_flags |= IFF_OACTIVE; - */ - sc->sc_intmask |= CM_TA; - PUTREG(CMCMD, CM_TX(buffer)); - PUTREG(CMSTAT, sc->sc_intmask); - - sc->sc_arccom.ac_if.if_timer = ARCTIMEOUT; - } - m_freem(m); - - /* - * After 10 times reading the docs, I realized - * that in the case the receiver NAKs the buffer request, - * the hardware retries till shutdown. - * This is integrated now in the code above. - */ - - return; -} - -/* - * Arcnet interface receiver soft interrupt: - * get the stuff out of any filled buffer we find. - */ -void -cm_srint(void *vsc) -{ - struct cm_softc *sc = (struct cm_softc *)vsc; - int buffer, len, offset, type; - int cm_ram_ptr; - struct mbuf *m; - struct arc_header *ah; - struct ifnet *ifp = &sc->sc_arccom.ac_if; - - buffer = sc->sc_rx_act ^ 1; - - /* - * Align so that IP packet will be longword aligned. Here we - * assume that m_data of new packet is longword aligned. - * When implementing PHDS, we might have to change it to 2, - * (2*sizeof(ulong) - CM_HDRNEWLEN)), packet type dependent. - */ - - cm_ram_ptr = buffer * 512; - offset = GETMEM(cm_ram_ptr + 2); - if (offset) - len = 256 - offset; - else { - offset = GETMEM(cm_ram_ptr + 3); - len = 512 - offset; - } - - /* - * Allocate header mbuf. - * - * First +2 bytes for align fixup below. - * Second +2 bytes are for src/dst addresses. - */ - m = m_getl(len + 2 + 2, MB_DONTWAIT, MT_DATA, M_PKTHDR, NULL); - if (m == NULL) { - /* - * in case s.th. goes wrong with mem, drop it - * to make sure the receiver can be started again - * count it as input error (we dont have any other - * detectable) - */ - ifp->if_ierrors++; - goto cleanup; - } - m->m_pkthdr.rcvif = ifp; - - type = GETMEM(cm_ram_ptr + offset); - m->m_data += 1 + arc_isphds(type); - /* mbuf filled with ARCnet addresses */ - m->m_pkthdr.len = m->m_len = len + 2; - - ah = mtod(m, struct arc_header *); - ah->arc_shost = GETMEM(cm_ram_ptr + 0); - ah->arc_dhost = GETMEM(cm_ram_ptr + 1); - - bus_space_read_region_1( - rman_get_bustag(sc->mem_res), rman_get_bushandle(sc->mem_res), - cm_ram_ptr + offset, mtod(m, u_char *) + 2, len); - - ifp->if_input(ifp, m); - - m = NULL; - ifp->if_ipackets++; - -cleanup: - - if (m != NULL) - m_freem(m); - - /* mark buffer as invalid by source id 0 */ - PUTMEM(buffer << 9, 0); - - if (--sc->sc_rx_fillcount == 2 - 1) { - - /* was off, restart it on buffer just emptied */ - sc->sc_rx_act = buffer; - sc->sc_intmask |= CM_RI; - - /* this also clears the RI flag interupt: */ - PUTREG(CMCMD, CM_RXBC(buffer)); - PUTREG(CMSTAT, sc->sc_intmask); - -#ifdef CM_DEBUG - if_printf(ifp, "srint: restarted rx on buf %d\n", buffer); -#endif - } -} - -__inline static void -cm_tint(struct cm_softc *sc, int isr) -{ - struct ifnet *ifp; - - int buffer; -#ifdef CMTIMINGS - int clknow; -#endif - - ifp = &(sc->sc_arccom.ac_if); - buffer = sc->sc_tx_act; - - /* - * retransmit code: - * Normal situtations first for fast path: - * If acknowledgement received ok or broadcast, we're ok. - * else if - */ - - if (isr & CM_TMA || sc->sc_broadcast[buffer]) - sc->sc_arccom.ac_if.if_opackets++; -#ifdef CMRETRANSMIT - else if (ifp->if_flags & IFF_LINK2 && ifp->if_timer > 0 - && --sc->sc_retransmits[buffer] > 0) { - /* retransmit same buffer */ - PUTREG(CMCMD, CM_TX(buffer)); - return; - } -#endif - else - ifp->if_oerrors++; - - - /* We know we can accept another buffer at this point. */ - ifp->if_flags &= ~IFF_OACTIVE; - - if (--sc->sc_tx_fillcount > 0) { - - /* - * start tx on other buffer. - * This also clears the int flag - */ - buffer ^= 1; - sc->sc_tx_act = buffer; - - /* - * already given: - * sc->sc_intmask |= CM_TA; - * PUTREG(CMSTAT, sc->sc_intmask); - */ - PUTREG(CMCMD, CM_TX(buffer)); - /* init watchdog timer */ - ifp->if_timer = ARCTIMEOUT; - -#if defined(CM_DEBUG) && (CM_DEBUG > 1) - if_printf(ifp, "tint: starting tx on buffer %d, " - "status 0x%02x\n", buffer, GETREG(CMSTAT)); -#endif - } else { - /* have to disable TX interrupt */ - sc->sc_intmask &= ~CM_TA; - PUTREG(CMSTAT, sc->sc_intmask); - /* ... and watchdog timer */ - ifp->if_timer = 0; - -#ifdef CM_DEBUG - if_printf(ifp, "tint: no more buffers to send, status 0x%02x\n", - GETREG(CMSTAT)); -#endif - } - - /* call it directly */ - cm_start(ifp); -} - -/* - * Our interrupt routine - */ -void -cmintr(void *arg) -{ - struct cm_softc *sc = arg; - struct ifnet *ifp = &sc->sc_arccom.ac_if; - - u_char isr, maskedisr; - int buffer; - u_long newsec; - - isr = GETREG(CMSTAT); - maskedisr = isr & sc->sc_intmask; - if (!maskedisr) - return; - do { - -#if defined(CM_DEBUG) && (CM_DEBUG > 1) - if_printf(ifp, "intr: status 0x%02x, intmask 0x%02x\n", - isr, sc->sc_intmask); -#endif - - if (maskedisr & CM_POR) { - /* - * XXX We should never see this. Don't bother to store - * the address. - * sc->sc_arccom.ac_anaddr = GETMEM(CMMACOFF); - */ - PUTREG(CMCMD, CM_CLR(CLR_POR)); - log(LOG_WARNING, - "%s: intr: got spurious power on reset int\n", - ifp->if_xname); - } - - if (maskedisr & CM_RECON) { - /* - * we dont need to: - * PUTREG(CMCMD, CM_CONF(CONF_LONG)); - */ - PUTREG(CMCMD, CM_CLR(CLR_RECONFIG)); - sc->sc_arccom.ac_if.if_collisions++; - - /* - * If less than 2 seconds per reconfig: - * If ARC_EXCESSIVE_RECONFIGS - * since last burst, complain and set treshold for - * warnings to ARC_EXCESSIVE_RECONS_REWARN. - * - * This allows for, e.g., new stations on the cable, or - * cable switching as long as it is over after - * (normally) 16 seconds. - * - * XXX TODO: check timeout bits in status word and - * double time if necessary. - */ - - callout_stop(&sc->sc_recon_ch); - newsec = time_second; - if ((newsec - sc->sc_recontime <= 2) && - (++sc->sc_reconcount == ARC_EXCESSIVE_RECONS)) { - log(LOG_WARNING, - "%s: excessive token losses, " - "cable problem?\n", - ifp->if_xname); - } - sc->sc_recontime = newsec; - callout_reset(&sc->sc_recon_ch, 15 * hz, - cm_reconwatch, (void *)sc); - } - - if (maskedisr & CM_RI) { -#if defined(CM_DEBUG) && (CM_DEBUG > 1) - if_printf(ifp, "intr: hard rint, act %d\n", - sc->sc_rx_act); -#endif - - buffer = sc->sc_rx_act; - /* look if buffer is marked invalid: */ - if (GETMEM(buffer * 512) == 0) { - /* - * invalid marked buffer (or illegally - * configured sender) - */ - log(LOG_WARNING, - "%s: spurious RX interrupt or sender 0 " - " (ignored)\n", ifp->if_xname); - /* - * restart receiver on same buffer. - * XXX maybe better reset interface? - */ - PUTREG(CMCMD, CM_RXBC(buffer)); - } else { - if (++sc->sc_rx_fillcount > 1) { - sc->sc_intmask &= ~CM_RI; - PUTREG(CMSTAT, sc->sc_intmask); - } else { - buffer ^= 1; - sc->sc_rx_act = buffer; - - /* - * Start receiver on other receive - * buffer. This also clears the RI - * interupt flag. - */ - PUTREG(CMCMD, CM_RXBC(buffer)); - /* in RX intr, so mask is ok for RX */ - -#ifdef CM_DEBUG - if_printf(ifp, "strt rx for buf %d, " - "stat 0x%02x\n", - sc->sc_rx_act, GETREG(CMSTAT)); -#endif - } - - /* this one does the copy here */ - cm_srint(sc); - } - } - if (maskedisr & CM_TA) { - cm_tint(sc, isr); - } - isr = GETREG(CMSTAT); - maskedisr = isr & sc->sc_intmask; - } while (maskedisr); -#if defined(CM_DEBUG) && (CM_DEBUG > 1) - if_printf(ifp, "intr (exit): status 0x%02x, intmask 0x%02x\n", - isr, sc->sc_intmask); -#endif -} - -void -cm_reconwatch(void *arg) -{ - struct cm_softc *sc = arg; - struct ifnet *ifp = &sc->sc_arccom.ac_if; - - lwkt_serialize_enter(ifp->if_serializer); - if (sc->sc_reconcount >= ARC_EXCESSIVE_RECONS) { - sc->sc_reconcount = 0; - log(LOG_WARNING, "%s: token valid again.\n", - ifp->if_xname); - } - sc->sc_reconcount = 0; - lwkt_serialize_exit(ifp->if_serializer); -} - - -/* - * Process an ioctl request. - * This code needs some work - it looks pretty ugly. - */ -int -cm_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr) -{ - struct cm_softc *sc; - struct ifaddr *ifa; - struct ifreq *ifr; - int error; - - error = 0; - sc = ifp->if_softc; - ifa = (struct ifaddr *)data; - ifr = (struct ifreq *)data; - -#if defined(CM_DEBUG) && (CM_DEBUG > 2) - if_printf(ifp, "ioctl() called, cmd = 0x%lx\n", command); -#endif - - switch (command) { - case SIOCSIFFLAGS: - if ((ifp->if_flags & IFF_UP) == 0 && - (ifp->if_flags & IFF_RUNNING) != 0) { - /* - * If interface is marked down and it is running, - * then stop it. - */ - cm_stop(sc); - } else if ((ifp->if_flags & IFF_UP) != 0 && - (ifp->if_flags & IFF_RUNNING) == 0) { - /* - * If interface is marked up and it is stopped, then - * start it. - */ - cm_init(sc); - } - break; - - default: - error = arc_ioctl(ifp, command, data); - break; - } - return (error); -} - -/* - * watchdog routine for transmitter. - * - * We need this, because else a receiver whose hardware is alive, but whose - * software has not enabled the Receiver, would make our hardware wait forever - * Discovered this after 20 times reading the docs. - * - * Only thing we do is disable transmitter. We'll get an transmit timeout, - * and the int handler will have to decide not to retransmit (in case - * retransmission is implemented). - */ - -void -cm_watchdog(struct ifnet *ifp) -{ - struct cm_softc *sc = ifp->if_softc; - - PUTREG(CMCMD, CM_TXDIS); - return; -} diff --git a/sys/dev/netif/cm/smc90cx6reg.h b/sys/dev/netif/cm/smc90cx6reg.h deleted file mode 100644 index 0a0bcb370c..0000000000 --- a/sys/dev/netif/cm/smc90cx6reg.h +++ /dev/null @@ -1,92 +0,0 @@ -/* $NetBSD: smc90cx6reg.h,v 1.7 1999/02/16 23:34:13 is Exp $ */ -/* $FreeBSD: src/sys/dev/cm/smc90cx6reg.h,v 1.1.2.1 2002/02/13 22:33:41 fjoe Exp $ */ -/* $DragonFly: src/sys/dev/netif/cm/Attic/smc90cx6reg.h,v 1.2 2003/06/17 04:28:23 dillon Exp $ */ - -/*- - * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Ignatios Souvatzis. - * - * 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. - */ - -/* - * chip offsets and bits for the SMC Arcnet chipset. - */ - -#ifndef _SMC90CXVAR_H_ -#define _SMC90CXVAR_H_ - -#define CM_IO_PORTS 16 - -/* register offsets */ - -#define CMSTAT 0 -#define CMCMD 1 -#define CMRESET 8 - -/* memory offsets */ -#define CMCHECKBYTE 0 -#define CMMACOFF 1 - -#define CM_TXDIS 0x01 -#define CM_RXDIS 0x02 -#define CM_TX(x) (0x03 | ((x)<<3)) -#define CM_RX(x) (0x04 | ((x)<<3)) -#define CM_RXBC(x) (0x84 | ((x)<<3)) - -#define CM_CONF(x) (0x05 | (x)) -#define CLR_POR 0x08 -#define CLR_RECONFIG 0x10 - -#define CM_CLR(x) (0x06 | (x)) -#define CONF_LONG 0x08 -#define CONF_SHORT 0x00 - -/* - * These are not in the COM90C65 docs. Derived from the arcnet.asm - * packet driver by Philippe Prindeville and Russel Nelson. - */ - -#define CM_LDTST(x) (0x07 | (x)) -#define TEST_ON 0x08 -#define TEST_OFF 0x00 - -#define CM_TA 1 /* int mask also */ -#define CM_TMA 2 -#define CM_RECON 4 /* int mask also */ -#define CM_TEST 8 /* not in the COM90C65 docs (see above) */ -#define CM_POR 0x10 /* non maskable interrupt */ -#define CM_ET1 0x20 /* timeout value bits, normally 1 */ -#define CM_ET2 0x40 /* timeout value bits, normally 1 */ -#define CM_RI 0x80 /* int mask also */ - -#endif diff --git a/sys/dev/netif/cm/smc90cx6var.h b/sys/dev/netif/cm/smc90cx6var.h deleted file mode 100644 index 2b0cbaa500..0000000000 --- a/sys/dev/netif/cm/smc90cx6var.h +++ /dev/null @@ -1,102 +0,0 @@ -/* $NetBSD: smc90cx6var.h,v 1.5 2000/03/23 07:01:32 thorpej Exp $ */ -/* $FreeBSD: src/sys/dev/cm/smc90cx6var.h,v 1.1.2.1 2002/02/13 22:33:41 fjoe Exp $ */ -/* $DragonFly: src/sys/dev/netif/cm/Attic/smc90cx6var.h,v 1.5 2005/08/30 12:33:49 sephe Exp $ */ - -/*- - * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Ignatios Souvatzis. - * - * 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. - */ - -/* - * BAH (SMC 8bit ARCnet chipset) k/dpi - * - * The SMC 8bit ARCnet chip family uses a register and a memory window, which - * we get passed via bus_space_tags and bus_space_handles. - * - * As the reset functionality differs between the Amiga boards (using the - * 90c26 chip) and middle-aged ISA boards (using the 90c56 chip), we have - * a sc_reset callback function in the softc, which does a stop function - * (reset and leave dead) or a reset function depending on wether the 2nd - * parameter is 0 or 1. - */ - -#ifndef _SMC90CX6VAR_H_ -#define _SMC90CX6VAR_H_ - -#include - -struct cm_softc { - struct arccom sc_arccom; /* Common arcnet structures */ - - int port_rid; /* resource id for port range */ - struct resource *port_res; /* resource for port range */ - int port_used; /* ports used */ - - int mem_rid; /* resource id for memory range */ - struct resource *mem_res; /* resource for memory range */ - int mem_used; /* memory used */ - - int irq_rid; /* resource id for irq */ - struct resource *irq_res; /* resource for irq */ - void * irq_handle; /* handle for irq handler */ - - struct callout sc_recon_ch; - u_long sc_recontime; /* seconds only, I'm lazy */ - u_long sc_reconcount; /* for the above */ - u_long sc_reconcount_excessive; /* for the above */ -#define ARC_EXCESSIVE_RECONS 20 -#define ARC_EXCESSIVE_RECONS_REWARN 400 - u_char sc_intmask; - u_char sc_rx_act; /* 2..3 */ - u_char sc_tx_act; /* 0..1 */ - u_char sc_rx_fillcount; - u_char sc_tx_fillcount; - u_char sc_broadcast[2]; /* is it a broadcast packet? */ - u_char sc_retransmits[2]; /* unused at the moment */ -}; - -int cm_attach (device_t); -void cmintr (void *); - -int cm_probe (device_t dev); -void cm_stop (struct cm_softc *sc); - -int cm_alloc_port (device_t dev, int rid, int size); -int cm_alloc_memory (device_t dev, int rid, int size); -int cm_alloc_irq (device_t dev, int rid); -void cm_release_resources (device_t dev); - -extern devclass_t cm_devclass; - -#endif diff --git a/sys/net/if.c b/sys/net/if.c index a5d04fb4ad..b4fbe761ba 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -32,7 +32,7 @@ * * @(#)if.c 8.3 (Berkeley) 1/4/94 * $FreeBSD: src/sys/net/if.c,v 1.185 2004/03/13 02:35:03 brooks Exp $ - * $DragonFly: src/sys/net/if.c,v 1.52 2007/06/16 19:59:30 dillon Exp $ + * $DragonFly: src/sys/net/if.c,v 1.53 2007/08/27 13:15:14 hasso Exp $ */ #include "opt_compat.h" @@ -1801,8 +1801,6 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len) case IFT_ISO88025: case IFT_L2VLAN: bcopy(lladdr, ((struct arpcom *)ifp->if_softc)->ac_enaddr, len); - /* FALLTHROUGH */ - case IFT_ARCNET: bcopy(lladdr, LLADDR(sdl), len); break; default: diff --git a/sys/net/if_arc.h b/sys/net/if_arc.h deleted file mode 100644 index 0ac42d81da..0000000000 --- a/sys/net/if_arc.h +++ /dev/null @@ -1,152 +0,0 @@ -/* $NetBSD: if_arc.h,v 1.13 1999/11/19 20:41:19 thorpej Exp $ */ -/* $FreeBSD: src/sys/net/if_arc.h,v 1.2.2.3 2003/01/28 11:19:05 fjoe Exp $ */ -/* $DragonFly: src/sys/net/Attic/if_arc.h,v 1.6 2006/05/20 02:42:08 dillon Exp $ */ - -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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 University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. - * - * from: NetBSD: if_ether.h,v 1.10 1994/06/29 06:37:55 cgd Exp - * @(#)if_ether.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NET_IF_ARC_H_ -#define _NET_IF_ARC_H_ - -#ifndef _SYS_TYPES_H_ -#include -#endif -#ifndef _NET_IF_VAR_H_ -#include -#endif - -/* - * Arcnet address - 1 octets - * don't know who uses this. - */ -struct arc_addr { - u_int8_t arc_addr_octet[1]; -} __attribute__((__packed__)); - -/* - * Structure of a 2.5MB/s Arcnet header. - * as given to interface code. - */ -struct arc_header { - u_int8_t arc_shost; - u_int8_t arc_dhost; - u_int8_t arc_type; - /* - * only present for newstyle encoding with LL fragmentation. - * Don't use sizeof(anything), use ARC_HDR{,NEW}LEN instead. - */ - u_int8_t arc_flag; - u_int16_t arc_seqid; - - /* - * only present in exception packets (arc_flag == 0xff) - */ - u_int8_t arc_type2; /* same as arc_type */ - u_int8_t arc_flag2; /* real flag value */ - u_int16_t arc_seqid2; /* real seqid value */ -} __attribute__((__packed__)); - -#define ARC_ADDR_LEN 1 - -#define ARC_HDRLEN 3 -#define ARC_HDRNEWLEN 6 -#define ARC_HDRNEWLEN_EXC 10 - -/* these lengths are data link layer length - 2 * ARC_ADDR_LEN */ -#define ARC_MIN_LEN 1 -#define ARC_MIN_FORBID_LEN 254 -#define ARC_MAX_FORBID_LEN 256 -#define ARC_MAX_LEN 508 -#define ARC_MAX_DATA 504 - -/* RFC 1051 */ -#define ARCTYPE_IP_OLD 240 /* IP protocol */ -#define ARCTYPE_ARP_OLD 241 /* address resolution protocol */ - -/* RFC 1201 */ -#define ARCTYPE_IP 212 /* IP protocol */ -#define ARCTYPE_ARP 213 /* address resolution protocol */ -#define ARCTYPE_REVARP 214 /* reverse addr resolution protocol */ - -#define ARCTYPE_ATALK 221 /* Appletalk */ -#define ARCTYPE_BANIAN 247 /* Banyan Vines */ -#define ARCTYPE_IPX 250 /* Novell IPX */ - -#define ARCTYPE_INET6 0xc4 /* IPng */ -#define ARCTYPE_DIAGNOSE 0x80 /* as per ANSI/ATA 878.1 */ - -#define ARCMTU 507 -#define ARCMIN 0 - -#define ARC_PHDS_MAXMTU 60480 - -struct arccom { - struct ifnet ac_if; /* network-visible interface */ - - u_int16_t ac_seqid; /* seq. id used by PHDS encap. */ - - u_int8_t arc_shost; - u_int8_t arc_dhost; - u_int8_t arc_type; - - u_int8_t dummy0; - u_int16_t dummy1; - int sflag, fsflag, rsflag; - struct mbuf *curr_frag; - - struct ac_frag { - u_int8_t af_maxflag; /* from first packet */ - u_int8_t af_lastseen; /* last split flag seen */ - u_int16_t af_seqid; - struct mbuf *af_packet; - } ac_fragtab[256]; /* indexed by sender ll address */ -}; - -#ifdef _KERNEL -extern int arc_ipmtu; /* XXX new ip only, no RFC 1051! */ -struct lwkt_serialize; - -void arc_ifattach (struct ifnet *, u_int8_t, struct lwkt_serialize *); -void arc_ifdetach (struct ifnet *); -void arc_storelladdr (struct ifnet *, u_int8_t); -int arc_isphds (int); -int arc_ioctl (struct ifnet *, int, caddr_t); - -void arc_frag_init (struct ifnet *); -struct mbuf * arc_frag_next (struct ifnet *); -#endif - -#endif /* _NET_IF_ARC_H_ */ diff --git a/sys/net/if_arcsubr.c b/sys/net/if_arcsubr.c deleted file mode 100644 index 1aa1443232..0000000000 --- a/sys/net/if_arcsubr.c +++ /dev/null @@ -1,816 +0,0 @@ -/* $NetBSD: if_arcsubr.c,v 1.36 2001/06/14 05:44:23 itojun Exp $ */ -/* $FreeBSD: src/sys/net/if_arcsubr.c,v 1.1.2.5 2003/02/05 18:42:15 fjoe Exp $ */ -/* $DragonFly: src/sys/net/Attic/if_arcsubr.c,v 1.21 2006/12/22 23:44:54 swildner Exp $ */ - -/* - * Copyright (c) 1994, 1995 Ignatios Souvatzis - * Copyright (c) 1982, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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 University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. - * - * from: NetBSD: if_ethersubr.c,v 1.9 1994/06/29 06:36:11 cgd Exp - * @(#)if_ethersubr.c 8.1 (Berkeley) 6/10/93 - * - */ -#include "opt_inet.h" -#include "opt_inet6.h" -#include "opt_ipx.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(INET) || defined(INET6) -#include -#include -#include -#endif - -#ifdef INET6 -#include -#endif - -#ifdef IPX -#include -#include -#endif - -MODULE_VERSION(arcnet, 1); - -#define ARCNET_ALLOW_BROKEN_ARP - -static struct mbuf *arc_defrag (struct ifnet *, struct mbuf *); -static int arc_resolvemulti (struct ifnet *, struct sockaddr **, - struct sockaddr *); -static void arc_input(struct ifnet *, struct mbuf *); -static int arc_output(struct ifnet *, struct mbuf *, struct sockaddr *, - struct rtentry *); - -#define ARC_LLADDR(ifp) (*(u_int8_t *)IF_LLADDR(ifp)) - -#define gotoerr(e) { error = (e); goto bad;} -#define SIN(s) ((struct sockaddr_in *)s) -#define SIPX(s) ((struct sockaddr_ipx *)s) - -const uint8_t arcbroadcastaddr[1] = {0}; - -/* - * ARCnet output routine. - * Encapsulate a packet of type family for the local net. - * Assumes that ifp is actually pointer to arccom structure. - */ -static int -arc_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, - struct rtentry *rt) -{ - struct arc_header *ah; - int error; - u_int8_t atype, adst; - int loop_copy = 0; - int isphds; - struct altq_pktattr pktattr; - - if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING)) - return (ENETDOWN); /* m, m1 aren't initialized yet */ - - /* - * If the queueing discipline needs packet classification, - * do it before prepending link headers. - */ - ifq_classify(&ifp->if_snd, m, dst->sa_family, &pktattr); - - switch (dst->sa_family) { -#ifdef INET - case AF_INET: - - /* - * For now, use the simple IP addr -> ARCnet addr mapping - */ - if (m->m_flags & (M_BCAST|M_MCAST)) - adst = ifp->if_broadcastaddr[0]; - else if (ifp->if_flags & IFF_NOARP) - adst = ntohl(SIN(dst)->sin_addr.s_addr) & 0xFF; - else if (!arpresolve(ifp, rt, m, dst, &adst)) - return 0; /* not resolved yet */ - - atype = (ifp->if_flags & IFF_LINK0) ? - ARCTYPE_IP_OLD : ARCTYPE_IP; - break; -#endif -#ifdef INET6 - case AF_INET6: - if (!nd6_storelladdr(ifp, rt, m, dst, (u_char *)&adst)) - return (0); /* it must be impossible, but... */ - atype = ARCTYPE_INET6; - break; -#endif -#ifdef IPX - case AF_IPX: - adst = SIPX(dst)->sipx_addr.x_host.c_host[5]; - atype = ARCTYPE_IPX; - if (adst == 0xff) - adst = ifp->if_broadcastaddr[0]; - break; -#endif - - case AF_UNSPEC: - loop_copy = -1; - ah = (struct arc_header *)dst->sa_data; - adst = ah->arc_dhost; - atype = ah->arc_type; - - if (atype == ARCTYPE_ARP) { - atype = (ifp->if_flags & IFF_LINK0) ? - ARCTYPE_ARP_OLD: ARCTYPE_ARP; - -#ifdef ARCNET_ALLOW_BROKEN_ARP - /* - * XXX It's not clear per RFC826 if this is needed, but - * "assigned numbers" say this is wrong. - * However, e.g., AmiTCP 3.0Beta used it... we make this - * switchable for emergency cases. Not perfect, but... - */ - if (ifp->if_flags & IFF_LINK2) - mtod(m, struct arphdr *)->ar_pro = atype - 1; -#endif - } - break; - - default: - kprintf("%s: can't handle af%d\n", ifp->if_xname, - dst->sa_family); - gotoerr(EAFNOSUPPORT); - } - - isphds = arc_isphds(atype); - M_PREPEND(m, isphds ? ARC_HDRNEWLEN : ARC_HDRLEN, MB_DONTWAIT); - if (m == NULL) - gotoerr(ENOBUFS); - ah = mtod(m, struct arc_header *); - ah->arc_type = atype; - ah->arc_dhost = adst; - ah->arc_shost = *IF_LLADDR(ifp); - ah->arc_shost = ARC_LLADDR(ifp); - if (isphds) { - ah->arc_flag = 0; - ah->arc_seqid = 0; - } - - if ((ifp->if_flags & IFF_SIMPLEX) && (loop_copy != -1)) { - if ((m->m_flags & M_BCAST) || (loop_copy > 0)) { - struct mbuf *n = m_copypacket(m, MB_DONTWAIT); - - if_simloop(ifp, n, dst->sa_family, ARC_HDRLEN); - } else if (ah->arc_dhost == ah->arc_shost) { - if_simloop(ifp, m, dst->sa_family, ARC_HDRLEN); - return (0); /* XXX */ - } - } - - BPF_MTAP(ifp, m); - - error = ifq_handoff(ifp, m, &pktattr); - return (error); - -bad: - if (m != NULL) - m_freem(m); - return (error); -} - -void -arc_frag_init(struct ifnet *ifp) -{ - struct arccom *ac; - - ac = (struct arccom *)ifp; - ac->curr_frag = 0; -} - -struct mbuf * -arc_frag_next(struct ifnet *ifp) -{ - struct arccom *ac; - struct mbuf *m; - struct arc_header *ah; - - ac = (struct arccom *)ifp; - if ((m = ac->curr_frag) == 0) { - int tfrags; - - /* dequeue new packet */ - IF_DEQUEUE(&ifp->if_snd, m); - if (m == 0) - return 0; - - ah = mtod(m, struct arc_header *); - if (!arc_isphds(ah->arc_type)) - return m; - - ++ac->ac_seqid; /* make the seqid unique */ - tfrags = (m->m_pkthdr.len + ARC_MAX_DATA - 1) / ARC_MAX_DATA; - ac->fsflag = 2 * tfrags - 3; - ac->sflag = 0; - ac->rsflag = ac->fsflag; - ac->arc_dhost = ah->arc_dhost; - ac->arc_shost = ah->arc_shost; - ac->arc_type = ah->arc_type; - - m_adj(m, ARC_HDRNEWLEN); - ac->curr_frag = m; - } - - /* split out next fragment and return it */ - if (ac->sflag < ac->fsflag) { - /* we CAN'T have short packets here */ - ac->curr_frag = m_split(m, ARC_MAX_DATA, MB_DONTWAIT); - if (ac->curr_frag == 0) { - m_freem(m); - return 0; - } - - M_PREPEND(m, ARC_HDRNEWLEN, MB_DONTWAIT); - if (m == 0) { - m_freem(ac->curr_frag); - ac->curr_frag = 0; - return 0; - } - - ah = mtod(m, struct arc_header *); - ah->arc_flag = ac->rsflag; - ah->arc_seqid = ac->ac_seqid; - - ac->sflag += 2; - ac->rsflag = ac->sflag; - } else if ((m->m_pkthdr.len >= - ARC_MIN_FORBID_LEN - ARC_HDRNEWLEN + 2) && - (m->m_pkthdr.len <= - ARC_MAX_FORBID_LEN - ARC_HDRNEWLEN + 2)) { - ac->curr_frag = 0; - - M_PREPEND(m, ARC_HDRNEWLEN_EXC, MB_DONTWAIT); - if (m == 0) - return 0; - - ah = mtod(m, struct arc_header *); - ah->arc_flag = 0xFF; - ah->arc_seqid = 0xFFFF; - ah->arc_type2 = ac->arc_type; - ah->arc_flag2 = ac->sflag; - ah->arc_seqid2 = ac->ac_seqid; - } else { - ac->curr_frag = 0; - - M_PREPEND(m, ARC_HDRNEWLEN, MB_DONTWAIT); - if (m == 0) - return 0; - - ah = mtod(m, struct arc_header *); - ah->arc_flag = ac->sflag; - ah->arc_seqid = ac->ac_seqid; - } - - ah->arc_dhost = ac->arc_dhost; - ah->arc_shost = ac->arc_shost; - ah->arc_type = ac->arc_type; - - return m; -} - -/* - * Defragmenter. Returns mbuf if last packet found, else - * NULL. frees imcoming mbuf as necessary. - */ - -__inline struct mbuf * -arc_defrag(struct ifnet *ifp, struct mbuf *m) -{ - struct arc_header *ah, *ah1; - struct arccom *ac; - struct ac_frag *af; - struct mbuf *m1; - char *s; - int newflen; - u_char src,dst,typ; - - ac = (struct arccom *)ifp; - - if (m->m_len < ARC_HDRNEWLEN) { - m = m_pullup(m, ARC_HDRNEWLEN); - if (m == NULL) { - ++ifp->if_ierrors; - return NULL; - } - } - - ah = mtod(m, struct arc_header *); - typ = ah->arc_type; - - if (!arc_isphds(typ)) - return m; - - src = ah->arc_shost; - dst = ah->arc_dhost; - - if (ah->arc_flag == 0xff) { - m_adj(m, 4); - - if (m->m_len < ARC_HDRNEWLEN) { - m = m_pullup(m, ARC_HDRNEWLEN); - if (m == NULL) { - ++ifp->if_ierrors; - return NULL; - } - } - - ah = mtod(m, struct arc_header *); - } - - af = &ac->ac_fragtab[src]; - m1 = af->af_packet; - s = "debug code error"; - - if (ah->arc_flag & 1) { - /* - * first fragment. We always initialize, which is - * about the right thing to do, as we only want to - * accept one fragmented packet per src at a time. - */ - if (m1 != NULL) - m_freem(m1); - - af->af_packet = m; - m1 = m; - af->af_maxflag = ah->arc_flag; - af->af_lastseen = 0; - af->af_seqid = ah->arc_seqid; - - return NULL; - /* notreached */ - } else { - /* check for unfragmented packet */ - if (ah->arc_flag == 0) - return m; - - /* do we have a first packet from that src? */ - if (m1 == NULL) { - s = "no first frag"; - goto outofseq; - } - - ah1 = mtod(m1, struct arc_header *); - - if (ah->arc_seqid != ah1->arc_seqid) { - s = "seqid differs"; - goto outofseq; - } - - if (typ != ah1->arc_type) { - s = "type differs"; - goto outofseq; - } - - if (dst != ah1->arc_dhost) { - s = "dest host differs"; - goto outofseq; - } - - /* typ, seqid and dst are ok here. */ - - if (ah->arc_flag == af->af_lastseen) { - m_freem(m); - return NULL; - } - - if (ah->arc_flag == af->af_lastseen + 2) { - /* ok, this is next fragment */ - af->af_lastseen = ah->arc_flag; - m_adj(m,ARC_HDRNEWLEN); - - /* - * m_cat might free the first mbuf (with pkthdr) - * in 2nd chain; therefore: - */ - - newflen = m->m_pkthdr.len; - - m_cat(m1,m); - - m1->m_pkthdr.len += newflen; - - /* is it the last one? */ - if (af->af_lastseen > af->af_maxflag) { - af->af_packet = NULL; - return (m1); - } else - return NULL; - } - s = "other reason"; - /* if all else fails, it is out of sequence, too */ - } -outofseq: - if (m1 != NULL) { - m_freem(m1); - af->af_packet = NULL; - } - - if (m != NULL) - m_freem(m); - - log(LOG_INFO,"%s: got out of seq. packet: %s\n", - ifp->if_xname, s); - - return NULL; -} - -/* - * return 1 if Packet Header Definition Standard, else 0. - * For now: old IP, old ARP aren't obviously. Lacking correct information, - * we guess that besides new IP and new ARP also IPX and APPLETALK are PHDS. - * (Apple and Novell corporations were involved, among others, in PHDS work). - * Easiest is to assume that everybody else uses that, too. - */ -int -arc_isphds(int type) -{ - return (type != ARCTYPE_IP_OLD && - type != ARCTYPE_ARP_OLD && - type != ARCTYPE_DIAGNOSE); -} - -/* - * Process a received Arcnet packet; - * the packet is in the mbuf chain m with - * the ARCnet header. - */ -static void -arc_input(struct ifnet *ifp, struct mbuf *m) -{ - struct arc_header *ah; - int isr; - u_int8_t atype; - - ASSERT_SERIALIZED(ifp->if_serializer); - - if (!(ifp->if_flags & IFF_UP)) { - m_freem(m); - return; - } - - /* possibly defragment: */ - m = arc_defrag(ifp, m); - if (m == NULL) - return; - - BPF_MTAP(ifp, m); - - ah = mtod(m, struct arc_header *); - /* does this belong to us? */ - if (!(ifp->if_flags & IFF_PROMISC) && - ah->arc_dhost != ifp->if_broadcastaddr[0] && - ah->arc_dhost != ARC_LLADDR(ifp)) { - m_freem(m); - return; - } - - ifp->if_ibytes += m->m_pkthdr.len; - - if (ah->arc_dhost == ifp->if_broadcastaddr[0]) { - m->m_flags |= M_BCAST|M_MCAST; - ifp->if_imcasts++; - } - - atype = ah->arc_type; - switch (atype) { -#ifdef INET - case ARCTYPE_IP: - m_adj(m, ARC_HDRNEWLEN); - if (ipflow_fastforward(m, ifp->if_serializer)) - return; - isr = NETISR_IP; - break; - - case ARCTYPE_IP_OLD: - m_adj(m, ARC_HDRLEN); - if (ipflow_fastforward(m, ifp->if_serializer)) - return; - isr = NETISR_IP; - break; - - case ARCTYPE_ARP: - if (ifp->if_flags & IFF_NOARP) { - /* Discard packet if ARP is disabled on interface */ - m_freem(m); - return; - } - m_adj(m, ARC_HDRNEWLEN); - isr = NETISR_ARP; -#ifdef ARCNET_ALLOW_BROKEN_ARP - mtod(m, struct arphdr *)->ar_pro = htons(ETHERTYPE_IP); -#endif - break; - - case ARCTYPE_ARP_OLD: - if (ifp->if_flags & IFF_NOARP) { - /* Discard packet if ARP is disabled on interface */ - m_freem(m); - return; - } - m_adj(m, ARC_HDRLEN); - isr = NETISR_ARP; -#ifdef ARCNET_ALLOW_BROKEN_ARP - mtod(m, struct arphdr *)->ar_pro = htons(ETHERTYPE_IP); -#endif - break; -#endif -#ifdef INET6 - case ARCTYPE_INET6: - m_adj(m, ARC_HDRNEWLEN); - isr = NETISR_IPV6; - break; -#endif -#ifdef IPX - case ARCTYPE_IPX: - m_adj(m, ARC_HDRNEWLEN); - isr = NETISR_IPX; - break; -#endif - default: - m_freem(m); - return; - } - - netisr_dispatch(isr, m); -} - -/* - * Register (new) link level address. - */ -void -arc_storelladdr(struct ifnet *ifp, u_int8_t lla) -{ - ARC_LLADDR(ifp) = lla; -} - -/* - * Perform common duties while attaching to interface list - */ -void -arc_ifattach(struct ifnet *ifp, u_int8_t lla, lwkt_serialize_t serializer) -{ - struct sockaddr_dl *sdl; - struct arccom *ac; - - ifp->if_input = arc_input; - ifp->if_output = arc_output; - if_attach(ifp, serializer); - ifp->if_type = IFT_ARCNET; - ifp->if_addrlen = 1; - ifp->if_broadcastaddr = arcbroadcastaddr; - ifp->if_hdrlen = ARC_HDRLEN; - ifp->if_mtu = 1500; - ifp->if_resolvemulti = arc_resolvemulti; - if (ifp->if_baudrate == 0) - ifp->if_baudrate = 2500000; - sdl = IF_LLSOCKADDR(ifp); - sdl->sdl_type = IFT_ARCNET; - sdl->sdl_alen = ifp->if_addrlen; - - if (ifp->if_flags & IFF_BROADCAST) - ifp->if_flags |= IFF_MULTICAST|IFF_ALLMULTI; - - ac = (struct arccom *)ifp; - ac->ac_seqid = (time_second) & 0xFFFF; /* try to make seqid unique */ - if (lla == 0) { - /* XXX this message isn't entirely clear, to me -- cgd */ - log(LOG_ERR,"%s: link address 0 reserved for broadcasts. Please change it and ifconfig %s down up\n", - ifp->if_xname, ifp->if_xname); - } - arc_storelladdr(ifp, lla); - - bpfattach(ifp, DLT_ARCNET, ARC_HDRLEN); - - if_printf(ifp, "Link Address 0x%02x (%u)\n", lla, lla); -} - -void -arc_ifdetach(struct ifnet *ifp) -{ - bpfdetach(ifp); - if_detach(ifp); -} - -int -arc_ioctl(struct ifnet *ifp, int command, caddr_t data) -{ - struct ifaddr *ifa = (struct ifaddr *) data; - struct ifreq *ifr = (struct ifreq *) data; - int error = 0; - - switch (command) { - case SIOCSIFADDR: - ifp->if_flags |= IFF_UP; - switch (ifa->ifa_addr->sa_family) { -#ifdef INET - case AF_INET: - lwkt_serialize_enter(ifp->if_serializer); - ifp->if_init(ifp->if_softc); /* before arpwhohas */ - lwkt_serialize_exit(ifp->if_serializer); - arp_ifinit(ifp, ifa); - break; -#endif -#ifdef IPX - /* - * XXX This code is probably wrong - */ - case AF_IPX: - { - struct ipx_addr *ina = &(IA_SIPX(ifa)->sipx_addr); - - if (ipx_nullhost(*ina)) - ina->x_host.c_host[5] = ARC_LLADDR(ifp); - else - arc_storelladdr(ifp, ina->x_host.c_host[5]); - - /* - * Set new address - */ - lwkt_serialize_enter(ifp->if_serializer); - ifp->if_init(ifp->if_softc); - lwkt_serialize_exit(ifp->if_serializer); - break; - } -#endif - default: - lwkt_serialize_enter(ifp->if_serializer); - ifp->if_init(ifp->if_softc); - lwkt_serialize_exit(ifp->if_serializer); - break; - } - break; - - case SIOCGIFADDR: - { - struct sockaddr *sa; - - sa = (struct sockaddr *) &ifr->ifr_data; - *(u_int8_t *)sa->sa_data = ARC_LLADDR(ifp); - } - break; - - case SIOCADDMULTI: - case SIOCDELMULTI: - if (ifr == NULL) - error = EAFNOSUPPORT; - else { - switch (ifr->ifr_addr.sa_family) { - case AF_INET: - case AF_INET6: - error = 0; - break; - default: - error = EAFNOSUPPORT; - break; - } - } - break; - - case SIOCSIFMTU: - /* - * Set the interface MTU. - * mtu can't be larger than ARCMTU for RFC1051 - * and can't be larger than ARC_PHDS_MTU - */ - if (((ifp->if_flags & IFF_LINK0) && ifr->ifr_mtu > ARCMTU) || - ifr->ifr_mtu > ARC_PHDS_MAXMTU) - error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; - break; - default: - error = EINVAL; - break; - } - - return (error); -} - -/* based on ether_resolvemulti() */ -int -arc_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, - struct sockaddr *sa) -{ - struct sockaddr_dl *sdl; - struct sockaddr_in *sin; -#ifdef INET6 - struct sockaddr_in6 *sin6; -#endif - - switch(sa->sa_family) { - case AF_LINK: - /* - * No mapping needed. Just check that it's a valid MC address. - */ - sdl = (struct sockaddr_dl *)sa; - if (*LLADDR(sdl) != ifp->if_broadcastaddr[0]) - return EADDRNOTAVAIL; - *llsa = 0; - return 0; -#ifdef INET - case AF_INET: - sin = (struct sockaddr_in *)sa; - if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) - return EADDRNOTAVAIL; - MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK|M_ZERO); - sdl->sdl_len = sizeof *sdl; - sdl->sdl_family = AF_LINK; - sdl->sdl_index = ifp->if_index; - sdl->sdl_type = IFT_ARCNET; - sdl->sdl_alen = ARC_ADDR_LEN; - *LLADDR(sdl) = 0; - *llsa = (struct sockaddr *)sdl; - return 0; -#endif -#ifdef INET6 - case AF_INET6: - sin6 = (struct sockaddr_in6 *)sa; - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - /* - * An IP6 address of 0 means listen to all - * of the Ethernet multicast address used for IP6. - * (This is used for multicast routers.) - */ - ifp->if_flags |= IFF_ALLMULTI; - *llsa = 0; - return 0; - } - if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) - return EADDRNOTAVAIL; - MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK|M_ZERO); - sdl->sdl_len = sizeof *sdl; - sdl->sdl_family = AF_LINK; - sdl->sdl_index = ifp->if_index; - sdl->sdl_type = IFT_ARCNET; - sdl->sdl_alen = ARC_ADDR_LEN; - *LLADDR(sdl) = 0; - *llsa = (struct sockaddr *)sdl; - return 0; -#endif - - default: - /* - * Well, the text isn't quite right, but it's the name - * that counts... - */ - return EAFNOSUPPORT; - } -} diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 64f96353f1..edbf6491e7 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -64,7 +64,7 @@ * * @(#)if_ether.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/if_ether.c,v 1.64.2.23 2003/04/11 07:23:15 fjoe Exp $ - * $DragonFly: src/sys/netinet/if_ether.c,v 1.39 2007/08/16 20:03:57 dillon Exp $ + * $DragonFly: src/sys/netinet/if_ether.c,v 1.40 2007/08/27 13:15:14 hasso Exp $ */ /* @@ -97,7 +97,6 @@ #include #include -#include #include #include @@ -263,8 +262,7 @@ arp_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info) * in `arp -a' listings as unresolved. It's not actually * functional. Then the same for broadcast. */ - if (IN_MULTICAST(ntohl(SIN(rt_key(rt))->sin_addr.s_addr)) && - rt->rt_ifp->if_type != IFT_ARCNET) { + if (IN_MULTICAST(ntohl(SIN(rt_key(rt))->sin_addr.s_addr))) { ETHER_MAP_IP_MULTICAST(&SIN(rt_key(rt))->sin_addr, LLADDR(SDL(gate))); SDL(gate)->sdl_alen = 6; @@ -324,7 +322,6 @@ arprequest(struct ifnet *ifp, struct in_addr *sip, struct in_addr *tip, { struct mbuf *m; struct ether_header *eh; - struct arc_header *arh; struct arphdr *ah; struct sockaddr sa; static u_char llcx[] = { 0x82, 0x40, LLC_SNAP_LSAP, LLC_SNAP_LSAP, @@ -336,20 +333,6 @@ arprequest(struct ifnet *ifp, struct in_addr *sip, struct in_addr *tip, m->m_pkthdr.rcvif = (struct ifnet *)NULL; switch (ifp->if_type) { - case IFT_ARCNET: - ar_hrd = htons(ARPHRD_ARCNET); - - m->m_len = arphdr_len2(ifp->if_addrlen, sizeof(struct in_addr)); - m->m_pkthdr.len = m->m_len; - MH_ALIGN(m, m->m_len); - - arh = (struct arc_header *)sa.sa_data; - arh->arc_dhost = ifp->if_broadcastaddr[0]; - arh->arc_type = ARCTYPE_ARP; - - ah = mtod(m, struct arphdr *); - break; - case IFT_ISO88025: ar_hrd = htons(ARPHRD_IEEE802); @@ -430,7 +413,7 @@ arpresolve( memcpy(desten, ifp->if_broadcastaddr, ifp->if_addrlen); return (1); } - if (m->m_flags & M_MCAST && ifp->if_type != IFT_ARCNET) {/* multicast */ + if (m->m_flags & M_MCAST) {/* multicast */ ETHER_MAP_IP_MULTICAST(&SIN(dst)->sin_addr, desten); return (1); } @@ -536,8 +519,7 @@ arpintr(struct netmsg *msg) ar_hrd = ntohs(ar->ar_hrd); if (ar_hrd != ARPHRD_ETHER && - ar_hrd != ARPHRD_IEEE802 && - ar_hrd != ARPHRD_ARCNET) { + ar_hrd != ARPHRD_IEEE802) { log(LOG_ERR, "arp: unknown hardware address format (0x%2D)\n", (unsigned char *)&ar->ar_hrd, ""); @@ -734,7 +716,6 @@ in_arpinput(struct mbuf *m) struct arphdr *ah; struct ifnet *ifp = m->m_pkthdr.rcvif; struct ether_header *eh; - struct arc_header *arh; struct iso88025_header *th = (struct iso88025_header *)NULL; struct rtentry *rt; struct ifaddr *ifa; @@ -916,11 +897,6 @@ reply: ah->ar_op = htons(ARPOP_REPLY); ah->ar_pro = htons(ETHERTYPE_IP); /* let's be sure! */ switch (ifp->if_type) { - case IFT_ARCNET: - arh = (struct arc_header *)sa.sa_data; - arh->arc_dhost = *ar_tha(ah); - arh->arc_type = ARCTYPE_ARP; - break; case IFT_ISO88025: /* Re-arrange the source/dest address */ memcpy(th->iso88025_dhost, th->iso88025_shost, diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c index 929c11ce82..ce023ac3d8 100644 --- a/sys/netinet6/in6_ifattach.c +++ b/sys/netinet6/in6_ifattach.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/in6_ifattach.c,v 1.2.2.6 2002/04/28 05:40:26 suz Exp $ */ -/* $DragonFly: src/sys/netinet6/in6_ifattach.c,v 1.19 2007/08/16 20:03:58 dillon Exp $ */ +/* $DragonFly: src/sys/netinet6/in6_ifattach.c,v 1.20 2007/08/27 13:15:14 hasso Exp $ */ /* $KAME: in6_ifattach.c,v 1.118 2001/05/24 07:44:00 itojun Exp $ */ /* @@ -292,23 +292,6 @@ found: in6->s6_addr[15] = addr[5]; } break; - - case IFT_ARCNET: - if (addrlen != 1) - return -1; - if (!addr[0]) - return -1; - - bzero(&in6->s6_addr[8], 8); - in6->s6_addr[15] = addr[0]; - - /* - * due to insufficient bitwidth, we mark it local. - */ - in6->s6_addr[8] &= ~EUI64_GBIT; /* g bit to "individual" */ - in6->s6_addr[8] |= EUI64_UBIT; /* u bit to "local" */ - break; - case IFT_GIF: #ifdef IFT_STF case IFT_STF: diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 8c3a2aaf42..64b18fb31c 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/nd6.c,v 1.2.2.15 2003/05/06 06:46:58 suz Exp $ */ -/* $DragonFly: src/sys/netinet6/nd6.c,v 1.23 2007/08/16 20:03:58 dillon Exp $ */ +/* $DragonFly: src/sys/netinet6/nd6.c,v 1.24 2007/08/27 13:15:14 hasso Exp $ */ /* $KAME: nd6.c,v 1.144 2001/05/24 07:44:00 itojun Exp $ */ /* @@ -204,9 +204,6 @@ nd6_setmtu0(struct ifnet *ifp, struct nd_ifinfo *ndi) oldlinkmtu = ndi->linkmtu; switch (ifp->if_type) { - case IFT_ARCNET: /* XXX MTU handling needs more work */ - ndi->maxmtu = MIN(60480, ifp->if_mtu); - break; case IFT_ETHER: ndi->maxmtu = MIN(ETHERMTU, ifp->if_mtu); break; @@ -1978,13 +1975,12 @@ nd6_need_cache(struct ifnet *ifp) { /* * XXX: we currently do not make neighbor cache on any interface - * other than ARCnet, Ethernet, FDDI and GIF. + * other than Ethernet, FDDI and GIF. * * RFC2893 says: * - unidirectional tunnels needs no ND */ switch (ifp->if_type) { - case IFT_ARCNET: case IFT_ETHER: case IFT_FDDI: case IFT_IEEE1394: @@ -2028,9 +2024,6 @@ nd6_storelladdr(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, case IFT_IEEE1394: bcopy(ifp->if_broadcastaddr, desten, ifp->if_addrlen); return (1); - case IFT_ARCNET: - *desten = 0; - return (1); default: m_freem(m); return (0); diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index 84019658e9..f9b0da6049 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/nd6_nbr.c,v 1.4.2.6 2003/01/23 21:06:47 sam Exp $ */ -/* $DragonFly: src/sys/netinet6/nd6_nbr.c,v 1.19 2007/08/16 20:03:58 dillon Exp $ */ +/* $DragonFly: src/sys/netinet6/nd6_nbr.c,v 1.20 2007/08/27 13:15:14 hasso Exp $ */ /* $KAME: nd6_nbr.c,v 1.86 2002/01/21 02:33:04 jinmei Exp $ */ /* @@ -959,7 +959,6 @@ caddr_t nd6_ifptomac(struct ifnet *ifp) { switch (ifp->if_type) { - case IFT_ARCNET: case IFT_ETHER: case IFT_FDDI: case IFT_IEEE1394: diff --git a/sys/platform/pc32/i386/userconfig.c b/sys/platform/pc32/i386/userconfig.c index e2d81261b1..9a4c944a5d 100644 --- a/sys/platform/pc32/i386/userconfig.c +++ b/sys/platform/pc32/i386/userconfig.c @@ -47,7 +47,7 @@ ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** $FreeBSD: src/sys/i386/i386/userconfig.c,v 1.175.2.10 2002/10/05 18:31:48 scottl Exp $ - ** $DragonFly: src/sys/platform/pc32/i386/userconfig.c,v 1.13 2007/05/17 19:26:06 swildner Exp $ + ** $DragonFly: src/sys/platform/pc32/i386/userconfig.c,v 1.14 2007/08/27 13:15:14 hasso Exp $ **/ /** @@ -346,7 +346,6 @@ static DEV_INFO device_info[] = { {"ad", "ATA/ATAPI compatible storage device", FLG_INVISIBLE, CLS_STORAGE}, {"fd", "Floppy disk device", FLG_INVISIBLE, CLS_STORAGE}, -{"cm", "SMC COM90Cx6-based Arcnet adapters", 0, CLS_NETWORK}, {"cs", "IBM EtherJet, CS89x0-based Ethernet adapters",0, CLS_NETWORK}, {"ed", "NE1000,NE2000,3C503,WD/SMC80xx Ethernet adapters",0, CLS_NETWORK}, {"el", "3C501 Ethernet adapter", 0, CLS_NETWORK}, -- 2.11.4.GIT