18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause 28c2ecf20Sopenharmony_ci/* Copyright (c) 2016-2018, NXP Semiconductors 38c2ecf20Sopenharmony_ci * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com> 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#include "sja1105_static_config.h" 68c2ecf20Sopenharmony_ci#include <linux/crc32.h> 78c2ecf20Sopenharmony_ci#include <linux/slab.h> 88c2ecf20Sopenharmony_ci#include <linux/string.h> 98c2ecf20Sopenharmony_ci#include <linux/errno.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci/* Convenience wrappers over the generic packing functions. These take into 128c2ecf20Sopenharmony_ci * account the SJA1105 memory layout quirks and provide some level of 138c2ecf20Sopenharmony_ci * programmer protection against incorrect API use. The errors are not expected 148c2ecf20Sopenharmony_ci * to occur durring runtime, therefore printing and swallowing them here is 158c2ecf20Sopenharmony_ci * appropriate instead of clutterring up higher-level code. 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_civoid sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci int rc = packing(buf, (u64 *)val, start, end, len, 208c2ecf20Sopenharmony_ci PACK, QUIRK_LSW32_IS_FIRST); 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci if (likely(!rc)) 238c2ecf20Sopenharmony_ci return; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci if (rc == -EINVAL) { 268c2ecf20Sopenharmony_ci pr_err("Start bit (%d) expected to be larger than end (%d)\n", 278c2ecf20Sopenharmony_ci start, end); 288c2ecf20Sopenharmony_ci } else if (rc == -ERANGE) { 298c2ecf20Sopenharmony_ci if ((start - end + 1) > 64) 308c2ecf20Sopenharmony_ci pr_err("Field %d-%d too large for 64 bits!\n", 318c2ecf20Sopenharmony_ci start, end); 328c2ecf20Sopenharmony_ci else 338c2ecf20Sopenharmony_ci pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n", 348c2ecf20Sopenharmony_ci *val, start, end); 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci dump_stack(); 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_civoid sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci int rc = packing((void *)buf, val, start, end, len, 428c2ecf20Sopenharmony_ci UNPACK, QUIRK_LSW32_IS_FIRST); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci if (likely(!rc)) 458c2ecf20Sopenharmony_ci return; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci if (rc == -EINVAL) 488c2ecf20Sopenharmony_ci pr_err("Start bit (%d) expected to be larger than end (%d)\n", 498c2ecf20Sopenharmony_ci start, end); 508c2ecf20Sopenharmony_ci else if (rc == -ERANGE) 518c2ecf20Sopenharmony_ci pr_err("Field %d-%d too large for 64 bits!\n", 528c2ecf20Sopenharmony_ci start, end); 538c2ecf20Sopenharmony_ci dump_stack(); 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_civoid sja1105_packing(void *buf, u64 *val, int start, int end, 578c2ecf20Sopenharmony_ci size_t len, enum packing_op op) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci int rc = packing(buf, val, start, end, len, op, QUIRK_LSW32_IS_FIRST); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (likely(!rc)) 628c2ecf20Sopenharmony_ci return; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci if (rc == -EINVAL) { 658c2ecf20Sopenharmony_ci pr_err("Start bit (%d) expected to be larger than end (%d)\n", 668c2ecf20Sopenharmony_ci start, end); 678c2ecf20Sopenharmony_ci } else if (rc == -ERANGE) { 688c2ecf20Sopenharmony_ci if ((start - end + 1) > 64) 698c2ecf20Sopenharmony_ci pr_err("Field %d-%d too large for 64 bits!\n", 708c2ecf20Sopenharmony_ci start, end); 718c2ecf20Sopenharmony_ci else 728c2ecf20Sopenharmony_ci pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n", 738c2ecf20Sopenharmony_ci *val, start, end); 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci dump_stack(); 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci/* Little-endian Ethernet CRC32 of data packed as big-endian u32 words */ 798c2ecf20Sopenharmony_ciu32 sja1105_crc32(const void *buf, size_t len) 808c2ecf20Sopenharmony_ci{ 818c2ecf20Sopenharmony_ci unsigned int i; 828c2ecf20Sopenharmony_ci u64 word; 838c2ecf20Sopenharmony_ci u32 crc; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci /* seed */ 868c2ecf20Sopenharmony_ci crc = ~0; 878c2ecf20Sopenharmony_ci for (i = 0; i < len; i += 4) { 888c2ecf20Sopenharmony_ci sja1105_unpack((void *)buf + i, &word, 31, 0, 4); 898c2ecf20Sopenharmony_ci crc = crc32_le(crc, (u8 *)&word, 4); 908c2ecf20Sopenharmony_ci } 918c2ecf20Sopenharmony_ci return ~crc; 928c2ecf20Sopenharmony_ci} 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_cistatic size_t sja1105et_avb_params_entry_packing(void *buf, void *entry_ptr, 958c2ecf20Sopenharmony_ci enum packing_op op) 968c2ecf20Sopenharmony_ci{ 978c2ecf20Sopenharmony_ci const size_t size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY; 988c2ecf20Sopenharmony_ci struct sja1105_avb_params_entry *entry = entry_ptr; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destmeta, 95, 48, size, op); 1018c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->srcmeta, 47, 0, size, op); 1028c2ecf20Sopenharmony_ci return size; 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cisize_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr, 1068c2ecf20Sopenharmony_ci enum packing_op op) 1078c2ecf20Sopenharmony_ci{ 1088c2ecf20Sopenharmony_ci const size_t size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY; 1098c2ecf20Sopenharmony_ci struct sja1105_avb_params_entry *entry = entry_ptr; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->cas_master, 126, 126, size, op); 1128c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destmeta, 125, 78, size, op); 1138c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->srcmeta, 77, 30, size, op); 1148c2ecf20Sopenharmony_ci return size; 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic size_t sja1105et_general_params_entry_packing(void *buf, void *entry_ptr, 1188c2ecf20Sopenharmony_ci enum packing_op op) 1198c2ecf20Sopenharmony_ci{ 1208c2ecf20Sopenharmony_ci const size_t size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY; 1218c2ecf20Sopenharmony_ci struct sja1105_general_params_entry *entry = entry_ptr; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vllupformat, 319, 319, size, op); 1248c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mirr_ptacu, 318, 318, size, op); 1258c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->switchid, 317, 315, size, op); 1268c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->hostprio, 314, 312, size, op); 1278c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_fltres1, 311, 264, size, op); 1288c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_fltres0, 263, 216, size, op); 1298c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_flt1, 215, 168, size, op); 1308c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_flt0, 167, 120, size, op); 1318c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->incl_srcpt1, 119, 119, size, op); 1328c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->incl_srcpt0, 118, 118, size, op); 1338c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->send_meta1, 117, 117, size, op); 1348c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->send_meta0, 116, 116, size, op); 1358c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->casc_port, 115, 113, size, op); 1368c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->host_port, 112, 110, size, op); 1378c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mirr_port, 109, 107, size, op); 1388c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlmarker, 106, 75, size, op); 1398c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlmask, 74, 43, size, op); 1408c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tpid, 42, 27, size, op); 1418c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ignore2stf, 26, 26, size, op); 1428c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tpid2, 25, 10, size, op); 1438c2ecf20Sopenharmony_ci return size; 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci/* TPID and TPID2 are intentionally reversed so that semantic 1478c2ecf20Sopenharmony_ci * compatibility with E/T is kept. 1488c2ecf20Sopenharmony_ci */ 1498c2ecf20Sopenharmony_cisize_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr, 1508c2ecf20Sopenharmony_ci enum packing_op op) 1518c2ecf20Sopenharmony_ci{ 1528c2ecf20Sopenharmony_ci const size_t size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY; 1538c2ecf20Sopenharmony_ci struct sja1105_general_params_entry *entry = entry_ptr; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vllupformat, 351, 351, size, op); 1568c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mirr_ptacu, 350, 350, size, op); 1578c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->switchid, 349, 347, size, op); 1588c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->hostprio, 346, 344, size, op); 1598c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_fltres1, 343, 296, size, op); 1608c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_fltres0, 295, 248, size, op); 1618c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_flt1, 247, 200, size, op); 1628c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mac_flt0, 199, 152, size, op); 1638c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->incl_srcpt1, 151, 151, size, op); 1648c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->incl_srcpt0, 150, 150, size, op); 1658c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->send_meta1, 149, 149, size, op); 1668c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->send_meta0, 148, 148, size, op); 1678c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->casc_port, 147, 145, size, op); 1688c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->host_port, 144, 142, size, op); 1698c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mirr_port, 141, 139, size, op); 1708c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlmarker, 138, 107, size, op); 1718c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlmask, 106, 75, size, op); 1728c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tpid2, 74, 59, size, op); 1738c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ignore2stf, 58, 58, size, op); 1748c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tpid, 57, 42, size, op); 1758c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->queue_ts, 41, 41, size, op); 1768c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egrmirrvid, 40, 29, size, op); 1778c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egrmirrpcp, 28, 26, size, op); 1788c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egrmirrdei, 25, 25, size, op); 1798c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->replay_port, 24, 22, size, op); 1808c2ecf20Sopenharmony_ci return size; 1818c2ecf20Sopenharmony_ci} 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_cistatic size_t 1848c2ecf20Sopenharmony_cisja1105_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr, 1858c2ecf20Sopenharmony_ci enum packing_op op) 1868c2ecf20Sopenharmony_ci{ 1878c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY; 1888c2ecf20Sopenharmony_ci struct sja1105_l2_forwarding_params_entry *entry = entry_ptr; 1898c2ecf20Sopenharmony_ci int offset, i; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->max_dynp, 95, 93, size, op); 1928c2ecf20Sopenharmony_ci for (i = 0, offset = 13; i < 8; i++, offset += 10) 1938c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->part_spc[i], 1948c2ecf20Sopenharmony_ci offset + 9, offset + 0, size, op); 1958c2ecf20Sopenharmony_ci return size; 1968c2ecf20Sopenharmony_ci} 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_cisize_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr, 1998c2ecf20Sopenharmony_ci enum packing_op op) 2008c2ecf20Sopenharmony_ci{ 2018c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY; 2028c2ecf20Sopenharmony_ci struct sja1105_l2_forwarding_entry *entry = entry_ptr; 2038c2ecf20Sopenharmony_ci int offset, i; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->bc_domain, 63, 59, size, op); 2068c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->reach_port, 58, 54, size, op); 2078c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->fl_domain, 53, 49, size, op); 2088c2ecf20Sopenharmony_ci for (i = 0, offset = 25; i < 8; i++, offset += 3) 2098c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlan_pmap[i], 2108c2ecf20Sopenharmony_ci offset + 2, offset + 0, size, op); 2118c2ecf20Sopenharmony_ci return size; 2128c2ecf20Sopenharmony_ci} 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cistatic size_t 2158c2ecf20Sopenharmony_cisja1105et_l2_lookup_params_entry_packing(void *buf, void *entry_ptr, 2168c2ecf20Sopenharmony_ci enum packing_op op) 2178c2ecf20Sopenharmony_ci{ 2188c2ecf20Sopenharmony_ci const size_t size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY; 2198c2ecf20Sopenharmony_ci struct sja1105_l2_lookup_params_entry *entry = entry_ptr; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxage, 31, 17, size, op); 2228c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->dyn_tbsz, 16, 14, size, op); 2238c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->poly, 13, 6, size, op); 2248c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->shared_learn, 5, 5, size, op); 2258c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->no_enf_hostprt, 4, 4, size, op); 2268c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->no_mgmt_learn, 3, 3, size, op); 2278c2ecf20Sopenharmony_ci return size; 2288c2ecf20Sopenharmony_ci} 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cisize_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr, 2318c2ecf20Sopenharmony_ci enum packing_op op) 2328c2ecf20Sopenharmony_ci{ 2338c2ecf20Sopenharmony_ci const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY; 2348c2ecf20Sopenharmony_ci struct sja1105_l2_lookup_params_entry *entry = entry_ptr; 2358c2ecf20Sopenharmony_ci int offset, i; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci for (i = 0, offset = 58; i < 5; i++, offset += 11) 2388c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxaddrp[i], 2398c2ecf20Sopenharmony_ci offset + 10, offset + 0, size, op); 2408c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxage, 57, 43, size, op); 2418c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->start_dynspc, 42, 33, size, op); 2428c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpnolearn, 32, 28, size, op); 2438c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->shared_learn, 27, 27, size, op); 2448c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->no_enf_hostprt, 26, 26, size, op); 2458c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->no_mgmt_learn, 25, 25, size, op); 2468c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->use_static, 24, 24, size, op); 2478c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->owr_dyn, 23, 23, size, op); 2488c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->learn_once, 22, 22, size, op); 2498c2ecf20Sopenharmony_ci return size; 2508c2ecf20Sopenharmony_ci} 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_cisize_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr, 2538c2ecf20Sopenharmony_ci enum packing_op op) 2548c2ecf20Sopenharmony_ci{ 2558c2ecf20Sopenharmony_ci const size_t size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY; 2568c2ecf20Sopenharmony_ci struct sja1105_l2_lookup_entry *entry = entry_ptr; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanid, 95, 84, size, op); 2598c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->macaddr, 83, 36, size, op); 2608c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destports, 35, 31, size, op); 2618c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->enfport, 30, 30, size, op); 2628c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->index, 29, 20, size, op); 2638c2ecf20Sopenharmony_ci return size; 2648c2ecf20Sopenharmony_ci} 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_cisize_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr, 2678c2ecf20Sopenharmony_ci enum packing_op op) 2688c2ecf20Sopenharmony_ci{ 2698c2ecf20Sopenharmony_ci const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY; 2708c2ecf20Sopenharmony_ci struct sja1105_l2_lookup_entry *entry = entry_ptr; 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci if (entry->lockeds) { 2738c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tsreg, 159, 159, size, op); 2748c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mirrvlan, 158, 147, size, op); 2758c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->takets, 146, 146, size, op); 2768c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mirr, 145, 145, size, op); 2778c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->retag, 144, 144, size, op); 2788c2ecf20Sopenharmony_ci } else { 2798c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->touched, 159, 159, size, op); 2808c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->age, 158, 144, size, op); 2818c2ecf20Sopenharmony_ci } 2828c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mask_iotag, 143, 143, size, op); 2838c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mask_vlanid, 142, 131, size, op); 2848c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->mask_macaddr, 130, 83, size, op); 2858c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->iotag, 82, 82, size, op); 2868c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanid, 81, 70, size, op); 2878c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->macaddr, 69, 22, size, op); 2888c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destports, 21, 17, size, op); 2898c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->enfport, 16, 16, size, op); 2908c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->index, 15, 6, size, op); 2918c2ecf20Sopenharmony_ci return size; 2928c2ecf20Sopenharmony_ci} 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_cistatic size_t sja1105_l2_policing_entry_packing(void *buf, void *entry_ptr, 2958c2ecf20Sopenharmony_ci enum packing_op op) 2968c2ecf20Sopenharmony_ci{ 2978c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY; 2988c2ecf20Sopenharmony_ci struct sja1105_l2_policing_entry *entry = entry_ptr; 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->sharindx, 63, 58, size, op); 3018c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->smax, 57, 42, size, op); 3028c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->rate, 41, 26, size, op); 3038c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxlen, 25, 15, size, op); 3048c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->partition, 14, 12, size, op); 3058c2ecf20Sopenharmony_ci return size; 3068c2ecf20Sopenharmony_ci} 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_cistatic size_t sja1105et_mac_config_entry_packing(void *buf, void *entry_ptr, 3098c2ecf20Sopenharmony_ci enum packing_op op) 3108c2ecf20Sopenharmony_ci{ 3118c2ecf20Sopenharmony_ci const size_t size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY; 3128c2ecf20Sopenharmony_ci struct sja1105_mac_config_entry *entry = entry_ptr; 3138c2ecf20Sopenharmony_ci int offset, i; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci for (i = 0, offset = 72; i < 8; i++, offset += 19) { 3168c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->enabled[i], 3178c2ecf20Sopenharmony_ci offset + 0, offset + 0, size, op); 3188c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->base[i], 3198c2ecf20Sopenharmony_ci offset + 9, offset + 1, size, op); 3208c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->top[i], 3218c2ecf20Sopenharmony_ci offset + 18, offset + 10, size, op); 3228c2ecf20Sopenharmony_ci } 3238c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ifg, 71, 67, size, op); 3248c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->speed, 66, 65, size, op); 3258c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tp_delin, 64, 49, size, op); 3268c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tp_delout, 48, 33, size, op); 3278c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxage, 32, 25, size, op); 3288c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanprio, 24, 22, size, op); 3298c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanid, 21, 10, size, op); 3308c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ing_mirr, 9, 9, size, op); 3318c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egr_mirr, 8, 8, size, op); 3328c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpnona664, 7, 7, size, op); 3338c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpdtag, 6, 6, size, op); 3348c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpuntag, 5, 5, size, op); 3358c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->retag, 4, 4, size, op); 3368c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->dyn_learn, 3, 3, size, op); 3378c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egress, 2, 2, size, op); 3388c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ingress, 1, 1, size, op); 3398c2ecf20Sopenharmony_ci return size; 3408c2ecf20Sopenharmony_ci} 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_cisize_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr, 3438c2ecf20Sopenharmony_ci enum packing_op op) 3448c2ecf20Sopenharmony_ci{ 3458c2ecf20Sopenharmony_ci const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY; 3468c2ecf20Sopenharmony_ci struct sja1105_mac_config_entry *entry = entry_ptr; 3478c2ecf20Sopenharmony_ci int offset, i; 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci for (i = 0, offset = 104; i < 8; i++, offset += 19) { 3508c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->enabled[i], 3518c2ecf20Sopenharmony_ci offset + 0, offset + 0, size, op); 3528c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->base[i], 3538c2ecf20Sopenharmony_ci offset + 9, offset + 1, size, op); 3548c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->top[i], 3558c2ecf20Sopenharmony_ci offset + 18, offset + 10, size, op); 3568c2ecf20Sopenharmony_ci } 3578c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ifg, 103, 99, size, op); 3588c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->speed, 98, 97, size, op); 3598c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tp_delin, 96, 81, size, op); 3608c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tp_delout, 80, 65, size, op); 3618c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxage, 64, 57, size, op); 3628c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanprio, 56, 54, size, op); 3638c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanid, 53, 42, size, op); 3648c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ing_mirr, 41, 41, size, op); 3658c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egr_mirr, 40, 40, size, op); 3668c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpnona664, 39, 39, size, op); 3678c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpdtag, 38, 38, size, op); 3688c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->drpuntag, 35, 35, size, op); 3698c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->retag, 34, 34, size, op); 3708c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->dyn_learn, 33, 33, size, op); 3718c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egress, 32, 32, size, op); 3728c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ingress, 31, 31, size, op); 3738c2ecf20Sopenharmony_ci return size; 3748c2ecf20Sopenharmony_ci} 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_cistatic size_t 3778c2ecf20Sopenharmony_cisja1105_schedule_entry_points_params_entry_packing(void *buf, void *entry_ptr, 3788c2ecf20Sopenharmony_ci enum packing_op op) 3798c2ecf20Sopenharmony_ci{ 3808c2ecf20Sopenharmony_ci struct sja1105_schedule_entry_points_params_entry *entry = entry_ptr; 3818c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->clksrc, 31, 30, size, op); 3848c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->actsubsch, 29, 27, size, op); 3858c2ecf20Sopenharmony_ci return size; 3868c2ecf20Sopenharmony_ci} 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_cistatic size_t 3898c2ecf20Sopenharmony_cisja1105_schedule_entry_points_entry_packing(void *buf, void *entry_ptr, 3908c2ecf20Sopenharmony_ci enum packing_op op) 3918c2ecf20Sopenharmony_ci{ 3928c2ecf20Sopenharmony_ci struct sja1105_schedule_entry_points_entry *entry = entry_ptr; 3938c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY; 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->subschindx, 31, 29, size, op); 3968c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->delta, 28, 11, size, op); 3978c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->address, 10, 1, size, op); 3988c2ecf20Sopenharmony_ci return size; 3998c2ecf20Sopenharmony_ci} 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_cistatic size_t sja1105_schedule_params_entry_packing(void *buf, void *entry_ptr, 4028c2ecf20Sopenharmony_ci enum packing_op op) 4038c2ecf20Sopenharmony_ci{ 4048c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY; 4058c2ecf20Sopenharmony_ci struct sja1105_schedule_params_entry *entry = entry_ptr; 4068c2ecf20Sopenharmony_ci int offset, i; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci for (i = 0, offset = 16; i < 8; i++, offset += 10) 4098c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->subscheind[i], 4108c2ecf20Sopenharmony_ci offset + 9, offset + 0, size, op); 4118c2ecf20Sopenharmony_ci return size; 4128c2ecf20Sopenharmony_ci} 4138c2ecf20Sopenharmony_ci 4148c2ecf20Sopenharmony_cistatic size_t sja1105_schedule_entry_packing(void *buf, void *entry_ptr, 4158c2ecf20Sopenharmony_ci enum packing_op op) 4168c2ecf20Sopenharmony_ci{ 4178c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY; 4188c2ecf20Sopenharmony_ci struct sja1105_schedule_entry *entry = entry_ptr; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->winstindex, 63, 54, size, op); 4218c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->winend, 53, 53, size, op); 4228c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->winst, 52, 52, size, op); 4238c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destports, 51, 47, size, op); 4248c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->setvalid, 46, 46, size, op); 4258c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->txen, 45, 45, size, op); 4268c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->resmedia_en, 44, 44, size, op); 4278c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->resmedia, 43, 36, size, op); 4288c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlindex, 35, 26, size, op); 4298c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->delta, 25, 8, size, op); 4308c2ecf20Sopenharmony_ci return size; 4318c2ecf20Sopenharmony_ci} 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_cistatic size_t 4348c2ecf20Sopenharmony_cisja1105_vl_forwarding_params_entry_packing(void *buf, void *entry_ptr, 4358c2ecf20Sopenharmony_ci enum packing_op op) 4368c2ecf20Sopenharmony_ci{ 4378c2ecf20Sopenharmony_ci struct sja1105_vl_forwarding_params_entry *entry = entry_ptr; 4388c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY; 4398c2ecf20Sopenharmony_ci int offset, i; 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci for (i = 0, offset = 16; i < 8; i++, offset += 10) 4428c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->partspc[i], 4438c2ecf20Sopenharmony_ci offset + 9, offset + 0, size, op); 4448c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->debugen, 15, 15, size, op); 4458c2ecf20Sopenharmony_ci return size; 4468c2ecf20Sopenharmony_ci} 4478c2ecf20Sopenharmony_ci 4488c2ecf20Sopenharmony_cistatic size_t sja1105_vl_forwarding_entry_packing(void *buf, void *entry_ptr, 4498c2ecf20Sopenharmony_ci enum packing_op op) 4508c2ecf20Sopenharmony_ci{ 4518c2ecf20Sopenharmony_ci struct sja1105_vl_forwarding_entry *entry = entry_ptr; 4528c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_VL_FORWARDING_ENTRY; 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->type, 31, 31, size, op); 4558c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->priority, 30, 28, size, op); 4568c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->partition, 27, 25, size, op); 4578c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destports, 24, 20, size, op); 4588c2ecf20Sopenharmony_ci return size; 4598c2ecf20Sopenharmony_ci} 4608c2ecf20Sopenharmony_ci 4618c2ecf20Sopenharmony_cisize_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr, 4628c2ecf20Sopenharmony_ci enum packing_op op) 4638c2ecf20Sopenharmony_ci{ 4648c2ecf20Sopenharmony_ci struct sja1105_vl_lookup_entry *entry = entry_ptr; 4658c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_VL_LOOKUP_ENTRY; 4668c2ecf20Sopenharmony_ci 4678c2ecf20Sopenharmony_ci if (entry->format == SJA1105_VL_FORMAT_PSFP) { 4688c2ecf20Sopenharmony_ci /* Interpreting vllupformat as 0 */ 4698c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destports, 4708c2ecf20Sopenharmony_ci 95, 91, size, op); 4718c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->iscritical, 4728c2ecf20Sopenharmony_ci 90, 90, size, op); 4738c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->macaddr, 4748c2ecf20Sopenharmony_ci 89, 42, size, op); 4758c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanid, 4768c2ecf20Sopenharmony_ci 41, 30, size, op); 4778c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->port, 4788c2ecf20Sopenharmony_ci 29, 27, size, op); 4798c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanprior, 4808c2ecf20Sopenharmony_ci 26, 24, size, op); 4818c2ecf20Sopenharmony_ci } else { 4828c2ecf20Sopenharmony_ci /* Interpreting vllupformat as 1 */ 4838c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egrmirr, 4848c2ecf20Sopenharmony_ci 95, 91, size, op); 4858c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ingrmirr, 4868c2ecf20Sopenharmony_ci 90, 90, size, op); 4878c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlid, 4888c2ecf20Sopenharmony_ci 57, 42, size, op); 4898c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->port, 4908c2ecf20Sopenharmony_ci 29, 27, size, op); 4918c2ecf20Sopenharmony_ci } 4928c2ecf20Sopenharmony_ci return size; 4938c2ecf20Sopenharmony_ci} 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_cistatic size_t sja1105_vl_policing_entry_packing(void *buf, void *entry_ptr, 4968c2ecf20Sopenharmony_ci enum packing_op op) 4978c2ecf20Sopenharmony_ci{ 4988c2ecf20Sopenharmony_ci struct sja1105_vl_policing_entry *entry = entry_ptr; 4998c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_VL_POLICING_ENTRY; 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->type, 63, 63, size, op); 5028c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->maxlen, 62, 52, size, op); 5038c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->sharindx, 51, 42, size, op); 5048c2ecf20Sopenharmony_ci if (entry->type == 0) { 5058c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->bag, 41, 28, size, op); 5068c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->jitter, 27, 18, size, op); 5078c2ecf20Sopenharmony_ci } 5088c2ecf20Sopenharmony_ci return size; 5098c2ecf20Sopenharmony_ci} 5108c2ecf20Sopenharmony_ci 5118c2ecf20Sopenharmony_cisize_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr, 5128c2ecf20Sopenharmony_ci enum packing_op op) 5138c2ecf20Sopenharmony_ci{ 5148c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY; 5158c2ecf20Sopenharmony_ci struct sja1105_vlan_lookup_entry *entry = entry_ptr; 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ving_mirr, 63, 59, size, op); 5188c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vegr_mirr, 58, 54, size, op); 5198c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vmemb_port, 53, 49, size, op); 5208c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlan_bc, 48, 44, size, op); 5218c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->tag_port, 43, 39, size, op); 5228c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlanid, 38, 27, size, op); 5238c2ecf20Sopenharmony_ci return size; 5248c2ecf20Sopenharmony_ci} 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_cistatic size_t sja1105_xmii_params_entry_packing(void *buf, void *entry_ptr, 5278c2ecf20Sopenharmony_ci enum packing_op op) 5288c2ecf20Sopenharmony_ci{ 5298c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_XMII_PARAMS_ENTRY; 5308c2ecf20Sopenharmony_ci struct sja1105_xmii_params_entry *entry = entry_ptr; 5318c2ecf20Sopenharmony_ci int offset, i; 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_ci for (i = 0, offset = 17; i < 5; i++, offset += 3) { 5348c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->xmii_mode[i], 5358c2ecf20Sopenharmony_ci offset + 1, offset + 0, size, op); 5368c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->phy_mac[i], 5378c2ecf20Sopenharmony_ci offset + 2, offset + 2, size, op); 5388c2ecf20Sopenharmony_ci } 5398c2ecf20Sopenharmony_ci return size; 5408c2ecf20Sopenharmony_ci} 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_cisize_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr, 5438c2ecf20Sopenharmony_ci enum packing_op op) 5448c2ecf20Sopenharmony_ci{ 5458c2ecf20Sopenharmony_ci struct sja1105_retagging_entry *entry = entry_ptr; 5468c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_RETAGGING_ENTRY; 5478c2ecf20Sopenharmony_ci 5488c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->egr_port, 63, 59, size, op); 5498c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->ing_port, 58, 54, size, op); 5508c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlan_ing, 53, 42, size, op); 5518c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->vlan_egr, 41, 30, size, op); 5528c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->do_not_learn, 29, 29, size, op); 5538c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->use_dest_ports, 28, 28, size, op); 5548c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->destports, 27, 23, size, op); 5558c2ecf20Sopenharmony_ci return size; 5568c2ecf20Sopenharmony_ci} 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_cisize_t sja1105_table_header_packing(void *buf, void *entry_ptr, 5598c2ecf20Sopenharmony_ci enum packing_op op) 5608c2ecf20Sopenharmony_ci{ 5618c2ecf20Sopenharmony_ci const size_t size = SJA1105_SIZE_TABLE_HEADER; 5628c2ecf20Sopenharmony_ci struct sja1105_table_header *entry = entry_ptr; 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->block_id, 31, 24, size, op); 5658c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->len, 55, 32, size, op); 5668c2ecf20Sopenharmony_ci sja1105_packing(buf, &entry->crc, 95, 64, size, op); 5678c2ecf20Sopenharmony_ci return size; 5688c2ecf20Sopenharmony_ci} 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci/* WARNING: the *hdr pointer is really non-const, because it is 5718c2ecf20Sopenharmony_ci * modifying the CRC of the header for a 2-stage packing operation 5728c2ecf20Sopenharmony_ci */ 5738c2ecf20Sopenharmony_civoid 5748c2ecf20Sopenharmony_cisja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr) 5758c2ecf20Sopenharmony_ci{ 5768c2ecf20Sopenharmony_ci /* First pack the table as-is, then calculate the CRC, and 5778c2ecf20Sopenharmony_ci * finally put the proper CRC into the packed buffer 5788c2ecf20Sopenharmony_ci */ 5798c2ecf20Sopenharmony_ci memset(buf, 0, SJA1105_SIZE_TABLE_HEADER); 5808c2ecf20Sopenharmony_ci sja1105_table_header_packing(buf, hdr, PACK); 5818c2ecf20Sopenharmony_ci hdr->crc = sja1105_crc32(buf, SJA1105_SIZE_TABLE_HEADER - 4); 5828c2ecf20Sopenharmony_ci sja1105_pack(buf + SJA1105_SIZE_TABLE_HEADER - 4, &hdr->crc, 31, 0, 4); 5838c2ecf20Sopenharmony_ci} 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_cistatic void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr) 5868c2ecf20Sopenharmony_ci{ 5878c2ecf20Sopenharmony_ci u64 computed_crc; 5888c2ecf20Sopenharmony_ci int len_bytes; 5898c2ecf20Sopenharmony_ci 5908c2ecf20Sopenharmony_ci len_bytes = (uintptr_t)(crc_ptr - table_start); 5918c2ecf20Sopenharmony_ci computed_crc = sja1105_crc32(table_start, len_bytes); 5928c2ecf20Sopenharmony_ci sja1105_pack(crc_ptr, &computed_crc, 31, 0, 4); 5938c2ecf20Sopenharmony_ci} 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci/* The block IDs that the switches support are unfortunately sparse, so keep a 5968c2ecf20Sopenharmony_ci * mapping table to "block indices" and translate back and forth so that we 5978c2ecf20Sopenharmony_ci * don't waste useless memory in struct sja1105_static_config. 5988c2ecf20Sopenharmony_ci * Also, since the block id comes from essentially untrusted input (unpacking 5998c2ecf20Sopenharmony_ci * the static config from userspace) it has to be sanitized (range-checked) 6008c2ecf20Sopenharmony_ci * before blindly indexing kernel memory with the blk_idx. 6018c2ecf20Sopenharmony_ci */ 6028c2ecf20Sopenharmony_cistatic u64 blk_id_map[BLK_IDX_MAX] = { 6038c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE] = BLKID_SCHEDULE, 6048c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS] = BLKID_SCHEDULE_ENTRY_POINTS, 6058c2ecf20Sopenharmony_ci [BLK_IDX_VL_LOOKUP] = BLKID_VL_LOOKUP, 6068c2ecf20Sopenharmony_ci [BLK_IDX_VL_POLICING] = BLKID_VL_POLICING, 6078c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING] = BLKID_VL_FORWARDING, 6088c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = BLKID_L2_LOOKUP, 6098c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = BLKID_L2_POLICING, 6108c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = BLKID_VLAN_LOOKUP, 6118c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = BLKID_L2_FORWARDING, 6128c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = BLKID_MAC_CONFIG, 6138c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_PARAMS] = BLKID_SCHEDULE_PARAMS, 6148c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = BLKID_SCHEDULE_ENTRY_POINTS_PARAMS, 6158c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING_PARAMS] = BLKID_VL_FORWARDING_PARAMS, 6168c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = BLKID_L2_LOOKUP_PARAMS, 6178c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = BLKID_L2_FORWARDING_PARAMS, 6188c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = BLKID_AVB_PARAMS, 6198c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = BLKID_GENERAL_PARAMS, 6208c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = BLKID_RETAGGING, 6218c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = BLKID_XMII_PARAMS, 6228c2ecf20Sopenharmony_ci}; 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_ciconst char *sja1105_static_config_error_msg[] = { 6258c2ecf20Sopenharmony_ci [SJA1105_CONFIG_OK] = "", 6268c2ecf20Sopenharmony_ci [SJA1105_TTETHERNET_NOT_SUPPORTED] = 6278c2ecf20Sopenharmony_ci "schedule-table present, but TTEthernet is " 6288c2ecf20Sopenharmony_ci "only supported on T and Q/S", 6298c2ecf20Sopenharmony_ci [SJA1105_INCORRECT_TTETHERNET_CONFIGURATION] = 6308c2ecf20Sopenharmony_ci "schedule-table present, but one of " 6318c2ecf20Sopenharmony_ci "schedule-entry-points-table, schedule-parameters-table or " 6328c2ecf20Sopenharmony_ci "schedule-entry-points-parameters table is empty", 6338c2ecf20Sopenharmony_ci [SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION] = 6348c2ecf20Sopenharmony_ci "vl-lookup-table present, but one of vl-policing-table, " 6358c2ecf20Sopenharmony_ci "vl-forwarding-table or vl-forwarding-parameters-table is empty", 6368c2ecf20Sopenharmony_ci [SJA1105_MISSING_L2_POLICING_TABLE] = 6378c2ecf20Sopenharmony_ci "l2-policing-table needs to have at least one entry", 6388c2ecf20Sopenharmony_ci [SJA1105_MISSING_L2_FORWARDING_TABLE] = 6398c2ecf20Sopenharmony_ci "l2-forwarding-table is either missing or incomplete", 6408c2ecf20Sopenharmony_ci [SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE] = 6418c2ecf20Sopenharmony_ci "l2-forwarding-parameters-table is missing", 6428c2ecf20Sopenharmony_ci [SJA1105_MISSING_GENERAL_PARAMS_TABLE] = 6438c2ecf20Sopenharmony_ci "general-parameters-table is missing", 6448c2ecf20Sopenharmony_ci [SJA1105_MISSING_VLAN_TABLE] = 6458c2ecf20Sopenharmony_ci "vlan-lookup-table needs to have at least the default untagged VLAN", 6468c2ecf20Sopenharmony_ci [SJA1105_MISSING_XMII_TABLE] = 6478c2ecf20Sopenharmony_ci "xmii-table is missing", 6488c2ecf20Sopenharmony_ci [SJA1105_MISSING_MAC_TABLE] = 6498c2ecf20Sopenharmony_ci "mac-configuration-table needs to contain an entry for each port", 6508c2ecf20Sopenharmony_ci [SJA1105_OVERCOMMITTED_FRAME_MEMORY] = 6518c2ecf20Sopenharmony_ci "Not allowed to overcommit frame memory. L2 memory partitions " 6528c2ecf20Sopenharmony_ci "and VL memory partitions share the same space. The sum of all " 6538c2ecf20Sopenharmony_ci "16 memory partitions is not allowed to be larger than 929 " 6548c2ecf20Sopenharmony_ci "128-byte blocks (or 910 with retagging). Please adjust " 6558c2ecf20Sopenharmony_ci "l2-forwarding-parameters-table.part_spc and/or " 6568c2ecf20Sopenharmony_ci "vl-forwarding-parameters-table.partspc.", 6578c2ecf20Sopenharmony_ci}; 6588c2ecf20Sopenharmony_ci 6598c2ecf20Sopenharmony_cistatic sja1105_config_valid_t 6608c2ecf20Sopenharmony_cistatic_config_check_memory_size(const struct sja1105_table *tables) 6618c2ecf20Sopenharmony_ci{ 6628c2ecf20Sopenharmony_ci const struct sja1105_l2_forwarding_params_entry *l2_fwd_params; 6638c2ecf20Sopenharmony_ci const struct sja1105_vl_forwarding_params_entry *vl_fwd_params; 6648c2ecf20Sopenharmony_ci int i, max_mem, mem = 0; 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_ci l2_fwd_params = tables[BLK_IDX_L2_FORWARDING_PARAMS].entries; 6678c2ecf20Sopenharmony_ci 6688c2ecf20Sopenharmony_ci for (i = 0; i < 8; i++) 6698c2ecf20Sopenharmony_ci mem += l2_fwd_params->part_spc[i]; 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_ci if (tables[BLK_IDX_VL_FORWARDING_PARAMS].entry_count) { 6728c2ecf20Sopenharmony_ci vl_fwd_params = tables[BLK_IDX_VL_FORWARDING_PARAMS].entries; 6738c2ecf20Sopenharmony_ci for (i = 0; i < 8; i++) 6748c2ecf20Sopenharmony_ci mem += vl_fwd_params->partspc[i]; 6758c2ecf20Sopenharmony_ci } 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_ci if (tables[BLK_IDX_RETAGGING].entry_count) 6788c2ecf20Sopenharmony_ci max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING; 6798c2ecf20Sopenharmony_ci else 6808c2ecf20Sopenharmony_ci max_mem = SJA1105_MAX_FRAME_MEMORY; 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_ci if (mem > max_mem) 6838c2ecf20Sopenharmony_ci return SJA1105_OVERCOMMITTED_FRAME_MEMORY; 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci return SJA1105_CONFIG_OK; 6868c2ecf20Sopenharmony_ci} 6878c2ecf20Sopenharmony_ci 6888c2ecf20Sopenharmony_cisja1105_config_valid_t 6898c2ecf20Sopenharmony_cisja1105_static_config_check_valid(const struct sja1105_static_config *config) 6908c2ecf20Sopenharmony_ci{ 6918c2ecf20Sopenharmony_ci const struct sja1105_table *tables = config->tables; 6928c2ecf20Sopenharmony_ci#define IS_FULL(blk_idx) \ 6938c2ecf20Sopenharmony_ci (tables[blk_idx].entry_count == tables[blk_idx].ops->max_entry_count) 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci if (tables[BLK_IDX_SCHEDULE].entry_count) { 6968c2ecf20Sopenharmony_ci if (config->device_id != SJA1105T_DEVICE_ID && 6978c2ecf20Sopenharmony_ci config->device_id != SJA1105QS_DEVICE_ID) 6988c2ecf20Sopenharmony_ci return SJA1105_TTETHERNET_NOT_SUPPORTED; 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci if (tables[BLK_IDX_SCHEDULE_ENTRY_POINTS].entry_count == 0) 7018c2ecf20Sopenharmony_ci return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION; 7028c2ecf20Sopenharmony_ci 7038c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_SCHEDULE_PARAMS)) 7048c2ecf20Sopenharmony_ci return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION; 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS)) 7078c2ecf20Sopenharmony_ci return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION; 7088c2ecf20Sopenharmony_ci } 7098c2ecf20Sopenharmony_ci if (tables[BLK_IDX_VL_LOOKUP].entry_count) { 7108c2ecf20Sopenharmony_ci struct sja1105_vl_lookup_entry *vl_lookup; 7118c2ecf20Sopenharmony_ci bool has_critical_links = false; 7128c2ecf20Sopenharmony_ci int i; 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci vl_lookup = tables[BLK_IDX_VL_LOOKUP].entries; 7158c2ecf20Sopenharmony_ci 7168c2ecf20Sopenharmony_ci for (i = 0; i < tables[BLK_IDX_VL_LOOKUP].entry_count; i++) { 7178c2ecf20Sopenharmony_ci if (vl_lookup[i].iscritical) { 7188c2ecf20Sopenharmony_ci has_critical_links = true; 7198c2ecf20Sopenharmony_ci break; 7208c2ecf20Sopenharmony_ci } 7218c2ecf20Sopenharmony_ci } 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci if (tables[BLK_IDX_VL_POLICING].entry_count == 0 && 7248c2ecf20Sopenharmony_ci has_critical_links) 7258c2ecf20Sopenharmony_ci return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION; 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci if (tables[BLK_IDX_VL_FORWARDING].entry_count == 0 && 7288c2ecf20Sopenharmony_ci has_critical_links) 7298c2ecf20Sopenharmony_ci return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION; 7308c2ecf20Sopenharmony_ci 7318c2ecf20Sopenharmony_ci if (tables[BLK_IDX_VL_FORWARDING_PARAMS].entry_count == 0 && 7328c2ecf20Sopenharmony_ci has_critical_links) 7338c2ecf20Sopenharmony_ci return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION; 7348c2ecf20Sopenharmony_ci } 7358c2ecf20Sopenharmony_ci 7368c2ecf20Sopenharmony_ci if (tables[BLK_IDX_L2_POLICING].entry_count == 0) 7378c2ecf20Sopenharmony_ci return SJA1105_MISSING_L2_POLICING_TABLE; 7388c2ecf20Sopenharmony_ci 7398c2ecf20Sopenharmony_ci if (tables[BLK_IDX_VLAN_LOOKUP].entry_count == 0) 7408c2ecf20Sopenharmony_ci return SJA1105_MISSING_VLAN_TABLE; 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_L2_FORWARDING)) 7438c2ecf20Sopenharmony_ci return SJA1105_MISSING_L2_FORWARDING_TABLE; 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_MAC_CONFIG)) 7468c2ecf20Sopenharmony_ci return SJA1105_MISSING_MAC_TABLE; 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_L2_FORWARDING_PARAMS)) 7498c2ecf20Sopenharmony_ci return SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE; 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_GENERAL_PARAMS)) 7528c2ecf20Sopenharmony_ci return SJA1105_MISSING_GENERAL_PARAMS_TABLE; 7538c2ecf20Sopenharmony_ci 7548c2ecf20Sopenharmony_ci if (!IS_FULL(BLK_IDX_XMII_PARAMS)) 7558c2ecf20Sopenharmony_ci return SJA1105_MISSING_XMII_TABLE; 7568c2ecf20Sopenharmony_ci 7578c2ecf20Sopenharmony_ci return static_config_check_memory_size(tables); 7588c2ecf20Sopenharmony_ci#undef IS_FULL 7598c2ecf20Sopenharmony_ci} 7608c2ecf20Sopenharmony_ci 7618c2ecf20Sopenharmony_civoid 7628c2ecf20Sopenharmony_cisja1105_static_config_pack(void *buf, struct sja1105_static_config *config) 7638c2ecf20Sopenharmony_ci{ 7648c2ecf20Sopenharmony_ci struct sja1105_table_header header = {0}; 7658c2ecf20Sopenharmony_ci enum sja1105_blk_idx i; 7668c2ecf20Sopenharmony_ci char *p = buf; 7678c2ecf20Sopenharmony_ci int j; 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_ci sja1105_pack(p, &config->device_id, 31, 0, 4); 7708c2ecf20Sopenharmony_ci p += SJA1105_SIZE_DEVICE_ID; 7718c2ecf20Sopenharmony_ci 7728c2ecf20Sopenharmony_ci for (i = 0; i < BLK_IDX_MAX; i++) { 7738c2ecf20Sopenharmony_ci const struct sja1105_table *table; 7748c2ecf20Sopenharmony_ci char *table_start; 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_ci table = &config->tables[i]; 7778c2ecf20Sopenharmony_ci if (!table->entry_count) 7788c2ecf20Sopenharmony_ci continue; 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_ci header.block_id = blk_id_map[i]; 7818c2ecf20Sopenharmony_ci header.len = table->entry_count * 7828c2ecf20Sopenharmony_ci table->ops->packed_entry_size / 4; 7838c2ecf20Sopenharmony_ci sja1105_table_header_pack_with_crc(p, &header); 7848c2ecf20Sopenharmony_ci p += SJA1105_SIZE_TABLE_HEADER; 7858c2ecf20Sopenharmony_ci table_start = p; 7868c2ecf20Sopenharmony_ci for (j = 0; j < table->entry_count; j++) { 7878c2ecf20Sopenharmony_ci u8 *entry_ptr = table->entries; 7888c2ecf20Sopenharmony_ci 7898c2ecf20Sopenharmony_ci entry_ptr += j * table->ops->unpacked_entry_size; 7908c2ecf20Sopenharmony_ci memset(p, 0, table->ops->packed_entry_size); 7918c2ecf20Sopenharmony_ci table->ops->packing(p, entry_ptr, PACK); 7928c2ecf20Sopenharmony_ci p += table->ops->packed_entry_size; 7938c2ecf20Sopenharmony_ci } 7948c2ecf20Sopenharmony_ci sja1105_table_write_crc(table_start, p); 7958c2ecf20Sopenharmony_ci p += 4; 7968c2ecf20Sopenharmony_ci } 7978c2ecf20Sopenharmony_ci /* Final header: 7988c2ecf20Sopenharmony_ci * Block ID does not matter 7998c2ecf20Sopenharmony_ci * Length of 0 marks that header is final 8008c2ecf20Sopenharmony_ci * CRC will be replaced on-the-fly on "config upload" 8018c2ecf20Sopenharmony_ci */ 8028c2ecf20Sopenharmony_ci header.block_id = 0; 8038c2ecf20Sopenharmony_ci header.len = 0; 8048c2ecf20Sopenharmony_ci header.crc = 0xDEADBEEF; 8058c2ecf20Sopenharmony_ci memset(p, 0, SJA1105_SIZE_TABLE_HEADER); 8068c2ecf20Sopenharmony_ci sja1105_table_header_packing(p, &header, PACK); 8078c2ecf20Sopenharmony_ci} 8088c2ecf20Sopenharmony_ci 8098c2ecf20Sopenharmony_cisize_t 8108c2ecf20Sopenharmony_cisja1105_static_config_get_length(const struct sja1105_static_config *config) 8118c2ecf20Sopenharmony_ci{ 8128c2ecf20Sopenharmony_ci unsigned int sum; 8138c2ecf20Sopenharmony_ci unsigned int header_count; 8148c2ecf20Sopenharmony_ci enum sja1105_blk_idx i; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci /* Ending header */ 8178c2ecf20Sopenharmony_ci header_count = 1; 8188c2ecf20Sopenharmony_ci sum = SJA1105_SIZE_DEVICE_ID; 8198c2ecf20Sopenharmony_ci 8208c2ecf20Sopenharmony_ci /* Tables (headers and entries) */ 8218c2ecf20Sopenharmony_ci for (i = 0; i < BLK_IDX_MAX; i++) { 8228c2ecf20Sopenharmony_ci const struct sja1105_table *table; 8238c2ecf20Sopenharmony_ci 8248c2ecf20Sopenharmony_ci table = &config->tables[i]; 8258c2ecf20Sopenharmony_ci if (table->entry_count) 8268c2ecf20Sopenharmony_ci header_count++; 8278c2ecf20Sopenharmony_ci 8288c2ecf20Sopenharmony_ci sum += table->ops->packed_entry_size * table->entry_count; 8298c2ecf20Sopenharmony_ci } 8308c2ecf20Sopenharmony_ci /* Headers have an additional CRC at the end */ 8318c2ecf20Sopenharmony_ci sum += header_count * (SJA1105_SIZE_TABLE_HEADER + 4); 8328c2ecf20Sopenharmony_ci /* Last header does not have an extra CRC because there is no data */ 8338c2ecf20Sopenharmony_ci sum -= 4; 8348c2ecf20Sopenharmony_ci 8358c2ecf20Sopenharmony_ci return sum; 8368c2ecf20Sopenharmony_ci} 8378c2ecf20Sopenharmony_ci 8388c2ecf20Sopenharmony_ci/* Compatibility matrices */ 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_ci/* SJA1105E: First generation, no TTEthernet */ 8418c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = { 8428c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = { 8438c2ecf20Sopenharmony_ci .packing = sja1105et_l2_lookup_entry_packing, 8448c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry), 8458c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY, 8468c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT, 8478c2ecf20Sopenharmony_ci }, 8488c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = { 8498c2ecf20Sopenharmony_ci .packing = sja1105_l2_policing_entry_packing, 8508c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry), 8518c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY, 8528c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT, 8538c2ecf20Sopenharmony_ci }, 8548c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = { 8558c2ecf20Sopenharmony_ci .packing = sja1105_vlan_lookup_entry_packing, 8568c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry), 8578c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY, 8588c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT, 8598c2ecf20Sopenharmony_ci }, 8608c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = { 8618c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_entry_packing, 8628c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry), 8638c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY, 8648c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT, 8658c2ecf20Sopenharmony_ci }, 8668c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = { 8678c2ecf20Sopenharmony_ci .packing = sja1105et_mac_config_entry_packing, 8688c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry), 8698c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY, 8708c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT, 8718c2ecf20Sopenharmony_ci }, 8728c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = { 8738c2ecf20Sopenharmony_ci .packing = sja1105et_l2_lookup_params_entry_packing, 8748c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry), 8758c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY, 8768c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT, 8778c2ecf20Sopenharmony_ci }, 8788c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = { 8798c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_params_entry_packing, 8808c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry), 8818c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY, 8828c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT, 8838c2ecf20Sopenharmony_ci }, 8848c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = { 8858c2ecf20Sopenharmony_ci .packing = sja1105et_avb_params_entry_packing, 8868c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_avb_params_entry), 8878c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY, 8888c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT, 8898c2ecf20Sopenharmony_ci }, 8908c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = { 8918c2ecf20Sopenharmony_ci .packing = sja1105et_general_params_entry_packing, 8928c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_general_params_entry), 8938c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY, 8948c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT, 8958c2ecf20Sopenharmony_ci }, 8968c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = { 8978c2ecf20Sopenharmony_ci .packing = sja1105_retagging_entry_packing, 8988c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_retagging_entry), 8998c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY, 9008c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_RETAGGING_COUNT, 9018c2ecf20Sopenharmony_ci }, 9028c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = { 9038c2ecf20Sopenharmony_ci .packing = sja1105_xmii_params_entry_packing, 9048c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry), 9058c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY, 9068c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT, 9078c2ecf20Sopenharmony_ci }, 9088c2ecf20Sopenharmony_ci}; 9098c2ecf20Sopenharmony_ci 9108c2ecf20Sopenharmony_ci/* SJA1105T: First generation, TTEthernet */ 9118c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = { 9128c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE] = { 9138c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_packing, 9148c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry), 9158c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY, 9168c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_COUNT, 9178c2ecf20Sopenharmony_ci }, 9188c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS] = { 9198c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_points_entry_packing, 9208c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry), 9218c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY, 9228c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT, 9238c2ecf20Sopenharmony_ci }, 9248c2ecf20Sopenharmony_ci [BLK_IDX_VL_LOOKUP] = { 9258c2ecf20Sopenharmony_ci .packing = sja1105_vl_lookup_entry_packing, 9268c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry), 9278c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY, 9288c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT, 9298c2ecf20Sopenharmony_ci }, 9308c2ecf20Sopenharmony_ci [BLK_IDX_VL_POLICING] = { 9318c2ecf20Sopenharmony_ci .packing = sja1105_vl_policing_entry_packing, 9328c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry), 9338c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY, 9348c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_POLICING_COUNT, 9358c2ecf20Sopenharmony_ci }, 9368c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING] = { 9378c2ecf20Sopenharmony_ci .packing = sja1105_vl_forwarding_entry_packing, 9388c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry), 9398c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY, 9408c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT, 9418c2ecf20Sopenharmony_ci }, 9428c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = { 9438c2ecf20Sopenharmony_ci .packing = sja1105et_l2_lookup_entry_packing, 9448c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry), 9458c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY, 9468c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT, 9478c2ecf20Sopenharmony_ci }, 9488c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = { 9498c2ecf20Sopenharmony_ci .packing = sja1105_l2_policing_entry_packing, 9508c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry), 9518c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY, 9528c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT, 9538c2ecf20Sopenharmony_ci }, 9548c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = { 9558c2ecf20Sopenharmony_ci .packing = sja1105_vlan_lookup_entry_packing, 9568c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry), 9578c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY, 9588c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT, 9598c2ecf20Sopenharmony_ci }, 9608c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = { 9618c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_entry_packing, 9628c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry), 9638c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY, 9648c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT, 9658c2ecf20Sopenharmony_ci }, 9668c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = { 9678c2ecf20Sopenharmony_ci .packing = sja1105et_mac_config_entry_packing, 9688c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry), 9698c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY, 9708c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT, 9718c2ecf20Sopenharmony_ci }, 9728c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_PARAMS] = { 9738c2ecf20Sopenharmony_ci .packing = sja1105_schedule_params_entry_packing, 9748c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry), 9758c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY, 9768c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT, 9778c2ecf20Sopenharmony_ci }, 9788c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = { 9798c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_points_params_entry_packing, 9808c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry), 9818c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY, 9828c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT, 9838c2ecf20Sopenharmony_ci }, 9848c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING_PARAMS] = { 9858c2ecf20Sopenharmony_ci .packing = sja1105_vl_forwarding_params_entry_packing, 9868c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry), 9878c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY, 9888c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT, 9898c2ecf20Sopenharmony_ci }, 9908c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = { 9918c2ecf20Sopenharmony_ci .packing = sja1105et_l2_lookup_params_entry_packing, 9928c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry), 9938c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY, 9948c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT, 9958c2ecf20Sopenharmony_ci }, 9968c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = { 9978c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_params_entry_packing, 9988c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry), 9998c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY, 10008c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT, 10018c2ecf20Sopenharmony_ci }, 10028c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = { 10038c2ecf20Sopenharmony_ci .packing = sja1105et_avb_params_entry_packing, 10048c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_avb_params_entry), 10058c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY, 10068c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT, 10078c2ecf20Sopenharmony_ci }, 10088c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = { 10098c2ecf20Sopenharmony_ci .packing = sja1105et_general_params_entry_packing, 10108c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_general_params_entry), 10118c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY, 10128c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT, 10138c2ecf20Sopenharmony_ci }, 10148c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = { 10158c2ecf20Sopenharmony_ci .packing = sja1105_retagging_entry_packing, 10168c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_retagging_entry), 10178c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY, 10188c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_RETAGGING_COUNT, 10198c2ecf20Sopenharmony_ci }, 10208c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = { 10218c2ecf20Sopenharmony_ci .packing = sja1105_xmii_params_entry_packing, 10228c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry), 10238c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY, 10248c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT, 10258c2ecf20Sopenharmony_ci }, 10268c2ecf20Sopenharmony_ci}; 10278c2ecf20Sopenharmony_ci 10288c2ecf20Sopenharmony_ci/* SJA1105P: Second generation, no TTEthernet, no SGMII */ 10298c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = { 10308c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = { 10318c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_entry_packing, 10328c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry), 10338c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY, 10348c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT, 10358c2ecf20Sopenharmony_ci }, 10368c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = { 10378c2ecf20Sopenharmony_ci .packing = sja1105_l2_policing_entry_packing, 10388c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry), 10398c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY, 10408c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT, 10418c2ecf20Sopenharmony_ci }, 10428c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = { 10438c2ecf20Sopenharmony_ci .packing = sja1105_vlan_lookup_entry_packing, 10448c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry), 10458c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY, 10468c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT, 10478c2ecf20Sopenharmony_ci }, 10488c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = { 10498c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_entry_packing, 10508c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry), 10518c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY, 10528c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT, 10538c2ecf20Sopenharmony_ci }, 10548c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = { 10558c2ecf20Sopenharmony_ci .packing = sja1105pqrs_mac_config_entry_packing, 10568c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry), 10578c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY, 10588c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT, 10598c2ecf20Sopenharmony_ci }, 10608c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = { 10618c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_params_entry_packing, 10628c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry), 10638c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY, 10648c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT, 10658c2ecf20Sopenharmony_ci }, 10668c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = { 10678c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_params_entry_packing, 10688c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry), 10698c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY, 10708c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT, 10718c2ecf20Sopenharmony_ci }, 10728c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = { 10738c2ecf20Sopenharmony_ci .packing = sja1105pqrs_avb_params_entry_packing, 10748c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_avb_params_entry), 10758c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY, 10768c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT, 10778c2ecf20Sopenharmony_ci }, 10788c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = { 10798c2ecf20Sopenharmony_ci .packing = sja1105pqrs_general_params_entry_packing, 10808c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_general_params_entry), 10818c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY, 10828c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT, 10838c2ecf20Sopenharmony_ci }, 10848c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = { 10858c2ecf20Sopenharmony_ci .packing = sja1105_retagging_entry_packing, 10868c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_retagging_entry), 10878c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY, 10888c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_RETAGGING_COUNT, 10898c2ecf20Sopenharmony_ci }, 10908c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = { 10918c2ecf20Sopenharmony_ci .packing = sja1105_xmii_params_entry_packing, 10928c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry), 10938c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY, 10948c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT, 10958c2ecf20Sopenharmony_ci }, 10968c2ecf20Sopenharmony_ci}; 10978c2ecf20Sopenharmony_ci 10988c2ecf20Sopenharmony_ci/* SJA1105Q: Second generation, TTEthernet, no SGMII */ 10998c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = { 11008c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE] = { 11018c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_packing, 11028c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry), 11038c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY, 11048c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_COUNT, 11058c2ecf20Sopenharmony_ci }, 11068c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS] = { 11078c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_points_entry_packing, 11088c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry), 11098c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY, 11108c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT, 11118c2ecf20Sopenharmony_ci }, 11128c2ecf20Sopenharmony_ci [BLK_IDX_VL_LOOKUP] = { 11138c2ecf20Sopenharmony_ci .packing = sja1105_vl_lookup_entry_packing, 11148c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry), 11158c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY, 11168c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT, 11178c2ecf20Sopenharmony_ci }, 11188c2ecf20Sopenharmony_ci [BLK_IDX_VL_POLICING] = { 11198c2ecf20Sopenharmony_ci .packing = sja1105_vl_policing_entry_packing, 11208c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry), 11218c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY, 11228c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_POLICING_COUNT, 11238c2ecf20Sopenharmony_ci }, 11248c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING] = { 11258c2ecf20Sopenharmony_ci .packing = sja1105_vl_forwarding_entry_packing, 11268c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry), 11278c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY, 11288c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT, 11298c2ecf20Sopenharmony_ci }, 11308c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = { 11318c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_entry_packing, 11328c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry), 11338c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY, 11348c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT, 11358c2ecf20Sopenharmony_ci }, 11368c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = { 11378c2ecf20Sopenharmony_ci .packing = sja1105_l2_policing_entry_packing, 11388c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry), 11398c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY, 11408c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT, 11418c2ecf20Sopenharmony_ci }, 11428c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = { 11438c2ecf20Sopenharmony_ci .packing = sja1105_vlan_lookup_entry_packing, 11448c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry), 11458c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY, 11468c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT, 11478c2ecf20Sopenharmony_ci }, 11488c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = { 11498c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_entry_packing, 11508c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry), 11518c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY, 11528c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT, 11538c2ecf20Sopenharmony_ci }, 11548c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = { 11558c2ecf20Sopenharmony_ci .packing = sja1105pqrs_mac_config_entry_packing, 11568c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry), 11578c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY, 11588c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT, 11598c2ecf20Sopenharmony_ci }, 11608c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_PARAMS] = { 11618c2ecf20Sopenharmony_ci .packing = sja1105_schedule_params_entry_packing, 11628c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry), 11638c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY, 11648c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT, 11658c2ecf20Sopenharmony_ci }, 11668c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = { 11678c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_points_params_entry_packing, 11688c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry), 11698c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY, 11708c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT, 11718c2ecf20Sopenharmony_ci }, 11728c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING_PARAMS] = { 11738c2ecf20Sopenharmony_ci .packing = sja1105_vl_forwarding_params_entry_packing, 11748c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry), 11758c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY, 11768c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT, 11778c2ecf20Sopenharmony_ci }, 11788c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = { 11798c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_params_entry_packing, 11808c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry), 11818c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY, 11828c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT, 11838c2ecf20Sopenharmony_ci }, 11848c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = { 11858c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_params_entry_packing, 11868c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry), 11878c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY, 11888c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT, 11898c2ecf20Sopenharmony_ci }, 11908c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = { 11918c2ecf20Sopenharmony_ci .packing = sja1105pqrs_avb_params_entry_packing, 11928c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_avb_params_entry), 11938c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY, 11948c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT, 11958c2ecf20Sopenharmony_ci }, 11968c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = { 11978c2ecf20Sopenharmony_ci .packing = sja1105pqrs_general_params_entry_packing, 11988c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_general_params_entry), 11998c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY, 12008c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT, 12018c2ecf20Sopenharmony_ci }, 12028c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = { 12038c2ecf20Sopenharmony_ci .packing = sja1105_retagging_entry_packing, 12048c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_retagging_entry), 12058c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY, 12068c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_RETAGGING_COUNT, 12078c2ecf20Sopenharmony_ci }, 12088c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = { 12098c2ecf20Sopenharmony_ci .packing = sja1105_xmii_params_entry_packing, 12108c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry), 12118c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY, 12128c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT, 12138c2ecf20Sopenharmony_ci }, 12148c2ecf20Sopenharmony_ci}; 12158c2ecf20Sopenharmony_ci 12168c2ecf20Sopenharmony_ci/* SJA1105R: Second generation, no TTEthernet, SGMII */ 12178c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = { 12188c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = { 12198c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_entry_packing, 12208c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry), 12218c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY, 12228c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT, 12238c2ecf20Sopenharmony_ci }, 12248c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = { 12258c2ecf20Sopenharmony_ci .packing = sja1105_l2_policing_entry_packing, 12268c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry), 12278c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY, 12288c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT, 12298c2ecf20Sopenharmony_ci }, 12308c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = { 12318c2ecf20Sopenharmony_ci .packing = sja1105_vlan_lookup_entry_packing, 12328c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry), 12338c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY, 12348c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT, 12358c2ecf20Sopenharmony_ci }, 12368c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = { 12378c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_entry_packing, 12388c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry), 12398c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY, 12408c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT, 12418c2ecf20Sopenharmony_ci }, 12428c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = { 12438c2ecf20Sopenharmony_ci .packing = sja1105pqrs_mac_config_entry_packing, 12448c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry), 12458c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY, 12468c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT, 12478c2ecf20Sopenharmony_ci }, 12488c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = { 12498c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_params_entry_packing, 12508c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry), 12518c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY, 12528c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT, 12538c2ecf20Sopenharmony_ci }, 12548c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = { 12558c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_params_entry_packing, 12568c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry), 12578c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY, 12588c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT, 12598c2ecf20Sopenharmony_ci }, 12608c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = { 12618c2ecf20Sopenharmony_ci .packing = sja1105pqrs_avb_params_entry_packing, 12628c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_avb_params_entry), 12638c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY, 12648c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT, 12658c2ecf20Sopenharmony_ci }, 12668c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = { 12678c2ecf20Sopenharmony_ci .packing = sja1105pqrs_general_params_entry_packing, 12688c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_general_params_entry), 12698c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY, 12708c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT, 12718c2ecf20Sopenharmony_ci }, 12728c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = { 12738c2ecf20Sopenharmony_ci .packing = sja1105_retagging_entry_packing, 12748c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_retagging_entry), 12758c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY, 12768c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_RETAGGING_COUNT, 12778c2ecf20Sopenharmony_ci }, 12788c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = { 12798c2ecf20Sopenharmony_ci .packing = sja1105_xmii_params_entry_packing, 12808c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry), 12818c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY, 12828c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT, 12838c2ecf20Sopenharmony_ci }, 12848c2ecf20Sopenharmony_ci}; 12858c2ecf20Sopenharmony_ci 12868c2ecf20Sopenharmony_ci/* SJA1105S: Second generation, TTEthernet, SGMII */ 12878c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX] = { 12888c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE] = { 12898c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_packing, 12908c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry), 12918c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY, 12928c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_COUNT, 12938c2ecf20Sopenharmony_ci }, 12948c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS] = { 12958c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_points_entry_packing, 12968c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry), 12978c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY, 12988c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT, 12998c2ecf20Sopenharmony_ci }, 13008c2ecf20Sopenharmony_ci [BLK_IDX_VL_LOOKUP] = { 13018c2ecf20Sopenharmony_ci .packing = sja1105_vl_lookup_entry_packing, 13028c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry), 13038c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY, 13048c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT, 13058c2ecf20Sopenharmony_ci }, 13068c2ecf20Sopenharmony_ci [BLK_IDX_VL_POLICING] = { 13078c2ecf20Sopenharmony_ci .packing = sja1105_vl_policing_entry_packing, 13088c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry), 13098c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY, 13108c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_POLICING_COUNT, 13118c2ecf20Sopenharmony_ci }, 13128c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING] = { 13138c2ecf20Sopenharmony_ci .packing = sja1105_vl_forwarding_entry_packing, 13148c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry), 13158c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY, 13168c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT, 13178c2ecf20Sopenharmony_ci }, 13188c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP] = { 13198c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_entry_packing, 13208c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry), 13218c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY, 13228c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT, 13238c2ecf20Sopenharmony_ci }, 13248c2ecf20Sopenharmony_ci [BLK_IDX_L2_POLICING] = { 13258c2ecf20Sopenharmony_ci .packing = sja1105_l2_policing_entry_packing, 13268c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry), 13278c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY, 13288c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_POLICING_COUNT, 13298c2ecf20Sopenharmony_ci }, 13308c2ecf20Sopenharmony_ci [BLK_IDX_VLAN_LOOKUP] = { 13318c2ecf20Sopenharmony_ci .packing = sja1105_vlan_lookup_entry_packing, 13328c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry), 13338c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY, 13348c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT, 13358c2ecf20Sopenharmony_ci }, 13368c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING] = { 13378c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_entry_packing, 13388c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry), 13398c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY, 13408c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT, 13418c2ecf20Sopenharmony_ci }, 13428c2ecf20Sopenharmony_ci [BLK_IDX_MAC_CONFIG] = { 13438c2ecf20Sopenharmony_ci .packing = sja1105pqrs_mac_config_entry_packing, 13448c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_mac_config_entry), 13458c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY, 13468c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT, 13478c2ecf20Sopenharmony_ci }, 13488c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_PARAMS] = { 13498c2ecf20Sopenharmony_ci .packing = sja1105_schedule_params_entry_packing, 13508c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry), 13518c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY, 13528c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT, 13538c2ecf20Sopenharmony_ci }, 13548c2ecf20Sopenharmony_ci [BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = { 13558c2ecf20Sopenharmony_ci .packing = sja1105_schedule_entry_points_params_entry_packing, 13568c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry), 13578c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY, 13588c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT, 13598c2ecf20Sopenharmony_ci }, 13608c2ecf20Sopenharmony_ci [BLK_IDX_VL_FORWARDING_PARAMS] = { 13618c2ecf20Sopenharmony_ci .packing = sja1105_vl_forwarding_params_entry_packing, 13628c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry), 13638c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY, 13648c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT, 13658c2ecf20Sopenharmony_ci }, 13668c2ecf20Sopenharmony_ci [BLK_IDX_L2_LOOKUP_PARAMS] = { 13678c2ecf20Sopenharmony_ci .packing = sja1105pqrs_l2_lookup_params_entry_packing, 13688c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry), 13698c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY, 13708c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT, 13718c2ecf20Sopenharmony_ci }, 13728c2ecf20Sopenharmony_ci [BLK_IDX_L2_FORWARDING_PARAMS] = { 13738c2ecf20Sopenharmony_ci .packing = sja1105_l2_forwarding_params_entry_packing, 13748c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry), 13758c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY, 13768c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT, 13778c2ecf20Sopenharmony_ci }, 13788c2ecf20Sopenharmony_ci [BLK_IDX_AVB_PARAMS] = { 13798c2ecf20Sopenharmony_ci .packing = sja1105pqrs_avb_params_entry_packing, 13808c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_avb_params_entry), 13818c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY, 13828c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT, 13838c2ecf20Sopenharmony_ci }, 13848c2ecf20Sopenharmony_ci [BLK_IDX_GENERAL_PARAMS] = { 13858c2ecf20Sopenharmony_ci .packing = sja1105pqrs_general_params_entry_packing, 13868c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_general_params_entry), 13878c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY, 13888c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT, 13898c2ecf20Sopenharmony_ci }, 13908c2ecf20Sopenharmony_ci [BLK_IDX_RETAGGING] = { 13918c2ecf20Sopenharmony_ci .packing = sja1105_retagging_entry_packing, 13928c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_retagging_entry), 13938c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY, 13948c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_RETAGGING_COUNT, 13958c2ecf20Sopenharmony_ci }, 13968c2ecf20Sopenharmony_ci [BLK_IDX_XMII_PARAMS] = { 13978c2ecf20Sopenharmony_ci .packing = sja1105_xmii_params_entry_packing, 13988c2ecf20Sopenharmony_ci .unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry), 13998c2ecf20Sopenharmony_ci .packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY, 14008c2ecf20Sopenharmony_ci .max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT, 14018c2ecf20Sopenharmony_ci }, 14028c2ecf20Sopenharmony_ci}; 14038c2ecf20Sopenharmony_ci 14048c2ecf20Sopenharmony_ciint sja1105_static_config_init(struct sja1105_static_config *config, 14058c2ecf20Sopenharmony_ci const struct sja1105_table_ops *static_ops, 14068c2ecf20Sopenharmony_ci u64 device_id) 14078c2ecf20Sopenharmony_ci{ 14088c2ecf20Sopenharmony_ci enum sja1105_blk_idx i; 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_ci *config = (struct sja1105_static_config) {0}; 14118c2ecf20Sopenharmony_ci 14128c2ecf20Sopenharmony_ci /* Transfer static_ops array from priv into per-table ops 14138c2ecf20Sopenharmony_ci * for handier access 14148c2ecf20Sopenharmony_ci */ 14158c2ecf20Sopenharmony_ci for (i = 0; i < BLK_IDX_MAX; i++) 14168c2ecf20Sopenharmony_ci config->tables[i].ops = &static_ops[i]; 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci config->device_id = device_id; 14198c2ecf20Sopenharmony_ci return 0; 14208c2ecf20Sopenharmony_ci} 14218c2ecf20Sopenharmony_ci 14228c2ecf20Sopenharmony_civoid sja1105_static_config_free(struct sja1105_static_config *config) 14238c2ecf20Sopenharmony_ci{ 14248c2ecf20Sopenharmony_ci enum sja1105_blk_idx i; 14258c2ecf20Sopenharmony_ci 14268c2ecf20Sopenharmony_ci for (i = 0; i < BLK_IDX_MAX; i++) { 14278c2ecf20Sopenharmony_ci if (config->tables[i].entry_count) { 14288c2ecf20Sopenharmony_ci kfree(config->tables[i].entries); 14298c2ecf20Sopenharmony_ci config->tables[i].entry_count = 0; 14308c2ecf20Sopenharmony_ci } 14318c2ecf20Sopenharmony_ci } 14328c2ecf20Sopenharmony_ci} 14338c2ecf20Sopenharmony_ci 14348c2ecf20Sopenharmony_ciint sja1105_table_delete_entry(struct sja1105_table *table, int i) 14358c2ecf20Sopenharmony_ci{ 14368c2ecf20Sopenharmony_ci size_t entry_size = table->ops->unpacked_entry_size; 14378c2ecf20Sopenharmony_ci u8 *entries = table->entries; 14388c2ecf20Sopenharmony_ci 14398c2ecf20Sopenharmony_ci if (i > table->entry_count) 14408c2ecf20Sopenharmony_ci return -ERANGE; 14418c2ecf20Sopenharmony_ci 14428c2ecf20Sopenharmony_ci memmove(entries + i * entry_size, entries + (i + 1) * entry_size, 14438c2ecf20Sopenharmony_ci (table->entry_count - i) * entry_size); 14448c2ecf20Sopenharmony_ci 14458c2ecf20Sopenharmony_ci table->entry_count--; 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci return 0; 14488c2ecf20Sopenharmony_ci} 14498c2ecf20Sopenharmony_ci 14508c2ecf20Sopenharmony_ci/* No pointers to table->entries should be kept when this is called. */ 14518c2ecf20Sopenharmony_ciint sja1105_table_resize(struct sja1105_table *table, size_t new_count) 14528c2ecf20Sopenharmony_ci{ 14538c2ecf20Sopenharmony_ci size_t entry_size = table->ops->unpacked_entry_size; 14548c2ecf20Sopenharmony_ci void *new_entries, *old_entries = table->entries; 14558c2ecf20Sopenharmony_ci 14568c2ecf20Sopenharmony_ci if (new_count > table->ops->max_entry_count) 14578c2ecf20Sopenharmony_ci return -ERANGE; 14588c2ecf20Sopenharmony_ci 14598c2ecf20Sopenharmony_ci new_entries = kcalloc(new_count, entry_size, GFP_KERNEL); 14608c2ecf20Sopenharmony_ci if (!new_entries) 14618c2ecf20Sopenharmony_ci return -ENOMEM; 14628c2ecf20Sopenharmony_ci 14638c2ecf20Sopenharmony_ci memcpy(new_entries, old_entries, min(new_count, table->entry_count) * 14648c2ecf20Sopenharmony_ci entry_size); 14658c2ecf20Sopenharmony_ci 14668c2ecf20Sopenharmony_ci table->entries = new_entries; 14678c2ecf20Sopenharmony_ci table->entry_count = new_count; 14688c2ecf20Sopenharmony_ci kfree(old_entries); 14698c2ecf20Sopenharmony_ci return 0; 14708c2ecf20Sopenharmony_ci} 1471