static void efx_ef10_filter_del_vlan(struct efx_nic *efx, u16 vid);
 static int efx_ef10_set_udp_tnl_ports(struct efx_nic *efx, bool unloading);
 
+static u32 efx_ef10_filter_get_unsafe_id(u32 filter_id)
+{
+       WARN_ON_ONCE(filter_id == EFX_EF10_FILTER_ID_INVALID);
+       return filter_id & (HUNT_FILTER_TBL_ROWS - 1);
+}
+
+static unsigned int efx_ef10_filter_get_unsafe_pri(u32 filter_id)
+{
+       return filter_id / (HUNT_FILTER_TBL_ROWS * 2);
+}
+
+static u32 efx_ef10_make_filter_id(unsigned int pri, u16 idx)
+{
+       return pri * HUNT_FILTER_TBL_ROWS * 2 + idx;
+}
+
 static int efx_ef10_get_warm_boot_count(struct efx_nic *efx)
 {
        efx_dword_t reg;
 
        /* If successful, return the inserted filter ID */
        if (rc == 0)
-               rc = match_pri * HUNT_FILTER_TBL_ROWS + ins_index;
+               rc = efx_ef10_make_filter_id(match_pri, ins_index);
 
        wake_up_all(&table->waitq);
 out_unlock:
                                           unsigned int priority_mask,
                                           u32 filter_id, bool by_index)
 {
-       unsigned int filter_idx = filter_id % HUNT_FILTER_TBL_ROWS;
+       unsigned int filter_idx = efx_ef10_filter_get_unsafe_id(filter_id);
        struct efx_ef10_filter_table *table = efx->filter_state;
        MCDI_DECLARE_BUF(inbuf,
                         MC_CMD_FILTER_OP_IN_HANDLE_OFST +
        if (!spec ||
            (!by_index &&
             efx_ef10_filter_pri(table, spec) !=
-            filter_id / HUNT_FILTER_TBL_ROWS)) {
+            efx_ef10_filter_get_unsafe_pri(filter_id))) {
                rc = -ENOENT;
                goto out_unlock;
        }
                                               filter_id, false);
 }
 
-static u32 efx_ef10_filter_get_unsafe_id(struct efx_nic *efx, u32 filter_id)
-{
-       return filter_id % HUNT_FILTER_TBL_ROWS;
-}
-
 static void efx_ef10_filter_remove_unsafe(struct efx_nic *efx,
                                          enum efx_filter_priority priority,
                                          u32 filter_id)
                                    enum efx_filter_priority priority,
                                    u32 filter_id, struct efx_filter_spec *spec)
 {
-       unsigned int filter_idx = filter_id % HUNT_FILTER_TBL_ROWS;
+       unsigned int filter_idx = efx_ef10_filter_get_unsafe_id(filter_id);
        struct efx_ef10_filter_table *table = efx->filter_state;
        const struct efx_filter_spec *saved_spec;
        int rc;
        saved_spec = efx_ef10_filter_entry_spec(table, filter_idx);
        if (saved_spec && saved_spec->priority == priority &&
            efx_ef10_filter_pri(table, saved_spec) ==
-           filter_id / HUNT_FILTER_TBL_ROWS) {
+           efx_ef10_filter_get_unsafe_pri(filter_id)) {
                *spec = *saved_spec;
                rc = 0;
        } else {
 {
        struct efx_ef10_filter_table *table = efx->filter_state;
 
-       return table->rx_match_count * HUNT_FILTER_TBL_ROWS;
+       return table->rx_match_count * HUNT_FILTER_TBL_ROWS * 2;
 }
 
 static s32 efx_ef10_filter_get_rx_ids(struct efx_nic *efx,
                                count = -EMSGSIZE;
                                break;
                        }
-                       buf[count++] = (efx_ef10_filter_pri(table, spec) *
-                                       HUNT_FILTER_TBL_ROWS +
+                       buf[count++] =
+                               efx_ef10_make_filter_id(
+                                       efx_ef10_filter_pri(table, spec),
                                        filter_idx);
                }
        }
        unsigned int filter_idx;
 
        if (*id != EFX_EF10_FILTER_ID_INVALID) {
-               filter_idx = efx_ef10_filter_get_unsafe_id(efx, *id);
+               filter_idx = efx_ef10_filter_get_unsafe_id(*id);
                if (!table->entry[filter_idx].spec)
                        netif_dbg(efx, drv, efx->net_dev,
                                  "marked null spec old %04x:%04x\n", *id,
                                rc = EFX_EF10_FILTER_ID_INVALID;
                        }
                }
-               ids[i] = efx_ef10_filter_get_unsafe_id(efx, rc);
+               ids[i] = efx_ef10_filter_get_unsafe_id(rc);
        }
 
        if (multicast && rollback) {
                        return rc;
                } else {
                        vlan->default_filters[EFX_EF10_BCAST] =
-                               efx_ef10_filter_get_unsafe_id(efx, rc);
+                               efx_ef10_filter_get_unsafe_id(rc);
                }
        }
 
                id = &vlan->default_filters[map[encap_type]];
 
                EFX_WARN_ON_PARANOID(*id != EFX_EF10_FILTER_ID_INVALID);
-               *id = efx_ef10_filter_get_unsafe_id(efx, rc);
+               *id = efx_ef10_filter_get_unsafe_id(rc);
                if (!nic_data->workaround_26807 && !encap_type) {
                        /* Also need an Ethernet broadcast filter */
                        efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO,
                                        vlan->default_filters[EFX_EF10_BCAST] !=
                                        EFX_EF10_FILTER_ID_INVALID);
                                vlan->default_filters[EFX_EF10_BCAST] =
-                                       efx_ef10_filter_get_unsafe_id(efx, rc);
+                                       efx_ef10_filter_get_unsafe_id(rc);
                        }
                }
                rc = 0;