Commit abe2f12d authored by David S. Miller's avatar David S. Miller

Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue

Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2020-09-25

This series contains updates to the iavf and ice driver.

Sylwester fixes a crash with iavf resume due to getting the wrong pointers.

Ani fixes a call trace in ice resume by calling pci_save_state().

Jakes fixes memory leaks in case of register_netdev() failure or
ice_cfg_vsi_lan() failure for the ice driver.

v2: Rebased; no other changes
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4e1b469a f6a07271
...@@ -3806,8 +3806,8 @@ static int __maybe_unused iavf_suspend(struct device *dev_d) ...@@ -3806,8 +3806,8 @@ static int __maybe_unused iavf_suspend(struct device *dev_d)
static int __maybe_unused iavf_resume(struct device *dev_d) static int __maybe_unused iavf_resume(struct device *dev_d)
{ {
struct pci_dev *pdev = to_pci_dev(dev_d); struct pci_dev *pdev = to_pci_dev(dev_d);
struct iavf_adapter *adapter = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct net_device *netdev = adapter->netdev; struct iavf_adapter *adapter = netdev_priv(netdev);
u32 err; u32 err;
pci_set_master(pdev); pci_set_master(pdev);
......
...@@ -246,7 +246,7 @@ static int ice_get_free_slot(void *array, int size, int curr) ...@@ -246,7 +246,7 @@ static int ice_get_free_slot(void *array, int size, int curr)
* ice_vsi_delete - delete a VSI from the switch * ice_vsi_delete - delete a VSI from the switch
* @vsi: pointer to VSI being removed * @vsi: pointer to VSI being removed
*/ */
void ice_vsi_delete(struct ice_vsi *vsi) static void ice_vsi_delete(struct ice_vsi *vsi)
{ {
struct ice_pf *pf = vsi->back; struct ice_pf *pf = vsi->back;
struct ice_vsi_ctx *ctxt; struct ice_vsi_ctx *ctxt;
...@@ -313,7 +313,7 @@ static void ice_vsi_free_arrays(struct ice_vsi *vsi) ...@@ -313,7 +313,7 @@ static void ice_vsi_free_arrays(struct ice_vsi *vsi)
* *
* Returns 0 on success, negative on failure * Returns 0 on success, negative on failure
*/ */
int ice_vsi_clear(struct ice_vsi *vsi) static int ice_vsi_clear(struct ice_vsi *vsi)
{ {
struct ice_pf *pf = NULL; struct ice_pf *pf = NULL;
struct device *dev; struct device *dev;
...@@ -563,7 +563,7 @@ static int ice_vsi_get_qs(struct ice_vsi *vsi) ...@@ -563,7 +563,7 @@ static int ice_vsi_get_qs(struct ice_vsi *vsi)
* ice_vsi_put_qs - Release queues from VSI to PF * ice_vsi_put_qs - Release queues from VSI to PF
* @vsi: the VSI that is going to release queues * @vsi: the VSI that is going to release queues
*/ */
void ice_vsi_put_qs(struct ice_vsi *vsi) static void ice_vsi_put_qs(struct ice_vsi *vsi)
{ {
struct ice_pf *pf = vsi->back; struct ice_pf *pf = vsi->back;
int i; int i;
...@@ -1196,6 +1196,18 @@ static void ice_vsi_clear_rings(struct ice_vsi *vsi) ...@@ -1196,6 +1196,18 @@ static void ice_vsi_clear_rings(struct ice_vsi *vsi)
{ {
int i; int i;
/* Avoid stale references by clearing map from vector to ring */
if (vsi->q_vectors) {
ice_for_each_q_vector(vsi, i) {
struct ice_q_vector *q_vector = vsi->q_vectors[i];
if (q_vector) {
q_vector->tx.ring = NULL;
q_vector->rx.ring = NULL;
}
}
}
if (vsi->tx_rings) { if (vsi->tx_rings) {
for (i = 0; i < vsi->alloc_txq; i++) { for (i = 0; i < vsi->alloc_txq; i++) {
if (vsi->tx_rings[i]) { if (vsi->tx_rings[i]) {
...@@ -2291,7 +2303,7 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi, ...@@ -2291,7 +2303,7 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,
if (status) { if (status) {
dev_err(dev, "VSI %d failed lan queue config, error %s\n", dev_err(dev, "VSI %d failed lan queue config, error %s\n",
vsi->vsi_num, ice_stat_str(status)); vsi->vsi_num, ice_stat_str(status));
goto unroll_vector_base; goto unroll_clear_rings;
} }
/* Add switch rule to drop all Tx Flow Control Frames, of look up /* Add switch rule to drop all Tx Flow Control Frames, of look up
......
...@@ -45,10 +45,6 @@ int ice_cfg_vlan_pruning(struct ice_vsi *vsi, bool ena, bool vlan_promisc); ...@@ -45,10 +45,6 @@ int ice_cfg_vlan_pruning(struct ice_vsi *vsi, bool ena, bool vlan_promisc);
void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create); void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create);
void ice_vsi_delete(struct ice_vsi *vsi);
int ice_vsi_clear(struct ice_vsi *vsi);
#ifdef CONFIG_DCB #ifdef CONFIG_DCB
int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc); int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc);
#endif /* CONFIG_DCB */ #endif /* CONFIG_DCB */
...@@ -79,8 +75,6 @@ bool ice_is_reset_in_progress(unsigned long *state); ...@@ -79,8 +75,6 @@ bool ice_is_reset_in_progress(unsigned long *state);
void void
ice_write_qrxflxp_cntxt(struct ice_hw *hw, u16 pf_q, u32 rxdid, u32 prio); ice_write_qrxflxp_cntxt(struct ice_hw *hw, u16 pf_q, u32 rxdid, u32 prio);
void ice_vsi_put_qs(struct ice_vsi *vsi);
void ice_vsi_dis_irq(struct ice_vsi *vsi); void ice_vsi_dis_irq(struct ice_vsi *vsi);
void ice_vsi_free_irq(struct ice_vsi *vsi); void ice_vsi_free_irq(struct ice_vsi *vsi);
......
...@@ -3169,10 +3169,8 @@ static int ice_setup_pf_sw(struct ice_pf *pf) ...@@ -3169,10 +3169,8 @@ static int ice_setup_pf_sw(struct ice_pf *pf)
return -EBUSY; return -EBUSY;
vsi = ice_pf_vsi_setup(pf, pf->hw.port_info); vsi = ice_pf_vsi_setup(pf, pf->hw.port_info);
if (!vsi) { if (!vsi)
status = -ENOMEM; return -ENOMEM;
goto unroll_vsi_setup;
}
status = ice_cfg_netdev(vsi); status = ice_cfg_netdev(vsi);
if (status) { if (status) {
...@@ -3219,12 +3217,7 @@ static int ice_setup_pf_sw(struct ice_pf *pf) ...@@ -3219,12 +3217,7 @@ static int ice_setup_pf_sw(struct ice_pf *pf)
} }
unroll_vsi_setup: unroll_vsi_setup:
if (vsi) { ice_vsi_release(vsi);
ice_vsi_free_q_vectors(vsi);
ice_vsi_delete(vsi);
ice_vsi_put_qs(vsi);
ice_vsi_clear(vsi);
}
return status; return status;
} }
...@@ -4522,6 +4515,7 @@ static int __maybe_unused ice_suspend(struct device *dev) ...@@ -4522,6 +4515,7 @@ static int __maybe_unused ice_suspend(struct device *dev)
} }
ice_clear_interrupt_scheme(pf); ice_clear_interrupt_scheme(pf);
pci_save_state(pdev);
pci_wake_from_d3(pdev, pf->wol_ena); pci_wake_from_d3(pdev, pf->wol_ena);
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment