Module Name:    src
Committed By:   tsutsui
Date:           Wed Sep  2 16:38:17 UTC 2009

Modified Files:
        src/sys/dev/ic: aic79xx.c aic79xx_osm.c

Log Message:
Replace shutdownhook_establish(9) with pmf_device_register1(9).
Untested, but mostly copied from ahc(4).

This may fix reboot failure problem on ahd(4) after pmf(9) merge:
http://mail-index.NetBSD.org/current-users/2007/12/10/0008.html
which was also seen on old ahc(4):
http://mail-index.NetBSD.org/port-sgimips/2008/01/05/msg000003.html


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/ic/aic79xx.c
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/ic/aic79xx_osm.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/aic79xx.c
diff -u src/sys/dev/ic/aic79xx.c:1.41 src/sys/dev/ic/aic79xx.c:1.42
--- src/sys/dev/ic/aic79xx.c:1.41	Wed Mar 18 16:00:18 2009
+++ src/sys/dev/ic/aic79xx.c	Wed Sep  2 16:38:17 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: aic79xx.c,v 1.41 2009/03/18 16:00:18 cegger Exp $	*/
+/*	$NetBSD: aic79xx.c,v 1.42 2009/09/02 16:38:17 tsutsui Exp $	*/
 
 /*
  * Core routines and tables shareable across OS platforms.
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: aic79xx.c,v 1.41 2009/03/18 16:00:18 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: aic79xx.c,v 1.42 2009/09/02 16:38:17 tsutsui Exp $");
 
 #include <dev/ic/aic79xx_osm.h>
 #include <dev/ic/aic79xx_inline.h>
@@ -6177,9 +6177,6 @@
 	ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
 			ahd_stat_timer, ahd);
 
-	/* We have to wait until after any system dumps... */
-	ahd->shutdown_hook = shutdownhook_establish(ahd_shutdown, ahd);
-
 	return (0);
 }
 

Index: src/sys/dev/ic/aic79xx_osm.c
diff -u src/sys/dev/ic/aic79xx_osm.c:1.21 src/sys/dev/ic/aic79xx_osm.c:1.22
--- src/sys/dev/ic/aic79xx_osm.c:1.21	Tue May 12 14:25:17 2009
+++ src/sys/dev/ic/aic79xx_osm.c	Wed Sep  2 16:38:17 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: aic79xx_osm.c,v 1.21 2009/05/12 14:25:17 cegger Exp $	*/
+/*	$NetBSD: aic79xx_osm.c,v 1.22 2009/09/02 16:38:17 tsutsui Exp $	*/
 
 /*
  * Bus independent NetBSD shim for the aic7xxx based adaptec SCSI controllers
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: aic79xx_osm.c,v 1.21 2009/05/12 14:25:17 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: aic79xx_osm.c,v 1.22 2009/09/02 16:38:17 tsutsui Exp $");
 
 #include <dev/ic/aic79xx_osm.h>
 #include <dev/ic/aic79xx_inline.h>
@@ -64,6 +64,10 @@
 static void	ahd_set_recoveryscb(struct ahd_softc *ahd, struct scb *scb);
 #endif
 
+static bool	ahd_pmf_suspend(device_t PMF_FN_PROTO);
+static bool	ahd_pmf_resume(device_t PMF_FN_PROTO);
+static bool	ahd_pmf_shutdown(device_t, int);
+
 /*
  * Attach all the sub-devices we can find
  */
@@ -103,11 +107,51 @@
 	if (ahd->flags & AHD_RESET_BUS_A)
 		ahd_reset_channel(ahd, 'A', TRUE);
 
+	if (!pmf_device_register1(&ahd->sc_dev,
+	    ahd_pmf_suspend, ahd_pmf_resume, ahd_pmf_shutdown))
+		aprint_error_dev(&ahd->sc_dev,
+		    "couldn't establish power handler\n");
+
         ahd_unlock(ahd, &s);
 
 	return (1);
 }
 
+static bool
+ahd_pmf_suspend(device_t dev PMF_FN_ARGS)
+{
+	struct ahd_softc *sc = device_private(dev);
+#if 0
+	return (ahd_suspend(sc) == 0);
+#else
+	ahd_shutdown(sc);
+	return true;
+#endif
+}
+
+static bool
+ahd_pmf_resume(device_t dev PMF_FN_ARGS)
+{
+#if 0
+	struct ahd_softc *sc = device_private(dev);
+
+	return (ahd_resume(sc) == 0);
+#else
+	return true;
+#endif
+}
+
+static bool
+ahd_pmf_shutdown(device_t dev, int howto)
+{
+	struct ahd_softc *sc = device_private(dev);
+
+	/* Disable all interrupt sources by resetting the controller */
+	ahd_shutdown(sc);
+
+	return true;
+}
+
 static int
 ahd_ioctl(struct scsipi_channel *channel, u_long cmd,
 	  void *addr, int flag, struct proc *p)
@@ -766,7 +810,7 @@
 	if (ahd->sc_child != NULL)
 		rv = config_detach((void *)ahd->sc_child, flags);
 
-	shutdownhook_disestablish(ahd->shutdown_hook);
+	pmf_device_deregister(&ahd->sc_dev);
 
 	ahd_free(ahd);
 

Reply via email to