Loading drivers/net/dsa/mv88e6xxx.c +46 −33 Original line number Diff line number Diff line Loading @@ -1895,42 +1895,24 @@ static int _mv88e6xxx_atu_getnext(struct dsa_switch *ds, u16 fid, return 0; } int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port, static int _mv88e6xxx_port_fdb_dump_one(struct dsa_switch *ds, u16 fid, u16 vid, int port, struct switchdev_obj_port_fdb *fdb, int (*cb)(struct switchdev_obj *obj)) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_vtu_stu_entry vlan = { .vid = GLOBAL_VTU_VID_MASK, /* all ones */ }; int err; mutex_lock(&ps->smi_mutex); err = _mv88e6xxx_vtu_vid_write(ds, vlan.vid); if (err) goto unlock; do { struct mv88e6xxx_atu_entry addr = { .mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, }; err = _mv88e6xxx_vtu_getnext(ds, &vlan); if (err) goto unlock; if (!vlan.valid) break; int err; err = _mv88e6xxx_atu_mac_write(ds, addr.mac); if (err) goto unlock; return err; do { err = _mv88e6xxx_atu_getnext(ds, vlan.fid, &addr); err = _mv88e6xxx_atu_getnext(ds, fid, &addr); if (err) goto unlock; break; if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED) break; Loading @@ -1941,17 +1923,48 @@ int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port, GLOBAL_ATU_DATA_STATE_MC_STATIC : GLOBAL_ATU_DATA_STATE_UC_STATIC); fdb->vid = vlan.vid; fdb->vid = vid; ether_addr_copy(fdb->addr, addr.mac); fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE; fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE; err = cb(&fdb->obj); if (err) goto unlock; break; } } while (!is_broadcast_ether_addr(addr.mac)); return err; } int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port, struct switchdev_obj_port_fdb *fdb, int (*cb)(struct switchdev_obj *obj)) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_vtu_stu_entry vlan = { .vid = GLOBAL_VTU_VID_MASK, /* all ones */ }; int err; mutex_lock(&ps->smi_mutex); /* Dump VLANs' Filtering Information Databases */ err = _mv88e6xxx_vtu_vid_write(ds, vlan.vid); if (err) goto unlock; do { err = _mv88e6xxx_vtu_getnext(ds, &vlan); if (err) break; if (!vlan.valid) break; err = _mv88e6xxx_port_fdb_dump_one(ds, vlan.fid, vlan.vid, port, fdb, cb); if (err) break; } while (vlan.vid < GLOBAL_VTU_VID_MASK); unlock: Loading Loading
drivers/net/dsa/mv88e6xxx.c +46 −33 Original line number Diff line number Diff line Loading @@ -1895,42 +1895,24 @@ static int _mv88e6xxx_atu_getnext(struct dsa_switch *ds, u16 fid, return 0; } int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port, static int _mv88e6xxx_port_fdb_dump_one(struct dsa_switch *ds, u16 fid, u16 vid, int port, struct switchdev_obj_port_fdb *fdb, int (*cb)(struct switchdev_obj *obj)) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_vtu_stu_entry vlan = { .vid = GLOBAL_VTU_VID_MASK, /* all ones */ }; int err; mutex_lock(&ps->smi_mutex); err = _mv88e6xxx_vtu_vid_write(ds, vlan.vid); if (err) goto unlock; do { struct mv88e6xxx_atu_entry addr = { .mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, }; err = _mv88e6xxx_vtu_getnext(ds, &vlan); if (err) goto unlock; if (!vlan.valid) break; int err; err = _mv88e6xxx_atu_mac_write(ds, addr.mac); if (err) goto unlock; return err; do { err = _mv88e6xxx_atu_getnext(ds, vlan.fid, &addr); err = _mv88e6xxx_atu_getnext(ds, fid, &addr); if (err) goto unlock; break; if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED) break; Loading @@ -1941,17 +1923,48 @@ int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port, GLOBAL_ATU_DATA_STATE_MC_STATIC : GLOBAL_ATU_DATA_STATE_UC_STATIC); fdb->vid = vlan.vid; fdb->vid = vid; ether_addr_copy(fdb->addr, addr.mac); fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE; fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE; err = cb(&fdb->obj); if (err) goto unlock; break; } } while (!is_broadcast_ether_addr(addr.mac)); return err; } int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port, struct switchdev_obj_port_fdb *fdb, int (*cb)(struct switchdev_obj *obj)) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mv88e6xxx_vtu_stu_entry vlan = { .vid = GLOBAL_VTU_VID_MASK, /* all ones */ }; int err; mutex_lock(&ps->smi_mutex); /* Dump VLANs' Filtering Information Databases */ err = _mv88e6xxx_vtu_vid_write(ds, vlan.vid); if (err) goto unlock; do { err = _mv88e6xxx_vtu_getnext(ds, &vlan); if (err) break; if (!vlan.valid) break; err = _mv88e6xxx_port_fdb_dump_one(ds, vlan.fid, vlan.vid, port, fdb, cb); if (err) break; } while (vlan.vid < GLOBAL_VTU_VID_MASK); unlock: Loading