Date: Tue, 24 Apr 2007 22:15:21 GMT From: Scott Long <scottl@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 118756 for review Message-ID: <200704242215.l3OMFLlL029972@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=118756 Change 118756 by scottl@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704242215.l3OMFLlL029972>