diff mbox series

net: usb: lan78xx: add weak dependency with micrel phy module

Message ID 20240724102349.430078-1-jtornosm@redhat.com (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series net: usb: lan78xx: add weak dependency with micrel phy module | expand

Checks

Context Check Description
netdev/series_format warning Single patches do not need cover letters; Target tree name not specified in the subject
netdev/tree_selection success Guessed tree name to be net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit fail Errors and warnings before: 273 this patch: 15
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang fail Errors and warnings before: 281 this patch: 19
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn fail Errors and warnings before: 283 this patch: 15
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 4 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Jose Ignacio Tornos Martinez July 24, 2024, 10:23 a.m. UTC
The related module for the phy is loaded dynamically depending on the
current hardware. In order to keep this behavior and have the phy modules
available from initramfs, add a 'weak' dependency with the phy modules to
allow user tools, like dracut, get this information.

Include micrel phy module because it is the hardware that I have. Other
possible phy modules can be added later.

Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
---
 drivers/net/usb/lan78xx.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Andrew Lunn July 24, 2024, 11:49 a.m. UTC | #1
On Wed, Jul 24, 2024 at 12:23:44PM +0200, Jose Ignacio Tornos Martinez wrote:
> The related module for the phy is loaded dynamically depending on the
> current hardware. In order to keep this behavior and have the phy modules
> available from initramfs, add a 'weak' dependency with the phy modules to
> allow user tools, like dracut, get this information.
> 
> Include micrel phy module because it is the hardware that I have. Other
> possible phy modules can be added later.
> 
> Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
> ---
>  drivers/net/usb/lan78xx.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
> index 8adf77e3557e..c3945aebf94e 100644
> --- a/drivers/net/usb/lan78xx.c
> +++ b/drivers/net/usb/lan78xx.c
> @@ -5074,3 +5074,4 @@ module_usb_driver(lan78xx_driver);
>  MODULE_AUTHOR(DRIVER_AUTHOR);
>  MODULE_DESCRIPTION(DRIVER_DESC);
>  MODULE_LICENSE("GPL");
> +MODULE_WEAKDEP("micrel");

~/linux$ grep -r MODULE_WEAKDEP *
~/linux$ 

Is MODULE_WEAKDEP new?

It seems like a "Wack a Mole" solution, which is not going to
scale. Does dracut not have a set of configuration files indicating
what modules should be included, using wildcards? If you want to have
NFS root, you need all the network drivers, and so you need all the
PHY drivers?

    Andrew
Greg Kroah-Hartman July 24, 2024, 1:36 p.m. UTC | #2
On Wed, Jul 24, 2024 at 01:49:14PM +0200, Andrew Lunn wrote:
> On Wed, Jul 24, 2024 at 12:23:44PM +0200, Jose Ignacio Tornos Martinez wrote:
> > The related module for the phy is loaded dynamically depending on the
> > current hardware. In order to keep this behavior and have the phy modules
> > available from initramfs, add a 'weak' dependency with the phy modules to
> > allow user tools, like dracut, get this information.
> > 
> > Include micrel phy module because it is the hardware that I have. Other
> > possible phy modules can be added later.
> > 
> > Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
> > ---
> >  drivers/net/usb/lan78xx.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
> > index 8adf77e3557e..c3945aebf94e 100644
> > --- a/drivers/net/usb/lan78xx.c
> > +++ b/drivers/net/usb/lan78xx.c
> > @@ -5074,3 +5074,4 @@ module_usb_driver(lan78xx_driver);
> >  MODULE_AUTHOR(DRIVER_AUTHOR);
> >  MODULE_DESCRIPTION(DRIVER_DESC);
> >  MODULE_LICENSE("GPL");
> > +MODULE_WEAKDEP("micrel");
> 
> ~/linux$ grep -r MODULE_WEAKDEP *
> ~/linux$ 
> 
> Is MODULE_WEAKDEP new?
> 
> It seems like a "Wack a Mole" solution, which is not going to
> scale. Does dracut not have a set of configuration files indicating
> what modules should be included, using wildcards? If you want to have
> NFS root, you need all the network drivers, and so you need all the
> PHY drivers?

Agree, this isn't ok, if you have a real dependancy, then show it as a
real one please with the tools that we have to show that.

thanks,

greg k-h
Jose Ignacio Tornos Martinez July 24, 2024, 2:46 p.m. UTC | #3
Hello Andrew,

> Is MODULE_WEAKDEP new?
Yes, and it has been merged into torvalds/linux.git from today:
https://git.kernel.org/torvalds/c/f488790059fe7be6b2b059ddee10835b2500b603
Here the commit reference in torvalds/linux.git if you update your repo:
https://github.com/torvalds/linux/commit/61842868de13aa7fd7391c626e889f4d6f1450bf

I will include more references in case you want to get more information:
kmod reference:
https://github.com/kmod-project/kmod/commit/05828b4a6e9327a63ef94df544a042b5e9ce4fe7
kmod test-suite has also been completed:
https://github.com/kmod-project/kmod/commit/d06712b51404061eef92cb275b8303814fca86ec
dracut patch has also been approved:
https://github.com/dracut-ng/dracut-ng/commit/8517a6be5e20f4a6d87e55fce35ee3e29e2a1150

> It seems like a "Wack a Mole" solution, which is not going to
> scale. Does dracut not have a set of configuration files indicating
> what modules should be included, using wildcards? If you want to have
> NFS root, you need all the network drivers, and so you need all the
> PHY drivers?
The intention is to have a general solution not only related to the
possible phy modules. That is, it is a solution for any module dependencies
that are solved within the kernel but need to be known by user tools to
build initramfs. We could use wildcards for some examples but it is not
always easy to reference them.
In addition, initramfs needs to be as small as possible so we should avoid
wildcards and in this case, include the only possible phy modules (indeed
not all phy's are compatible with a device). In this way, with the default
behavior, initramfs would include only the drivers for the current machine
and the only related phy modules.

Thanks

Best regards
José Ignacio
Jose Ignacio Tornos Martinez July 24, 2024, 2:54 p.m. UTC | #4
Hello Greg,

> Agree, this isn't ok, if you have a real dependancy, then show it as a
> real one please with the tools that we have to show that.
IMHO, I think it can be very useful.
Apart from the comments trying to answer Andrew, let me try to explain
better:

I am trying to solve dependencies that are not declared in anyway, but
without modifying the normal kernel behavior, for special cases in which
some modules are automatically loaded when something external is needed
or detected. For this cases, user tools like dracut don't have anyway to
detect this and if we a use a normal soft dependency, the modules will be
always loaded in advance.

Yes, it is a real dependency, but for this case, some phy modules are
possible and I think it doesn't make sense to load all the phy that could
be possible in advance, because there is an internal mechanism to only load
the necessary one (the associated phy is read using mdio bus and then
the associated phy module is loaded during runtime  by means of the
function phy_request_driver_module).

I think it is better to load only the necessary modules and have only in
initramfs the necessary modules.

Here you can find the complete/original justification for this:
https://github.com/kmod-project/kmod/commit/05828b4a6e9327a63ef94df544a042b5e9ce4fe7

Please, take into account that this is the first usage of this feature,
lan78xx can be completed (others possible phy modules can be added) and it
can be considered by other modules in the same situation.

Let me add in the thread to the other people that have been involved.

Thanks

Best regards
José Ignacio
Florian Fainelli July 24, 2024, 3:31 p.m. UTC | #5
On 7/24/2024 7:46 AM, Jose Ignacio Tornos Martinez wrote:
> Hello Andrew,
> 
>> Is MODULE_WEAKDEP new?
> Yes, and it has been merged into torvalds/linux.git from today:
> https://git.kernel.org/torvalds/c/f488790059fe7be6b2b059ddee10835b2500b603
> Here the commit reference in torvalds/linux.git if you update your repo:
> https://github.com/torvalds/linux/commit/61842868de13aa7fd7391c626e889f4d6f1450bf

What is the difference with the existing MODULE_SOFTDEP() which has pre 
and post qualifiers and seems just as fit?

> 
> I will include more references in case you want to get more information:
> kmod reference:
> https://github.com/kmod-project/kmod/commit/05828b4a6e9327a63ef94df544a042b5e9ce4fe7
> kmod test-suite has also been completed:
> https://github.com/kmod-project/kmod/commit/d06712b51404061eef92cb275b8303814fca86ec
> dracut patch has also been approved:
> https://github.com/dracut-ng/dracut-ng/commit/8517a6be5e20f4a6d87e55fce35ee3e29e2a1150
> 
>> It seems like a "Wack a Mole" solution, which is not going to
>> scale. Does dracut not have a set of configuration files indicating
>> what modules should be included, using wildcards? If you want to have
>> NFS root, you need all the network drivers, and so you need all the
>> PHY drivers?
> The intention is to have a general solution not only related to the
> possible phy modules. That is, it is a solution for any module dependencies
> that are solved within the kernel but need to be known by user tools to
> build initramfs. We could use wildcards for some examples but it is not
> always easy to reference them.
> In addition, initramfs needs to be as small as possible so we should avoid
> wildcards and in this case, include the only possible phy modules (indeed
> not all phy's are compatible with a device). In this way, with the default
> behavior, initramfs would include only the drivers for the current machine
> and the only related phy modules.
> 
> Thanks
> 
> Best regards
> José Ignacio
> 
>
Jose Ignacio Tornos Martinez July 24, 2024, 4:10 p.m. UTC | #6
Hello Florian,

> What is the difference with the existing MODULE_SOFTDEP() which has pre 
> and post qualifiers and seems just as fit?
MODULE_SOFTDEP (with pre and/or post qualifiers as you say) causes the
modules to be directly loaded.

MODULES_WEAKDEP doesn't cause the modules to be loaded. 
The load will be done later, if necessary, by other mechanisms in the kernel.
For example for the commented case, the associated phy is read using mdio bus
and then the associated phy module is loaded during runtime  by means of the
function phy_request_driver_module.
It is just informing to user applications, like dracut, about this in order to
be able to prepare the complete and correct initramfs. 
Keep in mind that these applications have no way of knowing about this situation
and if the phy is not included in this case, the driver will not work at
initramfs stage.
If we used MODULE_SOFTDEP the modules would be loaded in advance even if they
were not necessary.
For the commented case, I have included only one phy because it is the hardware
that I have, but other phy devices (modules) are possible and they can be some.

Thanks 

Best regards
José Ignacio
Andrew Lunn July 24, 2024, 10:57 p.m. UTC | #7
> For the commented case, I have included only one phy because it is the hardware
> that I have, but other phy devices (modules) are possible and they can be some.

So this the whole whacker a mole problem. It works for you but fails
for 99% of users. How is this helping us?

Maybe a better solution is to first build an initramfs with
everything, plus the kitchen sink. Boot it, and then look at what has
been loaded in order to get the rootfs mounted. Then update the
initramfs with just what is needed? That should be pretty generic,
with throw out networking ig NFS root is not used, just load JFFS2 and
a NAND driver if it was used for the rootfs, etc.

	  Andrew
Lucas De Marchi July 25, 2024, 4:25 a.m. UTC | #8
On Thu, Jul 25, 2024 at 12:57:05AM GMT, Andrew Lunn wrote:
>> For the commented case, I have included only one phy because it is the hardware
>> that I have, but other phy devices (modules) are possible and they can be some.
>
>So this the whole whacker a mole problem. It works for you but fails
>for 99% of users. How is this helping us?

no, this is the first instance that was found/added.

if you declare a softdep what happens is that the dep is loaded first
(needed or not) and your module is loaded after that

if you declare a weakdep, you are just instructing the tools that the
module may or may not be needed.  Any module today that does a
request_module("foo") could be a candidate to migrate from
MODULE_SOFTDEP("pre: foo") to the new weakdep, as long as it handles
properly the module being loaded ondemand as opposed to using
request_module() to just synchronize the module being loaded.

>
>Maybe a better solution is to first build an initramfs with
>everything, plus the kitchen sink. Boot it, and then look at what has
>been loaded in order to get the rootfs mounted. Then update the
>initramfs with just what is needed? That should be pretty generic,
>with throw out networking ig NFS root is not used, just load JFFS2 and
>a NAND driver if it was used for the rootfs, etc.

that works for development systems or if you are fine tuning it for each
system you have. It doesn't work for a generic distro with the kitchen
sink of modules and still trying to minimize the initrd without end user
intervention. So it works for 99% of users.

Lucas De Marchi

>
>	  Andrew
Florian Fainelli July 25, 2024, 4:42 a.m. UTC | #9
On 7/24/2024 9:25 PM, Lucas De Marchi wrote:
> On Thu, Jul 25, 2024 at 12:57:05AM GMT, Andrew Lunn wrote:
>>> For the commented case, I have included only one phy because it is 
>>> the hardware
>>> that I have, but other phy devices (modules) are possible and they 
>>> can be some.
>>
>> So this the whole whacker a mole problem. It works for you but fails
>> for 99% of users. How is this helping us?
> 
> no, this is the first instance that was found/added.
> 
> if you declare a softdep what happens is that the dep is loaded first
> (needed or not) and your module is loaded after that
> 
> if you declare a weakdep, you are just instructing the tools that the
> module may or may not be needed.  Any module today that does a
> request_module("foo") could be a candidate to migrate from
> MODULE_SOFTDEP("pre: foo") to the new weakdep, as long as it handles
> properly the module being loaded ondemand as opposed to using
> request_module() to just synchronize the module being loaded.
> 
>>
>> Maybe a better solution is to first build an initramfs with
>> everything, plus the kitchen sink. Boot it, and then look at what has
>> been loaded in order to get the rootfs mounted. Then update the
>> initramfs with just what is needed? That should be pretty generic,
>> with throw out networking ig NFS root is not used, just load JFFS2 and
>> a NAND driver if it was used for the rootfs, etc.
> 
> that works for development systems or if you are fine tuning it for each
> system you have. It doesn't work for a generic distro with the kitchen
> sink of modules and still trying to minimize the initrd without end user
> intervention. So it works for 99% of users.

OK, but 'config USB_LAN78XX' does have a number of 'select' meaning 
those are hard functional dependencies, and so those should be more than 
a hint that these modules are necessary. Why should we encode that 
information twice: once in Kconfig and another time within the module .c 
file itself? Cannot we have better tooling to help build an initramfs 
which does include everything that has been selected?
Lucas De Marchi July 25, 2024, 6:50 a.m. UTC | #10
On Wed, Jul 24, 2024 at 09:42:48PM GMT, Florian Fainelli wrote:
>
>
>On 7/24/2024 9:25 PM, Lucas De Marchi wrote:
>>On Thu, Jul 25, 2024 at 12:57:05AM GMT, Andrew Lunn wrote:
>>>>For the commented case, I have included only one phy because it 
>>>>is the hardware
>>>>that I have, but other phy devices (modules) are possible and 
>>>>they can be some.
>>>
>>>So this the whole whacker a mole problem. It works for you but fails
>>>for 99% of users. How is this helping us?
>>
>>no, this is the first instance that was found/added.
>>
>>if you declare a softdep what happens is that the dep is loaded first
>>(needed or not) and your module is loaded after that
>>
>>if you declare a weakdep, you are just instructing the tools that the
>>module may or may not be needed.  Any module today that does a
>>request_module("foo") could be a candidate to migrate from
>>MODULE_SOFTDEP("pre: foo") to the new weakdep, as long as it handles
>>properly the module being loaded ondemand as opposed to using
>>request_module() to just synchronize the module being loaded.
>>
>>>
>>>Maybe a better solution is to first build an initramfs with
>>>everything, plus the kitchen sink. Boot it, and then look at what has
>>>been loaded in order to get the rootfs mounted. Then update the
>>>initramfs with just what is needed? That should be pretty generic,
>>>with throw out networking ig NFS root is not used, just load JFFS2 and
>>>a NAND driver if it was used for the rootfs, etc.
>>
>>that works for development systems or if you are fine tuning it for each
>>system you have. It doesn't work for a generic distro with the kitchen
>>sink of modules and still trying to minimize the initrd without end user
>>intervention. So it works for 99% of users.
>
>OK, but 'config USB_LAN78XX' does have a number of 'select' meaning 
>those are hard functional dependencies, and so those should be more 
>than a hint that these modules are necessary. Why should we encode 
>that information twice: once in Kconfig and another time within the 

selecting a config currently has nothing to do with how module
dependency is calculated. You can select whatever in kconfig for
whatever reason. And a selecting a kconfig is often used to select
things other than modules.

"hard" dependencies are calculated by depmod based purely on the symbols
the module uses. So if module A calls (a exported) symbol from module
B, there is a "hard" dependency. modules.dep will have a line like

kernel/drivers/gpu/drm/xe/xe.ko.zst: kernel/drivers/gpu/drm/drm_gpuvm.ko.zst kernel/drivers/gpu/drm/drm_exec.ko.zst kernel/drivers/gpu/drm/scheduler/gpu-sched.ko.zst kernel/drivers/gpu/drm/drm_buddy.ko.zst kernel/drivers/gpu/drm/drm_suballoc_helper.ko.zst kernel/drivers/gpu/drm/drm_ttm_helper.ko.zst kernel/drivers/gpu/drm/ttm/ttm.ko.zst kernel/drivers/gpu/drm/display/drm_display_helper.ko.zst kernel/drivers/media/cec/core/cec.ko.zst kernel/drivers/media/rc/rc-core.ko.zst kernel/drivers/i2c/algos/i2c-algo-bit.ko.zst kernel/drivers/acpi/video.ko.zst kernel/drivers/platform/x86/wmi.ko.zst

that means the xe module uses symbols from (some of) these modules and
these modules uses symbols from the other ones in this line. This is the
expanded dependency chain.

On the other hand, there are certain situations in which you don't use
a symbol directly from the other module, but having it around provides
additional functionality by other means (apparently the situation here
in this patch). It's common to record that dependency with
MODULE_SOFTDEP("pre: ...")

$ grep lan78xx /lib/modules/$(uname -r)/modules.dep
kernel/drivers/net/usb/lan78xx.ko.zst:

So you don't use any symbol from other modules (the above doesn't list
things that are builtin in my kernel config)...

$ grep -e 'CONFIG_USB_LAN78XX[= ]' \
	-e 'CONFIG_MII[= ]' \
	-e 'CONFIG_PHYLIB[= ]' \
	-e 'CONFIG_MICROCHIP_PHY[= ]' \
	-e 'CONFIG_FIXED_PHY[= ]' \
	-e 'CONFIG_CRC32[= ]' \
	/boot/config-$(uname -r)
CONFIG_MII=m
CONFIG_PHYLIB=y
CONFIG_FIXED_PHY=y
CONFIG_MICROCHIP_PHY=m
CONFIG_USB_LAN78XX=m
CONFIG_CRC32=y

>module .c file itself? Cannot we have better tooling to help build an 
>initramfs which does include everything that has been selected?

if you are saying that the build system should automatically convert
this:

	config USB_LAN78XX
		tristate "Microchip LAN78XX Based USB Ethernet Adapters"
		select MII
		select PHYLIB
		select MICROCHIP_PHY
		select FIXED_PHY
		select CRC32

into (for my config):

	MODULE_WEAKDEP("mii");
	MODULE_WEAKDEP("microchip");

then humn... why is CONFIG_MICREL (being added in this patch) not there?
It seems even if we automatically derive that information it wouldn't
fix the problem Jose is trying to solve.

Note that the MODULE_WEAKDEP() should be added only if that's selecting
a module and if if there isn't already a hard dependency. Then I think
there would be quite some work to do. It was not how MODULE_SOFTDEP()
was handled in the past. Cc'ing Masahiro and linux-kbuild to know if
they have an idea how feasible that would be to add in modpost.

Lucas De Marchi

>-- 
>Florian
Paolo Abeni July 25, 2024, 9:53 a.m. UTC | #11
On 7/25/24 08:50, Lucas De Marchi wrote:
> if you are saying that the build system should automatically convert
> this:
> 
> 	config USB_LAN78XX
> 		tristate "Microchip LAN78XX Based USB Ethernet Adapters"
> 		select MII
> 		select PHYLIB
> 		select MICROCHIP_PHY
> 		select FIXED_PHY
> 		select CRC32
> 
> into (for my config):
> 
> 	MODULE_WEAKDEP("mii");
> 	MODULE_WEAKDEP("microchip");
> 
> then humn... why is CONFIG_MICREL (being added in this patch) not there?
> It seems even if we automatically derive that information it wouldn't
> fix the problem Jose is trying to solve.

I hoped that the 'weak dependency' towards mii and microchip could be 
inferred greping for 'request_module()' in the relevant code, but 
apparently it's not the case.

The MODULE_WEAKDEP() construct usage makes sense to me, but this patch 
will need at least for MODULE_WEAKDEP() to land into net-next, and to 
grasp more consensus in the phy land.

Cheers,

Paolo
Andrew Lunn July 26, 2024, 11:33 a.m. UTC | #12
On Thu, Jul 25, 2024 at 11:53:54AM +0200, Paolo Abeni wrote:
> On 7/25/24 08:50, Lucas De Marchi wrote:
> > if you are saying that the build system should automatically convert
> > this:
> > 
> > 	config USB_LAN78XX
> > 		tristate "Microchip LAN78XX Based USB Ethernet Adapters"
> > 		select MII
> > 		select PHYLIB
> > 		select MICROCHIP_PHY
> > 		select FIXED_PHY
> > 		select CRC32
> > 
> > into (for my config):
> > 
> > 	MODULE_WEAKDEP("mii");
> > 	MODULE_WEAKDEP("microchip");
> > 
> > then humn... why is CONFIG_MICREL (being added in this patch) not there?
> > It seems even if we automatically derive that information it wouldn't
> > fix the problem Jose is trying to solve.
> 
> I hoped that the 'weak dependency' towards mii and microchip could be
> inferred greping for 'request_module()' in the relevant code, but apparently
> it's not the case.

Nope. The module is not explicitly loaded by this driver. The PHY core
will look at ID registers in the PHY to determine what it is, and then
load a module which says it drives that ID.

There are also pin compatible PHYs, so it is possible a different
version of the LAN78xx USB dongle could need a different PHY
driver. So you might need multiple of these week dependencies.

And there are many boards using for example the FEC, with many
different PHYs in use, since Freescale was never really a PHY vendor,
its not really paired with a Freescale PHY.

As i said, whacker a mole.

So you cannot use this to determine what PHY driver goes into the
initramfs.

What this does appear to do is differentiate between 'pre' which will
load the kernel module before it is requested. Since there is no 'pre'
for this, it seems pointless whacking this mole.

What to me make more sense it to look at all the existing 'pre'
drivers and determine if they can be converted to use this macro.

	Andrew
Jose Ignacio Tornos Martinez July 26, 2024, 12:15 p.m. UTC | #13
Hello Andrew,

> What this does appear to do is differentiate between 'pre' which will
> load the kernel module before it is requested. Since there is no 'pre'
> for this, it seems pointless whacking this mole.
Precisely, we need to fix the lan78xx case with micrel phy (and other
possible phy modules) too, due to the commented issue generating initramfs
in order to include the phy module. 

> What to me make more sense it to look at all the existing 'pre'
> drivers and determine if they can be converted to use this macro.
Of course, now that we have the possibility we can do this with other cases
that have been already detected (and fixed with a softdep pre) and others
still not detected (if anyone apart from lan78xx).

Thanks

Best regards
José Ignacio
Jakub Kicinski July 26, 2024, 2:49 p.m. UTC | #14
On Thu, 25 Jul 2024 00:57:05 +0200 Andrew Lunn wrote:
> Maybe a better solution is to first build an initramfs with
> everything, plus the kitchen sink. Boot it, and then look at what has
> been loaded in order to get the rootfs mounted. Then update the
> initramfs with just what is needed? That should be pretty generic,
> with throw out networking ig NFS root is not used, just load JFFS2 and
> a NAND driver if it was used for the rootfs, etc.

Sorry for a dumb question from the audience but how does this work 
for PCI devices? We don't worry about what drivers may be needed
because there's no "fallback / generic" driver?
For MDIO are the ID registers too complicated to expose to user space
and let it match the drivers using modinfo (avoiding the need to boot
a kitchen sink kernel)?
Andrew Lunn July 26, 2024, 8:59 p.m. UTC | #15
On Fri, Jul 26, 2024 at 02:15:26PM +0200, Jose Ignacio Tornos Martinez wrote:
> Hello Andrew,
> 
> > What this does appear to do is differentiate between 'pre' which will
> > load the kernel module before it is requested. Since there is no 'pre'
> > for this, it seems pointless whacking this mole.
> Precisely, we need to fix the lan78xx case with micrel phy (and other
> possible phy modules) too, due to the commented issue generating initramfs
> in order to include the phy module. 

I still don't see how this solves any issues with generating the
initramfs.

There are more than 200 Ethernet drivers, and around 75 PHY
drivers. If this patch is merged, you have one MAC driver indicating
it needs one PHY driver. There is nothing much you can do with that
information. You need to wait until 99% of the MAC drivers indicate
which PHY drivers are needed. Then you can use this information leave
out any PHY which is not needed, and hope you only break a small
number of devices. But even if you wait 20 years i doubt you will get
99% of the MAC drivers indicating what PHY drivers you need.  Because
nothing really uses this information today.

So as far as i see, this has nothing to do with building the
initramfs.

	Andrew
Andrew Lunn July 26, 2024, 9:15 p.m. UTC | #16
> For MDIO are the ID registers too complicated to expose to user space
> and let it match the drivers using modinfo (avoiding the need to boot
> a kitchen sink kernel)?

That is how it actually works for MDIO. Mostly.

We read the ID from register 2 and 3. That gives us a 32 bit
value. That gets turned into a binary string. Which is then matched
against what is in modules.alias

alias mdio:0000000000100010010101010010???? amd
alias mdio:0011000111000011000111001011???? aquantia
alias mdio:0011000111000011000111000001???? aquantia
alias mdio:0011000111000011000111000100???? aquantia

The ? means the value of the bit does not matter. The least
significant nibble is often the revision of the PHY and the driver can
driver any revision.

The 'mostly' is because some PHYs need help from the driver to enable
clocks etc before you can read register 2 and 3. A chicken/egg
problem. So you can put the ID in device tree, and the exact same
lookup is performed to load the driver.

It gets a bit more complex with C45 devices, because they have
multiple ID registers. But the same basic lookup is performed using
them one by one until a driver is found.

You can also find the C22 ID which matched the driver in
/sys/bus/mdio_bus/devices/*/phy_id.

       Andrew
Dragan Simic July 27, 2024, 5:15 p.m. UTC | #17
Hello,

On 2024-07-26 22:59, Andrew Lunn wrote:
> On Fri, Jul 26, 2024 at 02:15:26PM +0200, Jose Ignacio Tornos Martinez 
> wrote:
>> Hello Andrew,
>> 
>> > What this does appear to do is differentiate between 'pre' which will
>> > load the kernel module before it is requested. Since there is no 'pre'
>> > for this, it seems pointless whacking this mole.
>> 
>> Precisely, we need to fix the lan78xx case with micrel phy (and other
>> possible phy modules) too, due to the commented issue generating 
>> initramfs
>> in order to include the phy module.
> 
> I still don't see how this solves any issues with generating the
> initramfs.
> 
> There are more than 200 Ethernet drivers, and around 75 PHY
> drivers. If this patch is merged, you have one MAC driver indicating
> it needs one PHY driver. There is nothing much you can do with that
> information. You need to wait until 99% of the MAC drivers indicate
> which PHY drivers are needed. Then you can use this information leave
> out any PHY which is not needed, and hope you only break a small
> number of devices. But even if you wait 20 years i doubt you will get
> 99% of the MAC drivers indicating what PHY drivers you need.  Because
> nothing really uses this information today.
> 
> So as far as i see, this has nothing to do with building the
> initramfs.

Before going into explaining my viewpoint, could someone, please, 
clarify
which LAN78xx USB-to-Ethernet bridge does this apply to?  I already had
a look at a few LAN78xx datasheets, and I'm not sure how the external 
PHY
becomes exposed over the USB interface, so it needs a driver.
Andrew Lunn July 27, 2024, 11:29 p.m. UTC | #18
> Before going into explaining my viewpoint, could someone, please, clarify
> which LAN78xx USB-to-Ethernet bridge does this apply to?  I already had
> a look at a few LAN78xx datasheets, and I'm not sure how the external PHY
> becomes exposed over the USB interface, so it needs a driver.

https://elixir.bootlin.com/linux/v6.10/source/drivers/net/usb/lan78xx.c#L2049

This is creating an MDIO bus device. The MDIO bus will be scanned and
PHYs on the bus found. There are then a few calls to phy_find_first()
which will get the PHY.

The code itself looks pretty broken, it is directly accessing PHY
registers, which a MAC driver should not do. That is a layering
violation.

	Andrew
Masahiro Yamada July 28, 2024, 7:37 a.m. UTC | #19
On Fri, Jul 26, 2024 at 9:15 PM Jose Ignacio Tornos Martinez
<jtornosm@redhat.com> wrote:
>
> Hello Andrew,
>
> > What this does appear to do is differentiate between 'pre' which will
> > load the kernel module before it is requested. Since there is no 'pre'
> > for this, it seems pointless whacking this mole.
> Precisely, we need to fix the lan78xx case with micrel phy (and other
> possible phy modules) too, due to the commented issue generating initramfs
> in order to include the phy module.
>
> > What to me make more sense it to look at all the existing 'pre'
> > drivers and determine if they can be converted to use this macro.
> Of course, now that we have the possibility we can do this with other cases
> that have been already detected (and fixed with a softdep pre) and others
> still not detected (if anyone apart from lan78xx).
>
> Thanks
>
> Best regards
> José Ignacio
>



I am not familiar with MAC/PHY interface, but perhaps the
situation might be different on internal/external PHYs?

I do not know if "micrel" is an internal or an external PHY, though.


[1] internal PHY

Commit e57cf3639c323eeed05d3725fd82f91b349adca8 moved the
internal PHY code from drivers/net/usb/lan78xx.c
to drivers/net/phy/microchip.c

So, lan78xx.ko is likely to use microchip.ko

Perhaps, is the following useful?

  MODULE_WEAKDEP("microchip");    /* internal PHY */

Or, is this the case for MODULE_SOFTDEP()?



[2] external PHY

When an external PHY device is connected, the MAC/PHY combination is
pretty much board-specific. We may end up with
a bunch of MODULE_WEAKDEP().





The second question is, is it so important to enable network
at the initramfs time? Personally, I am fine with having network
drivers in the root file system.

Is this useful when the root file system is nfs or something?
Dragan Simic July 28, 2024, 9:53 a.m. UTC | #20
Hello Masahiro,

On 2024-07-28 09:37, Masahiro Yamada wrote:
> On Fri, Jul 26, 2024 at 9:15 PM Jose Ignacio Tornos Martinez
> <jtornosm@redhat.com> wrote:
>> > What this does appear to do is differentiate between 'pre' which will
>> > load the kernel module before it is requested. Since there is no 'pre'
>> > for this, it seems pointless whacking this mole.
>> Precisely, we need to fix the lan78xx case with micrel phy (and other
>> possible phy modules) too, due to the commented issue generating 
>> initramfs
>> in order to include the phy module.
>> 
>> > What to me make more sense it to look at all the existing 'pre'
>> > drivers and determine if they can be converted to use this macro.
>> Of course, now that we have the possibility we can do this with other 
>> cases
>> that have been already detected (and fixed with a softdep pre) and 
>> others
>> still not detected (if anyone apart from lan78xx).
> 
> I am not familiar with MAC/PHY interface, but perhaps the
> situation might be different on internal/external PHYs?
> 
> I do not know if "micrel" is an internal or an external PHY, though.
> 
> [1] internal PHY
> 
> Commit e57cf3639c323eeed05d3725fd82f91b349adca8 moved the
> internal PHY code from drivers/net/usb/lan78xx.c
> to drivers/net/phy/microchip.c
> 
> So, lan78xx.ko is likely to use microchip.ko
> 
> Perhaps, is the following useful?
> 
>   MODULE_WEAKDEP("microchip");    /* internal PHY */
> 
> Or, is this the case for MODULE_SOFTDEP()?
> 
> [2] external PHY
> 
> When an external PHY device is connected, the MAC/PHY combination is
> pretty much board-specific. We may end up with
> a bunch of MODULE_WEAKDEP().
> 
> The second question is, is it so important to enable network
> at the initramfs time? Personally, I am fine with having network
> drivers in the root file system.
> 
> Is this useful when the root file system is nfs or something?

The troubles happen when the driver is probed during the initial
ramdisk stage, e.g. when a machine is rebooted with a USB adapter
plugged in.  If the required dependent PHY driver module isn't also
found in the initial ramdisk, probing the main driver may actually
fail or (hopefully not) end up in some strange state.

If you have time, I'd suggest that you go through the following
related discussions, which should provide further clarification
and additional examples of such issues with initial ramdisks and
additional driver modules:

- 
https://lore.kernel.org/linux-modules/04e0676b0e77c5eb69df6972f41d77cdf061265a.1721906745.git.dsimic@manjaro.org/
- 
https://lore.kernel.org/dri-devel/4e1e00422a14db4e2a80870afb704405da16fd1b.1718655077.git.dsimic@manjaro.org/T/#u
- 
https://lore.kernel.org/dri-devel/fdaf2e41bb6a0c5118ff9cc21f4f62583208d885.1718655070.git.dsimic@manjaro.org/T/#u
Dragan Simic July 28, 2024, 2:10 p.m. UTC | #21
Hello Andrew,

On 2024-07-28 01:29, Andrew Lunn wrote:
>> Before going into explaining my viewpoint, could someone, please, 
>> clarify
>> which LAN78xx USB-to-Ethernet bridge does this apply to?  I already 
>> had
>> a look at a few LAN78xx datasheets, and I'm not sure how the external 
>> PHY
>> becomes exposed over the USB interface, so it needs a driver.
> 
> https://elixir.bootlin.com/linux/v6.10/source/drivers/net/usb/lan78xx.c#L2049
> 
> This is creating an MDIO bus device. The MDIO bus will be scanned and
> PHYs on the bus found. There are then a few calls to phy_find_first()
> which will get the PHY.
> 
> The code itself looks pretty broken, it is directly accessing PHY
> registers, which a MAC driver should not do. That is a layering
> violation.

Thanks for the clarification.

Basically, the way I see it, weakdeps are the right solution for the
problem at hand, i.e. for the generation of the initial ramdisk with
all the possible PHY driver modules.  However, I don't think that some
automagical generation of the associated MODULE_WEAKDEP() statements
is the way to go.  Instead, all those statements should be added by
hand to the lan78xx driver, making sure that each PHY is tested and
validated beforehand.
Andrew Lunn July 28, 2024, 7:45 p.m. UTC | #22
> Basically, the way I see it, weakdeps are the right solution for the
> problem at hand, i.e. for the generation of the initial ramdisk with
> all the possible PHY driver modules.

Sorry, but i still don't see how this works.

Say you get this one patch merged. What then? You throw all other PHY
drivers which don't have a weakdep out of the initramfs? That
potentially breaks around 200 MAC drivers who need those PHYs you have
discarded.

	Andrew
Dragan Simic July 28, 2024, 8:46 p.m. UTC | #23
On 2024-07-28 21:45, Andrew Lunn wrote:
>> Basically, the way I see it, weakdeps are the right solution for the
>> problem at hand, i.e. for the generation of the initial ramdisk with
>> all the possible PHY driver modules.
> 
> Sorry, but i still don't see how this works.
> 
> Say you get this one patch merged. What then? You throw all other PHY
> drivers which don't have a weakdep out of the initramfs? That
> potentially breaks around 200 MAC drivers who need those PHYs you have
> discarded.

Actually, no PHY drivers can be thrown out of an initial ramdisk by this
patch, [1] simply because no PHY drivers not needed for a specific 
system
shouldn't be included there before, unless they were added specifically
by the utilities that created the initial ramdisk, but that's beyond the
dependencies that the kernel provides in /lib/modules, and beyond what
can be obtained by automatic detection using /sys/devices on a 
particular
system.  That's all a result of this specific module dependency being
unknown before, at the kernel level.

In other words, this patch doesn't subtract anything.  Instead, it just
adds a weakdep link between the lan78xx and micrel modules, so the 
kernel
itself can report that dependency, which may actually result in one more
PHY driver added to a generated initial ramdisk.

[1] 
https://lore.kernel.org/netdev/20240724102349.430078-1-jtornosm@redhat.com/
Andrew Lunn July 28, 2024, 8:57 p.m. UTC | #24
> In other words, this patch doesn't subtract anything.  Instead, it just
> adds a weakdep link between the lan78xx and micrel modules, so the kernel
> itself can report that dependency, which may actually result in one more
> PHY driver added to a generated initial ramdisk.

So at the moment, does the initramfs contain all PHY modules? I guess
it does, because you have no knowledge which are actually needed. And
this does not help you in any way, as you said, it does not subtract
anything.

So to me, this is pointless.

	Andrew
Dragan Simic July 29, 2024, 4:43 a.m. UTC | #25
On 2024-07-28 22:57, Andrew Lunn wrote:
>> In other words, this patch doesn't subtract anything.  Instead, it 
>> just
>> adds a weakdep link between the lan78xx and micrel modules, so the 
>> kernel
>> itself can report that dependency, which may actually result in one 
>> more
>> PHY driver added to a generated initial ramdisk.
> 
> So at the moment, does the initramfs contain all PHY modules? I guess
> it does, because you have no knowledge which are actually needed. And
> this does not help you in any way, as you said, it does not subtract
> anything.

Basically, an initial ramdisk shouldn't contain any PHY modules that
aren't automatically detected as needed on a particular system, for
which the initial ramdisk is built.  That's how selecting modules
while building the initial ramdisks works.  On the other hand, if it's
some initial ramdisk built by a Linux distribution and intended to
support multiple systems or boards, it may contain whatever the
distribution sees fit.

Having weakdeps defined actually does help here.  For example, a Linux
distribution mentioned above no longer needs to hand-craft the rules
for initial ramdisk generation for the PHY modules that should be put
into an initial ramdisk together with the lan78xx driver, if the Linux
distribution chooses to include the lax78xx driver.  Having weakdep(s)
defined makes the kernel do that instead.  Also, there's no point in
including every single PHY driver module, because not all of them are
needed for a particular selection of MAC drivers, which comes from the
intended purpose of the initial ramdisk built by a Linux distribution,
i.e. the target architecture, supported board category, etc.

Let's also keep in mind that including all PHY modules into an initial
ramdisk inevitably makes it larger, which often isn't an option for
resource-constrained embedded systems.
Greg Kroah-Hartman July 29, 2024, 6:13 a.m. UTC | #26
On Mon, Jul 29, 2024 at 06:43:40AM +0200, Dragan Simic wrote:
> On 2024-07-28 22:57, Andrew Lunn wrote:
> > > In other words, this patch doesn't subtract anything.  Instead, it
> > > just
> > > adds a weakdep link between the lan78xx and micrel modules, so the
> > > kernel
> > > itself can report that dependency, which may actually result in one
> > > more
> > > PHY driver added to a generated initial ramdisk.
> > 
> > So at the moment, does the initramfs contain all PHY modules? I guess
> > it does, because you have no knowledge which are actually needed. And
> > this does not help you in any way, as you said, it does not subtract
> > anything.
> 
> Basically, an initial ramdisk shouldn't contain any PHY modules that
> aren't automatically detected as needed on a particular system, for
> which the initial ramdisk is built.  That's how selecting modules
> while building the initial ramdisks works.  On the other hand, if it's
> some initial ramdisk built by a Linux distribution and intended to
> support multiple systems or boards, it may contain whatever the
> distribution sees fit.
> 
> Having weakdeps defined actually does help here.  For example, a Linux
> distribution mentioned above no longer needs to hand-craft the rules
> for initial ramdisk generation for the PHY modules that should be put
> into an initial ramdisk together with the lan78xx driver, if the Linux
> distribution chooses to include the lax78xx driver.  Having weakdep(s)
> defined makes the kernel do that instead.  Also, there's no point in
> including every single PHY driver module, because not all of them are
> needed for a particular selection of MAC drivers, which comes from the
> intended purpose of the initial ramdisk built by a Linux distribution,
> i.e. the target architecture, supported board category, etc.
> 
> Let's also keep in mind that including all PHY modules into an initial
> ramdisk inevitably makes it larger, which often isn't an option for
> resource-constrained embedded systems.
> 

resource-constrained embedded systems know their dependancies and their
hardware configurations, so I don't see how the weak-deps help at all
here.

You are arguing two different things it seems, neither of which this
change helps out at all with, so I will provide a:

  Nacked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

here until it gets straightened out.

thanks,

greg k-h
Dragan Simic July 29, 2024, 6:29 a.m. UTC | #27
Hello Greg, Jose and Luis,

On 2024-07-29 08:13, Greg KH wrote:
> On Mon, Jul 29, 2024 at 06:43:40AM +0200, Dragan Simic wrote:
>> On 2024-07-28 22:57, Andrew Lunn wrote:
>> > > In other words, this patch doesn't subtract anything.  Instead, it
>> > > just
>> > > adds a weakdep link between the lan78xx and micrel modules, so the
>> > > kernel
>> > > itself can report that dependency, which may actually result in one
>> > > more
>> > > PHY driver added to a generated initial ramdisk.
>> >
>> > So at the moment, does the initramfs contain all PHY modules? I guess
>> > it does, because you have no knowledge which are actually needed. And
>> > this does not help you in any way, as you said, it does not subtract
>> > anything.
>> 
>> Basically, an initial ramdisk shouldn't contain any PHY modules that
>> aren't automatically detected as needed on a particular system, for
>> which the initial ramdisk is built.  That's how selecting modules
>> while building the initial ramdisks works.  On the other hand, if it's
>> some initial ramdisk built by a Linux distribution and intended to
>> support multiple systems or boards, it may contain whatever the
>> distribution sees fit.
>> 
>> Having weakdeps defined actually does help here.  For example, a Linux
>> distribution mentioned above no longer needs to hand-craft the rules
>> for initial ramdisk generation for the PHY modules that should be put
>> into an initial ramdisk together with the lan78xx driver, if the Linux
>> distribution chooses to include the lax78xx driver.  Having weakdep(s)
>> defined makes the kernel do that instead.  Also, there's no point in
>> including every single PHY driver module, because not all of them are
>> needed for a particular selection of MAC drivers, which comes from the
>> intended purpose of the initial ramdisk built by a Linux distribution,
>> i.e. the target architecture, supported board category, etc.
>> 
>> Let's also keep in mind that including all PHY modules into an initial
>> ramdisk inevitably makes it larger, which often isn't an option for
>> resource-constrained embedded systems.
> 
> resource-constrained embedded systems know their dependancies and their
> hardware configurations, so I don't see how the weak-deps help at all
> here.
> 
> You are arguing two different things it seems, neither of which this
> change helps out at all with, so I will provide a:
> 
>   Nacked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> 
> here until it gets straightened out.

Quite frankly, all this makes me wonder why weakdeps were merged into
the mainline kernel [1] with no real consumers?  Perhaps this is good
time for Jose and Luis to chime in.

[1] 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/module.h?id=61842868de13aa7fd7391c626e889f4d6f1450bf
Jose Ignacio Tornos Martinez July 29, 2024, 8:34 a.m. UTC | #28
Hello Dragan,

> Quite frankly, all this makes me wonder why weakdeps were merged into
> the mainline kernel [1] with no real consumers?  Perhaps this is good
> time for Jose and Luis to chime in.
Well, I requested this commenting as an example the case of lan78xx and
the possible phy modules,  becasue it is clearly failing when initramfs
is generated due to the dynamic phy module loading process.
In my opinion this example was enough good because I found it difficult get
an automatic way to get this information in advance for all the cases and
becasue I need to fix this initramfs issue.

But with a first glance, I also found several examples (not phy related),
in which it seems the suitable softdep was added to solve the initramfs
missing module issue:
80f4e62730a9 drm/panfrost: Mark simple_ondemand governor as softdep
0c94f58cef31 drm/lima: Mark simple_ondemand governor as softdep
2ebe16155dc8 scsi: ufs: core: Add soft dependency on governor_simpleondemand
dfe085d8dcd0 crypto: xts - Add softdep on ecb
...

Therefore, I requested to provide this  kind of new dependency (weakdep)
first in general, becasue I thought it could be useful for a lot of cases
not only for the unkown (for initramfs) phy modules (i.e. lan78xx).
That is, in spite of the initial usage has been rejected, I think it can
still be considered by the other commented examples (or new ones).
I would like to confirm some example(s) to have some usage, but this will
need to be from September after my holidays.

Thanks

Best regards
José Ignacio
Jose Ignacio Tornos Martinez July 29, 2024, 8:37 a.m. UTC | #29
Hello Andrew,

I like the idea from Jakub, reading the associated phy from the hardware
in some way, although reading your last comments I don't know if it could
be possible for all the cases.
Let me ask you about this to understand better, if present,
always reading /sys/bus/mdio_bus/devices/*/phy_id,
could it be enough to get the possible related phy? 
And after this get the related phy module?

Thanks

Best regards
José Ignacio
Dragan Simic July 29, 2024, 9:28 a.m. UTC | #30
Hello Jose,

On 2024-07-29 10:34, Jose Ignacio Tornos Martinez wrote:
>> Quite frankly, all this makes me wonder why weakdeps were merged into
>> the mainline kernel [1] with no real consumers?  Perhaps this is good
>> time for Jose and Luis to chime in.
> 
> Well, I requested this commenting as an example the case of lan78xx and
> the possible phy modules,  becasue it is clearly failing when initramfs
> is generated due to the dynamic phy module loading process.
> In my opinion this example was enough good because I found it difficult 
> get
> an automatic way to get this information in advance for all the cases 
> and
> becasue I need to fix this initramfs issue.

I see and agree, but please note that other people highly disagree about
that being an issue at all.  Thus, I'd suggest that you provide a 
detailed
explanation of why and how that presents an issue that weakdeps solve.

> But with a first glance, I also found several examples (not phy 
> related),
> in which it seems the suitable softdep was added to solve the initramfs
> missing module issue:
> 80f4e62730a9 drm/panfrost: Mark simple_ondemand governor as softdep
> 0c94f58cef31 drm/lima: Mark simple_ondemand governor as softdep
> 2ebe16155dc8 scsi: ufs: core: Add soft dependency on 
> governor_simpleondemand
> dfe085d8dcd0 crypto: xts - Add softdep on ecb

Regarding Lima and Panfrost, I agree that weakdeps are a better solution
than softdeps, but please see also harddeps. [1]  I'd appreciate if 
you'd
provide your opinion about the proposed harddeps.

[1] 
https://lore.kernel.org/linux-modules/04e0676b0e77c5eb69df6972f41d77cdf061265a.1721906745.git.dsimic@manjaro.org/T/#u

> Therefore, I requested to provide this  kind of new dependency 
> (weakdep)
> first in general, becasue I thought it could be useful for a lot of 
> cases
> not only for the unkown (for initramfs) phy modules (i.e. lan78xx).
> That is, in spite of the initial usage has been rejected, I think it 
> can
> still be considered by the other commented examples (or new ones).
> I would like to confirm some example(s) to have some usage, but this 
> will
> need to be from September after my holidays.

Maybe we can have Lima and Panfrost as the first consumers, but I'd 
prefer
to have them use harddeps, as "earmarks" for the future (please see the
discussion linked above, and the two additional discussions linked from
the patch description in that thread).
Jose Ignacio Tornos Martinez July 29, 2024, 12:32 p.m. UTC | #31
Hello Dragan and others,

> I see and agree, but please note that other people highly disagree about
> that being an issue at all.  Thus, I'd suggest that you provide a 
> detailed
> explanation of why and how that presents an issue that weakdeps solve.
I think that the problem that I am trying to fix related to initramfs
generation is understood. At least what I tried to explain at the beginning
of this thread with my messages and the help of Lucas. But maybe you are  
right, so let me provide a more specific explanation.

The only thing that I could repeat and/remark is that I am not modifying
anything in the current kernel behavior, and specifically for this case 
(lan78xx) with a network driver and related phy modules: I am just trying
to add a flag (and nothing else) to complete the information of the
necessary modules to be collected by the tools that build the initramfs.

And if this information about the necessary modules is not correctly
collected, the kernel is not going to work from initramfs, Especially if
the network drivers are not working (because the phy module is not found),
some initial and necessary resources could not be available before and
after initramfs stage, because unless the network driver is unloaded and
loaded again after initramfs stage (then the phy modules would be available
from rootfs), it is going to be in the same situation, that is, not
correctly initialized and not working.

Including in the initramfs all the phy modules is an option but I think it
would be better to include only the necessary stuff (this is the default
behavior for the tools that are used to build the initramfs). This is valid
for embedded and not-embedded systems.

If this patch, to only add the related flag of the network driver to inform
about the possible phy modules, is rejected because a more general solution
is preferred, I would like to dig into it, at least to know if it is possible
to do better.
Maybe Andrew in other part of the thread, after the interesting comments
from Jakub, can help and provide some new (for me) inputs.

> Regarding Lima and Panfrost, I agree that weakdeps are a better solution
> than softdeps, but please see also harddeps. [1]  I'd appreciate if 
> you'd provide your opinion about the proposed harddeps.
> [1] 
> https://lore.kernel.org/linux-modules/04e0676b0e77c5eb69df6972f41d77cdf061265a.1721906745.git.dsimic@manjaro.org/T/#u
Ok, I will think more about it.
After a quick first look I agree with Lucas, but let's go little by little
(at least I don't have a lot of time before my holidays). 

Thanks

Best regards
José Ignacio
Andrew Lunn July 29, 2024, 12:42 p.m. UTC | #32
On Mon, Jul 29, 2024 at 10:37:38AM +0200, Jose Ignacio Tornos Martinez wrote:
> Hello Andrew,
> 
> I like the idea from Jakub, reading the associated phy from the hardware
> in some way, although reading your last comments I don't know if it could
> be possible for all the cases.
> Let me ask you about this to understand better, if present,
> always reading /sys/bus/mdio_bus/devices/*/phy_id,
> could it be enough to get the possible related phy? 
> And after this get the related phy module?

There should be sufficient information in /sys. eg.

$ cat /sys/class/net/enp1s0/phydev/phy_id
0x001cc914

So enp1s0 probed a PHY using the ID 0x001cc914. Turn that into binary
and you get 0000 0000 0001 1100 1100 1001 0001 0100. Look that up in alias.

alias mdio:0000000000011100110010?????????? realtek

So you need to realtek PHY driver for my enp1s0.

	Andrew
Andrew Lunn July 29, 2024, 6:56 p.m. UTC | #33
> Including in the initramfs all the phy modules is an option but I think it
> would be better to include only the necessary stuff (this is the default
> behavior for the tools that are used to build the initramfs). This is valid
> for embedded and not-embedded systems.

So are you saying current initramfs are broken, because they don't
include the needed PHY modules? You can fix one example of the lan78xx
USB dongle, but are going to leave everything else broken?

	Andrew
Jose Ignacio Tornos Martinez July 30, 2024, 7:55 a.m. UTC | #34
Hello Andrew,

> So are you saying current initramfs are broken, because they don't
> include the needed PHY modules?
I am just saying that the default initramfs including the current lan78xx
driver is broken because in this case there is no information to collect
the possible phy modules. And as I commented, after the complete boot, the
only solution is to unload and load lan78xx to get the phy module from
rootfs.
 
> You can fix one example of the lan78xx
> USB dongle, but are going to leave everything else broken?
My intention was to fix the case for lan78xx because it is the one that I
have detected that does not work. Others are already working, for example
r8169, by means of a softdep with realtek phy. And my idea was to do the
same for the other detected/needed, if any (I am not aware of other similar
reported issues).
I see that you prefer to fix all the cases and always including all the phy
modules would solve the problem for lan78xx and for other possible ones.
But take into account that we should also try to avoid creating large
initramfs if not necessary, at least, if there is anyway to solve this.  
Indeed, if I am not wrong, only some phy modules are possible for
a driver and these are known.
Anyway, as it was suggested, we can explore some automatic procedure to
identify the hardware and with that, select the phy module or at least,
reduce the number of phy modules to introduce.

Thanks

Best regards
José Ignacio
diff mbox series

Patch

diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index 8adf77e3557e..c3945aebf94e 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -5074,3 +5074,4 @@  module_usb_driver(lan78xx_driver);
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
+MODULE_WEAKDEP("micrel");