xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/marvell/prestera/prestera_hw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef _PRESTERA_HW_H_
5*4882a593Smuzhiyun #define _PRESTERA_HW_H_
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/types.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun enum prestera_accept_frm_type {
10*4882a593Smuzhiyun 	PRESTERA_ACCEPT_FRAME_TYPE_TAGGED,
11*4882a593Smuzhiyun 	PRESTERA_ACCEPT_FRAME_TYPE_UNTAGGED,
12*4882a593Smuzhiyun 	PRESTERA_ACCEPT_FRAME_TYPE_ALL,
13*4882a593Smuzhiyun };
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun enum prestera_fdb_flush_mode {
16*4882a593Smuzhiyun 	PRESTERA_FDB_FLUSH_MODE_DYNAMIC = BIT(0),
17*4882a593Smuzhiyun 	PRESTERA_FDB_FLUSH_MODE_STATIC = BIT(1),
18*4882a593Smuzhiyun 	PRESTERA_FDB_FLUSH_MODE_ALL = PRESTERA_FDB_FLUSH_MODE_DYNAMIC
19*4882a593Smuzhiyun 					| PRESTERA_FDB_FLUSH_MODE_STATIC,
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun enum {
23*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_10baseT_Half,
24*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_10baseT_Full,
25*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_100baseT_Half,
26*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_100baseT_Full,
27*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_1000baseT_Half,
28*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_1000baseT_Full,
29*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_1000baseX_Full,
30*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_1000baseKX_Full,
31*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_2500baseX_Full,
32*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_10GbaseKR_Full,
33*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_10GbaseSR_Full,
34*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_10GbaseLR_Full,
35*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_20GbaseKR2_Full,
36*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_25GbaseCR_Full,
37*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_25GbaseKR_Full,
38*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_25GbaseSR_Full,
39*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_40GbaseKR4_Full,
40*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_40GbaseCR4_Full,
41*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_40GbaseSR4_Full,
42*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_50GbaseCR2_Full,
43*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_50GbaseKR2_Full,
44*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_50GbaseSR2_Full,
45*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_100GbaseKR4_Full,
46*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_100GbaseSR4_Full,
47*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_100GbaseCR4_Full,
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	PRESTERA_LINK_MODE_MAX
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun enum {
53*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_NONE,
54*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_TP,
55*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_AUI,
56*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_MII,
57*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_FIBRE,
58*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_BNC,
59*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_DA,
60*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_OTHER,
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	PRESTERA_PORT_TYPE_MAX
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun enum {
66*4882a593Smuzhiyun 	PRESTERA_PORT_TCVR_COPPER,
67*4882a593Smuzhiyun 	PRESTERA_PORT_TCVR_SFP,
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	PRESTERA_PORT_TCVR_MAX
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun enum {
73*4882a593Smuzhiyun 	PRESTERA_PORT_FEC_OFF,
74*4882a593Smuzhiyun 	PRESTERA_PORT_FEC_BASER,
75*4882a593Smuzhiyun 	PRESTERA_PORT_FEC_RS,
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	PRESTERA_PORT_FEC_MAX
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun enum {
81*4882a593Smuzhiyun 	PRESTERA_PORT_DUPLEX_HALF,
82*4882a593Smuzhiyun 	PRESTERA_PORT_DUPLEX_FULL,
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun enum {
86*4882a593Smuzhiyun 	PRESTERA_STP_DISABLED,
87*4882a593Smuzhiyun 	PRESTERA_STP_BLOCK_LISTEN,
88*4882a593Smuzhiyun 	PRESTERA_STP_LEARN,
89*4882a593Smuzhiyun 	PRESTERA_STP_FORWARD,
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct prestera_switch;
93*4882a593Smuzhiyun struct prestera_port;
94*4882a593Smuzhiyun struct prestera_port_stats;
95*4882a593Smuzhiyun struct prestera_port_caps;
96*4882a593Smuzhiyun enum prestera_event_type;
97*4882a593Smuzhiyun struct prestera_event;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun typedef void (*prestera_event_cb_t)
100*4882a593Smuzhiyun 	(struct prestera_switch *sw, struct prestera_event *evt, void *arg);
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct prestera_rxtx_params;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* Switch API */
105*4882a593Smuzhiyun int prestera_hw_switch_init(struct prestera_switch *sw);
106*4882a593Smuzhiyun void prestera_hw_switch_fini(struct prestera_switch *sw);
107*4882a593Smuzhiyun int prestera_hw_switch_ageing_set(struct prestera_switch *sw, u32 ageing_ms);
108*4882a593Smuzhiyun int prestera_hw_switch_mac_set(struct prestera_switch *sw, const char *mac);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /* Port API */
111*4882a593Smuzhiyun int prestera_hw_port_info_get(const struct prestera_port *port,
112*4882a593Smuzhiyun 			      u32 *dev_id, u32 *hw_id, u16 *fp_id);
113*4882a593Smuzhiyun int prestera_hw_port_state_set(const struct prestera_port *port,
114*4882a593Smuzhiyun 			       bool admin_state);
115*4882a593Smuzhiyun int prestera_hw_port_mtu_set(const struct prestera_port *port, u32 mtu);
116*4882a593Smuzhiyun int prestera_hw_port_mtu_get(const struct prestera_port *port, u32 *mtu);
117*4882a593Smuzhiyun int prestera_hw_port_mac_set(const struct prestera_port *port, const char *mac);
118*4882a593Smuzhiyun int prestera_hw_port_mac_get(const struct prestera_port *port, char *mac);
119*4882a593Smuzhiyun int prestera_hw_port_cap_get(const struct prestera_port *port,
120*4882a593Smuzhiyun 			     struct prestera_port_caps *caps);
121*4882a593Smuzhiyun int prestera_hw_port_remote_cap_get(const struct prestera_port *port,
122*4882a593Smuzhiyun 				    u64 *link_mode_bitmap);
123*4882a593Smuzhiyun int prestera_hw_port_remote_fc_get(const struct prestera_port *port,
124*4882a593Smuzhiyun 				   bool *pause, bool *asym_pause);
125*4882a593Smuzhiyun int prestera_hw_port_type_get(const struct prestera_port *port, u8 *type);
126*4882a593Smuzhiyun int prestera_hw_port_fec_get(const struct prestera_port *port, u8 *fec);
127*4882a593Smuzhiyun int prestera_hw_port_fec_set(const struct prestera_port *port, u8 fec);
128*4882a593Smuzhiyun int prestera_hw_port_autoneg_set(const struct prestera_port *port,
129*4882a593Smuzhiyun 				 bool autoneg, u64 link_modes, u8 fec);
130*4882a593Smuzhiyun int prestera_hw_port_autoneg_restart(struct prestera_port *port);
131*4882a593Smuzhiyun int prestera_hw_port_duplex_get(const struct prestera_port *port, u8 *duplex);
132*4882a593Smuzhiyun int prestera_hw_port_stats_get(const struct prestera_port *port,
133*4882a593Smuzhiyun 			       struct prestera_port_stats *stats);
134*4882a593Smuzhiyun int prestera_hw_port_link_mode_set(const struct prestera_port *port, u32 mode);
135*4882a593Smuzhiyun int prestera_hw_port_link_mode_get(const struct prestera_port *port, u32 *mode);
136*4882a593Smuzhiyun int prestera_hw_port_mdix_get(const struct prestera_port *port, u8 *status,
137*4882a593Smuzhiyun 			      u8 *admin_mode);
138*4882a593Smuzhiyun int prestera_hw_port_mdix_set(const struct prestera_port *port, u8 mode);
139*4882a593Smuzhiyun int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed);
140*4882a593Smuzhiyun int prestera_hw_port_learning_set(struct prestera_port *port, bool enable);
141*4882a593Smuzhiyun int prestera_hw_port_flood_set(struct prestera_port *port, bool flood);
142*4882a593Smuzhiyun int prestera_hw_port_accept_frm_type(struct prestera_port *port,
143*4882a593Smuzhiyun 				     enum prestera_accept_frm_type type);
144*4882a593Smuzhiyun /* Vlan API */
145*4882a593Smuzhiyun int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid);
146*4882a593Smuzhiyun int prestera_hw_vlan_delete(struct prestera_switch *sw, u16 vid);
147*4882a593Smuzhiyun int prestera_hw_vlan_port_set(struct prestera_port *port, u16 vid,
148*4882a593Smuzhiyun 			      bool is_member, bool untagged);
149*4882a593Smuzhiyun int prestera_hw_vlan_port_vid_set(struct prestera_port *port, u16 vid);
150*4882a593Smuzhiyun int prestera_hw_vlan_port_stp_set(struct prestera_port *port, u16 vid, u8 state);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* FDB API */
153*4882a593Smuzhiyun int prestera_hw_fdb_add(struct prestera_port *port, const unsigned char *mac,
154*4882a593Smuzhiyun 			u16 vid, bool dynamic);
155*4882a593Smuzhiyun int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac,
156*4882a593Smuzhiyun 			u16 vid);
157*4882a593Smuzhiyun int prestera_hw_fdb_flush_port(struct prestera_port *port, u32 mode);
158*4882a593Smuzhiyun int prestera_hw_fdb_flush_vlan(struct prestera_switch *sw, u16 vid, u32 mode);
159*4882a593Smuzhiyun int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
160*4882a593Smuzhiyun 				    u32 mode);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* Bridge API */
163*4882a593Smuzhiyun int prestera_hw_bridge_create(struct prestera_switch *sw, u16 *bridge_id);
164*4882a593Smuzhiyun int prestera_hw_bridge_delete(struct prestera_switch *sw, u16 bridge_id);
165*4882a593Smuzhiyun int prestera_hw_bridge_port_add(struct prestera_port *port, u16 bridge_id);
166*4882a593Smuzhiyun int prestera_hw_bridge_port_delete(struct prestera_port *port, u16 bridge_id);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /* Event handlers */
169*4882a593Smuzhiyun int prestera_hw_event_handler_register(struct prestera_switch *sw,
170*4882a593Smuzhiyun 				       enum prestera_event_type type,
171*4882a593Smuzhiyun 				       prestera_event_cb_t fn,
172*4882a593Smuzhiyun 				       void *arg);
173*4882a593Smuzhiyun void prestera_hw_event_handler_unregister(struct prestera_switch *sw,
174*4882a593Smuzhiyun 					  enum prestera_event_type type,
175*4882a593Smuzhiyun 					  prestera_event_cb_t fn);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* RX/TX */
178*4882a593Smuzhiyun int prestera_hw_rxtx_init(struct prestera_switch *sw,
179*4882a593Smuzhiyun 			  struct prestera_rxtx_params *params);
180*4882a593Smuzhiyun int prestera_hw_rxtx_port_init(struct prestera_port *port);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #endif /* _PRESTERA_HW_H_ */
183