Merge tag 'devprop-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-block.git] / net / bridge / br_switchdev.c
index 035ff59d9cbd8dde7dc93426da8ea91be08906bd..921310d3cbae4f702e8b7dee1861a2d8918c1c03 100644 (file)
@@ -14,7 +14,7 @@ static int br_switchdev_mark_get(struct net_bridge *br, struct net_device *dev)
 
        /* dev is yet to be added to the port list. */
        list_for_each_entry(p, &br->port_list, list) {
-               if (switchdev_port_same_parent_id(dev, p->dev))
+               if (netdev_port_same_parent_id(dev, p->dev))
                        return p->offload_fwd_mark;
        }
 
@@ -23,15 +23,12 @@ static int br_switchdev_mark_get(struct net_bridge *br, struct net_device *dev)
 
 int nbp_switchdev_mark_set(struct net_bridge_port *p)
 {
-       struct switchdev_attr attr = {
-               .orig_dev = p->dev,
-               .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
-       };
+       struct netdev_phys_item_id ppid = { };
        int err;
 
        ASSERT_RTNL();
 
-       err = switchdev_port_attr_get(p->dev, &attr);
+       err = dev_get_port_parent_id(p->dev, &ppid, true);
        if (err) {
                if (err == -EOPNOTSUPP)
                        return 0;
@@ -67,21 +64,25 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
 {
        struct switchdev_attr attr = {
                .orig_dev = p->dev,
-               .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT,
+               .id = SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,
+               .u.brport_flags = mask,
+       };
+       struct switchdev_notifier_port_attr_info info = {
+               .attr = &attr,
        };
        int err;
 
        if (mask & ~BR_PORT_FLAGS_HW_OFFLOAD)
                return 0;
 
-       err = switchdev_port_attr_get(p->dev, &attr);
+       /* We run from atomic context here */
+       err = call_switchdev_notifiers(SWITCHDEV_PORT_ATTR_SET, p->dev,
+                                      &info.info, NULL);
+       err = notifier_to_errno(err);
        if (err == -EOPNOTSUPP)
                return 0;
-       if (err)
-               return err;
 
-       /* Check if specific bridge flag attribute offload is supported */
-       if (!(attr.u.brport_flags_support & mask)) {
+       if (err) {
                br_warn(p->br, "bridge flag offload is not supported %u(%s)\n",
                        (unsigned int)p->port_no, p->dev->name);
                return -EOPNOTSUPP;
@@ -90,6 +91,7 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
        attr.id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS;
        attr.flags = SWITCHDEV_F_DEFER;
        attr.u.brport_flags = flags;
+
        err = switchdev_port_attr_set(p->dev, &attr);
        if (err) {
                br_warn(p->br, "error setting offload flag on port %u(%s)\n",
@@ -113,7 +115,7 @@ br_switchdev_fdb_call_notifiers(bool adding, const unsigned char *mac,
        info.added_by_user = added_by_user;
        info.offloaded = offloaded;
        notifier_type = adding ? SWITCHDEV_FDB_ADD_TO_DEVICE : SWITCHDEV_FDB_DEL_TO_DEVICE;
-       call_switchdev_notifiers(notifier_type, dev, &info.info);
+       call_switchdev_notifiers(notifier_type, dev, &info.info, NULL);
 }
 
 void