Skip to content

Commit e1189d9

Browse files
vkochan-plvdavem330
authored andcommitted
net: marvell: prestera: Add Switchdev driver implementation
The following features are supported: - VLAN-aware bridge offloading - VLAN-unaware bridge offloading - FDB offloading (learning, ageing) - Switchport configuration Currently there are some limitations like: - Only 1 VLAN-aware bridge instance supported - FDB ageing timeout parameter is set globally per device Co-developed-by: Serhiy Boiko <[email protected]> Signed-off-by: Serhiy Boiko <[email protected]> Co-developed-by: Serhiy Pshyk <[email protected]> Signed-off-by: Serhiy Pshyk <[email protected]> Co-developed-by: Taras Chornyi <[email protected]> Signed-off-by: Taras Chornyi <[email protected]> Signed-off-by: Vadym Kochan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a97d3c6 commit e1189d9

File tree

7 files changed

+1807
-4
lines changed

7 files changed

+1807
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# SPDX-License-Identifier: GPL-2.0
22
obj-$(CONFIG_PRESTERA) += prestera.o
33
prestera-objs := prestera_main.o prestera_hw.o prestera_dsa.o \
4-
prestera_rxtx.o prestera_devlink.o prestera_ethtool.o
4+
prestera_rxtx.o prestera_devlink.o prestera_ethtool.o \
5+
prestera_switchdev.o
56

67
obj-$(CONFIG_PRESTERA_PCI) += prestera_pci.o

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

+31
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
#define PRESTERA_DRV_NAME "prestera"
1414

15+
#define PRESTERA_DEFAULT_VID 1
16+
1517
struct prestera_fw_rev {
1618
u16 maj;
1719
u16 min;
@@ -66,11 +68,13 @@ struct prestera_port {
6668
u32 hw_id;
6769
u32 dev_id;
6870
u16 fp_id;
71+
u16 pvid;
6972
bool autoneg;
7073
u64 adver_link_modes;
7174
u8 adver_fec;
7275
struct prestera_port_caps caps;
7376
struct list_head list;
77+
struct list_head vlans_list;
7478
struct {
7579
struct prestera_port_stats stats;
7680
struct delayed_work caching_dw;
@@ -100,6 +104,7 @@ enum prestera_event_type {
100104
PRESTERA_EVENT_TYPE_UNSPEC,
101105

102106
PRESTERA_EVENT_TYPE_PORT,
107+
PRESTERA_EVENT_TYPE_FDB,
103108
PRESTERA_EVENT_TYPE_RXTX,
104109

105110
PRESTERA_EVENT_TYPE_MAX
@@ -122,19 +127,37 @@ struct prestera_port_event {
122127
} data;
123128
};
124129

130+
enum prestera_fdb_event_id {
131+
PRESTERA_FDB_EVENT_UNSPEC,
132+
PRESTERA_FDB_EVENT_LEARNED,
133+
PRESTERA_FDB_EVENT_AGED,
134+
};
135+
136+
struct prestera_fdb_event {
137+
u32 port_id;
138+
u32 vid;
139+
union {
140+
u8 mac[ETH_ALEN];
141+
} data;
142+
};
143+
125144
struct prestera_event {
126145
u16 id;
127146
union {
128147
struct prestera_port_event port_evt;
148+
struct prestera_fdb_event fdb_evt;
129149
};
130150
};
131151

152+
struct prestera_switchdev;
132153
struct prestera_rxtx;
133154

134155
struct prestera_switch {
135156
struct prestera_device *dev;
157+
struct prestera_switchdev *swdev;
136158
struct prestera_rxtx *rxtx;
137159
struct list_head event_handlers;
160+
struct notifier_block netdev_nb;
138161
char base_mac[ETH_ALEN];
139162
struct list_head port_list;
140163
rwlock_t port_list_lock;
@@ -172,4 +195,12 @@ struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
172195
int prestera_port_autoneg_set(struct prestera_port *port, bool enable,
173196
u64 adver_link_modes, u8 adver_fec);
174197

198+
struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
199+
200+
struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
201+
202+
int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
203+
204+
bool prestera_netdev_check(const struct net_device *dev);
205+
175206
#endif /* _PRESTERA_H_ */

0 commit comments

Comments
 (0)