Message ID | 90fb762e5840f9d5a6ae46f81692fb947a7796a4.camel@egauge.net |
---|---|
State | New |
Headers | show |
Series | RFQ: wifi: wilc1000: make wilc1000-spi bus-probe useful | expand |
On 1/19/24 14:51, David Mosberger-Tang wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > The current version of the wilc1000 driver has a probe function that simply > assumes the chip is present. It is only later, in wilc_spi_init(), that the > driver verifies that it can actually communicate with the chip. The result of > this is that the net device (typically wlan0) is created and remains in place as > long as the wilc1000-spi driver is loaded, even if the WILC1000 chip is not > present or not working. > > Is there any reason not to detect the chip's present in wilc_bus_probe()? The > patch below (relative to 5.15.147) works for me, but perhaps I'm missing > something? Would it make sense to merge something along these lines into > mainline? > I think it is the WILC driver design that the firmware/chip operations are executed only when the netdev interface(wlan0) is up. The firmware is started only after the interface is up. However, it should be okay to read the register values since the bus interface is up. As I understand, this condition is raised since the auto-load started to work after the patch[1], now the driver is getting loaded at the boot-up time. Actually, the auto-detect(hot-plug) for SPI bus can't be supported like the SDIO bus where the driver gets loaded/unloaded when the device is connected/removed. In case of SPI devices, the driver probe will be called at the boot-up time based on the Device-tree(DT) entry. If the SPI device is connected after board boot-up, the board reboot is required for probe function to get called i.e. even wilc_bus_probe() returns failure for first time then the probe will not get called again. One way to handle this is by modifying the DT entry of the system to define whether the SPI device is connected or not. 1. https://github.com/torvalds/linux/commit/f2f16ae9cc9cba4e3c70941cf6a6443c9ea920f4 Regards, Ajay
On Mon, 2024-01-22 at 16:57 +0000, Ajay.Kathat@microchip.com wrote: > On 1/19/24 14:51, David Mosberger-Tang wrote: > > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > > > The current version of the wilc1000 driver has a probe function that simply > > assumes the chip is present. It is only later, in wilc_spi_init(), that the > > driver verifies that it can actually communicate with the chip. The result of > > this is that the net device (typically wlan0) is created and remains in place as > > long as the wilc1000-spi driver is loaded, even if the WILC1000 chip is not > > present or not working. > > > > Is there any reason not to detect the chip's present in wilc_bus_probe()? The > > patch below (relative to 5.15.147) works for me, but perhaps I'm missing > > something? Would it make sense to merge something along these lines into > > mainline? > > > > I think it is the WILC driver design that the firmware/chip operations > are executed only when the netdev interface(wlan0) is up. The firmware > is started only after the interface is up. However, it should be okay to > read the register values since the bus interface is up. Yep, I didn't see any issues in my testing. > As I understand, this condition is raised since the auto-load started to > work after the patch[1], now the driver is getting loaded at the boot-up > time. > Actually, the auto-detect(hot-plug) for SPI bus can't be supported like > the SDIO bus where the driver gets loaded/unloaded when the device is > connected/removed. In case of SPI devices, the driver probe will be > called at the boot-up time based on the Device-tree(DT) entry. If the > SPI device is connected after board boot-up, the board reboot is > required for probe function to get called i.e. even wilc_bus_probe() > returns failure for first time then the probe will not get called again. > One way to handle this is by modifying the DT entry of the system to > define whether the SPI device is connected or not. Makes sense. In our system, we don't have the ability to dynamically patch the device tree so we rely on driver probing to confirm that a device actually exists. --david
Alexis Lothoré <alexis.lothore@bootlin.com> writes: > Hello David, > just reacting to your answers, but I will take a look at your updated patch > > On 1/22/24 21:41, David Mosberger-Tang wrote: >> Alexis, >> >> Thanks for your feedback! >> >> On Mon, 2024-01-22 at 15:19 +0100, Alexis Lothoré wrote: >>> Hello, >>> >>> On 1/19/24 22:51, David Mosberger-Tang wrote: > > [...] > >>>> + if (ret) { >>>> + ret = -ENODEV; >>> >>> I would keep wilc_spi_configure_bus_protocol original error instead of >>> rewriting/forcing it to -ENODEV here. I mean, if something fails in >>> wilc_spi_configure_bus_protocol but not right at the first attempt to >>> communicate with the chip, it does not translate automatically to an absence of >>> chip, right ? >> >> Hmmh, I'm happy to change it, but, as it happens, all failure returns in >> wilc_spi_configure_bus_protocol() basically mean that the device isn't present >> or a device is present which the driver doesn't support, so I think -ENODEV is >> more useful than returning -EINVAL (as would be the case). Let me know if you >> still think I should change it. > > Yeah, but then I would change wilc_spi_configure_bus_protocol() to return > -ENODEV instead of -EINVAL, if that's really the cause, and just let calling > functions propagate it. That may just be a personal taste, but I find it pretty > tedious to debug some error code and eventually realize that some intermediate > function just rewrote the real error to another one (and sometime, loosing some > info while doing so). Yeah, changing error values is very much discouraged.
diff --git a/drivers/net/wireless/microchip/wilc1000/spi.c b/drivers/net/wireless/microchip/wilc1000/spi.c index 6bac52527e38..c7ab816d65bc 100644 --- a/drivers/net/wireless/microchip/wilc1000/spi.c +++ b/drivers/net/wireless/microchip/wilc1000/spi.c @@ -42,7 +42,7 @@ MODULE_PARM_DESC(enable_crc16, #define WILC_SPI_RSP_HDR_EXTRA_DATA 8 struct wilc_spi { - bool isinit; /* true if SPI protocol has been configured */ + bool isinit; /* true if wilc_spi_init was successful */ bool probing_crc; /* true if we're probing chip's CRC config */ bool crc7_enabled; /* true if crc7 is currently enabled */ bool crc16_enabled; /* true if crc16 is currently enabled */ @@ -55,6 +55,7 @@ struct wilc_spi {