PERFORCE change 99030 for review

Warner Losh imp at FreeBSD.org
Mon Jun 12 03:38:52 UTC 2006


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

Change 99030 by imp at imp_harmony on 2006/06/12 03:36:28

	IFC @99029

Affected files ...

.. //depot/projects/arm/src/sys/arm/arm/pmap.c#19 integrate
.. //depot/projects/arm/src/sys/dev/acpica/acpi.c#10 integrate
.. //depot/projects/arm/src/sys/dev/cardbus/cardbus.c#8 integrate
.. //depot/projects/arm/src/sys/dev/cardbus/cardbus_cis.c#6 integrate
.. //depot/projects/arm/src/sys/dev/cm/if_cm_isa.c#3 integrate
.. //depot/projects/arm/src/sys/dev/cm/smc90cx6.c#3 integrate
.. //depot/projects/arm/src/sys/dev/cm/smc90cx6reg.h#2 integrate
.. //depot/projects/arm/src/sys/dev/cm/smc90cx6var.h#3 integrate
.. //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/support/spin.h#3 integrate
.. //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c#4 integrate
.. //depot/projects/arm/src/sys/gnu/fs/xfs/xfs_trans.c#4 integrate
.. //depot/projects/arm/src/sys/net/if.c#10 integrate

Differences ...

==== //depot/projects/arm/src/sys/arm/arm/pmap.c#19 (text+ko) ====

@@ -147,7 +147,7 @@
 #include "opt_vm.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.61 2006/06/10 05:20:18 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.63 2006/06/11 04:53:06 alc Exp $");
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -413,7 +413,6 @@
 static vm_paddr_t pmap_kernel_l2ptp_phys;
 static struct vm_object pvzone_obj;
 static int pv_entry_count=0, pv_entry_max=0, pv_entry_high_water=0;
-int pmap_pagedaemon_waken = 0;
 
 /*
  * This list exists for the benefit of pmap_map_chunk().  It keeps track
@@ -2262,7 +2261,6 @@
 {
 	pmap_t pm;
 	struct pcb *pcb;
-	int s;
 
 	pm = vmspace_pmap(td->td_proc->p_vmspace);
 	pcb = td->td_pcb;
@@ -2306,8 +2304,6 @@
 
 		cpu_domains(pcb->pcb_dacr);
 		cpu_setttb(pcb->pcb_pagedir);
-
-		splx(s);
 	}
 	critical_exit();
 }
@@ -2738,7 +2734,6 @@
 pmap_growkernel(vm_offset_t addr)
 {
 	pmap_t kpm = pmap_kernel();
-	int s;
 
 	if (addr <= pmap_curmaxkvaddr)
 		return;		/* we are OK */
@@ -2747,8 +2742,6 @@
 	 * whoops!   we need to add kernel PTPs
 	 */
 
-	s = splhigh();	/* to be safe */
-
 	/* Map 1MB at a time */
 	for (; pmap_curmaxkvaddr < addr; pmap_curmaxkvaddr += L1_S_SIZE)
 		pmap_grow_l2_bucket(kpm, pmap_curmaxkvaddr);
@@ -3826,11 +3819,8 @@
 	pv_entry_t ret_value;
 	
 	pv_entry_count++;
-	if ((pv_entry_count > pv_entry_high_water) &&
-	    (pmap_pagedaemon_waken == 0)) {
-	    	pmap_pagedaemon_waken = 1;
-	    	wakeup (&vm_pages_needed);
-	}
+	if (pv_entry_count > pv_entry_high_water)
+		pagedaemon_wakeup();
 	ret_value = uma_zalloc(pvzone, M_NOWAIT);
 	return ret_value;
 }
@@ -4396,13 +4386,10 @@
 {
 	pv_entry_t pv;
 	int loops = 0;
-	int s;
 	
 	if (m->flags & PG_FICTITIOUS)
 		return (FALSE);
 		
-	s = splvm();
-	
 	/*
 	 * Not found, check current mappings returning immediately
 	 */
@@ -4410,14 +4397,12 @@
 	    pv;
 	    pv = TAILQ_NEXT(pv, pv_list)) {
 	    	if (pv->pv_pmap == pmap) {
-	    		splx(s);
 	    		return (TRUE);
 	    	}
 		loops++;
 		if (loops >= 16)
 			break;
 	}
-	splx(s);
 	return (FALSE);
 }
 

==== //depot/projects/arm/src/sys/dev/acpica/acpi.c#10 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.225 2006/06/10 08:04:38 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.226 2006/06/11 20:31:41 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -522,6 +522,9 @@
 	OID_AUTO, "s4bios", CTLFLAG_RW, &sc->acpi_s4bios, 0, "S4BIOS mode");
     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
 	OID_AUTO, "verbose", CTLFLAG_RW, &sc->acpi_verbose, 0, "verbose mode");
+    SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
+	OID_AUTO, "disable_on_reboot", CTLFLAG_RW,
+	&sc->acpi_do_disable, 0, "Disable ACPI when rebooting/halting system");
 
     /*
      * Default to 1 second before sleeping to give some machines time to
@@ -1630,13 +1633,15 @@
 static void
 acpi_shutdown_final(void *arg, int howto)
 {
-    ACPI_STATUS	status;
+    struct acpi_softc *sc;
+    ACPI_STATUS status;
 
     /*
      * XXX Shutdown code should only run on the BSP (cpuid 0).
      * Some chipsets do not power off the system correctly if called from
      * an AP.
      */
+    sc = arg;
     if ((howto & RB_POWEROFF) != 0) {
 	status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
 	if (ACPI_FAILURE(status)) {
@@ -1653,7 +1658,8 @@
 	    DELAY(1000000);
 	    printf("ACPI power-off failed - timeout\n");
 	}
-    } else if ((howto & RB_AUTOBOOT) != 0 && AcpiGbl_FADT->ResetRegSup) {
+    } else if ((howto & RB_HALT) == 0 && AcpiGbl_FADT->ResetRegSup) {
+	/* Reboot using the reset register. */
 	status = AcpiHwLowLevelWrite(
 	    AcpiGbl_FADT->ResetRegister.RegisterBitWidth,
 	    AcpiGbl_FADT->ResetValue, &AcpiGbl_FADT->ResetRegister);
@@ -1663,7 +1669,11 @@
 	    DELAY(1000000);
 	    printf("ACPI reset failed - timeout\n");
 	}
-    } else if (panicstr == NULL) {
+    } else if (sc->acpi_do_disable && panicstr == NULL) {
+	/*
+	 * Only disable ACPI if the user requested.  On some systems, writing
+	 * the disable value to SMI_CMD hangs the system.
+	 */
 	printf("Shutting down ACPI\n");
 	AcpiTerminate();
     }

==== //depot/projects/arm/src/sys/dev/cardbus/cardbus.c#8 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus.c,v 1.61 2006/01/20 22:00:50 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus.c,v 1.62 2006/06/12 03:17:24 imp Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -192,11 +192,8 @@
 		dinfo->pci.cfg.dev = child;
 		resource_list_init(&dinfo->pci.resources);
 		device_set_ivars(child, dinfo);
-		if (cardbus_do_cis(cbdev, child) != 0) {
-			DEVPRINTF((cbdev, "Can't parse cis\n"));
-			pci_freecfg((struct pci_devinfo *)dinfo);
-			continue;
-		}
+		if (cardbus_do_cis(cbdev, child) != 0)
+			DEVPRINTF((cbdev, "Warning: Bogus CIS ignored\n"));
 		pci_cfg_save(dinfo->pci.cfg.dev, &dinfo->pci, 0);
 		pci_cfg_restore(dinfo->pci.cfg.dev, &dinfo->pci);
 		pci_add_resources(cbdev, child, 1, dinfo->mprefetchable);

==== //depot/projects/arm/src/sys/dev/cardbus/cardbus_cis.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.58 2006/01/03 03:36:17 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.60 2006/06/12 03:28:42 imp Exp $");
 
 /*
  * CIS Handling for the Cardbus Bus
@@ -597,7 +597,9 @@
 	bzero(tupledata, MAXTUPLESIZE);
 	expect_linktarget = TRUE;
 	if ((start = pci_read_config(child, PCIR_CIS, 4)) == 0) {
-		device_printf(cbdev, "CIS pointer is 0!\n");
+		if (cardbus_cis_debug)
+			device_printf(cbdev,
+			    "Warning: CIS pointer 0 (no CIS present)\n");
 		return (ENXIO);
 	}
 	if (cardbus_cis_debug)
@@ -639,7 +641,6 @@
 int
 cardbus_do_cis(device_t cbdev, device_t child)
 {
-	int ret;
 	struct tuple_callbacks init_callbacks[] = {
 		MAKETUPLE(LONGLINK_CB,		unhandled),
 		MAKETUPLE(INDIRECT,		unhandled),
@@ -656,8 +657,5 @@
 		MAKETUPLE(GENERIC,		generic),
 	};
 
-	ret = cardbus_parse_cis(cbdev, child, init_callbacks, NULL);
-	if (ret < 0)
-		return (ret);
-	return 0;
+	return (cardbus_parse_cis(cbdev, child, init_callbacks, NULL));
 }

==== //depot/projects/arm/src/sys/dev/cm/if_cm_isa.c#3 (text+ko) ====

@@ -1,7 +1,7 @@
 /*	$NetBSD: if_bah_zbus.c,v 1.6 2000/01/23 21:06:12 aymeric Exp $ */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cm/if_cm_isa.c,v 1.8 2005/09/19 03:10:15 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cm/if_cm_isa.c,v 1.9 2006/06/11 22:25:01 fjoe Exp $");
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -48,10 +48,13 @@
 #include <sys/bus.h>
 
 #include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
 
 #include <net/if.h>
 #include <net/if_arc.h>
 
+#include <dev/cm/smc90cx6reg.h>
 #include <dev/cm/smc90cx6var.h>
 
 static int cm_isa_probe		(device_t);
@@ -62,20 +65,35 @@
 	device_t dev;
 {
 	struct cm_softc *sc = device_get_softc(dev);
-	int error;
+	int rid;
+
+	rid = 0;
+	sc->port_res = bus_alloc_resource(
+	    dev, SYS_RES_IOPORT, &rid, 0ul, ~0ul, CM_IO_PORTS, RF_ACTIVE);
+	if (sc->port_res == NULL)
+		return (ENOENT);
 
-	bzero(sc, sizeof(struct cm_softc));
+	if (GETREG(CMSTAT) == 0xff) {
+		cm_release_resources(dev);
+		return (ENXIO);
+	}
 
-	error = cm_probe(dev);
-	if (error == 0)
-		goto end;
+	rid = 0;
+	sc->mem_res = bus_alloc_resource(
+	    dev, SYS_RES_MEMORY, &rid, 0ul, ~0ul, CM_MEM_SIZE, RF_ACTIVE);
+	if (sc->mem_res == NULL) {
+		cm_release_resources(dev);
+		return (ENOENT);
+	}
 
-end:
-	if (error == 0)
-		error = cm_alloc_irq(dev, 0);
+	rid = 0;
+	sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE);
+	if (sc->irq_res == NULL) {
+		cm_release_resources(dev);
+		return (ENOENT);
+	}
 
-	cm_release_resources(dev);
-	return (error);
+	return (0);
 }
 
 static int
@@ -85,18 +103,25 @@
 	struct cm_softc *sc = device_get_softc(dev);
 	int error;
 
-	cm_alloc_port(dev, sc->port_rid, sc->port_used);
-	cm_alloc_memory(dev, sc->mem_rid, sc->mem_used);
-	cm_alloc_irq(dev, sc->irq_rid);
+	/* init mtx and setup interrupt */
+	mtx_init(&sc->sc_mtx, device_get_nameunit(dev),
+	    MTX_NETWORK_LOCK, MTX_DEF);
+	error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE,
+	    cmintr, sc, &sc->irq_handle);
+	if (error)
+		goto err;
+
+	/* attach */
+	error = cm_attach(dev);
+	if (error)
+		goto err;
 
-	error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
-			       cmintr, sc, &sc->irq_handle);
-	if (error) {
-		cm_release_resources(dev);
-		return (error);
-	}
+	return 0;
 
-	return cm_attach(dev);
+err:
+	mtx_destroy(&sc->sc_mtx);
+	cm_release_resources(dev);
+	return (error);
 }
 
 static int
@@ -104,19 +129,23 @@
 {
 	struct cm_softc *sc = device_get_softc(dev);
 	struct ifnet *ifp = sc->sc_ifp;
-	int s;
 
-	cm_stop(sc);
+	/* stop and detach */
+	CM_LOCK(sc);
+	cm_stop_locked(sc);
 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+	CM_UNLOCK(sc);
 
-	s = splimp();
+	callout_drain(&sc->sc_recon_ch);
 	arc_ifdetach(ifp);
-	splx(s);
 
+	/* teardown interrupt, destroy mtx and release resources */
 	bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
+	mtx_destroy(&sc->sc_mtx);
 	if_free(ifp);
 	cm_release_resources(dev);
 
+	bus_generic_detach(dev);
 	return (0);
 }
 

==== //depot/projects/arm/src/sys/dev/cm/smc90cx6.c#3 (text+ko) ====

@@ -1,7 +1,7 @@
 /*	$NetBSD: smc90cx6.c,v 1.38 2001/07/07 15:57:53 thorpej Exp $ */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cm/smc90cx6.c,v 1.16 2005/08/09 10:19:44 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cm/smc90cx6.c,v 1.17 2006/06/11 22:25:01 fjoe Exp $");
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -62,10 +62,6 @@
 #include <sys/rman.h>
 #include <machine/resource.h>
 
-#if __FreeBSD_version < 500000
-#include <machine/clock.h>
-#endif
-
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
@@ -87,25 +83,6 @@
 /* for watchdog timer. This should be more than enough. */
 #define ARCTIMEOUT (5*IFNET_SLOWHZ)
 
-/* short notation */
-
-#define GETREG(off)							\
-	bus_space_read_1(rman_get_bustag((sc)->port_res),		\
-			 rman_get_bushandle((sc)->port_res),		\
-			 (off))
-#define PUTREG(off, value)						\
-	bus_space_write_1(rman_get_bustag((sc)->port_res),		\
-			  rman_get_bushandle((sc)->port_res),		\
-			  (off), (value))
-#define GETMEM(off)							\
-	bus_space_read_1(rman_get_bustag((sc)->mem_res),		\
-			 rman_get_bushandle((sc)->mem_res),		\
-			 (off))
-#define PUTMEM(off, value)						\
-	bus_space_write_1(rman_get_bustag((sc)->mem_res),		\
-			  rman_get_bushandle((sc)->mem_res),		\
-			  (off), (value))
-
 devclass_t cm_devclass;
 
 /*
@@ -134,7 +111,7 @@
  * case 2: set IFF_DRV_OACTIVE to stop arc_output from filling us.
  * case 1: start tx
  *
- * tint clears IFF_OCATIVE, decrements and checks tx_fillcount
+ * tint clears IFF_OACTIVE, decrements and checks tx_fillcount
  * case 1: start tx on tx_act ^ 1, softcall cm_start
  * case 0: softcall cm_start
  *
@@ -142,105 +119,17 @@
  */
 
 void	cm_init(void *);
-void	cm_reset(struct cm_softc *);
+static void cm_init_locked(struct cm_softc *);
+static void cm_reset_locked(struct cm_softc *);
 void	cm_start(struct ifnet *);
+void	cm_start_locked(struct ifnet *);
 int	cm_ioctl(struct ifnet *, unsigned long, caddr_t);
 void	cm_watchdog(struct ifnet *);
-void	cm_srint(void *vsc);
-static	void cm_tint(struct cm_softc *, int);
-void	cm_reconwatch(void *);
+void	cm_srint_locked(void *vsc);
+static	void cm_tint_locked(struct cm_softc *, int);
+void	cm_reconwatch_locked(void *);
 
-int
-cm_probe(dev)
-	device_t dev;
-{
-	int error;
-	struct cm_softc *sc = device_get_softc(dev);
-
-	error = cm_alloc_port(dev, 0, CM_IO_PORTS);
-	if (error)
-		return error;
-
-	if (GETREG(CMSTAT) == 0xff)
-		return ENXIO;
-
-	error = cm_alloc_memory(dev, 0, 0x800);
-	if (error)
-		return error;
-
-	return 0;
-}
-
 /*
- * Allocate a port resource with the given resource id.
- */
-int
-cm_alloc_port(dev, rid, size)
-	device_t dev;
-	int rid;
-	int size;
-{
-	struct cm_softc *sc = device_get_softc(dev);
-	struct resource *res;
-
-	res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
-				 0ul, ~0ul, size, RF_ACTIVE);
-	if (res) {
-		sc->port_rid = rid;
-		sc->port_res = res;
-		sc->port_used = size;
-		return (0);
-	} else {
-		return (ENOENT);
-	}
-}
-
-/*
- * Allocate a memory resource with the given resource id.
- */
-int
-cm_alloc_memory(dev, rid, size)
-	device_t dev;
-	int rid;
-	int size;
-{
-	struct cm_softc *sc = device_get_softc(dev);
-	struct resource *res;
-
-	res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
-				 0ul, ~0ul, size, RF_ACTIVE);
-	if (res) {
-		sc->mem_rid = rid;
-		sc->mem_res = res;
-		sc->mem_used = size;
-		return (0);
-	} else {
-		return (ENOENT);
-	}
-}
-
-/*
- * Allocate an irq resource with the given resource id.
- */
-int
-cm_alloc_irq(dev, rid)
-	device_t dev;
-	int rid;
-{
-	struct cm_softc *sc = device_get_softc(dev);
-	struct resource *res;
-
-	res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE);
-	if (res) {
-		sc->irq_rid = rid;
-		sc->irq_res = res;
-		return (0);
-	} else {
-		return (ENOENT);
-	}
-}
-
-/*
  * Release all resources
  */
 void
@@ -249,26 +138,26 @@
 {
 	struct cm_softc *sc = device_get_softc(dev);
 
-	if (sc->port_res) {
+	if (sc->port_res != NULL) {
 		bus_deactivate_resource(dev, SYS_RES_IOPORT,
-				     sc->port_rid, sc->port_res);
+				     0, sc->port_res);
 		bus_release_resource(dev, SYS_RES_IOPORT,
-				     sc->port_rid, sc->port_res);
-		sc->port_res = 0;
+				     0, sc->port_res);
+		sc->port_res = NULL;
 	}
-	if (sc->mem_res) {
+	if (sc->mem_res != NULL) {
 		bus_deactivate_resource(dev, SYS_RES_MEMORY,
-				     sc->mem_rid, sc->mem_res);
+				     0, sc->mem_res);
 		bus_release_resource(dev, SYS_RES_MEMORY,
-				     sc->mem_rid, sc->mem_res);
-		sc->mem_res = 0;
+				     0, sc->mem_res);
+		sc->mem_res = NULL;
 	}
-	if (sc->irq_res) {
+	if (sc->irq_res != NULL) {
 		bus_deactivate_resource(dev, SYS_RES_IRQ,
-				     sc->irq_rid, sc->irq_res);
+				     0, sc->irq_res);
 		bus_release_resource(dev, SYS_RES_IRQ,
-				     sc->irq_rid, sc->irq_res);
-		sc->irq_res = 0;
+				     0, sc->irq_res);
+		sc->irq_res = NULL;
 	}
 }
 
@@ -278,29 +167,22 @@
 {
 	struct cm_softc *sc = device_get_softc(dev);
 	struct ifnet *ifp;
-	int s;
 	u_int8_t linkaddress;
 
 	ifp = sc->sc_ifp = if_alloc(IFT_ARCNET);
-	if (ifp == NULL) {
+	if (ifp == NULL)
 		return (ENOSPC);
-	}
 
-	s = splhigh();
-
 	/*
 	 * read the arcnet address from the board
 	 */
-
 	GETREG(CMRESET);
 	do {
 		DELAY(200);
 	} while (!(GETREG(CMSTAT) & CM_POR));
-
 	linkaddress = GETMEM(CMMACOFF);
 
 	/* clear the int mask... */
-
 	sc->sc_intmask = 0;
 	PUTREG(CMSTAT, 0);
 
@@ -308,13 +190,10 @@
 	PUTREG(CMCMD, CM_CLR(CLR_POR|CLR_RECONFIG));
 	sc->sc_recontime = sc->sc_reconcount = 0;
 
-	/* and reenable kernel int level */
-	splx(s);
-
 	/*
 	 * set interface to stopped condition (reset)
 	 */
-	cm_stop(sc);
+	cm_stop_locked(sc);
 
 	ifp->if_softc = sc;
 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
@@ -326,7 +205,7 @@
 	/* XXX IFQ_SET_READY(&ifp->if_snd); */
 	ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
 	ifp->if_timer = 0;
-	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NEEDSGIANT;
+	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX;
 
 	arc_ifattach(ifp, linkaddress);
 
@@ -336,11 +215,7 @@
 		(void (*)(void *))cm_start, ifp);
 #endif
 
-#if __FreeBSD_version < 500000
-	callout_init(&sc->sc_recon_ch);
-#else
-	callout_init(&sc->sc_recon_ch, 0);
-#endif
+	callout_init_mtx(&sc->sc_recon_ch, &sc->sc_mtx, 0);
 
 	if_printf(ifp, "link addr 0x%02x (%d)\n", linkaddress, linkaddress);
 	return 0;
@@ -355,28 +230,30 @@
 	void *xsc;
 {
 	struct cm_softc *sc = (struct cm_softc *)xsc;
-	struct ifnet *ifp;
-	int s;
+
+	CM_LOCK(sc);
+	cm_init_locked(sc);
+	CM_UNLOCK(sc);
+}
 
-	ifp = sc->sc_ifp;
+static void
+cm_init_locked(struct cm_softc *sc)
+{
+	struct ifnet *ifp = sc->sc_ifp;
 
 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-		s = splimp();
 		ifp->if_drv_flags |= IFF_DRV_RUNNING;
-		cm_reset(sc);
-		cm_start(ifp);
-		splx(s);
+		cm_reset_locked(sc);
 	}
 }
 
 /*
  * Reset the interface...
  *
- * this assumes that it is called inside a critical section...
- *
+ * Assumes that it is called with sc_mtx held
  */
 void
-cm_reset(sc)
+cm_reset_locked(sc)
 	struct cm_softc *sc;
 {
 	struct ifnet *ifp;
@@ -444,14 +321,14 @@
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
-	cm_start(ifp);
+	cm_start_locked(ifp);
 }
 
 /*
  * Take interface offline
  */
 void
-cm_stop(sc)
+cm_stop_locked(sc)
 	struct cm_softc *sc;
 {
 	/* Stop the interrupts */
@@ -464,24 +341,32 @@
 	sc->sc_ifp->if_timer = 0;
 }
 
+void
+cm_start(struct ifnet *ifp)
+{
+	struct cm_softc *sc = ifp->if_softc;
+
+	CM_LOCK(sc);
+	cm_start_locked(ifp);
+	CM_UNLOCK(sc);
+}
+
 /*
  * Start output on interface. Get another datagram to send
  * off the interface queue, and copy it to the
  * interface becore starting the output
  *
- * this assumes that it is called inside a critical section...
- * XXX hm... does it still?
- *
+ * Assumes that sc_mtx is held
  */
 void
-cm_start(ifp)
+cm_start_locked(ifp)
 	struct ifnet *ifp;
 {
 	struct cm_softc *sc = ifp->if_softc;
-	struct mbuf *m,*mp;
+	struct mbuf *m, *mp;
 
 	int cm_ram_ptr;
-	int len, tlen, offset, s, buffer;
+	int len, tlen, offset, buffer;
 #ifdef CMTIMINGS
 	u_long copystart, lencopy, perbyte;
 #endif
@@ -493,18 +378,12 @@
 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
 		return;
 
-	s = splimp();
-
-	if (sc->sc_tx_fillcount >= 2) {
-		splx(s);
+	if (sc->sc_tx_fillcount >= 2)
 		return;
-	}
 
 	m = arc_frag_next(ifp);
 	buffer = sc->sc_tx_act ^ 1;
 
-	splx(s);
-
 	if (m == 0)
 		return;
 
@@ -569,9 +448,6 @@
 	sc->sc_broadcast[buffer] = (m->m_flags & M_BCAST) != 0;
 	sc->sc_retransmits[buffer] = (m->m_flags & M_BCAST) ? 1 : 5;
 
-	/* actually transmit the packet */
-	s = splimp();
-
 	if (++sc->sc_tx_fillcount > 1) {
 		/*
 		 * We are filled up to the rim. No more bufs for the moment,
@@ -596,7 +472,6 @@
 
 		ifp->if_timer = ARCTIMEOUT;
 	}
-	splx(s);
 	m_freem(m);
 
 	/*
@@ -605,20 +480,30 @@
 	 * the hardware retries till shutdown.
 	 * This is integrated now in the code above.
 	 */
+}
+
+#ifdef CMSOFTCOPY
+void
+cm_srint(void *vsc)
+{
+	struct cm_softc *sc = (struct cm_softc *)vsc;
 
-	return;
+	CM_LOCK(sc);
+	cm_srint_locked(vsc);
+	CM_UNLOCK(sc);
 }
+#endif
 
 /*
  * Arcnet interface receiver soft interrupt:
  * get the stuff out of any filled buffer we find.
  */
 void
-cm_srint(vsc)
+cm_srint_locked(vsc)
 	void *vsc;
 {
 	struct cm_softc *sc = (struct cm_softc *)vsc;
-	int buffer, len, offset, s, type;
+	int buffer, len, offset, type;
 	int cm_ram_ptr;
 	struct mbuf *m;
 	struct arc_header *ah;
@@ -626,9 +511,7 @@
 
 	ifp = sc->sc_ifp;
 
-	s = splimp();
 	buffer = sc->sc_rx_act ^ 1;
-	splx(s);
 
 	/* Allocate header mbuf */
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
@@ -695,7 +578,9 @@
 	    rman_get_bustag(sc->mem_res), rman_get_bushandle(sc->mem_res),
 	    cm_ram_ptr + offset, mtod(m, u_char *) + 2, len);
 
+	CM_UNLOCK(sc);
 	arc_input(ifp, m);
+	CM_LOCK(sc);
 
 	m = NULL;
 	ifp->if_ipackets++;
@@ -707,8 +592,6 @@
 
 	/* mark buffer as invalid by source id 0 */
 	PUTMEM(buffer << 9, 0);
-	s = splimp();
-
 	if (--sc->sc_rx_fillcount == 2 - 1) {
 
 		/* was off, restart it on buffer just emptied */
@@ -723,11 +606,10 @@
 		if_printf(ifp, "srint: restarted rx on buf %d\n", buffer);
 #endif
 	}
-	splx(s);
 }
 
 __inline static void
-cm_tint(sc, isr)
+cm_tint_locked(sc, isr)
 	struct cm_softc *sc;
 	int isr;
 {
@@ -807,7 +689,7 @@
 	softintr_schedule(sc->sc_txcookie);
 #else
 	/* call it directly */
-	cm_start(ifp);
+	cm_start_locked(ifp);
 #endif
 }
 
@@ -825,10 +707,15 @@
 	int buffer;
 	u_long newsec;
 
+	CM_LOCK(sc);
+
 	isr = GETREG(CMSTAT);
 	maskedisr = isr & sc->sc_intmask;
-	if (!maskedisr)
+	if (!maskedisr || (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
+		CM_UNLOCK(sc);
 		return;
+	}
+
 	do {
 
 #if defined(CM_DEBUG) && (CM_DEBUG > 1)
@@ -881,7 +768,7 @@
 			}
 			sc->sc_recontime = newsec;
 			callout_reset(&sc->sc_recon_ch, 15 * hz,
-			    cm_reconwatch, (void *)sc);
+			    cm_reconwatch_locked, (void *)sc);
 		}
 
 		if (maskedisr & CM_RI) {
@@ -936,12 +823,12 @@
 				softintr_schedule(sc->sc_rxcookie);
 #else
 				/* this one does the copy here */
-				cm_srint(sc);
+				cm_srint_locked(sc);
 #endif
 			}
 		}
 		if (maskedisr & CM_TA) {
-			cm_tint(sc, isr);
+			cm_tint_locked(sc, isr);
 		}
 		isr = GETREG(CMSTAT);
 		maskedisr = isr & sc->sc_intmask;
@@ -950,10 +837,11 @@
 	if_printf(ifp, "intr (exit): status 0x%02x, intmask 0x%02x\n",
 	    isr, sc->sc_intmask);
 #endif
+	CM_UNLOCK(sc);
 }
 
 void
-cm_reconwatch(arg)
+cm_reconwatch_locked(arg)
 	void *arg;
 {
 	struct cm_softc *sc = arg;
@@ -981,13 +869,12 @@
 	struct cm_softc *sc;
 	struct ifaddr *ifa;
 	struct ifreq *ifr;
-	int s, error;
+	int error;
 
 	error = 0;
 	sc = ifp->if_softc;
 	ifa = (struct ifaddr *)data;
 	ifr = (struct ifreq *)data;
-	s = splimp();
 
 #if defined(CM_DEBUG) && (CM_DEBUG > 2)
 	if_printf(ifp, "ioctl() called, cmd = 0x%lx\n", command);
@@ -1003,13 +890,14 @@
 		break;
 
 	case SIOCSIFFLAGS:
+		CM_LOCK(sc);
 		if ((ifp->if_flags & IFF_UP) == 0 &&
 		    (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
 			/*
 			 * If interface is marked down and it is running,
 			 * then stop it.
 			 */
-			cm_stop(sc);
+			cm_stop_locked(sc);
 			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 		} else if ((ifp->if_flags & IFF_UP) != 0 &&
 			   (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
@@ -1017,8 +905,9 @@
 			 * If interface is marked up and it is stopped, then
 			 * start it.
 			 */
-			cm_init(sc);
+			cm_init_locked(sc);
 		}
+		CM_UNLOCK(sc);
 		break;
 
 	default:
@@ -1026,7 +915,6 @@
 		break;
 	}
 
-	splx(s);
 	return (error);
 }
 
@@ -1040,16 +928,14 @@
  * Only thing we do is disable transmitter. We'll get a transmit timeout,
  * and the int handler will have to decide not to retransmit (in case
  * retransmission is implemented).
- *
- * This one assumes being called inside splimp()
  */
-
 void
 cm_watchdog(ifp)
 	struct ifnet *ifp;
 {
 	struct cm_softc *sc = ifp->if_softc;
 
+	CM_LOCK(sc);
 	PUTREG(CMCMD, CM_TXDIS);
-	return;

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


More information about the p4-projects mailing list