lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-id: <alpine.LFD.2.00.0901161328300.9524@xanadu.home>
Date:	Fri, 16 Jan 2009 13:35:43 -0500 (EST)
From:	Nicolas Pitre <nico@....org>
To:	Vernon Sauder <vernoninhand@...il.com>
Cc:	netdev@...r.kernel.org
Subject: Re: [PATCH] smc91x: enable ethtool EEPROM interface

On Fri, 16 Jan 2009, Vernon Sauder wrote:

> Sorry about that. This was an old patch before bank checking. Here is an update.
> 
> From: Vernon Sauder <vsauder@...and.com>
> Date: Fri, 16 Jan 2009 12:05:42 -0500
> Subject: [PATCH] smc91x: enable ethtool EEPROM interface
> 
> 
> Signed-off-by: Vernon Sauder <vsauder@...and.com>
> ---
>  drivers/net/smc91x.c |  108 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  drivers/net/smc91x.h |   10 +++++
>  2 files changed, 116 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c
> index b215a8d..ba802f5 100644
> --- a/drivers/net/smc91x.c
> +++ b/drivers/net/smc91x.c
> @@ -1643,6 +1643,109 @@ static void smc_ethtool_setmsglevel(struct net_device *dev, u32 level)
>  	lp->msg_enable = level;
>  }
> 
> +static int smc_write_eeprom_word(struct net_device *dev, u16 addr, u16 word)
> +{
> +	struct smc_local *lp = netdev_priv(dev);
> +	void __iomem *ioaddr = lp->base;
> +	spin_lock_irq(&lp->lock);
> +	/* load word into GP register */
> +	SMC_SELECT_BANK(lp, 1);
> +	SMC_SET_GP(lp, word);
> +	/* set the address to put the data in EEPROM */
> +	SMC_SELECT_BANK(lp, 2);
> +	SMC_SET_PTR(lp, addr);
> +	/* tell it to write */
> +	SMC_SELECT_BANK(lp, 1);
> +	u16 ctl = SMC_GET_CTL(lp);
> +	SMC_SET_CTL(lp, ctl | (CTL_EEPROM_SELECT | CTL_STORE));
> +	/* wait for it to finish */
> +	do {
> +		udelay(1);
> +	} while (SMC_GET_CTL(lp) & CTL_STORE);
> +	/* clean up */
> +	SMC_SET_CTL(lp, ctl);
> +	SMC_SELECT_BANK(lp, 2);
> +	spin_unlock_irq(&lp->lock);
> +	return 0;
> +}
> +
> +static int smc_read_eeprom_word(struct net_device *dev, u16 addr, u16 *word)
> +{
> +	struct smc_local *lp = netdev_priv(dev);
> +	void __iomem *ioaddr = lp->base;
> +
> +	spin_lock_irq(&lp->lock);
> +	/* set the EEPROM address to get the data from */
> +	SMC_SELECT_BANK(lp, 2);
> +	SMC_SET_PTR(lp, addr | PTR_READ);
> +	/* tell it to load */
> +	SMC_SELECT_BANK(lp, 1);
> +	SMC_SET_GP(lp, 0xffff);	/* init to known */
> +	u16 ctl = SMC_GET_CTL(lp);

Don't put variable declaration in the middle of code sequences.  Not all 
gcc versions support C++ variable declaration style.


> +	SMC_SET_CTL(lp, ctl | (CTL_EEPROM_SELECT | CTL_RELOAD));
> +	/* wait for it to finish */
> +	do {
> +		udelay(1);
> +	} while (SMC_GET_CTL(lp) & CTL_RELOAD);
> +	/* read word from GP register */
> +	*word = SMC_GET_GP(lp);
> +	/* clean up */
> +	SMC_SET_CTL(lp, ctl);
> +	SMC_SELECT_BANK(lp, 2);
> +	spin_unlock_irq(&lp->lock);
> +	return 0;
> +}
> +
> +static int smc_ethtool_geteeprom_len(struct net_device *dev)
> +{
> +	return 0x23 * 2;
> +}
> +
> +static int smc_ethtool_geteeprom(struct net_device *dev,
> +		struct ethtool_eeprom *eeprom, u8 *data)
> +{
> +	int i, ret;
> +
> +	DBG(1, "Reading %d bytes at %d(0x%x)\n",
> +		eeprom->len, eeprom->offset, eeprom->offset);
> +	int imax = smc_ethtool_geteeprom_len(dev);
> +	for (i = 0; i < eeprom->len; i += 2) {
> +		int offset = i + eeprom->offset;
> +		if (offset > imax)
> +			break;
> +		u16 wbuf;

Same here.

> +		ret = smc_read_eeprom_word(dev, offset >> 1, &wbuf);
> +		if (ret != 0)
> +			return ret;
> +		DBG(2, "Read 0x%x from 0x%x\n", wbuf, offset >> 1);
> +		data[i] = (wbuf >> 8) & 0xff;
> +		data[i+1] = wbuf & 0xff;
> +	}
> +	return 0;
> +}
> +
> +static int smc_ethtool_seteeprom(struct net_device *dev,
> +		struct ethtool_eeprom *eeprom, u8 *data)
> +{
> +	int i, ret;
> +
> +	DBG(1, "Writing %d bytes to %d(0x%x)\n",
> +			eeprom->len, eeprom->offset, eeprom->offset);
> +	int imax = smc_ethtool_geteeprom_len(dev);

Same here.

> +	for (i = 0; i < eeprom->len; i += 2) {
> +		int offset = i + eeprom->offset;
> +		if (offset > imax)
> +			break;
> +		u16 wbuf = (data[i] << 8) | data[i + 1];

Same here.


With those fixed you can resubmit with my ACK.


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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ