&osd->rx_lpi_count, &nsd->rx_lpi_count);
 
        if (pf->flags & I40E_FLAG_FD_SB_ENABLED &&
-           !(pf->hw_disabled_flags & I40E_FLAG_FD_SB_ENABLED))
+           !(pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED))
                nsd->fd_sb_status = true;
        else
                nsd->fd_sb_status = false;
 
        if (pf->flags & I40E_FLAG_FD_ATR_ENABLED &&
-           !(pf->hw_disabled_flags & I40E_FLAG_FD_ATR_ENABLED))
+           !(pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED))
                nsd->fd_atr_status = true;
        else
                nsd->fd_atr_status = false;
        if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state))
                return;
 
-       /* Check if, FD SB or ATR was auto disabled and if there is enough room
-        * to re-enable
-        */
+       /* Check if we have enough room to re-enable FDir SB capability. */
        fcnt_prog = i40e_get_global_fd_count(pf);
        fcnt_avail = pf->fdir_pf_filter_count;
        if ((fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM)) ||
            (pf->fd_add_err == 0) ||
            (i40e_get_current_atr_cnt(pf) < pf->fd_atr_cnt)) {
-               if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) &&
-                   (pf->hw_disabled_flags & I40E_FLAG_FD_SB_ENABLED)) {
-                       pf->hw_disabled_flags &= ~I40E_FLAG_FD_SB_ENABLED;
-                       if (I40E_DEBUG_FD & pf->hw.debug_mask)
+               if (pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED) {
+                       pf->flags &= ~I40E_FLAG_FD_SB_AUTO_DISABLED;
+                       if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) &&
+                           (I40E_DEBUG_FD & pf->hw.debug_mask))
                                dev_info(&pf->pdev->dev, "FD Sideband/ntuple is being enabled since we have space in the table now\n");
                }
        }
 
-       /* Wait for some more space to be available to turn on ATR. We also
-        * must check that no existing ntuple rules for TCP are in effect
+       /* We should wait for even more space before re-enabling ATR.
+        * Additionally, we cannot enable ATR as long as we still have TCP SB
+        * rules active.
         */
-       if (fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM * 2)) {
-               if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
-                   (pf->hw_disabled_flags & I40E_FLAG_FD_ATR_ENABLED) &&
-                   (pf->fd_tcp4_filter_cnt == 0)) {
-                       pf->hw_disabled_flags &= ~I40E_FLAG_FD_ATR_ENABLED;
-                       if (I40E_DEBUG_FD & pf->hw.debug_mask)
+       if ((fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM_FOR_ATR)) &&
+           (pf->fd_tcp4_filter_cnt == 0)) {
+               if (pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED) {
+                       pf->flags &= ~I40E_FLAG_FD_ATR_AUTO_DISABLED;
+                       if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
+                           (I40E_DEBUG_FD & pf->hw.debug_mask))
                                dev_info(&pf->pdev->dev, "ATR is being enabled since we have space in the table and there are no conflicting ntuple rules\n");
                }
        }
        }
 
        pf->fd_flush_timestamp = jiffies;
-       pf->hw_disabled_flags |= I40E_FLAG_FD_ATR_ENABLED;
+       pf->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
        /* flush all filters */
        wr32(&pf->hw, I40E_PFQF_CTL_1,
             I40E_PFQF_CTL_1_CLEARFDTABLE_MASK);
                /* replay sideband filters */
                i40e_fdir_filter_restore(pf->vsi[pf->lan_vsi]);
                if (!disable_atr && !pf->fd_tcp4_filter_cnt)
-                       pf->hw_disabled_flags &= ~I40E_FLAG_FD_ATR_ENABLED;
+                       pf->flags &= ~I40E_FLAG_FD_ATR_AUTO_DISABLED;
                clear_bit(__I40E_FD_FLUSH_REQUESTED, pf->state);
                if (I40E_DEBUG_FD & pf->hw.debug_mask)
                        dev_info(&pf->pdev->dev, "FD Filter table flushed and FD-SB replayed.\n");
                    (pf->hw.aq.api_min_ver > 4))) {
                /* Supported in FW API version higher than 1.4 */
                pf->flags |= I40E_FLAG_GENEVE_OFFLOAD_CAPABLE;
-               pf->hw_disabled_flags = I40E_FLAG_HW_ATR_EVICT_CAPABLE;
+               pf->flags = I40E_FLAG_HW_ATR_EVICT_CAPABLE;
        } else {
-               pf->hw_disabled_flags = I40E_FLAG_HW_ATR_EVICT_CAPABLE;
+               pf->flags = I40E_FLAG_HW_ATR_EVICT_CAPABLE;
        }
 
        pf->eeprom_version = 0xDEAD;
                        need_reset = true;
                        i40e_fdir_filter_exit(pf);
                }
-               pf->flags &= ~I40E_FLAG_FD_SB_ENABLED;
-               pf->hw_disabled_flags &= ~I40E_FLAG_FD_SB_ENABLED;
+               pf->flags &= ~(I40E_FLAG_FD_SB_ENABLED |
+                              I40E_FLAG_FD_SB_AUTO_DISABLED);
                /* reset fd counters */
                pf->fd_add_err = 0;
                pf->fd_atr_cnt = 0;
                /* if ATR was auto disabled it can be re-enabled. */
-               if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
-                   (pf->hw_disabled_flags & I40E_FLAG_FD_ATR_ENABLED)) {
-                       pf->hw_disabled_flags &= ~I40E_FLAG_FD_ATR_ENABLED;
-                       if (I40E_DEBUG_FD & pf->hw.debug_mask)
+               if (pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED) {
+                       pf->flags &= ~I40E_FLAG_FD_ATR_AUTO_DISABLED;
+                       if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
+                           (I40E_DEBUG_FD & pf->hw.debug_mask))
                                dev_info(&pf->pdev->dev, "ATR re-enabled.\n");
                }
        }
 
                if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
                    I40E_DEBUG_FD & pf->hw.debug_mask)
                        dev_info(&pf->pdev->dev, "Forcing ATR off, sideband rules for TCP/IPv4 flow being applied\n");
-               pf->hw_disabled_flags |= I40E_FLAG_FD_ATR_ENABLED;
+               pf->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
        } else {
                pf->fd_tcp4_filter_cnt--;
-               if (pf->fd_tcp4_filter_cnt == 0) {
-                       if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
-                           I40E_DEBUG_FD & pf->hw.debug_mask)
-                               dev_info(&pf->pdev->dev, "ATR re-enabled due to no sideband TCP/IPv4 rules\n");
-                       pf->hw_disabled_flags &= ~I40E_FLAG_FD_ATR_ENABLED;
-               }
        }
 
        return 0;
                pf->fd_atr_cnt = i40e_get_current_atr_cnt(pf);
 
                if ((rx_desc->wb.qword0.hi_dword.fd_id == 0) &&
-                   (pf->hw_disabled_flags & I40E_FLAG_FD_SB_ENABLED)) {
-                       pf->hw_disabled_flags |= I40E_FLAG_FD_ATR_ENABLED;
+                   pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED) {
+                       pf->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
                        set_bit(__I40E_FD_FLUSH_REQUESTED, pf->state);
                }
 
                 */
                if (fcnt_prog >= (fcnt_avail - I40E_FDIR_BUFFER_FULL_MARGIN)) {
                        if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) &&
-                           !(pf->hw_disabled_flags &
-                                    I40E_FLAG_FD_SB_ENABLED)) {
+                           !(pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED)) {
+                               pf->flags |= I40E_FLAG_FD_SB_AUTO_DISABLED;
                                if (I40E_DEBUG_FD & pf->hw.debug_mask)
                                        dev_warn(&pdev->dev, "FD filter space full, new ntuple rules will not be added\n");
-                               pf->hw_disabled_flags |=
-                                                       I40E_FLAG_FD_SB_ENABLED;
                        }
                }
        } else if (error == BIT(I40E_RX_PROG_STATUS_DESC_NO_FD_ENTRY_SHIFT)) {
        if (!(pf->flags & I40E_FLAG_FD_ATR_ENABLED))
                return;
 
-       if ((pf->hw_disabled_flags & I40E_FLAG_FD_ATR_ENABLED))
+       if (pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED)
                return;
 
        /* if sampling is disabled do nothing */
        th = (struct tcphdr *)(hdr.network + hlen);
 
        /* Due to lack of space, no more new filters can be programmed */
-       if (th->syn && (pf->hw_disabled_flags & I40E_FLAG_FD_ATR_ENABLED))
+       if (th->syn && (pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED))
                return;
        if (pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE) {
                /* HW ATR eviction will take care of removing filters on FIN