Skip to content

Commit 73ef239

Browse files
Cahbdavem330
authored andcommitted
net: marvell: prestera: implement br_port_locked flag offloading
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]>
1 parent 0d0f034 commit 73ef239

File tree

5 files changed

+34
-1
lines changed

5 files changed

+34
-1
lines changed

drivers/net/ethernet/marvell/prestera/prestera.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@ int prestera_port_learning_set(struct prestera_port *port, bool learn_enable);
367367
int prestera_port_uc_flood_set(struct prestera_port *port, bool flood);
368368
int prestera_port_mc_flood_set(struct prestera_port *port, bool flood);
369369

370+
int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked);
371+
370372
int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
371373

372374
bool prestera_netdev_check(const struct net_device *dev);

drivers/net/ethernet/marvell/prestera/prestera_hw.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ enum {
101101
PRESTERA_CMD_PORT_ATTR_LEARNING = 7,
102102
PRESTERA_CMD_PORT_ATTR_FLOOD = 8,
103103
PRESTERA_CMD_PORT_ATTR_CAPABILITY = 9,
104+
PRESTERA_CMD_PORT_ATTR_LOCKED = 10,
104105
PRESTERA_CMD_PORT_ATTR_PHY_MODE = 12,
105106
PRESTERA_CMD_PORT_ATTR_TYPE = 13,
106107
PRESTERA_CMD_PORT_ATTR_STATS = 17,
@@ -285,6 +286,7 @@ union prestera_msg_port_param {
285286
u8 duplex;
286287
u8 fec;
287288
u8 fc;
289+
u8 br_locked;
288290
union {
289291
struct {
290292
u8 admin;
@@ -1640,6 +1642,22 @@ int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood)
16401642
&req.cmd, sizeof(req));
16411643
}
16421644

1645+
int prestera_hw_port_br_locked_set(const struct prestera_port *port,
1646+
bool br_locked)
1647+
{
1648+
struct prestera_msg_port_attr_req req = {
1649+
.attr = __cpu_to_le32(PRESTERA_CMD_PORT_ATTR_LOCKED),
1650+
.port = __cpu_to_le32(port->hw_id),
1651+
.dev = __cpu_to_le32(port->dev_id),
1652+
.param = {
1653+
.br_locked = br_locked,
1654+
}
1655+
};
1656+
1657+
return prestera_cmd(port->sw, PRESTERA_CMD_TYPE_PORT_ATTR_SET,
1658+
&req.cmd, sizeof(req));
1659+
}
1660+
16431661
int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid)
16441662
{
16451663
struct prestera_msg_vlan_req req = {

drivers/net/ethernet/marvell/prestera/prestera_hw.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed);
183183
int prestera_hw_port_learning_set(struct prestera_port *port, bool enable);
184184
int prestera_hw_port_uc_flood_set(const struct prestera_port *port, bool flood);
185185
int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood);
186+
int prestera_hw_port_br_locked_set(const struct prestera_port *port,
187+
bool br_locked);
186188
int prestera_hw_port_accept_frm_type(struct prestera_port *port,
187189
enum prestera_accept_frm_type type);
188190
/* Vlan API */

drivers/net/ethernet/marvell/prestera/prestera_main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ int prestera_port_mc_flood_set(struct prestera_port *port, bool flood)
5151
return prestera_hw_port_mc_flood_set(port, flood);
5252
}
5353

54+
int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked)
55+
{
56+
return prestera_hw_port_br_locked_set(port, br_locked);
57+
}
58+
5459
int prestera_port_pvid_set(struct prestera_port *port, u16 vid)
5560
{
5661
enum prestera_accept_frm_type frm_type;

drivers/net/ethernet/marvell/prestera/prestera_switchdev.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ prestera_br_port_flags_reset(struct prestera_bridge_port *br_port,
143143
prestera_port_uc_flood_set(port, false);
144144
prestera_port_mc_flood_set(port, false);
145145
prestera_port_learning_set(port, false);
146+
prestera_port_br_locked_set(port, false);
146147
}
147148

148149
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,
162163
if (err)
163164
goto err_out;
164165

166+
err = prestera_port_br_locked_set(port,
167+
br_port->flags & BR_PORT_LOCKED);
168+
if (err)
169+
goto err_out;
170+
165171
return 0;
166172

167173
err_out:
@@ -1163,7 +1169,7 @@ static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
11631169
break;
11641170
case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
11651171
if (attr->u.brport_flags.mask &
1166-
~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD))
1172+
~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_PORT_LOCKED))
11671173
err = -EINVAL;
11681174
break;
11691175
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:

0 commit comments

Comments
 (0)