mtd0 device is missing in /sys/class/mtd
Manojkiran Eda
manojkiran.eda at gmail.com
Tue Jan 2 09:21:55 PST 2024
I was reading somewhere that , modules that are declared with subsys_initcall() are guaranteed to be executed before the modules that are declared with module_init() , so declaring the mtdcore with subsys_initcall() rather than module_init() solved the issue.
But wondering if this is the right way to solve the problem ?
What is the right way EPROBE_DEFER ? Or Changing the subsystem’s procedure to subsys_initcall() ?
Thanks,
Manoj
> On 02-Jan-2024, at 5:20 PM, Manojkiran Eda <manojkiran.eda at gmail.com> wrote:
>
> I tried adding MTD_PARTITIONED_MASTER to my kernel config, and still facing the same issue. Debugging a little more , I figured out that my driver is being probed a lot early than the mtd class being registered. So the code is bailing out lot early since the class_to_subsys() returns null (https://elixir.bootlin.com/linux/latest/source/drivers/base/core.c#L3180)
>
> console traces:
>
> [ 9.128866] Entered the aspeed_espi_ctrl_probe function
> ….
> [ 11.581081] mtd class is registering now
>
>
> Looking more, I see a class_is_registered() method available at https://elixir.bootlin.com/linux/latest/source/drivers/base/class.c#L644 . Is that something that I could check in my driver and return an EPROBE_DEFER ? Or should this logic be incorporated in the mtdcore.c ? Because the mtd_class definition is been declared in the mtdcore and is not passed down from my driver code. All I was doing is calling mtd_device_register() and expecting it to return EPROBE_DEFER if the mtd core subsystem/class is not registered/probed in the kernel.
>
> But I am not sure what’s the right direction. Can any one help me out on this ?
>
> Thanks,
> Manoj
>
>> On 31-Dec-2023, at 6:46 PM, Joakim Tjernlund <Joakim.Tjernlund at infinera.com> wrote:
>>
>> Try adding MTD_PARTITIONED_MASTER to your kernel config
>>
>> ________________________________________
>> From: linux-mtd <linux-mtd-bounces at lists.infradead.org> on behalf of Manojkiran Eda <manojkiran.eda at gmail.com>
>> Sent: 28 December 2023 17:38
>> To: linux-mtd at lists.infradead.org
>> Subject: mtd0 device is missing in /sys/class/mtd
>>
>> Hi All,
>>
>> I was as beginner in linux device driver development, and recently I was working on a device driver for espi protocol and was stuck with a problem.
>>
>> I have an mtd device driver through which one could access the NOR flash connected to the other end of espi bus. The driver seems to have probed successfully , I see an entry for my mtd device in /proc/mtd but , I dont see an entry for my mtd device in the /sys/class/mtd.
>>
>> Here are few logs of interest :
>>
>> root at mybox:~# cat /proc/mtd
>> dev: size erasesize name
>> mtd0: 04000000 00001000 "aspeed-espi-flash” <<<<<—— This is my mtd device
>> mtd1: 04000000 00010000 "bmc"
>> mtd2: 000e0000 00010000 "u-boot"
>> mtd3: 00020000 00010000 "u-boot-env"
>> mtd4: 00900000 00010000 "kernel"
>> mtd5: 02000000 00010000 "rofs"
>> mtd6: 01600000 00010000 "rwfs"
>> mtd7: 04000000 00010000 "alt-bmc"
>> mtd8: 000e0000 00010000 "alt-u-boot"
>> mtd9: 00020000 00010000 "alt-u-boot-env"
>> mtd10: 00900000 00010000 "alt-kernel"
>> mtd11: 02000000 00010000 "alt-rofs"
>> mtd12: 01600000 00010000 "alt-rwfs”
>>
>>
>> root at mybox:/sys/class/mtd# ls
>> mtd1 mtd10ro mtd11ro mtd12ro mtd2 mtd3 mtd4 mtd5 mtd6 mtd7 mtd8 mtd9
>> mtd10 mtd11 mtd12 mtd1ro mtd2ro mtd3ro mtd4ro mtd5ro mtd6ro mtd7ro mtd8ro mtd9ro
>>
>> I was expecting mtd0 to be present in the /sys/class/mtd, but its not there.
>>
>> Looking at dmesg:
>>
>> root at mybox:/sys/class/mtd# dmesg | grep -ie mtd -A5 -ie espi
>> [ 0.685006] Entered the aspeed_espi_ctrl_probe function
>> [ 0.690990] device matched : 1
>> [ 0.699225] espi alloc started
>> [ 0.704726] espi read from device tree, flash size : 67108864
>> [ 0.712416] espi flash enabled
>> [ 0.716572] espi flash channel is ready
>> [ 0.720940] espi flash allocation completed
>> [ 0.725259] aspeed-espi-ctrl 1e6ee000.espi-ctrl: module loaded
>> --
>> [ 0.962764] 5 fixed-partitions partitions found on MTD device bmc
>> [ 0.969675] Creating 5 MTD partitions on "bmc":
>> [ 0.974776] 0x000000000000-0x0000000e0000 : "u-boot"
>> [ 0.981982] 0x0000000e0000-0x000000100000 : "u-boot-env"
>> [ 0.989557] 0x000000100000-0x000000a00000 : "kernel"
>> [ 0.996772] 0x000000a00000-0x000002a00000 : "rofs"
>> [ 1.003759] 0x000002a00000-0x000004000000 : "rwfs"
>> --
>> [ 1.048304] 5 fixed-partitions partitions found on MTD device alt-bmc
>> [ 1.055563] Creating 5 MTD partitions on "alt-bmc":
>> [ 1.061096] 0x000000000000-0x0000000e0000 : "alt-u-boot"
>> [ 1.068672] 0x0000000e0000-0x000000100000 : "alt-u-boot-env"
>> [ 1.076607] 0x000000100000-0x000000a00000 : "alt-kernel"
>> [ 1.084211] 0x000000a00000-0x000002a00000 : "alt-rofs"
>> [ 1.091594] 0x000002a00000-0x000004000000 : "alt-rwfs”
>>
>> and the mtd devices listed in /sys/class/mtd from mtd1 through mtd12 are basically from the partitions list above.
>>
>> root at mybox:/sys/class/mtd# for dir in *; do cat $dir/name; done
>> bmc
>> alt-kernel
>> alt-rofs
>> alt-rwfs
>> u-boot
>> u-boot-env
>> kernel
>> rofs
>> rwfs
>> alt-bmc
>> alt-u-boot
>> alt-u-boot-env
>>
>> Does anyone know what could be the possible reason for the problem ? Any hints/help would be appreciated.
>>
>> Thanks,
>> Manoj
>>
>>
>> ______________________________________________________
>> Linux MTD discussion mailing list
>> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
More information about the linux-mtd
mailing list