forked from Minki/linux
Merge branch 'RTL8366-VLAN-callback-fixes'
Linus Walleij says: ==================== RTL8366 VLAN callback fixes While we are pondering how to make the core set up the VLANs the right way, let's merge the uncontroversial fixes. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f11df0454f
@ -43,18 +43,26 @@ int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member,
|
|||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
dev_dbg(smi->dev,
|
||||||
|
"setting VLAN%d 4k members: 0x%02x, untagged: 0x%02x\n",
|
||||||
|
vid, member, untag);
|
||||||
|
|
||||||
/* Update the 4K table */
|
/* Update the 4K table */
|
||||||
ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
|
ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
vlan4k.member = member;
|
vlan4k.member |= member;
|
||||||
vlan4k.untag = untag;
|
vlan4k.untag |= untag;
|
||||||
vlan4k.fid = fid;
|
vlan4k.fid = fid;
|
||||||
ret = smi->ops->set_vlan_4k(smi, &vlan4k);
|
ret = smi->ops->set_vlan_4k(smi, &vlan4k);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
dev_dbg(smi->dev,
|
||||||
|
"resulting VLAN%d 4k members: 0x%02x, untagged: 0x%02x\n",
|
||||||
|
vid, vlan4k.member, vlan4k.untag);
|
||||||
|
|
||||||
/* Try to find an existing MC entry for this VID */
|
/* Try to find an existing MC entry for this VID */
|
||||||
for (i = 0; i < smi->num_vlan_mc; i++) {
|
for (i = 0; i < smi->num_vlan_mc; i++) {
|
||||||
struct rtl8366_vlan_mc vlanmc;
|
struct rtl8366_vlan_mc vlanmc;
|
||||||
@ -65,11 +73,16 @@ int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member,
|
|||||||
|
|
||||||
if (vid == vlanmc.vid) {
|
if (vid == vlanmc.vid) {
|
||||||
/* update the MC entry */
|
/* update the MC entry */
|
||||||
vlanmc.member = member;
|
vlanmc.member |= member;
|
||||||
vlanmc.untag = untag;
|
vlanmc.untag |= untag;
|
||||||
vlanmc.fid = fid;
|
vlanmc.fid = fid;
|
||||||
|
|
||||||
ret = smi->ops->set_vlan_mc(smi, i, &vlanmc);
|
ret = smi->ops->set_vlan_mc(smi, i, &vlanmc);
|
||||||
|
|
||||||
|
dev_dbg(smi->dev,
|
||||||
|
"resulting VLAN%d MC members: 0x%02x, untagged: 0x%02x\n",
|
||||||
|
vid, vlanmc.member, vlanmc.untag);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -384,7 +397,7 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port,
|
|||||||
if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port))
|
if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port))
|
||||||
dev_err(smi->dev, "port is DSA or CPU port\n");
|
dev_err(smi->dev, "port is DSA or CPU port\n");
|
||||||
|
|
||||||
for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
|
for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) {
|
||||||
int pvid_val = 0;
|
int pvid_val = 0;
|
||||||
|
|
||||||
dev_info(smi->dev, "add VLAN %04x\n", vid);
|
dev_info(smi->dev, "add VLAN %04x\n", vid);
|
||||||
@ -407,13 +420,13 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ret = rtl8366_set_vlan(smi, port, member, untag, 0);
|
ret = rtl8366_set_vlan(smi, vid, member, untag, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(smi->dev,
|
dev_err(smi->dev,
|
||||||
"failed to set up VLAN %04x",
|
"failed to set up VLAN %04x",
|
||||||
vid);
|
vid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rtl8366_vlan_add);
|
EXPORT_SYMBOL_GPL(rtl8366_vlan_add);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user