/* Check if port VLAN exist before, and restore it accordingly */
        if (vf->port_vlan_info) {
                ice_vsi_manage_pvid(vsi, vf->port_vlan_info, true);
-               ice_vsi_add_vlan(vsi, vf->port_vlan_info & VLAN_VID_MASK);
+               if (ice_vsi_add_vlan(vsi, vf->port_vlan_info & VLAN_VID_MASK))
+                       dev_warn(ice_pf_to_dev(pf), "Failed to add Port VLAN %d filter for VF %d\n",
+                                vf->port_vlan_info & VLAN_VID_MASK, vf->vf_id);
+       } else {
+               /* set VLAN 0 filter by default when no port VLAN is
+                * enabled. If a port VLAN is enabled we don't want
+                * untagged broadcast/multicast traffic seen on the VF
+                * interface.
+                */
+               if (ice_vsi_add_vlan(vsi, 0))
+                       dev_warn(ice_pf_to_dev(pf), "Failed to add VLAN 0 filter for VF %d, MDD events will trigger. Reset the VF, disable spoofchk, or enable 8021q module on the guest\n",
+                                vf->vf_id);
        }
 
        eth_broadcast_addr(broadcast);
 
        /* reallocate VF resources to finish resetting the VSI state */
        if (!ice_alloc_vf_res(vf)) {
-               struct ice_vsi *vsi;
-
                ice_ena_vf_mappings(vf);
                set_bit(ICE_VF_STATE_ACTIVE, vf->vf_states);
                clear_bit(ICE_VF_STATE_DIS, vf->vf_states);
-
-               vsi = pf->vsi[vf->lan_vsi_idx];
-               if (ice_vsi_add_vlan(vsi, 0))
-                       dev_warn(ice_pf_to_dev(pf),
-                                "Failed to add VLAN 0 filter for VF %d, MDD events will trigger. Reset the VF, disable spoofchk, or enable 8021q module on the guest",
-                                vf->vf_id);
        }
 
        /* Tell the VF driver the reset is done. This needs to be done only
                return ret;
        }
 
-       /* If PVID, then remove all filters on the old VLAN */
-       if (vf->port_vlan_info)
-               ice_vsi_kill_vlan(vsi, vf->port_vlan_info & VLAN_VID_MASK);
-
        if (vlan_id || qos) {
+               /* remove VLAN 0 filter set by default when transitioning from
+                * no port VLAN to a port VLAN. No change to old port VLAN on
+                * failure.
+                */
+               ret = ice_vsi_kill_vlan(vsi, 0);
+               if (ret)
+                       return ret;
                ret = ice_vsi_manage_pvid(vsi, vlanprio, true);
                if (ret)
-                       goto error_manage_pvid;
+                       return ret;
        } else {
+               /* add VLAN 0 filter back when transitioning from port VLAN to
+                * no port VLAN. No change to old port VLAN on failure.
+                */
+               ret = ice_vsi_add_vlan(vsi, 0);
+               if (ret)
+                       return ret;
                ret = ice_vsi_manage_pvid(vsi, 0, false);
                if (ret)
                        goto error_manage_pvid;
                dev_info(dev, "Setting VLAN %d, QoS 0x%x on VF %d\n",
                         vlan_id, qos, vf_id);
 
-               /* add new VLAN filter for each MAC */
+               /* add VLAN filter for the port VLAN */
                ret = ice_vsi_add_vlan(vsi, vlan_id);
                if (ret)
                        goto error_manage_pvid;
        }
+       /* remove old port VLAN filter with valid VLAN ID or QoS fields */
+       if (vf->port_vlan_info)
+               ice_vsi_kill_vlan(vsi, vf->port_vlan_info & VLAN_VID_MASK);
 
-       /* The Port VLAN needs to be saved across resets the same as the
-        * default LAN MAC address.
-        */
+       /* keep port VLAN information persistent on resets */
        vf->port_vlan_info = le16_to_cpu(vsi->info.pvid);
 
 error_manage_pvid: