static int mv88e6xxx_g2_eeprom_read8(struct mv88e6xxx_chip *chip, u16 addr, u8 *data) { u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_READ; int err; err = mv88e6xxx_g2_eeprom_wait(chip); if (err) return err; err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr); if (err) return err; err = mv88e6xxx_g2_eeprom_cmd(chip, cmd); if (err) return err; err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_EEPROM_CMD, &cmd); if (err) return err; *data = cmd & 0xff; return 0; }
static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd) { int err; err = mv88e6xxx_g2_write(chip, GLOBAL2_EEPROM_CMD, cmd); if (err) return err; return mv88e6xxx_g2_eeprom_wait(chip); }
static int mv88e6xxx_g2_eeprom_cmd(struct mv88e6xxx_chip *chip, u16 cmd) { int err; err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_EEPROM_CMD, MV88E6XXX_G2_EEPROM_CMD_BUSY | cmd); if (err) return err; return mv88e6xxx_g2_eeprom_wait(chip); }
/* mv88e6xxx_g2_avb_write -- Write one 16-bit word. */ static int mv88e6xxx_g2_avb_write(struct mv88e6xxx_chip *chip, u16 writeop, u16 data) { int err; err = mv88e6xxx_g2_write(chip, MV88E6352_G2_AVB_DATA, data); if (err) return err; return mv88e6xxx_g2_update(chip, MV88E6352_G2_AVB_CMD, writeop); }
static int mv88e6xxx_g2_irl_op(struct mv88e6xxx_chip *chip, u16 op, int port, int res, int reg) { int err; err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_IRL_CMD, MV88E6XXX_G2_IRL_CMD_BUSY | op | (port << 8) | (res << 5) | reg); if (err) return err; return mv88e6xxx_g2_irl_wait(chip); }
static int mv88e6xxx_g2_eeprom_write16(struct mv88e6xxx_chip *chip, u8 addr, u16 data) { u16 cmd = GLOBAL2_EEPROM_CMD_OP_WRITE | addr; int err; err = mv88e6xxx_g2_eeprom_wait(chip); if (err) return err; err = mv88e6xxx_g2_write(chip, GLOBAL2_EEPROM_DATA, data); if (err) return err; return mv88e6xxx_g2_eeprom_cmd(chip, cmd); }
int mv88e6xxx_g2_pvt_write(struct mv88e6xxx_chip *chip, int src_dev, int src_port, u16 data) { int err; err = mv88e6xxx_g2_pvt_op_wait(chip); if (err) return err; err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_DATA, data); if (err) return err; return mv88e6xxx_g2_pvt_op(chip, src_dev, src_port, MV88E6XXX_G2_PVT_ADDR_OP_WRITE_PVLAN); }
static int mv88e6xxx_g2_switch_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip, bool enable) { u16 val; int err; err = mv88e6xxx_g2_read(chip, MV88E6XXX_G2_SWITCH_MGMT, &val); if (err) return err; if (enable) val |= MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU; else val &= ~MV88E6XXX_G2_SWITCH_MGMT_RSVD2CPU; return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MGMT, val); }
static int mv88e6xxx_g2_eeprom_write8(struct mv88e6xxx_chip *chip, u16 addr, u8 data) { u16 cmd = MV88E6XXX_G2_EEPROM_CMD_OP_WRITE | MV88E6XXX_G2_EEPROM_CMD_WRITE_EN; int err; err = mv88e6xxx_g2_eeprom_wait(chip); if (err) return err; err = mv88e6xxx_g2_write(chip, MV88E6390_G2_EEPROM_ADDR, addr); if (err) return err; return mv88e6xxx_g2_eeprom_cmd(chip, cmd | data); }
static int mv88e6xxx_g2_pvt_op(struct mv88e6xxx_chip *chip, int src_dev, int src_port, u16 op) { int err; /* 9-bit Cross-chip PVT pointer: with MV88E6XXX_G2_MISC_5_BIT_PORT * cleared, source device is 5-bit, source port is 4-bit. */ op |= MV88E6XXX_G2_PVT_ADDR_BUSY; op |= (src_dev & 0x1f) << 4; op |= (src_port & 0xf); err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_PVT_ADDR, op); if (err) return err; return mv88e6xxx_g2_pvt_op_wait(chip); }
static int mv88e6xxx_g2_clear_irl(struct mv88e6xxx_chip *chip) { int port, err; /* Init all Ingress Rate Limit resources of all ports */ for (port = 0; port < mv88e6xxx_num_ports(chip); ++port) { /* XXX newer chips (like 88E6390) have different 2-bit ops */ err = mv88e6xxx_g2_write(chip, GLOBAL2_IRL_CMD, GLOBAL2_IRL_CMD_OP_INIT_ALL | (port << 8)); if (err) break; /* Wait for the operation to complete */ err = mv88e6xxx_g2_wait(chip, GLOBAL2_IRL_CMD, GLOBAL2_IRL_CMD_BUSY); if (err) break; } return err; }
static int mv88e6xxx_g2_mgmt_enable_0x(struct mv88e6xxx_chip *chip, u16 en0x) { return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_MGMT_EN_0X, en0x); }
static int mv88e6xxx_g2_int_mask(struct mv88e6xxx_chip *chip, u16 mask) { return mv88e6xxx_g2_write(chip, MV88E6XXX_G2_INT_MASK, mask); }