Blame view

kernel/linux-rt-4.4.41/drivers/net/ethernet/ti/cpsw_ale.h 4.13 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  /*
   * Texas Instruments N-Port Ethernet Switch Address Lookup Engine APIs
   *
   * Copyright (C) 2012 Texas Instruments
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as
   * published by the Free Software Foundation version 2.
   *
   * This program is distributed "as is" WITHOUT ANY WARRANTY of any
   * kind, whether express or implied; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   */
  #ifndef __TI_CPSW_ALE_H__
  #define __TI_CPSW_ALE_H__
  
  struct cpsw_ale_params {
  	struct device		*dev;
  	void __iomem		*ale_regs;
  	unsigned long		ale_ageout;	/* in secs */
  	unsigned long		ale_entries;
  	unsigned long		ale_ports;
  	/* NU Switch has specific handling as number of bits in ALE entries
  	 * are different than other versions of ALE. Also there are specific
  	 * registers for unknown vlan specific fields. So use nu_switch_ale
  	 * to identify this hardware.
  	 */
  	bool			nu_switch_ale;
  	/* mask bit used in NU Switch ALE is 3 bits instead of 8 bits. So
  	 * pass it from caller.
  	 */
  	u32			major_ver_mask;
  };
  
  struct cpsw_ale {
  	struct cpsw_ale_params	params;
  	struct timer_list	timer;
  	unsigned long		ageout;
  	int			allmulti;
  	u32			version;
  	struct device_attribute ale_control_attr;
  #define control_attr_to_ale(attr)	\
  	container_of(attr, struct cpsw_ale, ale_control_attr)
  	struct device_attribute ale_table_attr;
  #define table_attr_to_ale(attr)		\
  	container_of(attr, struct cpsw_ale, ale_table_attr)
  	struct device_attribute ale_table_raw_attr;
  #define table_raw_attr_to_ale(attr)		\
  	container_of(attr, struct cpsw_ale, ale_table_raw_attr)
  	int			show_next;
  	int			raw_show_next;
  	/* These bits are different on NetCP NU Switch ALE */
  	u32			port_mask_bits;
  	u32			port_num_bits;
  	u32			vlan_field_bits;
  };
  
  enum cpsw_ale_control {
  	/* global */
  	ALE_VERSION,
  	ALE_ENABLE,
  	ALE_CLEAR,
  	ALE_AGEOUT,
  	ALE_P0_UNI_FLOOD,
  	ALE_VLAN_NOLEARN,
  	ALE_NO_PORT_VLAN,
  	ALE_OUI_DENY,
  	ALE_BYPASS,
  	ALE_RATE_LIMIT_TX,
  	ALE_VLAN_AWARE,
  	ALE_AUTH_ENABLE,
  	ALE_RATE_LIMIT,
  	/* port controls */
  	ALE_PORT_STATE,
  	ALE_PORT_DROP_UNTAGGED,
  	ALE_PORT_DROP_UNKNOWN_VLAN,
  	ALE_PORT_NOLEARN,
  	ALE_PORT_NO_SA_UPDATE,
  	ALE_PORT_UNKNOWN_VLAN_MEMBER,
  	ALE_PORT_UNKNOWN_MCAST_FLOOD,
  	ALE_PORT_UNKNOWN_REG_MCAST_FLOOD,
  	ALE_PORT_UNTAGGED_EGRESS,
  	ALE_PORT_BCAST_LIMIT,
  	ALE_PORT_MCAST_LIMIT,
  	ALE_NUM_CONTROLS,
  };
  
  enum cpsw_ale_port_state {
  	ALE_PORT_STATE_DISABLE	= 0x00,
  	ALE_PORT_STATE_BLOCK	= 0x01,
  	ALE_PORT_STATE_LEARN	= 0x02,
  	ALE_PORT_STATE_FORWARD	= 0x03,
  };
  
  /* ALE unicast entry flags - passed into cpsw_ale_add_ucast() */
  #define ALE_SECURE			BIT(0)
  #define ALE_BLOCKED			BIT(1)
  #define ALE_SUPER			BIT(2)
  #define ALE_VLAN			BIT(3)
  
  #define ALE_PORT_HOST			BIT(0)
  #define ALE_PORT_1			BIT(1)
  #define ALE_PORT_2			BIT(2)
  
  #define ALE_MCAST_FWD			0
  #define ALE_MCAST_BLOCK_LEARN_FWD	1
  #define ALE_MCAST_FWD_LEARN		2
  #define ALE_MCAST_FWD_2			3
  
  #define ALE_ENTRY_BITS		68
  #define ALE_ENTRY_WORDS	DIV_ROUND_UP(ALE_ENTRY_BITS, 32)
  
  struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params);
  int cpsw_ale_destroy(struct cpsw_ale *ale);
  
  void cpsw_ale_start(struct cpsw_ale *ale);
  void cpsw_ale_stop(struct cpsw_ale *ale);
  
  int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid);
  int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port,
  		       int flags, u16 vid);
  int cpsw_ale_del_ucast(struct cpsw_ale *ale, u8 *addr, int port,
  		       int flags, u16 vid);
  int cpsw_ale_add_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask,
  		       int flags, u16 vid, int mcast_state);
  int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask,
  		       int flags, u16 vid);
  int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag,
  			int reg_mcast, int unreg_mcast);
  int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port);
  void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti);
  
  int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control);
  int cpsw_ale_control_set(struct cpsw_ale *ale, int port,
  			 int control, int value);
  void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data);
  
  #endif