PERFORCE change 118756 for review
Scott Long
scottl at FreeBSD.org
Tue Apr 24 22:15:22 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=118756
Change 118756 by scottl at scottl-x64 on 2007/04/24 22:15:16
Turn the XPT SIM into a newbus driver. Remove pseudo-driver glue.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#64 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#64 (text+ko) ====
@@ -36,6 +36,7 @@
#include <sys/types.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
+#include <sys/module.h>
#include <sys/time.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
@@ -170,13 +171,13 @@
static periph_init_t xpt_periph_init;
-static struct periph_driver xpt_driver =
+static struct periph_driver xpt_periph_driver =
{
xpt_periph_init, "xpt",
- TAILQ_HEAD_INITIALIZER(xpt_driver.units)
+ TAILQ_HEAD_INITIALIZER(xpt_periph_driver.units)
};
-PERIPHDRIVER_DECLARE(xpt, xpt_driver);
+PERIPHDRIVER_DECLARE(xpt, xpt_periph_driver);
static d_open_t xptopen;
@@ -235,20 +236,27 @@
#endif /* CAMDEBUG */
#endif /* CAM_DEBUG_BUS || CAM_DEBUG_TARGET || CAM_DEBUG_LUN */
-/* Our boot-time initialization hook */
-static int cam_module_event_handler(module_t, int /*modeventtype_t*/, void *);
+static void xpt_identify(driver_t *driver, device_t parent);
+static int xpt_probe(device_t dev);
+static int xpt_attach(device_t dev);
+static int xpt_detach(device_t dev);
-static moduledata_t cam_moduledata = {
- "cam",
- cam_module_event_handler,
- NULL
+static device_method_t xpt_sim_methods[] = {
+ DEVMETHOD(device_identify, xpt_identify),
+ DEVMETHOD(device_probe, xpt_probe),
+ DEVMETHOD(device_attach, xpt_attach),
+ DEVMETHOD(device_detach, xpt_detach),
+ { 0, 0 }
};
-static int xpt_init(void *);
+static driver_t xpt_sim_driver = {
+ "xptsim",
+ xpt_sim_methods,
+ 1, /* XXX Need softc */
+};
-DECLARE_MODULE(cam, cam_moduledata, SI_SUB_CONFIGURE, SI_ORDER_SECOND);
-MODULE_VERSION(cam, 1);
-
+static devclass_t xpt_devclass;
+DRIVER_MODULE(xpt, nexus, xpt_sim_driver, xpt_devclass, 0, 0);
static void xpt_async_bcast(struct async_list *async_head,
u_int32_t async_code,
@@ -837,25 +845,6 @@
return(error);
}
-static int
-cam_module_event_handler(module_t mod, int what, void *arg)
-{
- int error;
-
- switch (what) {
- case MOD_LOAD:
- if ((error = xpt_init(NULL)) != 0)
- return (error);
- break;
- case MOD_UNLOAD:
- return EBUSY;
- default:
- return EOPNOTSUPP;
- }
-
- return 0;
-}
-
/* thread to handle bus rescans */
static void
xpt_scanner_thread(void *dummy)
@@ -919,8 +908,26 @@
}
/* Functions accessed by the peripheral drivers */
+static void
+xpt_identify(driver_t *driver, device_t parent)
+{
+
+ if (resource_disabled("xpt", 0))
+ return;
+ if (BUS_ADD_CHILD(parent, 0, "xptsim", 0) == NULL)
+ panic("xpt_identify");
+}
+
+static int
+xpt_probe(device_t dev)
+{
+
+ device_set_desc(dev, "CAM Transport");
+ return (0);
+}
+
static int
-xpt_init(void *dummy)
+xpt_attach(device_t dev)
{
struct cam_sim *xpt_sim;
struct cam_path *path;
@@ -960,7 +967,7 @@
mtx_lock(&xsoftc.xpt_lock);
if ((status = xpt_bus_register(xpt_sim, /*bus #*/0)) != CAM_SUCCESS) {
- printf("xpt_init: xpt_bus_register failed with status %#x,"
+ printf("xpt_attach: xpt_bus_register failed with status %#x,"
" failing attach\n", status);
return (EINVAL);
}
@@ -973,7 +980,7 @@
if ((status = xpt_create_path(&path, NULL, CAM_XPT_PATH_ID,
CAM_TARGET_WILDCARD,
CAM_LUN_WILDCARD)) != CAM_REQ_CMP) {
- printf("xpt_init: xpt_create_path failed with status %#x,"
+ printf("xpt_attach: xpt_create_path failed with status %#x,"
" failing attach\n", status);
return (EINVAL);
}
@@ -990,7 +997,7 @@
(struct intr_config_hook *)malloc(sizeof(struct intr_config_hook),
M_TEMP, M_NOWAIT | M_ZERO);
if (xsoftc.xpt_config_hook == NULL) {
- printf("xpt_init: Cannot malloc config hook "
+ printf("xpt_attach: Cannot malloc config hook "
"- failing attach\n");
return (ENOMEM);
}
@@ -998,13 +1005,13 @@
xsoftc.xpt_config_hook->ich_func = xpt_config;
if (config_intrhook_establish(xsoftc.xpt_config_hook) != 0) {
free (xsoftc.xpt_config_hook, M_TEMP);
- printf("xpt_init: config_intrhook_establish failed "
+ printf("xpt_attach: config_intrhook_establish failed "
"- failing attach\n");
}
/* fire up rescan thread */
if (kthread_create(xpt_scanner_thread, NULL, NULL, 0, 0, "xpt_thrd")) {
- printf("xpt_init: failed to create rescan thread\n");
+ printf("xpt_attach: failed to create rescan thread\n");
}
/* Install our software interrupt handlers */
swi_add(NULL, "cambio", camisr, NULL, SWI_CAMBIO, INTR_MPSAFE, &cambio_ih);
@@ -1012,6 +1019,13 @@
return (0);
}
+static int
+xpt_detach(device_t dev)
+{
+
+ return (EBUSY);
+}
+
static cam_status
xptregister(struct cam_periph *periph, void *arg)
{
@@ -4033,7 +4047,7 @@
* If this wasn't a fully wildcarded async, tell all
* clients that want all async events.
*/
- if (bus != xpt_periph->path->bus)
+ if (bus->path_id != CAM_XPT_PATH_ID)
xpt_async_bcast(&xpt_periph->path->device->asyncs, async_code,
path, async_arg);
}
More information about the p4-projects
mailing list