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
| ||
|
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