From: Ben Dooks Date: Fri, 10 Jun 2011 00:50:32 +0000 (+0000) Subject: net: DM9000: Add support for byte EEPROM access X-Git-Tag: v3.12-rc1~5334^2~450^2~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=40d15cd06e87722b1cc27d56c8274617580f2c56;p=kernel%2Fkernel-generic.git net: DM9000: Add support for byte EEPROM access 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 Signed-off-by: Mark Brown Reviewed-by: Ben Hutchings Signed-off-by: David S. Miller --- 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; }