Commit 40d15cd06e87722b1cc27d56c8274617580f2c56

Authored by Ben Dooks
Committed by David S. Miller
1 parent 6d65e5eee6

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 }