Date: Mon, 29 Jul 2013 08:52:03 -0600 From: Ian Lepore <ian@FreeBSD.org> To: Ryan Stone <rysto32@gmail.com> Cc: "freebsd-hackers@freebsd.org" <freebsd-hackers@FreeBSD.org> Subject: Re: BUS_PROBE_NOWILDCARD behaviour doesn't seem to match DEVICE_PROBE(9) Message-ID: <1375109523.45247.32.camel@revolution.hippie.lan> In-Reply-To: <CAFMmRNw5=E6Do_u0dYkHu=cPV_nmyqjrq8dHVwWLgTnrsj7D7A@mail.gmail.com> References: <CAFMmRNw5=E6Do_u0dYkHu=cPV_nmyqjrq8dHVwWLgTnrsj7D7A@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 2013-06-20 at 10:54 -0400, Ryan Stone wrote: > http://www.freebsd.org/cgi/man.cgi?query=DEVICE_PROBE&apropos=0&sektion=0&manpath=FreeBSD%208.2-RELEASE&format=html > > DEVICE_PROBE(9) has this to say about BUS_PROBE_NOWILDCARD: > > The driver expects its parent to tell it which children to manage and no > probing is really done. The device only matches if its parent bus > specifically said to use this driver. > > > I interpreted this as meaning that if BUS_ADD_CHILD() is called with the > name parameter specifying a driver then if that driver's probe method > returns BUS_PROBE_NOWILDCARD the driver will match that device. However > the logic in subr_bus.c is more strict; it will only match if the unit > number if also specified. This seems overly strict to me, and there > appears to be at least one case in-tree where a driver will never match due > to this behaviour: > > http://svnweb.freebsd.org/base/head/sys/dev/iicbus/iicsmb.c?revision=227843&view=markup > > The iicsmb driver calls BUS_ADD_CHILD() from its identify method with a > wildcarded unit number (-1) but the driver specified. It then returns > BUS_PROBE_NOWILDCARD from its attach method(intending that it only claim > the device created in the identify method), but that won't match. > > I want to use the exact same pattern in a new driver. The following patch > allows this to work: > > diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c > index 1f3d4e8..7e48b0e 100644 > --- a/sys/kern/subr_bus.c > +++ b/sys/kern/subr_bus.c > @@ -2015,7 +2015,7 @@ device_probe_child(device_t dev, device_t child) > * in stone by the parent bus. > */ > if (result <= BUS_PROBE_NOWILDCARD && > - child->flags & DF_WILDCARD) > + !(child->flags & DF_FIXEDCLASS)) > continue; > best = dl; > pri = result; > > This should be safe to do, as all devices that specified a unit number must > have specified a driver, so this can't cause any devices to suddenly fail > to match. I supposed that it theoretically could cause a driver to match a > device that previously it wouldn't have, but I'm having trouble seeing how > somebody could add a device of type "foo" and not expect the "foo" driver > to attach. > > Any objections if I commit this? I know this is pretty long after the fact, but it looks like this never got committed. I recently had to port some drivers written for freebsd 4 and 6 to 8.2, and some of them have no real probe mechanism and attached themselves to, like, *everything* (serial and parallel ports and so on). They're instantiated based on hints that are definitive, so I switched to returning BUS_PROBE_NOWILDCARD and sanity returned. Then I remembered this email, so I applied your patch and re-tested and everything still worked perfectly. Not exactly an exhaustive test, but at least a positive datapoint. -- Ian
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1375109523.45247.32.camel>