Module Name:    src
Committed By:   dyoung
Date:           Thu Jul 16 18:58:38 UTC 2009

Modified Files:
        src/sys/dev/ic: mfi.c mfivar.h
        src/sys/dev/pci: mfi_pci.c

Log Message:
Let us detach & re-attach children of mfi0.  Detach mfi0 at shutdown.

Detachment may fail after freeing some but not all resources, so
take care not to re-release any resource during detachment.

Tested on a Dell PowerEdge 1950.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/ic/mfi.c
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/ic/mfivar.h
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/mfi_pci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/mfi.c
diff -u src/sys/dev/ic/mfi.c:1.26 src/sys/dev/ic/mfi.c:1.27
--- src/sys/dev/ic/mfi.c:1.26	Thu Jul 16 18:10:00 2009
+++ src/sys/dev/ic/mfi.c	Thu Jul 16 18:58:38 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi.c,v 1.26 2009/07/16 18:10:00 dyoung Exp $ */
+/* $NetBSD: mfi.c,v 1.27 2009/07/16 18:58:38 dyoung Exp $ */
 /* $OpenBSD: mfi.c,v 1.66 2006/11/28 23:59:45 dlg Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <ma...@peereboom.us>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.26 2009/07/16 18:10:00 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.27 2009/07/16 18:58:38 dyoung Exp $");
 
 #include "bio.h"
 
@@ -70,7 +70,7 @@
 static int		mfi_init_ccb(struct mfi_softc *);
 
 static struct mfi_mem	*mfi_allocmem(struct mfi_softc *, size_t);
-static void		mfi_freemem(struct mfi_softc *, struct mfi_mem *);
+static void		mfi_freemem(struct mfi_softc *, struct mfi_mem **);
 
 static int		mfi_transition_firmware(struct mfi_softc *);
 static int		mfi_initialize_firmware(struct mfi_softc *);
@@ -345,8 +345,15 @@
 }
 
 static void
-mfi_freemem(struct mfi_softc *sc, struct mfi_mem *mm)
+mfi_freemem(struct mfi_softc *sc, struct mfi_mem **mmp)
 {
+	struct mfi_mem *mm = *mmp;
+
+	if (mm == NULL)
+		return;
+
+	*mmp = NULL;
+
 	DNPRINTF(MFI_D_MEM, "%s: mfi_freemem: %p\n", DEVNAME(sc), mm);
 
 	bus_dmamap_unload(sc->sc_dmat, mm->am_map);
@@ -629,6 +636,32 @@
 }
 
 int
+mfi_rescan(device_t self, const char *ifattr, const int *locators)
+{
+	struct mfi_softc *sc = device_private(self);
+
+	if (sc->sc_child != NULL)
+		return 0;
+
+	sc->sc_child = config_found_sm_loc(self, ifattr, locators, &sc->sc_chan,
+	    scsiprint, NULL);
+
+	return 0;
+}
+
+void
+mfi_childdetached(device_t self, device_t child)
+{
+	struct mfi_softc *sc = device_private(self);
+
+	KASSERT(self == sc->sc_dev);
+	KASSERT(child == sc->sc_child);
+
+	if (child == sc->sc_child)
+		sc->sc_child = NULL;
+}
+
+int
 mfi_detach(struct mfi_softc *sc, int flags)
 {
 	int			error;
@@ -650,11 +683,11 @@
 	if ((error = mfi_destroy_ccb(sc)) != 0)
 		return error;
 
-	mfi_freemem(sc, sc->sc_sense);
+	mfi_freemem(sc, &sc->sc_sense);
 
-	mfi_freemem(sc, sc->sc_frames);
+	mfi_freemem(sc, &sc->sc_frames);
 
-	mfi_freemem(sc, sc->sc_pcq);
+	mfi_freemem(sc, &sc->sc_pcq);
 
 	return 0;
 }
@@ -779,7 +812,7 @@
 	chan->chan_ntargets = MFI_MAX_LD;
 	chan->chan_id = MFI_MAX_LD;
 
-	(void)config_found(sc->sc_dev, &sc->sc_chan, scsiprint);
+	mfi_rescan(sc->sc_dev, "scsi", NULL);
 
 	/* enable interrupts */
 	mfi_intr_enable(sc);
@@ -793,11 +826,11 @@
 
 	return 0;
 noinit:
-	mfi_freemem(sc, sc->sc_sense);
+	mfi_freemem(sc, &sc->sc_sense);
 nosense:
-	mfi_freemem(sc, sc->sc_frames);
+	mfi_freemem(sc, &sc->sc_frames);
 noframe:
-	mfi_freemem(sc, sc->sc_pcq);
+	mfi_freemem(sc, &sc->sc_pcq);
 nopcq:
 	return 1;
 }
@@ -1940,7 +1973,10 @@
 static int
 mfi_destroy_sensors(struct mfi_softc *sc)
 {
+	if (sc->sc_sme == NULL)
+		return 0;
 	sysmon_envsys_unregister(sc->sc_sme);
+	sc->sc_sme = NULL;
 	free(sc->sc_sensor, M_DEVBUF);
 	return 0;
 }

Index: src/sys/dev/ic/mfivar.h
diff -u src/sys/dev/ic/mfivar.h:1.12 src/sys/dev/ic/mfivar.h:1.13
--- src/sys/dev/ic/mfivar.h:1.12	Thu Jul 16 18:10:00 2009
+++ src/sys/dev/ic/mfivar.h	Thu Jul 16 18:58:38 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: mfivar.h,v 1.12 2009/07/16 18:10:00 dyoung Exp $ */
+/* $NetBSD: mfivar.h,v 1.13 2009/07/16 18:58:38 dyoung Exp $ */
 /* $OpenBSD: mfivar.h,v 1.28 2006/08/31 18:18:46 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <ma...@peereboom.us>
@@ -161,8 +161,11 @@
 	struct sysmon_envsys    *sc_sme;
 	envsys_data_t		*sc_sensor;
 
+	device_t		sc_child;
 };
 
+int	mfi_rescan(device_t, const char *, const int *);
+void	mfi_childdetached(device_t, device_t);
 int	mfi_attach(struct mfi_softc *, enum mfi_iop);
 int	mfi_detach(struct mfi_softc *, int);
 int	mfi_intr(void *);

Index: src/sys/dev/pci/mfi_pci.c
diff -u src/sys/dev/pci/mfi_pci.c:1.10 src/sys/dev/pci/mfi_pci.c:1.11
--- src/sys/dev/pci/mfi_pci.c:1.10	Thu Jul 16 18:10:00 2009
+++ src/sys/dev/pci/mfi_pci.c	Thu Jul 16 18:58:38 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi_pci.c,v 1.10 2009/07/16 18:10:00 dyoung Exp $ */
+/* $NetBSD: mfi_pci.c,v 1.11 2009/07/16 18:58:38 dyoung Exp $ */
 /* $OpenBSD: mfi_pci.c,v 1.11 2006/08/06 04:40:08 brad Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <ma...@peereboom.us>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfi_pci.c,v 1.10 2009/07/16 18:10:00 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi_pci.c,v 1.11 2009/07/16 18:58:38 dyoung Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -50,8 +50,9 @@
 void	mfi_pci_attach(device_t, device_t, void *);
 int	mfi_pci_detach(device_t, int);
 
-CFATTACH_DECL_NEW(mfi_pci, sizeof(struct mfi_pci_softc),
-    mfi_pci_match, mfi_pci_attach, mfi_pci_detach, NULL);
+CFATTACH_DECL3_NEW(mfi_pci, sizeof(struct mfi_pci_softc),
+    mfi_pci_match, mfi_pci_attach, mfi_pci_detach, NULL, mfi_rescan,
+    mfi_childdetached, DVF_DETACH_SHUTDOWN);
 
 struct mfi_pci_subtype {
 	pcireg_t 	st_vendor;

Reply via email to