svn commit: r313988 - head/sys/dev/etherswitch/mtkswitch
Stanislav Galabov
sgalabov at FreeBSD.org
Mon Feb 20 08:10:43 UTC 2017
Author: sgalabov
Date: Mon Feb 20 08:10:41 2017
New Revision: 313988
URL: https://svnweb.freebsd.org/changeset/base/313988
Log:
etherswitch: Fix RT305x vlan group operation
Fix an issue which prevents proper operation (addition/removal of members)
of RT305x vlan groups.
Tested by: yamori813 at yahoo.co.jp
Submitted by: yamori813 at yahoo.co.jp (initial version)
Reviewed by: adrian
Differential Revision: https://reviews.freebsd.org/D9607
Modified:
head/sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c
Modified: head/sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c
==============================================================================
--- head/sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c Mon Feb 20 08:04:06 2017 (r313987)
+++ head/sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c Mon Feb 20 08:10:41 2017 (r313988)
@@ -405,11 +405,38 @@ mtkswitch_vlan_setvgroup(struct mtkswitc
MTKSWITCH_LOCK(sc);
/* First, see if we can accomodate the request at all */
val = MTKSWITCH_READ(sc, MTKSWITCH_POC2);
- if ((val & POC2_UNTAG_VLAN) == 0 ||
- sc->sc_switchtype == MTK_SWITCH_RT3050) {
+ if (sc->sc_switchtype == MTK_SWITCH_RT3050 ||
+ (val & POC2_UNTAG_VLAN) == 0) {
+ /*
+ * There are 2 things we can't support in per-port untagging
+ * mode:
+ * 1. Adding a port as an untagged member if the port is not
+ * set up to do untagging.
+ * 2. Adding a port as a tagged member if the port is set up
+ * to do untagging.
+ */
val &= VUB_MASK;
+
+ /* get all untagged members from the member list */
tmp = v->es_untagged_ports & v->es_member_ports;
- if (val != tmp) {
+ /* fail if untagged members are not a subset of all members */
+ if (tmp != v->es_untagged_ports) {
+ /* Cannot accomodate request */
+ MTKSWITCH_UNLOCK(sc);
+ return (ENOTSUP);
+ }
+
+ /* fail if any untagged member is set up to do tagging */
+ if ((tmp & val) != tmp) {
+ /* Cannot accomodate request */
+ MTKSWITCH_UNLOCK(sc);
+ return (ENOTSUP);
+ }
+
+ /* now, get the list of all tagged members */
+ tmp = v->es_member_ports & ~tmp;
+ /* fail if any tagged member is set up to do untagging */
+ if ((tmp & val) != 0) {
/* Cannot accomodate request */
MTKSWITCH_UNLOCK(sc);
return (ENOTSUP);
More information about the svn-src-all
mailing list