+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
+ struct virtchnl_dcf_vlan_offload vlan_offload;
+ int err;
+
+ if (!ice_dcf_vlan_offload_ena(repr))
+ return -ENOTSUP;
+
+ /* Vlan stripping setting */
+ if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+ bool enable = !!(dev_conf->rxmode.offloads &
+ RTE_ETH_RX_OFFLOAD_VLAN_STRIP);
+
+ if (enable && repr->outer_vlan_info.port_vlan_ena) {
+ PMD_DRV_LOG(ERR,
+ "Disable the port VLAN firstly\n");
+ return -EINVAL;
+ }
+
+ memset(&vlan_offload, 0, sizeof(vlan_offload));
+
+ if (enable)
+ vlan_offload.vlan_flags =
+ VIRTCHNL_DCF_VLAN_STRIP_INTO_RX_DESC <<
+ VIRTCHNL_DCF_VLAN_STRIP_MODE_S;
+ else if (repr->outer_vlan_info.stripping_ena && !enable)
+ vlan_offload.vlan_flags =
+ VIRTCHNL_DCF_VLAN_STRIP_DISABLE <<
+ VIRTCHNL_DCF_VLAN_STRIP_MODE_S;
+
+ if (vlan_offload.vlan_flags) {
+ vlan_offload.vf_id = repr->vf_id;
+ vlan_offload.tpid = repr->outer_vlan_info.tpid;
+ vlan_offload.vlan_flags |=
+ VIRTCHNL_DCF_VLAN_TYPE_OUTER <<
+ VIRTCHNL_DCF_VLAN_TYPE_S;
+
+ err = ice_dcf_vlan_offload_config(repr, &vlan_offload);
+ if (err)
+ return -EIO;
+
+ repr->outer_vlan_info.stripping_ena = enable;
+ }
+ }
+
+ return 0;