Commit 40d15cd06e87722b1cc27d56c8274617580f2c56
Committed by
David S. Miller
1 parent
6d65e5eee6
Exists in
master
and in
6 other branches
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 <ben-linux@fluff.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 20 additions and 6 deletions Side-by-side Diff
drivers/net/dm9000.c
... | ... | @@ -535,21 +535,35 @@ |
535 | 535 | board_info_t *dm = to_dm9000_board(dev); |
536 | 536 | int offset = ee->offset; |
537 | 537 | int len = ee->len; |
538 | - int i; | |
538 | + int done; | |
539 | 539 | |
540 | 540 | /* EEPROM access is aligned to two bytes */ |
541 | 541 | |
542 | - if ((len & 1) != 0 || (offset & 1) != 0) | |
543 | - return -EINVAL; | |
544 | - | |
545 | 542 | if (dm->flags & DM9000_PLATF_NO_EEPROM) |
546 | 543 | return -ENOENT; |
547 | 544 | |
548 | 545 | if (ee->magic != DM_EEPROM_MAGIC) |
549 | 546 | return -EINVAL; |
550 | 547 | |
551 | - for (i = 0; i < len; i += 2) | |
552 | - dm9000_write_eeprom(dm, (offset + i) / 2, data + i); | |
548 | + while (len > 0) { | |
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 | 568 | return 0; |
555 | 569 | } |