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