xref: /OK3568_Linux_fs/kernel/drivers/net/dsa/sja1105/sja1105.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2018, Sensor-Technik Wiedemann GmbH
3*4882a593Smuzhiyun  * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun #ifndef _SJA1105_H
6*4882a593Smuzhiyun #define _SJA1105_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/ptp_clock_kernel.h>
9*4882a593Smuzhiyun #include <linux/timecounter.h>
10*4882a593Smuzhiyun #include <linux/dsa/sja1105.h>
11*4882a593Smuzhiyun #include <linux/dsa/8021q.h>
12*4882a593Smuzhiyun #include <net/dsa.h>
13*4882a593Smuzhiyun #include <linux/mutex.h>
14*4882a593Smuzhiyun #include "sja1105_static_config.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define SJA1105_NUM_PORTS		5
17*4882a593Smuzhiyun #define SJA1105_NUM_TC			8
18*4882a593Smuzhiyun #define SJA1105ET_FDB_BIN_SIZE		4
19*4882a593Smuzhiyun /* The hardware value is in multiples of 10 ms.
20*4882a593Smuzhiyun  * The passed parameter is in multiples of 1 ms.
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun #define SJA1105_AGEING_TIME_MS(ms)	((ms) / 10)
23*4882a593Smuzhiyun #define SJA1105_NUM_L2_POLICERS		45
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun typedef enum {
26*4882a593Smuzhiyun 	SPI_READ = 0,
27*4882a593Smuzhiyun 	SPI_WRITE = 1,
28*4882a593Smuzhiyun } sja1105_spi_rw_mode_t;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include "sja1105_tas.h"
31*4882a593Smuzhiyun #include "sja1105_ptp.h"
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* Keeps the different addresses between E/T and P/Q/R/S */
34*4882a593Smuzhiyun struct sja1105_regs {
35*4882a593Smuzhiyun 	u64 device_id;
36*4882a593Smuzhiyun 	u64 prod_id;
37*4882a593Smuzhiyun 	u64 status;
38*4882a593Smuzhiyun 	u64 port_control;
39*4882a593Smuzhiyun 	u64 rgu;
40*4882a593Smuzhiyun 	u64 vl_status;
41*4882a593Smuzhiyun 	u64 config;
42*4882a593Smuzhiyun 	u64 sgmii;
43*4882a593Smuzhiyun 	u64 rmii_pll1;
44*4882a593Smuzhiyun 	u64 ptppinst;
45*4882a593Smuzhiyun 	u64 ptppindur;
46*4882a593Smuzhiyun 	u64 ptp_control;
47*4882a593Smuzhiyun 	u64 ptpclkval;
48*4882a593Smuzhiyun 	u64 ptpclkrate;
49*4882a593Smuzhiyun 	u64 ptpclkcorp;
50*4882a593Smuzhiyun 	u64 ptpsyncts;
51*4882a593Smuzhiyun 	u64 ptpschtm;
52*4882a593Smuzhiyun 	u64 ptpegr_ts[SJA1105_NUM_PORTS];
53*4882a593Smuzhiyun 	u64 pad_mii_tx[SJA1105_NUM_PORTS];
54*4882a593Smuzhiyun 	u64 pad_mii_rx[SJA1105_NUM_PORTS];
55*4882a593Smuzhiyun 	u64 pad_mii_id[SJA1105_NUM_PORTS];
56*4882a593Smuzhiyun 	u64 cgu_idiv[SJA1105_NUM_PORTS];
57*4882a593Smuzhiyun 	u64 mii_tx_clk[SJA1105_NUM_PORTS];
58*4882a593Smuzhiyun 	u64 mii_rx_clk[SJA1105_NUM_PORTS];
59*4882a593Smuzhiyun 	u64 mii_ext_tx_clk[SJA1105_NUM_PORTS];
60*4882a593Smuzhiyun 	u64 mii_ext_rx_clk[SJA1105_NUM_PORTS];
61*4882a593Smuzhiyun 	u64 rgmii_tx_clk[SJA1105_NUM_PORTS];
62*4882a593Smuzhiyun 	u64 rmii_ref_clk[SJA1105_NUM_PORTS];
63*4882a593Smuzhiyun 	u64 rmii_ext_tx_clk[SJA1105_NUM_PORTS];
64*4882a593Smuzhiyun 	u64 mac[SJA1105_NUM_PORTS];
65*4882a593Smuzhiyun 	u64 mac_hl1[SJA1105_NUM_PORTS];
66*4882a593Smuzhiyun 	u64 mac_hl2[SJA1105_NUM_PORTS];
67*4882a593Smuzhiyun 	u64 ether_stats[SJA1105_NUM_PORTS];
68*4882a593Smuzhiyun 	u64 qlevel[SJA1105_NUM_PORTS];
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun struct sja1105_info {
72*4882a593Smuzhiyun 	u64 device_id;
73*4882a593Smuzhiyun 	/* Needed for distinction between P and R, and between Q and S
74*4882a593Smuzhiyun 	 * (since the parts with/without SGMII share the same
75*4882a593Smuzhiyun 	 * switch core and device_id)
76*4882a593Smuzhiyun 	 */
77*4882a593Smuzhiyun 	u64 part_no;
78*4882a593Smuzhiyun 	/* E/T and P/Q/R/S have partial timestamps of different sizes.
79*4882a593Smuzhiyun 	 * They must be reconstructed on both families anyway to get the full
80*4882a593Smuzhiyun 	 * 64-bit values back.
81*4882a593Smuzhiyun 	 */
82*4882a593Smuzhiyun 	int ptp_ts_bits;
83*4882a593Smuzhiyun 	/* Also SPI commands are of different sizes to retrieve
84*4882a593Smuzhiyun 	 * the egress timestamps.
85*4882a593Smuzhiyun 	 */
86*4882a593Smuzhiyun 	int ptpegr_ts_bytes;
87*4882a593Smuzhiyun 	int num_cbs_shapers;
88*4882a593Smuzhiyun 	const struct sja1105_dynamic_table_ops *dyn_ops;
89*4882a593Smuzhiyun 	const struct sja1105_table_ops *static_ops;
90*4882a593Smuzhiyun 	const struct sja1105_regs *regs;
91*4882a593Smuzhiyun 	/* Both E/T and P/Q/R/S have quirks when it comes to popping the S-Tag
92*4882a593Smuzhiyun 	 * from double-tagged frames. E/T will pop it only when it's equal to
93*4882a593Smuzhiyun 	 * TPID from the General Parameters Table, while P/Q/R/S will only
94*4882a593Smuzhiyun 	 * pop it when it's equal to TPID2.
95*4882a593Smuzhiyun 	 */
96*4882a593Smuzhiyun 	u16 qinq_tpid;
97*4882a593Smuzhiyun 	int (*reset_cmd)(struct dsa_switch *ds);
98*4882a593Smuzhiyun 	int (*setup_rgmii_delay)(const void *ctx, int port);
99*4882a593Smuzhiyun 	/* Prototypes from include/net/dsa.h */
100*4882a593Smuzhiyun 	int (*fdb_add_cmd)(struct dsa_switch *ds, int port,
101*4882a593Smuzhiyun 			   const unsigned char *addr, u16 vid);
102*4882a593Smuzhiyun 	int (*fdb_del_cmd)(struct dsa_switch *ds, int port,
103*4882a593Smuzhiyun 			   const unsigned char *addr, u16 vid);
104*4882a593Smuzhiyun 	void (*ptp_cmd_packing)(u8 *buf, struct sja1105_ptp_cmd *cmd,
105*4882a593Smuzhiyun 				enum packing_op op);
106*4882a593Smuzhiyun 	const char *name;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun enum sja1105_key_type {
110*4882a593Smuzhiyun 	SJA1105_KEY_BCAST,
111*4882a593Smuzhiyun 	SJA1105_KEY_TC,
112*4882a593Smuzhiyun 	SJA1105_KEY_VLAN_UNAWARE_VL,
113*4882a593Smuzhiyun 	SJA1105_KEY_VLAN_AWARE_VL,
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun struct sja1105_key {
117*4882a593Smuzhiyun 	enum sja1105_key_type type;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	union {
120*4882a593Smuzhiyun 		/* SJA1105_KEY_TC */
121*4882a593Smuzhiyun 		struct {
122*4882a593Smuzhiyun 			int pcp;
123*4882a593Smuzhiyun 		} tc;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 		/* SJA1105_KEY_VLAN_UNAWARE_VL */
126*4882a593Smuzhiyun 		/* SJA1105_KEY_VLAN_AWARE_VL */
127*4882a593Smuzhiyun 		struct {
128*4882a593Smuzhiyun 			u64 dmac;
129*4882a593Smuzhiyun 			u16 vid;
130*4882a593Smuzhiyun 			u16 pcp;
131*4882a593Smuzhiyun 		} vl;
132*4882a593Smuzhiyun 	};
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun enum sja1105_rule_type {
136*4882a593Smuzhiyun 	SJA1105_RULE_BCAST_POLICER,
137*4882a593Smuzhiyun 	SJA1105_RULE_TC_POLICER,
138*4882a593Smuzhiyun 	SJA1105_RULE_VL,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun enum sja1105_vl_type {
142*4882a593Smuzhiyun 	SJA1105_VL_NONCRITICAL,
143*4882a593Smuzhiyun 	SJA1105_VL_RATE_CONSTRAINED,
144*4882a593Smuzhiyun 	SJA1105_VL_TIME_TRIGGERED,
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct sja1105_rule {
148*4882a593Smuzhiyun 	struct list_head list;
149*4882a593Smuzhiyun 	unsigned long cookie;
150*4882a593Smuzhiyun 	unsigned long port_mask;
151*4882a593Smuzhiyun 	struct sja1105_key key;
152*4882a593Smuzhiyun 	enum sja1105_rule_type type;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	/* Action */
155*4882a593Smuzhiyun 	union {
156*4882a593Smuzhiyun 		/* SJA1105_RULE_BCAST_POLICER */
157*4882a593Smuzhiyun 		struct {
158*4882a593Smuzhiyun 			int sharindx;
159*4882a593Smuzhiyun 		} bcast_pol;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 		/* SJA1105_RULE_TC_POLICER */
162*4882a593Smuzhiyun 		struct {
163*4882a593Smuzhiyun 			int sharindx;
164*4882a593Smuzhiyun 		} tc_pol;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 		/* SJA1105_RULE_VL */
167*4882a593Smuzhiyun 		struct {
168*4882a593Smuzhiyun 			enum sja1105_vl_type type;
169*4882a593Smuzhiyun 			unsigned long destports;
170*4882a593Smuzhiyun 			int sharindx;
171*4882a593Smuzhiyun 			int maxlen;
172*4882a593Smuzhiyun 			int ipv;
173*4882a593Smuzhiyun 			u64 base_time;
174*4882a593Smuzhiyun 			u64 cycle_time;
175*4882a593Smuzhiyun 			int num_entries;
176*4882a593Smuzhiyun 			struct action_gate_entry *entries;
177*4882a593Smuzhiyun 			struct flow_stats stats;
178*4882a593Smuzhiyun 		} vl;
179*4882a593Smuzhiyun 	};
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun struct sja1105_flow_block {
183*4882a593Smuzhiyun 	struct list_head rules;
184*4882a593Smuzhiyun 	bool l2_policer_used[SJA1105_NUM_L2_POLICERS];
185*4882a593Smuzhiyun 	int num_virtual_links;
186*4882a593Smuzhiyun };
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun struct sja1105_bridge_vlan {
189*4882a593Smuzhiyun 	struct list_head list;
190*4882a593Smuzhiyun 	int port;
191*4882a593Smuzhiyun 	u16 vid;
192*4882a593Smuzhiyun 	bool pvid;
193*4882a593Smuzhiyun 	bool untagged;
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun enum sja1105_vlan_state {
197*4882a593Smuzhiyun 	SJA1105_VLAN_UNAWARE,
198*4882a593Smuzhiyun 	SJA1105_VLAN_BEST_EFFORT,
199*4882a593Smuzhiyun 	SJA1105_VLAN_FILTERING_FULL,
200*4882a593Smuzhiyun };
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun struct sja1105_private {
203*4882a593Smuzhiyun 	struct sja1105_static_config static_config;
204*4882a593Smuzhiyun 	bool rgmii_rx_delay[SJA1105_NUM_PORTS];
205*4882a593Smuzhiyun 	bool rgmii_tx_delay[SJA1105_NUM_PORTS];
206*4882a593Smuzhiyun 	bool best_effort_vlan_filtering;
207*4882a593Smuzhiyun 	const struct sja1105_info *info;
208*4882a593Smuzhiyun 	struct gpio_desc *reset_gpio;
209*4882a593Smuzhiyun 	struct spi_device *spidev;
210*4882a593Smuzhiyun 	struct dsa_switch *ds;
211*4882a593Smuzhiyun 	struct list_head dsa_8021q_vlans;
212*4882a593Smuzhiyun 	struct list_head bridge_vlans;
213*4882a593Smuzhiyun 	struct sja1105_flow_block flow_block;
214*4882a593Smuzhiyun 	struct sja1105_port ports[SJA1105_NUM_PORTS];
215*4882a593Smuzhiyun 	/* Serializes transmission of management frames so that
216*4882a593Smuzhiyun 	 * the switch doesn't confuse them with one another.
217*4882a593Smuzhiyun 	 */
218*4882a593Smuzhiyun 	struct mutex mgmt_lock;
219*4882a593Smuzhiyun 	struct dsa_8021q_context *dsa_8021q_ctx;
220*4882a593Smuzhiyun 	enum sja1105_vlan_state vlan_state;
221*4882a593Smuzhiyun 	struct devlink_region **regions;
222*4882a593Smuzhiyun 	struct sja1105_cbs_entry *cbs;
223*4882a593Smuzhiyun 	struct sja1105_tagger_data tagger_data;
224*4882a593Smuzhiyun 	struct sja1105_ptp_data ptp_data;
225*4882a593Smuzhiyun 	struct sja1105_tas_data tas_data;
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #include "sja1105_dynamic_config.h"
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun struct sja1105_spi_message {
231*4882a593Smuzhiyun 	u64 access;
232*4882a593Smuzhiyun 	u64 read_count;
233*4882a593Smuzhiyun 	u64 address;
234*4882a593Smuzhiyun };
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /* From sja1105_main.c */
237*4882a593Smuzhiyun enum sja1105_reset_reason {
238*4882a593Smuzhiyun 	SJA1105_VLAN_FILTERING = 0,
239*4882a593Smuzhiyun 	SJA1105_RX_HWTSTAMPING,
240*4882a593Smuzhiyun 	SJA1105_AGEING_TIME,
241*4882a593Smuzhiyun 	SJA1105_SCHEDULING,
242*4882a593Smuzhiyun 	SJA1105_BEST_EFFORT_POLICING,
243*4882a593Smuzhiyun 	SJA1105_VIRTUAL_LINKS,
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun int sja1105_static_config_reload(struct sja1105_private *priv,
247*4882a593Smuzhiyun 				 enum sja1105_reset_reason reason);
248*4882a593Smuzhiyun int sja1105_vlan_filtering(struct dsa_switch *ds, int port, bool enabled,
249*4882a593Smuzhiyun 			   struct switchdev_trans *trans);
250*4882a593Smuzhiyun void sja1105_frame_memory_partitioning(struct sja1105_private *priv);
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun /* From sja1105_devlink.c */
253*4882a593Smuzhiyun int sja1105_devlink_setup(struct dsa_switch *ds);
254*4882a593Smuzhiyun void sja1105_devlink_teardown(struct dsa_switch *ds);
255*4882a593Smuzhiyun int sja1105_devlink_param_get(struct dsa_switch *ds, u32 id,
256*4882a593Smuzhiyun 			      struct devlink_param_gset_ctx *ctx);
257*4882a593Smuzhiyun int sja1105_devlink_param_set(struct dsa_switch *ds, u32 id,
258*4882a593Smuzhiyun 			      struct devlink_param_gset_ctx *ctx);
259*4882a593Smuzhiyun int sja1105_devlink_info_get(struct dsa_switch *ds,
260*4882a593Smuzhiyun 			     struct devlink_info_req *req,
261*4882a593Smuzhiyun 			     struct netlink_ext_ack *extack);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun /* From sja1105_spi.c */
264*4882a593Smuzhiyun int sja1105_xfer_buf(const struct sja1105_private *priv,
265*4882a593Smuzhiyun 		     sja1105_spi_rw_mode_t rw, u64 reg_addr,
266*4882a593Smuzhiyun 		     u8 *buf, size_t len);
267*4882a593Smuzhiyun int sja1105_xfer_u32(const struct sja1105_private *priv,
268*4882a593Smuzhiyun 		     sja1105_spi_rw_mode_t rw, u64 reg_addr, u32 *value,
269*4882a593Smuzhiyun 		     struct ptp_system_timestamp *ptp_sts);
270*4882a593Smuzhiyun int sja1105_xfer_u64(const struct sja1105_private *priv,
271*4882a593Smuzhiyun 		     sja1105_spi_rw_mode_t rw, u64 reg_addr, u64 *value,
272*4882a593Smuzhiyun 		     struct ptp_system_timestamp *ptp_sts);
273*4882a593Smuzhiyun int static_config_buf_prepare_for_upload(struct sja1105_private *priv,
274*4882a593Smuzhiyun 					 void *config_buf, int buf_len);
275*4882a593Smuzhiyun int sja1105_static_config_upload(struct sja1105_private *priv);
276*4882a593Smuzhiyun int sja1105_inhibit_tx(const struct sja1105_private *priv,
277*4882a593Smuzhiyun 		       unsigned long port_bitmap, bool tx_inhibited);
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun extern const struct sja1105_info sja1105e_info;
280*4882a593Smuzhiyun extern const struct sja1105_info sja1105t_info;
281*4882a593Smuzhiyun extern const struct sja1105_info sja1105p_info;
282*4882a593Smuzhiyun extern const struct sja1105_info sja1105q_info;
283*4882a593Smuzhiyun extern const struct sja1105_info sja1105r_info;
284*4882a593Smuzhiyun extern const struct sja1105_info sja1105s_info;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun /* From sja1105_clocking.c */
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun typedef enum {
289*4882a593Smuzhiyun 	XMII_MAC = 0,
290*4882a593Smuzhiyun 	XMII_PHY = 1,
291*4882a593Smuzhiyun } sja1105_mii_role_t;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun typedef enum {
294*4882a593Smuzhiyun 	XMII_MODE_MII		= 0,
295*4882a593Smuzhiyun 	XMII_MODE_RMII		= 1,
296*4882a593Smuzhiyun 	XMII_MODE_RGMII		= 2,
297*4882a593Smuzhiyun 	XMII_MODE_SGMII		= 3,
298*4882a593Smuzhiyun } sja1105_phy_interface_t;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun typedef enum {
301*4882a593Smuzhiyun 	SJA1105_SPEED_10MBPS	= 3,
302*4882a593Smuzhiyun 	SJA1105_SPEED_100MBPS	= 2,
303*4882a593Smuzhiyun 	SJA1105_SPEED_1000MBPS	= 1,
304*4882a593Smuzhiyun 	SJA1105_SPEED_AUTO	= 0,
305*4882a593Smuzhiyun } sja1105_speed_t;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun int sja1105pqrs_setup_rgmii_delay(const void *ctx, int port);
308*4882a593Smuzhiyun int sja1105_clocking_setup_port(struct sja1105_private *priv, int port);
309*4882a593Smuzhiyun int sja1105_clocking_setup(struct sja1105_private *priv);
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /* From sja1105_ethtool.c */
312*4882a593Smuzhiyun void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data);
313*4882a593Smuzhiyun void sja1105_get_strings(struct dsa_switch *ds, int port,
314*4882a593Smuzhiyun 			 u32 stringset, u8 *data);
315*4882a593Smuzhiyun int sja1105_get_sset_count(struct dsa_switch *ds, int port, int sset);
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun /* From sja1105_dynamic_config.c */
318*4882a593Smuzhiyun int sja1105_dynamic_config_read(struct sja1105_private *priv,
319*4882a593Smuzhiyun 				enum sja1105_blk_idx blk_idx,
320*4882a593Smuzhiyun 				int index, void *entry);
321*4882a593Smuzhiyun int sja1105_dynamic_config_write(struct sja1105_private *priv,
322*4882a593Smuzhiyun 				 enum sja1105_blk_idx blk_idx,
323*4882a593Smuzhiyun 				 int index, void *entry, bool keep);
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun enum sja1105_iotag {
326*4882a593Smuzhiyun 	SJA1105_C_TAG = 0, /* Inner VLAN header */
327*4882a593Smuzhiyun 	SJA1105_S_TAG = 1, /* Outer VLAN header */
328*4882a593Smuzhiyun };
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun u8 sja1105et_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid);
331*4882a593Smuzhiyun int sja1105et_fdb_add(struct dsa_switch *ds, int port,
332*4882a593Smuzhiyun 		      const unsigned char *addr, u16 vid);
333*4882a593Smuzhiyun int sja1105et_fdb_del(struct dsa_switch *ds, int port,
334*4882a593Smuzhiyun 		      const unsigned char *addr, u16 vid);
335*4882a593Smuzhiyun int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
336*4882a593Smuzhiyun 			const unsigned char *addr, u16 vid);
337*4882a593Smuzhiyun int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
338*4882a593Smuzhiyun 			const unsigned char *addr, u16 vid);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /* From sja1105_flower.c */
341*4882a593Smuzhiyun int sja1105_cls_flower_del(struct dsa_switch *ds, int port,
342*4882a593Smuzhiyun 			   struct flow_cls_offload *cls, bool ingress);
343*4882a593Smuzhiyun int sja1105_cls_flower_add(struct dsa_switch *ds, int port,
344*4882a593Smuzhiyun 			   struct flow_cls_offload *cls, bool ingress);
345*4882a593Smuzhiyun int sja1105_cls_flower_stats(struct dsa_switch *ds, int port,
346*4882a593Smuzhiyun 			     struct flow_cls_offload *cls, bool ingress);
347*4882a593Smuzhiyun void sja1105_flower_setup(struct dsa_switch *ds);
348*4882a593Smuzhiyun void sja1105_flower_teardown(struct dsa_switch *ds);
349*4882a593Smuzhiyun struct sja1105_rule *sja1105_rule_find(struct sja1105_private *priv,
350*4882a593Smuzhiyun 				       unsigned long cookie);
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun #endif
353