PERFORCE change 123650 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Tue Jul 17 13:04:59 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123650
Change 123650 by thioretic at thioretic on 2007/07/17 13:04:34
First round of cleanups.
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#16 edit
Differences ...
==== //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#16 (text+ko) ====
@@ -322,7 +322,6 @@
buf[strlen(buf)]='\0';
strcat(buf,"\n");
}
- //value = dev->driver ? dev->driver->name : ""; /**TODO*/
break;
case DEVICE_SYSCTL_LOCATION:
value = buf = malloc(1024, M_BUS, M_WAITOK | M_ZERO);
@@ -364,7 +363,7 @@
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
OID_AUTO, "%driver", CTLFLAG_RD,
dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A",
- "device drivers names"); /**TODO*/
+ "device drivers names");
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
OID_AUTO, "%location", CTLFLAG_RD,
dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A",
@@ -835,8 +834,8 @@
if (!di && add){
PDEBUG(("adding driver %s to compatibility layer", driver->devops->name));
- di = malloc(sizeof(struct /*drv_compat*/ driverinfo), M_BUS, M_NOWAIT|M_ZERO);
- if (!drvc)
+ di = malloc(sizeof(struct driverinfo), M_BUS, M_NOWAIT|M_ZERO);
+ if (!di)
return (NULL);
di->driver = driver->devops;
di->flags = driver->flags;
@@ -849,7 +848,7 @@
/**
* @internal
- * @brief find compartibility layer entry, associated
+ * @brief find compatibility layer entry, associated
* with the driver
*
* @param driver device kobj_class pointer
@@ -890,8 +889,10 @@
static void
driverinfo_delete_driver (driver_t *driver) {
driverinfo_t di;
+
di = driverinfo_find_driver(driver);
- TAILQ_REMOVE(&driverinfo_layer, di, link);
+ if (di)
+ TAILQ_REMOVE(&driverinfo_layer, di, link);
}
/**
@@ -906,7 +907,6 @@
driverinfo_t di;
di = driverinfo_find_driver(driver);
-
if (!di)
return (0);
@@ -926,21 +926,22 @@
driverinfo_t di;
di = driverinfo_find_driver(driver);
-
if (!di)
return (0);
+
di->flags = flags;
return (1);
}
+
/**
* @internal
- * @brief Checks driver and returns corresponding driver
+ * @brief Checks driver and returns corresponding level
*
* @param flags drv_compat flags
*/
static int
driverinfo_flags2idx (uint32_t flags){
- switch (flags & DR_ALLEVELS){
+ switch (flags & DR_ALLLEVELS){
case DR_LOWEST: return (DRV_LOWEST);
case DR_LOWER: return (DRV_LOWER);
case DR_MIDDLE: return (DRV_MIDDLE);
@@ -949,13 +950,22 @@
}
}
+/**
+ * @internal
+ * @brief Checks, whether this is a filtering driver
+ *
+ * Returns true, if driver level is DRV_LOWEST<level<DRV_TOPMOST,
+ * false overwise
+ */
+
+static int
driverinfo_isfilter (driver_t *driver){
uint32_t flags;
int level;
driverinfo_get_flags (driver, &flags);
level = driverinfo_flags2idx (flags);
- return((level>DR_LOWEST & level<DR_TOPMOST) ? TRUE : FALSE);
+ return((level>DRV_LOWEST & level<DRV_TOPMOST) ? TRUE : FALSE);
}
@@ -973,7 +983,7 @@
#define FOR_ALL_BUT_RAW_DRIVER (func, memb, ...) \
int level; \
- /*pdrv_compat **/ driverinfolink_t dil; \
+ driverinfolink_t dil; \
for (level = DRV_LOWEST; level <= DRV_TOPMOST; level++){ \
if(TAILQ_EMPTY(&(dev->drivers[level]))) \
continue; \
@@ -1190,29 +1200,16 @@
uint32_t flags;
driverinfolink_t dil;
- if (!driverinfo_get_flags(driver, &flags))
- /*todo what?*/;
+ driverinfo_get_flags(driver, &flags);
level = driverinfo_flags2idx (flags);
- TAILQ_FOREACH(dil, &((dev->drivers)[level]), link){
+ TAILQ_FOREACH(dil, &dev->drivers[level], link){
if (dil->pdriver->driver == driver)
return(TRUE);
}
return(FALSE);
}
-static int
-is_device_parent (device_t dev, device_t parent){
- devicelink_t dl;
- if (TAILQ_EMPTY(&dev->parents))
- return (FALSE);
- TAILQ_FOREACH (dl, &dev->parents, link){
- if (dl->device_ptr == parent)
- break;
- }
- return ((dl) ? TRUE : FALSE);
-}
-
/*
* Devclass implementation
@@ -1238,10 +1235,11 @@
*/
static devclass_t
devclass_find_internal(const char *classname, const char *parentname,
- int create, int filter) /**TODO*/
+ int create, int filter)
{
devclass_t dc, dcp;
devclasslink_t dcl;
+ int created=0;
PDEBUG(("looking for %s", classname));
if (!classname)
@@ -1264,7 +1262,7 @@
TAILQ_INIT(&dc->drivers);
TAILQ_INIT(&dc->filters);
TAILQ_INSERT_TAIL(&devclasses, dc, link);
-
+ created=1;
bus_data_generation_update();
}
@@ -1279,21 +1277,25 @@
if (!parentname)
return (dc);
- dcp = devclass_find_internal(parentname, 0, FALSE, FALSE)
+ dcp = devclass_find_internal(parentname, 0, TRUE, FALSE)
if (dc && !dc->parent &&
strcmp(classname, parentname) != 0 &&
- !filter) {
+ !filter && dcp) {
dc->parent = dcp;
}
if (filter) {
dcl = malloc(sizeof(struct devclasslink), M_BUS, M_NOWAIT|M_ZERO);
- if (!dcl)
- return (NULL); /*TODO*/
- TAILQ_INSERT_TAIL(&(dcp->filters), dcl, link);
+ if (!dcl || !dcp){
+ if (created){
+ TAILQ_REMOVE(&devclasses, dc, link);
+ free(dc);
+ }
+ return (NULL);
+ }
+ TAILQ_INSERT_TAIL(&dcp->filters, dcl, link);
}
-
return (dc);
}
@@ -1358,8 +1360,6 @@
* goes. This means we can safely use static methods and avoids a
* double-free in devclass_delete_driver.
*/
- //kobj_class_compile((kobj_class_t) driver);
-
di = driverinfo_find_driver (driver);
di->topology_ops = kobj_create (di->driver, M_BUS, M_NOWAIT|M_ZERO);
@@ -1407,7 +1407,7 @@
* @param driver the driver to unregister
*/
int
-devclass_delete_driver(devclass_t busclass, driver_t *driver) /*TODO*/
+devclass_delete_driver(devclass_t busclass, driver_t *driver)
{
devclass_t dc = devclass_find(driver->name);
driverlink_t dl;
@@ -1448,14 +1448,13 @@
for (i = 0; i < dc->maxunit; i++) {
if (dc->devices[i]) {
dev = dc->devices[i];
- if (/*dev->driver == driver*/
- is_device_driver(dev, driver) &&
- !TAILQ_EMPTY(&(dev->parents)) &&
- (TAILQ_FIRST(&(dev->parents)))->device_ptr->devclass == busclass) {
- device_set_driver(dev, driver);
+ if (is_device_driver(dev, driver) &&
+ !TAILQ_EMPTY(&dev->parents) &&
+ (TAILQ_FIRST(&dev->parents))->device_ptr->devclass == busclass) {
+ device_set_driver (dev, driver);
if ((error = device_detach(dev)) != 0)
return (error);
- device_set_driver(dev, NULL);
+ device_set_driver (dev, NULL);
}
}
}
@@ -1467,7 +1466,6 @@
driver->refs--;
if (driver->refs == 0){
di = driverinfo_find_driver (driver);
- //kobj_class_free((kobj_class_t) driver);
kobj_delete (di->topology_ops, M_BUS);
}
@@ -1529,15 +1527,14 @@
for (i = 0; i < dc->maxunit; i++) {
if (dc->devices[i]) {
dev = dc->devices[i];
- if (/*dev->driver == driver*/
- is_device_driver(dev, driver) && !TAILQ_EMPTY(&(dev->parents) &&
- (TAILQ_FIRST(&(dev->parents)))->device_ptr->devclass == busclass) {
+ if (is_device_driver(dev, driver) &&
+ !TAILQ_EMPTY(&dev->parents) &&
+ (TAILQ_FIRST(&dev->parents))->device_ptr->devclass == busclass) {
if ((error = device_quiesce(dev)) != 0)
return (error);
}
}
}
-
return (0);
}
@@ -1967,14 +1964,13 @@
static void
devclass_device2filters (devclass_t dc, device_t dev){
devclasslink_t dcl;
- driver_t *drv;
driverlink_t dl;
- if (TAILQ_EMPTY(&(dc->filters))) return ();
- TAILQ_FOREACH (dcl, &(dc->filters), link){
- if (TAILQ_EMPTY(&(dcl->devclass_ptr->drivers)))
+ if (TAILQ_EMPTY(&dc->filters)) return ();
+ TAILQ_FOREACH (dcl, &dc->filters, link){
+ if (TAILQ_EMPTY(&dcl->devclass_ptr->drivers))
continue;
- TAILQ_FOREACH(dl, &(dcl->devclass_ptr->drivers), link){
+ TAILQ_FOREACH(dl, &dcl->devclass_ptr->drivers, link){
filter_probe_and_attach (dev, dl->driver);
}
}
@@ -1986,7 +1982,7 @@
for (i=0, i<=dc->maxunit; i++){
if ((dc->devices[i]) &&
- ((dc->devices[i])->state == DS_ALIVE))
+ ((dc->devices[i])->state >= DS_ALIVE))
filter_probe_and_attach (dv->devices[i], filter);
}
}
@@ -2032,25 +2028,11 @@
pd->device_ptr = parent;
TAILQ_INSERT_TAIL(&(dev->parents), pd, link);
TAILQ_INIT(&(dev->children));
- //kobj_init((kobj_t) dev, &null_class);
kobj_init((kobj_t) dev, &drv_compat_ctrl_driver)
- //dev->driver = NULL;
for (level=DRV_LOWEST; level<=DRV_TOPMOST; level++)
TAILQ_INIT(&((dev->drivers)[level]));
- /*if (initto){
- drvc = drv_compat_find_driver (initto);
- if (!(drvc->topology_ops = kobj_create (initto, M_BUS, M_NOWAIT|M_ZERO)))
- /*todo what??*/;
- /* dev->devclass = devclass_find (DRIVERNAME(driver));
- level = drv_compat_flags2idx(drvc->flags);
- TAILQ_INSERT_TAIL (&((dev->drivers)[level]), &drvc, link);
- dev->state = DS_ALIVE;
- }
- else{*/
- dev->devclass = NULL;
- dev->state = DS_NOTPRESENT;
- /*}*/
-
+ dev->devclass = NULL;
+ dev->state = DS_NOTPRESENT;
dev->refs = 0;
dev->unit = unit;
dev->nameunit = NULL;
@@ -2071,9 +2053,7 @@
}
}
dev->ivars = NULL;
-// dev->softc = NULL;
-
TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
bus_data_generation_update();
@@ -2122,6 +2102,7 @@
static int
device_add_to_dev_list (device_t addwhat, devicelink_list_t *addwhere, int incr_refs){
devicelink_t pd;
+
TAILQ_FOREACH (pd, addwhere, link){
if (pd->device_ptr == addwhat)
return (1);
@@ -2147,8 +2128,8 @@
*/
int
device_add_existing_child (device_t dev, device_t child){
- device_add_to_dev_list (child, &(dev->children), TRUE);
- device_add_to_dev_list (dev, &(child->parents), FALSE);
+ device_add_to_dev_list (child, &dev->children, TRUE);
+ device_add_to_dev_list (dev, &child->parents, FALSE);
}
/**
* @brief Add a new parent, which is a device, that already exists
@@ -2157,8 +2138,8 @@
*/
int
device_add_existing_parent (device_t dev, device_t parent){
- device_add_to_dev_list (parent, &(dev->parents), FALSE);
- device_add_to_dev_list (dev, &(parent->children), TRUE);
+ device_add_to_dev_list (parent, &dev->parents, FALSE);
+ device_add_to_dev_list (dev, &parent->children, TRUE);
}
@@ -2192,7 +2173,7 @@
name, DEVICENAME(dev), order, unit));
child = malloc (sizeof(struct devicelink), M_BUS, M_NOWAIT|M_ZERO);
- child->device_ptr = make_device(dev, name, unit/*, NULL*/);
+ child->device_ptr = make_device(dev, name, unit);
if (child->device_ptr == NULL){
free (child);
return (NULL);
@@ -2429,15 +2410,14 @@
* If the state is already probed, then return. However, don't
* return if we can rebid this object.
*/
- if (/*child->state == DS_ALIVE &&*/ (child->flags & DF_REBID) == 0)
+ if (child->state == DS_ALIVE && (child->flags & DF_REBID) == 0)
return (0);
for (; dc; dc = dc->parent) {
for (dl = first_matching_driver(dc, child);
dl;
dl = next_matching_driver(dc, child, dl)) {
- if(!driverinfo_get_flags(dl->driver, &flags))
- /*todo what?*/;
+ driverinfo_get_flags(dl->driver, &flags);
if (child->state == DS_ALIVE && flags & DR_LOWEST ||
(child->state != DS_ALIVE && flags & ~(DR_STACKAWARE|DR_LOWEST)))
continue;
@@ -2552,11 +2532,11 @@
* @brief Return the parent of a device
*/
device_t
-device_get_parent(device_t dev) /*TODO*/
+device_get_parent(device_t dev)
{
devicelink_t pd;
- if (!TAILQ_EMPTY(&(dev->parents))){
- pd = TAILQ_FIRST(&(dev->parents));
+ if (!TAILQ_EMPTY(&dev->parents)){
+ pd = TAILQ_FIRST(&dev->parents);
return (pd->device_ptr);
}
return (NULL);
@@ -2625,10 +2605,10 @@
driver_t *
device_get_driver(device_t dev)
{
- //driverlink_t dl;
driverinfolink_t dil;
- if (!TAILQ_EMPTY(&((dev->drivers)[DRV_LOWEST]))){
- dil=TAILQ_FIRST(&((dev->drivers)[DRV_LOWEST]));
+
+ if (!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST])){
+ dil=TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
return (dil->pdriver->driver);
}
return (NULL);
@@ -2810,8 +2790,8 @@
void *
device_get_softc(device_t dev)
{
- if(!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST])))
- return (TAILQ_FIRST(&(dev->drivers[DRV_LOWEST]))->softc);
+ if(!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))
+ return ((TAILQ_FIRST(&dev->drivers[DRV_LOWEST]))->softc);
return (NULL);
}
@@ -2825,7 +2805,7 @@
return (NULL);
level = driverinfo_flags2idx (flags);
- TAILQ_FOREACH (dil, &(dev->drivers[level]), link){
+ TAILQ_FOREACH (dil, &dev->drivers[level], link){
if (dil->pdriver->driver == driver)
return (dil->softc);
}
@@ -2845,8 +2825,9 @@
void *psoftc;
driverinfolink_t dil;
- if(!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST])))
- dil = TAILQ_FIRST(&(dev->drivers[DRV_LOWEST]));
+ if(TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))
+ return (NULL);
+ dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
if (dil && !(dil->flags & DF_EXTERNALSOFTC))
free(dil->softc, M_BUS_SC);
dil->softc = softc;
@@ -2866,7 +2847,7 @@
return();
level = driverinfo_flags2idx (flags);
- TAILQ_FOREACH (dil, &(dev->drivers[level]), link){
+ TAILQ_FOREACH (dil, &dev->drivers[level], link){
if (dil->pdriver->driver == driver)
break;
}
@@ -2943,8 +2924,8 @@
devicelink_t parent;
if (dev->state < DS_ATTACHED)
panic("device_busy: called for unattached device");
- if (dev->busy == 0 && !TAILQ_EMPTY(&(dev->parents))){
- TAILQ_FOREACH (parent, &(dev->parents), link){
+ if (dev->busy == 0 && !TAILQ_EMPTY(&dev->parents)){
+ TAILQ_FOREACH (parent, &dev->parents, link){
device_busy(parent->device_ptr);
}
}
@@ -2964,12 +2945,11 @@
device_get_nameunit(dev));
dev->busy--;
if (dev->busy == 0) {
- if (/*dev->parent*/!TAILQ_EMPTY(&(dev->parents))){
- TAILQ_FOREACH (parent, &(dev->parents), link){
+ if (!TAILQ_EMPTY(&dev->parents)){
+ TAILQ_FOREACH (parent, &dev->parents, link){
device_unbusy(parent->device_ptr);
}
}
- //device_unbusy(dev->parent);
dev->state = DS_ATTACHED;
}
}
@@ -3066,13 +3046,13 @@
driverinfolink_t dil;
for (level = DRV_TOPMOST; level>= DRV_LOWEST; level--){
- if (TAILQ_EMPTY(&(dev->drivers[level])))
+ if (TAILQ_EMPTY(&dev->drivers[level]))
continue;
- while(dil = TAILQ_FIRST(&(dev->drivers[level]))){
+ while(dil = TAILQ_FIRST(&dev->drivers[level])){
dil->state = DS_RAW;
if(error = device_detach(dev))
return(error);
- TAILQ_REMOVE(&(dev->drivers[level]), dil, link);
+ TAILQ_REMOVE(&dev->drivers[level], dil, link);
free(dil);
}
@@ -3087,7 +3067,7 @@
* @retval ENOMEM a memory allocation failure occurred
*/
int
-device_set_driver(device_t dev, driver_t *driver) /*TODO*/
+device_set_driver(device_t dev, driver_t *driver)
{
driverinfo_t di;
driverinfolink_t dil;
@@ -3140,9 +3120,6 @@
dev->softc = malloc(driver->size, M_BUS_SC,
M_NOWAIT | M_ZERO);
if (!dev->softc) {
- //kobj_delete((kobj_t) dev, 0);
- //kobj_init((kobj_t) dev, &null_class);
- //dev->driver = NULL;
TAILQ_REMOVE(&(dev->drivers[level]), dil, link);
free (dil);
return (ENOMEM);
@@ -3205,6 +3182,9 @@
}
return (error);
}
+
+ dev->state = DS_ALIVE;
+
error = device_attach(dev);
return (error);
@@ -3238,20 +3218,19 @@
device_sysctl_init(dev);
if (!device_is_quiet(dev)){
- TAILQ_FOREACH (pd, &(dev->parents), link){
+ TAILQ_FOREACH (pd, &dev->parents, link){
device_print_child(pd->device_ptr, dev);
}
}
dev->raw--;
-
if ((error = DEVICE_ATTACH(dev)) != 0) {
printf("device_attach: %s%d attach returned %d\n",
dev->driver->name, dev->unit, error);
/* Unset the class; set in device_probe_child */
if (dev->devclass == 0)
device_set_devclass(dev, 0);
- TAILQ_REMOVE(&(dev->drivers[dev->driver_level]), dev->driver, link);
+ TAILQ_REMOVE(&dev->drivers[dev->driver_level], dev->driver, link);
free(dev->driver);
device_sysctl_fini(dev);
if(!dev->raw){
@@ -3268,8 +3247,8 @@
}
dil->state = DS_ATTACHED;
if(!dev->raw)
- dev->state = DS_ATTECHED;
- dev->driver = (!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST]))) ?
+ dev->state = DS_ATTACHED;
+ dev->driver = (!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST])) ?
TAILQ_FIRST(&(dev->drivers[DRV_LOWEST])) : NULL;
dev->driver_level=DRV_LOWEST;
devadded(dev);
@@ -3309,10 +3288,10 @@
if ((error = DEVICE_DETACH(dev)) != 0)
return (error);
if (dev->driver_level != DRV_LOWEST){
- TAILQ_REMOVE(&(dev->drivers[dev->driver_level]), dev->driver, link);
+ TAILQ_REMOVE(&dev->drivers[dev->driver_level], dev->driver, link);
free(dev->driver);
- dev->driver = (!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST]))) ?
- TAILQ_FIRST(&(dev->drivers[DRV_LOWEST])) : NULL;
+ dev->driver = (!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST])) ?
+ TAILQ_FIRST(&dev->drivers[DRV_LOWEST]) : NULL;
dev->driver_level=DRV_LOWEST;
dev->raw--;
if(!dev->raw)
@@ -3321,8 +3300,8 @@
}
devremoved(dev);
device_printf(dev, "detached\n");
- if (!TAILQ_EMPTY(&(dev->parents))){
- TAILQ_FOREACH (pd, &(dev->parents), link){
+ if (!TAILQ_EMPTY(&dev->parents)){
+ TAILQ_FOREACH (pd, &dev->parents, link){
BUS_CHILD_DETACHED(pd->device_ptr, dev);
}
}
More information about the p4-projects
mailing list