drivers/net/ethernet/intel/ice/ice_vsi_vlan_ops.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/intel/ice/ice_vsi_vlan_ops.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/intel/ice/ice_vsi_vlan_ops.c
Extension
.c
Size
3138 bytes
Lines
107
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.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2019-2021, Intel Corporation. */

#include "ice_pf_vsi_vlan_ops.h"
#include "ice_vf_vsi_vlan_ops.h"
#include "ice_sf_vsi_vlan_ops.h"
#include "ice_lib.h"
#include "ice.h"

static int
op_unsupported_vlan_arg(struct ice_vsi * __always_unused vsi,
			struct ice_vlan * __always_unused vlan)
{
	return -EOPNOTSUPP;
}

static int
op_unsupported_tpid_arg(struct ice_vsi *__always_unused vsi,
			u16 __always_unused tpid)
{
	return -EOPNOTSUPP;
}

static int op_unsupported(struct ice_vsi *__always_unused vsi)
{
	return -EOPNOTSUPP;
}

/* If any new ops are added to the VSI VLAN ops interface then an unsupported
 * implementation should be set here.
 */
static struct ice_vsi_vlan_ops ops_unsupported = {
	.add_vlan = op_unsupported_vlan_arg,
	.del_vlan = op_unsupported_vlan_arg,
	.ena_stripping = op_unsupported_tpid_arg,
	.dis_stripping = op_unsupported,
	.ena_insertion = op_unsupported_tpid_arg,
	.dis_insertion = op_unsupported,
	.ena_rx_filtering = op_unsupported,
	.dis_rx_filtering = op_unsupported,
	.ena_tx_filtering = op_unsupported,
	.dis_tx_filtering = op_unsupported,
	.set_port_vlan = op_unsupported_vlan_arg,
};

/**
 * ice_vsi_init_unsupported_vlan_ops - init all VSI VLAN ops to unsupported
 * @vsi: VSI to initialize VSI VLAN ops to unsupported for
 *
 * By default all inner and outer VSI VLAN ops return -EOPNOTSUPP. This was done
 * as oppsed to leaving the ops null to prevent unexpected crashes. Instead if
 * an unsupported VSI VLAN op is called it will just return -EOPNOTSUPP.
 *
 */
static void ice_vsi_init_unsupported_vlan_ops(struct ice_vsi *vsi)
{
	vsi->outer_vlan_ops = ops_unsupported;
	vsi->inner_vlan_ops = ops_unsupported;
}

/**
 * ice_vsi_init_vlan_ops - initialize type specific VSI VLAN ops
 * @vsi: VSI to initialize ops for
 *
 * If any VSI types are added and/or require different ops than the PF or VF VSI
 * then they will have to add a case here to handle that. Also, VSI type
 * specific files should be added in the same manner that was done for PF VSI.
 */
void ice_vsi_init_vlan_ops(struct ice_vsi *vsi)
{
	/* Initialize all VSI types to have unsupported VSI VLAN ops */
	ice_vsi_init_unsupported_vlan_ops(vsi);

	switch (vsi->type) {
	case ICE_VSI_PF:
		ice_pf_vsi_init_vlan_ops(vsi);
		break;
	case ICE_VSI_VF:
		ice_vf_vsi_init_vlan_ops(vsi);
		break;
	case ICE_VSI_SF:
		ice_sf_vsi_init_vlan_ops(vsi);
		break;
	default:
		dev_dbg(ice_pf_to_dev(vsi->back), "%s does not support VLAN operations\n",
			ice_vsi_type_str(vsi->type));
		break;
	}
}

Annotation

Implementation Notes