Date: Wed, 25 Jul 2007 19:07:22 GMT From: Maxim Zhuravlev <thioretic@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124098 for review Message-ID: <200707251907.l6PJ7Mh8070508@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124098 Change 124098 by thioretic@thioretic on 2007/07/25 19:06:25 Modify root_bus_module_handler() according new realities. Some cleanups. Affected files ... .. //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#21 edit Differences ... ==== //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#21 (text+ko) ==== @@ -809,6 +809,14 @@ static driverinfo_list_t driverinfos = TAILQ_HEAD_INITIALIZER(driverinfos); +/** + * @internal + * + * Is used, when a driver s used in an API function, + * but is not in driverinfos. Eg. may happen, if + * device_set_driver is called by a bus with driver, set + * to kobj_class, which wasn't registered by DRIVER_MODULE(). + */ static drv_internal_t driverinfo_create_driver_drv_internal (driver_t *driver){ drv_internal_t new_drv; @@ -850,6 +858,7 @@ return (NULL); di->driver = driver->devops; di->flags = driver->flags; + di->topology_ops = kobj_create (di->driver, M_BUS, M_NOWAIT|M_ZERO); TAILQ_INSERT_TAIL(&driverinfos, di, link); bus_data_generation_update(); @@ -1410,7 +1419,6 @@ if (!drv_intnl && !(di = driverinfo_add_driver(intnl))) if (drv_intnl) free (drv_intnl); } - di->topology_ops = kobj_create (di->driver, M_BUS, M_NOWAIT|M_ZERO); /* * Make sure the devclass which the driver is implementing exists. @@ -2006,7 +2014,7 @@ device_set_driver (dev, driver); if (DEVICE_PROBE(dev)<=0){ - driver_attach(dev); + device_attach(dev); } } @@ -3348,11 +3356,14 @@ device_set_devclass(dev, 0); TAILQ_REMOVE(&dev->drivers[dev->driver_level], dev->driver, link); free(dev->driver); - device_sysctl_fini(dev); +// device_sysctl_fini(dev); if(!dev->raw){ dev->state = (dev->driver_level == DRL_LOWEST) ? DS_NOTPRESENT : DS_ATTACHED; } + dev->driver = (!TAILQ_EMPTY(&dev->drivers[DRL_LOWEST])) ? + TAILQ_FIRST(&dev->drivers[DRL_LOWEST]) : NULL; + dev->driver_level=DRL_LOWEST; return (error); } @@ -4361,7 +4372,7 @@ device_t parent; parent = device_get_parent (dev); if (!parent) - return (0); + return (NULL); return (BUS_ALLOC_RESOURCE(parent, dev, type, rid, start, end, count, flags)); } @@ -4670,10 +4681,9 @@ case MOD_LOAD: TAILQ_INIT(&bus_data_devices); kobj_class_compile((kobj_class_t) &root_driver); - root_bus = make_device(NULL, "root", 0/*, NULL*/); + root_bus = make_device(NULL, "root", 0); root_bus->desc = "System root bus"; - kobj_init((kobj_t) root_bus, (kobj_class_t) &root_driver); - root_bus->driver = &root_driver; + device_set_driver(root_bus, root_driver); root_bus->state = DS_ATTACHED; root_devclass = devclass_find_internal("root", 0, FALSE, FALSE); devinit(); @@ -4749,7 +4759,7 @@ *out = malloc (sizeof(char*)*(count+1), M_BUS, M_NOWAIT|M_ZERO); count=0; do { - while (*ptr!='|' && *ptr!='\0') num++, ptr++; + while (*ptr!='|' && *ptr!='\0') {num++; ptr++;} newpar = malloc ((num+1)*sizeof(char), M_BUS, M_NOWAIT|M_ZERO); if (!newpar) return(0); strlcpy(newpar, cptr, num+1); @@ -4965,8 +4975,8 @@ (dev->flags&DF_WILDCARD? "wildcard,":""), (dev->flags&DF_DESCMALLOCED? "descmalloced,":""), (dev->flags&DF_REBID? "rebiddable,":""), - (dev->ivars? "":"no "), - ((TAILQ_FIRST(&(dev->drivers[DRL_LOWEST])))->softc? "":"no "), + ((!TAILQ_EMPTY(&dev->drivers[DRL_LOWEST])) && (TAILQ_FIRST(&dev->drivers[DRL_LOWEST]))->ivars? "":"no "), + ((!TAILQ_EMPTY(&dev->drivers[DRL_LOWEST])) && (TAILQ_FIRST(&dev->drivers[DRL_LOWEST]))->softc? "":"no "), dev->busy)); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707251907.l6PJ7Mh8070508>