Search Linux Wireless

Re: [PATCH 1/2] rt2x00: rt2800pci: verify ioremap return value

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

 



Hi Gabor,

One thing:

On 12/18/2012 05:22 PM, Gabor Juhos wrote:
> An ioremap call is allowed to fail, however
> the return value of that is not checked in
> the 'rt2800pci_read_eeprom_soc' function.
> 
> The patch adds the missing check, and makes
> the function return an int value. The patch
> also converts the 'rt2800_read_eeprom' and
> 'rt2800_ops.read_eeprom' functions to return
> an int value, so the error value can be
> propagated up to the 'rt2800_validate_eeprom'
> function.
> 
> Signed-off-by: Gabor Juhos <juhosg@xxxxxxxxxxx>
> ---
>  drivers/net/wireless/rt2x00/rt2800lib.c |    5 ++++-
>  drivers/net/wireless/rt2x00/rt2800lib.h |    6 +++---
>  drivers/net/wireless/rt2x00/rt2800pci.c |   17 ++++++++++++-----
>  drivers/net/wireless/rt2x00/rt2800usb.c |    4 +++-
>  4 files changed, 22 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 197b446..52b2978 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -4635,11 +4635,14 @@ static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
>  	u16 word;
>  	u8 *mac;
>  	u8 default_lna_gain;
> +	int retval;
>  
>  	/*
>  	 * Read the EEPROM.
>  	 */
> -	rt2800_read_eeprom(rt2x00dev);
> +	retval = rt2800_read_eeprom(rt2x00dev);
> +	if (retval)
> +		return retval;
>  
>  	/*
>  	 * Start validation of the data that has been read.
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
> index a128cea..8252c67 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.h
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.h
> @@ -43,7 +43,7 @@ struct rt2800_ops {
>  			    const unsigned int offset,
>  			    const struct rt2x00_field32 field, u32 *reg);
>  
> -	void (*read_eeprom)(struct rt2x00_dev *rt2x00dev);
> +	int (*read_eeprom)(struct rt2x00_dev *rt2x00dev);
>  	bool (*hwcrypt_disabled)(struct rt2x00_dev *rt2x00dev);
>  
>  	int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev,
> @@ -117,11 +117,11 @@ static inline int rt2800_regbusy_read(struct rt2x00_dev *rt2x00dev,
>  	return rt2800ops->regbusy_read(rt2x00dev, offset, field, reg);
>  }
>  
> -static inline void rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev)
> +static inline int rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev)
>  {
>  	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
>  
> -	rt2800ops->read_eeprom(rt2x00dev);
> +	return rt2800ops->read_eeprom(rt2x00dev);
>  }
>  
>  static inline bool rt2800_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 9224d87..5fc16dd 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -90,17 +90,21 @@ static void rt2800pci_mcu_status(struct rt2x00_dev *rt2x00dev, const u8 token)
>  }
>  
>  #if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
> -static void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
> +static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
>  {
>  	void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
>  
> +	if (!base_addr)
> +		return -ENOMEM;
> +
>  	memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
>  
>  	iounmap(base_addr);
>  }

Missing return at the end, since it should now return an int.
Even if this is gone with the second patch.

>  #else
> -static inline void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
> +static inline int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
>  {
> +	return -ENOMEM;
>  }
>  #endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
>  
> @@ -970,14 +974,17 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance)
>  /*
>   * Device probe functions.
>   */
> -static void rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
> +static int rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
>  {
>  	if (rt2x00_is_soc(rt2x00dev))
> -		rt2800pci_read_eeprom_soc(rt2x00dev);
> -	else if (rt2800pci_efuse_detect(rt2x00dev))
> +		return rt2800pci_read_eeprom_soc(rt2x00dev);
> +
> +	if (rt2800pci_efuse_detect(rt2x00dev))
>  		rt2800pci_read_eeprom_efuse(rt2x00dev);
>  	else
>  		rt2800pci_read_eeprom_pci(rt2x00dev);
> +
> +	return 0;
>  }
>  
>  static const struct ieee80211_ops rt2800pci_mac80211_ops = {
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 5c149b5..48de5c9 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -735,13 +735,15 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry,
>  /*
>   * Device probe functions.
>   */
> -static void rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev)
> +static int rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev)
>  {
>  	if (rt2800_efuse_detect(rt2x00dev))
>  		rt2800_read_eeprom_efuse(rt2x00dev);
>  	else
>  		rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom,
>  				      EEPROM_SIZE);
> +
> +	return 0;
>  }
>  
>  static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
> 


Regards,
   /Jones

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

  Powered by Linux