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