forked from mirrors/linux
		
	switchdev: mrp: Extend switchdev API to offload MRP
Extend switchdev API to add support for MRP. The HW is notified in following cases: SWITCHDEV_OBJ_ID_MRP: This is used when a MRP instance is added/removed from the MRP ring. SWITCHDEV_OBJ_ID_RING_ROLE_MRP: This is used when the role of the node changes. The current supported roles are MRM and MRC. SWITCHDEV_OBJ_ID_RING_TEST_MRP: This is used when to start/stop sending MRP_Test frames on the mrp ring ports. This is called only on nodes that have the role MRM. In case this fails then the SW will generate the frames. SWITCHDEV_OBJ_ID_RING_STATE_STATE: This is used when the ring changes it states to open or closed. This is required to notify HW because the MRP_Test frame contains the field MRP_InState which contains this information. SWITCHDEV_ATTR_ID_MRP_PORT_STATE: This is used when the port's state is changed. It can be in blocking/forwarding mode. SWITCHDEV_ATTR_ID_MRP_PORT_ROLE: This is used when port's role changes. The roles of the port can be primary/secondary. This is required to notify HW because the MRP_Test frame contains the field MRP_PortRole that contains this information. Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									2f1a11ae11
								
							
						
					
					
						commit
						c284b54590
					
				
					 1 changed files with 62 additions and 0 deletions
				
			
		| 
						 | 
					@ -40,6 +40,10 @@ enum switchdev_attr_id {
 | 
				
			||||||
	SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
 | 
						SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
 | 
				
			||||||
	SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
 | 
						SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
 | 
				
			||||||
	SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
 | 
						SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
 | 
				
			||||||
 | 
					#if IS_ENABLED(CONFIG_BRIDGE_MRP)
 | 
				
			||||||
 | 
						SWITCHDEV_ATTR_ID_MRP_PORT_STATE,
 | 
				
			||||||
 | 
						SWITCHDEV_ATTR_ID_MRP_PORT_ROLE,
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct switchdev_attr {
 | 
					struct switchdev_attr {
 | 
				
			||||||
| 
						 | 
					@ -55,6 +59,11 @@ struct switchdev_attr {
 | 
				
			||||||
		clock_t ageing_time;			/* BRIDGE_AGEING_TIME */
 | 
							clock_t ageing_time;			/* BRIDGE_AGEING_TIME */
 | 
				
			||||||
		bool vlan_filtering;			/* BRIDGE_VLAN_FILTERING */
 | 
							bool vlan_filtering;			/* BRIDGE_VLAN_FILTERING */
 | 
				
			||||||
		bool mc_disabled;			/* MC_DISABLED */
 | 
							bool mc_disabled;			/* MC_DISABLED */
 | 
				
			||||||
 | 
					#if IS_ENABLED(CONFIG_BRIDGE_MRP)
 | 
				
			||||||
 | 
							u8 mrp_port_state;			/* MRP_PORT_STATE */
 | 
				
			||||||
 | 
							u8 mrp_port_role;			/* MRP_PORT_ROLE */
 | 
				
			||||||
 | 
							u8 mrp_ring_state;			/* MRP_RING_STATE */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	} u;
 | 
						} u;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +72,12 @@ enum switchdev_obj_id {
 | 
				
			||||||
	SWITCHDEV_OBJ_ID_PORT_VLAN,
 | 
						SWITCHDEV_OBJ_ID_PORT_VLAN,
 | 
				
			||||||
	SWITCHDEV_OBJ_ID_PORT_MDB,
 | 
						SWITCHDEV_OBJ_ID_PORT_MDB,
 | 
				
			||||||
	SWITCHDEV_OBJ_ID_HOST_MDB,
 | 
						SWITCHDEV_OBJ_ID_HOST_MDB,
 | 
				
			||||||
 | 
					#if IS_ENABLED(CONFIG_BRIDGE_MRP)
 | 
				
			||||||
 | 
						SWITCHDEV_OBJ_ID_MRP,
 | 
				
			||||||
 | 
						SWITCHDEV_OBJ_ID_RING_TEST_MRP,
 | 
				
			||||||
 | 
						SWITCHDEV_OBJ_ID_RING_ROLE_MRP,
 | 
				
			||||||
 | 
						SWITCHDEV_OBJ_ID_RING_STATE_MRP,
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct switchdev_obj {
 | 
					struct switchdev_obj {
 | 
				
			||||||
| 
						 | 
					@ -94,6 +109,53 @@ struct switchdev_obj_port_mdb {
 | 
				
			||||||
#define SWITCHDEV_OBJ_PORT_MDB(OBJ) \
 | 
					#define SWITCHDEV_OBJ_PORT_MDB(OBJ) \
 | 
				
			||||||
	container_of((OBJ), struct switchdev_obj_port_mdb, obj)
 | 
						container_of((OBJ), struct switchdev_obj_port_mdb, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if IS_ENABLED(CONFIG_BRIDGE_MRP)
 | 
				
			||||||
 | 
					/* SWITCHDEV_OBJ_ID_MRP */
 | 
				
			||||||
 | 
					struct switchdev_obj_mrp {
 | 
				
			||||||
 | 
						struct switchdev_obj obj;
 | 
				
			||||||
 | 
						struct net_device *p_port;
 | 
				
			||||||
 | 
						struct net_device *s_port;
 | 
				
			||||||
 | 
						u32 ring_id;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SWITCHDEV_OBJ_MRP(OBJ) \
 | 
				
			||||||
 | 
						container_of((OBJ), struct switchdev_obj_mrp, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SWITCHDEV_OBJ_ID_RING_TEST_MRP */
 | 
				
			||||||
 | 
					struct switchdev_obj_ring_test_mrp {
 | 
				
			||||||
 | 
						struct switchdev_obj obj;
 | 
				
			||||||
 | 
						/* The value is in us and a value of 0 represents to stop */
 | 
				
			||||||
 | 
						u32 interval;
 | 
				
			||||||
 | 
						u8 max_miss;
 | 
				
			||||||
 | 
						u32 ring_id;
 | 
				
			||||||
 | 
						u32 period;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SWITCHDEV_OBJ_RING_TEST_MRP(OBJ) \
 | 
				
			||||||
 | 
						container_of((OBJ), struct switchdev_obj_ring_test_mrp, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SWICHDEV_OBJ_ID_RING_ROLE_MRP */
 | 
				
			||||||
 | 
					struct switchdev_obj_ring_role_mrp {
 | 
				
			||||||
 | 
						struct switchdev_obj obj;
 | 
				
			||||||
 | 
						u8 ring_role;
 | 
				
			||||||
 | 
						u32 ring_id;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SWITCHDEV_OBJ_RING_ROLE_MRP(OBJ) \
 | 
				
			||||||
 | 
						container_of((OBJ), struct switchdev_obj_ring_role_mrp, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct switchdev_obj_ring_state_mrp {
 | 
				
			||||||
 | 
						struct switchdev_obj obj;
 | 
				
			||||||
 | 
						u8 ring_state;
 | 
				
			||||||
 | 
						u32 ring_id;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SWITCHDEV_OBJ_RING_STATE_MRP(OBJ) \
 | 
				
			||||||
 | 
						container_of((OBJ), struct switchdev_obj_ring_state_mrp, obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
 | 
					typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum switchdev_notifier_type {
 | 
					enum switchdev_notifier_type {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue