net: dsa: mv88e6xxx: add EEPROM support to 6390
The Marvell 6352 chip has a 8-bit address/16-bit data EEPROM access. The Marvell 6390 chip has a 16-bit address/8-bit data EEPROM access. This patch implements the 8-bit data EEPROM access in the mv88e6xxx driver and adds its support to chips of the 6390 family. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
这个提交包含在:
@@ -218,7 +218,8 @@ static int mv88e6xxx_g2_clear_pot(struct mv88e6xxx_chip *chip)
|
||||
}
|
||||
|
||||
/* Offset 0x14: EEPROM Command
|
||||
* Offset 0x15: EEPROM Data
|
||||
* Offset 0x15: EEPROM Data (for 16-bit data access)
|
||||
* Offset 0x15: EEPROM Addr (for 8-bit data access)
|
||||
*/
|
||||
|
||||
static int mv88e6xxx_g2_eeprom_wait(struct mv88e6xxx_chip *chip)
|
||||
@@ -239,6 +240,50 @@ static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd)
|
||||
return mv88e6xxx_g2_eeprom_wait(chip);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_g2_eeprom_read8(struct mv88e6xxx_chip *chip,
|
||||
u16 addr, u8 *data)
|
||||
{
|
||||
u16 cmd = GLOBAL2_EEPROM_CMD_OP_READ;
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_g2_eeprom_wait(chip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g2_write(chip, GLOBAL2_EEPROM_ADDR, addr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g2_eeprom_cmd(chip, cmd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g2_read(chip, GLOBAL2_EEPROM_CMD, &cmd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*data = cmd & 0xff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_g2_eeprom_write8(struct mv88e6xxx_chip *chip,
|
||||
u16 addr, u8 data)
|
||||
{
|
||||
u16 cmd = GLOBAL2_EEPROM_CMD_OP_WRITE | GLOBAL2_EEPROM_CMD_WRITE_EN;
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_g2_eeprom_wait(chip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g2_write(chip, GLOBAL2_EEPROM_ADDR, addr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return mv88e6xxx_g2_eeprom_cmd(chip, cmd | data);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_g2_eeprom_read16(struct mv88e6xxx_chip *chip,
|
||||
u8 addr, u16 *data)
|
||||
{
|
||||
@@ -273,6 +318,52 @@ static int mv88e6xxx_g2_eeprom_write16(struct mv88e6xxx_chip *chip,
|
||||
return mv88e6xxx_g2_eeprom_cmd(chip, cmd);
|
||||
}
|
||||
|
||||
int mv88e6xxx_g2_get_eeprom8(struct mv88e6xxx_chip *chip,
|
||||
struct ethtool_eeprom *eeprom, u8 *data)
|
||||
{
|
||||
unsigned int offset = eeprom->offset;
|
||||
unsigned int len = eeprom->len;
|
||||
int err;
|
||||
|
||||
eeprom->len = 0;
|
||||
|
||||
while (len) {
|
||||
err = mv88e6xxx_g2_eeprom_read8(chip, offset, data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
eeprom->len++;
|
||||
offset++;
|
||||
data++;
|
||||
len--;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mv88e6xxx_g2_set_eeprom8(struct mv88e6xxx_chip *chip,
|
||||
struct ethtool_eeprom *eeprom, u8 *data)
|
||||
{
|
||||
unsigned int offset = eeprom->offset;
|
||||
unsigned int len = eeprom->len;
|
||||
int err;
|
||||
|
||||
eeprom->len = 0;
|
||||
|
||||
while (len) {
|
||||
err = mv88e6xxx_g2_eeprom_write8(chip, offset, *data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
eeprom->len++;
|
||||
offset++;
|
||||
data++;
|
||||
len--;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mv88e6xxx_g2_get_eeprom16(struct mv88e6xxx_chip *chip,
|
||||
struct ethtool_eeprom *eeprom, u8 *data)
|
||||
{
|
||||
|
在新工单中引用
屏蔽一个用户