Commit 559901b4 authored by Oleksij Rempel's avatar Oleksij Rempel Committed by Paolo Abeni

net: dsa: microchip: ksz8_r_sta_mac_table(): Avoid using error code for empty entries

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: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent b5751cdd
...@@ -458,7 +458,7 @@ int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, u8 *mac_addr, ...@@ -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, 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; u32 data_hi, data_lo;
const u8 *shifts; const u8 *shifts;
...@@ -471,28 +471,32 @@ static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr, ...@@ -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); ksz8_r_table(dev, TABLE_STATIC_MAC, addr, &data);
data_hi = data >> 32; data_hi = data >> 32;
data_lo = (u32)data; data_lo = (u32)data;
if (data_hi & (masks[STATIC_MAC_TABLE_VALID] |
masks[STATIC_MAC_TABLE_OVERRIDE])) { if (!(data_hi & (masks[STATIC_MAC_TABLE_VALID] |
alu->mac[5] = (u8)data_lo; masks[STATIC_MAC_TABLE_OVERRIDE]))) {
alu->mac[4] = (u8)(data_lo >> 8); *valid = false;
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];
return 0; 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, 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, ...@@ -981,20 +985,25 @@ static int ksz8_add_sta_mac(struct ksz_device *dev, int port,
const unsigned char *addr, u16 vid) const unsigned char *addr, u16 vid)
{ {
struct alu_struct alu; struct alu_struct alu;
int index; int index, ret;
int empty = 0; int empty = 0;
alu.port_forward = 0; alu.port_forward = 0;
for (index = 0; index < dev->info->num_statics; index++) { for (index = 0; index < dev->info->num_statics; index++) {
if (!ksz8_r_sta_mac_table(dev, index, &alu)) { bool valid;
/* Found one already in static MAC table. */
if (!memcmp(alu.mac, addr, ETH_ALEN) && ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid);
alu.fid == vid) if (ret)
break; return ret;
/* Remember the first empty entry. */ if (!valid) {
} else if (!empty) { /* Remember the first empty entry. */
empty = index + 1; if (!empty)
empty = index + 1;
continue;
} }
if (!memcmp(alu.mac, addr, ETH_ALEN) && alu.fid == vid)
break;
} }
/* no available entry */ /* no available entry */
...@@ -1024,15 +1033,19 @@ static int ksz8_del_sta_mac(struct ksz_device *dev, int port, ...@@ -1024,15 +1033,19 @@ static int ksz8_del_sta_mac(struct ksz_device *dev, int port,
const unsigned char *addr, u16 vid) const unsigned char *addr, u16 vid)
{ {
struct alu_struct alu; struct alu_struct alu;
int index; int index, ret;
for (index = 0; index < dev->info->num_statics; index++) { for (index = 0; index < dev->info->num_statics; index++) {
if (!ksz8_r_sta_mac_table(dev, index, &alu)) { bool valid;
/* Found one already in static MAC table. */
if (!memcmp(alu.mac, addr, ETH_ALEN) && ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid);
alu.fid == vid) if (ret)
break; return ret;
} if (!valid)
continue;
if (!memcmp(alu.mac, addr, ETH_ALEN) && alu.fid == vid)
break;
} }
/* no available entry */ /* no available entry */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment