mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Fix "Get Configuration" on vlan.html
I noticed that entering some vlan config, clicking "Update/Create", then clicking "Get Configuration" resulted in Tagged/Untagged/PVID displaying completely wrong data. It looks like the parisng in fetchVLAN() in vlan.js was just completely disconnected from the layout of the registers read by vlan_get() in rtl837x_port.c. Who knows how that happened. 1. Fix fetchVLAN() member/untag parsing: the old code read bits [9:0] as untagged and bits [10:19] as tagged, but the VLAN table register layout is members in [9:0] and untag in [19:10]. Now correctly derives tagged (member && !untag) and untagged (member && untag). 2. Add PVID to vlan.json response: PVID is stored per-port in separate PVID registers (RTL837x_PVID_BASE_REG), not in the VLAN table entry. The old code nonsensically tried to read it from bits [20:29] of the VLAN table. Add port_pvid_get() and build a pvid bitmask in send_vlan() so the JS can parse it correctly. 3. Remove auto-PVID logic from setC(): setC() is called by fetchVLAN() while it's loading existing config, and so this logic mangled the display of the existing config. Also, it doesn't make sense to auto-set the PVID for tagged members (PVID relates to untagged ingress.)
This commit is contained in:
@@ -78,6 +78,17 @@ void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t port_pvid_get(uint8_t port) __banked
|
||||
{
|
||||
uint16_t reg = RTL837x_PVID_BASE_REG + ((port >> 1) << 2);
|
||||
reg_read_m(reg);
|
||||
if (port & 0x1) {
|
||||
return (sfr_data[1] << 4) | (sfr_data[2] >> 4);
|
||||
} else {
|
||||
return ((sfr_data[2] & 0x0f) << 8) | sfr_data[3];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void vlan_delete(uint16_t vlan) __banked
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user