Date: Sun, 8 Jul 2012 23:59:05 -0400 From: Arnaud Lacombe <lacombar@gmail.com> To: Warner Losh <imp@bsdimp.com> Cc: FreeBSD Hackers <freebsd-hackers@freebsd.org>, FreeBSD Current <freebsd-current@freebsd.org> Subject: Re: newbus' ivar's limitation.. Message-ID: <CACqU3MWpBNYgMJ-9Cm5_5udLZynraWCP_TTAaBdV4py1xqt%2BXQ@mail.gmail.com> In-Reply-To: <31A0DCE7-3B93-41BC-805A-E0B163892112@bsdimp.com> References: <CACqU3MVh6shncm2Vtqj9oe_HxowWscCZ1eJf0q2F%2B=t_xKKBfQ@mail.gmail.com> <31A0DCE7-3B93-41BC-805A-E0B163892112@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, On Sun, Jul 8, 2012 at 10:07 PM, Warner Losh <imp@bsdimp.com> wrote: > > On Jul 8, 2012, at 7:22 PM, Arnaud Lacombe wrote: >> Ok, yet another Newbus' limitation. Assuming a device exports more >> than one interface, and one of its child has need to use more than one >> interface, each interfaces cannot register, concurrently, its own >> ivar. While I try to always have a single child per >> interface/resource, I need to keep some compatibility with the old way >> of doing thing (POLA wrt. drivers I cannot/will not convert and >> userland). So, it would have been nice if ivar had been per-interface, >> not global and unique to one device. > > There's one pointer for the ivars. The bus code gets to determine what t= he ivar looks like, because the interface is totally private to the bus. S= o long as it returns the right thing for any key that's presented, it doesn= 't matter quite how things are done. > > So I'm not sure I understand what you are saying here. > > The problem, more basically, is that the ivar keys are not unique. Curre= ntly, there's no bits used in the key to define the values to be non-overla= pping. For example: > enum pci_device_ivars { > PCI_IVAR_SUBVENDOR, > PCI_IVAR_SUBDEVICE, > PCI_IVAR_VENDOR, > .... > }; > > We could easily reserve the upper 16-bits of this field to be that key. = This value could then be used to differentiate them. But this wouldn't sca= le too well. Given that there's only about a dozen or two in the tree, tha= t's right at the moment, it wouldn't be hard to do something like: > > enum ivar_namespace { > IVAR_PCI =3D 1, > IVAR_PCCARD, > IVAR_USB, > etc > }; > #define IVAR_SHIFT 16 > > and the above could be changed to: > > enum pci_device_ivars { > PCI_IVAR_SUBVENDOR =3D IVAR_PCI << IVAR_SHIFT, > PCI_IVAR_SUBDEVICE, > PCI_IVAR_VENDOR, > .... > }; > > and then we'd have an unambiguous key, and the bus could easily implement= multiple interfaces. > > but then again, most of the existing interfaces in the kernel are mutuall= y exclusive, so you could implement this just for your new interfaces. > ok, I think I got it now. You and I are exactly saying the same thing, just in different terms; there is no way to currently specify multiple independent (/overlapping) ivars in a child... - Arnaud
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACqU3MWpBNYgMJ-9Cm5_5udLZynraWCP_TTAaBdV4py1xqt%2BXQ>