Module Name:    src
Committed By:   msaitoh
Date:           Sat Dec  1 01:51:38 UTC 2018

Modified Files:
        src/sys/kern: subr_autoconf.c
        src/sys/sys: device.h

Log Message:
 Add new dv_flags value DVF_ATTACH_INPROGRESS. Currenty, this flags is used
only for checking the registration of pmf.

 This flag should be set when an attach function(ca_attach) doesn't complete
the whole attach work when the function returned. config_interrupts() set it.
It's also required for device drivers who do a part of the attach work in their
own kthread to set it.


To generate a diff of this commit:
cvs rdiff -u -r1.263 -r1.264 src/sys/kern/subr_autoconf.c
cvs rdiff -u -r1.156 -r1.157 src/sys/sys/device.h

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

Modified files:

Index: src/sys/kern/subr_autoconf.c
diff -u src/sys/kern/subr_autoconf.c:1.263 src/sys/kern/subr_autoconf.c:1.264
--- src/sys/kern/subr_autoconf.c:1.263	Tue Sep 18 01:25:09 2018
+++ src/sys/kern/subr_autoconf.c	Sat Dec  1 01:51:38 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_autoconf.c,v 1.263 2018/09/18 01:25:09 mrg Exp $ */
+/* $NetBSD: subr_autoconf.c,v 1.264 2018/12/01 01:51:38 msaitoh Exp $ */
 
 /*
  * Copyright (c) 1996, 2000 Christopher G. Demetriou
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.263 2018/09/18 01:25:09 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.264 2018/12/01 01:51:38 msaitoh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -446,6 +446,11 @@ config_interrupts_thread(void *cookie)
 	while ((dc = TAILQ_FIRST(&interrupt_config_queue)) != NULL) {
 		TAILQ_REMOVE(&interrupt_config_queue, dc, dc_queue);
 		(*dc->dc_func)(dc->dc_dev);
+		dc->dc_dev->dv_flags &= ~DVF_ATTACH_INPROGRESS;
+		if (!device_pmf_is_registered(dc->dc_dev))
+			aprint_debug_dev(dc->dc_dev,
+			    "WARNING: power management not supported\n",
+			    device_xname(dc->dc_dev));
 		config_pending_decr(dc->dc_dev);
 		kmem_free(dc, sizeof(*dc));
 	}
@@ -1597,9 +1602,10 @@ config_attach_loc(device_t parent, cfdat
 
 	(*dev->dv_cfattach->ca_attach)(parent, dev, aux);
 
-	if (!device_pmf_is_registered(dev))
-		aprint_debug_dev(dev, "WARNING: power management not "
-		    "supported\n");
+	if (((dev->dv_flags & DVF_ATTACH_INPROGRESS) == 0)
+	    && !device_pmf_is_registered(dev))
+		aprint_debug_dev(dev,
+		    "WARNING: power management not supported\n");
 
 	config_process_deferred(&deferred_config_queue, dev);
 
@@ -1996,6 +2002,7 @@ config_interrupts(device_t dev, void (*f
 	dc->dc_func = func;
 	TAILQ_INSERT_TAIL(&interrupt_config_queue, dc, dc_queue);
 	config_pending_incr(dev);
+	dev->dv_flags |= DVF_ATTACH_INPROGRESS;
 }
 
 /*

Index: src/sys/sys/device.h
diff -u src/sys/sys/device.h:1.156 src/sys/sys/device.h:1.157
--- src/sys/sys/device.h:1.156	Tue Sep 18 01:25:09 2018
+++ src/sys/sys/device.h	Sat Dec  1 01:51:38 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: device.h,v 1.156 2018/09/18 01:25:09 mrg Exp $ */
+/* $NetBSD: device.h,v 1.157 2018/12/01 01:51:38 msaitoh Exp $ */
 
 /*
  * Copyright (c) 1996, 2000 Christopher G. Demetriou
@@ -202,6 +202,7 @@ struct device {
 #define	DVF_CLASS_SUSPENDED	0x0008	/* device class suspend was called */
 #define	DVF_DRIVER_SUSPENDED	0x0010	/* device driver suspend was called */
 #define	DVF_BUS_SUSPENDED	0x0020	/* device bus suspend was called */
+#define	DVF_ATTACH_INPROGRESS	0x0040	/* device attach is in progress */
 #define	DVF_DETACH_SHUTDOWN	0x0080	/* device detaches safely at shutdown */
 
 #ifdef _KERNEL

Reply via email to