net: dsa: hellcreek: Move common code to helper
authorKurt Kanzenbach <kurt@kmk-computers.de>
Sat, 13 Mar 2021 09:39:38 +0000 (10:39 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 13 Mar 2021 22:30:48 +0000 (14:30 -0800)
There are two functions which need to populate fdb entries. Move that to a
helper function.

Signed-off-by: Kurt Kanzenbach <kurt@kmk-computers.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/hirschmann/hellcreek.c

index edac394..38ff0f1 100644 (file)
@@ -670,6 +670,40 @@ static int __hellcreek_fdb_del(struct hellcreek *hellcreek,
        return hellcreek_wait_fdb_ready(hellcreek);
 }
 
+static void hellcreek_populate_fdb_entry(struct hellcreek *hellcreek,
+                                        struct hellcreek_fdb_entry *entry,
+                                        size_t idx)
+{
+       unsigned char addr[ETH_ALEN];
+       u16 meta, mac;
+
+       /* Read values */
+       meta    = hellcreek_read(hellcreek, HR_FDBMDRD);
+       mac     = hellcreek_read(hellcreek, HR_FDBRDL);
+       addr[5] = mac & 0xff;
+       addr[4] = (mac & 0xff00) >> 8;
+       mac     = hellcreek_read(hellcreek, HR_FDBRDM);
+       addr[3] = mac & 0xff;
+       addr[2] = (mac & 0xff00) >> 8;
+       mac     = hellcreek_read(hellcreek, HR_FDBRDH);
+       addr[1] = mac & 0xff;
+       addr[0] = (mac & 0xff00) >> 8;
+
+       /* Populate @entry */
+       memcpy(entry->mac, addr, sizeof(addr));
+       entry->idx          = idx;
+       entry->portmask     = (meta & HR_FDBMDRD_PORTMASK_MASK) >>
+               HR_FDBMDRD_PORTMASK_SHIFT;
+       entry->age          = (meta & HR_FDBMDRD_AGE_MASK) >>
+               HR_FDBMDRD_AGE_SHIFT;
+       entry->is_obt       = !!(meta & HR_FDBMDRD_OBT);
+       entry->pass_blocked = !!(meta & HR_FDBMDRD_PASS_BLOCKED);
+       entry->is_static    = !!(meta & HR_FDBMDRD_STATIC);
+       entry->reprio_tc    = (meta & HR_FDBMDRD_REPRIO_TC_MASK) >>
+               HR_FDBMDRD_REPRIO_TC_SHIFT;
+       entry->reprio_en    = !!(meta & HR_FDBMDRD_REPRIO_EN);
+}
+
 /* Retrieve the index of a FDB entry by mac address. Currently we search through
  * the complete table in hardware. If that's too slow, we might have to cache
  * the complete FDB table in software.
@@ -691,39 +725,19 @@ static int hellcreek_fdb_get(struct hellcreek *hellcreek,
         * enter new entries anywhere.
         */
        for (i = 0; i < hellcreek->fdb_entries; ++i) {
-               unsigned char addr[ETH_ALEN];
-               u16 meta, mac;
-
-               meta    = hellcreek_read(hellcreek, HR_FDBMDRD);
-               mac     = hellcreek_read(hellcreek, HR_FDBRDL);
-               addr[5] = mac & 0xff;
-               addr[4] = (mac & 0xff00) >> 8;
-               mac     = hellcreek_read(hellcreek, HR_FDBRDM);
-               addr[3] = mac & 0xff;
-               addr[2] = (mac & 0xff00) >> 8;
-               mac     = hellcreek_read(hellcreek, HR_FDBRDH);
-               addr[1] = mac & 0xff;
-               addr[0] = (mac & 0xff00) >> 8;
+               struct hellcreek_fdb_entry tmp = { 0 };
+
+               /* Read entry */
+               hellcreek_populate_fdb_entry(hellcreek, &tmp, i);
 
                /* Force next entry */
                hellcreek_write(hellcreek, 0x00, HR_FDBRDH);
 
-               if (memcmp(addr, dest, ETH_ALEN))
+               if (memcmp(tmp.mac, dest, ETH_ALEN))
                        continue;
 
                /* Match found */
-               entry->idx          = i;
-               entry->portmask     = (meta & HR_FDBMDRD_PORTMASK_MASK) >>
-                       HR_FDBMDRD_PORTMASK_SHIFT;
-               entry->age          = (meta & HR_FDBMDRD_AGE_MASK) >>
-                       HR_FDBMDRD_AGE_SHIFT;
-               entry->is_obt       = !!(meta & HR_FDBMDRD_OBT);
-               entry->pass_blocked = !!(meta & HR_FDBMDRD_PASS_BLOCKED);
-               entry->is_static    = !!(meta & HR_FDBMDRD_STATIC);
-               entry->reprio_tc    = (meta & HR_FDBMDRD_REPRIO_TC_MASK) >>
-                       HR_FDBMDRD_REPRIO_TC_SHIFT;
-               entry->reprio_en    = !!(meta & HR_FDBMDRD_REPRIO_EN);
-               memcpy(entry->mac, addr, sizeof(addr));
+               memcpy(entry, &tmp, sizeof(*entry));
 
                return 0;
        }
@@ -838,18 +852,9 @@ static int hellcreek_fdb_dump(struct dsa_switch *ds, int port,
        for (i = 0; i < hellcreek->fdb_entries; ++i) {
                unsigned char null_addr[ETH_ALEN] = { 0 };
                struct hellcreek_fdb_entry entry = { 0 };
-               u16 meta, mac;
-
-               meta    = hellcreek_read(hellcreek, HR_FDBMDRD);
-               mac     = hellcreek_read(hellcreek, HR_FDBRDL);
-               entry.mac[5] = mac & 0xff;
-               entry.mac[4] = (mac & 0xff00) >> 8;
-               mac     = hellcreek_read(hellcreek, HR_FDBRDM);
-               entry.mac[3] = mac & 0xff;
-               entry.mac[2] = (mac & 0xff00) >> 8;
-               mac     = hellcreek_read(hellcreek, HR_FDBRDH);
-               entry.mac[1] = mac & 0xff;
-               entry.mac[0] = (mac & 0xff00) >> 8;
+
+               /* Read entry */
+               hellcreek_populate_fdb_entry(hellcreek, &entry, i);
 
                /* Force next entry */
                hellcreek_write(hellcreek, 0x00, HR_FDBRDH);
@@ -858,10 +863,6 @@ static int hellcreek_fdb_dump(struct dsa_switch *ds, int port,
                if (!memcmp(entry.mac, null_addr, ETH_ALEN))
                        continue;
 
-               entry.portmask  = (meta & HR_FDBMDRD_PORTMASK_MASK) >>
-                       HR_FDBMDRD_PORTMASK_SHIFT;
-               entry.is_static = !!(meta & HR_FDBMDRD_STATIC);
-
                /* Check port mask */
                if (!(entry.portmask & BIT(port)))
                        continue;