diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-19 21:00:37 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-19 21:00:37 +0000 |
commit | 94ac2ab3fff96814d7460a27a0e9d004abbd4128 (patch) | |
tree | 9a4eb8cc234b540b0f4b93363109cdd37a20540b /drivers/net/dsa/mv88e6xxx/global1.c | |
parent | Adding debian version 6.8.12-1. (diff) | |
download | linux-94ac2ab3fff96814d7460a27a0e9d004abbd4128.tar.xz linux-94ac2ab3fff96814d7460a27a0e9d004abbd4128.zip |
Merging upstream version 6.9.2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'drivers/net/dsa/mv88e6xxx/global1.c')
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/global1.c | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/global1.c b/drivers/net/dsa/mv88e6xxx/global1.c index 9820cd5967..49444a72ff 100644 --- a/drivers/net/dsa/mv88e6xxx/global1.c +++ b/drivers/net/dsa/mv88e6xxx/global1.c @@ -75,95 +75,6 @@ static int mv88e6xxx_g1_wait_init_ready(struct mv88e6xxx_chip *chip) return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STS, bit, 1); } -static int mv88e6250_g1_eeprom_reload(struct mv88e6xxx_chip *chip) -{ - /* MV88E6185_G1_CTL1_RELOAD_EEPROM is also valid for 88E6250 */ - int bit = __bf_shf(MV88E6185_G1_CTL1_RELOAD_EEPROM); - u16 val; - int err; - - err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_CTL1, &val); - if (err) - return err; - - val |= MV88E6185_G1_CTL1_RELOAD_EEPROM; - - err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_CTL1, val); - if (err) - return err; - - return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_CTL1, bit, 0); -} - -/* Returns 0 when done, -EBUSY when waiting, other negative codes on error */ -static int mv88e6xxx_g1_is_eeprom_done(struct mv88e6xxx_chip *chip) -{ - u16 val; - int err; - - err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &val); - if (err < 0) { - dev_err(chip->dev, "Error reading status"); - return err; - } - - /* If the switch is still resetting, it may not - * respond on the bus, and so MDIO read returns - * 0xffff. Differentiate between that, and waiting for - * the EEPROM to be done by bit 0 being set. - */ - if (val == 0xffff || !(val & BIT(MV88E6XXX_G1_STS_IRQ_EEPROM_DONE))) - return -EBUSY; - - return 0; -} - -/* As the EEInt (EEPROM done) flag clears on read if the status register, this - * function must be called directly after a hard reset or EEPROM ReLoad request, - * or the done condition may have been missed - */ -int mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip) -{ - const unsigned long timeout = jiffies + 1 * HZ; - int ret; - - /* Wait up to 1 second for the switch to finish reading the - * EEPROM. - */ - while (time_before(jiffies, timeout)) { - ret = mv88e6xxx_g1_is_eeprom_done(chip); - if (ret != -EBUSY) - return ret; - } - - dev_err(chip->dev, "Timeout waiting for EEPROM done"); - return -ETIMEDOUT; -} - -int mv88e6250_g1_wait_eeprom_done_prereset(struct mv88e6xxx_chip *chip) -{ - int ret; - - ret = mv88e6xxx_g1_is_eeprom_done(chip); - if (ret != -EBUSY) - return ret; - - /* Pre-reset, we don't know the state of the switch - when - * mv88e6xxx_g1_is_eeprom_done() returns -EBUSY, that may be because - * the switch is actually busy reading the EEPROM, or because - * MV88E6XXX_G1_STS_IRQ_EEPROM_DONE has been cleared by an unrelated - * status register read already. - * - * To account for the latter case, trigger another EEPROM reload for - * another chance at seeing the done flag. - */ - ret = mv88e6250_g1_eeprom_reload(chip); - if (ret) - return ret; - - return mv88e6xxx_g1_wait_eeprom_done(chip); -} - /* Offset 0x01: Switch MAC Address Register Bytes 0 & 1 * Offset 0x02: Switch MAC Address Register Bytes 2 & 3 * Offset 0x03: Switch MAC Address Register Bytes 4 & 5 |