Index: cam/cam_periph.c =================================================================== RCS file: /home/ncvs/src/sys/cam/cam_periph.c,v retrieving revision 1.28 diff -u -r1.28 cam_periph.c --- cam/cam_periph.c 2000/10/30 08:07:57 1.28 +++ cam/cam_periph.c 2001/02/04 08:51:10 @@ -63,6 +63,29 @@ union ccb *done_ccb); static void camperiphfree(struct cam_periph *periph); +static int nperiph_drivers; +struct periph_driver **periph_drivers; + +void +periphdriver_register(void *data) +{ + struct periph_driver **newdrivers, **old; + int ndrivers; + + ndrivers = nperiph_drivers + 2; + newdrivers = malloc(sizeof(*newdrivers) * ndrivers, M_TEMP, M_WAITOK); + if (periph_drivers) + bcopy(periph_drivers, newdrivers, + sizeof(*newdrivers) * ndrivers); + newdrivers[nperiph_drivers] = (struct periph_driver *)data; + newdrivers[nperiph_drivers + 1] = NULL; + old = periph_drivers; + periph_drivers = newdrivers; + if (old) + free(old, M_TEMP); + nperiph_drivers++; +} + cam_status cam_periph_alloc(periph_ctor_t *periph_ctor, periph_oninv_t *periph_oninvalidate, @@ -112,8 +135,7 @@ init_level++; - for (p_drv = (struct periph_driver **)periphdriver_set.ls_items; - *p_drv != NULL; p_drv++) { + for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { if (strcmp((*p_drv)->driver_name, name) == 0) break; } @@ -201,8 +223,7 @@ struct cam_periph *periph; int s; - for (p_drv = (struct periph_driver **)periphdriver_set.ls_items; - *p_drv != NULL; p_drv++) { + for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { if (name != NULL && (strcmp((*p_drv)->driver_name, name) != 0)) continue; @@ -402,8 +423,7 @@ int s; struct periph_driver **p_drv; - for (p_drv = (struct periph_driver **)periphdriver_set.ls_items; - *p_drv != NULL; p_drv++) { + for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { if (strcmp((*p_drv)->driver_name, periph->periph_name) == 0) break; } Index: cam/cam_periph.h =================================================================== RCS file: /home/ncvs/src/sys/cam/cam_periph.h,v retrieving revision 1.11 diff -u -r1.11 cam_periph.h --- cam/cam_periph.h 2000/05/26 02:01:41 1.11 +++ cam/cam_periph.h 2001/02/04 08:51:10 @@ -37,7 +37,28 @@ extern struct cam_periph *xpt_periph; -extern struct linker_set periphdriver_set; +extern struct periph_driver **periph_drivers; +void periphdriver_register(void *); +#define PERIPHDRIVER_DECLARE(name, driver) \ + static int name ## _modevent(module_t mod, int type, void *data) \ + { \ + switch (type) { \ + case MOD_LOAD: \ + periphdriver_register(data); \ + break; \ + case MOD_UNLOAD: \ + printf(#name " module unload - not possible for this module type\n"); \ + return EINVAL; \ + } \ + return 0; \ + } \ + static moduledata_t name ## _mod = { \ + #name, \ + name ## _modevent, \ + (void *)&driver \ + }; \ + DECLARE_MODULE(name, name ## _mod, SI_SUB_DRIVERS, SI_ORDER_ANY); \ + MODULE_DEPEND(name, cam, 1, 1, 1) typedef void (periph_init_t)(void); /* * Callback informing the peripheral driver Index: cam/cam_xpt.c =================================================================== RCS file: /home/ncvs/src/sys/cam/cam_xpt.c,v retrieving revision 1.104 diff -u -r1.104 cam_xpt.c --- cam/cam_xpt.c 2001/01/29 05:33:14 1.104 +++ cam/cam_xpt.c 2001/02/04 08:51:11 @@ -576,8 +576,8 @@ TAILQ_HEAD_INITIALIZER(probe_driver.units) }; -DATA_SET(periphdriver_set, xpt_driver); -DATA_SET(periphdriver_set, probe_driver); +PERIPHDRIVER_DECLARE(xpt, xpt_driver); +PERIPHDRIVER_DECLARE(probe, probe_driver); #define XPT_CDEV_MAJOR 104 @@ -1167,8 +1167,7 @@ cur_generation = xsoftc.generation; /* first find our driver in the list of drivers */ - for (p_drv = (struct periph_driver **)periphdriver_set.ls_items; - *p_drv != NULL; p_drv++) + for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) if (strcmp((*p_drv)->driver_name, name) == 0) break; @@ -2342,9 +2341,7 @@ * peripheral driver linker set entry would cost * more in the long run than doing this quick lookup. */ - for (pdrv = - (struct periph_driver **)periphdriver_set.ls_items; - *pdrv != NULL; pdrv++) { + for (pdrv = periph_drivers; *pdrv != NULL; pdrv++) { if (strcmp((*pdrv)->driver_name, periph->periph_name) == 0) break; @@ -2546,8 +2543,7 @@ * change while the system is running), the list traversal should * be modified to work like the other traversal functions. */ - for (pdrv = (start_pdrv ? start_pdrv : - (struct periph_driver **)periphdriver_set.ls_items); + for (pdrv = (start_pdrv ? start_pdrv : periph_drivers); *pdrv != NULL; pdrv++) { retval = tr_func(pdrv, arg); @@ -6210,7 +6206,7 @@ if (busses_to_config == 0) { /* Register all the peripheral drivers */ /* XXX This will have to change when we have loadable modules */ - p_drv = (struct periph_driver **)periphdriver_set.ls_items; + p_drv = periph_drivers; for (i = 0; p_drv[i] != NULL; i++) { (*p_drv[i]->init)(); } Index: cam/scsi/scsi_cd.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_cd.c,v retrieving revision 1.45 diff -u -r1.45 scsi_cd.c --- cam/scsi/scsi_cd.c 2001/01/28 21:43:17 1.45 +++ cam/scsi/scsi_cd.c 2001/02/04 08:51:11 @@ -245,7 +245,7 @@ TAILQ_HEAD_INITIALIZER(cddriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, cddriver); +PERIPHDRIVER_DECLARE(cd, cddriver); /* For 2.2-stable support */ #ifndef D_DISK Index: cam/scsi/scsi_ch.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_ch.c,v retrieving revision 1.24 diff -u -r1.24 scsi_ch.c --- cam/scsi/scsi_ch.c 2000/10/30 08:08:00 1.24 +++ cam/scsi/scsi_ch.c 2001/02/04 08:51:11 @@ -209,7 +209,7 @@ TAILQ_HEAD_INITIALIZER(chdriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, chdriver); +PERIPHDRIVER_DECLARE(ch, chdriver); static struct cdevsw ch_cdevsw = { /* open */ chopen, Index: cam/scsi/scsi_da.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_da.c,v retrieving revision 1.62 diff -u -r1.62 scsi_da.c --- cam/scsi/scsi_da.c 2001/01/16 00:30:37 1.62 +++ cam/scsi/scsi_da.c 2001/02/04 08:51:11 @@ -299,7 +299,7 @@ TAILQ_HEAD_INITIALIZER(dadriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, dadriver); +PERIPHDRIVER_DECLARE(da, dadriver); #define DA_CDEV_MAJOR 13 #define DA_BDEV_MAJOR 4 Index: cam/scsi/scsi_pass.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_pass.c,v retrieving revision 1.25 diff -u -r1.25 scsi_pass.c --- cam/scsi/scsi_pass.c 2000/10/30 08:08:00 1.25 +++ cam/scsi/scsi_pass.c 2001/02/04 08:51:11 @@ -107,7 +107,7 @@ TAILQ_HEAD_INITIALIZER(passdriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, passdriver); +PERIPHDRIVER_DECLARE(pass, passdriver); static struct cdevsw pass_cdevsw = { /* open */ passopen, Index: cam/scsi/scsi_pt.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_pt.c,v retrieving revision 1.23 diff -u -r1.23 scsi_pt.c --- cam/scsi/scsi_pt.c 2000/05/26 02:01:50 1.23 +++ cam/scsi/scsi_pt.c 2001/02/04 08:51:11 @@ -114,7 +114,7 @@ TAILQ_HEAD_INITIALIZER(ptdriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, ptdriver); +PERIPHDRIVER_DECLARE(pt, ptdriver); #define PT_CDEV_MAJOR 61 Index: cam/scsi/scsi_sa.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_sa.c,v retrieving revision 1.63 diff -u -r1.63 scsi_sa.c --- cam/scsi/scsi_sa.c 2001/01/19 21:08:15 1.63 +++ cam/scsi/scsi_sa.c 2001/02/04 08:51:11 @@ -402,7 +402,7 @@ TAILQ_HEAD_INITIALIZER(sadriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, sadriver); +PERIPHDRIVER_DECLARE(sa, sadriver); /* For 2.2-stable support */ #ifndef D_TAPE Index: cam/scsi/scsi_ses.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_ses.c,v retrieving revision 1.14 diff -u -r1.14 scsi_ses.c --- cam/scsi/scsi_ses.c 2000/10/15 14:17:54 1.14 +++ cam/scsi/scsi_ses.c 2001/02/04 08:51:11 @@ -173,7 +173,7 @@ TAILQ_HEAD_INITIALIZER(sesdriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, sesdriver); +PERIPHDRIVER_DECLARE(ses, sesdriver); static struct cdevsw ses_cdevsw = { Index: cam/scsi/scsi_targ_bh.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_targ_bh.c,v retrieving revision 1.11 diff -u -r1.11 scsi_targ_bh.c --- cam/scsi/scsi_targ_bh.c 2001/01/24 00:14:37 1.11 +++ cam/scsi/scsi_targ_bh.c 2001/02/04 08:51:11 @@ -149,7 +149,7 @@ TAILQ_HEAD_INITIALIZER(targbhdriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, targbhdriver); +PERIPHDRIVER_DECLARE(targbh, targbhdriver); static void targbhinit(void) Index: cam/scsi/scsi_target.c =================================================================== RCS file: /home/ncvs/src/sys/cam/scsi/scsi_target.c,v retrieving revision 1.36 diff -u -r1.36 scsi_target.c --- cam/scsi/scsi_target.c 2001/01/09 04:31:48 1.36 +++ cam/scsi/scsi_target.c 2001/02/04 08:51:12 @@ -228,7 +228,7 @@ TAILQ_HEAD_INITIALIZER(targdriver.units), /* generation */ 0 }; -DATA_SET(periphdriver_set, targdriver); +PERIPHDRIVER_DECLARE(targ, targdriver); static struct extend_array *targperiphs; static dev_t targ_ctl_dev;