aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/dm9000.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 863e9c459e6..8ef31dc4704 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -535,21 +535,35 @@ static int dm9000_set_eeprom(struct net_device *dev,
535 board_info_t *dm = to_dm9000_board(dev); 535 board_info_t *dm = to_dm9000_board(dev);
536 int offset = ee->offset; 536 int offset = ee->offset;
537 int len = ee->len; 537 int len = ee->len;
538 int i; 538 int done;
539 539
540 /* EEPROM access is aligned to two bytes */ 540 /* EEPROM access is aligned to two bytes */
541 541
542 if ((len & 1) != 0 || (offset & 1) != 0)
543 return -EINVAL;
544
545 if (dm->flags & DM9000_PLATF_NO_EEPROM) 542 if (dm->flags & DM9000_PLATF_NO_EEPROM)
546 return -ENOENT; 543 return -ENOENT;
547 544
548 if (ee->magic != DM_EEPROM_MAGIC) 545 if (ee->magic != DM_EEPROM_MAGIC)
549 return -EINVAL; 546 return -EINVAL;
550 547
551 for (i = 0; i < len; i += 2) 548 while (len > 0) {
552 dm9000_write_eeprom(dm, (offset + i) / 2, data + i); 549 if (len & 1 || offset & 1) {
550 int which = offset & 1;
551 u8 tmp[2];
552
553 dm9000_read_eeprom(dm, offset / 2, tmp);
554 tmp[which] = *data;
555 dm9000_write_eeprom(dm, offset / 2, tmp);
556
557 done = 1;
558 } else {
559 dm9000_write_eeprom(dm, offset / 2, data);
560 done = 2;
561 }
562
563 data += done;
564 offset += done;
565 len -= done;
566 }
553 567
554 return 0; 568 return 0;
555} 569}