msleep(I40EVF_RESET_WAIT_MS);
        }
        if (i == I40EVF_RESET_WAIT_COUNT) {
+               struct i40evf_mac_filter *f, *ftmp;
+               struct i40evf_vlan_filter *fv, *fvtmp;
+
                /* reset never finished */
                dev_err(&adapter->pdev->dev, "Reset never finished (%x)\n",
                        rstat_val);
                        i40evf_free_all_tx_resources(adapter);
                        i40evf_free_all_rx_resources(adapter);
                }
+
+               /* Delete all of the filters, both MAC and VLAN. */
+               list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list,
+                                        list) {
+                       list_del(&f->list);
+                       kfree(f);
+               }
+               list_for_each_entry_safe(fv, fvtmp, &adapter->vlan_filter_list,
+                                        list) {
+                       list_del(&fv->list);
+                       kfree(fv);
+               }
+
                i40evf_free_misc_irq(adapter);
                i40evf_reset_interrupt_capability(adapter);
                i40evf_free_queues(adapter);
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct i40evf_adapter *adapter = netdev_priv(netdev);
+       struct i40evf_mac_filter *f, *ftmp;
        struct i40e_hw *hw = &adapter->hw;
 
        cancel_delayed_work_sync(&adapter->init_task);
 
        i40evf_free_queues(adapter);
        kfree(adapter->vf_res);
+       /* If we got removed before an up/down sequence, we've got a filter
+        * hanging out there that we need to get rid of.
+        */
+       list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) {
+               list_del(&f->list);
+               kfree(f);
+       }
 
        free_netdev(netdev);