]> Git Repo - linux.git/commitdiff
net: marvell: prestera: implement br_port_locked flag offloading
authorOleksandr Mazur <[email protected]>
Mon, 22 Aug 2022 18:03:15 +0000 (21:03 +0300)
committerDavid S. Miller <[email protected]>
Wed, 24 Aug 2022 11:55:47 +0000 (12:55 +0100)
Both <port> br_port_locked and <lag> interfaces's flag
offloading is supported. No new ABI is being added,
rather existing (port_param_set) API call gets extended.

Signed-off-by: Oleksandr Mazur <[email protected]>
V2:
  add missing receipents (linux-kernel, netdev)
Signed-off-by: David S. Miller <[email protected]>
drivers/net/ethernet/marvell/prestera/prestera.h
drivers/net/ethernet/marvell/prestera/prestera_hw.c
drivers/net/ethernet/marvell/prestera/prestera_hw.h
drivers/net/ethernet/marvell/prestera/prestera_main.c
drivers/net/ethernet/marvell/prestera/prestera_switchdev.c

index 2f84d0fb40941e9e125e6b8fc7149f6899bc79d2..e5a4381a88b33eaacf12c064bf15de1af15e1202 100644 (file)
@@ -367,6 +367,8 @@ int prestera_port_learning_set(struct prestera_port *port, bool learn_enable);
 int prestera_port_uc_flood_set(struct prestera_port *port, bool flood);
 int prestera_port_mc_flood_set(struct prestera_port *port, bool flood);
 
+int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked);
+
 int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
 
 bool prestera_netdev_check(const struct net_device *dev);
index e0e9ae34ceea2cbcd1f3e71f2b69f16452345fe7..1a68a888d58762d73c41dc7eeeb57662220bd12b 100644 (file)
@@ -101,6 +101,7 @@ enum {
        PRESTERA_CMD_PORT_ATTR_LEARNING = 7,
        PRESTERA_CMD_PORT_ATTR_FLOOD = 8,
        PRESTERA_CMD_PORT_ATTR_CAPABILITY = 9,
+       PRESTERA_CMD_PORT_ATTR_LOCKED = 10,
        PRESTERA_CMD_PORT_ATTR_PHY_MODE = 12,
        PRESTERA_CMD_PORT_ATTR_TYPE = 13,
        PRESTERA_CMD_PORT_ATTR_STATS = 17,
@@ -285,6 +286,7 @@ union prestera_msg_port_param {
        u8 duplex;
        u8 fec;
        u8 fc;
+       u8 br_locked;
        union {
                struct {
                        u8 admin;
@@ -1640,6 +1642,22 @@ int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood)
                            &req.cmd, sizeof(req));
 }
 
+int prestera_hw_port_br_locked_set(const struct prestera_port *port,
+                                  bool br_locked)
+{
+       struct prestera_msg_port_attr_req req = {
+               .attr = __cpu_to_le32(PRESTERA_CMD_PORT_ATTR_LOCKED),
+               .port = __cpu_to_le32(port->hw_id),
+               .dev = __cpu_to_le32(port->dev_id),
+               .param = {
+                       .br_locked = br_locked,
+               }
+       };
+
+       return prestera_cmd(port->sw, PRESTERA_CMD_TYPE_PORT_ATTR_SET,
+                           &req.cmd, sizeof(req));
+}
+
 int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid)
 {
        struct prestera_msg_vlan_req req = {
index 56e043146dd256423625ba3b757a8172f3af2002..4aca43e72a05992b14227c7168e278a485bef16a 100644 (file)
@@ -183,6 +183,8 @@ int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed);
 int prestera_hw_port_learning_set(struct prestera_port *port, bool enable);
 int prestera_hw_port_uc_flood_set(const struct prestera_port *port, bool flood);
 int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood);
+int prestera_hw_port_br_locked_set(const struct prestera_port *port,
+                                  bool br_locked);
 int prestera_hw_port_accept_frm_type(struct prestera_port *port,
                                     enum prestera_accept_frm_type type);
 /* Vlan API */
index 3489b80ae0d6836dfc6a71260bade0c6851911fb..3956d6d5df3c7a4505f8effea9fb8b06752c8368 100644 (file)
@@ -51,6 +51,11 @@ int prestera_port_mc_flood_set(struct prestera_port *port, bool flood)
        return prestera_hw_port_mc_flood_set(port, flood);
 }
 
+int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked)
+{
+       return prestera_hw_port_br_locked_set(port, br_locked);
+}
+
 int prestera_port_pvid_set(struct prestera_port *port, u16 vid)
 {
        enum prestera_accept_frm_type frm_type;
index 71cde97d85c837ca0644d1ae091c428903a0d868..e548cd32582ebf4b5ad3a91fe9ca87b929eac728 100644 (file)
@@ -143,6 +143,7 @@ prestera_br_port_flags_reset(struct prestera_bridge_port *br_port,
        prestera_port_uc_flood_set(port, false);
        prestera_port_mc_flood_set(port, false);
        prestera_port_learning_set(port, false);
+       prestera_port_br_locked_set(port, false);
 }
 
 static int prestera_br_port_flags_set(struct prestera_bridge_port *br_port,
@@ -162,6 +163,11 @@ static int prestera_br_port_flags_set(struct prestera_bridge_port *br_port,
        if (err)
                goto err_out;
 
+       err = prestera_port_br_locked_set(port,
+                                         br_port->flags & BR_PORT_LOCKED);
+       if (err)
+               goto err_out;
+
        return 0;
 
 err_out:
@@ -1163,7 +1169,7 @@ static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
                break;
        case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
                if (attr->u.brport_flags.mask &
-                   ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD))
+                   ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_PORT_LOCKED))
                        err = -EINVAL;
                break;
        case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
This page took 0.060156 seconds and 4 git commands to generate.