// SPDX-License-Identifier: GPL-2.0 /* Copyright (C) 2019-2021, Intel Corporation. */ #include "ice_common.h" /** * ice_pkg_get_supported_vlan_mode - determine if DDP supports Double VLAN mode * @hw: pointer to the HW struct * @dvm: output variable to determine if DDP supports DVM(true) or SVM(false) */ static int ice_pkg_get_supported_vlan_mode(struct ice_hw *hw, bool *dvm) { … } /** * ice_aq_get_vlan_mode - get the VLAN mode of the device * @hw: pointer to the HW structure * @get_params: structure FW fills in based on the current VLAN mode config * * Get VLAN Mode Parameters (0x020D) */ static int ice_aq_get_vlan_mode(struct ice_hw *hw, struct ice_aqc_get_vlan_mode *get_params) { … } /** * ice_aq_is_dvm_ena - query FW to check if double VLAN mode is enabled * @hw: pointer to the HW structure * * Returns true if the hardware/firmware is configured in double VLAN mode, * else return false signaling that the hardware/firmware is configured in * single VLAN mode. * * Also, return false if this call fails for any reason (i.e. firmware doesn't * support this AQ call). */ static bool ice_aq_is_dvm_ena(struct ice_hw *hw) { … } /** * ice_is_dvm_ena - check if double VLAN mode is enabled * @hw: pointer to the HW structure * * The device is configured in single or double VLAN mode on initialization and * this cannot be dynamically changed during runtime. Based on this there is no * need to make an AQ call every time the driver needs to know the VLAN mode. * Instead, use the cached VLAN mode. */ bool ice_is_dvm_ena(struct ice_hw *hw) { … } /** * ice_cache_vlan_mode - cache VLAN mode after DDP is downloaded * @hw: pointer to the HW structure * * This is only called after downloading the DDP and after the global * configuration lock has been released because all ports on a device need to * cache the VLAN mode. */ static void ice_cache_vlan_mode(struct ice_hw *hw) { … } /** * ice_pkg_supports_dvm - find out if DDP supports DVM * @hw: pointer to the HW structure */ static bool ice_pkg_supports_dvm(struct ice_hw *hw) { … } /** * ice_fw_supports_dvm - find out if FW supports DVM * @hw: pointer to the HW structure */ static bool ice_fw_supports_dvm(struct ice_hw *hw) { … } /** * ice_is_dvm_supported - check if Double VLAN Mode is supported * @hw: pointer to the hardware structure * * Returns true if Double VLAN Mode (DVM) is supported and false if only Single * VLAN Mode (SVM) is supported. In order for DVM to be supported the DDP and * firmware must support it, otherwise only SVM is supported. This function * should only be called while the global config lock is held and after the * package has been successfully downloaded. */ static bool ice_is_dvm_supported(struct ice_hw *hw) { … } #define ICE_EXTERNAL_VLAN_ID_FV_IDX … #define ICE_SW_LKUP_VLAN_LOC_LKUP_IDX … #define ICE_SW_LKUP_VLAN_PKT_FLAGS_LKUP_IDX … #define ICE_SW_LKUP_PROMISC_VLAN_LOC_LKUP_IDX … #define ICE_PKT_FLAGS_0_TO_15_FV_IDX … static struct ice_update_recipe_lkup_idx_params ice_dvm_dflt_recipes[] = …; /** * ice_dvm_update_dflt_recipes - update default switch recipes in DVM * @hw: hardware structure used to update the recipes */ static int ice_dvm_update_dflt_recipes(struct ice_hw *hw) { … } /** * ice_aq_set_vlan_mode - set the VLAN mode of the device * @hw: pointer to the HW structure * @set_params: requested VLAN mode configuration * * Set VLAN Mode Parameters (0x020C) */ static int ice_aq_set_vlan_mode(struct ice_hw *hw, struct ice_aqc_set_vlan_mode *set_params) { … } /** * ice_set_dvm - sets up software and hardware for double VLAN mode * @hw: pointer to the hardware structure */ static int ice_set_dvm(struct ice_hw *hw) { … } /** * ice_set_svm - set single VLAN mode * @hw: pointer to the HW structure */ static int ice_set_svm(struct ice_hw *hw) { … } /** * ice_set_vlan_mode * @hw: pointer to the HW structure */ int ice_set_vlan_mode(struct ice_hw *hw) { … } /** * ice_print_dvm_not_supported - print if DDP and/or FW doesn't support DVM * @hw: pointer to the HW structure * * The purpose of this function is to print that QinQ is not supported due to * incompatibilty from the DDP and/or FW. This will give a hint to the user to * update one and/or both components if they expect QinQ functionality. */ static void ice_print_dvm_not_supported(struct ice_hw *hw) { … } /** * ice_post_pkg_dwnld_vlan_mode_cfg - configure VLAN mode after DDP download * @hw: pointer to the HW structure * * This function is meant to configure any VLAN mode specific functionality * after the global configuration lock has been released and the DDP has been * downloaded. * * Since only one PF downloads the DDP and configures the VLAN mode there needs * to be a way to configure the other PFs after the DDP has been downloaded and * the global configuration lock has been released. All such code should go in * this function. */ void ice_post_pkg_dwnld_vlan_mode_cfg(struct ice_hw *hw) { … }