xref: /linux/drivers/net/dsa/realtek/rtl8365mb_table.h (revision fbafdd3b224a03b7b335de144f44a600de937586)
1*fbafdd3bSAlvin Šipraga /* SPDX-License-Identifier: GPL-2.0 */
2*fbafdd3bSAlvin Šipraga /* Look-up table query interface for the rtl8365mb switch family
3*fbafdd3bSAlvin Šipraga  *
4*fbafdd3bSAlvin Šipraga  * Copyright (C) 2022 Alvin Šipraga <alsi@bang-olufsen.dk>
5*fbafdd3bSAlvin Šipraga  */
6*fbafdd3bSAlvin Šipraga 
7*fbafdd3bSAlvin Šipraga #ifndef _REALTEK_RTL8365MB_TABLE_H
8*fbafdd3bSAlvin Šipraga #define _REALTEK_RTL8365MB_TABLE_H
9*fbafdd3bSAlvin Šipraga 
10*fbafdd3bSAlvin Šipraga #include <linux/if_ether.h>
11*fbafdd3bSAlvin Šipraga #include <linux/types.h>
12*fbafdd3bSAlvin Šipraga 
13*fbafdd3bSAlvin Šipraga #include "realtek.h"
14*fbafdd3bSAlvin Šipraga 
15*fbafdd3bSAlvin Šipraga #define RTL8365MB_TABLE_ENTRY_MAX_SIZE			10
16*fbafdd3bSAlvin Šipraga 
17*fbafdd3bSAlvin Šipraga /*
18*fbafdd3bSAlvin Šipraga  * enum rtl8365mb_table - available switch tables
19*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_ACL_RULE: ACL rules
20*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_ACL_ACTION: ACL actions
21*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_CVLAN: VLAN4k configurations
22*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2: filtering database (2K hash table)
23*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_IGMP_GROUP: IGMP group database (readonly)
24*fbafdd3bSAlvin Šipraga  *
25*fbafdd3bSAlvin Šipraga  * NOTE: Don't change the enum values. They must concur with the field
26*fbafdd3bSAlvin Šipraga  * described by @RTL8365MB_TABLE_CTRL_TABLE_MASK.
27*fbafdd3bSAlvin Šipraga  */
28*fbafdd3bSAlvin Šipraga enum rtl8365mb_table {
29*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_ACL_RULE = 1,
30*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_ACL_ACTION = 2,
31*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_CVLAN = 3,
32*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2 = 4,
33*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_IGMP_GROUP = 5,
34*fbafdd3bSAlvin Šipraga };
35*fbafdd3bSAlvin Šipraga 
36*fbafdd3bSAlvin Šipraga /*
37*fbafdd3bSAlvin Šipraga  * enum rtl8365mb_table_op - table query operation
38*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_OP_READ: read an entry from the target table
39*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_OP_WRITE: write an entry to the target table
40*fbafdd3bSAlvin Šipraga  *
41*fbafdd3bSAlvin Šipraga  * NOTE: Don't change the enum values. They must concur with the field
42*fbafdd3bSAlvin Šipraga  * described by @RTL8365MB_TABLE_CTRL_OP_MASK.
43*fbafdd3bSAlvin Šipraga  */
44*fbafdd3bSAlvin Šipraga enum rtl8365mb_table_op {
45*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_OP_READ = 0,
46*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_OP_WRITE = 1,
47*fbafdd3bSAlvin Šipraga };
48*fbafdd3bSAlvin Šipraga 
49*fbafdd3bSAlvin Šipraga /*
50*fbafdd3bSAlvin Šipraga  * enum rtl8365mb_table_l2_method - look-up method for read queries of L2 table
51*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2_METHOD_MAC: look-up by source MAC address and FID (or
52*fbafdd3bSAlvin Šipraga  *   VID)
53*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2_METHOD_ADDR: look-up by entry address
54*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT: look-up next entry starting from the
55*fbafdd3bSAlvin Šipraga  *   supplied address
56*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC: same as ADDR_NEXT but search only
57*fbafdd3bSAlvin Šipraga  *   unicast addresses
58*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC: same as ADDR_NEXT but search only
59*fbafdd3bSAlvin Šipraga  *   multicast addresses
60*fbafdd3bSAlvin Šipraga  * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT: same as ADDR_NEXT_UC but
61*fbafdd3bSAlvin Šipraga  *   search only entries with matching source port
62*fbafdd3bSAlvin Šipraga  *
63*fbafdd3bSAlvin Šipraga  * NOTE: Don't change the enum values. They must concur with the field
64*fbafdd3bSAlvin Šipraga  * described by @RTL8365MB_TABLE_CTRL_METHOD_MASK
65*fbafdd3bSAlvin Šipraga  */
66*fbafdd3bSAlvin Šipraga enum rtl8365mb_table_l2_method {
67*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2_METHOD_MAC = 0,
68*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2_METHOD_ADDR = 1,
69*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT = 2,
70*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC = 3,
71*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC = 4,
72*fbafdd3bSAlvin Šipraga 	/*
73*fbafdd3bSAlvin Šipraga 	 * RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC_L3 = 5,
74*fbafdd3bSAlvin Šipraga 	 * RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC_L2L3 = 6,
75*fbafdd3bSAlvin Šipraga 	 */
76*fbafdd3bSAlvin Šipraga 	RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT = 7,
77*fbafdd3bSAlvin Šipraga };
78*fbafdd3bSAlvin Šipraga 
79*fbafdd3bSAlvin Šipraga /*
80*fbafdd3bSAlvin Šipraga  * rtl8365mb_table_query() - read from or write to a switch table
81*fbafdd3bSAlvin Šipraga  * @priv: driver context
82*fbafdd3bSAlvin Šipraga  * @table: target table, see &enum rtl8365mb_table
83*fbafdd3bSAlvin Šipraga  * @op: read or write operation, see &enum rtl8365mb_table_op
84*fbafdd3bSAlvin Šipraga  * @addr: table address. For indexed tables, this selects the entry to access.
85*fbafdd3bSAlvin Šipraga  *        For L2 read queries, it is ignored as input for MAC-based lookup
86*fbafdd3bSAlvin Šipraga  *        methods and used as input for address-based lookup methods. On
87*fbafdd3bSAlvin Šipraga  *        successful L2 queries, it is updated with the matched entry address.
88*fbafdd3bSAlvin Šipraga  * @method: L2 table lookup method, see &enum rtl8365mb_table_l2_method.
89*fbafdd3bSAlvin Šipraga  *	    Ignored for non-L2 tables.
90*fbafdd3bSAlvin Šipraga  * @port: for L2 read queries using method
91*fbafdd3bSAlvin Šipraga  *        %RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT, restrict the search
92*fbafdd3bSAlvin Šipraga  *        to entries associated with this source port. Ignored otherwise.
93*fbafdd3bSAlvin Šipraga  * @data: data buffer used to read from or write to the table. For L2 MAC
94*fbafdd3bSAlvin Šipraga  *        lookups, this buffer provides the lookup key and receives the
95*fbafdd3bSAlvin Šipraga  *        matched entry contents on success.
96*fbafdd3bSAlvin Šipraga  * @size: size of @data in 16-bit words. The caller must ensure that @size
97*fbafdd3bSAlvin Šipraga  *        matches the target table's entry size and does not exceed
98*fbafdd3bSAlvin Šipraga  *        RTL8365MB_TABLE_ENTRY_MAX_SIZE.
99*fbafdd3bSAlvin Šipraga  *
100*fbafdd3bSAlvin Šipraga  * This function provides unified access to the internal tables of the switch.
101*fbafdd3bSAlvin Šipraga  * All tables except the L2 table are simple indexed tables, where @addr
102*fbafdd3bSAlvin Šipraga  * selects the entry and @op determines whether the access is a read or a
103*fbafdd3bSAlvin Šipraga  * write operation.
104*fbafdd3bSAlvin Šipraga  *
105*fbafdd3bSAlvin Šipraga  * The content of @data is used as input when writing to tables or when
106*fbafdd3bSAlvin Šipraga  * specifying the lookup key for L2 MAC searches, and as output for all
107*fbafdd3bSAlvin Šipraga  * successful read operations. It remains unchanged during write operations or
108*fbafdd3bSAlvin Šipraga  * failed read operations that return %-ENOENT. For other errors during read
109*fbafdd3bSAlvin Šipraga  * operations, it is undefined.
110*fbafdd3bSAlvin Šipraga  *
111*fbafdd3bSAlvin Šipraga  * The L2 table is a hash table and supports multiple lookup methods. For
112*fbafdd3bSAlvin Šipraga  * %RTL8365MB_TABLE_L2_METHOD_MAC, an entry is searched based on the MAC
113*fbafdd3bSAlvin Šipraga  * address and FID/VID fields provided in @data, using the same format as
114*fbafdd3bSAlvin Šipraga  * an L2 table entry. Address-based methods either read a specific entry
115*fbafdd3bSAlvin Šipraga  * (%RTL8365MB_TABLE_L2_METHOD_ADDR) or iterate over valid entries starting
116*fbafdd3bSAlvin Šipraga  * from @addr (%RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT and variants). When using
117*fbafdd3bSAlvin Šipraga  * %RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT, only entries associated with
118*fbafdd3bSAlvin Šipraga  * the specified @port are considered.
119*fbafdd3bSAlvin Šipraga  *
120*fbafdd3bSAlvin Šipraga  * On successful L2 operations, @addr is updated with the matched table address
121*fbafdd3bSAlvin Šipraga  * or allocated entry address. If no matching entry is found, or if an L2 write
122*fbafdd3bSAlvin Šipraga  * operation fails (e.g., due to a full table during addition or a missing entry
123*fbafdd3bSAlvin Šipraga  * during deletion), %-ENOENT is returned and @addr remains unchanged. It is the
124*fbafdd3bSAlvin Šipraga  * caller's responsibility to map the returned error to the appropriate
125*fbafdd3bSAlvin Šipraga  * semantic error.
126*fbafdd3bSAlvin Šipraga  *
127*fbafdd3bSAlvin Šipraga  * @size must match the size of the target table entry, expressed in 16-bit
128*fbafdd3bSAlvin Šipraga  * words.
129*fbafdd3bSAlvin Šipraga  *
130*fbafdd3bSAlvin Šipraga  * Return: 0 on success, or a negative error code on failure.
131*fbafdd3bSAlvin Šipraga  */
132*fbafdd3bSAlvin Šipraga int rtl8365mb_table_query(struct realtek_priv *priv,
133*fbafdd3bSAlvin Šipraga 			  enum rtl8365mb_table table,
134*fbafdd3bSAlvin Šipraga 			  enum rtl8365mb_table_op op, u16 *addr,
135*fbafdd3bSAlvin Šipraga 			  enum rtl8365mb_table_l2_method method,
136*fbafdd3bSAlvin Šipraga 			  u16 port, u16 *data, size_t size);
137*fbafdd3bSAlvin Šipraga 
138*fbafdd3bSAlvin Šipraga #endif /* _REALTEK_RTL8365MB_TABLE_H */
139