net: dsa: microchip: ksz8_r_sta_mac_table(): Avoid using error code for empty entries
[ Upstream commit 559901b46810e82ba5321a5e789f994b65d3bc3d ] 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> Stable-dep-of: 4bdf79d686b4 ("net: dsa: microchip: correct KSZ8795 static MAC table access") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
8a60427c8a
commit
54830adfd9
@ -407,7 +407,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;
|
||||
@ -420,28 +420,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,
|
||||
@ -930,20 +934,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 */
|
||||
@ -973,15 +982,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 */
|
||||
|
Loading…
Reference in New Issue
Block a user