/* SPDX-License-Identifier: GPL-2.0 */ /* Look-up table query interface for the rtl8365mb switch family * * Copyright (C) 2022 Alvin Šipraga */ #ifndef _REALTEK_RTL8365MB_TABLE_H #define _REALTEK_RTL8365MB_TABLE_H #include #include #include "realtek.h" #define RTL8365MB_TABLE_ENTRY_MAX_SIZE 10 /* * enum rtl8365mb_table - available switch tables * @RTL8365MB_TABLE_ACL_RULE: ACL rules * @RTL8365MB_TABLE_ACL_ACTION: ACL actions * @RTL8365MB_TABLE_CVLAN: VLAN4k configurations * @RTL8365MB_TABLE_L2: filtering database (2K hash table) * @RTL8365MB_TABLE_IGMP_GROUP: IGMP group database (readonly) * * NOTE: Don't change the enum values. They must concur with the field * described by @RTL8365MB_TABLE_CTRL_TABLE_MASK. */ enum rtl8365mb_table { RTL8365MB_TABLE_ACL_RULE = 1, RTL8365MB_TABLE_ACL_ACTION = 2, RTL8365MB_TABLE_CVLAN = 3, RTL8365MB_TABLE_L2 = 4, RTL8365MB_TABLE_IGMP_GROUP = 5, }; /* * enum rtl8365mb_table_op - table query operation * @RTL8365MB_TABLE_OP_READ: read an entry from the target table * @RTL8365MB_TABLE_OP_WRITE: write an entry to the target table * * NOTE: Don't change the enum values. They must concur with the field * described by @RTL8365MB_TABLE_CTRL_OP_MASK. */ enum rtl8365mb_table_op { RTL8365MB_TABLE_OP_READ = 0, RTL8365MB_TABLE_OP_WRITE = 1, }; /* * enum rtl8365mb_table_l2_method - look-up method for read queries of L2 table * @RTL8365MB_TABLE_L2_METHOD_MAC: look-up by source MAC address and FID (or * VID) * @RTL8365MB_TABLE_L2_METHOD_ADDR: look-up by entry address * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT: look-up next entry starting from the * supplied address * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC: same as ADDR_NEXT but search only * unicast addresses * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC: same as ADDR_NEXT but search only * multicast addresses * @RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT: same as ADDR_NEXT_UC but * search only entries with matching source port * * NOTE: Don't change the enum values. They must concur with the field * described by @RTL8365MB_TABLE_CTRL_METHOD_MASK */ enum rtl8365mb_table_l2_method { RTL8365MB_TABLE_L2_METHOD_MAC = 0, RTL8365MB_TABLE_L2_METHOD_ADDR = 1, RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT = 2, RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC = 3, RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC = 4, /* * RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC_L3 = 5, * RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_MC_L2L3 = 6, */ RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT = 7, }; /* * rtl8365mb_table_query() - read from or write to a switch table * @priv: driver context * @table: target table, see &enum rtl8365mb_table * @op: read or write operation, see &enum rtl8365mb_table_op * @addr: table address. For indexed tables, this selects the entry to access. * For L2 read queries, it is ignored as input for MAC-based lookup * methods and used as input for address-based lookup methods. On * successful L2 queries, it is updated with the matched entry address. * @method: L2 table lookup method, see &enum rtl8365mb_table_l2_method. * Ignored for non-L2 tables. * @port: for L2 read queries using method * %RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT, restrict the search * to entries associated with this source port. Ignored otherwise. * @data: data buffer used to read from or write to the table. For L2 MAC * lookups, this buffer provides the lookup key and receives the * matched entry contents on success. * @size: size of @data in 16-bit words. The caller must ensure that @size * matches the target table's entry size and does not exceed * RTL8365MB_TABLE_ENTRY_MAX_SIZE. * * This function provides unified access to the internal tables of the switch. * All tables except the L2 table are simple indexed tables, where @addr * selects the entry and @op determines whether the access is a read or a * write operation. * * The content of @data is used as input when writing to tables or when * specifying the lookup key for L2 MAC searches, and as output for all * successful read operations. It remains unchanged during write operations or * failed read operations that return %-ENOENT. For other errors during read * operations, it is undefined. * * The L2 table is a hash table and supports multiple lookup methods. For * %RTL8365MB_TABLE_L2_METHOD_MAC, an entry is searched based on the MAC * address and FID/VID fields provided in @data, using the same format as * an L2 table entry. Address-based methods either read a specific entry * (%RTL8365MB_TABLE_L2_METHOD_ADDR) or iterate over valid entries starting * from @addr (%RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT and variants). When using * %RTL8365MB_TABLE_L2_METHOD_ADDR_NEXT_UC_PORT, only entries associated with * the specified @port are considered. * * On successful L2 operations, @addr is updated with the matched table address * or allocated entry address. If no matching entry is found, or if an L2 write * operation fails (e.g., due to a full table during addition or a missing entry * during deletion), %-ENOENT is returned and @addr remains unchanged. It is the * caller's responsibility to map the returned error to the appropriate * semantic error. * * @size must match the size of the target table entry, expressed in 16-bit * words. * * Return: 0 on success, or a negative error code on failure. */ int rtl8365mb_table_query(struct realtek_priv *priv, enum rtl8365mb_table table, enum rtl8365mb_table_op op, u16 *addr, enum rtl8365mb_table_l2_method method, u16 port, u16 *data, size_t size); #endif /* _REALTEK_RTL8365MB_TABLE_H */