[PATCH v8 35/45] powerpc/powernv: Fundamental reset in pnv_pci_reset_secondary_bus()
Alexey Kardashevskiy
aik at ozlabs.ru
Tue Apr 19 19:04:19 AEST 2016
On 02/17/2016 02:44 PM, Gavin Shan wrote:
> In pnv_pci_reset_secondary_bus(), we should issue fundamental reset
> if any one subordinate device of the specified bus is requesting that.
> Otherwise, the device might not come up after the reset.
>
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>
Out of curiosity - what does "fundamental" reset actually do?
> ---
> arch/powerpc/platforms/powernv/eeh-powernv.c | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
> index 593b8dc..c7454ba 100644
> --- a/arch/powerpc/platforms/powernv/eeh-powernv.c
> +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
> @@ -866,9 +866,28 @@ static int pnv_eeh_bridge_reset(struct pci_dev *dev, int option)
> return 0;
> }
>
> +static int pnv_pci_dev_reset_type(struct pci_dev *pdev, void *data)
> +{
> + int *freset = data;
> +
> + /*
> + * Stop the iteration immediately if there has any one
> + * PCI device requesting fundamental reset.
> + */
> + *freset |= pdev->needs_freset;
> + return *freset;
> +}
> +
> void pnv_pci_reset_secondary_bus(struct pci_dev *dev)
> {
> - pnv_eeh_bridge_reset(dev, EEH_RESET_HOT);
> + int option, freset = 0;
> +
> + if (dev->subordinate)
> + pci_walk_bus(dev->subordinate,
> + pnv_pci_dev_reset_type, &freset);
> +
> + option = freset ? EEH_RESET_FUNDAMENTAL : EEH_RESET_HOT;
> + pnv_eeh_bridge_reset(dev, option);
> pnv_eeh_bridge_reset(dev, EEH_RESET_DEACTIVATE);
> }
>
>
--
Alexey
More information about the Linuxppc-dev
mailing list