47 lines
		
	
	
		
			999 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			999 B
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| #include "sparx5_main.h"
 | |
| 
 | |
| void sparx5_pgid_init(struct sparx5 *spx5)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i = 0; i < PGID_TABLE_SIZE; i++)
 | |
| 		spx5->pgid_map[i] = SPX5_PGID_FREE;
 | |
| 
 | |
| 	/* Reserved for unicast, flood control, broadcast, and CPU.
 | |
| 	 * These cannot be freed.
 | |
| 	 */
 | |
| 	for (i = 0; i <= PGID_CPU; i++)
 | |
| 		spx5->pgid_map[i] = SPX5_PGID_RESERVED;
 | |
| }
 | |
| 
 | |
| int sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	/* The multicast area starts at index 65, but the first 7
 | |
| 	 * are reserved for flood masks and CPU. Start alloc after that.
 | |
| 	 */
 | |
| 	for (i = PGID_MCAST_START; i < PGID_TABLE_SIZE; i++) {
 | |
| 		if (spx5->pgid_map[i] == SPX5_PGID_FREE) {
 | |
| 			spx5->pgid_map[i] = SPX5_PGID_MULTICAST;
 | |
| 			*idx = i;
 | |
| 			return 0;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return -EBUSY;
 | |
| }
 | |
| 
 | |
| int sparx5_pgid_free(struct sparx5 *spx5, u16 idx)
 | |
| {
 | |
| 	if (idx <= PGID_CPU || idx >= PGID_TABLE_SIZE)
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	if (spx5->pgid_map[idx] == SPX5_PGID_FREE)
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	spx5->pgid_map[idx] = SPX5_PGID_FREE;
 | |
| 	return 0;
 | |
| }
 |