|
@@ -1527,6 +1527,9 @@ static void i40evf_reset_task(struct work_struct *work)
|
|
|
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);
|
|
@@ -1539,6 +1542,19 @@ static void i40evf_reset_task(struct work_struct *work)
|
|
|
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);
|
|
@@ -2415,6 +2431,7 @@ static void i40evf_remove(struct pci_dev *pdev)
|
|
|
{
|
|
|
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);
|
|
@@ -2446,6 +2463,13 @@ static void i40evf_remove(struct pci_dev *pdev)
|
|
|
|
|
|
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);
|
|
|
|