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

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

Jeff Kirsher says:

====================
100GbE Intel Wired LAN Driver Updates 2020-05-28

This series contains updates to the ice driver only.

Anirudh (Ani) adds a poll for reset completion before proceeding with
driver initialization when the DDP package fails to load and the firmware
issues a core reset.

Jake cleans up unnecessary code, since ice_set_dflt_vsi_ctx() performs a
memset to clear the info from the context structures.  Fixed a potential
double free during probe unrolling after a failure.  Also fixed a
potential NULL pointer dereference upon register_netdev() failure.

Tony makes two functions static which are not called outside of their
file.

Brett refactors the ice_ena_vf_mappings(), which was doing the VF's MSIx
and queue mapping in one function which was hard to digest.  So create a
new function to handle the enabling MSIx mappings and another function
to handle the enabling of queue mappings.  Simplify the code flow in
ice_sriov_configure().  Created a helper function for clearing
VPGEN_VFRTRIG register, as this needs to be done on reset to notify the
VF that we are done resetting it.  Fixed the initialization/creation and
reset flows, which was unnecessarily complicated, so separate the two
flows into their own functions.  Renamed VF initialization functions to
make it more clear what they do and why.  Added functionality to set the
VF trust mode bit on reset.  Added helper functions to rebuild the VLAN
and MAC configurations when resetting a VF.  Refactored how the VF reset
is handled to prevent VF reset timeouts.

Paul cleaned up code not needed during a CORER/GLOBR reset.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 370c63fc 3726cce2
...@@ -938,7 +938,6 @@ static int ice_vsi_init(struct ice_vsi *vsi, bool init_vsi) ...@@ -938,7 +938,6 @@ static int ice_vsi_init(struct ice_vsi *vsi, bool init_vsi)
if (!ctxt) if (!ctxt)
return -ENOMEM; return -ENOMEM;
ctxt->info = vsi->info;
switch (vsi->type) { switch (vsi->type) {
case ICE_VSI_CTRL: case ICE_VSI_CTRL:
case ICE_VSI_LB: case ICE_VSI_LB:
......
...@@ -2428,7 +2428,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi) ...@@ -2428,7 +2428,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
err = register_netdev(vsi->netdev); err = register_netdev(vsi->netdev);
if (err) if (err)
goto err_destroy_devlink_port; goto err_free_netdev;
devlink_port_type_eth_set(&pf->devlink_port, vsi->netdev); devlink_port_type_eth_set(&pf->devlink_port, vsi->netdev);
...@@ -2439,9 +2439,11 @@ static int ice_cfg_netdev(struct ice_vsi *vsi) ...@@ -2439,9 +2439,11 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
return 0; return 0;
err_free_netdev:
free_netdev(vsi->netdev);
vsi->netdev = NULL;
err_destroy_devlink_port: err_destroy_devlink_port:
ice_devlink_destroy_port(pf); ice_devlink_destroy_port(pf);
return err; return err;
} }
...@@ -3086,6 +3088,9 @@ ice_log_pkg_init(struct ice_hw *hw, enum ice_status *status) ...@@ -3086,6 +3088,9 @@ ice_log_pkg_init(struct ice_hw *hw, enum ice_status *status)
case ICE_AQ_RC_EBADMAN: case ICE_AQ_RC_EBADMAN:
case ICE_AQ_RC_EBADBUF: case ICE_AQ_RC_EBADBUF:
dev_err(dev, "An error occurred on the device while loading the DDP package. The device will be reset.\n"); dev_err(dev, "An error occurred on the device while loading the DDP package. The device will be reset.\n");
/* poll for reset to complete */
if (ice_check_reset(hw))
dev_err(dev, "Error resetting device. Please reload the driver\n");
return; return;
default: default:
break; break;
...@@ -3415,7 +3420,7 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent) ...@@ -3415,7 +3420,7 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
if (err) { if (err) {
dev_err(dev, "ice_init_interrupt_scheme failed: %d\n", err); dev_err(dev, "ice_init_interrupt_scheme failed: %d\n", err);
err = -EIO; err = -EIO;
goto err_init_interrupt_unroll; goto err_init_vsi_unroll;
} }
/* In case of MSIX we are going to setup the misc vector right here /* In case of MSIX we are going to setup the misc vector right here
...@@ -3508,6 +3513,7 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent) ...@@ -3508,6 +3513,7 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
ice_free_irq_msix_misc(pf); ice_free_irq_msix_misc(pf);
err_init_interrupt_unroll: err_init_interrupt_unroll:
ice_clear_interrupt_scheme(pf); ice_clear_interrupt_scheme(pf);
err_init_vsi_unroll:
devm_kfree(dev, pf->vsi); devm_kfree(dev, pf->vsi);
err_init_pf_unroll: err_init_pf_unroll:
ice_deinit_pf(pf); ice_deinit_pf(pf);
...@@ -4891,6 +4897,11 @@ static void ice_update_pf_netdev_link(struct ice_pf *pf) ...@@ -4891,6 +4897,11 @@ static void ice_update_pf_netdev_link(struct ice_pf *pf)
* ice_rebuild - rebuild after reset * ice_rebuild - rebuild after reset
* @pf: PF to rebuild * @pf: PF to rebuild
* @reset_type: type of reset * @reset_type: type of reset
*
* Do not rebuild VF VSI in this flow because that is already handled via
* ice_reset_all_vfs(). This is because requirements for resetting a VF after a
* PFR/CORER/GLOBER/etc. are different than the normal flow. Also, we don't want
* to reset/rebuild all the VF VSI twice.
*/ */
static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type) static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
{ {
...@@ -4988,14 +4999,6 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type) ...@@ -4988,14 +4999,6 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
goto err_vsi_rebuild; goto err_vsi_rebuild;
} }
if (test_bit(ICE_FLAG_SRIOV_ENA, pf->flags)) {
err = ice_vsi_rebuild_by_type(pf, ICE_VSI_VF);
if (err) {
dev_err(dev, "VF VSI rebuild failed: %d\n", err);
goto err_vsi_rebuild;
}
}
/* If Flow Director is active */ /* If Flow Director is active */
if (test_bit(ICE_FLAG_FD_ENA, pf->flags)) { if (test_bit(ICE_FLAG_FD_ENA, pf->flags)) {
err = ice_vsi_rebuild_by_type(pf, ICE_VSI_CTRL); err = ice_vsi_rebuild_by_type(pf, ICE_VSI_CTRL);
......
...@@ -172,7 +172,8 @@ void ice_release_nvm(struct ice_hw *hw) ...@@ -172,7 +172,8 @@ void ice_release_nvm(struct ice_hw *hw)
* *
* Reads one 16 bit word from the Shadow RAM using the ice_read_sr_word_aq. * Reads one 16 bit word from the Shadow RAM using the ice_read_sr_word_aq.
*/ */
enum ice_status ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data) static enum ice_status
ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
{ {
enum ice_status status; enum ice_status status;
...@@ -196,7 +197,7 @@ enum ice_status ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data) ...@@ -196,7 +197,7 @@ enum ice_status ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
* Area (PFA) and returns the TLV pointer and length. The caller can * Area (PFA) and returns the TLV pointer and length. The caller can
* use these to read the variable length TLV value. * use these to read the variable length TLV value.
*/ */
enum ice_status static enum ice_status
ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len, ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
u16 module_type) u16 module_type)
{ {
......
...@@ -11,10 +11,6 @@ enum ice_status ...@@ -11,10 +11,6 @@ enum ice_status
ice_read_flat_nvm(struct ice_hw *hw, u32 offset, u32 *length, u8 *data, ice_read_flat_nvm(struct ice_hw *hw, u32 offset, u32 *length, u8 *data,
bool read_shadow_ram); bool read_shadow_ram);
enum ice_status enum ice_status
ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
u16 module_type);
enum ice_status
ice_read_pba_string(struct ice_hw *hw, u8 *pba_num, u32 pba_num_size); ice_read_pba_string(struct ice_hw *hw, u8 *pba_num, u32 pba_num_size);
enum ice_status ice_init_nvm(struct ice_hw *hw); enum ice_status ice_init_nvm(struct ice_hw *hw);
enum ice_status ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data);
#endif /* _ICE_NVM_H_ */ #endif /* _ICE_NVM_H_ */
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