net: dsa: microchip: update fdb add/del/dump in ksz_common
authorArun Ramadoss <arun.ramadoss@microchip.com>
Fri, 17 Jun 2022 08:42:54 +0000 (14:12 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 21 Jun 2022 13:26:45 +0000 (15:26 +0200)
This patch makes the dsa_switch_hook for fdbs to use ksz_common.c file.
And from ksz_common, individual switches fdb functions are called using
the dev->dev_ops. And removed the r_dyn_mac_table, r_sta_mac_table and
w_sta_mac_table from ksz_dev_ops as it is used only in ksz8795.c

Signed-off-by: Arun Ramadoss <arun.ramadoss@microchip.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/microchip/ksz8795.c
drivers/net/dsa/microchip/ksz9477.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h

index 7ebed00777b9b5104d216aaef507b02aa709a60c..2f93b921b45ee13a7cd7f97cee95915e9091d6aa 100644 (file)
@@ -953,6 +953,34 @@ static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
        }
 }
 
+static int ksz8_fdb_dump(struct ksz_device *dev, int port,
+                        dsa_fdb_dump_cb_t *cb, void *data)
+{
+       int ret = 0;
+       u16 i = 0;
+       u16 entries = 0;
+       u8 timestamp = 0;
+       u8 fid;
+       u8 member;
+       struct alu_struct alu;
+
+       do {
+               alu.is_static = false;
+               ret = ksz8_r_dyn_mac_table(dev, i, alu.mac, &fid, &member,
+                                          &timestamp, &entries);
+               if (!ret && (member & BIT(port))) {
+                       ret = cb(alu.mac, alu.fid, alu.is_static, data);
+                       if (ret)
+                               break;
+               }
+               i++;
+       } while (i < entries);
+       if (i >= entries)
+               ret = 0;
+
+       return ret;
+}
+
 static int ksz8_mdb_add(struct ksz_device *dev, int port,
                        const struct switchdev_obj_port_mdb *mdb,
                        struct dsa_db db)
@@ -963,7 +991,7 @@ static int ksz8_mdb_add(struct ksz_device *dev, int port,
 
        alu.port_forward = 0;
        for (index = 0; index < dev->info->num_statics; index++) {
-               if (!dev->dev_ops->r_sta_mac_table(dev, index, &alu)) {
+               if (!ksz8_r_sta_mac_table(dev, index, &alu)) {
                        /* Found one already in static MAC table. */
                        if (!memcmp(alu.mac, mdb->addr, ETH_ALEN) &&
                            alu.fid == mdb->vid)
@@ -992,7 +1020,7 @@ static int ksz8_mdb_add(struct ksz_device *dev, int port,
                /* Need a way to map VID to FID. */
                alu.fid = mdb->vid;
        }
-       dev->dev_ops->w_sta_mac_table(dev, index, &alu);
+       ksz8_w_sta_mac_table(dev, index, &alu);
 
        return 0;
 }
@@ -1005,7 +1033,7 @@ static int ksz8_mdb_del(struct ksz_device *dev, int port,
        int index;
 
        for (index = 0; index < dev->info->num_statics; index++) {
-               if (!dev->dev_ops->r_sta_mac_table(dev, index, &alu)) {
+               if (!ksz8_r_sta_mac_table(dev, index, &alu)) {
                        /* Found one already in static MAC table. */
                        if (!memcmp(alu.mac, mdb->addr, ETH_ALEN) &&
                            alu.fid == mdb->vid)
@@ -1021,7 +1049,7 @@ static int ksz8_mdb_del(struct ksz_device *dev, int port,
        alu.port_forward &= ~BIT(port);
        if (!alu.port_forward)
                alu.is_static = false;
-       dev->dev_ops->w_sta_mac_table(dev, index, &alu);
+       ksz8_w_sta_mac_table(dev, index, &alu);
 
 exit:
        return 0;
@@ -1516,13 +1544,11 @@ static const struct ksz_dev_ops ksz8_dev_ops = {
        .port_setup = ksz8_port_setup,
        .r_phy = ksz8_r_phy,
        .w_phy = ksz8_w_phy,
-       .r_dyn_mac_table = ksz8_r_dyn_mac_table,
-       .r_sta_mac_table = ksz8_r_sta_mac_table,
-       .w_sta_mac_table = ksz8_w_sta_mac_table,
        .r_mib_cnt = ksz8_r_mib_cnt,
        .r_mib_pkt = ksz8_r_mib_pkt,
        .freeze_mib = ksz8_freeze_mib,
        .port_init_cnt = ksz8_port_init_cnt,
+       .fdb_dump = ksz8_fdb_dump,
        .mdb_add = ksz8_mdb_add,
        .mdb_del = ksz8_mdb_del,
        .vlan_filtering = ksz8_port_vlan_filtering,
index 95e1c7b20190d2e430e950fa27ffba4ab2ab7668..1213ff643d05deab9f2aebe2e74a2ff106264de5 100644 (file)
@@ -452,11 +452,10 @@ static int ksz9477_port_vlan_del(struct ksz_device *dev, int port,
        return 0;
 }
 
-static int ksz9477_port_fdb_add(struct dsa_switch *ds, int port,
-                               const unsigned char *addr, u16 vid,
-                               struct dsa_db db)
+static int ksz9477_fdb_add(struct ksz_device *dev, int port,
+                          const unsigned char *addr, u16 vid,
+                          struct dsa_db db)
 {
-       struct ksz_device *dev = ds->priv;
        u32 alu_table[4];
        u32 data;
        int ret = 0;
@@ -510,11 +509,10 @@ exit:
        return ret;
 }
 
-static int ksz9477_port_fdb_del(struct dsa_switch *ds, int port,
-                               const unsigned char *addr, u16 vid,
-                               struct dsa_db db)
+static int ksz9477_fdb_del(struct ksz_device *dev, int port,
+                          const unsigned char *addr, u16 vid,
+                          struct dsa_db db)
 {
-       struct ksz_device *dev = ds->priv;
        u32 alu_table[4];
        u32 data;
        int ret = 0;
@@ -601,10 +599,9 @@ static void ksz9477_convert_alu(struct alu_struct *alu, u32 *alu_table)
        alu->mac[5] = alu_table[3] & 0xFF;
 }
 
-static int ksz9477_port_fdb_dump(struct dsa_switch *ds, int port,
-                                dsa_fdb_dump_cb_t *cb, void *data)
+static int ksz9477_fdb_dump(struct ksz_device *dev, int port,
+                           dsa_fdb_dump_cb_t *cb, void *data)
 {
-       struct ksz_device *dev = ds->priv;
        int ret = 0;
        u32 ksz_data;
        u32 alu_table[4];
@@ -1310,9 +1307,9 @@ static const struct dsa_switch_ops ksz9477_switch_ops = {
        .port_vlan_filtering    = ksz_port_vlan_filtering,
        .port_vlan_add          = ksz_port_vlan_add,
        .port_vlan_del          = ksz_port_vlan_del,
-       .port_fdb_dump          = ksz9477_port_fdb_dump,
-       .port_fdb_add           = ksz9477_port_fdb_add,
-       .port_fdb_del           = ksz9477_port_fdb_del,
+       .port_fdb_dump          = ksz_port_fdb_dump,
+       .port_fdb_add           = ksz_port_fdb_add,
+       .port_fdb_del           = ksz_port_fdb_del,
        .port_mdb_add           = ksz_port_mdb_add,
        .port_mdb_del           = ksz_port_mdb_del,
        .port_mirror_add        = ksz_port_mirror_add,
@@ -1397,6 +1394,9 @@ static const struct ksz_dev_ops ksz9477_dev_ops = {
        .mirror_add = ksz9477_port_mirror_add,
        .mirror_del = ksz9477_port_mirror_del,
        .get_caps = ksz9477_get_caps,
+       .fdb_dump = ksz9477_fdb_dump,
+       .fdb_add = ksz9477_fdb_add,
+       .fdb_del = ksz9477_fdb_del,
        .mdb_add = ksz9477_mdb_add,
        .mdb_del = ksz9477_mdb_del,
        .shutdown = ksz9477_reset_switch,
index ce3037e9d548fd989bbabcc23a6822a17166e612..5e98e39e4c403e3bb96f255d8277a257f83239d9 100644 (file)
@@ -778,34 +778,39 @@ void ksz_port_fast_age(struct dsa_switch *ds, int port)
 }
 EXPORT_SYMBOL_GPL(ksz_port_fast_age);
 
+int ksz_port_fdb_add(struct dsa_switch *ds, int port,
+                    const unsigned char *addr, u16 vid, struct dsa_db db)
+{
+       struct ksz_device *dev = ds->priv;
+
+       if (!dev->dev_ops->fdb_add)
+               return -EOPNOTSUPP;
+
+       return dev->dev_ops->fdb_add(dev, port, addr, vid, db);
+}
+EXPORT_SYMBOL_GPL(ksz_port_fdb_add);
+
+int ksz_port_fdb_del(struct dsa_switch *ds, int port,
+                    const unsigned char *addr, u16 vid, struct dsa_db db)
+{
+       struct ksz_device *dev = ds->priv;
+
+       if (!dev->dev_ops->fdb_del)
+               return -EOPNOTSUPP;
+
+       return dev->dev_ops->fdb_del(dev, port, addr, vid, db);
+}
+EXPORT_SYMBOL_GPL(ksz_port_fdb_del);
+
 int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
                      void *data)
 {
        struct ksz_device *dev = ds->priv;
-       int ret = 0;
-       u16 i = 0;
-       u16 entries = 0;
-       u8 timestamp = 0;
-       u8 fid;
-       u8 member;
-       struct alu_struct alu;
-
-       do {
-               alu.is_static = false;
-               ret = dev->dev_ops->r_dyn_mac_table(dev, i, alu.mac, &fid,
-                                                   &member, &timestamp,
-                                                   &entries);
-               if (!ret && (member & BIT(port))) {
-                       ret = cb(alu.mac, alu.fid, alu.is_static, data);
-                       if (ret)
-                               break;
-               }
-               i++;
-       } while (i < entries);
-       if (i >= entries)
-               ret = 0;
 
-       return ret;
+       if (!dev->dev_ops->fdb_dump)
+               return -EOPNOTSUPP;
+
+       return dev->dev_ops->fdb_dump(dev, port, cb, data);
 }
 EXPORT_SYMBOL_GPL(ksz_port_fdb_dump);
 
index 4bc10165460f8e9e13284dbac6384329a97dc1c8..e507e951ce2bdf24a3e424e8966345273ed565ec 100644 (file)
@@ -169,13 +169,6 @@ struct ksz_dev_ops {
        void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port);
        void (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
        void (*w_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 val);
-       int (*r_dyn_mac_table)(struct ksz_device *dev, u16 addr, u8 *mac_addr,
-                              u8 *fid, u8 *src_port, u8 *timestamp,
-                              u16 *entries);
-       int (*r_sta_mac_table)(struct ksz_device *dev, u16 addr,
-                              struct alu_struct *alu);
-       void (*w_sta_mac_table)(struct ksz_device *dev, u16 addr,
-                               struct alu_struct *alu);
        void (*r_mib_cnt)(struct ksz_device *dev, int port, u16 addr,
                          u64 *cnt);
        void (*r_mib_pkt)(struct ksz_device *dev, int port, u16 addr,
@@ -193,6 +186,12 @@ struct ksz_dev_ops {
                          bool ingress, struct netlink_ext_ack *extack);
        void (*mirror_del)(struct ksz_device *dev, int port,
                           struct dsa_mall_mirror_tc_entry *mirror);
+       int (*fdb_add)(struct ksz_device *dev, int port,
+                      const unsigned char *addr, u16 vid, struct dsa_db db);
+       int (*fdb_del)(struct ksz_device *dev, int port,
+                      const unsigned char *addr, u16 vid, struct dsa_db db);
+       int (*fdb_dump)(struct ksz_device *dev, int port,
+                       dsa_fdb_dump_cb_t *cb, void *data);
        int (*mdb_add)(struct ksz_device *dev, int port,
                       const struct switchdev_obj_port_mdb *mdb,
                       struct dsa_db db);
@@ -239,6 +238,10 @@ void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
                           struct dsa_bridge bridge);
 void ksz_port_stp_state_set(struct dsa_switch *ds, int port, u8 state);
 void ksz_port_fast_age(struct dsa_switch *ds, int port);
+int ksz_port_fdb_add(struct dsa_switch *ds, int port,
+                    const unsigned char *addr, u16 vid, struct dsa_db db);
+int ksz_port_fdb_del(struct dsa_switch *ds, int port,
+                    const unsigned char *addr, u16 vid, struct dsa_db db);
 int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
                      void *data);
 int ksz_port_mdb_add(struct dsa_switch *ds, int port,