net: dsa: microchip: ksz8_r_sta_mac_table(): Avoid using error code for empty entries
authorOleksij Rempel <o.rempel@pengutronix.de>
Tue, 4 Apr 2023 10:18:39 +0000 (12:18 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Apr 2023 09:34:45 +0000 (11:34 +0200)
Prepare for the next patch by ensuring that ksz8_r_sta_mac_table() does
not use error codes for empty entries. This change will enable better
handling of read/write errors in the upcoming patch.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/microchip/ksz8795.c

index a663726142263b76d5240caf791ce2fa41f6f9bd..b2fd31be4455e8f2db34a477a9d0880b3fec3f39 100644 (file)
@@ -458,7 +458,7 @@ int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, u8 *mac_addr,
 }
 
 static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
-                               struct alu_struct *alu)
+                               struct alu_struct *alu, bool *valid)
 {
        u32 data_hi, data_lo;
        const u8 *shifts;
@@ -471,28 +471,32 @@ static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
        ksz8_r_table(dev, TABLE_STATIC_MAC, addr, &data);
        data_hi = data >> 32;
        data_lo = (u32)data;
-       if (data_hi & (masks[STATIC_MAC_TABLE_VALID] |
-                       masks[STATIC_MAC_TABLE_OVERRIDE])) {
-               alu->mac[5] = (u8)data_lo;
-               alu->mac[4] = (u8)(data_lo >> 8);
-               alu->mac[3] = (u8)(data_lo >> 16);
-               alu->mac[2] = (u8)(data_lo >> 24);
-               alu->mac[1] = (u8)data_hi;
-               alu->mac[0] = (u8)(data_hi >> 8);
-               alu->port_forward =
-                       (data_hi & masks[STATIC_MAC_TABLE_FWD_PORTS]) >>
-                               shifts[STATIC_MAC_FWD_PORTS];
-               alu->is_override =
-                       (data_hi & masks[STATIC_MAC_TABLE_OVERRIDE]) ? 1 : 0;
-               data_hi >>= 1;
-               alu->is_static = true;
-               alu->is_use_fid =
-                       (data_hi & masks[STATIC_MAC_TABLE_USE_FID]) ? 1 : 0;
-               alu->fid = (data_hi & masks[STATIC_MAC_TABLE_FID]) >>
-                               shifts[STATIC_MAC_FID];
+
+       if (!(data_hi & (masks[STATIC_MAC_TABLE_VALID] |
+                        masks[STATIC_MAC_TABLE_OVERRIDE]))) {
+               *valid = false;
                return 0;
        }
-       return -ENXIO;
+
+       alu->mac[5] = (u8)data_lo;
+       alu->mac[4] = (u8)(data_lo >> 8);
+       alu->mac[3] = (u8)(data_lo >> 16);
+       alu->mac[2] = (u8)(data_lo >> 24);
+       alu->mac[1] = (u8)data_hi;
+       alu->mac[0] = (u8)(data_hi >> 8);
+       alu->port_forward =
+               (data_hi & masks[STATIC_MAC_TABLE_FWD_PORTS]) >>
+                       shifts[STATIC_MAC_FWD_PORTS];
+       alu->is_override = (data_hi & masks[STATIC_MAC_TABLE_OVERRIDE]) ? 1 : 0;
+       data_hi >>= 1;
+       alu->is_static = true;
+       alu->is_use_fid = (data_hi & masks[STATIC_MAC_TABLE_USE_FID]) ? 1 : 0;
+       alu->fid = (data_hi & masks[STATIC_MAC_TABLE_FID]) >>
+               shifts[STATIC_MAC_FID];
+
+       *valid = true;
+
+       return 0;
 }
 
 void ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr,
@@ -981,20 +985,25 @@ static int ksz8_add_sta_mac(struct ksz_device *dev, int port,
                            const unsigned char *addr, u16 vid)
 {
        struct alu_struct alu;
-       int index;
+       int index, ret;
        int empty = 0;
 
        alu.port_forward = 0;
        for (index = 0; index < dev->info->num_statics; index++) {
-               if (!ksz8_r_sta_mac_table(dev, index, &alu)) {
-                       /* Found one already in static MAC table. */
-                       if (!memcmp(alu.mac, addr, ETH_ALEN) &&
-                           alu.fid == vid)
-                               break;
-               /* Remember the first empty entry. */
-               } else if (!empty) {
-                       empty = index + 1;
+               bool valid;
+
+               ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid);
+               if (ret)
+                       return ret;
+               if (!valid) {
+                       /* Remember the first empty entry. */
+                       if (!empty)
+                               empty = index + 1;
+                       continue;
                }
+
+               if (!memcmp(alu.mac, addr, ETH_ALEN) && alu.fid == vid)
+                       break;
        }
 
        /* no available entry */
@@ -1024,15 +1033,19 @@ static int ksz8_del_sta_mac(struct ksz_device *dev, int port,
                            const unsigned char *addr, u16 vid)
 {
        struct alu_struct alu;
-       int index;
+       int index, ret;
 
        for (index = 0; index < dev->info->num_statics; index++) {
-               if (!ksz8_r_sta_mac_table(dev, index, &alu)) {
-                       /* Found one already in static MAC table. */
-                       if (!memcmp(alu.mac, addr, ETH_ALEN) &&
-                           alu.fid == vid)
-                               break;
-               }
+               bool valid;
+
+               ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid);
+               if (ret)
+                       return ret;
+               if (!valid)
+                       continue;
+
+               if (!memcmp(alu.mac, addr, ETH_ALEN) && alu.fid == vid)
+                       break;
        }
 
        /* no available entry */