Message ID | 1307703032-20349-1-git-send-email-broonie@opensource.wolfsonmicro.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Fri, 2011-06-10 at 11:50 +0100, Mark Brown wrote: > From: Ben Dooks <ben-linux@fluff.org> > > Given many versions of ethtool's reluctance to do anything other than > byte accesses to the EEPROM interface, it is easier to update the driver > to support byte accesses so that all the ethtool versions that have been > observed in Debian can write the EEPROM. > > Signed-off-by: Ben Dooks <ben-linux@fluff.org> > Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> Ben.
From: Mark Brown <broonie@opensource.wolfsonmicro.com> Date: Fri, 10 Jun 2011 11:50:32 +0100 > From: Ben Dooks <ben-linux@fluff.org> > > Given many versions of ethtool's reluctance to do anything other than > byte accesses to the EEPROM interface, it is easier to update the driver > to support byte accesses so that all the ethtool versions that have been > observed in Debian can write the EEPROM. > > Signed-off-by: Ben Dooks <ben-linux@fluff.org> > Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Applied to net-next-2.6, thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 863e9c4..8ef31dc 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -535,21 +535,35 @@ static int dm9000_set_eeprom(struct net_device *dev, board_info_t *dm = to_dm9000_board(dev); int offset = ee->offset; int len = ee->len; - int i; + int done; /* EEPROM access is aligned to two bytes */ - if ((len & 1) != 0 || (offset & 1) != 0) - return -EINVAL; - if (dm->flags & DM9000_PLATF_NO_EEPROM) return -ENOENT; if (ee->magic != DM_EEPROM_MAGIC) return -EINVAL; - for (i = 0; i < len; i += 2) - dm9000_write_eeprom(dm, (offset + i) / 2, data + i); + while (len > 0) { + if (len & 1 || offset & 1) { + int which = offset & 1; + u8 tmp[2]; + + dm9000_read_eeprom(dm, offset / 2, tmp); + tmp[which] = *data; + dm9000_write_eeprom(dm, offset / 2, tmp); + + done = 1; + } else { + dm9000_write_eeprom(dm, offset / 2, data); + done = 2; + } + + data += done; + offset += done; + len -= done; + } return 0; }