Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 Oct 2009 16:21:56 GMT
From:      Alexander Motin <mav@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 169892 for review
Message-ID:  <200910281621.n9SGLuuC008054@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/chv.cgi?CH=169892

Change 169892 by mav@mav_mavtest on 2009/10/28 16:20:57

	Introduce early-attaching type of periph drivers. Initialize them
	before main scan during boot, not after. Use if for probe, aprobe,
	xpt and pmp drivers. It is mostly required for pmp driver, to
	give it ability finish devices probe before FS mounting. The rest
	of drivers left as-is now, because late attach is required for proper
	device numbering, when bus scanned in parallel.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#16 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#45 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#18 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#109 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_xpt.c#19 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#16 (text+ko) ====

@@ -136,7 +136,8 @@
 static struct periph_driver pmpdriver =
 {
 	pmpinit, "pmp",
-	TAILQ_HEAD_INITIALIZER(pmpdriver.units), /* generation */ 0
+	TAILQ_HEAD_INITIALIZER(pmpdriver.units), /* generation */ 0,
+	CAM_PERIPH_DRV_EARLY
 };
 
 PERIPHDRIVER_DECLARE(pmp, pmpdriver);

==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#45 (text+ko) ====

@@ -83,7 +83,8 @@
 static struct periph_driver probe_driver =
 {
 	probe_periph_init, "aprobe",
-	TAILQ_HEAD_INITIALIZER(probe_driver.units)
+	TAILQ_HEAD_INITIALIZER(probe_driver.units), /* generation */ 0,
+	CAM_PERIPH_DRV_EARLY
 };
 
 PERIPHDRIVER_DECLARE(aprobe, probe_driver);

==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#18 (text+ko) ====

@@ -79,6 +79,8 @@
 	char			 *driver_name;
 	TAILQ_HEAD(,cam_periph)	 units;
 	u_int			 generation;
+	u_int			 flags;
+#define CAM_PERIPH_DRV_EARLY		0x01
 };
 
 typedef enum {

==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#109 (text+ko) ====

@@ -161,7 +161,8 @@
 static struct periph_driver xpt_driver =
 {
 	xpt_periph_init, "xpt",
-	TAILQ_HEAD_INITIALIZER(xpt_driver.units)
+	TAILQ_HEAD_INITIALIZER(xpt_driver.units), /* generation */ 0,
+	CAM_PERIPH_DRV_EARLY
 };
 
 PERIPHDRIVER_DECLARE(xpt, xpt_driver);
@@ -4657,6 +4658,9 @@
 static void
 xpt_config(void *arg)
 {
+	struct	periph_driver **p_drv;
+	int	i;
+
 	/*
 	 * Now that interrupts are enabled, go find our devices
 	 */
@@ -4690,6 +4694,13 @@
 #endif /* CAM_DEBUG_BUS */
 #endif /* CAMDEBUG */
 
+	/* Register early peripheral drivers */
+	/* XXX This will have to change when we have loadable modules */
+	p_drv = periph_drivers;
+	for (i = 0; p_drv[i] != NULL; i++) {
+		if ((p_drv[i]->flags & CAM_PERIPH_DRV_EARLY) != 0)
+			(*p_drv[i]->init)();
+	}
 	/*
 	 * Scan all installed busses.
 	 */
@@ -4740,7 +4751,8 @@
 		/* XXX This will have to change when we have loadable modules */
 		p_drv = periph_drivers;
 		for (i = 0; p_drv[i] != NULL; i++) {
-			(*p_drv[i]->init)();
+			if ((p_drv[i]->flags & CAM_PERIPH_DRV_EARLY) == 0)
+				(*p_drv[i]->init)();
 		}
 
 		/*

==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_xpt.c#19 (text+ko) ====

@@ -110,7 +110,8 @@
 static struct periph_driver probe_driver =
 {
 	probe_periph_init, "probe",
-	TAILQ_HEAD_INITIALIZER(probe_driver.units)
+	TAILQ_HEAD_INITIALIZER(probe_driver.units), /* generation */ 0,
+	CAM_PERIPH_DRV_EARLY
 };
 
 PERIPHDRIVER_DECLARE(probe, probe_driver);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910281621.n9SGLuuC008054>