etherswitch: Fix RT305x vlan group operation
Fix an issue which prevents proper operation (addition/removal of members) of RT305x vlan groups. Tested by: yamori813@yahoo.co.jp Submitted by: yamori813@yahoo.co.jp (initial version) Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D9607
This commit is contained in:
parent
c2863c0a7e
commit
31735ccf8a
@ -405,11 +405,38 @@ mtkswitch_vlan_setvgroup(struct mtkswitch_softc *sc, etherswitch_vlangroup_t *v)
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user