PERFORCE change 87056 for review

John Baldwin jhb at FreeBSD.org
Mon Nov 21 14:22:53 PST 2005


http://perforce.freebsd.org/chv.cgi?CH=87056

Change 87056 by jhb at jhb_slimer on 2005/11/21 22:22:15

	IFC @87054.

Affected files ...

.. //depot/projects/smpng/sys/alpha/conf/DEFAULTS#1 branch
.. //depot/projects/smpng/sys/alpha/conf/GENERIC#52 integrate
.. //depot/projects/smpng/sys/amd64/conf/DEFAULTS#2 integrate
.. //depot/projects/smpng/sys/conf/files.i386#90 integrate
.. //depot/projects/smpng/sys/dev/acpica/acpi_pci_link.c#32 integrate
.. //depot/projects/smpng/sys/dev/nve/if_nve.c#9 integrate
.. //depot/projects/smpng/sys/dev/nve/if_nvereg.h#3 integrate
.. //depot/projects/smpng/sys/dev/puc/puc.c#26 integrate
.. //depot/projects/smpng/sys/i386/conf/DEFAULTS#2 integrate
.. //depot/projects/smpng/sys/ia64/conf/DEFAULTS#1 branch
.. //depot/projects/smpng/sys/ia64/conf/GENERIC#46 integrate
.. //depot/projects/smpng/sys/pc98/conf/DEFAULTS#2 integrate
.. //depot/projects/smpng/sys/pci/if_de.c#30 integrate
.. //depot/projects/smpng/sys/pci/if_devar.h#12 integrate
.. //depot/projects/smpng/sys/powerpc/conf/DEFAULTS#1 branch
.. //depot/projects/smpng/sys/powerpc/conf/GENERIC#30 integrate
.. //depot/projects/smpng/sys/sparc64/conf/DEFAULTS#1 branch
.. //depot/projects/smpng/sys/sparc64/conf/GENERIC#60 integrate

Differences ...

==== //depot/projects/smpng/sys/alpha/conf/GENERIC#52 (text+ko) ====

@@ -18,7 +18,7 @@
 #
 # For hardware specific information check HARDWARE.TXT
 #
-# $FreeBSD: src/sys/alpha/conf/GENERIC,v 1.189 2005/11/05 19:48:53 marcel Exp $
+# $FreeBSD: src/sys/alpha/conf/GENERIC,v 1.190 2005/11/21 20:17:45 jhb Exp $
 
 machine		alpha
 cpu		EV4
@@ -183,7 +183,6 @@
 
 # Pseudo devices.
 device		loop		# Network loopback
-device		mem		# Memory and kernel memory devices
 device		random		# Entropy device
 device		ether		# Ethernet support
 device		sl		# Kernel SLIP

==== //depot/projects/smpng/sys/amd64/conf/DEFAULTS#2 (text+ko) ====

@@ -1,7 +1,7 @@
 #
 # DEFAULTS -- Default kernel configuration file for FreeBSD/amd64
 #
-# $FreeBSD: src/sys/amd64/conf/DEFAULTS,v 1.2 2005/10/27 18:54:43 peter Exp $
+# $FreeBSD: src/sys/amd64/conf/DEFAULTS,v 1.3 2005/11/21 20:22:34 jhb Exp $
 
 # Not yet, this would break all existing configs
 #machine		amd64
@@ -12,3 +12,5 @@
 # Pseudo devices.
 device		mem		# Memory and kernel memory devices
 device		io		# I/O device
+
+options 	PUC_FASTINTR

==== //depot/projects/smpng/sys/conf/files.i386#90 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.i386,v 1.544 2005/11/11 09:57:30 ru Exp $
+# $FreeBSD: src/sys/conf/files.i386,v 1.545 2005/11/21 20:11:39 ru Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -232,7 +232,7 @@
 i386/acpica/acpi_machdep.c	optional acpi
 i386/acpica/acpi_wakeup.c	optional acpi
 acpi_wakecode.h			optional acpi			\
-	dependency 	"$S/i386/acpica/acpi_wakecode.S"		\
+	dependency 	"$S/i386/acpica/acpi_wakecode.S assym.s"	\
 	compile-with	"${MAKE} -f $S/i386/acpica/Makefile MAKESRCPATH=$S/i386/acpica"	\
 	no-obj no-implicit-rule before-depend				\
 	clean		"acpi_wakecode.h acpi_wakecode.o acpi_wakecode.bin"

==== //depot/projects/smpng/sys/dev/acpica/acpi_pci_link.c#32 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.48 2005/11/01 22:44:07 jkim Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.49 2005/11/21 22:01:16 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -608,7 +608,19 @@
 {
 	struct link *link;
 	uint8_t bios_irq;
+	uintptr_t bus;
 
+	/*
+	 * Look up the PCI bus for the specified PCI bridge device.  Note
+	 * that the PCI bridge device might not have any children yet.
+	 * However, looking up its bus number doesn't require a valid child
+	 * device, so we just pass NULL.
+	 */
+	if (BUS_READ_IVAR(pcib, NULL, PCIB_IVAR_BUS, &bus) != 0) {
+		device_printf(pcib, "Unable to read PCI bus number");
+		panic("this is bad");
+	}
+		
 	/* Bump the reference count. */
 	ACPI_SERIAL_BEGIN(pci_link);
 	link = acpi_pci_link_lookup(dev, index);
@@ -619,7 +631,7 @@
 		pci_link_interrupt_weights[link->l_irq]++;
 
 	/* Try to find a BIOS IRQ setting from any matching devices. */
-	bios_irq = acpi_pci_link_search_irq(pcib_get_bus(pcib), slot, pin);
+	bios_irq = acpi_pci_link_search_irq(bus, slot, pin);
 	if (!PCI_INTERRUPT_VALID(bios_irq)) {
 		ACPI_SERIAL_END(pci_link);
 		return;
@@ -628,7 +640,7 @@
 	/* Validate the BIOS IRQ. */
 	if (!link_valid_irq(link, bios_irq)) {
 		device_printf(dev, "BIOS IRQ %u for %d.%d.INT%c is invalid\n",
-		    bios_irq, pcib_get_bus(pcib), slot, pin + 'A');
+		    bios_irq, (int)bus, slot, pin + 'A');
 	} else if (!PCI_INTERRUPT_VALID(link->l_bios_irq)) {
 		link->l_bios_irq = bios_irq;
 		if (bios_irq < NUM_ISA_INTERRUPTS)
@@ -641,7 +653,7 @@
 	} else if (bios_irq != link->l_bios_irq)
 		device_printf(dev,
 	    "BIOS IRQ %u for %d.%d.INT%c does not match previous BIOS IRQ %u\n",
-		    bios_irq, pcib_get_bus(pcib), slot, pin + 'A',
+		    bios_irq, (int)bus, slot, pin + 'A',
 		    link->l_bios_irq);
 	ACPI_SERIAL_END(pci_link);
 }

==== //depot/projects/smpng/sys/dev/nve/if_nve.c#9 (text+ko) ====

@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/nve/if_nve.c,v 1.14 2005/11/11 16:04:53 ru Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/nve/if_nve.c,v 1.15 2005/11/21 22:14:49 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -130,12 +130,14 @@
 static int      nve_attach(device_t);
 static int      nve_detach(device_t);
 static void     nve_init(void *);
+static void     nve_init_locked(struct nve_softc *);
 static void     nve_stop(struct nve_softc *);
 static void     nve_shutdown(device_t);
 static int      nve_init_rings(struct nve_softc *);
 static void     nve_free_rings(struct nve_softc *);
 
 static void     nve_ifstart(struct ifnet *);
+static void     nve_ifstart_locked(struct ifnet *);
 static int      nve_ioctl(struct ifnet *, u_long, caddr_t);
 static void     nve_intr(void *);
 static void     nve_tick(void *);
@@ -144,6 +146,7 @@
 static void     nve_update_stats(struct nve_softc *);
 
 static int      nve_ifmedia_upd(struct ifnet *);
+static void	nve_ifmedia_upd_locked(struct ifnet *);
 static void     nve_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 static int      nve_miibus_readreg(device_t, int, int);
 static void     nve_miibus_writereg(device_t, int, int, int);
@@ -304,20 +307,19 @@
 	struct ifnet		*ifp;
 	OS_API			*osapi;
 	ADAPTER_OPEN_PARAMS	OpenParams;
-	int			error = 0, i, rid, unit;
+	int			error = 0, i, rid;
 
 	DEBUGOUT(NVE_DEBUG_INIT, "nve: nve_attach - entry\n");
 
 	sc = device_get_softc(dev);
-	unit = device_get_unit(dev);
 
 	/* Allocate mutex */
 	mtx_init(&sc->mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
 	    MTX_DEF | MTX_RECURSE);
 	mtx_init(&sc->osmtx, device_get_nameunit(dev), NULL, MTX_SPIN);
+	callout_init_mtx(&sc->stat_callout, &sc->mtx, 0);
 
 	sc->dev = dev;
-	sc->unit = unit;
 
 	/* Preinitialize data structures */
 	bzero(&OpenParams, sizeof(ADAPTER_OPEN_PARAMS));
@@ -510,7 +512,7 @@
 
 	/* Setup interface parameters */
 	ifp->if_softc = sc;
-	if_initname(ifp, "nve", unit);
+	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	ifp->if_ioctl = nve_ioctl;
 	ifp->if_output = ether_output;
@@ -525,11 +527,10 @@
 
 	/* Attach to OS's managers. */
 	ether_ifattach(ifp, eaddr);
-	callout_handle_init(&sc->stat_ch);
 
 	/* Activate our interrupt handler. - attach last to avoid lock */
-	error = bus_setup_intr(sc->dev, sc->irq, INTR_TYPE_NET, nve_intr,
-	    sc, &sc->sc_ih);
+	error = bus_setup_intr(sc->dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE,
+	    nve_intr, sc, &sc->sc_ih);
 	if (error) {
 		device_printf(sc->dev, "couldn't set up interrupt handler\n");
 		goto fail;
@@ -551,15 +552,16 @@
 	struct ifnet *ifp;
 
 	KASSERT(mtx_initialized(&sc->mtx), ("mutex not initialized"));
-	NVE_LOCK(sc);
 
 	DEBUGOUT(NVE_DEBUG_DEINIT, "nve: nve_detach - entry\n");
 
 	ifp = sc->ifp;
 
 	if (device_is_attached(dev)) {
+		NVE_LOCK(sc);
 		nve_stop(sc);
-		/* XXX shouldn't hold lock over call to ether_ifdetch */
+		NVE_UNLOCK(sc);
+		callout_drain(&sc->stat_callout);
 		ether_ifdetach(ifp);
 	}
 
@@ -598,7 +600,6 @@
 	if (sc->rtag)
 		bus_dma_tag_destroy(sc->rtag);
 
-	NVE_UNLOCK(sc);
 	if (ifp)
 		if_free(ifp);
 	mtx_destroy(&sc->mtx);
@@ -614,17 +615,26 @@
 nve_init(void *xsc)
 {
 	struct nve_softc *sc = xsc;
+
+	NVE_LOCK(sc);
+	nve_init_locked(sc);
+	NVE_UNLOCK(sc);
+}
+
+static void
+nve_init_locked(struct nve_softc *sc)
+{
 	struct ifnet *ifp;
 	int error;
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 	DEBUGOUT(NVE_DEBUG_INIT, "nve: nve_init - entry (%d)\n", sc->linkup);
 
 	ifp = sc->ifp;
 
 	/* Do nothing if already running */
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-		goto fail;
+		return;
 
 	nve_stop(sc);
 	DEBUGOUT(NVE_DEBUG_INIT, "nve: do pfnInit\n");
@@ -640,7 +650,7 @@
 	if (error) {
 		device_printf(sc->dev,
 		    "failed to start NVIDIA Hardware interface\n");
-		goto fail;
+		return;
 	}
 	/* Set the MAC address */
 	sc->hwapi->pfnSetNodeAddress(sc->hwapi->pADCX, IF_LLADDR(sc->ifp));
@@ -649,19 +659,16 @@
 
 	/* Setup multicast filter */
 	nve_setmulti(sc);
-	nve_ifmedia_upd(ifp);
+	nve_ifmedia_upd_locked(ifp);
 
 	/* Update interface parameters */
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
-	sc->stat_ch = timeout(nve_tick, sc, hz);
+	callout_reset(&sc->stat_callout, hz, nve_tick, sc);
 
 	DEBUGOUT(NVE_DEBUG_INIT, "nve: nve_init - exit\n");
 
-fail:
-	NVE_UNLOCK(sc);
-
 	return;
 }
 
@@ -671,7 +678,7 @@
 {
 	struct ifnet *ifp;
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 
 	DEBUGOUT(NVE_DEBUG_RUNNING, "nve: nve_stop - entry\n");
 
@@ -679,7 +686,7 @@
 	ifp->if_timer = 0;
 
 	/* Cancel tick timer */
-	untimeout(nve_tick, sc, sc->stat_ch);
+	callout_stop(&sc->stat_callout);
 
 	/* Stop hardware activity */
 	sc->hwapi->pfnDisableInterrupts(sc->hwapi->pADCX);
@@ -699,8 +706,6 @@
 
 	DEBUGOUT(NVE_DEBUG_RUNNING, "nve: nve_stop - exit\n");
 
-	NVE_UNLOCK(sc);
-
 	return;
 }
 
@@ -715,7 +720,9 @@
 	sc = device_get_softc(dev);
 
 	/* Stop hardware activity */
+	NVE_LOCK(sc);
 	nve_stop(sc);
+	NVE_UNLOCK(sc);
 }
 
 /* Allocate TX ring buffers */
@@ -724,8 +731,6 @@
 {
 	int error, i;
 
-	NVE_LOCK(sc);
-
 	DEBUGOUT(NVE_DEBUG_INIT, "nve: nve_init_rings - entry\n");
 
 	sc->cur_rx = sc->cur_tx = sc->pending_rxs = sc->pending_txs = 0;
@@ -738,8 +743,7 @@
 		if (buf->mbuf == NULL) {
 			device_printf(sc->dev, "couldn't allocate mbuf\n");
 			nve_free_rings(sc);
-			error = ENOBUFS;
-			goto fail;
+			return (ENOBUFS);
 		}
 		buf->mbuf->m_len = buf->mbuf->m_pkthdr.len = MCLBYTES;
 		m_adj(buf->mbuf, ETHER_ALIGN);
@@ -748,14 +752,14 @@
 		if (error) {
 			device_printf(sc->dev, "couldn't create dma map\n");
 			nve_free_rings(sc);
-			goto fail;
+			return (error);
 		}
 		error = bus_dmamap_load_mbuf(sc->mtag, buf->map, buf->mbuf,
 					  nve_dmamap_rx_cb, &desc->paddr, 0);
 		if (error) {
 			device_printf(sc->dev, "couldn't dma map mbuf\n");
 			nve_free_rings(sc);
-			goto fail;
+			return (error);
 		}
 		bus_dmamap_sync(sc->mtag, buf->map, BUS_DMASYNC_PREREAD);
 
@@ -776,7 +780,7 @@
 		if (error) {
 			device_printf(sc->dev, "couldn't create dma map\n");
 			nve_free_rings(sc);
-			goto fail;
+			return (error);
 		}
 	}
 	bus_dmamap_sync(sc->ttag, sc->tmap,
@@ -784,9 +788,6 @@
 
 	DEBUGOUT(NVE_DEBUG_INIT, "nve: nve_init_rings - exit\n");
 
-fail:
-	NVE_UNLOCK(sc);
-
 	return (error);
 }
 
@@ -796,8 +797,6 @@
 {
 	int i;
 
-	NVE_LOCK(sc);
-
 	DEBUGOUT(NVE_DEBUG_DEINIT, "nve: nve_free_rings - entry\n");
 
 	for (i = 0; i < RX_RING_SIZE; i++) {
@@ -825,13 +824,21 @@
 	}
 
 	DEBUGOUT(NVE_DEBUG_DEINIT, "nve: nve_free_rings - exit\n");
+}
 
+/* Main loop for sending packets from OS to interface */
+static void
+nve_ifstart(struct ifnet *ifp)
+{
+	struct nve_softc *sc = ifp->if_softc;
+
+	NVE_LOCK(sc);
+	nve_ifstart_locked(ifp);
 	NVE_UNLOCK(sc);
 }
 
-/* Main loop for sending packets from OS to interface */
 static void
-nve_ifstart(struct ifnet *ifp)
+nve_ifstart_locked(struct ifnet *ifp)
 {
 	struct nve_softc *sc = ifp->if_softc;
 	struct nve_map_buffer *buf;
@@ -842,8 +849,11 @@
 
 	DEBUGOUT(NVE_DEBUG_RUNNING, "nve: nve_ifstart - entry\n");
 
+	NVE_LOCK_ASSERT(sc);
+
 	/* If link is down/busy or queue is empty do nothing */
-	if (ifp->if_drv_flags & IFF_DRV_OACTIVE || ifp->if_snd.ifq_head == NULL)
+	if (ifp->if_drv_flags & IFF_DRV_OACTIVE ||
+	    IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 		return;
 
 	/* Transmit queued packets until sent or TX ring is full */
@@ -953,46 +963,54 @@
 	struct mii_data *mii;
 	int error = 0;
 
-	NVE_LOCK(sc);
-
 	DEBUGOUT(NVE_DEBUG_IOCTL, "nve: nve_ioctl - entry\n");
 
 	switch (command) {
 	case SIOCSIFMTU:
 		/* Set MTU size */
-		if (ifp->if_mtu == ifr->ifr_mtu)
+		NVE_LOCK(sc);
+		if (ifp->if_mtu == ifr->ifr_mtu) {
+			NVE_UNLOCK(sc);
 			break;
+		}
 		if (ifr->ifr_mtu + ifp->if_hdrlen <= MAX_PACKET_SIZE_1518) {
 			ifp->if_mtu = ifr->ifr_mtu;
 			nve_stop(sc);
-			nve_init(sc);
+			nve_init_locked(sc);
 		} else
 			error = EINVAL;
+		NVE_UNLOCK(sc);
 		break;
 
 	case SIOCSIFFLAGS:
 		/* Setup interface flags */
+		NVE_LOCK(sc);
 		if (ifp->if_flags & IFF_UP) {
 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-				nve_init(sc);
+				nve_init_locked(sc);
+				NVE_UNLOCK(sc);
 				break;
 			}
 		} else {
 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
 				nve_stop(sc);
+				NVE_UNLOCK(sc);
 				break;
 			}
 		}
 		/* Handle IFF_PROMISC and IFF_ALLMULTI flags. */
 		nve_setmulti(sc);
+		NVE_UNLOCK(sc);
 		break;
 
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		/* Setup multicast filter */
+		NVE_LOCK(sc);
 		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
 			nve_setmulti(sc);
 		}
+		NVE_UNLOCK(sc);
 		break;
 
 	case SIOCGIFMEDIA:
@@ -1010,8 +1028,6 @@
 
 	DEBUGOUT(NVE_DEBUG_IOCTL, "nve: nve_ioctl - exit\n");
 
-	NVE_UNLOCK(sc);
-
 	return (error);
 }
 
@@ -1024,8 +1040,10 @@
 
 	DEBUGOUT(NVE_DEBUG_INTERRUPT, "nve: nve_intr - entry\n");
 
+	NVE_LOCK(sc);
 	if (!ifp->if_flags & IFF_UP) {
 		nve_stop(sc);
+		NVE_UNLOCK(sc);
 		return;
 	}
 	/* Handle interrupt event */
@@ -1033,12 +1051,13 @@
 		sc->hwapi->pfnHandleInterrupt(sc->hwapi->pADCX);
 		sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
 	}
-	if (ifp->if_snd.ifq_head != NULL)
-		nve_ifstart(ifp);
+	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+		nve_ifstart_locked(ifp);
 
 	/* If no pending packets we don't need a timeout */
 	if (sc->pending_txs == 0)
 		sc->ifp->if_timer = 0;
+	NVE_UNLOCK(sc);
 
 	DEBUGOUT(NVE_DEBUG_INTERRUPT, "nve: nve_intr - exit\n");
 
@@ -1055,7 +1074,7 @@
 	int i;
 	u_int8_t andaddr[6], oraddr[6];
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 
 	DEBUGOUT(NVE_DEBUG_RUNNING, "nve: nve_setmulti - entry\n");
 
@@ -1072,7 +1091,6 @@
 		/* Accept all packets */
 		hwfilter.ulFilterFlags |= ACCEPT_ALL_PACKETS;
 		sc->hwapi->pfnSetPacketFilter(sc->hwapi->pADCX, &hwfilter);
-		NVE_UNLOCK(sc);
 		return;
 	}
 	/* Setup multicast filter */
@@ -1099,8 +1117,6 @@
 	/* Send filter to NVIDIA API */
 	sc->hwapi->pfnSetPacketFilter(sc->hwapi->pADCX, &hwfilter);
 
-	NVE_UNLOCK(sc);
-
 	DEBUGOUT(NVE_DEBUG_RUNNING, "nve: nve_setmulti - exit\n");
 
 	return;
@@ -1111,10 +1127,22 @@
 nve_ifmedia_upd(struct ifnet *ifp)
 {
 	struct nve_softc *sc = ifp->if_softc;
+
+	NVE_LOCK(sc);
+	nve_ifmedia_upd_locked(ifp);
+	NVE_UNLOCK(sc);
+	return (0);
+}
+
+static void
+nve_ifmedia_upd_locked(struct ifnet *ifp)
+{
+	struct nve_softc *sc = ifp->if_softc;
 	struct mii_data *mii;
 
 	DEBUGOUT(NVE_DEBUG_MII, "nve: nve_ifmedia_upd\n");
 
+	NVE_LOCK_ASSERT(sc);
 	mii = device_get_softc(sc->miibus);
 
 	if (mii->mii_instance) {
@@ -1125,8 +1153,6 @@
 		}
 	}
 	mii_mediachg(mii);
-
-	return (0);
 }
 
 /* Update current miibus PHY status of media */
@@ -1139,8 +1165,10 @@
 	DEBUGOUT(NVE_DEBUG_MII, "nve: nve_ifmedia_sts\n");
 
 	sc = ifp->if_softc;
+	NVE_LOCK(sc);
 	mii = device_get_softc(sc->miibus);
 	mii_pollstat(mii);
+	NVE_UNLOCK(sc);
 
 	ifmr->ifm_active = mii->mii_media_active;
 	ifmr->ifm_status = mii->mii_media_status;
@@ -1156,7 +1184,7 @@
 	struct mii_data *mii;
 	struct ifnet *ifp;
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 
 	ifp = sc->ifp;
 	nve_update_stats(sc);
@@ -1166,12 +1194,10 @@
 
 	if (mii->mii_media_status & IFM_ACTIVE &&
 	    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
-		if (ifp->if_snd.ifq_head != NULL)
-			nve_ifstart(ifp);
+		if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+			nve_ifstart_locked(ifp);
 	}
-	sc->stat_ch = timeout(nve_tick, sc, hz);
-
-	NVE_UNLOCK(sc);
+	callout_reset(&sc->stat_callout, hz, nve_tick, sc);
 
 	return;
 }
@@ -1183,7 +1209,7 @@
 	struct ifnet *ifp = sc->ifp;
 	ADAPTER_STATS stats;
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 
 	if (sc->hwapi) {
 		sc->hwapi->pfnGetStatistics(sc->hwapi->pADCX, &stats);
@@ -1205,7 +1231,6 @@
 
 		ifp->if_collisions = stats.ulLateCollisionErrors;
 	}
-	NVE_UNLOCK(sc);
 
 	return;
 }
@@ -1249,14 +1274,16 @@
 
 	device_printf(sc->dev, "device timeout (%d)\n", sc->pending_txs);
 
+	NVE_LOCK(sc);
 	sc->tx_errors++;
 
 	nve_stop(sc);
 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
-	nve_init(sc);
+	nve_init_locked(sc);
 
-	if (ifp->if_snd.ifq_head != NULL)
-		nve_ifstart(ifp);
+	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+		nve_ifstart_locked(ifp);
+	NVE_UNLOCK(sc);
 
 	return;
 }
@@ -1389,7 +1416,8 @@
 	struct nve_map_buffer *buf;
 	int error;
 
-	NVE_LOCK(sc);
+	if (device_is_attached(sc->dev))
+		NVE_LOCK_ASSERT(sc);
 
 	DEBUGOUT(NVE_DEBUG_API, "nve: nve_osallocrxbuf\n");
 
@@ -1429,11 +1457,9 @@
 	mem->uiLength = desc->buflength;
 	*id = (void *)desc;
 
-	NVE_UNLOCK(sc);
 	return (1);
 	
 fail:
-	NVE_UNLOCK(sc);
 	return (0);
 }
 
@@ -1445,8 +1471,6 @@
 	struct nve_rx_desc *desc;
 	struct nve_map_buffer *buf;
 
-	NVE_LOCK(sc);
-
 	DEBUGOUT(NVE_DEBUG_API, "nve: nve_osfreerxbuf\n");
 
 	desc = (struct nve_rx_desc *) id;
@@ -1460,8 +1484,6 @@
 	sc->pending_rxs--;
 	buf->mbuf = NULL;
 
-	NVE_UNLOCK(sc);
-
 	return (1);
 }
 
@@ -1474,7 +1496,7 @@
 	struct nve_tx_desc *desc = (struct nve_tx_desc *) id;
 	struct ifnet *ifp;
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 
 	DEBUGOUT(NVE_DEBUG_API, "nve: nve_ospackettx\n");
 
@@ -1495,11 +1517,10 @@
 	if (sc->pending_txs < TX_RING_SIZE)
 		sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
-	if (ifp->if_snd.ifq_head != NULL && sc->pending_txs < TX_RING_SIZE)
-		nve_ifstart(ifp);
+	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd) && sc->pending_txs < TX_RING_SIZE)
+		nve_ifstart_locked(ifp);
 
 fail:
-	NVE_UNLOCK(sc);
 
 	return (1);
 }
@@ -1515,8 +1536,9 @@
 	struct nve_rx_desc *desc;
 	struct nve_map_buffer *buf;
 	ADAPTER_READ_DATA *readdata;
+	struct mbuf *m;
 
-	NVE_LOCK(sc);
+	NVE_LOCK_ASSERT(sc);
 
 	DEBUGOUT(NVE_DEBUG_API, "nve: nve_ospacketrx\n");
 
@@ -1538,13 +1560,17 @@
 
 		bus_dmamap_unload(sc->mtag, buf->map);
 
+		/* Blat the mbuf pointer, kernel will free the mbuf cluster */
+		m = buf->mbuf;
+		buf->mbuf = NULL;
+
 		/* Give mbuf to OS. */
-		(*ifp->if_input) (ifp, buf->mbuf);
+		NVE_UNLOCK(sc);
+		(*ifp->if_input)(ifp, m);
+		NVE_LOCK(sc);
 		if (readdata->ulFilterMatch & ADREADFL_MULTICAST_MATCH)
 			ifp->if_imcasts++;
 
-		/* Blat the mbuf pointer, kernel will free the mbuf cluster */
-		buf->mbuf = NULL;
 	} else {
 		bus_dmamap_sync(sc->mtag, buf->map, BUS_DMASYNC_POSTREAD);
 		bus_dmamap_unload(sc->mtag, buf->map);
@@ -1555,8 +1581,6 @@
 	sc->cur_rx = desc - sc->rx_desc;
 	sc->pending_rxs--;
 
-	NVE_UNLOCK(sc);
-
 	return (1);
 }
 
@@ -1587,7 +1611,7 @@
 
 	DEBUGOUT(NVE_DEBUG_BROKEN, "nve: nve_osalloctimer\n");
 
-	callout_handle_init(&sc->ostimer);
+	callout_init(&sc->ostimer, CALLOUT_MPSAFE);
 	*timer = &sc->ostimer;
 
 	return (1);
@@ -1600,6 +1624,8 @@
 
 	DEBUGOUT(NVE_DEBUG_BROKEN, "nve: nve_osfreetimer\n");
 
+	callout_drain((struct callout *)timer);
+
 	return (1);
 }
 
@@ -1625,8 +1651,8 @@
 
 	DEBUGOUT(NVE_DEBUG_BROKEN, "nve: nve_ossettimer\n");
 
-	*(struct callout_handle *)timer = timeout(sc->ostimer_func,
-	    sc->ostimer_params, delay);
+	callout_reset((struct callout *)timer, delay, sc->ostimer_func,
+	    sc->ostimer_params);
 
 	return (1);
 }
@@ -1635,12 +1661,10 @@
 static NV_SINT32
 nve_oscanceltimer(PNV_VOID ctx, PNV_VOID timer)
 {
-	struct nve_softc *sc = ctx;
 
 	DEBUGOUT(NVE_DEBUG_BROKEN, "nve: nve_oscanceltimer\n");
 
-	untimeout(sc->ostimer_func, sc->ostimer_params,
-	    *(struct callout_handle *)timer);
+	callout_stop((struct callout *)timer);
 
 	return (1);
 }

==== //depot/projects/smpng/sys/dev/nve/if_nvereg.h#3 (text+ko) ====

@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $Id: if_nvreg.h,v 1.6 2004/08/12 14:00:05 q Exp $
- * $FreeBSD: src/sys/dev/nve/if_nvereg.h,v 1.3 2005/06/10 16:49:12 brooks Exp $
+ * $FreeBSD: src/sys/dev/nve/if_nvereg.h,v 1.4 2005/11/21 22:14:49 jhb Exp $
  */
  
 #ifndef _IF_NVEREG_H_
@@ -117,9 +117,8 @@
 		
 	device_t miibus;
 	device_t dev;
-	struct callout_handle stat_ch;
+	struct callout stat_callout;
 
-	u_int32_t unit;
 	void *sc_ih;
 	bus_space_tag_t sc_st;
 	bus_space_handle_t sc_sh;
@@ -140,13 +139,11 @@
 	u_int32_t pending_rxs;
 	u_int32_t pending_txs;
 
-	u_int32_t flags;
-	u_int32_t miicfg;
 	struct mtx mtx;
 	struct mtx osmtx;
 
 	/* Stuff for dealing with the NVIDIA OS API */
-	struct callout_handle ostimer;
+	struct callout ostimer;
 	PTIMER_FUNC ostimer_func;
 	void *ostimer_params;
 	int linkup;
@@ -167,6 +164,7 @@
 
 #define NVE_LOCK(_sc)		mtx_lock(&(_sc)->mtx)
 #define NVE_UNLOCK(_sc)		mtx_unlock(&(_sc)->mtx)
+#define NVE_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->mtx, MA_OWNED)
 #define NVE_OSLOCK(_sc)		mtx_lock_spin(&(_sc)->osmtx)
 #define NVE_OSUNLOCK(_sc)	mtx_unlock_spin(&(_sc)->osmtx)
 

==== //depot/projects/smpng/sys/dev/puc/puc.c#26 (text+ko) ====

@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/puc/puc.c,v 1.44 2005/11/07 13:10:45 rodrigc Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/puc/puc.c,v 1.45 2005/11/21 20:22:34 jhb Exp $");
 
 /*
  * PCI "universal" communication card device driver, glues com, lpt,
@@ -83,10 +83,6 @@
 
 #include "opt_puc.h"
 
-#ifndef PUC_FASTINTR
-#define PUC_FASTINTR
-#endif
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>

==== //depot/projects/smpng/sys/i386/conf/DEFAULTS#2 (text+ko) ====

@@ -1,7 +1,7 @@
 #
 # DEFAULTS -- Default kernel configuration file for FreeBSD/i386
 #
-# $FreeBSD: src/sys/i386/conf/DEFAULTS,v 1.1 2005/10/27 17:34:35 jhb Exp $
+# $FreeBSD: src/sys/i386/conf/DEFAULTS,v 1.2 2005/11/21 20:22:34 jhb Exp $
 
 # Not yet, this would break all existing configs
 #machine		i386
@@ -15,3 +15,5 @@
 # Pseudo devices.
 device		mem		# Memory and kernel memory devices
 device		io		# I/O device
+
+options 	PUC_FASTINTR

==== //depot/projects/smpng/sys/ia64/conf/GENERIC#46 (text+ko) ====

@@ -18,7 +18,7 @@
 #
 # For hardware specific information check HARDWARE.TXT
 #
-# $FreeBSD: src/sys/ia64/conf/GENERIC,v 1.74 2005/09/05 21:36:28 marcel Exp $
+# $FreeBSD: src/sys/ia64/conf/GENERIC,v 1.75 2005/11/21 20:17:45 jhb Exp $
 
 machine		ia64
 cpu		ITANIUM
@@ -56,7 +56,6 @@
 options 	_KPOSIX_PRIORITY_SCHEDULING	# Posix P1003_1B RT extensions
 
 # Various "busses"
-device 		acpi		# ACPI support (mandatory)
 device		firewire	# FireWire bus code
 device		miibus		# MII bus support (Ethernet)
 device		pci		# PCI bus support
@@ -141,7 +140,6 @@
 device		gif		# IPv6 and IPv4 tunneling
 device		loop		# Network loopback
 device		md		# Memory "disks"
-device		mem		# Memory and kernel memory devices
 device		pty		# Pseudo-ttys (telnet etc)
 device		puc		# Multi I/O cards and multi-channel UARTs
 device		random		# Entropy device

==== //depot/projects/smpng/sys/pc98/conf/DEFAULTS#2 (text+ko) ====

@@ -1,7 +1,7 @@
 #
 # DEFAULTS -- Default kernel configuration file for FreeBSD/pc98
 #
-# $FreeBSD: src/sys/pc98/conf/DEFAULTS,v 1.1 2005/10/28 15:30:51 nyan Exp $
+# $FreeBSD: src/sys/pc98/conf/DEFAULTS,v 1.2 2005/11/21 20:22:35 jhb Exp $
 
 # Not yet, this would break all existing configs
 #machine		pc98 i386
@@ -16,3 +16,5 @@
 # Pseudo devices.
 device		mem		# Memory and kernel memory devices
 device		io		# I/O device
+
+options 	PUC_FASTINTR

==== //depot/projects/smpng/sys/pci/if_de.c#30 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/pci/if_de.c,v 1.174 2005/11/11 16:04:57 ru Exp $");
+__FBSDID("$FreeBSD: src/sys/pci/if_de.c,v 1.175 2005/11/21 21:50:07 jhb Exp $");
 
 #define	TULIP_HDR_DATA
 
@@ -3084,9 +3084,9 @@
 		hash = tulip_mchash(IF_LLADDR(ifp));
 		sp[hash >> 4] |= htole32(1 << (hash & 0xF));
 	    } else {
-		sp[39] = TULIP_SP_MAC(((u_int16_t *)IF_LLADDR(ifp))[0]); 
-		sp[40] = TULIP_SP_MAC(((u_int16_t *)IF_LLADDR(ifp))[1]); 
-		sp[41] = TULIP_SP_MAC(((u_int16_t *)IF_LLADDR(ifp))[2]);
+		sp[39] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 0); 
+		sp[40] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 1); 
+		sp[41] = TULIP_SP_MAC((u_int16_t *)IF_LLADDR(ifp) + 2);
 	    }
 	}
     }
@@ -3101,26 +3101,32 @@
 		    if (ifma->ifma_addr->sa_family != AF_LINK)
 			    continue;
 		    addrp = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
-		    *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[0]); 
-		    *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[1]); 
-		    *sp++ = TULIP_SP_MAC(((u_int16_t *)addrp)[2]);
+		    *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 0); 
+		    *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 1); 
+		    *sp++ = TULIP_SP_MAC((u_int16_t *)addrp + 2);
 		    idx++;
 	    }
 	    /*
 	     * Add the broadcast address.
 	     */
 	    idx++;
-	    *sp++ = TULIP_SP_MAC(0xFFFF);
-	    *sp++ = TULIP_SP_MAC(0xFFFF);

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list