The operation can now fail, so change its return type to int.
Remove the inline wrapper while we're changing the signature.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
  * Filter ID may come from userland and must be range-checked.
  */
 static int efx_ef10_filter_remove_internal(struct efx_nic *efx,
-                                          enum efx_filter_priority priority,
+                                          unsigned int priority_mask,
                                           u32 filter_id, bool by_index)
 {
        unsigned int filter_idx = filter_id % HUNT_FILTER_TBL_ROWS;
        }
 
        if (spec->flags & EFX_FILTER_FLAG_RX_OVER_AUTO &&
-           priority == EFX_FILTER_PRI_AUTO) {
+           priority_mask == (1U << EFX_FILTER_PRI_AUTO)) {
                /* Just remove flags */
                spec->flags &= ~EFX_FILTER_FLAG_RX_OVER_AUTO;
                table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_AUTO_OLD;
                goto out_unlock;
        }
 
-       if (spec->priority != priority) {
+       if (!(priority_mask & (1U << spec->priority))) {
                rc = -ENOENT;
                goto out_unlock;
        }
                                       enum efx_filter_priority priority,
                                       u32 filter_id)
 {
-       return efx_ef10_filter_remove_internal(efx, priority, filter_id, false);
+       return efx_ef10_filter_remove_internal(efx, 1U << priority,
+                                              filter_id, false);
 }
 
 static int efx_ef10_filter_get_safe(struct efx_nic *efx,
        return rc;
 }
 
-static void efx_ef10_filter_clear_rx(struct efx_nic *efx,
+static int efx_ef10_filter_clear_rx(struct efx_nic *efx,
                                     enum efx_filter_priority priority)
 {
-       /* TODO */
+       unsigned int priority_mask;
+       unsigned int i;
+       int rc;
+
+       priority_mask = (((1U << (priority + 1)) - 1) &
+                        ~(1U << EFX_FILTER_PRI_AUTO));
+
+       for (i = 0; i < HUNT_FILTER_TBL_ROWS; i++) {
+               rc = efx_ef10_filter_remove_internal(efx, priority_mask,
+                                                    i, true);
+               if (rc && rc != -ENOENT)
+                       return rc;
+       }
+
+       return 0;
 }
 
 static u32 efx_ef10_filter_count_rx_used(struct efx_nic *efx,
                if (ACCESS_ONCE(table->entry[i].spec) &
                    EFX_EF10_FILTER_FLAG_AUTO_OLD) {
                        if (efx_ef10_filter_remove_internal(
-                                   efx, EFX_FILTER_PRI_AUTO, i, true) < 0)
+                                   efx, 1U << EFX_FILTER_PRI_AUTO,
+                                   i, true) < 0)
                                remove_failed = true;
                }
        }
 
 
        /* If disabling RX n-tuple filtering, clear existing filters */
        if (net_dev->features & ~data & NETIF_F_NTUPLE)
-               efx_filter_clear_rx(efx, EFX_FILTER_PRI_MANUAL);
+               return efx->type->filter_clear_rx(efx, EFX_FILTER_PRI_MANUAL);
 
        return 0;
 }
 
        return efx->type->filter_get_safe(efx, priority, filter_id, spec);
 }
 
-/**
- * efx_farch_filter_clear_rx - remove RX filters by priority
- * @efx: NIC from which to remove the filters
- * @priority: Maximum priority to remove
- *
- * Remove all RX filters whose priority is less than or equal to the
- * given @priority and is not %EFX_FILTER_PRI_AUTO.
- */
-static inline void efx_filter_clear_rx(struct efx_nic *efx,
-                                      enum efx_filter_priority priority)
-{
-       return efx->type->filter_clear_rx(efx, priority);
-}
-
 static inline u32 efx_filter_count_rx_used(struct efx_nic *efx,
                                           enum efx_filter_priority priority)
 {
 
        spin_unlock_bh(&efx->filter_lock);
 }
 
-void efx_farch_filter_clear_rx(struct efx_nic *efx,
+int efx_farch_filter_clear_rx(struct efx_nic *efx,
                               enum efx_filter_priority priority)
 {
        efx_farch_filter_table_clear(efx, EFX_FARCH_FILTER_TABLE_RX_IP,
                                     priority);
        efx_farch_filter_table_clear(efx, EFX_FARCH_FILTER_TABLE_RX_DEF,
                                     priority);
+       return 0;
 }
 
 u32 efx_farch_filter_count_rx_used(struct efx_nic *efx,
 
  * @filter_insert: add or replace a filter
  * @filter_remove_safe: remove a filter by ID, carefully
  * @filter_get_safe: retrieve a filter by ID, carefully
- * @filter_clear_rx: remove RX filters by priority
+ * @filter_clear_rx: Remove all RX filters whose priority is less than or
+ *     equal to the given priority and is not %EFX_FILTER_PRI_AUTO
  * @filter_count_rx_used: Get the number of filters in use at a given priority
  * @filter_get_rx_id_limit: Get maximum value of a filter id, plus 1
  * @filter_get_rx_ids: Get list of RX filters at a given priority
        int (*filter_get_safe)(struct efx_nic *efx,
                               enum efx_filter_priority priority,
                               u32 filter_id, struct efx_filter_spec *);
-       void (*filter_clear_rx)(struct efx_nic *efx,
-                               enum efx_filter_priority priority);
+       int (*filter_clear_rx)(struct efx_nic *efx,
+                              enum efx_filter_priority priority);
        u32 (*filter_count_rx_used)(struct efx_nic *efx,
                                    enum efx_filter_priority priority);
        u32 (*filter_get_rx_id_limit)(struct efx_nic *efx);
 
 int efx_farch_filter_get_safe(struct efx_nic *efx,
                              enum efx_filter_priority priority, u32 filter_id,
                              struct efx_filter_spec *);
-void efx_farch_filter_clear_rx(struct efx_nic *efx,
-                              enum efx_filter_priority priority);
+int efx_farch_filter_clear_rx(struct efx_nic *efx,
+                             enum efx_filter_priority priority);
 u32 efx_farch_filter_count_rx_used(struct efx_nic *efx,
                                   enum efx_filter_priority priority);
 u32 efx_farch_filter_get_rx_id_limit(struct efx_nic *efx);