drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c- Extension
.c- Size
- 24293 bytes
- Lines
- 847
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
ice_vsi_vlan_lib.hice_lib.hice_fltr.hice.h
Detected Declarations
function print_invalid_tpidfunction validate_vlanfunction ice_vsi_add_vlanfunction ice_vsi_del_vlanfunction ice_vsi_manage_vlan_insertionfunction ice_vsi_manage_vlan_strippingfunction ice_vsi_ena_inner_strippingfunction ice_vsi_dis_inner_strippingfunction ice_vsi_ena_inner_insertionfunction ice_vsi_dis_inner_insertionfunction ice_save_vlan_infofunction ice_restore_vlan_infofunction __ice_vsi_set_inner_port_vlanfunction ice_vsi_set_inner_port_vlanfunction ice_vsi_clear_inner_port_vlanfunction ice_cfg_vlan_pruningfunction ice_vsi_ena_rx_vlan_filteringfunction ice_vsi_dis_rx_vlan_filteringfunction ice_cfg_vlan_antispooffunction ice_vsi_ena_tx_vlan_filteringfunction ice_vsi_dis_tx_vlan_filteringfunction tpid_to_vsi_outer_vlan_typefunction ice_vsi_ena_outer_strippingfunction ice_vsi_dis_outer_strippingfunction ice_vsi_ena_outer_insertionfunction ice_vsi_dis_outer_insertionfunction __ice_vsi_set_outer_port_vlanfunction ice_vsi_set_outer_port_vlanfunction configfunction ice_vsi_clear_port_vlan
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2019-2021, Intel Corporation. */
#include "ice_vsi_vlan_lib.h"
#include "ice_lib.h"
#include "ice_fltr.h"
#include "ice.h"
static void print_invalid_tpid(struct ice_vsi *vsi, u16 tpid)
{
dev_err(ice_pf_to_dev(vsi->back), "%s %d specified invalid VLAN tpid 0x%04x\n",
ice_vsi_type_str(vsi->type), vsi->idx, tpid);
}
/**
* validate_vlan - check if the ice_vlan passed in is valid
* @vsi: VSI used for printing error message
* @vlan: ice_vlan structure to validate
*
* Return true if the VLAN TPID is valid or if the VLAN TPID is 0 and the VLAN
* VID is 0, which allows for non-zero VLAN filters with the specified VLAN TPID
* and untagged VLAN 0 filters to be added to the prune list respectively.
*/
static bool validate_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
{
if (vlan->tpid != ETH_P_8021Q && vlan->tpid != ETH_P_8021AD &&
vlan->tpid != ETH_P_QINQ1 && (vlan->tpid || vlan->vid)) {
print_invalid_tpid(vsi, vlan->tpid);
return false;
}
return true;
}
/**
* ice_vsi_add_vlan - default add VLAN implementation for all VSI types
* @vsi: VSI being configured
* @vlan: VLAN filter to add
*/
int ice_vsi_add_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
{
int err;
if (!validate_vlan(vsi, vlan))
return -EINVAL;
err = ice_fltr_add_vlan(vsi, vlan);
if (!err)
vsi->num_vlan++;
else if (err == -EEXIST)
err = 0;
else
dev_err(ice_pf_to_dev(vsi->back), "Failure Adding VLAN %d on VSI %i, status %d\n",
vlan->vid, vsi->vsi_num, err);
return err;
}
/**
* ice_vsi_del_vlan - default del VLAN implementation for all VSI types
* @vsi: VSI being configured
* @vlan: VLAN filter to delete
*/
int ice_vsi_del_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
{
struct ice_pf *pf = vsi->back;
struct device *dev;
int err;
if (!validate_vlan(vsi, vlan))
return -EINVAL;
dev = ice_pf_to_dev(pf);
err = ice_fltr_remove_vlan(vsi, vlan);
if (!err)
vsi->num_vlan--;
else if (err == -ENOENT || err == -EBUSY)
err = 0;
else
dev_err(dev, "Error removing VLAN %d on VSI %i error: %d\n",
vlan->vid, vsi->vsi_num, err);
return err;
}
/**
* ice_vsi_manage_vlan_insertion - Manage VLAN insertion for the VSI for Tx
* @vsi: the VSI being changed
*/
Annotation
- Immediate include surface: `ice_vsi_vlan_lib.h`, `ice_lib.h`, `ice_fltr.h`, `ice.h`.
- Detected declarations: `function print_invalid_tpid`, `function validate_vlan`, `function ice_vsi_add_vlan`, `function ice_vsi_del_vlan`, `function ice_vsi_manage_vlan_insertion`, `function ice_vsi_manage_vlan_stripping`, `function ice_vsi_ena_inner_stripping`, `function ice_vsi_dis_inner_stripping`, `function ice_vsi_ena_inner_insertion`, `function ice_vsi_dis_inner_insertion`.
- 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.