PERFORCE change 123980 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Mon Jul 23 18:06:06 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123980
Change 123980 by thioretic at thioretic on 2007/07/23 18:05:04
ivars stuff. some cleanups.
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#19 edit
Differences ...
==== //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#19 (text+ko) ====
@@ -171,8 +171,8 @@
#define DF_PERSISTENT 256 /* Should not delete when refs == 0*/
u_char order; /**< order from device_add_child_ordered() */
u_char pad;
- void *ivars; /**< instance variables */
- void *softc; /**< current driver's variables */
+ //void *ivars; /**< instance variables */
+ //void *softc; /**< current driver's variables */
u_long refs;
int raw;
@@ -2000,7 +2000,7 @@
* @returns the new device
*/
static device_t
-make_device(device_t parent, const char *name, int unit/*, driver_t *initto*/) /*TODO*/
+make_device(device_t parent, const char *name, int unit) /*TODO*/
{
device_t dev;
devclass_t dc;
@@ -2053,7 +2053,6 @@
return (NULL);
}
}
- dev->ivars = NULL;
TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
bus_data_generation_update();
@@ -2253,7 +2252,7 @@
}
if (devtodel->refs)
- return (1);
+ return (0);
TAILQ_REMOVE(&bus_data_devices, devtodel, devlink);
kobj_delete((kobj_t) devtodel, M_BUS);
@@ -2868,6 +2867,32 @@
dil->flags &= ~DF_EXTERNALSOFTC;
}
+
+void*
+device_get_driver_ivars (device_t dev, driver_t *driver){
+ int level;
+ driverinfolink_t dil;
+ u_int32_t flags;
+
+ KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
+ if (!driverinfo_get_flags (driver, &flags))
+ return (NULL);
+ level = driverinfo_flags2idx (flags);
+
+ if (TAILQ_EMPTY(&dev->drivers[level]))
+ return (NULL);
+
+ TAILQ_FOREACH (dil, &dev->drivers[level], link){
+ if (dil->pdriver->driver == driver)
+ break;
+ }
+
+ if (!dil)
+ return (NULL);
+ else
+ return (dil->ivars);
+}
+
/**
* @brief Get the device's ivars field
*
@@ -2878,9 +2903,37 @@
void *
device_get_ivars(device_t dev)
{
+ driverinfolink_t dil;
+
+ KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
+ if (TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))
+ return (NULL);
+ dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
+
+ return (dil>ivars);
+}
+
+void
+device_set_driver_ivars (device_t dev, driver_t *driver, void* ivars){
+ int level;
+ driverinfolink_t dil;
+ u_int32_t flags;
KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
- return (dev->ivars);
+ if (!driverinfo_get_flags (driver, &flags))
+ return (NULL);
+ level = driverinfo_flags2idx (flags);
+
+ if (TAILQ_EMPTY(&dev->drivers[level]))
+ return (NULL);
+
+ TAILQ_FOREACH (dil, &dev->drivers[level], link){
+ if (dil->pdriver->driver == driver)
+ break;
+ }
+
+ if (dil)
+ dil->ivars = ivars;
}
/**
@@ -2889,9 +2942,14 @@
void
device_set_ivars(device_t dev, void * ivars)
{
+ driverinfolink_t dil;
KASSERT(dev != NULL, ("device_set_ivars(NULL, ...)"));
- dev->ivars = ivars;
+ if(!(TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))){
+ dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
+ }
+ dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
+ dil->ivars = ivars;
}
/**
@@ -3078,7 +3136,7 @@
driverinfo_t di;
driverinfolink_t dil;
uint32_t flags;
- int level;
+ int level, present = 0;
if (dev->state >= DS_ATTACHED)
return (EBUSY);
@@ -3086,20 +3144,15 @@
if (driver == dev->driver->pdriver->driver)
return (0);
+ di = driverinfo_find_driver (driver);
+ driverinfo_get_flags(driver, &flags);
+ level = driverinfo_flags2idx(flags);
+
if (driver != NULL){
- di = driverinfo_find_driver (driver);
-
- driverinfo_get_flags(driver, &flags);
- level = driverinfo_flags2idx(flags);
-
TAILQ_FOREACH(dil, &(dev->drivers[level]), link){
if (dil->pdriver == di)
break;
}
- if (dil){
- dil->state = DS_RAW;
- return (0);
- }
}
if(driver == NULL || level == DRV_LOWEST){
@@ -3107,31 +3160,33 @@
return (EBUSY);
}
- dil = malloc (sizeof(struct driverinfolink), M_BUS, M_NOWAIT|M_ZERO);
+ if (!dil){
+ dil = malloc (sizeof(struct driverinfolink), M_BUS, M_NOWAIT|M_ZERO);
+ TAILQ_INSERT_TAIL (&dev->drivers[level], dil);
+ }
+
dil->pdriver = di;
dil->state = DS_RAW;
dev->raw++;
- TAILQ_INSERT_TAIL (&(dev->drivers[level]), dil);
-
dev->driver = dil;
dev->driver_level = level;
- if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC)) { /*TODO*/
- free(dev->softc, M_BUS_SC);
- dev->softc = NULL;
+ if (dil->softc && !(dil->flags & DF_EXTERNALSOFTC)) {
+ free(dil->softc, M_BUS_SC);
+ dil->softc = NULL;
}
if (driver) {
- if (!(dev->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
- dev->softc = malloc(driver->size, M_BUS_SC,
+ if (!(dil->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
+ dil->softc = malloc(driver->size, M_BUS_SC,
M_NOWAIT | M_ZERO);
- if (!dev->softc) {
+ if (!dil->softc) {
TAILQ_REMOVE(&(dev->drivers[level]), dil, link);
free (dil);
return (ENOMEM);
}
}
- }*/
+ }
bus_data_generation_update();
return (0);
@@ -4620,7 +4675,7 @@
*/
static int
-parse_parent_name (char* in, char ***out){ /*TODO*/
+parse_parent_name (char* in, char ***out){
char* cptr = in, *ptr = in, *newpar;
int count = 1, num = 0;
@@ -4646,9 +4701,91 @@
(*out)[count++] = newpar;
num = 0; cptr = ++ptr;
} while (cptr<(in+strlen(in)));
- (*out)[count]=NULL;
+ (*out)[count] = NULL;
+ return (1);
+ }
+}
+
+int
+register_filter_or_device_driver (driver *driver, char* hosts, devclass_t *pdc){
+ int error = 0, count = 0;
+ devclass_t dc, parentdc;
+ char *parents[];
+
+ if (!parse_parent_name(hosts, &parents))
+ return (1);
+
+ while (parents[count]){
+ parentdc = devclass_find_internal(parents[count], 0, TRUE, FALSE);
+ error &= devclass_add_driver (parentdc, driver);
+ count++;
+ }
+ free(parents);
+ if (error)
+ break;
+
+ /*
+ * If the driver has any base classes, make the
+ * devclass inherit from the devclass of the driver's
+ * first base class. This will allow the system to
+ * search for drivers in both devclasses for children
+ * of a device using this driver.
+ */
+ if (driver->baseclasses) {
+ const char *parentname;
+ parentname = driver->baseclasses[0]->name;
+ *pdc = devclass_find_internal(driver->name,
+ parentname, TRUE, FALSE);
+ } else {
+ *pdc = devclass_find_internal(driver->name, 0, TRUE, FALSE);
+ }
+}
+
+int
+register_func_driver (driver_t *driver, char* hosts, devclass_t *pdc){
+ int error, count=0, devcount;
+ device_t dev, *devices;
+ devclass_t dc, parentdc;
+
+ if ((dc = devclass_find_internal(driver->name, 0, TRUE, FALSE)) == NULL)
+ return (1);
+
+ if (error = devclass_add_driver(dc, driver))
+ return (error);
+
+ if ((dev = make_device (root_bus, DRIVERNAME(driver), -1)) == NULL)
return (1);
+
+ if (error = device_set_driver(dev, driver))
+ return (error);
+
+ if (error = device_set_devclass(dev, driver->name))
+ return (error);
+
+ /* Fetch any flags for the device before probing.*/
+ resource_int_value(driver->name, dev->unit,
+ "flags", &dev->devflags);
+ dev->flags |= DF_PERSISTENT;
+ *pdc = dc;
+
+ if (!parse_parent_name(hosts, &parents))
+ return (0);
+
+ while (parents[count]){
+ if (!(parentdc = devclass_find(parents[count++])))
+ continue;
+ devclass_get_devices(parentdc, &devices, &devcount);
+ for (i=0, i<devcount, i++){
+ device_add_existing_parent(dev, devices[i]);
+ }
}
+
+ free(parents);
+
+ DEVICE_PROBE(dev);
+ device_attach(dev);
+
+ return (0);
}
/**
@@ -4664,12 +4801,9 @@
{
int error=0;
struct driver_module_data *dmd;
- devclass_t bus_devclass, parent_devclass, filter_devclass;
+ devclass_t bus_devclass;
drv_internal_t drv_intnl;
kobj_class_t driver;
- char* parents[];
- int count=0, isfilter, devcount;
- device_t dev, *devices;
u_int32_t flags;
dmd = (struct driver_module_data *)arg;
@@ -4680,65 +4814,15 @@
case MOD_LOAD:
if (dmd->dmd_chainevh)
error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
-
driverinfo_add_driver(drv_intnl);
driver = drv_intnl->devops;
PDEBUG(("Loading module: driver %s on bus %s",
DRIVERNAME(driver), dmd->dmd_busname));
- if (!parse_parent_name(dmd->dmd_busname, &parents))
- break;
- isfilter = driverinfo_isfilter (driver);
- while (parents[count]){
- parent_devclass = devclass_find_internal(parents[count], 0, TRUE, FALSE);
- error &= devclass_add_driver (parent_devclass, driver);
- count++;
- }
- free(parents);
- if (error)
- break;
- /*
- * If the driver has any base classes, make the
- * devclass inherit from the devclass of the driver's
- * first base class. This will allow the system to
- * search for drivers in both devclasses for children
- * of a device using this driver.
- */
- if (driver->baseclasses) {
- const char *parentname;
- parentname = driver->baseclasses[0]->name;
- *dmd->dmd_devclass =
- devclass_find_internal(driver->name,
- parentname, TRUE, FALSE);
- } else {
- *dmd->dmd_devclass =
- devclass_find_internal(driver->name, 0, TRUE, FALSE);
- }
-
- if(drv_intnl->flags & (DR_REQDEV|DR_LOWEST)){
- dev = make_device (root_bus, DRIVERNAME(driver), -1);
- device_set_driver(dev, driver);
- device_set_devclass(dev, driver->name);
-
- /* Fetch any flags for the device before probing.
- resource_int_value(dl->driver->name, child->unit,
- "flags", &child->devflags);
- */
- dev->flags |= DF_PERSISTENT;
- count = 0;
- while (parents[count]){
- if (!(parent_devclass = devclass_find(parents[count++])))
- continue;
- devclass_get_devices(parent_devclass, &devices, &devcount);
- for (i=0, i<devcount, i++){
- device_add_existing_parent(dev, devices[i]);
- }
- }
- result = DEVICE_PROBE(dev);
- if(result <= 0)
- device_attach(dev);
- }
-
+ if (isfunc = drv_intnl->flags & (DR_REQDEV|DR_LOWEST))
+ error = register_func_driver(driver, dmd->dmd_busname, dmd->dmd_devclass);
+ else
+ error = register_filter_or_device_driver(driver, dmd->dmd_busname, dmd->dmd_devclass);
break;
case MOD_UNLOAD:
@@ -4753,7 +4837,7 @@
if (!error && dmd->dmd_chainevh)
error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
break;
- case MOD_QUIESCE: /*TODO*/
+ case MOD_QUIESCE:
PDEBUG(("Quiesce module: driver %s from bus %s",
DRIVERNAME(dmd->dmd_driver),
dmd->dmd_busname));
More information about the p4-projects
mailing list