if (!ns_capable(dev_net(dev)->user_ns, CAP_NET_ADMIN))
                        return -EPERM;
 
-               br_stp_set_enabled(br, args[1]);
-               ret = 0;
+               ret = br_stp_set_enabled(br, args[1], NULL);
                break;
 
        case BRCTL_SET_BRIDGE_PRIORITY:
 
        if (data[IFLA_BR_STP_STATE]) {
                u32 stp_enabled = nla_get_u32(data[IFLA_BR_STP_STATE]);
 
-               br_stp_set_enabled(br, stp_enabled);
+               err = br_stp_set_enabled(br, stp_enabled, extack);
+               if (err)
+                       return err;
        }
 
        if (data[IFLA_BR_PRIORITY]) {
 
 /* br_stp_if.c */
 void br_stp_enable_bridge(struct net_bridge *br);
 void br_stp_disable_bridge(struct net_bridge *br);
-void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
+int br_stp_set_enabled(struct net_bridge *br, unsigned long val,
+                      struct netlink_ext_ack *extack);
 void br_stp_enable_port(struct net_bridge_port *p);
 void br_stp_disable_port(struct net_bridge_port *p);
 bool br_stp_recalculate_bridge_id(struct net_bridge *br);
 
        };
        int err;
 
+       /* Don't change the state of the ports if they are driven by a different
+        * protocol.
+        */
+       if (p->flags & BR_MRP_AWARE)
+               return;
+
        p->state = state;
        err = switchdev_port_attr_set(p->dev, &attr);
        if (err && err != -EOPNOTSUPP)
 
        br->stp_enabled = BR_NO_STP;
 }
 
-void br_stp_set_enabled(struct net_bridge *br, unsigned long val)
+int br_stp_set_enabled(struct net_bridge *br, unsigned long val,
+                      struct netlink_ext_ack *extack)
 {
        ASSERT_RTNL();
 
+       if (br_mrp_enabled(br)) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "STP can't be enabled if MRP is already enabled\n");
+               return -EINVAL;
+       }
+
        if (val) {
                if (br->stp_enabled == BR_NO_STP)
                        br_stp_start(br);
                if (br->stp_enabled != BR_NO_STP)
                        br_stp_stop(br);
        }
+
+       return 0;
 }
 
 /* called under bridge lock */
 
 
 static int set_stp_state(struct net_bridge *br, unsigned long val)
 {
-       br_stp_set_enabled(br, val);
-
-       return 0;
+       return br_stp_set_enabled(br, val, NULL);
 }
 
 static ssize_t stp_state_store(struct device *d,