__I40E_BAD_EEPROM,
        __I40E_DOWN_REQUESTED,
        __I40E_FD_FLUSH_REQUESTED,
+       __I40E_FD_ATR_AUTO_DISABLED,
+       __I40E_FD_SB_AUTO_DISABLED,
        __I40E_RESET_FAILED,
        __I40E_PORT_SUSPENDED,
        __I40E_VF_DISABLE,
 #define I40E_FLAG_DCB_ENABLED                  BIT_ULL(8)
 #define I40E_FLAG_FD_SB_ENABLED                        BIT_ULL(9)
 #define I40E_FLAG_FD_ATR_ENABLED               BIT_ULL(10)
-#define I40E_FLAG_FD_SB_AUTO_DISABLED          BIT_ULL(11)
-#define I40E_FLAG_FD_ATR_AUTO_DISABLED         BIT_ULL(12)
+/* Gap for BIT_ULL(11) and BIT_ULL(12) */
 #define I40E_FLAG_MFP_ENABLED                  BIT_ULL(13)
 /* Gap for BIT_ULL(14) */
 #define I40E_FLAG_HW_ATR_EVICT_ENABLED         BIT_ULL(15)
 
        if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED))
                return -EOPNOTSUPP;
 
-       if (pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED)
+       if (test_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state))
                return -ENOSPC;
 
        if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) ||
        /* Flush current ATR settings if ATR was disabled */
        if ((changed_flags & I40E_FLAG_FD_ATR_ENABLED) &&
            !(pf->flags & I40E_FLAG_FD_ATR_ENABLED)) {
-               pf->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
+               set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);
                set_bit(__I40E_FD_FLUSH_REQUESTED, pf->state);
        }
 
 
                           &osd->rx_lpi_count, &nsd->rx_lpi_count);
 
        if (pf->flags & I40E_FLAG_FD_SB_ENABLED &&
-           !(pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED))
+           !test_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state))
                nsd->fd_sb_status = true;
        else
                nsd->fd_sb_status = false;
 
        if (pf->flags & I40E_FLAG_FD_ATR_ENABLED &&
-           !(pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED))
+           !test_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state))
                nsd->fd_atr_status = true;
        else
                nsd->fd_atr_status = false;
  **/
 static void i40e_reenable_fdir_sb(struct i40e_pf *pf)
 {
-       if (pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED) {
-               pf->flags &= ~I40E_FLAG_FD_SB_AUTO_DISABLED;
+       if (test_and_clear_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state))
                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");
-       }
 }
 
 /**
  **/
 static void i40e_reenable_fdir_atr(struct i40e_pf *pf)
 {
-       if (pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED) {
+       if (test_and_clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) {
                /* ATR uses the same filtering logic as SB rules. It only
                 * functions properly if the input set mask is at the default
                 * settings. It is safe to restore the default input set
                                        I40E_L3_SRC_MASK | I40E_L3_DST_MASK |
                                        I40E_L4_SRC_MASK | I40E_L4_DST_MASK);
 
-               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->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
+       set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);
        /* 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->flags &= ~I40E_FLAG_FD_ATR_AUTO_DISABLED;
+                       clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);
                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");
                        need_reset = true;
                        i40e_fdir_filter_exit(pf);
                }
-               pf->flags &= ~(I40E_FLAG_FD_SB_ENABLED |
-                              I40E_FLAG_FD_SB_AUTO_DISABLED);
+               pf->flags &= ~I40E_FLAG_FD_SB_ENABLED;
+               clear_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state);
                pf->flags |= I40E_FLAG_FD_SB_INACTIVE;
 
                /* 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_AUTO_DISABLED) {
-                       pf->flags &= ~I40E_FLAG_FD_ATR_AUTO_DISABLED;
+               if (test_and_clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state))
                        if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) &&
                            (I40E_DEBUG_FD & pf->hw.debug_mask))
                                dev_info(&pf->pdev->dev, "ATR re-enabled.\n");
-               }
        }
        return need_reset;
 }
 
                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->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
+               set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);
        } else {
                pf->fd_tcp4_filter_cnt--;
        }
                pf->fd_atr_cnt = i40e_get_current_atr_cnt(pf);
 
                if ((rx_desc->wb.qword0.hi_dword.fd_id == 0) &&
-                   pf->flags & I40E_FLAG_FD_SB_AUTO_DISABLED) {
-                       pf->flags |= I40E_FLAG_FD_ATR_AUTO_DISABLED;
+                   test_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state)) {
+                       /* These set_bit() calls aren't atomic with the
+                        * test_bit() here, but worse case we potentially
+                        * disable ATR and queue a flush right after SB
+                        * support is re-enabled. That shouldn't cause an
+                        * issue in practice
+                        */
+                       set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);
                        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->flags & I40E_FLAG_FD_SB_AUTO_DISABLED)) {
-                               pf->flags |= I40E_FLAG_FD_SB_AUTO_DISABLED;
+                           !test_and_set_bit(__I40E_FD_SB_AUTO_DISABLED,
+                                             pf->state))
                                if (I40E_DEBUG_FD & pf->hw.debug_mask)
                                        dev_warn(&pdev->dev, "FD filter space full, new ntuple rules will not be added\n");
-                       }
                }
        } else if (error == BIT(I40E_RX_PROG_STATUS_DESC_NO_FD_ENTRY_SHIFT)) {
                if (I40E_DEBUG_FD & pf->hw.debug_mask)
        if (!(pf->flags & I40E_FLAG_FD_ATR_ENABLED))
                return;
 
-       if (pf->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED)
+       if (test_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state))
                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->flags & I40E_FLAG_FD_ATR_AUTO_DISABLED))
+       if (th->syn && test_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state))
                return;
        if (pf->flags & I40E_FLAG_HW_ATR_EVICT_ENABLED) {
                /* HW ATR eviction will take care of removing filters on FIN