On Thu, Apr 01, 2021 at 05:37:16AM +0000, Raphael Norwitz wrote:
> Slot resets are bus resets with additional logic to prevent a device
> from being removed during the reset. Currently slot and bus resets have
> separate implementations in pci.c, complicating higher level logic. As
> discussed on the mailing list, they should be combined into a generic
> function which performs an SBR. This change adds a function,
> pci_reset_bus_function(), which first attempts a slot reset and then
> attempts a bus reset if -ENOTTY is returned, such that there is now a
> single device agnostic function to perform an SBR.
> 
> This new function is also needed to add SBR reset quirks and therefore
> is exposed in pci.h.
> 
> Link: https://lkml.org/lkml/2021/3/23/911
> 
> Suggested-by: Alex Williamson <alex.william...@redhat.com>
> Signed-off-by: Amey Narkhede <ameynarkhed...@gmail.com>
> Signed-off-by: Raphael Norwitz <raphael.norw...@nutanix.com>
> ---
>  drivers/pci/pci.c   | 17 +++++++++--------
>  include/linux/pci.h |  1 +
>  2 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 16a17215f633..12a91af2ade4 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -4982,6 +4982,13 @@ static int pci_dev_reset_slot_function(struct pci_dev 
> *dev, int probe)
>       return pci_reset_hotplug_slot(dev->slot->hotplug, probe);
>  }
>  
> +int pci_reset_bus_function(struct pci_dev *dev, int probe)
> +{
> +     int rc = pci_dev_reset_slot_function(dev, probe);
> +
> +     return (rc == -ENOTTY) ? pci_parent_bus_reset(dev, probe) : rc;

The previous coding style is preferable one in the Linux kernel.
int rc = pci_dev_reset_slot_function(dev, probe);
if (rc != -ENOTTY)
  return rc;
return pci_parent_bus_reset(dev, probe);


> +}
> +
>  static void pci_dev_lock(struct pci_dev *dev)
>  {
>       pci_cfg_access_lock(dev);
> @@ -5102,10 +5109,7 @@ int __pci_reset_function_locked(struct pci_dev *dev)
>       rc = pci_pm_reset(dev, 0);
>       if (rc != -ENOTTY)
>               return rc;
> -     rc = pci_dev_reset_slot_function(dev, 0);
> -     if (rc != -ENOTTY)
> -             return rc;
> -     return pci_parent_bus_reset(dev, 0);
> +     return pci_reset_bus_function(dev, 0);
>  }
>  EXPORT_SYMBOL_GPL(__pci_reset_function_locked);
>  
> @@ -5135,13 +5139,10 @@ int pci_probe_reset_function(struct pci_dev *dev)
>       if (rc != -ENOTTY)
>               return rc;
>       rc = pci_pm_reset(dev, 1);
> -     if (rc != -ENOTTY)
> -             return rc;
> -     rc = pci_dev_reset_slot_function(dev, 1);
>       if (rc != -ENOTTY)
>               return rc;
>  
> -     return pci_parent_bus_reset(dev, 1);
> +     return pci_reset_bus_function(dev, 1);
>  }
>  
>  /**
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 86c799c97b77..979d54335ac1 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1228,6 +1228,7 @@ int pci_probe_reset_bus(struct pci_bus *bus);
>  int pci_reset_bus(struct pci_dev *dev);
>  void pci_reset_secondary_bus(struct pci_dev *dev);
>  void pcibios_reset_secondary_bus(struct pci_dev *dev);
> +int pci_reset_bus_function(struct pci_dev *dev, int probe);
>  void pci_update_resource(struct pci_dev *dev, int resno);
>  int __must_check pci_assign_resource(struct pci_dev *dev, int i);
>  int __must_check pci_reassign_resource(struct pci_dev *dev, int i, 
> resource_size_t add_size, resource_size_t align);
> -- 
> 2.20.1

Reply via email to