Skip to content

Commit

Permalink
net: dsa: mv88e6xxx: write VID outside of VTU Get Next code
Browse files Browse the repository at this point in the history
There is no need to write the VLAN ID before every Get Next operation,
since the VTU VID register is not cleared between calls.

Move the VID write call in a _mv88e6xxx_vtu_vid_write function outside
of _mv88e6xxx_vtu_getnext so future code could call VTU Get Next
multiple times and save a few register accesses.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vivien Didelot authored and David S. Miller committed Oct 22, 2015
1 parent ea70ba9 commit 36d04ba
Showing 1 changed file with 29 additions and 10 deletions.
39 changes: 29 additions & 10 deletions drivers/net/dsa/mv88e6xxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1259,7 +1259,13 @@ static int _mv88e6xxx_vtu_stu_data_write(struct dsa_switch *ds,
return 0;
}

static int _mv88e6xxx_vtu_getnext(struct dsa_switch *ds, u16 vid,
static int _mv88e6xxx_vtu_vid_write(struct dsa_switch *ds, u16 vid)
{
return _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_VTU_VID,
vid & GLOBAL_VTU_VID_MASK);
}

static int _mv88e6xxx_vtu_getnext(struct dsa_switch *ds,
struct mv88e6xxx_vtu_stu_entry *entry)
{
struct mv88e6xxx_vtu_stu_entry next = { 0 };
Expand All @@ -1269,11 +1275,6 @@ static int _mv88e6xxx_vtu_getnext(struct dsa_switch *ds, u16 vid,
if (ret < 0)
return ret;

ret = _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_VTU_VID,
vid & GLOBAL_VTU_VID_MASK);
if (ret < 0)
return ret;

ret = _mv88e6xxx_vtu_cmd(ds, GLOBAL_VTU_OP_VTU_GET_NEXT);
if (ret < 0)
return ret;
Expand Down Expand Up @@ -1485,7 +1486,12 @@ int mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port, u16 vid,
int err;

mutex_lock(&ps->smi_mutex);
err = _mv88e6xxx_vtu_getnext(ds, vid - 1, &vlan);

err = _mv88e6xxx_vtu_vid_write(ds, vid - 1);
if (err)
goto unlock;

err = _mv88e6xxx_vtu_getnext(ds, &vlan);
if (err)
goto unlock;

Expand Down Expand Up @@ -1514,7 +1520,11 @@ int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port, u16 vid)

mutex_lock(&ps->smi_mutex);

err = _mv88e6xxx_vtu_getnext(ds, vid - 1, &vlan);
err = _mv88e6xxx_vtu_vid_write(ds, vid - 1);
if (err)
goto unlock;

err = _mv88e6xxx_vtu_getnext(ds, &vlan);
if (err)
goto unlock;

Expand Down Expand Up @@ -1558,7 +1568,11 @@ static int _mv88e6xxx_port_vtu_getnext(struct dsa_switch *ds, int port, u16 vid,
if (vid == 4095)
return -ENOENT;

err = _mv88e6xxx_vtu_getnext(ds, vid, entry);
err = _mv88e6xxx_vtu_vid_write(ds, vid);
if (err)
return err;

err = _mv88e6xxx_vtu_getnext(ds, entry);
if (err)
return err;

Expand All @@ -1584,7 +1598,12 @@ int mv88e6xxx_vlan_getnext(struct dsa_switch *ds, u16 *vid,
return -ENOENT;

mutex_lock(&ps->smi_mutex);
err = _mv88e6xxx_vtu_getnext(ds, *vid, &next);
err = _mv88e6xxx_vtu_vid_write(ds, *vid);
if (err)
goto unlock;

err = _mv88e6xxx_vtu_getnext(ds, &next);
unlock:
mutex_unlock(&ps->smi_mutex);

if (err)
Expand Down

0 comments on commit 36d04ba

Please sign in to comment.