Date: Tue, 17 Jul 2007 13:04:58 GMT From: Maxim Zhuravlev <thioretic@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 123650 for review Message-ID: <200707171304.l6HD4wPg011159@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123650 Change 123650 by thioretic@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); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707171304.l6HD4wPg011159>