void ionic_rx_filter_replay(struct ionic_lif *lif)
 {
        struct ionic_rx_filter_add_cmd *ac;
+       struct hlist_head new_id_list;
        struct ionic_admin_ctx ctx;
        struct ionic_rx_filter *f;
        struct hlist_head *head;
        struct hlist_node *tmp;
+       unsigned int key;
        unsigned int i;
        int err;
 
+       INIT_HLIST_HEAD(&new_id_list);
        ac = &ctx.cmd.rx_filter_add;
 
        for (i = 0; i < IONIC_RX_FILTER_HLISTS; i++) {
                                                    ac->mac.addr);
                                        break;
                                }
+                               spin_lock_bh(&lif->rx_filters.lock);
+                               ionic_rx_filter_free(lif, f);
+                               spin_unlock_bh(&lif->rx_filters.lock);
+
+                               continue;
                        }
+
+                       /* remove from old id list, save new id in tmp list */
+                       spin_lock_bh(&lif->rx_filters.lock);
+                       hlist_del(&f->by_id);
+                       spin_unlock_bh(&lif->rx_filters.lock);
+                       f->filter_id = le32_to_cpu(ctx.comp.rx_filter_add.filter_id);
+                       hlist_add_head(&f->by_id, &new_id_list);
                }
        }
+
+       /* rebuild the by_id hash lists with the new filter ids */
+       spin_lock_bh(&lif->rx_filters.lock);
+       hlist_for_each_entry_safe(f, tmp, &new_id_list, by_id) {
+               key = f->filter_id & IONIC_RX_FILTER_HLISTS_MASK;
+               head = &lif->rx_filters.by_id[key];
+               hlist_add_head(&f->by_id, head);
+       }
+       spin_unlock_bh(&lif->rx_filters.lock);
 }
 
 int ionic_rx_filters_init(struct ionic_lif *lif)