|
@@ -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;
|
|
|
}
|