PCI compat clean, part 1

Joerg Sonnenberger joerg at britannica.bec.de
Sat Nov 29 09:09:30 PST 2003


Hi all,
the attached patch is a backport of the lnc and vx driver
from FBSD5. They are not the newest versions, just new enough to
use newbus, not the PCI compat code. Please test
them, I don't have such a card (or VMWare for if_lnc).
The GENERIC kernel with this patch is PCI compat free.
In LINT the follow drivers need some work:
- dev/atm/hea
- dev/atm/hfa
- dev/netif/en
- dev/netif/fpa
- dev/powermng/i386/alpm
- dev/serial/cy
- dev/serial/rp
- dev/serial/stl
- dev/video/meteor

If you are using one of those driver, send me a mail.

Not related is a patch for netsmb/smb_subr.c to make it compile.

Joerg
Index: bus/isa/i386/isa_compat.h
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/bus/isa/i386/isa_compat.h,v
retrieving revision 1.4
diff -u -r1.4 isa_compat.h
--- bus/isa/i386/isa_compat.h	22 Nov 2003 09:50:35 -0000	1.4
+++ bus/isa/i386/isa_compat.h	29 Nov 2003 16:22:56 -0000
@@ -31,7 +31,6 @@
 #include "use_cx.h"
 #include "use_el.h"
 #include "use_le.h"
-#include "use_lnc.h"
 #include "use_rdp.h"
 #include "use_wl.h"
 #include "use_pcm.h"
@@ -75,7 +74,6 @@
 extern struct isa_driver  cxdriver;
 extern struct isa_driver  eldriver;
 extern struct isa_driver  ledriver;
-extern struct isa_driver lncdriver;
 extern struct isa_driver rdpdriver;
 extern struct isa_driver  wldriver;
 extern struct isa_driver pasdriver;
@@ -182,9 +180,6 @@
 
 #if NLE > 0
 	{ INTR_TYPE_NET, &ledriver },
-#endif
-#if NLNC > 0
-	{ INTR_TYPE_NET, &lncdriver },
 #endif
 #if NCX > 0
 	{ INTR_TYPE_NET, &cxdriver },
Index: conf/files
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/conf/files,v
retrieving revision 1.30
diff -u -r1.30 files
--- conf/files	21 Nov 2003 05:29:05 -0000	1.30
+++ conf/files	29 Nov 2003 16:23:10 -0000
@@ -1075,7 +1075,9 @@
 dev/netif/dc/if_dc.c		optional dc
 dev/netif/de/if_de.c		optional de
 dev/netif/en_pci/if_en_pci.c	optional en pci
-dev/netif/lnc_p/if_lnc_p.c	optional lnc pci
+dev/netif/lnc/if_lnc.c		optional lnc
+dev/netif/lnc/if_lnc_isa.c	optional lnc isa
+dev/netif/lnc/if_lnc_pci.c	optional lnc pci
 dev/netif/pcn/if_pcn.c		optional pcn
 dev/netif/mn/if_mn.c		optional mn
 dev/netif/rl/if_rl.c		optional rl
Index: conf/files.i386
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/conf/files.i386,v
retrieving revision 1.8
diff -u -r1.8 files.i386
--- conf/files.i386	22 Nov 2003 09:50:35 -0000	1.8
+++ conf/files.i386	29 Nov 2003 16:23:14 -0000
@@ -256,7 +256,6 @@
 dev/netif/cx/if_cx.c			optional	cx
 dev/netif/el/if_el.c			optional	el
 dev/netif/le/if_le.c			optional	le
-dev/netif/lnc/if_lnc.c			optional	lnc
 dev/netif/rdp/if_rdp.c			optional	rdp
 dev/netif/wl/if_wl.c			optional	wl
 i386/isa/intr_machdep.c			standard
Index: conf/files.pc98
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/conf/files.pc98,v
retrieving revision 1.3
diff -u -r1.3 files.pc98
--- conf/files.pc98	6 Jul 2003 21:23:45 -0000	1.3
+++ conf/files.pc98	29 Nov 2003 16:23:18 -0000
@@ -259,7 +259,6 @@
 i386/isa/if_cx.c		optional	cx
 i386/isa/if_el.c		optional	el
 i386/isa/if_le.c		optional	le
-i386/isa/if_lnc.c		optional	lnc
 i386/isa/if_rdp.c		optional	rdp
 i386/isa/if_wl.c		optional	wl
 i386/isa/intr_machdep.c		standard
Index: dev/netif/Makefile
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/dev/netif/Makefile,v
retrieving revision 1.1
diff -u -r1.1 Makefile
--- dev/netif/Makefile	15 Aug 2003 08:32:30 -0000	1.1
+++ dev/netif/Makefile	29 Nov 2003 16:22:50 -0000
@@ -1,8 +1,8 @@
 # $DragonFly: src/sys/dev/netif/Makefile,v 1.1 2003/08/15 08:32:30 dillon Exp $
 #
 
-SUBDIR= an ar aue bge cue dc em fwe fxp gx kue lge mii_layer my \
+SUBDIR= an ar aue bge cue dc em fwe fxp gx kue lge lnc mii_layer my \
 	nge pcn ray rl sbni sbsh sf sis sk snc sr ste ti tl tx \
-	txp vr wb wi wx xe xl
+	txp vr vx wb wi wx xe xl
 
 .include <bsd.subdir.mk>
Index: dev/netif/lnc/Makefile
===================================================================
RCS file: dev/netif/lnc/Makefile
diff -N dev/netif/lnc/Makefile
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dev/netif/lnc/Makefile	29 Nov 2003 16:23:26 -0000
@@ -0,0 +1,8 @@
+# $DragonFly$
+ 
+.PATH:  ${.CURDIR}/../../dev/lnc
+KMOD    = if_lnc
+SRCS    = if_lnc.c if_lnc_isa.c if_lnc_pci.c
+SRCS    += device_if.h bus_if.h pci_if.h isa_if.h opt_inet.h
+  
+.include <bsd.kmod.mk>
Index: dev/netif/lnc/if_lnc.c
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/dev/netif/lnc/if_lnc.c,v
retrieving revision 1.5
diff -u -r1.5 if_lnc.c
--- dev/netif/lnc/if_lnc.c	20 Nov 2003 22:07:29 -0000	1.5
+++ dev/netif/lnc/if_lnc.c	29 Nov 2003 16:23:33 -0000
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 1994-1998
+ * Copyright (c) 1994-2000
  *	Paul Richards.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -12,10 +12,7 @@
  * 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 Paul Richards.
- * 4. The name Paul Richards may not be used to endorse or promote products
+ * 3. The name Paul Richards may not be used to endorse or promote products
  *    derived from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND
@@ -30,8 +27,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/isa/if_lnc.c,v 1.68.2.5 2002/02/13 00:43:10 dillon Exp $
- * $DragonFly: src/sys/dev/netif/lnc/if_lnc.c,v 1.5 2003/11/20 22:07:29 dillon Exp $
+ * $FreeBSD: src/sys/dev/lnc/if_lnc.c,v 1.89 2001/07/04 13:00:19 nyan Exp $
+ * $DragonFly$
  */
 
 /*
@@ -40,9 +37,6 @@
  *
  * TODO ----
  *
- * This driver will need bounce buffer support when dma'ing to mbufs above the
- * 16Mb mark.
- *
  * Check all the XXX comments -- some of them are just things I've left
  * unfinished rather than "difficult" problems that were hacked around.
  *
@@ -61,9 +55,6 @@
  *
  */
 
-#include "use_pci.h"
-#include "use_lnc.h"
-
 #include "opt_inet.h"
 
 /* Some defines that should really be in generic locations */
@@ -72,14 +63,18 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/conf.h>
-#include <sys/sockio.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
+#include <sys/module.h>
 #include <sys/socket.h>
+#include <sys/sockio.h>
 #include <sys/syslog.h>
-#include <sys/linker_set.h>
-#include <sys/module.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
 
 #include <net/ethernet.h>
 #include <net/if.h>
@@ -91,41 +86,14 @@
 
 #include <net/bpf.h>
 
-#ifdef PC98
-#include <machine/clock.h>
-#endif
 #include <machine/md_var.h>
 
-#include <bus/isa/i386/isa_device.h>
-#include "if_lnc.h"
-
-struct lnc_softc {
-	struct arpcom arpcom;	            /* see ../../net/if_arp.h */
-	struct nic_info nic;	            /* NIC specific info */
-	int nrdre;
-	struct host_ring_entry *recv_ring;  /* start of alloc'd mem */
-	int recv_next;
-	int ntdre;
-	struct host_ring_entry *trans_ring;
-	int trans_next;
-	struct init_block *init_block;	    /* Initialisation block */
-	int pending_transmits;        /* No. of transmit descriptors in use */
-	int next_to_send;
-	struct mbuf *mbufs;
-	int mbuf_count;
-	int flags;
-	int rap;
-	int rdp;
-	int bdp;
-#ifdef DEBUG
-	int lnc_debug;
-#endif
-	LNCSTATS_STRUCT
-};
+#include <dev/netif/lnc/if_lncvar.h>
+#include <dev/netif/lnc/if_lncreg.h>
 
 DECLARE_DUMMY_MODULE(if_lnc);
 
-static struct lnc_softc lnc_softc[NLNC];
+devclass_t lnc_devclass;
 
 static char const * const nic_ident[] = {
 	"Unknown",
@@ -150,77 +118,77 @@
 	"PCnet-Home",
 };
 
-static void lnc_setladrf (struct lnc_softc *sc);
-static void lnc_stop (struct lnc_softc *sc);
-static void lnc_reset (struct lnc_softc *sc);
-static void lnc_free_mbufs (struct lnc_softc *sc);
-static __inline int alloc_mbuf_cluster (struct lnc_softc *sc,
+static void lnc_setladrf(struct lnc_softc *sc);
+static void lnc_reset(struct lnc_softc *sc);
+static void lnc_free_mbufs(struct lnc_softc *sc);
+static __inline int alloc_mbuf_cluster(struct lnc_softc *sc,
 					    struct host_ring_entry *desc);
-static __inline struct mbuf *chain_mbufs (struct lnc_softc *sc,
+static __inline struct mbuf *chain_mbufs(struct lnc_softc *sc,
 					      int start_of_packet,
 					      int pkt_len);
-static __inline struct mbuf *mbuf_packet (struct lnc_softc *sc,
+static __inline struct mbuf *mbuf_packet(struct lnc_softc *sc,
 					      int start_of_packet,
 					      int pkt_len);
-static __inline void lnc_rint (struct lnc_softc *sc);
-static __inline void lnc_tint (struct lnc_softc *sc);
-static int lnc_probe (struct isa_device *isa_dev);
-#ifdef PC98
-static int cnet98s_probe (struct lnc_softc *sc, unsigned iobase);
-#endif
-static int ne2100_probe (struct lnc_softc *sc, unsigned iobase);
-static int bicc_probe (struct lnc_softc *sc, unsigned iobase);
-static int dec_macaddr_extract (u_char ring[], struct lnc_softc *sc);
-static int depca_probe (struct lnc_softc *sc, unsigned iobase);
-static int lance_probe (struct lnc_softc *sc);
-static int pcnet_probe (struct lnc_softc *sc);
-static int lnc_attach_sc (struct lnc_softc *sc, int unit);
-static int lnc_attach (struct isa_device *isa_dev);
-static void lnc_init (void *);
-static ointhand2_t lncintr;
-static __inline int mbuf_to_buffer (struct mbuf *m, char *buffer);
-static __inline struct mbuf *chain_to_cluster (struct mbuf *m);
-static void lnc_start (struct ifnet *ifp);
-static int lnc_ioctl (struct ifnet *ifp, u_long command, caddr_t data);
-static void lnc_watchdog (struct ifnet *ifp);
-#ifdef DEBUG
-void lnc_dump_state (struct lnc_softc *sc);
-void mbuf_dump_chain (struct mbuf *m);
-#endif
+static __inline void lnc_rint(struct lnc_softc *sc);
+static __inline void lnc_tint(struct lnc_softc *sc);
 
-#if NPCI > 0
-void *lnc_attach_ne2100_pci (int unit, unsigned iobase);
+static void lnc_init(void *);
+static __inline int mbuf_to_buffer(struct mbuf *m, char *buffer);
+static __inline struct mbuf *chain_to_cluster(struct mbuf *m);
+static void lnc_start(struct ifnet *ifp);
+static int lnc_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
+static void lnc_watchdog(struct ifnet *ifp);
+#ifdef DEBUG
+void lnc_dump_state(struct lnc_softc *sc);
+void mbuf_dump_chain(struct mbuf *m);
 #endif
-void lncintr_sc (struct lnc_softc *sc);
 
-struct isa_driver lncdriver = {lnc_probe, lnc_attach, "lnc"};
-
-static __inline void
-write_csr(struct lnc_softc *sc, u_short port, u_short val)
+u_short
+read_csr(struct lnc_softc *sc, u_short port)
 {
-	outw(sc->rap, port);
-	outw(sc->rdp, val);
+	lnc_outw(sc->rap, port);
+	return (lnc_inw(sc->rdp));
 }
 
-static __inline u_short
-read_csr(struct lnc_softc *sc, u_short port)
+void
+write_csr(struct lnc_softc *sc, u_short port, u_short val)
 {
-	outw(sc->rap, port);
-	return (inw(sc->rdp));
+	lnc_outw(sc->rap, port);
+	lnc_outw(sc->rdp, val);
 }
 
 static __inline void
 write_bcr(struct lnc_softc *sc, u_short port, u_short val)
 {
-	outw(sc->rap, port);
-	outw(sc->bdp, val);
+	lnc_outw(sc->rap, port);
+	lnc_outw(sc->bdp, val);
 }
 
 static __inline u_short
 read_bcr(struct lnc_softc *sc, u_short port)
 {
-	outw(sc->rap, port);
-	return (inw(sc->bdp));
+	lnc_outw(sc->rap, port);
+	return (lnc_inw(sc->bdp));
+}
+
+int
+lance_probe(struct lnc_softc *sc)
+{
+	write_csr(sc, CSR0, STOP);
+
+	if ((lnc_inw(sc->rdp) & STOP) && ! (read_csr(sc, CSR3))) {
+		/*
+		 * Check to see if it's a C-LANCE. For the LANCE the INEA bit
+		 * cannot be set while the STOP bit is. This restriction is
+		 * removed for the C-LANCE.
+		 */
+		write_csr(sc, CSR0, INEA);
+		if (read_csr(sc, CSR0) & INEA)
+			return (C_LANCE);
+		else
+			return (LANCE);
+	} else
+		return (UNKNOWN);
 }
 
 static __inline u_long
@@ -241,6 +209,31 @@
 #undef POLYNOMIAL
 }
 
+void
+lnc_release_resources(device_t dev)
+{
+	lnc_softc_t *sc = device_get_softc(dev);
+
+	if (sc->irqres) {
+		bus_teardown_intr(dev, sc->irqres, sc->intrhand);
+		bus_release_resource(dev, SYS_RES_IRQ, sc->irqrid, sc->irqres);
+	}
+
+	if (sc->portres)
+		bus_release_resource(dev, SYS_RES_IOPORT,
+		                     sc->portrid, sc->portres);
+	if (sc->drqres)
+		bus_release_resource(dev, SYS_RES_DRQ, sc->drqrid, sc->drqres);
+
+	if (sc->dmat) {
+		if (sc->dmamap) {
+			bus_dmamap_unload(sc->dmat, sc->dmamap);
+			bus_dmamem_free(sc->dmat, sc->recv_ring, sc->dmamap);
+		}
+		bus_dma_tag_destroy(sc->dmat);
+	}
+}
+
 /*
  * Set up the logical address filter for multicast packets
  */
@@ -266,8 +259,7 @@
 	 */
 
 	bzero(sc->init_block->ladrf, MULTICAST_FILTER_LEN);
-	for (ifma = ifp->if_multiaddrs.lh_first; ifma;
-	     ifma = ifma->ifma_link.le_next) {
+	LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
 		if (ifma->ifma_addr->sa_family != AF_LINK)
 			continue;
 
@@ -277,7 +269,7 @@
 	}
 }
 
-static void
+void
 lnc_stop(struct lnc_softc *sc)
 {
 	write_csr(sc, CSR0, STOP);
@@ -361,6 +353,7 @@
 
 	head = desc->buff.mbuf;
 	head->m_flags |= M_PKTHDR;
+	bzero(&head->m_pkthdr, sizeof(head->m_pkthdr));
 
 	m = head;
 	do {
@@ -606,19 +599,18 @@
 				 * vmware ethernet hardware emulation loops
 				 * packets back to itself, violates IFF_SIMPLEX.
 				 * drop it if it is from myself.
-				 */
+				*/
 				if (bcmp(eh->ether_shost,
 				      sc->arpcom.ac_enaddr, ETHER_ADDR_LEN) == 0) {
-					m_freem(head);
+				    m_freem(head);
 				} else {
-					/* Skip over the ether header */
-					head->m_data += sizeof *eh;
-					head->m_len -= sizeof *eh;
-					head->m_pkthdr.len -= sizeof *eh;
+				    /* Skip over the ether header */
+				    head->m_data += sizeof *eh;
+				    head->m_len -= sizeof *eh;
+				    head->m_pkthdr.len -= sizeof *eh;
 
-					ether_input(&sc->arpcom.ac_if, eh, head);
+				    ether_input(&sc->arpcom.ac_if, eh, head);
 				}
-
 			} else {
 				int unit = sc->arpcom.ac_if.if_unit;
 				log(LOG_ERR,"lnc%d: Packet dropped, no mbufs\n",unit);
@@ -635,7 +627,7 @@
 	 * here have been dealt with.
 	 */
 
-	outw(sc->rdp, RINT | INEA);
+	lnc_outw(sc->rdp, RINT | INEA);
 }
 
 static __inline void
@@ -844,7 +836,6 @@
 					sc->mbuf_count++;
 					start->buff.mbuf = 0;
 				} else {
-					/* XXX shouldn't this be m_freem ?? */
 					m_free(start->buff.mbuf);
 					start->buff.mbuf = NULL;
 				}
@@ -870,360 +861,25 @@
 	 * the completed transmissions.
 	 */
 
-	outw(sc->rdp, TINT | INEA);
-
-	/* XXX only while doing if_is comparisons */
-	if (!(sc->arpcom.ac_if.if_flags & IFF_OACTIVE))
-		lnc_start(&sc->arpcom.ac_if);
-
+	lnc_outw(sc->rdp, TINT | INEA);
 }
 
-static int
-lnc_probe(struct isa_device * isa_dev)
-{
-	int nports;
-	int unit = isa_dev->id_unit;
-	struct lnc_softc *sc = &lnc_softc[unit];
-	unsigned iobase = isa_dev->id_iobase;
-
-#ifdef DIAGNOSTIC
-	int vsw;
-	vsw = inw(isa_dev->id_iobase + PCNET_VSW);
-	printf("Vendor Specific Word = %x\n", vsw);
-#endif
-
-	nports = bicc_probe(sc, iobase);
-	if (nports == 0)
-		nports = ne2100_probe(sc, iobase);
-	if (nports == 0)
-		nports = depca_probe(sc, iobase);
-#ifdef PC98
-	if (nports == 0)
-		nports = cnet98s_probe(sc, iobase);
-#endif
-	return (nports);
-}
-
-#ifdef PC98
-/* ISA Bus Configuration Registers */
-/* XXX - Should be in ic/Am7990.h */
-#define	MSRDA	0x0000	/* ISACSR0: Master Mode Read Activity */
-#define	MSWRA	0x0001	/* ISACSR1: Master Mode Write Activity */
-#define	MC	0x0002	/* ISACSR2: Miscellaneous Configuration */
-
-#define	LED1	0x0005	/* ISACSR5: LED1 Status */
-#define	LED2	0x0006	/* ISACSR6: LED2 Status */
-#define	LED3	0x0007	/* ISACSR7: LED3 Status */
-
-#define	LED_PSE		0x0080	/* Pulse Stretcher */
-#define	LED_XMTE	0x0010	/* Transmit Status */
-#define	LED_RVPOLE	0x0008	/* Receive Polarity */
-#define	LED_RCVE	0x0004	/* Receive Status */
-#define	LED_JABE	0x0002	/* Jabber */
-#define	LED_COLE	0x0001	/* Collision */
-
-static int
-cnet98s_probe(struct lnc_softc *sc, unsigned iobase)
+int
+lnc_attach_common(device_t dev)
 {
+	int unit = device_get_unit(dev);
+	lnc_softc_t *sc = device_get_softc(dev);
 	int i;
-	ushort tmp;
-
-	sc->rap = iobase + CNET98S_RAP;
-	sc->rdp = iobase + CNET98S_RDP;
-
-	/* Reset */
-	tmp = inw(iobase + CNET98S_RESET);
-	outw(iobase + CNET98S_RESET, tmp);
-	DELAY(500);
-
-	sc->nic.ic = pcnet_probe(sc);
-	if ((sc->nic.ic == UNKNOWN) || (sc->nic.ic > PCnet_32)) {
-		return (0);
-	}
-
-	sc->nic.ident = CNET98S;
-	sc->nic.mem_mode = DMA_FIXED;
-
-	/* XXX - For now just use the defines */
-	sc->nrdre = NRDRE;
-	sc->ntdre = NTDRE;
-
-	/* Extract MAC address from PROM */
-	for (i = 0; i < ETHER_ADDR_LEN; i++) {
-		sc->arpcom.ac_enaddr[i] = inb(iobase + (i * 2));
-	}
-
-	/*
-	 * ISA Configuration
-	 *
-	 * XXX - Following parameters are Contec C-NET(98)S only.
-	 *       So, check the Ethernet address here.
-	 *
-	 *       Contec uses 00 80 4c ?? ?? ??
-	 */ 
-	if (sc->arpcom.ac_enaddr[0] == (u_char)0x00
-	&&  sc->arpcom.ac_enaddr[1] == (u_char)0x80
-	&&  sc->arpcom.ac_enaddr[2] == (u_char)0x4c) {
-        	outw(sc->rap, MSRDA);
-        	outw(iobase + CNET98S_IDP, 0x0006);
-        	outw(sc->rap, MSWRA);
-        	outw(iobase + CNET98S_IDP, 0x0006);
-#ifdef DIAGNOSTIC
-        	outw(sc->rap, MC);
-		printf("ISACSR2 = %x\n", inw(iobase + CNET98S_IDP));
-#endif
-        	outw(sc->rap, LED1);
-        	outw(iobase + CNET98S_IDP, LED_PSE | LED_XMTE);
-        	outw(sc->rap, LED2);
-        	outw(iobase + CNET98S_IDP, LED_PSE | LED_RCVE);
-        	outw(sc->rap, LED3);
-        	outw(iobase + CNET98S_IDP, LED_PSE | LED_COLE);
-	}
-		
-	return (CNET98S_IOSIZE);
-}
-#endif
+	int skip;
 
-static int
-ne2100_probe(struct lnc_softc *sc, unsigned iobase)
-{
-	int i;
-
-	sc->rap = iobase + PCNET_RAP;
-	sc->rdp = iobase + PCNET_RDP;
-
-	sc->nic.ic = pcnet_probe(sc);
-	if ((sc->nic.ic > 0) && (sc->nic.ic < PCnet_PCI)) {
-		sc->nic.ident = NE2100;
-		sc->nic.mem_mode = DMA_FIXED;
-
-		/* XXX - For now just use the defines */
-		sc->nrdre = NRDRE;
-		sc->ntdre = NTDRE;
-
-		/* Extract MAC address from PROM */
-		for (i = 0; i < ETHER_ADDR_LEN; i++)
-			sc->arpcom.ac_enaddr[i] = inb(iobase + i);
-		return (NE2100_IOSIZE);
-	} else {
-		return (0);
-	}
-}
-
-static int
-bicc_probe(struct lnc_softc *sc, unsigned iobase)
-{
-	int i;
-
-	/*
-	 * There isn't any way to determine if a NIC is a BICC. Basically, if
-	 * the lance probe succeeds using the i/o addresses of the BICC then
-	 * we assume it's a BICC.
-	 *
-	 */
-
-	sc->rap = iobase + BICC_RAP;
-	sc->rdp = iobase + BICC_RDP;
-
-	/* I think all these cards us the Am7990 */
-
-	if ((sc->nic.ic = lance_probe(sc))) {
-		sc->nic.ident = BICC;
-		sc->nic.mem_mode = DMA_FIXED;
-
-		/* XXX - For now just use the defines */
-		sc->nrdre = NRDRE;
-		sc->ntdre = NTDRE;
-
-		/* Extract MAC address from PROM */
-		for (i = 0; i < ETHER_ADDR_LEN; i++)
-			sc->arpcom.ac_enaddr[i] = inb(iobase + (i * 2));
-
-		return (BICC_IOSIZE);
-	} else {
-		return (0);
-	}
-}
-
-/*
- * I don't have data sheets for the dec cards but it looks like the mac
- * address is contained in a 32 byte ring. Each time you read from the port
- * you get the next byte in the ring. The mac address is stored after a
- * signature so keep searching for the signature first.
- */
-static int
-dec_macaddr_extract(u_char ring[], struct lnc_softc * sc)
-{
-	const unsigned char signature[] = {0xff, 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa};
-
-	int i, j, rindex;
-
-	for (i = 0; i < sizeof ring; i++) {
-		for (j = 0, rindex = i; j < sizeof signature; j++) {
-			if (ring[rindex] != signature[j])
-				break;
-			if (++rindex > sizeof ring)
-				rindex = 0;
-		}
-		if (j == sizeof signature) {
-			for (j = 0, rindex = i; j < ETHER_ADDR_LEN; j++) {
-				sc->arpcom.ac_enaddr[j] = ring[rindex];
-				if (++rindex > sizeof ring)
-					rindex = 0;
-			}
-			return (1);
-		}
-	}
-	return (0);
-}
-
-static int
-depca_probe(struct lnc_softc *sc, unsigned iobase)
-{
-	int i;
-	unsigned char maddr_ring[DEPCA_ADDR_ROM_SIZE];
-
-	sc->rap = iobase + DEPCA_RAP;
-	sc->rdp = iobase + DEPCA_RDP;
-
-	if ((sc->nic.ic = lance_probe(sc))) {
-		sc->nic.ident = DEPCA;
-		sc->nic.mem_mode = SHMEM;
-
-		/* Extract MAC address from PROM */
-		for (i = 0; i < DEPCA_ADDR_ROM_SIZE; i++)
-			maddr_ring[i] = inb(iobase + DEPCA_ADP);
-		if (dec_macaddr_extract(maddr_ring, sc)) {
-			return (DEPCA_IOSIZE);
-		}
-	}
-	return (0);
-}
-
-static int
-lance_probe(struct lnc_softc *sc)
-{
-	write_csr(sc, CSR0, STOP);
-
-	if ((inw(sc->rdp) & STOP) && !(read_csr(sc, CSR3))) {
-		/*
-		 * Check to see if it's a C-LANCE. For the LANCE the INEA bit
-		 * cannot be set while the STOP bit is. This restriction is
-		 * removed for the C-LANCE.
-		 */
-		write_csr(sc, CSR0, INEA);
-		if (read_csr(sc, CSR0) & INEA)
-			return (C_LANCE);
-		else
-			return (LANCE);
-	} else
-		return (UNKNOWN);
-}
-
-static int
-pcnet_probe(struct lnc_softc *sc)
-{
-	u_long chip_id;
-	int type;
-
-	/*
-	 * The PCnet family don't reset the RAP register on reset so we'll
-	 * have to write during the probe :-) It does have an ID register
-	 * though so the probe is just a matter of reading it.
-	 */
-
-	if ((type = lance_probe(sc))) {
-		chip_id = read_csr(sc, CSR89);
-		chip_id <<= 16;
-		chip_id |= read_csr(sc, CSR88);
-		if (chip_id & AMD_MASK) {
-			chip_id >>= 12;
-			switch (chip_id & PART_MASK) {
-			case Am79C960:
-				return (PCnet_ISA);
-			case Am79C961:
-				return (PCnet_ISAplus);
-			case Am79C961A:
-				return (PCnet_ISA_II);
-			case Am79C965:
-				return (PCnet_32);
-			case Am79C970:
-				return (PCnet_PCI);
-			case Am79C970A:
-				return (PCnet_PCI_II);
-			case Am79C971:
-				return (PCnet_FAST);
-			case Am79C972:
-			case Am79C973:
-				return (PCnet_FASTplus);
-			case Am79C978:
-				return (PCnet_Home);
-			default:
-				break;
-			}
-		}
-	}
-	return (type);
-}
-
-static int
-lnc_attach_sc(struct lnc_softc *sc, int unit)
-{
-	int lnc_mem_size;
-
-	/*
-	 * Allocate memory for use by the controller.
-	 *
-	 * XXX -- the Am7990 and Am79C960 only have 24 address lines and so can
-	 * only access the lower 16Mb of physical memory. For the moment we
-	 * assume that malloc will allocate memory within the lower 16Mb
-	 * range. This is not a very valid assumption but there's nothing
-	 * that can be done about it yet. For shared memory NICs this isn't
-	 * relevant.
-	 *
-	 */
-
-	lnc_mem_size = ((NDESC(sc->nrdre) + NDESC(sc->ntdre)) *
-		 sizeof(struct host_ring_entry));
-
-	if (sc->nic.mem_mode != SHMEM)
-		lnc_mem_size += sizeof(struct init_block) + (sizeof(struct mds) *
-			    (NDESC(sc->nrdre) + NDESC(sc->ntdre))) +
-			MEM_SLEW;
-
-	/* If using DMA to fixed host buffers then allocate memory for them */
-
-	if (sc->nic.mem_mode == DMA_FIXED)
-		lnc_mem_size += (NDESC(sc->nrdre) * RECVBUFSIZE) + (NDESC(sc->ntdre) * TRANSBUFSIZE);
-
-	if (sc->nic.mem_mode != SHMEM) {
-		if (sc->nic.ic < PCnet_32) {
-			/* ISA based cards */
-			sc->recv_ring = contigmalloc(lnc_mem_size, M_DEVBUF, M_NOWAIT,
-										 0ul, 0xfffffful, 4ul, 0x1000000);
-		} else {
-			/* Non-ISA based cards, 32 bit capable */
-#ifdef notyet
-			/*
-			 * For the 32 bit driver we're not fussed where we DMA to
-			 * though it'll still need to be contiguous
-			 */
-			sc->recv_ring = malloc(lnc_mem_size, M_DEVBUF, M_NOWAIT);
-#else
-			/*
-			 * For now it still needs to be below 16MB because the
-			 * descriptor's can only hold 16 bit addresses.
-			 */
-			sc->recv_ring = contigmalloc(lnc_mem_size, M_DEVBUF, M_NOWAIT,
-										 0ul, 0xfffffful, 4ul, 0x1000000);
-#endif
-		}    	
-	}
-
-	if (!sc->recv_ring) {
-		log(LOG_ERR, "lnc%d: Couldn't allocate memory for NIC\n", unit);
-		return (0);	/* XXX -- attach failed -- not tested in
-				 * calling routines */
+	switch (sc->nic.ident) {
+	case BICC:
+	case CNET98S:
+		skip = 2;
+		break;
+	default:
+		skip = 1;
+		break;
 	}
 
 	/* Set default mode */
@@ -1232,9 +888,8 @@
 	/* Fill in arpcom structure entries */
 
 	sc->arpcom.ac_if.if_softc = sc;
-	sc->arpcom.ac_if.if_name = lncdriver.name;
+	sc->arpcom.ac_if.if_name = "lnc";
 	sc->arpcom.ac_if.if_unit = unit;
-	sc->arpcom.ac_if.if_mtu = ETHERMTU;
 	sc->arpcom.ac_if.if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	sc->arpcom.ac_if.if_timer = 0;
 	sc->arpcom.ac_if.if_output = ether_output;
@@ -1242,11 +897,16 @@
 	sc->arpcom.ac_if.if_ioctl = lnc_ioctl;
 	sc->arpcom.ac_if.if_watchdog = lnc_watchdog;
 	sc->arpcom.ac_if.if_init = lnc_init;
-	sc->arpcom.ac_if.if_type = IFT_ETHER;
-	sc->arpcom.ac_if.if_addrlen = ETHER_ADDR_LEN;
-	sc->arpcom.ac_if.if_hdrlen = ETHER_HDR_LEN;
 	sc->arpcom.ac_if.if_snd.ifq_maxlen = IFQ_MAXLEN;
 
+	/* Extract MAC address from PROM */
+	for (i = 0; i < ETHER_ADDR_LEN; i++)
+		sc->arpcom.ac_enaddr[i] = lnc_inb(i * skip);
+
+	/*
+	 * XXX -- should check return status of if_attach
+	 */
+
 	ether_ifattach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
 
 	printf("lnc%d: ", unit);
@@ -1260,72 +920,6 @@
 	return (1);
 }
 
-static int
-lnc_attach(struct isa_device * isa_dev)
-{
-	int unit = isa_dev->id_unit;
-	struct lnc_softc *sc = &lnc_softc[unit];
-	int result;
-
-	isa_dev->id_ointr = lncintr;
-	result = lnc_attach_sc (sc, unit);
-	if (result == 0)
-		return (0);
-
-#ifndef PC98
-	/*
-	 * XXX - is it safe to call isa_dmacascade() after if_attach() 
-	 *       and ether_ifattach() have been called in lnc_attach() ???
-	 */
-	if ((sc->nic.mem_mode != SHMEM) &&
-	    (sc->nic.ic < PCnet_32))
-		isa_dmacascade(isa_dev->id_drq);
-#endif
-
-	return result;
-}
-
-#if NPCI > 0
-void *
-lnc_attach_ne2100_pci(int unit, unsigned iobase)
-{
-	int i;
-	struct lnc_softc *sc = malloc(sizeof *sc, M_DEVBUF, M_NOWAIT);
-
-	if (sc) {
-		bzero (sc, sizeof *sc);
-
-		sc->rap = iobase + PCNET_RAP;
-		sc->rdp = iobase + PCNET_RDP;
-		sc->bdp = iobase + PCNET_BDP;
-
-		sc->nic.ic = pcnet_probe(sc);
-		if (sc->nic.ic >= PCnet_32) {
-			sc->nic.ident = NE2100;
-			sc->nic.mem_mode = DMA_FIXED;
-  
-			/* XXX - For now just use the defines */
-			sc->nrdre = NRDRE;
-			sc->ntdre = NTDRE;
-
-			/* Extract MAC address from PROM */
-			for (i = 0; i < ETHER_ADDR_LEN; i++)
-				sc->arpcom.ac_enaddr[i] = inb(iobase + i);
-
-				free(sc, M_DEVBUF);
-				sc = NULL;
-			}
-		}
-		else {
-			free(sc, M_DEVBUF);
-			sc = NULL;
-		}
-	}
-	return sc;
-}
-#endif
-
 static void
 lnc_init(xsc)
 	void *xsc;
@@ -1336,8 +930,10 @@
 
 	/* Check that interface has valid address */
 
-	if (TAILQ_EMPTY(&sc->arpcom.ac_if.if_addrhead))	/* XXX unlikely */
+	if (TAILQ_EMPTY(&sc->arpcom.ac_if.if_addrhead)) { /* XXX unlikely */
+printf("XXX no address?\n");
 		return;
+	}
 
 	/* Shut down interface */
 
@@ -1355,8 +951,6 @@
 	 * The alignment tests are particularly paranoid.
 	 */
 
-
-
 	sc->recv_next = 0;
 	sc->trans_ring = sc->recv_ring + NDESC(sc->nrdre);
 	sc->trans_next = 0;
@@ -1474,11 +1068,11 @@
 	write_csr(sc, CSR3, 0);
 
 	/* Let's see if it starts */
-
-	write_csr(sc, CSR0, INIT);
-	for (i = 0; i < 1000; i++)
-		if (read_csr(sc, CSR0) & IDON)
-			break;
+/*
+printf("Enabling lnc interrupts\n");
+	sc->arpcom.ac_if.if_timer = 10;
+	write_csr(sc, CSR0, INIT|INEA);
+*/
 
 	/*
 	 * Now that the initialisation is complete there's no reason to
@@ -1487,6 +1081,11 @@
 	 * time.
 	 */
 
+	write_csr(sc, CSR0, INIT);
+	for(i=0; i < 1000; i++)
+		if (read_csr(sc, CSR0) & IDON)
+			break;
+
 	if (read_csr(sc, CSR0) & IDON) {
 		/*
 		 * Enable interrupts, start the LANCE, mark the interface as
@@ -1525,8 +1124,9 @@
  */
 
 void
-lncintr_sc(struct lnc_softc *sc)
+lncintr(void *arg)
 {
+	lnc_softc_t *sc = arg;
 	int unit = sc->arpcom.ac_if.if_unit;
 	u_short csr0;
 
@@ -1535,7 +1135,7 @@
 	 * we have to include it in any writes that clear other flags.
 	 */
 
-	while ((csr0 = inw(sc->rdp)) & INTR) {
+	while ((csr0 = lnc_inw(sc->rdp)) & INTR) {
 
 		/*
 		 * Clear interrupt flags early to avoid race conditions. The
@@ -1545,10 +1145,20 @@
 		 * be missed.
 		 */
 
-/*		outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA); */
-		outw(sc->rdp, csr0);
+		lnc_outw(sc->rdp, csr0);
+		/*lnc_outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA);*/
 
-		/* We don't do anything with the IDON flag */
+#ifdef notyet
+		if (csr0 & IDON) {
+printf("IDON\n");
+			sc->arpcom.ac_if.if_timer = 0;
+			write_csr(sc, CSR0, STRT | INEA);
+			sc->arpcom.ac_if.if_flags |= IFF_RUNNING;
+			sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
+			lnc_start(&sc->arpcom.ac_if);
+			continue;
+		}
+#endif
 
 		if (csr0 & ERR) {
 			if (csr0 & CERR) {
@@ -1592,13 +1202,6 @@
 	}
 }
 
-static void
-lncintr(int unit)
-{
-	struct lnc_softc *sc = &lnc_softc[unit];
-	lncintr_sc (sc);
-}
-
 static __inline int
 mbuf_to_buffer(struct mbuf *m, char *buffer)
 {
@@ -1769,7 +1372,7 @@
 		}
 
 		/* Force an immediate poll of the transmit ring */
-		outw(sc->rdp, TDMD | INEA);
+		lnc_outw(sc->rdp, TDMD | INEA);
 
 		/*
 		 * Set a timer so if the buggy Am7990.h shuts
@@ -1928,7 +1531,7 @@
 	    read_csr(sc, CSR2), read_csr(sc, CSR3));
 
 	/* Set RAP back to CSR0 */
-	outw(sc->rap, CSR0);
+	lnc_outw(sc->rap, CSR0);
 }
 
 void
Index: dev/netif/lnc/if_lnc_isa.c
===================================================================
RCS file: dev/netif/lnc/if_lnc_isa.c
diff -N dev/netif/lnc/if_lnc_isa.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dev/netif/lnc/if_lnc_isa.c	29 Nov 2003 16:23:39 -0000
@@ -0,0 +1,287 @@
+/*
+ * Copyright (c) 1994-2000
+ *	Paul Richards. 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,
+ *    verbatim and that no modifications are made prior to this
+ *    point in the file.
+ * 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. The name Paul Richards may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``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 PAUL RICHARDS 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/sys/dev/lnc/if_lnc_isa.c,v 1.12 2001/07/04 13:00:19 nyan Exp $
+ * $DragonFly$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/socket.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+
+#include <bus/isa/isavar.h>
+
+#include <dev/netif/lnc/if_lncvar.h>
+#include <dev/netif/lnc/if_lncreg.h>
+
+static struct isa_pnp_id lnc_pnp_ids[] = {
+	{0,	NULL}
+};
+
+static int
+lnc_legacy_probe(device_t dev)
+{
+	struct lnc_softc *sc = device_get_softc(dev);
+
+	sc->portrid = 0;
+	sc->portres = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->portrid,
+					 0, ~0, 1, RF_ACTIVE);
+
+	if (! sc->portres) {
+		device_printf(dev, "Failed to allocate I/O ports\n");
+		lnc_release_resources(dev);
+		return (ENXIO);
+	}
+
+	sc->lnc_btag = rman_get_bustag(sc->portres);
+	sc->lnc_bhandle = rman_get_bushandle(sc->portres);
+
+	/*
+	 * There isn't any way to determine if a NIC is a BICC. Basically, if
+	 * the lance probe succeeds using the i/o addresses of the BICC then
+	 * we assume it's a BICC.
+	 *
+	 */
+	sc->rap = BICC_RAP;
+	sc->rdp = BICC_RDP;
+	sc->nic.mem_mode = DMA_FIXED;
+	/* XXX Should set BICC_IOSIZE et al somewhere to alloc
+	   resources correctly */
+
+	if ((sc->nic.ic = lance_probe(sc))) {
+		device_set_desc(dev, "BICC Isolan");
+		sc->nic.ident = BICC;
+		lnc_release_resources(dev);
+		return (0);
+	} else {
+	    /* It's not a BICC so try the standard NE2100 ports */
+	    sc->rap = PCNET_RAP;
+	    sc->rdp = PCNET_RDP;
+	    if ((sc->nic.ic = lance_probe(sc))) {
+		sc->nic.ident = NE2100;
+		device_set_desc(dev, "NE2100");
+		lnc_release_resources(dev);
+		return (0);
+	    } else {
+		lnc_release_resources(dev);
+		return (ENXIO);
+	    }
+	}
+}
+
+static int
+lnc_isa_probe(device_t dev)
+{
+	int pnp;
+
+	pnp = ISA_PNP_PROBE(device_get_parent(dev), dev, lnc_pnp_ids);
+	if (pnp == ENOENT) {
+		/* It's not a PNP card, see if we support it by probing it */
+		return (lnc_legacy_probe(dev));
+	} else if (pnp == ENXIO) {
+		return (ENXIO);
+	} else {
+		/* Found PNP card we support */
+		return (0);
+	}
+}
+
+static void
+lnc_alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)
+{
+	/* Do nothing */
+	return;
+}
+
+static int
+lnc_isa_attach(device_t dev)
+{
+	lnc_softc_t *sc = device_get_softc(dev);
+	int err = 0;
+	bus_size_t lnc_mem_size;
+
+	device_printf(dev, "Attaching %s\n", device_get_desc(dev));
+
+	sc->portrid = 0;
+	sc->portres = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->portrid,
+					 0, ~0, 1, RF_ACTIVE);
+
+	if (! sc->portres) {
+		device_printf(dev, "Failed to allocate I/O ports\n");
+		lnc_release_resources(dev);
+		return (ENXIO);
+	}
+
+	sc->drqrid = 0;
+	sc->drqres = bus_alloc_resource(dev, SYS_RES_DRQ, &sc->drqrid,
+					 0, ~0, 1, RF_ACTIVE);
+
+	if (! sc->drqres) {
+		device_printf(dev, "Failed to allocate DMA channel\n");
+		lnc_release_resources(dev);
+		return (ENXIO);
+	}
+
+	if (isa_get_irq(dev) == -1)
+		bus_set_resource(dev, SYS_RES_IRQ, 0, 10, 1);
+
+	sc->irqrid = 0;
+	sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irqrid, 0, ~0, 1,
+	                                RF_ACTIVE);
+
+	if (! sc->irqres) {
+		device_printf(dev, "Failed to allocate irq\n");
+		lnc_release_resources(dev);
+		return (ENXIO);
+	}
+
+	err = bus_setup_intr(dev, sc->irqres, INTR_TYPE_NET, lncintr,
+	                     sc, &sc->intrhand);
+
+	if (err) {
+		device_printf(dev, "Failed to setup irq handler\n");
+		lnc_release_resources(dev);
+		return (err);
+	}
+
+	/* XXX temp setting for nic */
+	sc->nic.mem_mode = DMA_FIXED;
+	sc->nrdre  = NRDRE;
+	sc->ntdre  = NTDRE;
+
+	if (sc->nic.ident == NE2100) {
+	    sc->rap = PCNET_RAP;
+	    sc->rdp = PCNET_RDP;
+	    sc->bdp = PCNET_BDP;
+	} else {
+	    sc->rap = BICC_RAP;
+	    sc->rdp = BICC_RDP;
+	}
+
+	/* Create a DMA tag describing the ring memory we need */
+
+	lnc_mem_size = ((NDESC(sc->nrdre) + NDESC(sc->ntdre)) *
+			 sizeof(struct host_ring_entry));
+
+	lnc_mem_size += (NDESC(sc->nrdre) * RECVBUFSIZE) +
+			(NDESC(sc->ntdre) * TRANSBUFSIZE);
+
+	err = bus_dma_tag_create(NULL,			/* parent */
+				 4,			/* alignement */
+				 0,			/* boundary */
+				 BUS_SPACE_MAXADDR_24BIT,	/* lowaddr */
+				 BUS_SPACE_MAXADDR,	/* highaddr */
+				 NULL, NULL,		/* filter, filterarg */
+				 lnc_mem_size,		/* segsize */
+				 1,			/* nsegments */
+				 BUS_SPACE_MAXSIZE_32BIT,	/* maxsegsize */
+				 0,			/* flags */
+				 &sc->dmat);
+
+	if (err) {
+		device_printf(dev, "Can't create DMA tag\n");
+		lnc_release_resources(dev);
+		return (ENOMEM);
+	}
+
+	err = bus_dmamem_alloc(sc->dmat, (void **)&sc->recv_ring,
+	                       BUS_DMA_NOWAIT, &sc->dmamap);
+
+	if (err) {
+		device_printf(dev, "Couldn't allocate memory\n");
+		lnc_release_resources(dev);
+		return (ENOMEM);
+	}
+
+	err = bus_dmamap_load(sc->dmat, sc->dmamap, sc->recv_ring, lnc_mem_size,
+			lnc_alloc_callback, sc->recv_ring, BUS_DMA_NOWAIT);
+
+	if (err) {
+		device_printf(dev, "Couldn't load DMA map\n");
+		lnc_release_resources(dev);
+		return (ENOMEM);
+	}
+
+	isa_dmacascade(rman_get_start(sc->drqres));
+
+	/* Call generic attach code */
+	if (! lnc_attach_common(dev)) {
+		device_printf(dev, "Generic attach code failed\n");
+		lnc_release_resources(dev);
+		return (ENXIO);
+	}
+	return (0);
+}
+
+static int
+lnc_isa_detach(device_t dev)
+{
+	lnc_softc_t *sc = device_get_softc(dev);
+	int s = splimp();
+
+	ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
+	splx(s);
+
+	lnc_stop(sc);
+	lnc_release_resources(dev);
+
+	return (0);
+}
+
+static device_method_t lnc_isa_methods[] = {
+/*	DEVMETHOD(device_identify,	lnc_isa_identify), */
+	DEVMETHOD(device_probe,		lnc_isa_probe),
+	DEVMETHOD(device_attach,	lnc_isa_attach),
+	DEVMETHOD(device_detach,	lnc_isa_detach),
+#ifdef notyet
+	DEVMETHOD(device_suspend,	lnc_isa_suspend),
+	DEVMETHOD(device_resume,	lnc_isa_resume),
+	DEVMETHOD(device_shutdown,	lnc_isa_shutdown),
+#endif
+	{ 0, 0 }
+};
+
+static driver_t lnc_isa_driver = {
+	"lnc",
+	lnc_isa_methods,
+	sizeof(struct lnc_softc),
+};
+
+DRIVER_MODULE(if_lnc, isa, lnc_isa_driver, lnc_devclass, 0, 0);
Index: dev/netif/lnc/if_lnc_pci.c
===================================================================
RCS file: dev/netif/lnc/if_lnc_pci.c
diff -N dev/netif/lnc/if_lnc_pci.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dev/netif/lnc/if_lnc_pci.c	29 Nov 2003 16:23:43 -0000
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 1994-2000
+ *	Paul Richards. 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,
+ *    verbatim and that no modifications are made prior to this
+ *    point in the file.
+ * 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. The name Paul Richards may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``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 PAUL RICHARDS 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/sys/dev/lnc/if_lnc_pci.c,v 1.25 2001/07/04 13:00:19 nyan Exp $
+ * $DragonFly$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/socket.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+
+#include <bus/pci/pcireg.h>
+#include <bus/pci/pcivar.h>
+
+#include <dev/netif/lnc/if_lncreg.h>
+#include <dev/netif/lnc/if_lncvar.h>
+
+#define AMD_VENDOR_ID 0x1022
+#define PCI_DEVICE_ID_PCNet_PCI	0x2000
+#define PCI_DEVICE_ID_PCHome_PCI 0x2001
+
+#define LNC_PROBE_PRIORITY -1
+
+static int
+lnc_pci_probe(device_t dev)
+{
+	if (pci_get_vendor(dev) != AMD_VENDOR_ID)
+		return (ENXIO);
+
+	switch(pci_get_device(dev)) {
+	case PCI_DEVICE_ID_PCNet_PCI:
+		device_set_desc(dev, "PCNet/PCI Ethernet adapter");
+		return(LNC_PROBE_PRIORITY);
+		break;
+	case PCI_DEVICE_ID_PCHome_PCI:
+		device_set_desc(dev, "PCHome/PCI Ethernet adapter");
+		return(LNC_PROBE_PRIORITY);
+		break;
+	default:
+		return (ENXIO);
+		break;
+	}
+	return (ENXIO);
+}
+
+static void
+lnc_alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)
+{
+	/* Do nothing */
+	return;
+}
+
+static int
+lnc_pci_attach(device_t dev)
+{
+	lnc_softc_t *sc = device_get_softc(dev);
+	unsigned command;
+	int rid = 0;
+	int err = 0;
+	bus_size_t lnc_mem_size;
+
+	device_printf(dev, "Attaching %s\n", device_get_desc(dev));
+
+	command = pci_read_config(dev, PCIR_COMMAND, 4);
+	command |= PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN;
+	pci_write_config(dev, PCIR_COMMAND, command, 4);
+
+	rid = PCIR_MAPS;
+	sc->portres = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 1,
+	                                 RF_ACTIVE);
+
+	if (! sc->portres)
+		device_printf(dev, "Cannot allocate I/O ports\n");
+
+	rid = 0;
+	sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+	                                RF_ACTIVE|RF_SHAREABLE);
+
+	if (! sc->irqres)
+		device_printf(dev, "Cannot allocate irq\n");
+
+	err = bus_setup_intr(dev, sc->irqres, INTR_TYPE_NET, lncintr,
+	                     sc, &sc->intrhand);
+	if (err)
+		device_printf(dev, "Cannot setup irq handler\n");
+
+	sc->lnc_btag = rman_get_bustag(sc->portres);
+	sc->lnc_bhandle = rman_get_bushandle(sc->portres);
+
+	/* XXX temp setting for nic */
+	sc->nic.ic = PCnet_PCI;
+	sc->nic.ident = NE2100;
+	sc->nic.mem_mode = DMA_FIXED;
+	sc->nrdre  = NRDRE;
+	sc->ntdre  = NTDRE;
+	sc->rap = PCNET_RAP;
+	sc->rdp = PCNET_RDP;
+	sc->bdp = PCNET_BDP;
+
+	/* Create a DMA tag describing the ring memory we need */
+
+	lnc_mem_size = ((NDESC(sc->nrdre) + NDESC(sc->ntdre)) *
+			 sizeof(struct host_ring_entry));
+
+	lnc_mem_size += sizeof(struct init_block) + (sizeof(struct mds) *
+			(NDESC(sc->nrdre) + NDESC(sc->ntdre))) + MEM_SLEW;
+
+	lnc_mem_size += (NDESC(sc->nrdre) * RECVBUFSIZE) +
+			(NDESC(sc->ntdre) * TRANSBUFSIZE);
+
+	err = bus_dma_tag_create(NULL,			/* parent */
+				 1,			/* alignement */
+				 0,			/* boundary */
+				 BUS_SPACE_MAXADDR,	/* lowaddr */
+				 BUS_SPACE_MAXADDR,	/* highaddr */
+				 NULL, NULL,		/* filter, filterarg */
+				 lnc_mem_size,		/* segsize */
+				 1,			/* nsegments */
+				 BUS_SPACE_MAXSIZE_32BIT,	/* maxsegsize */
+				 0,			/* flags */
+				 &sc->dmat);
+
+	if (err) {
+		device_printf(dev, "Can't create DMA tag\n");
+		/* XXX need to free currently allocated resources here */
+		return (ENOMEM);
+	}
+
+	err = bus_dmamem_alloc(sc->dmat, (void **)&sc->recv_ring,
+	                       BUS_DMA_NOWAIT, &sc->dmamap);
+
+	if (err) {
+		device_printf(dev, "Couldn't allocate memory\n");
+		/* XXX need to free currently allocated resources here */
+		return (ENOMEM);
+	}
+
+	bus_dmamap_load(sc->dmat, sc->dmamap, sc->recv_ring, lnc_mem_size,
+			lnc_alloc_callback, sc->recv_ring, BUS_DMA_NOWAIT);
+
+	/* Call generic attach code */
+	if (! lnc_attach_common(dev)) {
+		device_printf(dev, "Generic attach code failed\n");
+	}
+	return (0);
+}
+
+static int
+lnc_pci_detach(device_t dev)
+{
+	lnc_softc_t *sc = device_get_softc(dev);
+	int s = splimp();
+
+	ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
+
+	lnc_stop(sc);
+	bus_teardown_intr(dev, sc->irqres, sc->intrhand);
+	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irqres);
+	bus_release_resource(dev, SYS_RES_IOPORT, PCIR_MAPS, sc->portres);
+
+	bus_dmamap_unload(sc->dmat, sc->dmamap);
+	bus_dmamem_free(sc->dmat, sc->recv_ring, sc->dmamap);
+	bus_dma_tag_destroy(sc->dmat);
+
+	splx(s);
+	return (0);
+}
+
+static device_method_t lnc_pci_methods[] = {
+	DEVMETHOD(device_probe,		lnc_pci_probe),
+	DEVMETHOD(device_attach,	lnc_pci_attach),
+	DEVMETHOD(device_detach,	lnc_pci_detach),
+#ifdef notyet
+	DEVMETHOD(device_suspend,	lnc_pci_suspend),
+	DEVMETHOD(device_resume,	lnc_pci_resume),
+	DEVMETHOD(device_shutdown,	lnc_pci_shutdown),
+#endif
+	{ 0, 0 }
+};
+
+static driver_t lnc_pci_driver = {
+	"lnc",
+	lnc_pci_methods,
+	sizeof(struct lnc_softc),
+};
+
+DRIVER_MODULE(if_lnc, pci, lnc_pci_driver, lnc_devclass, 0, 0);
Index: dev/netif/lnc/if_lncreg.h
===================================================================
RCS file: dev/netif/lnc/if_lncreg.h
diff -N dev/netif/lnc/if_lncreg.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dev/netif/lnc/if_lncreg.h	29 Nov 2003 16:23:54 -0000
@@ -0,0 +1,210 @@
+/*-
+ * Copyright (c) 1994-2000
+ *	Paul Richards.  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,
+ *    verbatim and that no modifications are made prior to this
+ *    point in the file.
+ * 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. The name Paul Richards may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``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 PAUL RICHARDS 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/sys/dev/lnc/if_lncreg.h,v 1.7 2001/07/04 13:00:19 nyan Exp $
+ * $DragonFly$
+ */
+
+/*
+ * Am7990, Local Area Network Controller for Ethernet (LANCE)
+ *
+ * The LANCE has four Control and Status Registers(CSRs) which are accessed
+ * through two bus addressable ports, the address port (RAP) and the data
+ * port (RDP).
+ *
+ */
+
+#define CSR0	0
+#define CSR1	1
+#define CSR2	2
+#define CSR3	3
+#define CSR88	88
+#define CSR89	89
+
+#define BCR49	49
+#define BCR32	32
+#define BCR33	33
+#define BCR34	34
+
+
+/* Control and Status Register Masks */
+
+/* CSR0 */
+
+#define ERR	0x8000
+#define BABL	0x4000
+#define CERR	0x2000
+#define MISS	0x1000
+#define MERR	0x0800
+#define RINT	0x0400
+#define TINT	0x0200
+#define IDON	0x0100
+#define INTR	0x0080
+#define INEA	0x0040
+#define RXON	0x0020
+#define TXON	0x0010
+#define TDMD	0x0008
+#define STOP	0x0004
+#define STRT	0x0002
+#define INIT	0x0001
+
+/*
+ * CSR3
+ *
+ * Bits 3-15 are reserved.
+ *
+ */
+
+#define BSWP	0x0004
+#define ACON	0x0002
+#define BCON	0x0001
+
+/* ISA Bus Configuration Registers */
+#define MSRDA   0x0000  /* ISACSR0: Master Mode Read Activity */
+#define MSWRA   0x0001  /* ISACSR1: Master Mode Write Activity */
+#define MC      0x0002  /* ISACSR2: Miscellaneous Configuration */
+
+#define LED1    0x0005  /* ISACSR5: LED1 Status */
+#define LED2    0x0006  /* ISACSR6: LED2 Status */
+#define LED3    0x0007  /* ISACSR7: LED3 Status */
+
+#define LED_PSE         0x0080  /* Pulse Stretcher */
+#define LED_XMTE        0x0010  /* Transmit Status */
+#define LED_RVPOLE      0x0008  /* Receive Polarity */
+#define LED_RCVE        0x0004  /* Receive Status */
+#define LED_JABE        0x0002  /* Jabber */
+#define LED_COLE        0x0001  /* Collision */
+
+/* Initialisation block */
+
+struct init_block {
+	u_short mode;		/* Mode register			*/
+	u_char  padr[6];	/* Ethernet address			*/
+	u_char  ladrf[8];	/* Logical address filter (multicast)	*/
+	u_short rdra;		/* Low order pointer to receive ring	*/
+	u_short rlen;		/* High order pointer and no. rings	*/
+	u_short tdra;		/* Low order pointer to transmit ring	*/
+	u_short tlen;		/* High order pointer and no rings	*/
+};
+
+/* Initialisation Block Mode Register Masks */
+
+#define PROM      0x8000   /* Promiscuous Mode */
+#define DRCVBC    0x4000   /* Disable Receive Broadcast */
+#define DRCVPA    0x2000   /* Disable Receive Physical Address */
+#define DLNKTST	0x1000   /* Disable Link Status */
+#define DAPC      0x0800   /* Disable Automatic Polarity Correction */
+#define MENDECL   0x0400   /* MENDEC Loopback Mode */
+#define LRT       0x0200   /* Low Receive Threshold (T-MAU mode only) */
+#define TSEL      0x0200   /* Transmit Mode Select  (AUI mode only) */
+#define PORTSEL   0x0180   /* Port Select bits */
+#define INTL      0x0040   /* Internal Loopback */
+#define DRTY      0x0020   /* Disable Retry */
+#define FCOLL     0x0010   /* Force Collision */
+#define DXMTFCS   0x0008   /* Disable transmit CRC (FCS) */
+#define LOOP      0x0004   /* Loopback Enabl */
+#define DTX       0x0002   /* Disable the transmitter */
+#define DRX       0x0001   /* Disable the receiver */
+
+/*
+ * Message Descriptor Structure
+ *
+ * Each transmit or receive descriptor ring entry (RDRE's and TDRE's)
+ * is composed of 4, 16-bit, message descriptors. They contain the following
+ * information.
+ *
+ * 1. The address of the actual message data buffer in user (host) memory.
+ * 2. The length of that message buffer.
+ * 3. The status information for that particular buffer. The eight most
+ *    significant bits of md1 are collectively termed the STATUS of the
+ *    descriptor.
+ *
+ * Descriptor md0 contains LADR 0-15, the low order 16 bits of the 24-bit
+ * address of the actual data buffer.  Bits 0-7 of descriptor md1 contain
+ * HADR, the high order 8-bits of the 24-bit data buffer address. Bits 8-15
+ * of md1 contain the status flags of the buffer. Descriptor md2 contains the
+ * buffer byte count in bits 0-11 as a two's complement number and must have
+ * 1's written to bits 12-15. For the receive entry md3 has the Message Byte
+ * Count in bits 0-11, this is the length of the received message and is valid
+ * only when ERR is cleared and ENP is set. For the transmit entry it contains
+ * more status information.
+ *
+ */
+
+struct mds {
+	u_short md0;
+	u_short md1;
+	short   md2;
+	u_short md3;
+};
+
+/* Receive STATUS flags for md1 */
+
+#define OWN	0x8000		/* Owner bit, 0=host, 1=Lance   */
+#define MDERR	0x4000		/* Error                        */
+#define FRAM	0x2000		/* Framing error error          */
+#define OFLO	0x1000		/* Silo overflow                */
+#define CRC	0x0800		/* CRC error                    */
+#define RBUFF	0x0400		/* Buffer error                 */
+#define STP	0x0200		/* Start of packet              */
+#define ENP	0x0100		/* End of packet                */
+#define HADR	0x00FF		/* High order address bits	*/
+
+/* Receive STATUS flags for md2 */
+
+#define BCNT	0x0FFF		/* Size of data buffer as 2's comp. no. */
+
+/* Receive STATUS flags for md3 */
+
+#define MCNT	0x0FFF		/* Total size of data for received packet */
+
+/* Transmit STATUS flags for md1 */
+
+#define ADD_FCS	0x2000		/* Controls generation of FCS	*/
+#define MORE	0x1000		/* Indicates more than one retry was needed */
+#define ONE	0x0800		/* Exactly one retry was needed */
+#define DEF	0x0400		/* Packet transmit deferred -- channel busy */
+
+/*
+ * Transmit status flags for md2
+ *
+ * Same as for receive descriptor.
+ *
+ * BCNT   0x0FFF         Size of data buffer as 2's complement number.
+ *
+ */
+
+/* Transmit status flags for md3 */
+
+#define TBUFF	0x8000		/* Buffer error         */
+#define UFLO	0x4000		/* Silo underflow       */
+#define LCOL	0x1000		/* Late collision       */
+#define LCAR	0x0800		/* Loss of carrier      */
+#define RTRY	0x0400		/* Tried 16 times       */
+#define TDR 	0x03FF		/* Time domain reflectometry */
Index: dev/netif/lnc/if_lncvar.h
===================================================================
RCS file: dev/netif/lnc/if_lncvar.h
diff -N dev/netif/lnc/if_lncvar.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dev/netif/lnc/if_lncvar.h	29 Nov 2003 16:23:58 -0000
@@ -0,0 +1,266 @@
+/*-
+ * Copyright (c) 1994-1998
+ *      Paul Richards.  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,
+ *    verbatim and that no modifications are made prior to this
+ *    point in the file.
+ * 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 Paul Richards.
+ * 4. The name Paul Richards may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``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 PAUL RICHARDS 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/sys/dev/lnc/if_lncvar.h,v 1.23 2001/07/04 13:00:20 nyan Exp $
+ * $DragonFly$
+ */
+
+/*
+ * Initialize multicast address hashing registers to accept
+ * all multicasts (only used when in promiscuous mode)
+ */
+#define MULTI_INIT_ADDR 0xff
+
+#define NORMAL 0
+
+#define NRDRE 3
+#define NTDRE 3
+#define RECVBUFSIZE 1518	/* Packet size rounded to dword boundary */
+#define TRANSBUFSIZE 1518
+#define MBUF_CACHE_LIMIT 0
+
+#define MEM_SLEW 8
+
+/* LNC Flags */
+#define LNC_INITIALISED 1
+#define LNC_ALLMULTI 2
+
+/* BICC port addresses */
+#define BICC_IOSIZE    16
+#define BICC_RDP     0x0c        /* Register Data Port */
+#define BICC_RAP     0x0e        /* Register Address Port */
+
+/* NE2100 port addresses */
+#define NE2100_IOSIZE  24
+#define PCNET_RDP    0x10        /* Register Data Port */
+#define PCNET_RAP    0x12        /* Register Address Port */
+#define PCNET_RESET  0x14
+#define PCNET_BDP    0x16
+#define PCNET_VSW    0x18
+
+/* DEPCA port addresses */
+#define DEPCA_IOSIZE   16
+#define DEPCA_CTRL   0x00        /* NIC Control and status register */
+#define DEPCA_RDP    0x04        /* Register Data Port */
+#define DEPCA_RAP    0x06        /* Register Address Port */
+#define DEPCA_ADP    0x0c
+
+/* DEPCA specific defines */
+#define DEPCA_ADDR_ROM_SIZE 32
+
+/* C-NET(98)S port addresses */
+/* Notice, we can ignore fragmantation by using isa_alloc_resourcev(). */
+#define CNET98S_IOSIZE   32     
+#define CNET98S_RDP    0x10      /* Register Data Port */
+#define CNET98S_RAP    0x12      /* Register Address Port */
+#define CNET98S_RESET  0x14
+#define CNET98S_IDP    0x16
+#define CNET98S_EEPROM 0x1e
+
+/* Chip types */
+#define LANCE           1        /* Am7990   */
+#define C_LANCE         2        /* Am79C90  */
+#define PCnet_ISA       3        /* Am79C960 */
+#define PCnet_ISAplus   4        /* Am79C961 */
+#define PCnet_ISA_II    5        /* Am79C961A */
+#define PCnet_32        6        /* Am79C965 */
+#define PCnet_PCI       7        /* Am79C970 */
+#define PCnet_PCI_II    8        /* Am79C970A */
+#define PCnet_FAST      9        /* Am79C971 */
+#define PCnet_FASTplus  10       /* Am79C972 */
+#define PCnet_Home	11	 /* Am79C978 */
+
+
+/* CSR88-89: Chip ID masks */
+#define AMD_MASK  0x003
+#define PART_MASK 0xffff
+#define Am79C960  0x0003
+#define Am79C961  0x2260
+#define Am79C961A 0x2261
+#define Am79C970  0x0242
+#define Am79C970A 0x2621
+#define Am79C971  0x2623
+#define Am79C972  0x2624
+#define Am79C973  0x2625
+#define Am79C978  0x2626
+
+/* Board types */
+#define UNKNOWN         0
+#define BICC            1
+#define NE2100          2
+#define DEPCA           3
+#define CNET98S         4	/* PC-98 */
+
+/* mem_mode values */
+#define DMA_FIXED       1
+#define DMA_MBUF        2
+#define SHMEM           4
+
+#define MEM_MODES \
+	"\20\3SHMEM\2DMA_MBUF\1DMA_FIXED"
+
+#define CSR0_FLAGS \
+	"\20\20ERR\17BABL\16CERR\15MISS\14MERR\13RINT\12TINT\11IDON\
+	    \10INTR\07INEA\06RXON\05TXON\04TDMD\03STOP\02STRT\01INIT"
+
+#define INIT_MODE \
+	"\20\20PROM\07INTL\06DRTY\05COLL\04DTCR\03LOOP\02DTX\01DRX"
+
+#define RECV_MD1 \
+	"\20\10OWN\7ERR\6FRAM\5OFLO\4CRC\3BUFF\2STP\1ENP"
+
+#define TRANS_MD1 \
+	"\20\10OWN\7ERR\6RES\5MORE\4ONE\3DEF\2STP\1ENP"
+
+#define TRANS_MD3 \
+	"\20\6BUFF\5UFLO\4RES\3LCOL\2LCAR\1RTRY"
+
+#ifdef LNC_KEEP_STATS
+#define LNCSTATS_STRUCT \
+	struct lnc_stats { \
+		int idon; \
+		int rint; \
+		int tint; \
+		int cerr; \
+		int babl; \
+		int miss; \
+		int merr; \
+		int rxoff; \
+		int txoff; \
+		int terr; \
+		int lcol; \
+		int lcar; \
+		int tbuff; \
+		int def; \
+		int more; \
+		int one; \
+		int uflo; \
+		int rtry; \
+		int rerr; \
+		int fram; \
+		int oflo; \
+		int crc; \
+		int rbuff; \
+		int drop_packet; \
+		int trans_ring_full; \
+	} lnc_stats;
+#define LNCSTATS(X) ++(sc->lnc_stats.X);
+#else
+#define LNCSTATS_STRUCT
+#define LNCSTATS(X)
+#endif
+
+struct nic_info {
+	int ident;         /* Type of card */
+	int ic;            /* Type of ic, Am7990, Am79C960 etc. */
+	int mem_mode;
+	int iobase;
+	int mode;          /* Mode setting at initialization */
+};
+
+typedef struct lnc_softc {
+	struct resource *irqres;
+	int irqrid;
+	struct resource *drqres;
+	int drqrid;
+	struct resource *portres;
+	int portrid;
+	bus_space_tag_t lnc_btag;
+	bus_space_handle_t lnc_bhandle;
+	void *intrhand;
+	bus_dma_tag_t	dmat;
+	bus_dmamap_t	dmamap;
+	struct arpcom arpcom;               /* see ../../net/if_arp.h */
+	struct nic_info nic;                /* NIC specific info */
+	int nrdre;
+	struct host_ring_entry *recv_ring;  /* start of alloc'd mem */
+	int recv_next;
+	int ntdre;
+	struct host_ring_entry *trans_ring;
+	int trans_next;
+	struct init_block *init_block;      /* Initialisation block */
+	int pending_transmits;        /* No. of transmit descriptors in
+	use */
+	int next_to_send;
+	struct mbuf *mbufs;
+	int mbuf_count;
+	int flags;
+	int rap;
+	int rdp;
+	int bdp;
+	#ifdef DEBUG
+	int lnc_debug;
+	#endif
+	LNCSTATS_STRUCT
+} lnc_softc_t;
+
+struct host_ring_entry {
+	struct mds *md;
+	union {
+		struct mbuf *mbuf;
+		char *data;
+	}buff;
+};
+
+#define NDESC(len2) (1 << len2)
+
+#define INC_MD_PTR(ptr, no_entries) \
+	if (++ptr >= NDESC(no_entries)) \
+		ptr = 0;
+
+#define DEC_MD_PTR(ptr, no_entries) \
+	if (--ptr < 0) \
+		ptr = NDESC(no_entries) - 1;
+
+#define RECV_NEXT (sc->recv_ring->base + sc->recv_next)
+#define TRANS_NEXT (sc->trans_ring->base + sc->trans_next)
+
+#define lnc_inb(port) \
+	bus_space_read_1(sc->lnc_btag, sc->lnc_bhandle, (port))
+#define lnc_inw(port) \
+	bus_space_read_2(sc->lnc_btag, sc->lnc_bhandle, (port))
+#define lnc_outw(port, val) \
+	bus_space_write_2(sc->lnc_btag, sc->lnc_bhandle, (port), (val))
+
+/* Functional declarations */
+extern int lance_probe(struct lnc_softc *);
+extern void lnc_release_resources(device_t);
+extern int lnc_attach_common(device_t);
+extern void lnc_stop(struct lnc_softc *);
+
+extern void write_csr(struct lnc_softc *, u_short, u_short);
+extern u_short read_csr(struct lnc_softc *, u_short);
+
+/* Variable declarations */
+extern driver_intr_t lncintr; 
+extern devclass_t lnc_devclass;
Index: dev/netif/vx/Makefile
===================================================================
RCS file: dev/netif/vx/Makefile
diff -N dev/netif/vx/Makefile
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dev/netif/vx/Makefile	29 Nov 2003 16:24:10 -0000
@@ -0,0 +1,8 @@
+# $DragonFly$
+ 
+.PATH:  ${.CURDIR}/../../dev/netif/vx
+KMOD    = if_vx
+SRCS    = if_vx.c if_vx_eisa.c if_vx_pci.c
+SRCS    += device_if.h bus_if.h pci_if.h isa_if.h
+  
+.include <bsd.kmod.mk>
Index: dev/netif/vx/if_vx.c
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/dev/netif/vx/if_vx.c,v
retrieving revision 1.6
diff -u -r1.6 if_vx.c
--- dev/netif/vx/if_vx.c	20 Nov 2003 22:07:32 -0000	1.6
+++ dev/netif/vx/if_vx.c	29 Nov 2003 16:24:19 -0000
@@ -55,14 +55,6 @@
  *          babkin at xxxxxxxxxxxxxx
  */
 
-#include "use_vx.h"
-
-#if NVX < 4	/* These cost 4 bytes apiece, so give us 4 */
-#undef NVX
-#define NVX 4
-#endif
-
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/sockio.h>
@@ -77,6 +69,9 @@
 #include <net/ethernet.h>
 #include <net/if_arp.h>
 
+#include <machine/bus_pio.h>
+#include <machine/bus.h>
+
 #include <net/bpf.h>
 
 #include <machine/clock.h>
@@ -88,10 +83,6 @@
 
 DECLARE_DUMMY_MODULE(if_vx);
 
-struct vx_softc *vx_softc[NVX];
-
-u_long vx_count;	/* both PCI and EISA */
-
 static struct connector_entry {
   int bit;
   char *name;
@@ -113,8 +104,6 @@
   { 0, "???"}
 };
 
-/* struct vx_softc *vxalloc (int); */
-/* void *vxfree (struct vx_softc *); */
 /* int vxattach (struct vx_softc *); */
 static void vxtxstat (struct vx_softc *);
 static int vxstatus (struct vx_softc *);
@@ -133,44 +122,6 @@
 static void vxsetlink (struct vx_softc *);
 /* int vxbusyeeprom (struct vx_softc *); */
 
-struct vx_softc *
-vxalloc(unit)
-    int unit;
-{
-    struct vx_softc *sc;
-
-    if (unit >= NVX) {
-	printf("vx%d: unit number too high.\n", unit);
-	return NULL;
-    }
-
-    if (vx_softc[unit]) {
-	printf("vx%d: already allocated.\n", unit);
-	return NULL;
-    }
-
-    sc = malloc(sizeof(struct vx_softc), M_DEVBUF, M_NOWAIT);
-    if (sc == NULL) {
-	printf("vx%d: cannot malloc.\n", unit);
-	return NULL;
-    }
-    bzero(sc, sizeof(struct vx_softc));
-    callout_handle_init(&sc->ch);
-
-    vx_softc[unit] = sc;
-    sc->unit = unit;
-    return (sc);    
-}
-
-void
-vxfree(sc)
-    struct vx_softc *sc;
-{
-    vx_softc[sc->unit] = NULL;
-    free(sc, M_DEVBUF);
-    return;
-}
-
 int
 vxattach(sc)
     struct vx_softc *sc;
@@ -178,8 +129,9 @@
     struct ifnet *ifp = &sc->arpcom.ac_if;
     int i;
 
+    callout_handle_init(&sc->ch);
     GO_WINDOW(0);
-    outw(VX_COMMAND, GLOBAL_RESET);
+    CSR_WRITE_2(sc, VX_COMMAND, GLOBAL_RESET);
     VX_BUSY_WAIT;
 
     vxgetlink(sc);
@@ -192,11 +144,11 @@
         int x;
         if (vxbusyeeprom(sc))
             return 0;
-        outw(BASE + VX_W0_EEPROM_COMMAND, EEPROM_CMD_RD
+	CSR_WRITE_2(sc, VX_W0_EEPROM_COMMAND, EEPROM_CMD_RD
 	     | (EEPROM_OEM_ADDR_0 + i));
         if (vxbusyeeprom(sc))
             return 0;
-        x = inw(BASE + VX_W0_EEPROM_DATA);
+        x = CSR_READ_2(sc, VX_W0_EEPROM_DATA);
         sc->arpcom.ac_enaddr[(i << 1)] = x >> 8;
         sc->arpcom.ac_enaddr[(i << 1) + 1] = x;
     }
@@ -243,20 +195,20 @@
     GO_WINDOW(2);
 
     for (i = 0; i < 6; i++) /* Reload the ether_addr. */
-	outb(BASE + VX_W2_ADDR_0 + i, sc->arpcom.ac_enaddr[i]);
+	CSR_WRITE_1(sc, VX_W2_ADDR_0 + i, sc->arpcom.ac_enaddr[i]);
 
-    outw(BASE + VX_COMMAND, RX_RESET);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_RESET);
     VX_BUSY_WAIT;
-    outw(BASE + VX_COMMAND, TX_RESET);
+    CSR_WRITE_2(sc, VX_COMMAND, TX_RESET);
     VX_BUSY_WAIT;
 
     GO_WINDOW(1);	/* Window 1 is operating window */
     for (i = 0; i < 31; i++)
-	inb(BASE + VX_W1_TX_STATUS);
+	CSR_READ_1(sc, VX_W1_TX_STATUS);
 
-    outw(BASE + VX_COMMAND,SET_RD_0_MASK | S_CARD_FAILURE |
+    CSR_WRITE_2(sc, VX_COMMAND,SET_RD_0_MASK | S_CARD_FAILURE |
 			S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
-    outw(BASE + VX_COMMAND,SET_INTR_MASK | S_CARD_FAILURE |
+    CSR_WRITE_2(sc, VX_COMMAND,SET_INTR_MASK | S_CARD_FAILURE |
 			S_RX_COMPLETE | S_TX_COMPLETE | S_TX_AVAIL);
 
     /*
@@ -265,13 +217,13 @@
      * already be queued.  However, a single stray interrupt is
      * unimportant.
      */
-    outw(BASE + VX_COMMAND, ACK_INTR | 0xff);
+    CSR_WRITE_2(sc, VX_COMMAND, ACK_INTR | 0xff);
 
     vxsetfilter(sc);
     vxsetlink(sc);
 
-    outw(BASE + VX_COMMAND, RX_ENABLE);
-    outw(BASE + VX_COMMAND, TX_ENABLE);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_ENABLE);
+    CSR_WRITE_2(sc, VX_COMMAND, TX_ENABLE);
 
     vxmbuffill((caddr_t) sc);
 
@@ -290,7 +242,7 @@
     struct ifnet *ifp = &sc->arpcom.ac_if;  
     
     GO_WINDOW(1);           /* Window 1 is operating window */
-    outw(BASE + VX_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | FIL_BRDCST |
+    CSR_WRITE_2(sc, VX_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | FIL_BRDCST |
 	 FIL_MULTICAST |
 	 ((ifp->if_flags & IFF_PROMISC) ? FIL_PROMISC : 0 ));
 }               
@@ -302,7 +254,7 @@
     int n, k;
 
     GO_WINDOW(3);
-    sc->vx_connectors = inw(BASE + VX_W3_RESET_OPT) & 0x7f;
+    sc->vx_connectors = CSR_READ_2(sc, VX_W3_RESET_OPT) & 0x7f;
     for (n = 0, k = 0; k < VX_CONNECTORS; k++) {
       if (sc->vx_connectors & conn_tab[k].bit) {
 	if (n > 0) {
@@ -317,7 +269,7 @@
 	return;
     }
     GO_WINDOW(3);
-    sc->vx_connector = (inl(BASE + VX_W3_INTERNAL_CFG) 
+    sc->vx_connector = (CSR_READ_4(sc, VX_W3_INTERNAL_CFG) 
 			& INTERNAL_CONNECTOR_MASK) 
 			>> INTERNAL_CONNECTOR_BITS;
     if (sc->vx_connector & 0x10) {
@@ -403,29 +355,29 @@
 
     /* Set the selected connector. */
     GO_WINDOW(3);
-    j = inl(BASE + VX_W3_INTERNAL_CFG) & ~INTERNAL_CONNECTOR_MASK;
-    outl(BASE + VX_W3_INTERNAL_CFG, j | (i <<INTERNAL_CONNECTOR_BITS));
+    j = CSR_READ_4(sc, VX_W3_INTERNAL_CFG) & ~INTERNAL_CONNECTOR_MASK;
+    CSR_WRITE_4(sc, VX_W3_INTERNAL_CFG, j | (i <<INTERNAL_CONNECTOR_BITS));
 
     /* First, disable all. */
-    outw(BASE + VX_COMMAND, STOP_TRANSCEIVER);
+    CSR_WRITE_2(sc,VX_COMMAND, STOP_TRANSCEIVER);
     DELAY(800);
     GO_WINDOW(4);
-    outw(BASE + VX_W4_MEDIA_TYPE, 0);
+    CSR_WRITE_2(sc, VX_W4_MEDIA_TYPE, 0);
 
     /* Second, enable the selected one. */
     switch(i) {
       case CONNECTOR_UTP:
 	GO_WINDOW(4);
-	outw(BASE + VX_W4_MEDIA_TYPE, ENABLE_UTP);
+	CSR_WRITE_2(sc, VX_W4_MEDIA_TYPE, ENABLE_UTP);
 	break;
       case CONNECTOR_BNC:
-	outw(BASE + VX_COMMAND, START_TRANSCEIVER);
+	CSR_WRITE_2(sc, VX_COMMAND, START_TRANSCEIVER);
 	DELAY(800);
 	break;
       case CONNECTOR_TX:
       case CONNECTOR_FX:
 	GO_WINDOW(4);
-	outw(BASE + VX_W4_MEDIA_TYPE, LINKBEAT_ENABLE);
+	CSR_WRITE_2(sc, VX_W4_MEDIA_TYPE, LINKBEAT_ENABLE);
 	break;
       default:	/* AUI and MII fall here */
 	break;
@@ -440,7 +392,7 @@
 vxstart(ifp)
     struct ifnet *ifp;
 {
-    struct vx_softc *sc = vx_softc[ifp->if_unit];
+    struct vx_softc *sc = ifp->if_softc;
     struct mbuf *m0;
     int sh, len, pad;
 
@@ -474,23 +426,23 @@
 	goto readcheck;
     }
     VX_BUSY_WAIT;
-    if (inw(BASE + VX_W1_FREE_TX) < len + pad + 4) {
-	outw(BASE + VX_COMMAND, SET_TX_AVAIL_THRESH | ((len + pad + 4) >> 2));
+    if (CSR_READ_2(sc, VX_W1_FREE_TX) < len + pad + 4) {
+	CSR_WRITE_2(sc, VX_COMMAND, SET_TX_AVAIL_THRESH | ((len + pad + 4) >> 2));
 	/* not enough room in FIFO */
-	if (inw(BASE + VX_W1_FREE_TX) < len + pad + 4) { /* make sure */
+	if (CSR_READ_2(sc, VX_W1_FREE_TX) < len + pad + 4) { /* make sure */
 	    ifp->if_flags |= IFF_OACTIVE;
 	    ifp->if_timer = 1;
 	    return;
 	}
     }
-    outw(BASE + VX_COMMAND, SET_TX_AVAIL_THRESH | (8188 >> 2));
+    CSR_WRITE_2(sc, VX_COMMAND, SET_TX_AVAIL_THRESH | (8188 >> 2));
     IF_DEQUEUE(&ifp->if_snd, m0);
     if (m0 == NULL) {		/* not really needed */
 	return;
     }
 
     VX_BUSY_WAIT;
-    outw(BASE + VX_COMMAND, SET_TX_START_THRESH |
+    CSR_WRITE_2(sc, VX_COMMAND, SET_TX_START_THRESH |
 	((len / 4 + sc->tx_start_thresh) >> 2));
 
     if (sc->arpcom.ac_if.if_bpf) {
@@ -503,18 +455,21 @@
      */
     sh = splhigh();
 
-    outl(BASE + VX_W1_TX_PIO_WR_1, len | TX_INDICATE);
+    CSR_WRITE_4(sc, VX_W1_TX_PIO_WR_1, len | TX_INDICATE);
 
     while (m0) {
         if (m0->m_len > 3)
-	    outsl(BASE + VX_W1_TX_PIO_WR_1, mtod(m0, caddr_t), m0->m_len / 4);
+	    bus_space_write_multi_4(sc->vx_btag, sc->vx_bhandle,
+	        VX_W1_TX_PIO_WR_1,
+		(u_int32_t *)mtod(m0, caddr_t), m0->m_len / 4);
         if (m0->m_len & 3)
-	    outsb(BASE + VX_W1_TX_PIO_WR_1,
-	      mtod(m0, caddr_t) + (m0->m_len & ~3) , m0->m_len & 3);
+	    bus_space_write_multi_1(sc->vx_btag, sc->vx_bhandle,
+	        VX_W1_TX_PIO_WR_1,
+		mtod(m0, caddr_t) + (m0->m_len & ~3), m0->m_len & 3);
 	m0 = m_free(m0);
     }
     while (pad--)
-	outb(BASE + VX_W1_TX_PIO_WR_1, 0);	/* Padding */
+	CSR_WRITE_1(sc, VX_W1_TX_PIO_WR_1, 0);	/* Padding */
 
     splx(sh);
 
@@ -522,10 +477,10 @@
     ifp->if_timer = 1;
 
 readcheck:
-    if ((inw(BASE + VX_W1_RX_STATUS) & ERR_INCOMPLETE) == 0) {
+    if ((CSR_READ_2(sc, VX_W1_RX_STATUS) & ERR_INCOMPLETE) == 0) {
 	/* We received a complete packet. */
 	
-	if ((inw(BASE + VX_STATUS) & S_INTR_LATCH) == 0) {
+	if ((CSR_READ_2(sc, VX_STATUS) & S_INTR_LATCH) == 0) {
 	    /*
 	     * No interrupt, read the packet and continue
 	     * Is  this supposed to happen? Is my motherboard
@@ -564,7 +519,7 @@
      * Check the FIFO status and act accordingly
      */
     GO_WINDOW(4);
-    fifost = inw(BASE + VX_W4_FIFO_DIAG);
+    fifost = CSR_READ_2(sc, VX_W4_FIFO_DIAG);
     GO_WINDOW(1);
 
     if (fifost & FIFOS_RX_UNDERRUN) {
@@ -606,8 +561,8 @@
     * We need to read+write TX_STATUS until we get a 0 status
     * in order to turn off the interrupt flag.
     */
-    while ((i = inb(BASE + VX_W1_TX_STATUS)) & TXS_COMPLETE) {
-	outb(BASE + VX_W1_TX_STATUS, 0x0);
+    while ((i = CSR_READ_1(sc, VX_W1_TX_STATUS)) & TXS_COMPLETE) {
+	CSR_WRITE_1(sc, VX_W1_TX_STATUS, 0x0);
 
     if (i & TXS_JABBER) {
 	++sc->arpcom.ac_if.if_oerrors;
@@ -625,7 +580,7 @@
 	vxreset(sc);
     } else if (i & TXS_MAX_COLLISION) {
 	++sc->arpcom.ac_if.if_collisions;
-	outw(BASE + VX_COMMAND, TX_ENABLE);
+	CSR_WRITE_2(sc, VX_COMMAND, TX_ENABLE);
 	sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
     } else
 	sc->tx_succ_ok = (sc->tx_succ_ok+1) & 127;
@@ -641,9 +596,9 @@
     struct ifnet *ifp = &sc->arpcom.ac_if;
 
     for (;;) {
-	outw(BASE + VX_COMMAND, C_INTR_LATCH);
+	CSR_WRITE_2(sc, VX_COMMAND, C_INTR_LATCH);
 
-	status = inw(BASE + VX_STATUS);
+	status = CSR_READ_2(sc, VX_STATUS);
 
 	if ((status & (S_TX_COMPLETE | S_TX_AVAIL |
 		S_RX_COMPLETE | S_CARD_FAILURE)) == 0)
@@ -655,7 +610,7 @@
 	 * Due to the i386 interrupt queueing, we may get spurious
 	 * interrupts occasionally.
 	 */
-	outw(BASE + VX_COMMAND, ACK_INTR | status);
+	CSR_WRITE_2(sc, VX_COMMAND, ACK_INTR | status);
 
 	if (status & S_RX_COMPLETE)
 	    vxread(sc);
@@ -690,7 +645,7 @@
     struct ether_header *eh;
     u_int len;
 
-    len = inw(BASE + VX_W1_RX_STATUS);
+    len = CSR_READ_2(sc, VX_W1_RX_STATUS);
 
 again:
 
@@ -771,7 +726,7 @@
     * I'll modify vxread() so that it can handle RX_EARLY interrupts.
     */
     if (vxstatus(sc)) {
-	len = inw(BASE + VX_W1_RX_STATUS);
+	len = CSR_READ_2(sc, VX_W1_RX_STATUS);
 	/* Check if we are stuck and reset [see XXX comment] */
 	if (len & ERR_INCOMPLETE) {
 	    if (ifp->if_flags & IFF_DEBUG)
@@ -785,7 +740,7 @@
     return;
 
 abort:
-    outw(BASE + VX_COMMAND, RX_DISCARD_TOP_PACK);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK);
 }
 
 static struct mbuf *
@@ -858,9 +813,11 @@
         }
         len = min(totlen, len);
         if (len > 3)
-            insl(BASE + VX_W1_RX_PIO_RD_1, mtod(m, u_int32_t *), len / 4);
+	    bus_space_read_multi_4(sc->vx_btag, sc->vx_bhandle,
+	        VX_W1_RX_PIO_RD_1, mtod(m, u_int32_t *), len / 4);
 	if (len & 3) {
-	    insb(BASE + VX_W1_RX_PIO_RD_1, mtod(m, u_int8_t *) + (len & ~3),
+	    bus_space_read_multi_1(sc->vx_btag, sc->vx_bhandle,
+	        VX_W1_RX_PIO_RD_1, mtod(m, u_int8_t *) + (len & ~3),
 		len & 3);
 	}
         m->m_len = len;
@@ -869,7 +826,7 @@
         mp = &m->m_next;
     }
 
-    outw(BASE +VX_COMMAND, RX_DISCARD_TOP_PACK);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK);
 
     splx(sh);
 
@@ -883,7 +840,7 @@
     u_long cmd;
     caddr_t data;
 {
-    struct vx_softc *sc = vx_softc[ifp->if_unit];
+    struct vx_softc *sc = ifp->if_softc;
     struct ifreq *ifr = (struct ifreq *) data;
     int s, error = 0;
 
@@ -969,7 +926,7 @@
 vxwatchdog(ifp)
     struct ifnet *ifp;
 {
-    struct vx_softc *sc = vx_softc[ifp->if_unit];
+    struct vx_softc *sc = ifp->if_softc;
 
     if (ifp->if_flags & IFF_DEBUG)
 	printf("vx%d: device timeout\n", ifp->if_unit);
@@ -986,20 +943,20 @@
 
     ifp->if_timer = 0;
 
-    outw(BASE + VX_COMMAND, RX_DISABLE);
-    outw(BASE + VX_COMMAND, RX_DISCARD_TOP_PACK);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_DISABLE);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK);
     VX_BUSY_WAIT;
-    outw(BASE + VX_COMMAND, TX_DISABLE);
-    outw(BASE + VX_COMMAND, STOP_TRANSCEIVER);
+    CSR_WRITE_2(sc, VX_COMMAND, TX_DISABLE);
+    CSR_WRITE_2(sc, VX_COMMAND, STOP_TRANSCEIVER);
     DELAY(800);
-    outw(BASE + VX_COMMAND, RX_RESET);
+    CSR_WRITE_2(sc, VX_COMMAND, RX_RESET);
     VX_BUSY_WAIT;
-    outw(BASE + VX_COMMAND, TX_RESET);
+    CSR_WRITE_2(sc, VX_COMMAND, TX_RESET);
     VX_BUSY_WAIT;
-    outw(BASE + VX_COMMAND, C_INTR_LATCH);
-    outw(BASE + VX_COMMAND, SET_RD_0_MASK);
-    outw(BASE + VX_COMMAND, SET_INTR_MASK);
-    outw(BASE + VX_COMMAND, SET_RX_FILTER);
+    CSR_WRITE_2(sc, VX_COMMAND, C_INTR_LATCH);
+    CSR_WRITE_2(sc, VX_COMMAND, SET_RD_0_MASK);
+    CSR_WRITE_2(sc, VX_COMMAND, SET_INTR_MASK);
+    CSR_WRITE_2(sc, VX_COMMAND, SET_RX_FILTER);
 
     vxmbufempty(sc);
 }
@@ -1011,7 +968,7 @@
     int j, i = 100;
 
     while (i--) {
-        j = inw(BASE + VX_W0_EEPROM_COMMAND);
+        j = CSR_READ_2(sc, VX_W0_EEPROM_COMMAND);
         if (j & EEPROM_BUSY)
             DELAY(100);
         else
Index: dev/netif/vx/if_vx_eisa.c
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/dev/netif/vx/if_vx_eisa.c,v
retrieving revision 1.5
diff -u -r1.5 if_vx_eisa.c
--- dev/netif/vx/if_vx_eisa.c	20 Nov 2003 22:07:32 -0000	1.5
+++ dev/netif/vx/if_vx_eisa.c	29 Nov 2003 16:24:24 -0000
@@ -112,7 +112,6 @@
 vx_eisa_attach(device_t dev)
 {
     struct vx_softc *sc;
-    int             unit = device_get_unit(dev);
     struct resource *io = 0;
     struct resource *eisa_io = 0;
     struct resource *irq = 0;
@@ -140,28 +139,31 @@
 	goto bad;
     }
 
-    if ((sc = vxalloc(unit)) == NULL)
-	goto bad;
+    sc = device_get_softc(dev);
 
-    sc->vx_io_addr = rman_get_start(io);
+    sc->vx_res = io;
+    sc->vx_bhandle = rman_get_bushandle(io);
+    sc->vx_btag = rman_get_bustag(io);
 
     rid = 0;
     irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid,
 			     0, ~0, 1, RF_ACTIVE);
     if (!irq) {
 	device_printf(dev, "No irq?!\n");
-	vxfree(sc);
 	goto bad;
     }
 
+    sc->vx_irq = irq;
+
     /* Now the registers are availible through the lower ioport */
 
     vxattach(sc);
 
     if (bus_setup_intr(dev, irq, INTR_TYPE_NET, vxintr, sc, &ih)) {
-	vxfree(sc);
 	goto bad;
     }
+
+    sc->vx_intrhand = ih;
 
     return 0;
 
Index: dev/netif/vx/if_vx_pci.c
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/dev/netif/vx/if_vx_pci.c,v
retrieving revision 1.4
diff -u -r1.4 if_vx_pci.c
--- dev/netif/vx/if_vx_pci.c	20 Nov 2003 22:07:32 -0000	1.4
+++ dev/netif/vx/if_vx_pci.c	29 Nov 2003 16:24:29 -0000
@@ -26,115 +26,154 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/vx/if_vx_pci.c,v 1.20 2000/01/29 14:50:32 peter Exp $
+ * $FreeBSD: src/sys/dev/vx/if_vx_pci.c,v 1.21 2000/05/28 15:59:52 peter Exp $
  * $DragonFly: src/sys/dev/netif/vx/if_vx_pci.c,v 1.4 2003/11/20 22:07:32 dillon Exp $
  */
 
-#include "use_vx.h"
-
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/eventhandler.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
 
-#include <bus/pci/pcivar.h>
+#include <machine/bus_pio.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <pci/pcivar.h>
+#include <pci/pcireg.h>
 
 #include "if_vxreg.h"
 
-static void vx_pci_shutdown(void *, int);
-static const char *vx_pci_probe(pcici_t, pcidi_t);
-static void vx_pci_attach(pcici_t, int unit);
+static void vx_pci_shutdown(device_t);
+static int vx_pci_probe(device_t);
+static int vx_pci_attach(device_t);
+
+static device_method_t vx_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_probe,		vx_pci_probe),
+	DEVMETHOD(device_attach,	vx_pci_attach),
+	DEVMETHOD(device_shutdown,	vx_pci_shutdown),
+
+	{ 0, 0 }
+};
+
+static driver_t vx_driver = {
+	"vx",
+	vx_methods,
+	sizeof(struct vx_softc)
+};
+
+static devclass_t vx_devclass;
+
+DRIVER_MODULE(if_vx, pci, vx_driver, vx_devclass, 0, 0);
 
 static void
 vx_pci_shutdown(
-	void *sc,
-	int howto)
+	device_t dev)
 {
+   struct vx_softc	*sc;
+
+   sc = device_get_softc(dev);
    vxstop(sc); 
-   vxfree(sc);
+   return;
 }
 
-static const char*
+static int
 vx_pci_probe(
-	pcici_t config_id,
-	pcidi_t device_id)
+	device_t dev)
 {
-   if(device_id == 0x590010b7ul)
-      return "3COM 3C590 Etherlink III PCI";
+   u_int32_t		device_id;
+
+   device_id = pci_read_config(dev, PCIR_DEVVENDOR, 4);
+
+   if(device_id == 0x590010b7ul) {
+      device_set_desc(dev, "3COM 3C590 Etherlink III PCI");
+      return(0);
+   }
    if(device_id == 0x595010b7ul || device_id == 0x595110b7ul ||
-	device_id == 0x595210b7ul)
-      return "3COM 3C595 Fast Etherlink III PCI";
+	device_id == 0x595210b7ul) {
+      device_set_desc(dev, "3COM 3C595 Etherlink III PCI");
+      return(0);
+   }
 	/*
 	 * The (Fast) Etherlink XL adapters are now supported by
 	 * the xl driver, which uses bus master DMA and is much
 	 * faster. (And which also supports the 3c905B.
 	 */
 #ifdef VORTEX_ETHERLINK_XL
-   if(device_id == 0x900010b7ul || device_id == 0x900110b7ul)
-      return "3COM 3C900 Etherlink XL PCI";
-   if(device_id == 0x905010b7ul || device_id == 0x905110b7ul)
-      return "3COM 3C905 Fast Etherlink XL PCI";
+   if(device_id == 0x900010b7ul || device_id == 0x900110b7ul) {
+      device_set_desc(dev, "3COM 3C900 Etherlink XL PCI");
+      return(0);
+   }
+   if(device_id == 0x905010b7ul || device_id == 0x905110b7ul) {
+      device_set_desc(dev, "3COM 3C905 Etherlink XL PCI");
+      return(0);
+   }
 #endif
-   return NULL;
+   return (ENXIO);
 }
 
-static void
+static int 
 vx_pci_attach(
-	pcici_t config_id,
-	int unit)
+	device_t dev)
 {
     struct vx_softc *sc;
+    int rid;
 
-    if (unit >= NVX) {
-       printf("vx%d: not configured; kernel is built for only %d device%s.\n",
-          unit, NVX, NVX == 1 ? "" : "s"); 
-       return;
-    }
+    sc = device_get_softc(dev);
 
-    if ((sc = vxalloc(unit)) == NULL) {
-	return;
-    }
+    rid = PCIR_MAPS;
+    sc->vx_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
+	0, ~0, 1, RF_ACTIVE);
+
+    if (sc->vx_res == NULL)
+	goto bad;
+
+    sc->vx_btag = rman_get_bustag(sc->vx_res);
+    sc->vx_bhandle = rman_get_bushandle(sc->vx_res);
 
-    sc->vx_io_addr = pci_conf_read(config_id, 0x10) & 0xffffffe0;
+    rid = 0;
+    sc->vx_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+	RF_SHAREABLE | RF_ACTIVE);
+
+    if (sc->vx_irq == NULL)
+	goto bad;
+
+    if (bus_setup_intr(dev, sc->vx_irq, INTR_TYPE_NET,
+	vxintr, sc, &sc->vx_intrhand))
+	goto bad;
 
     if (vxattach(sc) == 0) {
-	return;
+	goto bad;
     }
 
     /* defect check for 3C590 */
-    if ((pci_conf_read(config_id, 0) >> 16) == 0x5900) {
+    if ((pci_read_config(dev, PCIR_DEVVENDOR, 4) >> 16) == 0x5900) {
 	GO_WINDOW(0);
 	if (vxbusyeeprom(sc))
-	    return;
-	outw(BASE + VX_W0_EEPROM_COMMAND, EEPROM_CMD_RD | EEPROM_SOFT_INFO_2);
+	    goto bad;
+	CSR_WRITE_2(sc, VX_W0_EEPROM_COMMAND,
+	    EEPROM_CMD_RD | EEPROM_SOFT_INFO_2);
 	if (vxbusyeeprom(sc))
-	    return;
-	if (!(inw(BASE + VX_W0_EEPROM_DATA) & NO_RX_OVN_ANOMALY)) {
+	    goto bad;
+	if (!(CSR_READ_2(sc, VX_W0_EEPROM_DATA) & NO_RX_OVN_ANOMALY)) {
 	    printf("Warning! Defective early revision adapter!\n");
 	}
     }
 
-    /*
-     * Add shutdown hook so that DMA is disabled prior to reboot. Not
-     * doing do could allow DMA to corrupt kernel memory during the
-     * reboot before the driver initializes.
-     */
-    EVENTHANDLER_REGISTER(shutdown_post_sync, vx_pci_shutdown, sc,
-			  SHUTDOWN_PRI_DEFAULT);
+    return(0);
 
-    pci_map_int(config_id, vxintr, (void *) sc, &net_imask);
+bad:
+    if (sc->vx_intrhand != NULL)
+	bus_teardown_intr(dev, sc->vx_irq, sc->vx_intrhand);
+    if (sc->vx_res != NULL)
+	bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->vx_res);
+    if (sc->vx_irq != NULL)
+	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vx_irq);
+    return(ENXIO);
 }
-
-static struct pci_device vxdevice = {
-    "vx",
-    vx_pci_probe,
-    vx_pci_attach,
-    &vx_count,
-    NULL
-};
-
-COMPAT_PCI_DRIVER (if_vx_pci, vxdevice);
Index: dev/netif/vx/if_vxreg.h
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/dev/netif/vx/if_vxreg.h,v
retrieving revision 1.3
diff -u -r1.3 if_vxreg.h
--- dev/netif/vx/if_vxreg.h	27 Aug 2003 09:38:33 -0000	1.3
+++ dev/netif/vx/if_vxreg.h	29 Nov 2003 16:24:33 -0000
@@ -19,7 +19,7 @@
  * 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/sys/dev/vx/if_vxreg.h,v 1.5.6.1 2000/08/02 22:42:34 peter Exp $
+ * $FreeBSD: src/sys/dev/vx/if_vxreg.h,v 1.6 2000/05/01 19:54:26 peter Exp $
  * $DragonFly: src/sys/dev/netif/vx/if_vxreg.h,v 1.3 2003/08/27 09:38:33 rob Exp $
  *
  October 2, 1994
@@ -54,7 +54,11 @@
 struct vx_softc {
     struct arpcom arpcom;	/* Ethernet common part		*/
     int unit;			/* unit number */
-    u_int vx_io_addr;		/* i/o bus address		*/
+    bus_space_handle_t		vx_bhandle;
+    bus_space_tag_t		vx_btag;
+    void			*vx_intrhand;
+    struct resource		*vx_irq;
+    struct resource		*vx_res;
 #define MAX_MBS  8		/* # of mbufs we keep around	*/
     struct mbuf *mb[MAX_MBS];	/* spare mbuf storage.		*/
     int next_mb;		/* Which mbuf to use next. 	*/
@@ -68,6 +72,20 @@
     int	buffill_pending;
 };
 
+#define CSR_WRITE_4(sc, reg, val)	\
+	bus_space_write_4(sc->vx_btag, sc->vx_bhandle, reg, val)
+#define CSR_WRITE_2(sc, reg, val)	\
+	bus_space_write_2(sc->vx_btag, sc->vx_bhandle, reg, val)
+#define CSR_WRITE_1(sc, reg, val)	\
+	bus_space_write_1(sc->vx_btag, sc->vx_bhandle, reg, val)
+
+#define CSR_READ_4(sc, reg)		\
+	bus_space_read_4(sc->vx_btag, sc->vx_bhandle, reg)
+#define CSR_READ_2(sc, reg)		\
+	bus_space_read_2(sc->vx_btag, sc->vx_bhandle, reg)
+#define CSR_READ_1(sc, reg)		\
+	bus_space_read_1(sc->vx_btag, sc->vx_bhandle, reg)
+
 /*
  * Some global constants
  */
@@ -317,7 +335,7 @@
 #define S_UPD_STATS		(u_short) (0x80)
 #define S_COMMAND_IN_PROGRESS	(u_short) (0x1000)
 
-#define VX_BUSY_WAIT while (inw(BASE + VX_STATUS) & S_COMMAND_IN_PROGRESS)
+#define VX_BUSY_WAIT while (CSR_READ_2(sc, VX_STATUS) & S_COMMAND_IN_PROGRESS)
 
 /* Address Config. Register.    
  * Window 0/Port 06
@@ -437,7 +455,7 @@
 #define ENABLE_DRQ_IRQ                  0x0001
 #define MFG_ID                          0x506d  /* `TCM' */
 #define PROD_ID                         0x5090
-#define GO_WINDOW(x)		outw(BASE+VX_COMMAND, WINDOW_SELECT|(x))
+#define GO_WINDOW(x)		CSR_WRITE_2(sc, VX_COMMAND, WINDOW_SELECT|(x))
 #define JABBER_GUARD_ENABLE	0x40
 #define LINKBEAT_ENABLE		0x80
 #define	ENABLE_UTP		(JABBER_GUARD_ENABLE | LINKBEAT_ENABLE)
Index: smb_subr.c
===================================================================
RCS file: /home/repository/dragonflybsd/src/sys/netsmb/smb_subr.c,v
retrieving revision 1.7
diff -u -r1.7 smb_subr.c
--- smb_subr.c	19 Jul 2003 21:14:45 -0000	1.7
+++ smb_subr.c	29 Nov 2003 16:37:50 -0000
@@ -391,7 +391,7 @@
     struct proc **newpp, int flags, const char *fmt, ...)
 {
 	int error;
-	va_list ap;
+	__va_list ap;
 	struct proc *p2;
 
@@ -412,9 +412,9 @@
 	PHOLD(p2);
 
 	/* set up arg0 for 'ps', et al */
-	va_start(ap, fmt);
+	__va_start(ap, fmt);
 	vsnprintf(p2->p_comm, sizeof(p2->p_comm), fmt, ap);
-	va_end(ap);
+	__va_end(ap);
 
 	/* call the processes' main()... */
 	cpu_set_fork_handler(p2, func, arg);




More information about the Submit mailing list