drivers/net/dsa/realtek/rtl8365mb_vlan.c
Source file repositories/reference/linux-study-clean/drivers/net/dsa/realtek/rtl8365mb_vlan.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/dsa/realtek/rtl8365mb_vlan.c- Extension
.c- Size
- 29683 bytes
- Lines
- 945
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
rtl8365mb_vlan.hrtl8365mb_table.hlinux/if_bridge.hlinux/lockdep.hlinux/regmap.h
Detected Declarations
struct rtl8365mb_vlan4kstruct rtl8365mb_vlanmcfunction rtl8365mb_vlan_4k_readfunction rtl8365mb_vlan_4k_writefunction rtl8365mb_vlan_4k_port_setfunction rtl8365mb_vlan_4k_port_addfunction rtl8365mb_vlan_4k_port_delfunction rtl8365mb_vlan_mc_readfunction rtl8365mb_vlan_mc_writefunction rtl8365mb_vlan_mc_erasefunction rtl8365mb_vlan_mc_findfunction rtl8365mb_vlan_port_get_pvid_idxfunction rtl8365mb_vlan_mc_port_setfunction rtl8365mb_vlan_port_set_pvidfunction rtl8365mb_vlan_get_pvid_mcfunction rtl8365mb_vlan_port_get_pvidfunction rtl8365mb_vlan_port_get_framefilterfunction rtl8365mb_vlan_port_set_framefilterfunction rtl8365mb_vlan_pvid_port_setfunction rtl8365mb_vlan_pvid_port_clear
Annotated Snippet
struct rtl8365mb_vlan4k {
u16 vid;
u16 member;
u16 untag;
u8 fid : 4;
u8 priority : 3;
u8 priority_en : 1;
u8 policing_en : 1;
u8 ivl_en : 1;
u8 meteridx : 6;
};
/*
* struct rtl8365mb_vlanmc - VLAN membership config
* @evid: Enhanced VLAN ID (0~8191)
* @member: port mask of ports in this VLAN
* @fid: filter ID - only used with SVL (unused)
* @priority: priority classification (unused)
* @priority_en: enable priority (unused)
* @policing_en: enable policing (unused)
* @meteridx: metering index (unused)
*
* This structure is used to get/set entries in the VLAN membership
* configuration database. This feature is largely vestigial, but
* still needed for at least the following features:
* - PVID configuration
* - ACL configuration
* - selection of VLAN by the CPU tag when VSEL=1, although the switch
* can also select VLAN based on the VLAN tag if VSEL=0
*
* This is a low-level structure and it is recommended to interface with
* the VLAN membership config database via &struct rtl8365mb_vlanmc_entry.
*/
struct rtl8365mb_vlanmc {
u16 evid;
u16 member;
u8 fid : 4;
u8 priority : 3;
u8 priority_en : 1;
u8 policing_en : 1;
u8 meteridx : 6;
};
static int rtl8365mb_vlan_4k_read(struct realtek_priv *priv, u16 vid,
struct rtl8365mb_vlan4k *vlan4k)
{
u16 data[RTL8365MB_CVLAN_ENTRY_SIZE];
int val;
int ret;
ret = rtl8365mb_table_query(priv, RTL8365MB_TABLE_CVLAN,
RTL8365MB_TABLE_OP_READ, &vid, 0, 0,
data, ARRAY_SIZE(data));
if (ret)
return ret;
/* Unpack table entry */
memset(vlan4k, 0, sizeof(*vlan4k));
vlan4k->vid = vid;
val = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D0_MBR_MASK, data[0]);
vlan4k->member = FIELD_PREP(RTL8365MB_CVLAN_MBR_LO_MASK, val);
val = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D2_MBR_EXT_MASK, data[2]);
vlan4k->member |= FIELD_PREP(RTL8365MB_CVLAN_MBR_HI_MASK, val);
val = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D0_UNTAG_MASK, data[0]);
vlan4k->untag = FIELD_PREP(RTL8365MB_CVLAN_UNTAG_LO_MASK, val);
val = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D2_UNTAG_EXT_MASK, data[2]);
vlan4k->untag |= FIELD_PREP(RTL8365MB_CVLAN_UNTAG_HI_MASK, val);
vlan4k->fid = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D1_FID_MASK, data[1]);
vlan4k->priority_en =
FIELD_GET(RTL8365MB_CVLAN_ENTRY_D1_VBPEN_MASK, data[1]);
vlan4k->priority =
FIELD_GET(RTL8365MB_CVLAN_ENTRY_D1_VBPRI_MASK, data[1]);
vlan4k->policing_en =
FIELD_GET(RTL8365MB_CVLAN_ENTRY_D1_ENVLANPOL_MASK, data[1]);
val = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D1_METERIDX_MASK, data[1]);
val = FIELD_PREP(RTL8365MB_CVLAN_METERIDX_LO_MASK, val);
vlan4k->meteridx = val;
val = FIELD_GET(RTL8365MB_CVLAN_ENTRY_D2_METERIDX_EXT_MASK, data[2]);
val = FIELD_PREP(RTL8365MB_CVLAN_METERIDX_HI_MASK, val);
vlan4k->meteridx |= val;
vlan4k->ivl_en =
FIELD_GET(RTL8365MB_CVLAN_ENTRY_D1_IVL_SVL_MASK, data[1]);
return 0;
}
Annotation
- Immediate include surface: `rtl8365mb_vlan.h`, `rtl8365mb_table.h`, `linux/if_bridge.h`, `linux/lockdep.h`, `linux/regmap.h`.
- Detected declarations: `struct rtl8365mb_vlan4k`, `struct rtl8365mb_vlanmc`, `function rtl8365mb_vlan_4k_read`, `function rtl8365mb_vlan_4k_write`, `function rtl8365mb_vlan_4k_port_set`, `function rtl8365mb_vlan_4k_port_add`, `function rtl8365mb_vlan_4k_port_del`, `function rtl8365mb_vlan_mc_read`, `function rtl8365mb_vlan_mc_write`, `function rtl8365mb_vlan_mc_erase`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.