Search Linux Wireless

Re: [PATCH] [v4] wifi: wilc1000: validate chip id during bus probe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 1/27/24 01:43, David Mosberger-Tang wrote:
> Previously, the driver created a net device (typically wlan0) as soon
> as the module was loaded.  This commit changes the driver to follow
> normal Linux convention of creating the net device only when bus
> probing detects a supported chip.

As already mentioned multiple times, I am skeptical about the validity of
keeping netdev registration before chip presence check, but I am not the
maintainer, so I let Ajay and Kalle decide for this. Aside from that, and from
the kasan warning which is not especially related to the series (and not
observed in nominal case), I still have a few minor comments below

> Signed-off-by: David Mosberger-Tang <davidm@xxxxxxxxxx>
> ---
> changelog:
> V1: original version
> V2: Add missing forward declarations
> V3: Add missing forward declarations, actually :-(
> V4: - rearranged function order to improve readability
>     - now relative to wireless-next repository
>     - avoid change error return value and have lower-level functions
>       directly return -ENODEV instead
>     - removed any mention of WILC3000
>     - export and use existing is_wilc1000() for chipid validation
>     - replaced strbool() function with open code
> 
>  drivers/net/wireless/microchip/wilc1000/spi.c | 74 ++++++++++++++-----
>  .../net/wireless/microchip/wilc1000/wlan.c    |  3 +-
>  .../net/wireless/microchip/wilc1000/wlan.h    |  1 +
>  3 files changed, 59 insertions(+), 19 deletions(-)

[...]

> @@ -1142,7 +1170,7 @@ static int wilc_spi_init(struct wilc *wilc, bool resume)
>  	}
>  	if (ret) {
>  		dev_err(&spi->dev, "Failed with CRC7 on and off.\n");
> -		return ret;
> +		return -ENODEV;

You are still rewriting error codes here. At a lower level, sure, but still...
When I suggested setting -ENODEV at lower level, I was thinking about places
where no explicit error code was already in use, but
spi_internal_read/spi_internal_write already generate proper error codes. Or am
I missing a constraint, like the probe chain really needing -ENODEV ?

>  	}
>  
>  	/* set up the desired CRC configuration: */
> @@ -1165,7 +1193,7 @@ static int wilc_spi_init(struct wilc *wilc, bool resume)
>  		dev_err(&spi->dev,
>  			"[wilc spi %d]: Failed internal write reg\n",
>  			__LINE__);
> -		return ret;
> +		return -ENODEV;
>  	}
>  	/* update our state to match new protocol settings: */
>  	spi_priv->crc7_enabled = enable_crc7;
> @@ -1176,17 +1204,27 @@ static int wilc_spi_init(struct wilc *wilc, bool resume)
>  
>  	spi_priv->probing_crc = false;
>  
> +	return 0;
> +}
> +
> +static int wilc_validate_chipid(struct wilc *wilc)
> +{
> +	struct spi_device *spi = to_spi_device(wilc->dev);
> +	u32 chipid;
> +	int ret;
> +
>  	/*
>  	 * make sure can read chip id without protocol error
>  	 */
>  	ret = wilc_spi_read_reg(wilc, WILC_CHIPID, &chipid);
>  	if (ret) {
>  		dev_err(&spi->dev, "Fail cmd read chip id...\n");
> -		return ret;
> +		return -ENODEV;
> +	}
> +	if (!is_wilc1000(chipid)) {
> +		dev_err(&spi->dev, "Unknown chip id 0x%x\n", chipid);
> +		return -ENODEV;
>  	}
> -
> -	spi_priv->isinit = true;
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/net/wireless/microchip/wilc1000/wlan.c b/drivers/net/wireless/microchip/wilc1000/wlan.c
> index 6b2f2269ddf8..3130a3ea8d71 100644
> --- a/drivers/net/wireless/microchip/wilc1000/wlan.c
> +++ b/drivers/net/wireless/microchip/wilc1000/wlan.c
> @@ -12,10 +12,11 @@
>  
>  #define WAKE_UP_TRIAL_RETRY		10000
>  
> -static inline bool is_wilc1000(u32 id)
> +bool is_wilc1000(u32 id)
>  {
>  	return (id & (~WILC_CHIP_REV_FIELD)) == WILC_1000_BASE_ID;
>  }
> +EXPORT_SYMBOL_GPL(is_wilc1000);

nit: Since the function is not static anymore, it would have been nice to move
it with the other exported functions to maintain the existing functions ordering

>  static inline void acquire_bus(struct wilc *wilc, enum bus_acquire acquire)
>  {
> diff --git a/drivers/net/wireless/microchip/wilc1000/wlan.h b/drivers/net/wireless/microchip/wilc1000/wlan.h
> index f02775f7e41f..ebdfb0afaf71 100644
> --- a/drivers/net/wireless/microchip/wilc1000/wlan.h
> +++ b/drivers/net/wireless/microchip/wilc1000/wlan.h
> @@ -409,6 +409,7 @@ struct wilc_cfg_rsp {
>  
>  struct wilc_vif;
>  
> +bool is_wilc1000(u32 id);
>  int wilc_wlan_firmware_download(struct wilc *wilc, const u8 *buffer,
>  				u32 buffer_size);
>  int wilc_wlan_start(struct wilc *wilc);

-- 
Alexis Lothoré, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux