0001
0002
0003
0004 #include "ice_vsi_vlan_ops.h"
0005 #include "ice_vsi_vlan_lib.h"
0006 #include "ice_vlan_mode.h"
0007 #include "ice.h"
0008 #include "ice_vf_vsi_vlan_ops.h"
0009 #include "ice_sriov.h"
0010
0011 static int
0012 noop_vlan_arg(struct ice_vsi __always_unused *vsi,
0013 struct ice_vlan __always_unused *vlan)
0014 {
0015 return 0;
0016 }
0017
0018 static int
0019 noop_vlan(struct ice_vsi __always_unused *vsi)
0020 {
0021 return 0;
0022 }
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 void ice_vf_vsi_init_vlan_ops(struct ice_vsi *vsi)
0034 {
0035 struct ice_vsi_vlan_ops *vlan_ops;
0036 struct ice_pf *pf = vsi->back;
0037 struct ice_vf *vf = vsi->vf;
0038
0039 if (WARN_ON(!vf))
0040 return;
0041
0042 if (ice_is_dvm_ena(&pf->hw)) {
0043 vlan_ops = &vsi->outer_vlan_ops;
0044
0045
0046 vlan_ops->add_vlan = ice_vsi_add_vlan;
0047 vlan_ops->dis_rx_filtering = ice_vsi_dis_rx_vlan_filtering;
0048 vlan_ops->ena_tx_filtering = ice_vsi_ena_tx_vlan_filtering;
0049 vlan_ops->dis_tx_filtering = ice_vsi_dis_tx_vlan_filtering;
0050
0051 if (ice_vf_is_port_vlan_ena(vf)) {
0052
0053 vlan_ops->set_port_vlan = ice_vsi_set_outer_port_vlan;
0054 vlan_ops->ena_rx_filtering =
0055 ice_vsi_ena_rx_vlan_filtering;
0056
0057
0058 vlan_ops = &vsi->inner_vlan_ops;
0059 vlan_ops->add_vlan = noop_vlan_arg;
0060 vlan_ops->del_vlan = noop_vlan_arg;
0061 vlan_ops->ena_stripping = ice_vsi_ena_inner_stripping;
0062 vlan_ops->dis_stripping = ice_vsi_dis_inner_stripping;
0063 vlan_ops->ena_insertion = ice_vsi_ena_inner_insertion;
0064 vlan_ops->dis_insertion = ice_vsi_dis_inner_insertion;
0065 } else {
0066 if (!test_bit(ICE_FLAG_VF_VLAN_PRUNING, pf->flags))
0067 vlan_ops->ena_rx_filtering = noop_vlan;
0068 else
0069 vlan_ops->ena_rx_filtering =
0070 ice_vsi_ena_rx_vlan_filtering;
0071
0072 vlan_ops->del_vlan = ice_vsi_del_vlan;
0073 vlan_ops->ena_stripping = ice_vsi_ena_outer_stripping;
0074 vlan_ops->dis_stripping = ice_vsi_dis_outer_stripping;
0075 vlan_ops->ena_insertion = ice_vsi_ena_outer_insertion;
0076 vlan_ops->dis_insertion = ice_vsi_dis_outer_insertion;
0077
0078
0079 vlan_ops = &vsi->inner_vlan_ops;
0080
0081 vlan_ops->ena_stripping = ice_vsi_ena_inner_stripping;
0082 vlan_ops->dis_stripping = ice_vsi_dis_inner_stripping;
0083 vlan_ops->ena_insertion = ice_vsi_ena_inner_insertion;
0084 vlan_ops->dis_insertion = ice_vsi_dis_inner_insertion;
0085 }
0086 } else {
0087 vlan_ops = &vsi->inner_vlan_ops;
0088
0089
0090 vlan_ops->add_vlan = ice_vsi_add_vlan;
0091 vlan_ops->dis_rx_filtering = ice_vsi_dis_rx_vlan_filtering;
0092 vlan_ops->ena_tx_filtering = ice_vsi_ena_tx_vlan_filtering;
0093 vlan_ops->dis_tx_filtering = ice_vsi_dis_tx_vlan_filtering;
0094
0095 if (ice_vf_is_port_vlan_ena(vf)) {
0096 vlan_ops->set_port_vlan = ice_vsi_set_inner_port_vlan;
0097 vlan_ops->ena_rx_filtering =
0098 ice_vsi_ena_rx_vlan_filtering;
0099 } else {
0100 if (!test_bit(ICE_FLAG_VF_VLAN_PRUNING, pf->flags))
0101 vlan_ops->ena_rx_filtering = noop_vlan;
0102 else
0103 vlan_ops->ena_rx_filtering =
0104 ice_vsi_ena_rx_vlan_filtering;
0105
0106 vlan_ops->del_vlan = ice_vsi_del_vlan;
0107 vlan_ops->ena_stripping = ice_vsi_ena_inner_stripping;
0108 vlan_ops->dis_stripping = ice_vsi_dis_inner_stripping;
0109 vlan_ops->ena_insertion = ice_vsi_ena_inner_insertion;
0110 vlan_ops->dis_insertion = ice_vsi_dis_inner_insertion;
0111 }
0112 }
0113 }
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128 void ice_vf_vsi_cfg_dvm_legacy_vlan_mode(struct ice_vsi *vsi)
0129 {
0130 struct ice_vsi_vlan_ops *vlan_ops;
0131 struct ice_vf *vf = vsi->vf;
0132 struct device *dev;
0133
0134 if (WARN_ON(!vf))
0135 return;
0136
0137 dev = ice_pf_to_dev(vf->pf);
0138
0139 if (!ice_is_dvm_ena(&vsi->back->hw) || ice_vf_is_port_vlan_ena(vf))
0140 return;
0141
0142 vlan_ops = &vsi->outer_vlan_ops;
0143
0144
0145
0146
0147
0148 vlan_ops->dis_rx_filtering = ice_vsi_dis_rx_vlan_filtering;
0149
0150 vlan_ops->ena_rx_filtering = noop_vlan;
0151
0152
0153
0154
0155
0156 vlan_ops->dis_tx_filtering = ice_vsi_dis_tx_vlan_filtering;
0157
0158 vlan_ops->ena_tx_filtering = noop_vlan;
0159
0160 if (vlan_ops->dis_rx_filtering(vsi))
0161 dev_dbg(dev, "Failed to disable Rx VLAN filtering for old VF without VIRTCHNL_VF_OFFLOAD_VLAN_V2 support\n");
0162 if (vlan_ops->dis_tx_filtering(vsi))
0163 dev_dbg(dev, "Failed to disable Tx VLAN filtering for old VF without VIRTHCNL_VF_OFFLOAD_VLAN_V2 support\n");
0164
0165
0166 vlan_ops->dis_stripping = ice_vsi_dis_outer_stripping;
0167 vlan_ops->dis_insertion = ice_vsi_dis_outer_insertion;
0168
0169 if (vlan_ops->dis_stripping(vsi))
0170 dev_dbg(dev, "Failed to disable outer VLAN stripping for old VF without VIRTCHNL_VF_OFFLOAD_VLAN_V2 support\n");
0171
0172 if (vlan_ops->dis_insertion(vsi))
0173 dev_dbg(dev, "Failed to disable outer VLAN insertion for old VF without VIRTCHNL_VF_OFFLOAD_VLAN_V2 support\n");
0174
0175
0176 vlan_ops = &vsi->inner_vlan_ops;
0177
0178 vlan_ops->dis_stripping = ice_vsi_dis_outer_stripping;
0179 vlan_ops->dis_insertion = ice_vsi_dis_outer_insertion;
0180
0181 if (vlan_ops->dis_stripping(vsi))
0182 dev_dbg(dev, "Failed to disable inner VLAN stripping for old VF without VIRTCHNL_VF_OFFLOAD_VLAN_V2 support\n");
0183
0184 if (vlan_ops->dis_insertion(vsi))
0185 dev_dbg(dev, "Failed to disable inner VLAN insertion for old VF without VIRTCHNL_VF_OFFLOAD_VLAN_V2 support\n");
0186 }
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199 void ice_vf_vsi_cfg_svm_legacy_vlan_mode(struct ice_vsi *vsi)
0200 {
0201 struct ice_vf *vf = vsi->vf;
0202
0203 if (WARN_ON(!vf))
0204 return;
0205
0206 if (ice_is_dvm_ena(&vsi->back->hw) || ice_vf_is_port_vlan_ena(vf))
0207 return;
0208
0209 if (vsi->inner_vlan_ops.dis_rx_filtering(vsi))
0210 dev_dbg(ice_pf_to_dev(vf->pf), "Failed to disable Rx VLAN filtering for old VF with VIRTCHNL_VF_OFFLOAD_VLAN support\n");
0211 }