Re: How to handle device drivers depending on another device.

Grant Likely
2008-12-10T14:47:11Z

On Tue, Dec 9, 2008 at 11:09 PM, Dave Hylands <dhylands@gmail.com> wrote:
> Hi Grant,
>
>> Problem: There are no guarantees that the MDIO bus controller will be
>> probed before the Ethernet device.
>
> I believe that what you're supposed to do is to have "bus" controllers
> initilize themselves using subsys_initcall rather than module_init. If
> you look in include/linux/init.h you can see the various initcall
> definitions. module_init is at the same level as device_initcall. All
> of the initcalls at one "level" are completed before moving onto the
> next level.

Even so the problem still exists. There is 1 bus and 3 devices
involved. The 'bus' infrastructure is the MDIO bus (drivers/net/phy),
and it does indeed use subsys_initcall(). But then there is the
Ethernet device, the MDIO controller device, and the PHY device. Both
the Ethernet device and the MDIO controller device are probed via the
of_platform bus. The PHY device is attached to the MDIO controller.

So, while the MDIO bus infrastructure is guaranteed to be initialized
first; there is no guarantee that the MDIO bus controller will be
probed before the Ethernet device. Secondly, even if the MDIO
controller is probed before the Ethernet device, there is no guarantee
that the PHY device will get registered onto the MDIO bus before the
Ethernet device is probed. There remains the uncertainty of which of
the two devices will get registered first and the Ethernet driver
needs a mechanism to defer initialization until the PHY device is
ready.

> Of course, if you're using loadable modules, then the dependencies
> should take care of things for you.

For the bus infrastructure, yes, but not for the bus instances.

g.

--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.