Date: Mon, 23 Jul 2007 18:06:05 GMT From: Maxim Zhuravlev <thioretic@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 123980 for review Message-ID: <200707231806.l6NI65Kh000279@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123980 Change 123980 by thioretic@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));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707231806.l6NI65Kh000279>