From owner-p4-projects@FreeBSD.ORG Wed Jul 25 19:07:23 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 887F316A420; Wed, 25 Jul 2007 19:07:23 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4A92216A419 for ; Wed, 25 Jul 2007 19:07:23 +0000 (UTC) (envelope-from thioretic@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 35EA713C494 for ; Wed, 25 Jul 2007 19:07:23 +0000 (UTC) (envelope-from thioretic@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6PJ7N9X070511 for ; Wed, 25 Jul 2007 19:07:23 GMT (envelope-from thioretic@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6PJ7Mh8070508 for perforce@freebsd.org; Wed, 25 Jul 2007 19:07:22 GMT (envelope-from thioretic@FreeBSD.org) Date: Wed, 25 Jul 2007 19:07:22 GMT Message-Id: <200707251907.l6PJ7Mh8070508@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to thioretic@FreeBSD.org using -f From: Maxim Zhuravlev To: Perforce Change Reviews Cc: Subject: PERFORCE change 124098 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Jul 2007 19:07:23 -0000 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)); }