return 0;
 }
 
-static int rocker_port_switchdev_port_stp_update(struct net_device *dev,
-                                                u8 state)
-{
-       struct rocker_port *rocker_port = netdev_priv(dev);
-
-       return rocker_port_stp_update(rocker_port, SWITCHDEV_TRANS_NONE, state);
-}
-
 static void rocker_port_trans_abort(struct rocker_port *rocker_port)
 {
        struct list_head *mem, *tmp;
        }
 
        switch (attr->id) {
+       case SWITCHDEV_ATTR_PORT_STP_STATE:
+               err = rocker_port_stp_update(rocker_port, attr->trans,
+                                            attr->stp_state);
+               break;
        default:
                err = -EOPNOTSUPP;
                break;
 
 static const struct switchdev_ops rocker_port_switchdev_ops = {
        .switchdev_port_attr_get        = rocker_port_attr_get,
-       .switchdev_port_stp_update      = rocker_port_switchdev_port_stp_update,
+       .switchdev_port_attr_set        = rocker_port_attr_set,
        .switchdev_fib_ipv4_add         = rocker_port_switchdev_fib_ipv4_add,
        .switchdev_fib_ipv4_del         = rocker_port_switchdev_fib_ipv4_del,
 };
 
 enum switchdev_attr_id {
        SWITCHDEV_ATTR_UNDEFINED,
        SWITCHDEV_ATTR_PORT_PARENT_ID,
+       SWITCHDEV_ATTR_PORT_STP_STATE,
 };
 
 struct switchdev_attr {
        u32 flags;
        union {
                struct netdev_phys_item_id ppid;        /* PORT_PARENT_ID */
+               u8 stp_state;                           /* PORT_STP_STATE */
        };
 };
 
  *
  * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr).
  *
- * @switchdev_port_stp_update: Called to notify switch device port of bridge
- *   port STP state change.
- *
  * @switchdev_fib_ipv4_add: Called to add/modify IPv4 route to switch device.
  *
  * @switchdev_fib_ipv4_del: Called to delete IPv4 route from switch device.
                                           struct switchdev_attr *attr);
        int     (*switchdev_port_attr_set)(struct net_device *dev,
                                           struct switchdev_attr *attr);
-       int     (*switchdev_port_stp_update)(struct net_device *dev, u8 state);
        int     (*switchdev_fib_ipv4_add)(struct net_device *dev, __be32 dst,
                                          int dst_len, struct fib_info *fi,
                                          u8 tos, u8 type, u32 nlflags,
                            struct switchdev_attr *attr);
 int switchdev_port_attr_set(struct net_device *dev,
                            struct switchdev_attr *attr);
-int switchdev_port_stp_update(struct net_device *dev, u8 state);
 int register_switchdev_notifier(struct notifier_block *nb);
 int unregister_switchdev_notifier(struct notifier_block *nb);
 int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
        return -EOPNOTSUPP;
 }
 
-static inline int switchdev_port_stp_update(struct net_device *dev,
-                                           u8 state)
-{
-       return -EOPNOTSUPP;
-}
-
 static inline int register_switchdev_notifier(struct notifier_block *nb)
 {
        return 0;
 
 
 void br_set_state(struct net_bridge_port *p, unsigned int state)
 {
+       struct switchdev_attr attr = {
+               .id = SWITCHDEV_ATTR_PORT_STP_STATE,
+               .stp_state = state,
+       };
        int err;
 
        p->state = state;
-       err = switchdev_port_stp_update(p->dev, state);
+       err = switchdev_port_attr_set(p->dev, &attr);
        if (err && err != -EOPNOTSUPP)
                br_warn(p->br, "error setting offload STP state on port %u(%s)\n",
                                (unsigned int) p->port_no, p->dev->name);
 
        return ret;
 }
 
+static int dsa_slave_port_attr_set(struct net_device *dev,
+                                  struct switchdev_attr *attr)
+{
+       int ret = 0;
+
+       switch (attr->id) {
+       case SWITCHDEV_ATTR_PORT_STP_STATE:
+               if (attr->trans == SWITCHDEV_TRANS_COMMIT)
+                       ret = dsa_slave_stp_update(dev, attr->stp_state);
+               break;
+       default:
+               ret = -EOPNOTSUPP;
+               break;
+       }
+
+       return ret;
+}
+
 static int dsa_slave_bridge_port_join(struct net_device *dev,
                                      struct net_device *br)
 {
 
 static const struct switchdev_ops dsa_slave_switchdev_ops = {
        .switchdev_port_attr_get        = dsa_slave_port_attr_get,
-       .switchdev_port_stp_update      = dsa_slave_stp_update,
+       .switchdev_port_attr_set        = dsa_slave_port_attr_set,
 };
 
 static void dsa_slave_adjust_link(struct net_device *dev)
 
 }
 EXPORT_SYMBOL_GPL(switchdev_port_attr_set);
 
-/**
- *     switchdev_port_stp_update - Notify switch device port of STP
- *                                     state change
- *     @dev: port device
- *     @state: port STP state
- *
- *     Notify switch device port of bridge port STP state change.
- */
-int switchdev_port_stp_update(struct net_device *dev, u8 state)
-{
-       const struct switchdev_ops *ops = dev->switchdev_ops;
-       struct net_device *lower_dev;
-       struct list_head *iter;
-       int err = -EOPNOTSUPP;
-
-       if (ops && ops->switchdev_port_stp_update)
-               return ops->switchdev_port_stp_update(dev, state);
-
-       netdev_for_each_lower_dev(dev, lower_dev, iter) {
-               err = switchdev_port_stp_update(lower_dev, state);
-               if (err && err != -EOPNOTSUPP)
-                       return err;
-       }
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(switchdev_port_stp_update);
-
 static DEFINE_MUTEX(switchdev_mutex);
 static RAW_NOTIFIER_HEAD(switchdev_notif_chain);