|
@@ -14182,6 +14182,7 @@ static void i40e_remove(struct pci_dev *pdev)
|
|
|
mutex_destroy(&hw->aq.asq_mutex);
|
|
|
|
|
|
/* Clear all dynamic memory lists of rings, q_vectors, and VSIs */
|
|
|
+ rtnl_lock();
|
|
|
i40e_clear_interrupt_scheme(pf);
|
|
|
for (i = 0; i < pf->num_alloc_vsi; i++) {
|
|
|
if (pf->vsi[i]) {
|
|
@@ -14190,6 +14191,7 @@ static void i40e_remove(struct pci_dev *pdev)
|
|
|
pf->vsi[i] = NULL;
|
|
|
}
|
|
|
}
|
|
|
+ rtnl_unlock();
|
|
|
|
|
|
for (i = 0; i < I40E_MAX_VEB; i++) {
|
|
|
kfree(pf->veb[i]);
|
|
@@ -14401,7 +14403,13 @@ static void i40e_shutdown(struct pci_dev *pdev)
|
|
|
wr32(hw, I40E_PFPM_WUFC,
|
|
|
(pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0));
|
|
|
|
|
|
+ /* Since we're going to destroy queues during the
|
|
|
+ * i40e_clear_interrupt_scheme() we should hold the RTNL lock for this
|
|
|
+ * whole section
|
|
|
+ */
|
|
|
+ rtnl_lock();
|
|
|
i40e_clear_interrupt_scheme(pf);
|
|
|
+ rtnl_unlock();
|
|
|
|
|
|
if (system_state == SYSTEM_POWER_OFF) {
|
|
|
pci_wake_from_d3(pdev, pf->wol_en);
|