Hello @PavelL
static status_t wait_for_valid_clear(uint8_t swt) {
status_t status;
uint32_t ctrl = 0;
do {
status = SWITCH_DRV_Read(swt, 1, DYN_BE_LKP_CTRL, &ctrl);
if (status != STATUS_SUCCESS) return status;
} while (ctrl & DYN_BE_LKP_CTRL_VALID_MASK);
if (ctrl & DYN_BE_LKP_CTRL_ERROR_MASK) return STATUS_ERROR;
return STATUS_SUCCESS;
}
status_t SJA1110_AddL2LookupEntry_Dynamic(uint8_t swt) {
status_t status;
// MAC = 66:11:22:33:44:55
uint8_t mac[6] = {0x66, 0x11, 0x22, 0x33, 0x44, 0x55};
uint64_t mac64 = ((uint64_t)mac[0] << 40) | ((uint64_t)mac[1] << 32) | ((uint64_t)mac[2] << 24) |
((uint64_t)mac[3] << 16) | ((uint64_t)mac[4] << | (uint64_t)mac[5];
// Prepare L2 lookup entry fields
uint32_t entry[WORD_COUNT] = {0};
entry[0] = ((5 & 0xF) << 24) | (1 << 11); // SrcPort, DestPorts 1 & 2
entry[1] = (uint32_t)(mac64 & 0xFFFFFFFF);
entry[2] = (uint32_t)((mac64 >> 32) & 0xFFFF);
entry[2] |= (3 << 16); // VLAN ID = 3
entry[3] = 0; // Optional masks
entry[4] = 0;
entry[5] = (8 << 4) | (1 << 10); // CB_SID_IN = 8, CB_ON_DA = 1
// Wait until previous operation completes
status = wait_for_valid_clear(swt);
if (status != STATUS_SUCCESS) return status;
// Write L2 entry data to registers
status = SWITCH_DRV_Write(swt, WORD_COUNT, DYN_BE_LKP_ENTRY0, entry);
if (status != STATUS_SUCCESS) return status;
// Construct control register value
uint32_t ctrl = DYN_BE_LKP_CTRL_VALID_MASK |
DYN_BE_LKP_CTRL_RDWRSET_MASK |
(HOSTCMD_WRITE << DYN_BE_LKP_CTRL_HOSTCMD_SHIFT);
// Trigger write
status = SWITCH_DRV_Write(swt, 1, DYN_BE_LKP_CTRL, &ctrl);
if (status != STATUS_SUCCESS) return status;
// Wait for operation to complete
return wait_for_valid_clear(swt);
}
Whether this code can be utilized for generating a Dynamic entry ?
if this code is correct, where the function needs to be called??
Regards
Atkinson