1 | // SPDX-License-Identifier: GPL-2.0+ |
---|---|
2 | #include "sparx5_main.h" |
3 | |
4 | void sparx5_pgid_init(struct sparx5 *spx5) |
5 | { |
6 | int i; |
7 | |
8 | for (i = 0; i < PGID_TABLE_SIZE; i++) |
9 | spx5->pgid_map[i] = SPX5_PGID_FREE; |
10 | |
11 | /* Reserved for unicast, flood control, broadcast, and CPU. |
12 | * These cannot be freed. |
13 | */ |
14 | for (i = 0; i <= PGID_CPU; i++) |
15 | spx5->pgid_map[i] = SPX5_PGID_RESERVED; |
16 | } |
17 | |
18 | int sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx) |
19 | { |
20 | int i; |
21 | |
22 | /* The multicast area starts at index 65, but the first 7 |
23 | * are reserved for flood masks and CPU. Start alloc after that. |
24 | */ |
25 | for (i = PGID_MCAST_START; i < PGID_TABLE_SIZE; i++) { |
26 | if (spx5->pgid_map[i] == SPX5_PGID_FREE) { |
27 | spx5->pgid_map[i] = SPX5_PGID_MULTICAST; |
28 | *idx = i; |
29 | return 0; |
30 | } |
31 | } |
32 | |
33 | return -EBUSY; |
34 | } |
35 | |
36 | int sparx5_pgid_free(struct sparx5 *spx5, u16 idx) |
37 | { |
38 | if (idx <= PGID_CPU || idx >= PGID_TABLE_SIZE) |
39 | return -EINVAL; |
40 | |
41 | if (spx5->pgid_map[idx] == SPX5_PGID_FREE) |
42 | return -EINVAL; |
43 | |
44 | spx5->pgid_map[idx] = SPX5_PGID_FREE; |
45 | return 0; |
46 | } |
47 |