Commit f11df045 authored by David S. Miller's avatar David S. Miller
Browse files

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: default avatarDavid S. Miller <davem@davemloft.net>
parents b9aaec8f 788abc6d
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -43,18 +43,26 @@ int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member,
	int ret;
	int i;

	dev_dbg(smi->dev,
		"setting VLAN%d 4k members: 0x%02x, untagged: 0x%02x\n",
		vid, member, untag);

	/* Update the 4K table */
	ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
	if (ret)
		return ret;

	vlan4k.member = member;
	vlan4k.untag = untag;
	vlan4k.member |= member;
	vlan4k.untag |= untag;
	vlan4k.fid = fid;
	ret = smi->ops->set_vlan_4k(smi, &vlan4k);
	if (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 */
	for (i = 0; i < smi->num_vlan_mc; i++) {
		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) {
			/* update the MC entry */
			vlanmc.member = member;
			vlanmc.untag = untag;
			vlanmc.member |= member;
			vlanmc.untag |= untag;
			vlanmc.fid = fid;

			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;
		}
	}
@@ -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))
		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;

		dev_info(smi->dev, "add VLAN %04x\n", vid);
@@ -407,14 +420,14 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port,
			if (ret < 0)
				return;
		}
	}

	ret = rtl8366_set_vlan(smi, port, member, untag, 0);
		ret = rtl8366_set_vlan(smi, vid, member, untag, 0);
		if (ret)
			dev_err(smi->dev,
				"failed to set up VLAN %04x",
				vid);
	}
}
EXPORT_SYMBOL_GPL(rtl8366_vlan_add);

int rtl8366_vlan_del(struct dsa_switch *ds, int port,