return ret;
 }
 
+/**
+ * iavf_disable_fdir - disable Flow Director and clear existing filters
+ * @adapter: board private structure
+ **/
+static void iavf_disable_fdir(struct iavf_adapter *adapter)
+{
+       struct iavf_fdir_fltr *fdir, *fdirtmp;
+       bool del_filters = false;
+
+       adapter->flags &= ~IAVF_FLAG_FDIR_ENABLED;
+
+       /* remove all Flow Director filters */
+       spin_lock_bh(&adapter->fdir_fltr_lock);
+       list_for_each_entry_safe(fdir, fdirtmp, &adapter->fdir_list_head,
+                                list) {
+               if (fdir->state == IAVF_FDIR_FLTR_ADD_REQUEST ||
+                   fdir->state == IAVF_FDIR_FLTR_INACTIVE) {
+                       /* Delete filters not registered in PF */
+                       list_del(&fdir->list);
+                       kfree(fdir);
+                       adapter->fdir_active_fltr--;
+               } else if (fdir->state == IAVF_FDIR_FLTR_ADD_PENDING ||
+                          fdir->state == IAVF_FDIR_FLTR_DIS_REQUEST ||
+                          fdir->state == IAVF_FDIR_FLTR_ACTIVE) {
+                       /* Filters registered in PF, schedule their deletion */
+                       fdir->state = IAVF_FDIR_FLTR_DEL_REQUEST;
+                       del_filters = true;
+               } else if (fdir->state == IAVF_FDIR_FLTR_DIS_PENDING) {
+                       /* Request to delete filter already sent to PF, change
+                        * state to DEL_PENDING to delete filter after PF's
+                        * response, not set as INACTIVE
+                        */
+                       fdir->state = IAVF_FDIR_FLTR_DEL_PENDING;
+               }
+       }
+       spin_unlock_bh(&adapter->fdir_fltr_lock);
+
+       if (del_filters) {
+               adapter->aq_required |= IAVF_FLAG_AQ_DEL_FDIR_FILTER;
+               mod_delayed_work(adapter->wq, &adapter->watchdog_task, 0);
+       }
+}
+
 #define NETIF_VLAN_OFFLOAD_FEATURES    (NETIF_F_HW_VLAN_CTAG_RX | \
                                         NETIF_F_HW_VLAN_CTAG_TX | \
                                         NETIF_F_HW_VLAN_STAG_RX | \
            ((netdev->features & NETIF_F_RXFCS) ^ (features & NETIF_F_RXFCS)))
                iavf_schedule_reset(adapter, IAVF_FLAG_RESET_NEEDED);
 
+       if ((netdev->features & NETIF_F_NTUPLE) ^ (features & NETIF_F_NTUPLE)) {
+               if (features & NETIF_F_NTUPLE)
+                       adapter->flags |= IAVF_FLAG_FDIR_ENABLED;
+               else
+                       iavf_disable_fdir(adapter);
+       }
+
        return 0;
 }
 
 
        features = iavf_fix_netdev_vlan_features(adapter, features);
 
+       if (!FDIR_FLTR_SUPPORT(adapter))
+               features &= ~NETIF_F_NTUPLE;
+
        return iavf_fix_strip_features(adapter, features);
 }
 
        if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)
                netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 
+       if (FDIR_FLTR_SUPPORT(adapter)) {
+               netdev->hw_features |= NETIF_F_NTUPLE;
+               netdev->features |= NETIF_F_NTUPLE;
+               adapter->flags |= IAVF_FLAG_FDIR_ENABLED;
+       }
+
        netdev->priv_flags |= IFF_UNICAST_FLT;
 
        /* Do not turn on offloads when they are requested to be turned off.