162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause
262306a36Sopenharmony_ci/* Copyright 2016-2018 NXP
362306a36Sopenharmony_ci * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include "sja1105_static_config.h"
662306a36Sopenharmony_ci#include <linux/crc32.h>
762306a36Sopenharmony_ci#include <linux/slab.h>
862306a36Sopenharmony_ci#include <linux/string.h>
962306a36Sopenharmony_ci#include <linux/errno.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* Convenience wrappers over the generic packing functions. These take into
1262306a36Sopenharmony_ci * account the SJA1105 memory layout quirks and provide some level of
1362306a36Sopenharmony_ci * programmer protection against incorrect API use. The errors are not expected
1462306a36Sopenharmony_ci * to occur durring runtime, therefore printing and swallowing them here is
1562306a36Sopenharmony_ci * appropriate instead of clutterring up higher-level code.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_civoid sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	int rc = packing(buf, (u64 *)val, start, end, len,
2062306a36Sopenharmony_ci			 PACK, QUIRK_LSW32_IS_FIRST);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	if (likely(!rc))
2362306a36Sopenharmony_ci		return;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	if (rc == -EINVAL) {
2662306a36Sopenharmony_ci		pr_err("Start bit (%d) expected to be larger than end (%d)\n",
2762306a36Sopenharmony_ci		       start, end);
2862306a36Sopenharmony_ci	} else if (rc == -ERANGE) {
2962306a36Sopenharmony_ci		if ((start - end + 1) > 64)
3062306a36Sopenharmony_ci			pr_err("Field %d-%d too large for 64 bits!\n",
3162306a36Sopenharmony_ci			       start, end);
3262306a36Sopenharmony_ci		else
3362306a36Sopenharmony_ci			pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n",
3462306a36Sopenharmony_ci			       *val, start, end);
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci	dump_stack();
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_civoid sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	int rc = packing((void *)buf, val, start, end, len,
4262306a36Sopenharmony_ci			 UNPACK, QUIRK_LSW32_IS_FIRST);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	if (likely(!rc))
4562306a36Sopenharmony_ci		return;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	if (rc == -EINVAL)
4862306a36Sopenharmony_ci		pr_err("Start bit (%d) expected to be larger than end (%d)\n",
4962306a36Sopenharmony_ci		       start, end);
5062306a36Sopenharmony_ci	else if (rc == -ERANGE)
5162306a36Sopenharmony_ci		pr_err("Field %d-%d too large for 64 bits!\n",
5262306a36Sopenharmony_ci		       start, end);
5362306a36Sopenharmony_ci	dump_stack();
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_civoid sja1105_packing(void *buf, u64 *val, int start, int end,
5762306a36Sopenharmony_ci		     size_t len, enum packing_op op)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	int rc = packing(buf, val, start, end, len, op, QUIRK_LSW32_IS_FIRST);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	if (likely(!rc))
6262306a36Sopenharmony_ci		return;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	if (rc == -EINVAL) {
6562306a36Sopenharmony_ci		pr_err("Start bit (%d) expected to be larger than end (%d)\n",
6662306a36Sopenharmony_ci		       start, end);
6762306a36Sopenharmony_ci	} else if (rc == -ERANGE) {
6862306a36Sopenharmony_ci		if ((start - end + 1) > 64)
6962306a36Sopenharmony_ci			pr_err("Field %d-%d too large for 64 bits!\n",
7062306a36Sopenharmony_ci			       start, end);
7162306a36Sopenharmony_ci		else
7262306a36Sopenharmony_ci			pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n",
7362306a36Sopenharmony_ci			       *val, start, end);
7462306a36Sopenharmony_ci	}
7562306a36Sopenharmony_ci	dump_stack();
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/* Little-endian Ethernet CRC32 of data packed as big-endian u32 words */
7962306a36Sopenharmony_ciu32 sja1105_crc32(const void *buf, size_t len)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	unsigned int i;
8262306a36Sopenharmony_ci	u64 word;
8362306a36Sopenharmony_ci	u32 crc;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	/* seed */
8662306a36Sopenharmony_ci	crc = ~0;
8762306a36Sopenharmony_ci	for (i = 0; i < len; i += 4) {
8862306a36Sopenharmony_ci		sja1105_unpack(buf + i, &word, 31, 0, 4);
8962306a36Sopenharmony_ci		crc = crc32_le(crc, (u8 *)&word, 4);
9062306a36Sopenharmony_ci	}
9162306a36Sopenharmony_ci	return ~crc;
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic size_t sja1105et_avb_params_entry_packing(void *buf, void *entry_ptr,
9562306a36Sopenharmony_ci						 enum packing_op op)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY;
9862306a36Sopenharmony_ci	struct sja1105_avb_params_entry *entry = entry_ptr;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destmeta, 95, 48, size, op);
10162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->srcmeta,  47,  0, size, op);
10262306a36Sopenharmony_ci	return size;
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cisize_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
10662306a36Sopenharmony_ci					    enum packing_op op)
10762306a36Sopenharmony_ci{
10862306a36Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY;
10962306a36Sopenharmony_ci	struct sja1105_avb_params_entry *entry = entry_ptr;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->cas_master, 126, 126, size, op);
11262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destmeta,   125,  78, size, op);
11362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->srcmeta,     77,  30, size, op);
11462306a36Sopenharmony_ci	return size;
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic size_t sja1105et_general_params_entry_packing(void *buf, void *entry_ptr,
11862306a36Sopenharmony_ci						     enum packing_op op)
11962306a36Sopenharmony_ci{
12062306a36Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY;
12162306a36Sopenharmony_ci	struct sja1105_general_params_entry *entry = entry_ptr;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vllupformat, 319, 319, size, op);
12462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_ptacu,  318, 318, size, op);
12562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->switchid,    317, 315, size, op);
12662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->hostprio,    314, 312, size, op);
12762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres1, 311, 264, size, op);
12862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres0, 263, 216, size, op);
12962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt1,    215, 168, size, op);
13062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt0,    167, 120, size, op);
13162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt1, 119, 119, size, op);
13262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt0, 118, 118, size, op);
13362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta1,  117, 117, size, op);
13462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta0,  116, 116, size, op);
13562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->casc_port,   115, 113, size, op);
13662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->host_port,   112, 110, size, op);
13762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_port,   109, 107, size, op);
13862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlmarker,    106,  75, size, op);
13962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlmask,       74,  43, size, op);
14062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tpid,         42,  27, size, op);
14162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ignore2stf,   26,  26, size, op);
14262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tpid2,        25,  10, size, op);
14362306a36Sopenharmony_ci	return size;
14462306a36Sopenharmony_ci}
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci/* TPID and TPID2 are intentionally reversed so that semantic
14762306a36Sopenharmony_ci * compatibility with E/T is kept.
14862306a36Sopenharmony_ci */
14962306a36Sopenharmony_cisize_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
15062306a36Sopenharmony_ci						enum packing_op op)
15162306a36Sopenharmony_ci{
15262306a36Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY;
15362306a36Sopenharmony_ci	struct sja1105_general_params_entry *entry = entry_ptr;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vllupformat, 351, 351, size, op);
15662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_ptacu,  350, 350, size, op);
15762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->switchid,    349, 347, size, op);
15862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->hostprio,    346, 344, size, op);
15962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres1, 343, 296, size, op);
16062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres0, 295, 248, size, op);
16162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt1,    247, 200, size, op);
16262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt0,    199, 152, size, op);
16362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt1, 151, 151, size, op);
16462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt0, 150, 150, size, op);
16562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta1,  149, 149, size, op);
16662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta0,  148, 148, size, op);
16762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->casc_port,   147, 145, size, op);
16862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->host_port,   144, 142, size, op);
16962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_port,   141, 139, size, op);
17062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlmarker,    138, 107, size, op);
17162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlmask,      106,  75, size, op);
17262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tpid2,        74,  59, size, op);
17362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ignore2stf,   58,  58, size, op);
17462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tpid,         57,  42, size, op);
17562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->queue_ts,     41,  41, size, op);
17662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrvid,   40,  29, size, op);
17762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrpcp,   28,  26, size, op);
17862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrdei,   25,  25, size, op);
17962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->replay_port,  24,  22, size, op);
18062306a36Sopenharmony_ci	return size;
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cisize_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,
18462306a36Sopenharmony_ci					    enum packing_op op)
18562306a36Sopenharmony_ci{
18662306a36Sopenharmony_ci	struct sja1105_general_params_entry *entry = entry_ptr;
18762306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_GENERAL_PARAMS_ENTRY;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vllupformat,  447, 447, size, op);
19062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_ptacu,   446, 446, size, op);
19162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->switchid,     445, 442, size, op);
19262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->hostprio,     441, 439, size, op);
19362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres1,  438, 391, size, op);
19462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres0,  390, 343, size, op);
19562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt1,     342, 295, size, op);
19662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt0,     294, 247, size, op);
19762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt1,  246, 246, size, op);
19862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt0,  245, 245, size, op);
19962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta1,   244, 244, size, op);
20062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta0,   243, 243, size, op);
20162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->casc_port,    242, 232, size, op);
20262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->host_port,    231, 228, size, op);
20362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_port,    227, 224, size, op);
20462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlmarker,     223, 192, size, op);
20562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlmask,       191, 160, size, op);
20662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tpid2,        159, 144, size, op);
20762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ignore2stf,   143, 143, size, op);
20862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tpid,         142, 127, size, op);
20962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->queue_ts,     126, 126, size, op);
21062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrvid,   125, 114, size, op);
21162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrpcp,   113, 111, size, op);
21262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrdei,   110, 110, size, op);
21362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->replay_port,  109, 106, size, op);
21462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tdmaconfigidx, 70,  67, size, op);
21562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->header_type,   64,  49, size, op);
21662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tte_en,        16,  16, size, op);
21762306a36Sopenharmony_ci	return size;
21862306a36Sopenharmony_ci}
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic size_t
22162306a36Sopenharmony_cisja1105_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
22262306a36Sopenharmony_ci					   enum packing_op op)
22362306a36Sopenharmony_ci{
22462306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY;
22562306a36Sopenharmony_ci	struct sja1105_l2_forwarding_params_entry *entry = entry_ptr;
22662306a36Sopenharmony_ci	int offset, i;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->max_dynp, 95, 93, size, op);
22962306a36Sopenharmony_ci	for (i = 0, offset = 13; i < 8; i++, offset += 10)
23062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->part_spc[i],
23162306a36Sopenharmony_ci				offset + 9, offset + 0, size, op);
23262306a36Sopenharmony_ci	return size;
23362306a36Sopenharmony_ci}
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_cisize_t sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
23662306a36Sopenharmony_ci						  enum packing_op op)
23762306a36Sopenharmony_ci{
23862306a36Sopenharmony_ci	struct sja1105_l2_forwarding_params_entry *entry = entry_ptr;
23962306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY;
24062306a36Sopenharmony_ci	int offset, i;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->max_dynp, 95, 93, size, op);
24362306a36Sopenharmony_ci	for (i = 0, offset = 5; i < 8; i++, offset += 11)
24462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->part_spc[i],
24562306a36Sopenharmony_ci				offset + 10, offset + 0, size, op);
24662306a36Sopenharmony_ci	return size;
24762306a36Sopenharmony_ci}
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cisize_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
25062306a36Sopenharmony_ci					   enum packing_op op)
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY;
25362306a36Sopenharmony_ci	struct sja1105_l2_forwarding_entry *entry = entry_ptr;
25462306a36Sopenharmony_ci	int offset, i;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->bc_domain,  63, 59, size, op);
25762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->reach_port, 58, 54, size, op);
25862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->fl_domain,  53, 49, size, op);
25962306a36Sopenharmony_ci	for (i = 0, offset = 25; i < 8; i++, offset += 3)
26062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlan_pmap[i],
26162306a36Sopenharmony_ci				offset + 2, offset + 0, size, op);
26262306a36Sopenharmony_ci	return size;
26362306a36Sopenharmony_ci}
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cisize_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
26662306a36Sopenharmony_ci					   enum packing_op op)
26762306a36Sopenharmony_ci{
26862306a36Sopenharmony_ci	struct sja1105_l2_forwarding_entry *entry = entry_ptr;
26962306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY;
27062306a36Sopenharmony_ci	int offset, i;
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci	if (entry->type_egrpcp2outputq) {
27362306a36Sopenharmony_ci		for (i = 0, offset = 31; i < SJA1110_NUM_PORTS;
27462306a36Sopenharmony_ci		     i++, offset += 3) {
27562306a36Sopenharmony_ci			sja1105_packing(buf, &entry->vlan_pmap[i],
27662306a36Sopenharmony_ci					offset + 2, offset + 0, size, op);
27762306a36Sopenharmony_ci		}
27862306a36Sopenharmony_ci	} else {
27962306a36Sopenharmony_ci		sja1105_packing(buf, &entry->bc_domain,  63, 53, size, op);
28062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->reach_port, 52, 42, size, op);
28162306a36Sopenharmony_ci		sja1105_packing(buf, &entry->fl_domain,  41, 31, size, op);
28262306a36Sopenharmony_ci	}
28362306a36Sopenharmony_ci	return size;
28462306a36Sopenharmony_ci}
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_cistatic size_t
28762306a36Sopenharmony_cisja1105et_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
28862306a36Sopenharmony_ci					 enum packing_op op)
28962306a36Sopenharmony_ci{
29062306a36Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY;
29162306a36Sopenharmony_ci	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,         31, 17, size, op);
29462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_tbsz,       16, 14, size, op);
29562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->poly,           13,  6, size, op);
29662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->shared_learn,    5,  5, size, op);
29762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->no_enf_hostprt,  4,  4, size, op);
29862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->no_mgmt_learn,   3,  3, size, op);
29962306a36Sopenharmony_ci	return size;
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cisize_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
30362306a36Sopenharmony_ci						  enum packing_op op)
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY;
30662306a36Sopenharmony_ci	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
30762306a36Sopenharmony_ci	int offset, i;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	for (i = 0, offset = 58; i < 5; i++, offset += 11)
31062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->maxaddrp[i],
31162306a36Sopenharmony_ci				offset + 10, offset + 0, size, op);
31262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,         57,  43, size, op);
31362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->start_dynspc,   42,  33, size, op);
31462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpnolearn,     32,  28, size, op);
31562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->shared_learn,   27,  27, size, op);
31662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->no_enf_hostprt, 26,  26, size, op);
31762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->no_mgmt_learn,  25,  25, size, op);
31862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->use_static,     24,  24, size, op);
31962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->owr_dyn,        23,  23, size, op);
32062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->learn_once,     22,  22, size, op);
32162306a36Sopenharmony_ci	return size;
32262306a36Sopenharmony_ci}
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_cisize_t sja1110_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
32562306a36Sopenharmony_ci					      enum packing_op op)
32662306a36Sopenharmony_ci{
32762306a36Sopenharmony_ci	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
32862306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_L2_LOOKUP_PARAMS_ENTRY;
32962306a36Sopenharmony_ci	int offset, i;
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	for (i = 0, offset = 70; i < SJA1110_NUM_PORTS; i++, offset += 11)
33262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->maxaddrp[i],
33362306a36Sopenharmony_ci				offset + 10, offset + 0, size, op);
33462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,         69,  55, size, op);
33562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->start_dynspc,   54,  45, size, op);
33662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpnolearn,     44,  34, size, op);
33762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->shared_learn,   33,  33, size, op);
33862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->no_enf_hostprt, 32,  32, size, op);
33962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->no_mgmt_learn,  31,  31, size, op);
34062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->use_static,     30,  30, size, op);
34162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->owr_dyn,        29,  29, size, op);
34262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->learn_once,     28,  28, size, op);
34362306a36Sopenharmony_ci	return size;
34462306a36Sopenharmony_ci}
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_cisize_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
34762306a36Sopenharmony_ci					 enum packing_op op)
34862306a36Sopenharmony_ci{
34962306a36Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY;
35062306a36Sopenharmony_ci	struct sja1105_l2_lookup_entry *entry = entry_ptr;
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,    95, 84, size, op);
35362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->macaddr,   83, 36, size, op);
35462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports, 35, 31, size, op);
35562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->enfport,   30, 30, size, op);
35662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->index,     29, 20, size, op);
35762306a36Sopenharmony_ci	return size;
35862306a36Sopenharmony_ci}
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_cisize_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
36162306a36Sopenharmony_ci					   enum packing_op op)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY;
36462306a36Sopenharmony_ci	struct sja1105_l2_lookup_entry *entry = entry_ptr;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	if (entry->lockeds) {
36762306a36Sopenharmony_ci		sja1105_packing(buf, &entry->tsreg,    159, 159, size, op);
36862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->mirrvlan, 158, 147, size, op);
36962306a36Sopenharmony_ci		sja1105_packing(buf, &entry->takets,   146, 146, size, op);
37062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->mirr,     145, 145, size, op);
37162306a36Sopenharmony_ci		sja1105_packing(buf, &entry->retag,    144, 144, size, op);
37262306a36Sopenharmony_ci	} else {
37362306a36Sopenharmony_ci		sja1105_packing(buf, &entry->touched,  159, 159, size, op);
37462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->age,      158, 144, size, op);
37562306a36Sopenharmony_ci	}
37662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_iotag,   143, 143, size, op);
37762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_vlanid,  142, 131, size, op);
37862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_macaddr, 130,  83, size, op);
37962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->iotag,         82,  82, size, op);
38062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,        81,  70, size, op);
38162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->macaddr,       69,  22, size, op);
38262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports,     21,  17, size, op);
38362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->enfport,       16,  16, size, op);
38462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->index,         15,   6, size, op);
38562306a36Sopenharmony_ci	return size;
38662306a36Sopenharmony_ci}
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_cisize_t sja1110_l2_lookup_entry_packing(void *buf, void *entry_ptr,
38962306a36Sopenharmony_ci				       enum packing_op op)
39062306a36Sopenharmony_ci{
39162306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_L2_LOOKUP_ENTRY;
39262306a36Sopenharmony_ci	struct sja1105_l2_lookup_entry *entry = entry_ptr;
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	if (entry->lockeds) {
39562306a36Sopenharmony_ci		sja1105_packing(buf, &entry->trap,     168, 168, size, op);
39662306a36Sopenharmony_ci		sja1105_packing(buf, &entry->mirrvlan, 167, 156, size, op);
39762306a36Sopenharmony_ci		sja1105_packing(buf, &entry->takets,   155, 155, size, op);
39862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->mirr,     154, 154, size, op);
39962306a36Sopenharmony_ci		sja1105_packing(buf, &entry->retag,    153, 153, size, op);
40062306a36Sopenharmony_ci	} else {
40162306a36Sopenharmony_ci		sja1105_packing(buf, &entry->touched,  168, 168, size, op);
40262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->age,      167, 153, size, op);
40362306a36Sopenharmony_ci	}
40462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_iotag,   152, 152, size, op);
40562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_vlanid,  151, 140, size, op);
40662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_macaddr, 139,  92, size, op);
40762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->mask_srcport,  91,  88, size, op);
40862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->iotag,         87,  87, size, op);
40962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,        86,  75, size, op);
41062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->macaddr,       74,  27, size, op);
41162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->srcport,       26,  23, size, op);
41262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports,     22,  12, size, op);
41362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->enfport,       11,  11, size, op);
41462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->index,         10,   1, size, op);
41562306a36Sopenharmony_ci	return size;
41662306a36Sopenharmony_ci}
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cistatic size_t sja1105_l2_policing_entry_packing(void *buf, void *entry_ptr,
41962306a36Sopenharmony_ci						enum packing_op op)
42062306a36Sopenharmony_ci{
42162306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY;
42262306a36Sopenharmony_ci	struct sja1105_l2_policing_entry *entry = entry_ptr;
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->sharindx,  63, 58, size, op);
42562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->smax,      57, 42, size, op);
42662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->rate,      41, 26, size, op);
42762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxlen,    25, 15, size, op);
42862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->partition, 14, 12, size, op);
42962306a36Sopenharmony_ci	return size;
43062306a36Sopenharmony_ci}
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cisize_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,
43362306a36Sopenharmony_ci					 enum packing_op op)
43462306a36Sopenharmony_ci{
43562306a36Sopenharmony_ci	struct sja1105_l2_policing_entry *entry = entry_ptr;
43662306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY;
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->sharindx, 63, 57, size, op);
43962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->smax,     56, 39, size, op);
44062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->rate,     38, 21, size, op);
44162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxlen,   20, 10, size, op);
44262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->partition, 9,  7, size, op);
44362306a36Sopenharmony_ci	return size;
44462306a36Sopenharmony_ci}
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_cistatic size_t sja1105et_mac_config_entry_packing(void *buf, void *entry_ptr,
44762306a36Sopenharmony_ci						 enum packing_op op)
44862306a36Sopenharmony_ci{
44962306a36Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY;
45062306a36Sopenharmony_ci	struct sja1105_mac_config_entry *entry = entry_ptr;
45162306a36Sopenharmony_ci	int offset, i;
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	for (i = 0, offset = 72; i < 8; i++, offset += 19) {
45462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->enabled[i],
45562306a36Sopenharmony_ci				offset +  0, offset +  0, size, op);
45662306a36Sopenharmony_ci		sja1105_packing(buf, &entry->base[i],
45762306a36Sopenharmony_ci				offset +  9, offset +  1, size, op);
45862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->top[i],
45962306a36Sopenharmony_ci				offset + 18, offset + 10, size, op);
46062306a36Sopenharmony_ci	}
46162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ifg,       71, 67, size, op);
46262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->speed,     66, 65, size, op);
46362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delin,  64, 49, size, op);
46462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delout, 48, 33, size, op);
46562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,    32, 25, size, op);
46662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanprio,  24, 22, size, op);
46762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,    21, 10, size, op);
46862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ing_mirr,   9,  9, size, op);
46962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egr_mirr,   8,  8, size, op);
47062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpnona664, 7,  7, size, op);
47162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpdtag,    6,  6, size, op);
47262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpuntag,   5,  5, size, op);
47362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->retag,      4,  4, size, op);
47462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_learn,  3,  3, size, op);
47562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egress,     2,  2, size, op);
47662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ingress,    1,  1, size, op);
47762306a36Sopenharmony_ci	return size;
47862306a36Sopenharmony_ci}
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_cisize_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
48162306a36Sopenharmony_ci					    enum packing_op op)
48262306a36Sopenharmony_ci{
48362306a36Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY;
48462306a36Sopenharmony_ci	struct sja1105_mac_config_entry *entry = entry_ptr;
48562306a36Sopenharmony_ci	int offset, i;
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci	for (i = 0, offset = 104; i < 8; i++, offset += 19) {
48862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->enabled[i],
48962306a36Sopenharmony_ci				offset +  0, offset +  0, size, op);
49062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->base[i],
49162306a36Sopenharmony_ci				offset +  9, offset +  1, size, op);
49262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->top[i],
49362306a36Sopenharmony_ci				offset + 18, offset + 10, size, op);
49462306a36Sopenharmony_ci	}
49562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ifg,       103, 99, size, op);
49662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->speed,      98, 97, size, op);
49762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delin,   96, 81, size, op);
49862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delout,  80, 65, size, op);
49962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,     64, 57, size, op);
50062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanprio,   56, 54, size, op);
50162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,     53, 42, size, op);
50262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ing_mirr,   41, 41, size, op);
50362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egr_mirr,   40, 40, size, op);
50462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpnona664, 39, 39, size, op);
50562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpdtag,    38, 38, size, op);
50662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpuntag,   35, 35, size, op);
50762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->retag,      34, 34, size, op);
50862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_learn,  33, 33, size, op);
50962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egress,     32, 32, size, op);
51062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ingress,    31, 31, size, op);
51162306a36Sopenharmony_ci	return size;
51262306a36Sopenharmony_ci}
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_cisize_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,
51562306a36Sopenharmony_ci					enum packing_op op)
51662306a36Sopenharmony_ci{
51762306a36Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY;
51862306a36Sopenharmony_ci	struct sja1105_mac_config_entry *entry = entry_ptr;
51962306a36Sopenharmony_ci	int offset, i;
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	for (i = 0, offset = 104; i < 8; i++, offset += 19) {
52262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->enabled[i],
52362306a36Sopenharmony_ci				offset +  0, offset +  0, size, op);
52462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->base[i],
52562306a36Sopenharmony_ci				offset +  9, offset +  1, size, op);
52662306a36Sopenharmony_ci		sja1105_packing(buf, &entry->top[i],
52762306a36Sopenharmony_ci				offset + 18, offset + 10, size, op);
52862306a36Sopenharmony_ci	}
52962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->speed,      98, 96, size, op);
53062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delin,   95, 80, size, op);
53162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delout,  79, 64, size, op);
53262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,     63, 56, size, op);
53362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanprio,   55, 53, size, op);
53462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,     52, 41, size, op);
53562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ing_mirr,   40, 40, size, op);
53662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egr_mirr,   39, 39, size, op);
53762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpnona664, 38, 38, size, op);
53862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpdtag,    37, 37, size, op);
53962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->drpuntag,   34, 34, size, op);
54062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->retag,      33, 33, size, op);
54162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_learn,  32, 32, size, op);
54262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egress,     31, 31, size, op);
54362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ingress,    30, 30, size, op);
54462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ifg,        10,  5, size, op);
54562306a36Sopenharmony_ci	return size;
54662306a36Sopenharmony_ci}
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_cistatic size_t
54962306a36Sopenharmony_cisja1105_schedule_entry_points_params_entry_packing(void *buf, void *entry_ptr,
55062306a36Sopenharmony_ci						   enum packing_op op)
55162306a36Sopenharmony_ci{
55262306a36Sopenharmony_ci	struct sja1105_schedule_entry_points_params_entry *entry = entry_ptr;
55362306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY;
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->clksrc,    31, 30, size, op);
55662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->actsubsch, 29, 27, size, op);
55762306a36Sopenharmony_ci	return size;
55862306a36Sopenharmony_ci}
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_cistatic size_t
56162306a36Sopenharmony_cisja1105_schedule_entry_points_entry_packing(void *buf, void *entry_ptr,
56262306a36Sopenharmony_ci					    enum packing_op op)
56362306a36Sopenharmony_ci{
56462306a36Sopenharmony_ci	struct sja1105_schedule_entry_points_entry *entry = entry_ptr;
56562306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY;
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->subschindx, 31, 29, size, op);
56862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->delta,      28, 11, size, op);
56962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->address,    10, 1,  size, op);
57062306a36Sopenharmony_ci	return size;
57162306a36Sopenharmony_ci}
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_cistatic size_t
57462306a36Sopenharmony_cisja1110_schedule_entry_points_entry_packing(void *buf, void *entry_ptr,
57562306a36Sopenharmony_ci					    enum packing_op op)
57662306a36Sopenharmony_ci{
57762306a36Sopenharmony_ci	struct sja1105_schedule_entry_points_entry *entry = entry_ptr;
57862306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY;
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->subschindx, 63, 61, size, op);
58162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->delta,      60, 43, size, op);
58262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->address,    42, 31, size, op);
58362306a36Sopenharmony_ci	return size;
58462306a36Sopenharmony_ci}
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_cistatic size_t sja1105_schedule_params_entry_packing(void *buf, void *entry_ptr,
58762306a36Sopenharmony_ci						    enum packing_op op)
58862306a36Sopenharmony_ci{
58962306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY;
59062306a36Sopenharmony_ci	struct sja1105_schedule_params_entry *entry = entry_ptr;
59162306a36Sopenharmony_ci	int offset, i;
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci	for (i = 0, offset = 16; i < 8; i++, offset += 10)
59462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->subscheind[i],
59562306a36Sopenharmony_ci				offset + 9, offset + 0, size, op);
59662306a36Sopenharmony_ci	return size;
59762306a36Sopenharmony_ci}
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_cistatic size_t sja1110_schedule_params_entry_packing(void *buf, void *entry_ptr,
60062306a36Sopenharmony_ci						    enum packing_op op)
60162306a36Sopenharmony_ci{
60262306a36Sopenharmony_ci	struct sja1105_schedule_params_entry *entry = entry_ptr;
60362306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY;
60462306a36Sopenharmony_ci	int offset, i;
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	for (i = 0, offset = 0; i < 8; i++, offset += 12)
60762306a36Sopenharmony_ci		sja1105_packing(buf, &entry->subscheind[i],
60862306a36Sopenharmony_ci				offset + 11, offset + 0, size, op);
60962306a36Sopenharmony_ci	return size;
61062306a36Sopenharmony_ci}
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_cistatic size_t sja1105_schedule_entry_packing(void *buf, void *entry_ptr,
61362306a36Sopenharmony_ci					     enum packing_op op)
61462306a36Sopenharmony_ci{
61562306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY;
61662306a36Sopenharmony_ci	struct sja1105_schedule_entry *entry = entry_ptr;
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->winstindex,  63, 54, size, op);
61962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->winend,      53, 53, size, op);
62062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->winst,       52, 52, size, op);
62162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports,   51, 47, size, op);
62262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->setvalid,    46, 46, size, op);
62362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->txen,        45, 45, size, op);
62462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->resmedia_en, 44, 44, size, op);
62562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->resmedia,    43, 36, size, op);
62662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlindex,     35, 26, size, op);
62762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->delta,       25, 8,  size, op);
62862306a36Sopenharmony_ci	return size;
62962306a36Sopenharmony_ci}
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_cistatic size_t sja1110_schedule_entry_packing(void *buf, void *entry_ptr,
63262306a36Sopenharmony_ci					     enum packing_op op)
63362306a36Sopenharmony_ci{
63462306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_SCHEDULE_ENTRY;
63562306a36Sopenharmony_ci	struct sja1105_schedule_entry *entry = entry_ptr;
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->winstindex,  95, 84, size, op);
63862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->winend,      83, 83, size, op);
63962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->winst,       82, 82, size, op);
64062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports,   81, 71, size, op);
64162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->setvalid,    70, 70, size, op);
64262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->txen,        69, 69, size, op);
64362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->resmedia_en, 68, 68, size, op);
64462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->resmedia,    67, 60, size, op);
64562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlindex,     59, 48, size, op);
64662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->delta,       47, 30, size, op);
64762306a36Sopenharmony_ci	return size;
64862306a36Sopenharmony_ci}
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_cistatic size_t
65162306a36Sopenharmony_cisja1105_vl_forwarding_params_entry_packing(void *buf, void *entry_ptr,
65262306a36Sopenharmony_ci					   enum packing_op op)
65362306a36Sopenharmony_ci{
65462306a36Sopenharmony_ci	struct sja1105_vl_forwarding_params_entry *entry = entry_ptr;
65562306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY;
65662306a36Sopenharmony_ci	int offset, i;
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	for (i = 0, offset = 16; i < 8; i++, offset += 10)
65962306a36Sopenharmony_ci		sja1105_packing(buf, &entry->partspc[i],
66062306a36Sopenharmony_ci				offset + 9, offset + 0, size, op);
66162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->debugen, 15, 15, size, op);
66262306a36Sopenharmony_ci	return size;
66362306a36Sopenharmony_ci}
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_cistatic size_t
66662306a36Sopenharmony_cisja1110_vl_forwarding_params_entry_packing(void *buf, void *entry_ptr,
66762306a36Sopenharmony_ci					   enum packing_op op)
66862306a36Sopenharmony_ci{
66962306a36Sopenharmony_ci	struct sja1105_vl_forwarding_params_entry *entry = entry_ptr;
67062306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY;
67162306a36Sopenharmony_ci	int offset, i;
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	for (i = 0, offset = 8; i < 8; i++, offset += 11)
67462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->partspc[i],
67562306a36Sopenharmony_ci				offset + 10, offset + 0, size, op);
67662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->debugen, 7, 7, size, op);
67762306a36Sopenharmony_ci	return size;
67862306a36Sopenharmony_ci}
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_cistatic size_t sja1105_vl_forwarding_entry_packing(void *buf, void *entry_ptr,
68162306a36Sopenharmony_ci						  enum packing_op op)
68262306a36Sopenharmony_ci{
68362306a36Sopenharmony_ci	struct sja1105_vl_forwarding_entry *entry = entry_ptr;
68462306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_FORWARDING_ENTRY;
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->type,      31, 31, size, op);
68762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->priority,  30, 28, size, op);
68862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->partition, 27, 25, size, op);
68962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports, 24, 20, size, op);
69062306a36Sopenharmony_ci	return size;
69162306a36Sopenharmony_ci}
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_cistatic size_t sja1110_vl_forwarding_entry_packing(void *buf, void *entry_ptr,
69462306a36Sopenharmony_ci						  enum packing_op op)
69562306a36Sopenharmony_ci{
69662306a36Sopenharmony_ci	struct sja1105_vl_forwarding_entry *entry = entry_ptr;
69762306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_FORWARDING_ENTRY;
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->type,      31, 31, size, op);
70062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->priority,  30, 28, size, op);
70162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->partition, 27, 25, size, op);
70262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports, 24, 14, size, op);
70362306a36Sopenharmony_ci	return size;
70462306a36Sopenharmony_ci}
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_cisize_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
70762306a36Sopenharmony_ci				       enum packing_op op)
70862306a36Sopenharmony_ci{
70962306a36Sopenharmony_ci	struct sja1105_vl_lookup_entry *entry = entry_ptr;
71062306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_LOOKUP_ENTRY;
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci	if (entry->format == SJA1105_VL_FORMAT_PSFP) {
71362306a36Sopenharmony_ci		/* Interpreting vllupformat as 0 */
71462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->destports,
71562306a36Sopenharmony_ci				95, 91, size, op);
71662306a36Sopenharmony_ci		sja1105_packing(buf, &entry->iscritical,
71762306a36Sopenharmony_ci				90, 90, size, op);
71862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->macaddr,
71962306a36Sopenharmony_ci				89, 42, size, op);
72062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlanid,
72162306a36Sopenharmony_ci				41, 30, size, op);
72262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->port,
72362306a36Sopenharmony_ci				29, 27, size, op);
72462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlanprior,
72562306a36Sopenharmony_ci				26, 24, size, op);
72662306a36Sopenharmony_ci	} else {
72762306a36Sopenharmony_ci		/* Interpreting vllupformat as 1 */
72862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->egrmirr,
72962306a36Sopenharmony_ci				95, 91, size, op);
73062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->ingrmirr,
73162306a36Sopenharmony_ci				90, 90, size, op);
73262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlid,
73362306a36Sopenharmony_ci				57, 42, size, op);
73462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->port,
73562306a36Sopenharmony_ci				29, 27, size, op);
73662306a36Sopenharmony_ci	}
73762306a36Sopenharmony_ci	return size;
73862306a36Sopenharmony_ci}
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_cisize_t sja1110_vl_lookup_entry_packing(void *buf, void *entry_ptr,
74162306a36Sopenharmony_ci				       enum packing_op op)
74262306a36Sopenharmony_ci{
74362306a36Sopenharmony_ci	struct sja1105_vl_lookup_entry *entry = entry_ptr;
74462306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_LOOKUP_ENTRY;
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	if (entry->format == SJA1105_VL_FORMAT_PSFP) {
74762306a36Sopenharmony_ci		/* Interpreting vllupformat as 0 */
74862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->destports,
74962306a36Sopenharmony_ci				94, 84, size, op);
75062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->iscritical,
75162306a36Sopenharmony_ci				83, 83, size, op);
75262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->macaddr,
75362306a36Sopenharmony_ci				82, 35, size, op);
75462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlanid,
75562306a36Sopenharmony_ci				34, 23, size, op);
75662306a36Sopenharmony_ci		sja1105_packing(buf, &entry->port,
75762306a36Sopenharmony_ci				22, 19, size, op);
75862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlanprior,
75962306a36Sopenharmony_ci				18, 16, size, op);
76062306a36Sopenharmony_ci	} else {
76162306a36Sopenharmony_ci		/* Interpreting vllupformat as 1 */
76262306a36Sopenharmony_ci		sja1105_packing(buf, &entry->egrmirr,
76362306a36Sopenharmony_ci				94, 84, size, op);
76462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->ingrmirr,
76562306a36Sopenharmony_ci				83, 83, size, op);
76662306a36Sopenharmony_ci		sja1105_packing(buf, &entry->vlid,
76762306a36Sopenharmony_ci				50, 35, size, op);
76862306a36Sopenharmony_ci		sja1105_packing(buf, &entry->port,
76962306a36Sopenharmony_ci				22, 19, size, op);
77062306a36Sopenharmony_ci	}
77162306a36Sopenharmony_ci	return size;
77262306a36Sopenharmony_ci}
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_cistatic size_t sja1105_vl_policing_entry_packing(void *buf, void *entry_ptr,
77562306a36Sopenharmony_ci						enum packing_op op)
77662306a36Sopenharmony_ci{
77762306a36Sopenharmony_ci	struct sja1105_vl_policing_entry *entry = entry_ptr;
77862306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_POLICING_ENTRY;
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->type,      63, 63, size, op);
78162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxlen,    62, 52, size, op);
78262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->sharindx,  51, 42, size, op);
78362306a36Sopenharmony_ci	if (entry->type == 0) {
78462306a36Sopenharmony_ci		sja1105_packing(buf, &entry->bag,    41, 28, size, op);
78562306a36Sopenharmony_ci		sja1105_packing(buf, &entry->jitter, 27, 18, size, op);
78662306a36Sopenharmony_ci	}
78762306a36Sopenharmony_ci	return size;
78862306a36Sopenharmony_ci}
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_cisize_t sja1110_vl_policing_entry_packing(void *buf, void *entry_ptr,
79162306a36Sopenharmony_ci					 enum packing_op op)
79262306a36Sopenharmony_ci{
79362306a36Sopenharmony_ci	struct sja1105_vl_policing_entry *entry = entry_ptr;
79462306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_POLICING_ENTRY;
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->type,      63, 63, size, op);
79762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->maxlen,    62, 52, size, op);
79862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->sharindx,  51, 40, size, op);
79962306a36Sopenharmony_ci	if (entry->type == 0) {
80062306a36Sopenharmony_ci		sja1105_packing(buf, &entry->bag,    41, 28, size, op);
80162306a36Sopenharmony_ci		sja1105_packing(buf, &entry->jitter, 27, 18, size, op);
80262306a36Sopenharmony_ci	}
80362306a36Sopenharmony_ci	return size;
80462306a36Sopenharmony_ci}
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_cisize_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
80762306a36Sopenharmony_ci					 enum packing_op op)
80862306a36Sopenharmony_ci{
80962306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY;
81062306a36Sopenharmony_ci	struct sja1105_vlan_lookup_entry *entry = entry_ptr;
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ving_mirr,  63, 59, size, op);
81362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vegr_mirr,  58, 54, size, op);
81462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vmemb_port, 53, 49, size, op);
81562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_bc,    48, 44, size, op);
81662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tag_port,   43, 39, size, op);
81762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,     38, 27, size, op);
81862306a36Sopenharmony_ci	return size;
81962306a36Sopenharmony_ci}
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cisize_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
82262306a36Sopenharmony_ci					 enum packing_op op)
82362306a36Sopenharmony_ci{
82462306a36Sopenharmony_ci	struct sja1105_vlan_lookup_entry *entry = entry_ptr;
82562306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_VLAN_LOOKUP_ENTRY;
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ving_mirr,  95, 85, size, op);
82862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vegr_mirr,  84, 74, size, op);
82962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vmemb_port, 73, 63, size, op);
83062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_bc,    62, 52, size, op);
83162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->tag_port,   51, 41, size, op);
83262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->type_entry, 40, 39, size, op);
83362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,     38, 27, size, op);
83462306a36Sopenharmony_ci	return size;
83562306a36Sopenharmony_ci}
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_cistatic size_t sja1105_xmii_params_entry_packing(void *buf, void *entry_ptr,
83862306a36Sopenharmony_ci						enum packing_op op)
83962306a36Sopenharmony_ci{
84062306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_XMII_PARAMS_ENTRY;
84162306a36Sopenharmony_ci	struct sja1105_xmii_params_entry *entry = entry_ptr;
84262306a36Sopenharmony_ci	int offset, i;
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci	for (i = 0, offset = 17; i < 5; i++, offset += 3) {
84562306a36Sopenharmony_ci		sja1105_packing(buf, &entry->xmii_mode[i],
84662306a36Sopenharmony_ci				offset + 1, offset + 0, size, op);
84762306a36Sopenharmony_ci		sja1105_packing(buf, &entry->phy_mac[i],
84862306a36Sopenharmony_ci				offset + 2, offset + 2, size, op);
84962306a36Sopenharmony_ci	}
85062306a36Sopenharmony_ci	return size;
85162306a36Sopenharmony_ci}
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_cisize_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,
85462306a36Sopenharmony_ci					 enum packing_op op)
85562306a36Sopenharmony_ci{
85662306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_XMII_PARAMS_ENTRY;
85762306a36Sopenharmony_ci	struct sja1105_xmii_params_entry *entry = entry_ptr;
85862306a36Sopenharmony_ci	int offset, i;
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	for (i = 0, offset = 20; i < SJA1110_NUM_PORTS; i++, offset += 4) {
86162306a36Sopenharmony_ci		sja1105_packing(buf, &entry->xmii_mode[i],
86262306a36Sopenharmony_ci				offset + 1, offset + 0, size, op);
86362306a36Sopenharmony_ci		sja1105_packing(buf, &entry->phy_mac[i],
86462306a36Sopenharmony_ci				offset + 2, offset + 2, size, op);
86562306a36Sopenharmony_ci		sja1105_packing(buf, &entry->special[i],
86662306a36Sopenharmony_ci				offset + 3, offset + 3, size, op);
86762306a36Sopenharmony_ci	}
86862306a36Sopenharmony_ci	return size;
86962306a36Sopenharmony_ci}
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_cisize_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
87262306a36Sopenharmony_ci				       enum packing_op op)
87362306a36Sopenharmony_ci{
87462306a36Sopenharmony_ci	struct sja1105_retagging_entry *entry = entry_ptr;
87562306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_RETAGGING_ENTRY;
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egr_port,       63, 59, size, op);
87862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ing_port,       58, 54, size, op);
87962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_ing,       53, 42, size, op);
88062306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_egr,       41, 30, size, op);
88162306a36Sopenharmony_ci	sja1105_packing(buf, &entry->do_not_learn,   29, 29, size, op);
88262306a36Sopenharmony_ci	sja1105_packing(buf, &entry->use_dest_ports, 28, 28, size, op);
88362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports,      27, 23, size, op);
88462306a36Sopenharmony_ci	return size;
88562306a36Sopenharmony_ci}
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_cisize_t sja1110_retagging_entry_packing(void *buf, void *entry_ptr,
88862306a36Sopenharmony_ci				       enum packing_op op)
88962306a36Sopenharmony_ci{
89062306a36Sopenharmony_ci	struct sja1105_retagging_entry *entry = entry_ptr;
89162306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_RETAGGING_ENTRY;
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->egr_port,       63, 53, size, op);
89462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->ing_port,       52, 42, size, op);
89562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_ing,       41, 30, size, op);
89662306a36Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_egr,       29, 18, size, op);
89762306a36Sopenharmony_ci	sja1105_packing(buf, &entry->do_not_learn,   17, 17, size, op);
89862306a36Sopenharmony_ci	sja1105_packing(buf, &entry->use_dest_ports, 16, 16, size, op);
89962306a36Sopenharmony_ci	sja1105_packing(buf, &entry->destports,      15, 5, size, op);
90062306a36Sopenharmony_ci	return size;
90162306a36Sopenharmony_ci}
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_cistatic size_t sja1110_pcp_remapping_entry_packing(void *buf, void *entry_ptr,
90462306a36Sopenharmony_ci						  enum packing_op op)
90562306a36Sopenharmony_ci{
90662306a36Sopenharmony_ci	struct sja1110_pcp_remapping_entry *entry = entry_ptr;
90762306a36Sopenharmony_ci	const size_t size = SJA1110_SIZE_PCP_REMAPPING_ENTRY;
90862306a36Sopenharmony_ci	int offset, i;
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci	for (i = 0, offset = 8; i < SJA1105_NUM_TC; i++, offset += 3)
91162306a36Sopenharmony_ci		sja1105_packing(buf, &entry->egrpcp[i],
91262306a36Sopenharmony_ci				offset + 2, offset + 0, size, op);
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	return size;
91562306a36Sopenharmony_ci}
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_cisize_t sja1105_table_header_packing(void *buf, void *entry_ptr,
91862306a36Sopenharmony_ci				    enum packing_op op)
91962306a36Sopenharmony_ci{
92062306a36Sopenharmony_ci	const size_t size = SJA1105_SIZE_TABLE_HEADER;
92162306a36Sopenharmony_ci	struct sja1105_table_header *entry = entry_ptr;
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci	sja1105_packing(buf, &entry->block_id, 31, 24, size, op);
92462306a36Sopenharmony_ci	sja1105_packing(buf, &entry->len,      55, 32, size, op);
92562306a36Sopenharmony_ci	sja1105_packing(buf, &entry->crc,      95, 64, size, op);
92662306a36Sopenharmony_ci	return size;
92762306a36Sopenharmony_ci}
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_ci/* WARNING: the *hdr pointer is really non-const, because it is
93062306a36Sopenharmony_ci * modifying the CRC of the header for a 2-stage packing operation
93162306a36Sopenharmony_ci */
93262306a36Sopenharmony_civoid
93362306a36Sopenharmony_cisja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr)
93462306a36Sopenharmony_ci{
93562306a36Sopenharmony_ci	/* First pack the table as-is, then calculate the CRC, and
93662306a36Sopenharmony_ci	 * finally put the proper CRC into the packed buffer
93762306a36Sopenharmony_ci	 */
93862306a36Sopenharmony_ci	memset(buf, 0, SJA1105_SIZE_TABLE_HEADER);
93962306a36Sopenharmony_ci	sja1105_table_header_packing(buf, hdr, PACK);
94062306a36Sopenharmony_ci	hdr->crc = sja1105_crc32(buf, SJA1105_SIZE_TABLE_HEADER - 4);
94162306a36Sopenharmony_ci	sja1105_pack(buf + SJA1105_SIZE_TABLE_HEADER - 4, &hdr->crc, 31, 0, 4);
94262306a36Sopenharmony_ci}
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_cistatic void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr)
94562306a36Sopenharmony_ci{
94662306a36Sopenharmony_ci	u64 computed_crc;
94762306a36Sopenharmony_ci	int len_bytes;
94862306a36Sopenharmony_ci
94962306a36Sopenharmony_ci	len_bytes = (uintptr_t)(crc_ptr - table_start);
95062306a36Sopenharmony_ci	computed_crc = sja1105_crc32(table_start, len_bytes);
95162306a36Sopenharmony_ci	sja1105_pack(crc_ptr, &computed_crc, 31, 0, 4);
95262306a36Sopenharmony_ci}
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_ci/* The block IDs that the switches support are unfortunately sparse, so keep a
95562306a36Sopenharmony_ci * mapping table to "block indices" and translate back and forth so that we
95662306a36Sopenharmony_ci * don't waste useless memory in struct sja1105_static_config.
95762306a36Sopenharmony_ci * Also, since the block id comes from essentially untrusted input (unpacking
95862306a36Sopenharmony_ci * the static config from userspace) it has to be sanitized (range-checked)
95962306a36Sopenharmony_ci * before blindly indexing kernel memory with the blk_idx.
96062306a36Sopenharmony_ci */
96162306a36Sopenharmony_cistatic u64 blk_id_map[BLK_IDX_MAX] = {
96262306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE] = BLKID_SCHEDULE,
96362306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = BLKID_SCHEDULE_ENTRY_POINTS,
96462306a36Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = BLKID_VL_LOOKUP,
96562306a36Sopenharmony_ci	[BLK_IDX_VL_POLICING] = BLKID_VL_POLICING,
96662306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = BLKID_VL_FORWARDING,
96762306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = BLKID_L2_LOOKUP,
96862306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = BLKID_L2_POLICING,
96962306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = BLKID_VLAN_LOOKUP,
97062306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = BLKID_L2_FORWARDING,
97162306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = BLKID_MAC_CONFIG,
97262306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = BLKID_SCHEDULE_PARAMS,
97362306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = BLKID_SCHEDULE_ENTRY_POINTS_PARAMS,
97462306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = BLKID_VL_FORWARDING_PARAMS,
97562306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = BLKID_L2_LOOKUP_PARAMS,
97662306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = BLKID_L2_FORWARDING_PARAMS,
97762306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = BLKID_AVB_PARAMS,
97862306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = BLKID_GENERAL_PARAMS,
97962306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = BLKID_RETAGGING,
98062306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = BLKID_XMII_PARAMS,
98162306a36Sopenharmony_ci	[BLK_IDX_PCP_REMAPPING] = BLKID_PCP_REMAPPING,
98262306a36Sopenharmony_ci};
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ciconst char *sja1105_static_config_error_msg[] = {
98562306a36Sopenharmony_ci	[SJA1105_CONFIG_OK] = "",
98662306a36Sopenharmony_ci	[SJA1105_TTETHERNET_NOT_SUPPORTED] =
98762306a36Sopenharmony_ci		"schedule-table present, but TTEthernet is "
98862306a36Sopenharmony_ci		"only supported on T and Q/S",
98962306a36Sopenharmony_ci	[SJA1105_INCORRECT_TTETHERNET_CONFIGURATION] =
99062306a36Sopenharmony_ci		"schedule-table present, but one of "
99162306a36Sopenharmony_ci		"schedule-entry-points-table, schedule-parameters-table or "
99262306a36Sopenharmony_ci		"schedule-entry-points-parameters table is empty",
99362306a36Sopenharmony_ci	[SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION] =
99462306a36Sopenharmony_ci		"vl-lookup-table present, but one of vl-policing-table, "
99562306a36Sopenharmony_ci		"vl-forwarding-table or vl-forwarding-parameters-table is empty",
99662306a36Sopenharmony_ci	[SJA1105_MISSING_L2_POLICING_TABLE] =
99762306a36Sopenharmony_ci		"l2-policing-table needs to have at least one entry",
99862306a36Sopenharmony_ci	[SJA1105_MISSING_L2_FORWARDING_TABLE] =
99962306a36Sopenharmony_ci		"l2-forwarding-table is either missing or incomplete",
100062306a36Sopenharmony_ci	[SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE] =
100162306a36Sopenharmony_ci		"l2-forwarding-parameters-table is missing",
100262306a36Sopenharmony_ci	[SJA1105_MISSING_GENERAL_PARAMS_TABLE] =
100362306a36Sopenharmony_ci		"general-parameters-table is missing",
100462306a36Sopenharmony_ci	[SJA1105_MISSING_VLAN_TABLE] =
100562306a36Sopenharmony_ci		"vlan-lookup-table needs to have at least the default untagged VLAN",
100662306a36Sopenharmony_ci	[SJA1105_MISSING_XMII_TABLE] =
100762306a36Sopenharmony_ci		"xmii-table is missing",
100862306a36Sopenharmony_ci	[SJA1105_MISSING_MAC_TABLE] =
100962306a36Sopenharmony_ci		"mac-configuration-table needs to contain an entry for each port",
101062306a36Sopenharmony_ci	[SJA1105_OVERCOMMITTED_FRAME_MEMORY] =
101162306a36Sopenharmony_ci		"Not allowed to overcommit frame memory. L2 memory partitions "
101262306a36Sopenharmony_ci		"and VL memory partitions share the same space. The sum of all "
101362306a36Sopenharmony_ci		"16 memory partitions is not allowed to be larger than 929 "
101462306a36Sopenharmony_ci		"128-byte blocks (or 910 with retagging). Please adjust "
101562306a36Sopenharmony_ci		"l2-forwarding-parameters-table.part_spc and/or "
101662306a36Sopenharmony_ci		"vl-forwarding-parameters-table.partspc.",
101762306a36Sopenharmony_ci};
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_cistatic sja1105_config_valid_t
102062306a36Sopenharmony_cistatic_config_check_memory_size(const struct sja1105_table *tables, int max_mem)
102162306a36Sopenharmony_ci{
102262306a36Sopenharmony_ci	const struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
102362306a36Sopenharmony_ci	const struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
102462306a36Sopenharmony_ci	int i, mem = 0;
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	l2_fwd_params = tables[BLK_IDX_L2_FORWARDING_PARAMS].entries;
102762306a36Sopenharmony_ci
102862306a36Sopenharmony_ci	for (i = 0; i < 8; i++)
102962306a36Sopenharmony_ci		mem += l2_fwd_params->part_spc[i];
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	if (tables[BLK_IDX_VL_FORWARDING_PARAMS].entry_count) {
103262306a36Sopenharmony_ci		vl_fwd_params = tables[BLK_IDX_VL_FORWARDING_PARAMS].entries;
103362306a36Sopenharmony_ci		for (i = 0; i < 8; i++)
103462306a36Sopenharmony_ci			mem += vl_fwd_params->partspc[i];
103562306a36Sopenharmony_ci	}
103662306a36Sopenharmony_ci
103762306a36Sopenharmony_ci	if (tables[BLK_IDX_RETAGGING].entry_count)
103862306a36Sopenharmony_ci		max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	if (mem > max_mem)
104162306a36Sopenharmony_ci		return SJA1105_OVERCOMMITTED_FRAME_MEMORY;
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_ci	return SJA1105_CONFIG_OK;
104462306a36Sopenharmony_ci}
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_cisja1105_config_valid_t
104762306a36Sopenharmony_cisja1105_static_config_check_valid(const struct sja1105_static_config *config,
104862306a36Sopenharmony_ci				  int max_mem)
104962306a36Sopenharmony_ci{
105062306a36Sopenharmony_ci	const struct sja1105_table *tables = config->tables;
105162306a36Sopenharmony_ci#define IS_FULL(blk_idx) \
105262306a36Sopenharmony_ci	(tables[blk_idx].entry_count == tables[blk_idx].ops->max_entry_count)
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci	if (tables[BLK_IDX_SCHEDULE].entry_count) {
105562306a36Sopenharmony_ci		if (!tables[BLK_IDX_SCHEDULE].ops->max_entry_count)
105662306a36Sopenharmony_ci			return SJA1105_TTETHERNET_NOT_SUPPORTED;
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ci		if (tables[BLK_IDX_SCHEDULE_ENTRY_POINTS].entry_count == 0)
105962306a36Sopenharmony_ci			return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION;
106062306a36Sopenharmony_ci
106162306a36Sopenharmony_ci		if (!IS_FULL(BLK_IDX_SCHEDULE_PARAMS))
106262306a36Sopenharmony_ci			return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION;
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_ci		if (!IS_FULL(BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS))
106562306a36Sopenharmony_ci			return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION;
106662306a36Sopenharmony_ci	}
106762306a36Sopenharmony_ci	if (tables[BLK_IDX_VL_LOOKUP].entry_count) {
106862306a36Sopenharmony_ci		struct sja1105_vl_lookup_entry *vl_lookup;
106962306a36Sopenharmony_ci		bool has_critical_links = false;
107062306a36Sopenharmony_ci		int i;
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci		vl_lookup = tables[BLK_IDX_VL_LOOKUP].entries;
107362306a36Sopenharmony_ci
107462306a36Sopenharmony_ci		for (i = 0; i < tables[BLK_IDX_VL_LOOKUP].entry_count; i++) {
107562306a36Sopenharmony_ci			if (vl_lookup[i].iscritical) {
107662306a36Sopenharmony_ci				has_critical_links = true;
107762306a36Sopenharmony_ci				break;
107862306a36Sopenharmony_ci			}
107962306a36Sopenharmony_ci		}
108062306a36Sopenharmony_ci
108162306a36Sopenharmony_ci		if (tables[BLK_IDX_VL_POLICING].entry_count == 0 &&
108262306a36Sopenharmony_ci		    has_critical_links)
108362306a36Sopenharmony_ci			return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION;
108462306a36Sopenharmony_ci
108562306a36Sopenharmony_ci		if (tables[BLK_IDX_VL_FORWARDING].entry_count == 0 &&
108662306a36Sopenharmony_ci		    has_critical_links)
108762306a36Sopenharmony_ci			return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION;
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci		if (tables[BLK_IDX_VL_FORWARDING_PARAMS].entry_count == 0 &&
109062306a36Sopenharmony_ci		    has_critical_links)
109162306a36Sopenharmony_ci			return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION;
109262306a36Sopenharmony_ci	}
109362306a36Sopenharmony_ci
109462306a36Sopenharmony_ci	if (tables[BLK_IDX_L2_POLICING].entry_count == 0)
109562306a36Sopenharmony_ci		return SJA1105_MISSING_L2_POLICING_TABLE;
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_ci	if (tables[BLK_IDX_VLAN_LOOKUP].entry_count == 0)
109862306a36Sopenharmony_ci		return SJA1105_MISSING_VLAN_TABLE;
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	if (!IS_FULL(BLK_IDX_L2_FORWARDING))
110162306a36Sopenharmony_ci		return SJA1105_MISSING_L2_FORWARDING_TABLE;
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci	if (!IS_FULL(BLK_IDX_MAC_CONFIG))
110462306a36Sopenharmony_ci		return SJA1105_MISSING_MAC_TABLE;
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	if (!IS_FULL(BLK_IDX_L2_FORWARDING_PARAMS))
110762306a36Sopenharmony_ci		return SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE;
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci	if (!IS_FULL(BLK_IDX_GENERAL_PARAMS))
111062306a36Sopenharmony_ci		return SJA1105_MISSING_GENERAL_PARAMS_TABLE;
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ci	if (!IS_FULL(BLK_IDX_XMII_PARAMS))
111362306a36Sopenharmony_ci		return SJA1105_MISSING_XMII_TABLE;
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci	return static_config_check_memory_size(tables, max_mem);
111662306a36Sopenharmony_ci#undef IS_FULL
111762306a36Sopenharmony_ci}
111862306a36Sopenharmony_ci
111962306a36Sopenharmony_civoid
112062306a36Sopenharmony_cisja1105_static_config_pack(void *buf, struct sja1105_static_config *config)
112162306a36Sopenharmony_ci{
112262306a36Sopenharmony_ci	struct sja1105_table_header header = {0};
112362306a36Sopenharmony_ci	enum sja1105_blk_idx i;
112462306a36Sopenharmony_ci	char *p = buf;
112562306a36Sopenharmony_ci	int j;
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci	sja1105_pack(p, &config->device_id, 31, 0, 4);
112862306a36Sopenharmony_ci	p += SJA1105_SIZE_DEVICE_ID;
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++) {
113162306a36Sopenharmony_ci		const struct sja1105_table *table;
113262306a36Sopenharmony_ci		char *table_start;
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci		table = &config->tables[i];
113562306a36Sopenharmony_ci		if (!table->entry_count)
113662306a36Sopenharmony_ci			continue;
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci		header.block_id = blk_id_map[i];
113962306a36Sopenharmony_ci		header.len = table->entry_count *
114062306a36Sopenharmony_ci			     table->ops->packed_entry_size / 4;
114162306a36Sopenharmony_ci		sja1105_table_header_pack_with_crc(p, &header);
114262306a36Sopenharmony_ci		p += SJA1105_SIZE_TABLE_HEADER;
114362306a36Sopenharmony_ci		table_start = p;
114462306a36Sopenharmony_ci		for (j = 0; j < table->entry_count; j++) {
114562306a36Sopenharmony_ci			u8 *entry_ptr = table->entries;
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ci			entry_ptr += j * table->ops->unpacked_entry_size;
114862306a36Sopenharmony_ci			memset(p, 0, table->ops->packed_entry_size);
114962306a36Sopenharmony_ci			table->ops->packing(p, entry_ptr, PACK);
115062306a36Sopenharmony_ci			p += table->ops->packed_entry_size;
115162306a36Sopenharmony_ci		}
115262306a36Sopenharmony_ci		sja1105_table_write_crc(table_start, p);
115362306a36Sopenharmony_ci		p += 4;
115462306a36Sopenharmony_ci	}
115562306a36Sopenharmony_ci	/* Final header:
115662306a36Sopenharmony_ci	 * Block ID does not matter
115762306a36Sopenharmony_ci	 * Length of 0 marks that header is final
115862306a36Sopenharmony_ci	 * CRC will be replaced on-the-fly on "config upload"
115962306a36Sopenharmony_ci	 */
116062306a36Sopenharmony_ci	header.block_id = 0;
116162306a36Sopenharmony_ci	header.len = 0;
116262306a36Sopenharmony_ci	header.crc = 0xDEADBEEF;
116362306a36Sopenharmony_ci	memset(p, 0, SJA1105_SIZE_TABLE_HEADER);
116462306a36Sopenharmony_ci	sja1105_table_header_packing(p, &header, PACK);
116562306a36Sopenharmony_ci}
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_cisize_t
116862306a36Sopenharmony_cisja1105_static_config_get_length(const struct sja1105_static_config *config)
116962306a36Sopenharmony_ci{
117062306a36Sopenharmony_ci	unsigned int sum;
117162306a36Sopenharmony_ci	unsigned int header_count;
117262306a36Sopenharmony_ci	enum sja1105_blk_idx i;
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ci	/* Ending header */
117562306a36Sopenharmony_ci	header_count = 1;
117662306a36Sopenharmony_ci	sum = SJA1105_SIZE_DEVICE_ID;
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci	/* Tables (headers and entries) */
117962306a36Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++) {
118062306a36Sopenharmony_ci		const struct sja1105_table *table;
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ci		table = &config->tables[i];
118362306a36Sopenharmony_ci		if (table->entry_count)
118462306a36Sopenharmony_ci			header_count++;
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_ci		sum += table->ops->packed_entry_size * table->entry_count;
118762306a36Sopenharmony_ci	}
118862306a36Sopenharmony_ci	/* Headers have an additional CRC at the end */
118962306a36Sopenharmony_ci	sum += header_count * (SJA1105_SIZE_TABLE_HEADER + 4);
119062306a36Sopenharmony_ci	/* Last header does not have an extra CRC because there is no data */
119162306a36Sopenharmony_ci	sum -= 4;
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	return sum;
119462306a36Sopenharmony_ci}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci/* Compatibility matrices */
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci/* SJA1105E: First generation, no TTEthernet */
119962306a36Sopenharmony_ciconst struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
120062306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
120162306a36Sopenharmony_ci		.packing = sja1105et_l2_lookup_entry_packing,
120262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
120362306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY,
120462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
120562306a36Sopenharmony_ci	},
120662306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
120762306a36Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
120862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
120962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
121062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
121162306a36Sopenharmony_ci	},
121262306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
121362306a36Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
121462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
121562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
121662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
121762306a36Sopenharmony_ci	},
121862306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
121962306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
122062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
122162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
122262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
122362306a36Sopenharmony_ci	},
122462306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
122562306a36Sopenharmony_ci		.packing = sja1105et_mac_config_entry_packing,
122662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
122762306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
122862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
122962306a36Sopenharmony_ci	},
123062306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
123162306a36Sopenharmony_ci		.packing = sja1105et_l2_lookup_params_entry_packing,
123262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
123362306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY,
123462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
123562306a36Sopenharmony_ci	},
123662306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
123762306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
123862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
123962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
124062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
124162306a36Sopenharmony_ci	},
124262306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
124362306a36Sopenharmony_ci		.packing = sja1105et_avb_params_entry_packing,
124462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
124562306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY,
124662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
124762306a36Sopenharmony_ci	},
124862306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
124962306a36Sopenharmony_ci		.packing = sja1105et_general_params_entry_packing,
125062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
125162306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY,
125262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
125362306a36Sopenharmony_ci	},
125462306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
125562306a36Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
125662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
125762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
125862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
125962306a36Sopenharmony_ci	},
126062306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
126162306a36Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
126262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
126362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
126462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
126562306a36Sopenharmony_ci	},
126662306a36Sopenharmony_ci};
126762306a36Sopenharmony_ci
126862306a36Sopenharmony_ci/* SJA1105T: First generation, TTEthernet */
126962306a36Sopenharmony_ciconst struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = {
127062306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
127162306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_packing,
127262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
127362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY,
127462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_COUNT,
127562306a36Sopenharmony_ci	},
127662306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
127762306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_entry_packing,
127862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
127962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
128062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
128162306a36Sopenharmony_ci	},
128262306a36Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
128362306a36Sopenharmony_ci		.packing = sja1105_vl_lookup_entry_packing,
128462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
128562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
128662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT,
128762306a36Sopenharmony_ci	},
128862306a36Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
128962306a36Sopenharmony_ci		.packing = sja1105_vl_policing_entry_packing,
129062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
129162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
129262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_POLICING_COUNT,
129362306a36Sopenharmony_ci	},
129462306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
129562306a36Sopenharmony_ci		.packing = sja1105_vl_forwarding_entry_packing,
129662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
129762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
129862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT,
129962306a36Sopenharmony_ci	},
130062306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
130162306a36Sopenharmony_ci		.packing = sja1105et_l2_lookup_entry_packing,
130262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
130362306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY,
130462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
130562306a36Sopenharmony_ci	},
130662306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
130762306a36Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
130862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
130962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
131062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
131162306a36Sopenharmony_ci	},
131262306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
131362306a36Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
131462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
131562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
131662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
131762306a36Sopenharmony_ci	},
131862306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
131962306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
132062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
132162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
132262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
132362306a36Sopenharmony_ci	},
132462306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
132562306a36Sopenharmony_ci		.packing = sja1105et_mac_config_entry_packing,
132662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
132762306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
132862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
132962306a36Sopenharmony_ci	},
133062306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
133162306a36Sopenharmony_ci		.packing = sja1105_schedule_params_entry_packing,
133262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
133362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
133462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
133562306a36Sopenharmony_ci	},
133662306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
133762306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
133862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
133962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
134062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
134162306a36Sopenharmony_ci	},
134262306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
134362306a36Sopenharmony_ci		.packing = sja1105_vl_forwarding_params_entry_packing,
134462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
134562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
134662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
134762306a36Sopenharmony_ci	},
134862306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
134962306a36Sopenharmony_ci		.packing = sja1105et_l2_lookup_params_entry_packing,
135062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
135162306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY,
135262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
135362306a36Sopenharmony_ci	},
135462306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
135562306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
135662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
135762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
135862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
135962306a36Sopenharmony_ci	},
136062306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
136162306a36Sopenharmony_ci		.packing = sja1105et_avb_params_entry_packing,
136262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
136362306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY,
136462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
136562306a36Sopenharmony_ci	},
136662306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
136762306a36Sopenharmony_ci		.packing = sja1105et_general_params_entry_packing,
136862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
136962306a36Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY,
137062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
137162306a36Sopenharmony_ci	},
137262306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
137362306a36Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
137462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
137562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
137662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
137762306a36Sopenharmony_ci	},
137862306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
137962306a36Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
138062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
138162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
138262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
138362306a36Sopenharmony_ci	},
138462306a36Sopenharmony_ci};
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci/* SJA1105P: Second generation, no TTEthernet, no SGMII */
138762306a36Sopenharmony_ciconst struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
138862306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
138962306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
139062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
139162306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
139262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
139362306a36Sopenharmony_ci	},
139462306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
139562306a36Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
139662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
139762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
139862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
139962306a36Sopenharmony_ci	},
140062306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
140162306a36Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
140262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
140362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
140462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
140562306a36Sopenharmony_ci	},
140662306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
140762306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
140862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
140962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
141062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
141162306a36Sopenharmony_ci	},
141262306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
141362306a36Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
141462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
141562306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
141662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
141762306a36Sopenharmony_ci	},
141862306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
141962306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
142062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
142162306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
142262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
142362306a36Sopenharmony_ci	},
142462306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
142562306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
142662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
142762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
142862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
142962306a36Sopenharmony_ci	},
143062306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
143162306a36Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
143262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
143362306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
143462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
143562306a36Sopenharmony_ci	},
143662306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
143762306a36Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
143862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
143962306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
144062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
144162306a36Sopenharmony_ci	},
144262306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
144362306a36Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
144462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
144562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
144662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
144762306a36Sopenharmony_ci	},
144862306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
144962306a36Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
145062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
145162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
145262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
145362306a36Sopenharmony_ci	},
145462306a36Sopenharmony_ci};
145562306a36Sopenharmony_ci
145662306a36Sopenharmony_ci/* SJA1105Q: Second generation, TTEthernet, no SGMII */
145762306a36Sopenharmony_ciconst struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = {
145862306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
145962306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_packing,
146062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
146162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY,
146262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_COUNT,
146362306a36Sopenharmony_ci	},
146462306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
146562306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_entry_packing,
146662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
146762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
146862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
146962306a36Sopenharmony_ci	},
147062306a36Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
147162306a36Sopenharmony_ci		.packing = sja1105_vl_lookup_entry_packing,
147262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
147362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
147462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT,
147562306a36Sopenharmony_ci	},
147662306a36Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
147762306a36Sopenharmony_ci		.packing = sja1105_vl_policing_entry_packing,
147862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
147962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
148062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_POLICING_COUNT,
148162306a36Sopenharmony_ci	},
148262306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
148362306a36Sopenharmony_ci		.packing = sja1105_vl_forwarding_entry_packing,
148462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
148562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
148662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT,
148762306a36Sopenharmony_ci	},
148862306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
148962306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
149062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
149162306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
149262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
149362306a36Sopenharmony_ci	},
149462306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
149562306a36Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
149662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
149762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
149862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
149962306a36Sopenharmony_ci	},
150062306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
150162306a36Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
150262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
150362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
150462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
150562306a36Sopenharmony_ci	},
150662306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
150762306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
150862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
150962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
151062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
151162306a36Sopenharmony_ci	},
151262306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
151362306a36Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
151462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
151562306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
151662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
151762306a36Sopenharmony_ci	},
151862306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
151962306a36Sopenharmony_ci		.packing = sja1105_schedule_params_entry_packing,
152062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
152162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
152262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
152362306a36Sopenharmony_ci	},
152462306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
152562306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
152662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
152762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
152862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
152962306a36Sopenharmony_ci	},
153062306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
153162306a36Sopenharmony_ci		.packing = sja1105_vl_forwarding_params_entry_packing,
153262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
153362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
153462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
153562306a36Sopenharmony_ci	},
153662306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
153762306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
153862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
153962306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
154062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
154162306a36Sopenharmony_ci	},
154262306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
154362306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
154462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
154562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
154662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
154762306a36Sopenharmony_ci	},
154862306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
154962306a36Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
155062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
155162306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
155262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
155362306a36Sopenharmony_ci	},
155462306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
155562306a36Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
155662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
155762306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
155862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
155962306a36Sopenharmony_ci	},
156062306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
156162306a36Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
156262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
156362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
156462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
156562306a36Sopenharmony_ci	},
156662306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
156762306a36Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
156862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
156962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
157062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
157162306a36Sopenharmony_ci	},
157262306a36Sopenharmony_ci};
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_ci/* SJA1105R: Second generation, no TTEthernet, SGMII */
157562306a36Sopenharmony_ciconst struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
157662306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
157762306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
157862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
157962306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
158062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
158162306a36Sopenharmony_ci	},
158262306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
158362306a36Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
158462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
158562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
158662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
158762306a36Sopenharmony_ci	},
158862306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
158962306a36Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
159062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
159162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
159262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
159362306a36Sopenharmony_ci	},
159462306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
159562306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
159662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
159762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
159862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
159962306a36Sopenharmony_ci	},
160062306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
160162306a36Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
160262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
160362306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
160462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
160562306a36Sopenharmony_ci	},
160662306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
160762306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
160862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
160962306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
161062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
161162306a36Sopenharmony_ci	},
161262306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
161362306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
161462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
161562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
161662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
161762306a36Sopenharmony_ci	},
161862306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
161962306a36Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
162062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
162162306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
162262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
162362306a36Sopenharmony_ci	},
162462306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
162562306a36Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
162662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
162762306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
162862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
162962306a36Sopenharmony_ci	},
163062306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
163162306a36Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
163262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
163362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
163462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
163562306a36Sopenharmony_ci	},
163662306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
163762306a36Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
163862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
163962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
164062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
164162306a36Sopenharmony_ci	},
164262306a36Sopenharmony_ci};
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_ci/* SJA1105S: Second generation, TTEthernet, SGMII */
164562306a36Sopenharmony_ciconst struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX] = {
164662306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
164762306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_packing,
164862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
164962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY,
165062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_COUNT,
165162306a36Sopenharmony_ci	},
165262306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
165362306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_entry_packing,
165462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
165562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
165662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
165762306a36Sopenharmony_ci	},
165862306a36Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
165962306a36Sopenharmony_ci		.packing = sja1105_vl_lookup_entry_packing,
166062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
166162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
166262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT,
166362306a36Sopenharmony_ci	},
166462306a36Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
166562306a36Sopenharmony_ci		.packing = sja1105_vl_policing_entry_packing,
166662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
166762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
166862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_POLICING_COUNT,
166962306a36Sopenharmony_ci	},
167062306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
167162306a36Sopenharmony_ci		.packing = sja1105_vl_forwarding_entry_packing,
167262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
167362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
167462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT,
167562306a36Sopenharmony_ci	},
167662306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
167762306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
167862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
167962306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
168062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
168162306a36Sopenharmony_ci	},
168262306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
168362306a36Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
168462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
168562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
168662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
168762306a36Sopenharmony_ci	},
168862306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
168962306a36Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
169062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
169162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
169262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
169362306a36Sopenharmony_ci	},
169462306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
169562306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
169662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
169762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
169862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
169962306a36Sopenharmony_ci	},
170062306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
170162306a36Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
170262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
170362306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
170462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
170562306a36Sopenharmony_ci	},
170662306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
170762306a36Sopenharmony_ci		.packing = sja1105_schedule_params_entry_packing,
170862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
170962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
171062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
171162306a36Sopenharmony_ci	},
171262306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
171362306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
171462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
171562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
171662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
171762306a36Sopenharmony_ci	},
171862306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
171962306a36Sopenharmony_ci		.packing = sja1105_vl_forwarding_params_entry_packing,
172062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
172162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
172262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
172362306a36Sopenharmony_ci	},
172462306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
172562306a36Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
172662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
172762306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
172862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
172962306a36Sopenharmony_ci	},
173062306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
173162306a36Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
173262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
173362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
173462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
173562306a36Sopenharmony_ci	},
173662306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
173762306a36Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
173862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
173962306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
174062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
174162306a36Sopenharmony_ci	},
174262306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
174362306a36Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
174462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
174562306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
174662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
174762306a36Sopenharmony_ci	},
174862306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
174962306a36Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
175062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
175162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
175262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
175362306a36Sopenharmony_ci	},
175462306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
175562306a36Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
175662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
175762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
175862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
175962306a36Sopenharmony_ci	},
176062306a36Sopenharmony_ci};
176162306a36Sopenharmony_ci
176262306a36Sopenharmony_ci/* SJA1110A: Third generation */
176362306a36Sopenharmony_ciconst struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX] = {
176462306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
176562306a36Sopenharmony_ci		.packing = sja1110_schedule_entry_packing,
176662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
176762306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_SCHEDULE_ENTRY,
176862306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_SCHEDULE_COUNT,
176962306a36Sopenharmony_ci	},
177062306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
177162306a36Sopenharmony_ci		.packing = sja1110_schedule_entry_points_entry_packing,
177262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
177362306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
177462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
177562306a36Sopenharmony_ci	},
177662306a36Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
177762306a36Sopenharmony_ci		.packing = sja1110_vl_lookup_entry_packing,
177862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
177962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
178062306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_VL_LOOKUP_COUNT,
178162306a36Sopenharmony_ci	},
178262306a36Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
178362306a36Sopenharmony_ci		.packing = sja1110_vl_policing_entry_packing,
178462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
178562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
178662306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_VL_POLICING_COUNT,
178762306a36Sopenharmony_ci	},
178862306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
178962306a36Sopenharmony_ci		.packing = sja1110_vl_forwarding_entry_packing,
179062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
179162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
179262306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_VL_FORWARDING_COUNT,
179362306a36Sopenharmony_ci	},
179462306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
179562306a36Sopenharmony_ci		.packing = sja1110_l2_lookup_entry_packing,
179662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
179762306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_L2_LOOKUP_ENTRY,
179862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
179962306a36Sopenharmony_ci	},
180062306a36Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
180162306a36Sopenharmony_ci		.packing = sja1110_l2_policing_entry_packing,
180262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
180362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
180462306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_L2_POLICING_COUNT,
180562306a36Sopenharmony_ci	},
180662306a36Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
180762306a36Sopenharmony_ci		.packing = sja1110_vlan_lookup_entry_packing,
180862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
180962306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_VLAN_LOOKUP_ENTRY,
181062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
181162306a36Sopenharmony_ci	},
181262306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
181362306a36Sopenharmony_ci		.packing = sja1110_l2_forwarding_entry_packing,
181462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
181562306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
181662306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_L2_FORWARDING_COUNT,
181762306a36Sopenharmony_ci	},
181862306a36Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
181962306a36Sopenharmony_ci		.packing = sja1110_mac_config_entry_packing,
182062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
182162306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
182262306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_MAC_CONFIG_COUNT,
182362306a36Sopenharmony_ci	},
182462306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
182562306a36Sopenharmony_ci		.packing = sja1110_schedule_params_entry_packing,
182662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
182762306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
182862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
182962306a36Sopenharmony_ci	},
183062306a36Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
183162306a36Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
183262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
183362306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
183462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
183562306a36Sopenharmony_ci	},
183662306a36Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
183762306a36Sopenharmony_ci		.packing = sja1110_vl_forwarding_params_entry_packing,
183862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
183962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
184062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
184162306a36Sopenharmony_ci	},
184262306a36Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
184362306a36Sopenharmony_ci		.packing = sja1110_l2_lookup_params_entry_packing,
184462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
184562306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_L2_LOOKUP_PARAMS_ENTRY,
184662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
184762306a36Sopenharmony_ci	},
184862306a36Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
184962306a36Sopenharmony_ci		.packing = sja1110_l2_forwarding_params_entry_packing,
185062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
185162306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
185262306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
185362306a36Sopenharmony_ci	},
185462306a36Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
185562306a36Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
185662306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
185762306a36Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
185862306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
185962306a36Sopenharmony_ci	},
186062306a36Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
186162306a36Sopenharmony_ci		.packing = sja1110_general_params_entry_packing,
186262306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
186362306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_GENERAL_PARAMS_ENTRY,
186462306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
186562306a36Sopenharmony_ci	},
186662306a36Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
186762306a36Sopenharmony_ci		.packing = sja1110_retagging_entry_packing,
186862306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
186962306a36Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
187062306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
187162306a36Sopenharmony_ci	},
187262306a36Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
187362306a36Sopenharmony_ci		.packing = sja1110_xmii_params_entry_packing,
187462306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
187562306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_XMII_PARAMS_ENTRY,
187662306a36Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
187762306a36Sopenharmony_ci	},
187862306a36Sopenharmony_ci	[BLK_IDX_PCP_REMAPPING] = {
187962306a36Sopenharmony_ci		.packing = sja1110_pcp_remapping_entry_packing,
188062306a36Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1110_pcp_remapping_entry),
188162306a36Sopenharmony_ci		.packed_entry_size = SJA1110_SIZE_PCP_REMAPPING_ENTRY,
188262306a36Sopenharmony_ci		.max_entry_count = SJA1110_MAX_PCP_REMAPPING_COUNT,
188362306a36Sopenharmony_ci	},
188462306a36Sopenharmony_ci};
188562306a36Sopenharmony_ci
188662306a36Sopenharmony_ciint sja1105_static_config_init(struct sja1105_static_config *config,
188762306a36Sopenharmony_ci			       const struct sja1105_table_ops *static_ops,
188862306a36Sopenharmony_ci			       u64 device_id)
188962306a36Sopenharmony_ci{
189062306a36Sopenharmony_ci	enum sja1105_blk_idx i;
189162306a36Sopenharmony_ci
189262306a36Sopenharmony_ci	*config = (struct sja1105_static_config) {0};
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_ci	/* Transfer static_ops array from priv into per-table ops
189562306a36Sopenharmony_ci	 * for handier access
189662306a36Sopenharmony_ci	 */
189762306a36Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++)
189862306a36Sopenharmony_ci		config->tables[i].ops = &static_ops[i];
189962306a36Sopenharmony_ci
190062306a36Sopenharmony_ci	config->device_id = device_id;
190162306a36Sopenharmony_ci	return 0;
190262306a36Sopenharmony_ci}
190362306a36Sopenharmony_ci
190462306a36Sopenharmony_civoid sja1105_static_config_free(struct sja1105_static_config *config)
190562306a36Sopenharmony_ci{
190662306a36Sopenharmony_ci	enum sja1105_blk_idx i;
190762306a36Sopenharmony_ci
190862306a36Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++) {
190962306a36Sopenharmony_ci		if (config->tables[i].entry_count) {
191062306a36Sopenharmony_ci			kfree(config->tables[i].entries);
191162306a36Sopenharmony_ci			config->tables[i].entry_count = 0;
191262306a36Sopenharmony_ci		}
191362306a36Sopenharmony_ci	}
191462306a36Sopenharmony_ci}
191562306a36Sopenharmony_ci
191662306a36Sopenharmony_ciint sja1105_table_delete_entry(struct sja1105_table *table, int i)
191762306a36Sopenharmony_ci{
191862306a36Sopenharmony_ci	size_t entry_size = table->ops->unpacked_entry_size;
191962306a36Sopenharmony_ci	u8 *entries = table->entries;
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_ci	if (i > table->entry_count)
192262306a36Sopenharmony_ci		return -ERANGE;
192362306a36Sopenharmony_ci
192462306a36Sopenharmony_ci	memmove(entries + i * entry_size, entries + (i + 1) * entry_size,
192562306a36Sopenharmony_ci		(table->entry_count - i) * entry_size);
192662306a36Sopenharmony_ci
192762306a36Sopenharmony_ci	table->entry_count--;
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_ci	return 0;
193062306a36Sopenharmony_ci}
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_ci/* No pointers to table->entries should be kept when this is called. */
193362306a36Sopenharmony_ciint sja1105_table_resize(struct sja1105_table *table, size_t new_count)
193462306a36Sopenharmony_ci{
193562306a36Sopenharmony_ci	size_t entry_size = table->ops->unpacked_entry_size;
193662306a36Sopenharmony_ci	void *new_entries, *old_entries = table->entries;
193762306a36Sopenharmony_ci
193862306a36Sopenharmony_ci	if (new_count > table->ops->max_entry_count)
193962306a36Sopenharmony_ci		return -ERANGE;
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_ci	new_entries = kcalloc(new_count, entry_size, GFP_KERNEL);
194262306a36Sopenharmony_ci	if (!new_entries)
194362306a36Sopenharmony_ci		return -ENOMEM;
194462306a36Sopenharmony_ci
194562306a36Sopenharmony_ci	memcpy(new_entries, old_entries, min(new_count, table->entry_count) *
194662306a36Sopenharmony_ci		entry_size);
194762306a36Sopenharmony_ci
194862306a36Sopenharmony_ci	table->entries = new_entries;
194962306a36Sopenharmony_ci	table->entry_count = new_count;
195062306a36Sopenharmony_ci	kfree(old_entries);
195162306a36Sopenharmony_ci	return 0;
195262306a36Sopenharmony_ci}
1953