New snapshot of DEC PDQ-based FDDI driver, from Matt Thomas.

This commit is contained in:
thorpej 1996-03-11 21:04:02 +00:00
parent 6d5bf6a3ea
commit 2e4812fa65
1 changed files with 95 additions and 45 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pdq_ifsubr.c,v 1.1 1996/03/09 03:46:21 thorpej Exp $ */ /* $NetBSD: pdq_ifsubr.c,v 1.1.1.1 1996/03/11 21:04:02 thorpej Exp $ */
/*- /*-
* Copyright (c) 1995 Matt Thomas (thomas@lkg.dec.com) * Copyright (c) 1995 Matt Thomas (thomas@lkg.dec.com)
@ -22,6 +22,58 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* from Id: pdq_ifsubr.c,v 1.2 1995/08/20 18:59:00 thomas Exp
*
* Log: pdq_ifsubr.c,v
* Revision 1.2 1995/08/20 18:59:00 thomas
* Changes for NetBSD
*
* Revision 1.1 1995/08/20 15:43:49 thomas
* Initial revision
*
* Revision 1.13 1995/08/04 21:54:56 thomas
* Clean IRQ processing under BSD/OS.
* A receive tweaks. (print source of MAC CRC errors, etc.)
*
* Revision 1.12 1995/06/02 16:04:22 thomas
* Use correct PCI defs for BSDI now that they have fixed them.
* Increment the slot number 0x1000, not one! (*duh*)
*
* Revision 1.11 1995/04/21 13:23:55 thomas
* Fix a few pub in the DEFPA BSDI support
*
* Revision 1.10 1995/04/20 21:46:42 thomas
* Why???
* ,
*
* Revision 1.9 1995/04/20 20:17:33 thomas
* Add PCI support for BSD/OS.
* Fix BSD/OS EISA support.
* Set latency timer for DEFPA to recommended value if 0.
*
* Revision 1.8 1995/04/04 22:54:29 thomas
* Fix DEFEA support
*
* Revision 1.7 1995/03/14 01:52:52 thomas
* Update for new FreeBSD PCI Interrupt interface
*
* Revision 1.6 1995/03/10 17:06:59 thomas
* Update for latest version of FreeBSD.
* Compensate for the fast that the ifp will not be first thing
* in softc on BSDI.
*
* Revision 1.5 1995/03/07 19:59:42 thomas
* First pass at BSDI EISA support
*
* Revision 1.4 1995/03/06 17:06:03 thomas
* Add transmit timeout support.
* Add support DEFEA (untested).
*
* Revision 1.3 1995/03/03 13:48:35 thomas
* more fixes
*
*
*/ */
/* /*
@ -29,21 +81,32 @@
* *
* Written by Matt Thomas * Written by Matt Thomas
* *
* Network interface subroutines. * This driver supports the following FDDI controllers:
*
* Device: Config file entry:
* DEC DEFPA (PCI) device fpa0
* DEC DEFEA (EISA) device fea0 at isa0 net irq ? vector feaintr
*
* Eventually, the following adapters will also be supported:
*
* DEC DEFTA (TC) device fta0 at tc? slot * vector ftaintr
* DEC DEFQA (Q-Bus) device fta0 at uba? csr 0?? vector fqaintr
* DEC DEFAA (FB+) device faa0 at fbus? slot * vector faaintr
*/ */
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/kernel.h> #include <sys/kernel.h>
#include <sys/conf.h>
#include <sys/mbuf.h> #include <sys/mbuf.h>
#include <sys/protosw.h> #include <sys/protosw.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/errno.h> #include <sys/errno.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#if defined(__FreeBSD__)
#ifdef __NetBSD__ #include <sys/devconf.h>
#elif defined(__bsdi__) || defined(__NetBSD__)
#include <sys/device.h> #include <sys/device.h>
#endif #endif
@ -65,11 +128,11 @@
#include <netinet/ip.h> #include <netinet/ip.h>
#include <netinet/if_ether.h> #include <netinet/if_ether.h>
#endif #endif
#ifdef __NetBSD__ #if defined(__FreeBSD__)
#include <net/if_fddi.h>
#else
#include <netinet/if_fddi.h> #include <netinet/if_fddi.h>
#endif /* __NetBSD__ */ #else
#include <net/if_fddi.h>
#endif
#ifdef NS #ifdef NS
#include <netns/ns.h> #include <netns/ns.h>
@ -78,9 +141,14 @@
#include <vm/vm.h> #include <vm/vm.h>
#include <vm/vm_kern.h> #include <vm/vm_kern.h>
#include <vm/vm_param.h>
#include <dev/ic/pdqreg.h> #include "pdqreg.h"
#include <dev/ic/pdqvar.h> #if defined(__NetBSD__)
#include "pdqvar.h"
#else
#include "pdq_os.h"
#endif
void void
pdq_ifinit( pdq_ifinit(
@ -243,19 +311,11 @@ pdq_os_addr_fill(
int int
pdq_ifioctl( pdq_ifioctl(
#ifdef __NetBSD__
pdq_softc_t *sc,
#else
struct ifnet *ifp, struct ifnet *ifp,
#endif /* __NetBSD__ */
ioctl_cmd_t cmd, ioctl_cmd_t cmd,
caddr_t data) caddr_t data)
{ {
#ifdef __NetBSD__
struct ifnet *ifp = &sc->sc_if;
#else
pdq_softc_t *sc = (pdq_softc_t *) ((caddr_t) ifp - offsetof(pdq_softc_t, sc_ac.ac_if)); pdq_softc_t *sc = (pdq_softc_t *) ((caddr_t) ifp - offsetof(pdq_softc_t, sc_ac.ac_if));
#endif /* __NetBSD__ */
int s, error = 0; int s, error = 0;
s = splimp(); s = splimp();
@ -268,18 +328,15 @@ pdq_ifioctl(
switch(ifa->ifa_addr->sa_family) { switch(ifa->ifa_addr->sa_family) {
#ifdef INET #ifdef INET
case AF_INET: { case AF_INET: {
#ifdef __NetBSD__ sc->sc_ac.ac_ipaddr = IA_SIN(ifa)->sin_addr;
(*sc->if_init)(ifp->if_unit); pdq_ifinit(sc);
#if !defined(__bsdi__)
arp_ifinit(&sc->sc_ac, ifa); arp_ifinit(&sc->sc_ac, ifa);
#else /* ! __NetBSD__ */ #else
((struct arpcom *)ifp)->ac_ipaddr = IA_SIN(ifa)->sin_addr; arpwhohas(&sc->sc_ac, &IA_SIN(ifa)->sin_addr);
(*sc->if_init)(ifp->if_unit); ifa->ifa_rtrequest = arp_rtrequest;
#ifdef __FreeBSD__ ifa->ifa_flags |= RTF_CLONING;
arp_ifinit((struct arpcom *)ifp, ifa); #endif
#else /* ! __FreeBSD__ */
arpwhohas((struct arpcom *)ifp, &IA_SIN(ifa)->sin_addr);
#endif /* __FreeBSD__ */
#endif /* __NetBSD__ */
break; break;
} }
#endif /* INET */ #endif /* INET */
@ -300,13 +357,13 @@ pdq_ifioctl(
sizeof sc->sc_ac.ac_enaddr); sizeof sc->sc_ac.ac_enaddr);
} }
(*sc->if_init)(ifp->if_unit); pdq_ifinit(sc);
break; break;
} }
#endif /* NS */ #endif /* NS */
default: { default: {
(*sc->if_init)(ifp->if_unit); pdq_ifinit(sc);
break; break;
} }
} }
@ -314,7 +371,7 @@ pdq_ifioctl(
} }
case SIOCSIFFLAGS: { case SIOCSIFFLAGS: {
(*sc->if_init)(ifp->if_unit); pdq_ifinit(sc);
break; break;
} }
@ -350,28 +407,21 @@ void
pdq_ifattach( pdq_ifattach(
pdq_softc_t *sc, pdq_softc_t *sc,
ifnet_ret_t (*ifinit)(int unit), ifnet_ret_t (*ifinit)(int unit),
#ifdef __NetBSD__
ifnet_ret_t (*ifwatchdog)(int unit),
int (*ifioctl)(struct ifnet *ifp, ioctl_cmd_t cmd, caddr_t data))
#else
ifnet_ret_t (*ifwatchdog)(int unit)) ifnet_ret_t (*ifwatchdog)(int unit))
#endif /* __NetBSD__ */
{ {
struct ifnet *ifp = &sc->sc_if; struct ifnet *ifp = &sc->sc_if;
ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST; ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_NOTRAILERS|IFF_MULTICAST;
sc->if_init = ifinit; #if !defined(__NetBSD__)
ifp->if_init = ifinit;
#endif
ifp->if_watchdog = ifwatchdog; ifp->if_watchdog = ifwatchdog;
#ifdef __NetBSD__
ifp->if_ioctl = ifioctl;
#else
ifp->if_ioctl = pdq_ifioctl; ifp->if_ioctl = pdq_ifioctl;
#endif /* __NetBSD__ */
ifp->if_output = fddi_output; ifp->if_output = fddi_output;
ifp->if_start = pdq_ifstart; ifp->if_start = pdq_ifstart;
if_attach(ifp); if_attach(ifp);
fddi_ifattach(ifp); fddi_ifattach(ifp);
#if NBPFILTER > 0 #if NBPFILTER > 0