summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/cam/cam_periph.c32
-rw-r--r--sys/cam/cam_periph.h25
-rw-r--r--sys/cam/cam_xpt.c16
-rw-r--r--sys/cam/scsi/scsi_cd.c2
-rw-r--r--sys/cam/scsi/scsi_ch.c2
-rw-r--r--sys/cam/scsi/scsi_da.c2
-rw-r--r--sys/cam/scsi/scsi_pass.c2
-rw-r--r--sys/cam/scsi/scsi_pt.c2
-rw-r--r--sys/cam/scsi/scsi_sa.c2
-rw-r--r--sys/cam/scsi/scsi_ses.c2
-rw-r--r--sys/cam/scsi/scsi_targ_bh.c2
-rw-r--r--sys/cam/scsi/scsi_target.c2
12 files changed, 65 insertions, 26 deletions
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c
index 675859c..eba1787 100644
--- a/sys/cam/cam_periph.c
+++ b/sys/cam/cam_periph.c
@@ -63,6 +63,29 @@ static void camperiphdone(struct cam_periph *periph,
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 @@ cam_periph_alloc(periph_ctor_t *periph_ctor,
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 @@ cam_periph_find(struct cam_path *path, char *name)
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;
@@ -401,8 +422,7 @@ camperiphfree(struct cam_periph *periph)
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;
}
diff --git a/sys/cam/cam_periph.h b/sys/cam/cam_periph.h
index 54c549c..ac32256 100644
--- a/sys/cam/cam_periph.h
+++ b/sys/cam/cam_periph.h
@@ -37,7 +37,30 @@
extern struct cam_periph *xpt_periph;
-extern struct linker_set periphdriver_set;
+extern struct periph_driver **periph_drivers;
+void periphdriver_register(void *);
+
+#include <sys/module.h>
+#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
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index 142fdf4..8e8a49b 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -576,8 +576,8 @@ static struct periph_driver probe_driver =
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 @@ ptstartover:
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 @@ xptplistperiphfunc(struct cam_periph *periph, void *arg)
* 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 @@ xptpdrvtraverse(struct periph_driver **start_pdrv,
* 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 @@ xpt_finishconfig(struct cam_periph *periph, union ccb *done_ccb)
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)();
}
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index 57873bb..cf6482e 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -245,7 +245,7 @@ static struct periph_driver cddriver =
TAILQ_HEAD_INITIALIZER(cddriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, cddriver);
+PERIPHDRIVER_DECLARE(cd, cddriver);
/* For 2.2-stable support */
#ifndef D_DISK
diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c
index 25f6cdd..2923ab2 100644
--- a/sys/cam/scsi/scsi_ch.c
+++ b/sys/cam/scsi/scsi_ch.c
@@ -209,7 +209,7 @@ static struct periph_driver chdriver =
TAILQ_HEAD_INITIALIZER(chdriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, chdriver);
+PERIPHDRIVER_DECLARE(ch, chdriver);
static struct cdevsw ch_cdevsw = {
/* open */ chopen,
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index 70385c7..cdd70d2 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -299,7 +299,7 @@ static struct periph_driver dadriver =
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
diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c
index d329fc5..791a71d 100644
--- a/sys/cam/scsi/scsi_pass.c
+++ b/sys/cam/scsi/scsi_pass.c
@@ -107,7 +107,7 @@ static struct periph_driver passdriver =
TAILQ_HEAD_INITIALIZER(passdriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, passdriver);
+PERIPHDRIVER_DECLARE(pass, passdriver);
static struct cdevsw pass_cdevsw = {
/* open */ passopen,
diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c
index 541964f..beec14d 100644
--- a/sys/cam/scsi/scsi_pt.c
+++ b/sys/cam/scsi/scsi_pt.c
@@ -114,7 +114,7 @@ static struct periph_driver ptdriver =
TAILQ_HEAD_INITIALIZER(ptdriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, ptdriver);
+PERIPHDRIVER_DECLARE(pt, ptdriver);
#define PT_CDEV_MAJOR 61
diff --git a/sys/cam/scsi/scsi_sa.c b/sys/cam/scsi/scsi_sa.c
index 99b204d..0418f44 100644
--- a/sys/cam/scsi/scsi_sa.c
+++ b/sys/cam/scsi/scsi_sa.c
@@ -402,7 +402,7 @@ static struct periph_driver sadriver =
TAILQ_HEAD_INITIALIZER(sadriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, sadriver);
+PERIPHDRIVER_DECLARE(sa, sadriver);
/* For 2.2-stable support */
#ifndef D_TAPE
diff --git a/sys/cam/scsi/scsi_ses.c b/sys/cam/scsi/scsi_ses.c
index 6d7c4d1..d2ab63d 100644
--- a/sys/cam/scsi/scsi_ses.c
+++ b/sys/cam/scsi/scsi_ses.c
@@ -173,7 +173,7 @@ static struct periph_driver sesdriver = {
TAILQ_HEAD_INITIALIZER(sesdriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, sesdriver);
+PERIPHDRIVER_DECLARE(ses, sesdriver);
static struct cdevsw ses_cdevsw =
{
diff --git a/sys/cam/scsi/scsi_targ_bh.c b/sys/cam/scsi/scsi_targ_bh.c
index 82a4264..95f2631 100644
--- a/sys/cam/scsi/scsi_targ_bh.c
+++ b/sys/cam/scsi/scsi_targ_bh.c
@@ -149,7 +149,7 @@ static struct periph_driver targbhdriver =
TAILQ_HEAD_INITIALIZER(targbhdriver.units), /* generation */ 0
};
-DATA_SET(periphdriver_set, targbhdriver);
+PERIPHDRIVER_DECLARE(targbh, targbhdriver);
static void
targbhinit(void)
diff --git a/sys/cam/scsi/scsi_target.c b/sys/cam/scsi/scsi_target.c
index fd3ea00..cad49a3 100644
--- a/sys/cam/scsi/scsi_target.c
+++ b/sys/cam/scsi/scsi_target.c
@@ -228,7 +228,7 @@ static struct periph_driver targdriver =
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;
OpenPOWER on IntegriCloud