registers = kmalloc_array(32, sizeof(u16), GFP_KERNEL); if (!registers) return -ENOMEM;
mv88e6xxx_reg_lock(chip); for (i = 0; i < 32; i++) { switch (region_priv->id) { case MV88E6XXX_REGION_GLOBAL1:
err = mv88e6xxx_g1_read(chip, i, ®isters[i]); break; case MV88E6XXX_REGION_GLOBAL2:
err = mv88e6xxx_g2_read(chip, i, ®isters[i]); break; default:
err = -EOPNOTSUPP;
}
/* The ATU entry varies between mv88e6xxx chipset generations. Define * a generic format which covers all the current and hopefully future * mv88e6xxx generations
*/
struct mv88e6xxx_devlink_atu_entry { /* The FID is scattered over multiple registers. */
u16 fid;
u16 atu_op;
u16 atu_data;
u16 atu_01;
u16 atu_23;
u16 atu_45;
};
staticint mv88e6xxx_region_atu_snapshot_fid(struct mv88e6xxx_chip *chip, int fid, struct mv88e6xxx_devlink_atu_entry *table, int *count)
{
u16 atu_op, atu_data, atu_01, atu_23, atu_45; struct mv88e6xxx_atu_entry addr; int err;
addr.state = 0;
eth_broadcast_addr(addr.mac);
do {
err = mv88e6xxx_g1_atu_getnext(chip, fid, &addr); if (err) return err;
if (!addr.state) break;
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_OP, &atu_op); if (err) return err;
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_DATA, &atu_data); if (err) return err;
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_MAC01, &atu_01); if (err) return err;
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_MAC23, &atu_23); if (err) return err;
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_MAC45, &atu_45); if (err) return err;
/** * struct mv88e6xxx_devlink_vtu_entry - Devlink VTU entry * @fid: Global1/2: FID and VLAN policy. * @sid: Global1/3: SID, unknown filters and learning. * @op: Global1/5: FID (old chipsets). * @vid: Global1/6: VID, valid, and page. * @data: Global1/7-9: Membership data and priority override. * @resvd: Reserved. Also happens to align the size to 16B. * * The VTU entry format varies between chipset generations, the * descriptions above represent the superset of all possible * information, not all fields are valid on all devices. Since this is * a low-level debug interface, copy all data verbatim and defer * parsing to the consumer.
*/ struct mv88e6xxx_devlink_vtu_entry {
u16 fid;
u16 sid;
u16 op;
u16 vid;
u16 data[3];
u16 resvd;
};
entry++;
} while (vlan.vid < mv88e6xxx_max_vid(chip));
mv88e6xxx_reg_unlock(chip);
if (err) {
kfree(table); return err;
}
*data = (u8 *)table; return0;
}
/** * struct mv88e6xxx_devlink_stu_entry - Devlink STU entry * @sid: Global1/3: SID, unknown filters and learning. * @vid: Global1/6: Valid bit. * @data: Global1/7-9: Membership data and priority override. * @resvd: Reserved. In case we forgot something. * * The STU entry format varies between chipset generations. Peridot * and Amethyst packs the STU data into Global1/7-8. Older silicon * spreads the information across all three VTU data registers - * inheriting the layout of even older hardware that had no STU at * all. Since this is a low-level debug interface, copy all data * verbatim and defer parsing to the consumer.
*/ struct mv88e6xxx_devlink_stu_entry {
u16 sid;
u16 vid;
u16 data[3];
u16 resvd;
};
pvt = kcalloc(MV88E6XXX_MAX_PVT_ENTRIES, sizeof(*pvt), GFP_KERNEL); if (!pvt) return -ENOMEM;
mv88e6xxx_reg_lock(chip);
cur = pvt; for (dev = 0; dev < MV88E6XXX_MAX_PVT_SWITCHES; dev++) { for (port = 0; port < MV88E6XXX_MAX_PVT_PORTS; port++) {
err = mv88e6xxx_g2_pvt_read(chip, dev, port, cur); if (err) break;
cur++;
}
}
mv88e6xxx_reg_unlock(chip);
if (err) {
kfree(pvt); return err;
}
*data = (u8 *)pvt; return0;
}
staticint mv88e6xxx_region_port_snapshot(struct devlink_port *devlink_port, conststruct devlink_port_region_ops *ops, struct netlink_ext_ack *extack,
u8 **data)
{ struct dsa_switch *ds = dsa_devlink_port_to_ds(devlink_port); int port = dsa_devlink_port_to_port(devlink_port); struct mv88e6xxx_chip *chip = ds->priv;
u16 *registers; int i, err;
registers = kmalloc_array(32, sizeof(u16), GFP_KERNEL); if (!registers) return -ENOMEM;
mv88e6xxx_reg_lock(chip); for (i = 0; i < 32; i++) {
err = mv88e6xxx_port_read(chip, port, i, ®isters[i]); if (err) {
kfree(registers); goto out;
}
}
*data = (u8 *)registers;
out:
mv88e6xxx_reg_unlock(chip);
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet am 2026-06-07)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.