Message ID | 20200922112138.4392-1-pali@kernel.org |
---|---|
State | Accepted |
Commit | 5f50b88ab60a9d2ef2a68a7fc889e78520691e40 |
Delegated to: | Stefan Roese |
Headers | show |
Series | arm64: a37xx: pci: Disable link training when unloading driver | expand |
On 22.09.20 13:21, Pali Rohár wrote: > As required by PCI Express spec a delay for at least 100ms after > de-asserting PERST# signal is needed before link training is enabled. > > Linux kernels prior to 5.8 version do not automatically disable link > training before de-asserting PERST# signal, therefore this requirement is > not fulfilled. > > Above requirement is needed for proper detection of some Compex PCIe WiFi > cards. Otherwise Linux kernel cannot detect it. > > To allow using those PCIe cards with older Linux kernel versions booted by > U-Boot compiled with U-Boot a37xx pci driver, disable link training in > U-Boot when unloading this pci driver. > > Thanks to DM_FLAG_OS_PREPARE flag, U-Boot automatically unload this driver > when booting Linux kernel. > > Signed-off-by: Pali Rohár <pali@kernel.org> Reviewed-by: Stefan Roese <sr@denx.de> Thanks, Stefan > --- > drivers/pci/pci-aardvark.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/pci/pci-aardvark.c b/drivers/pci/pci-aardvark.c > index b2c417701f..babb84ca93 100644 > --- a/drivers/pci/pci-aardvark.c > +++ b/drivers/pci/pci-aardvark.c > @@ -647,10 +647,15 @@ static int pcie_advk_probe(struct udevice *dev) > static int pcie_advk_remove(struct udevice *dev) > { > struct pcie_advk *pcie = dev_get_priv(dev); > + u32 reg; > > if (dm_gpio_is_valid(&pcie->reset_gpio)) > dm_gpio_set_value(&pcie->reset_gpio, 1); > > + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); > + reg &= ~LINK_TRAINING_EN; > + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); > + > return 0; > } > > Viele Grüße, Stefan
On Wednesday 23 September 2020 08:45:20 Stefan Roese wrote: > On 22.09.20 13:21, Pali Rohár wrote: > > As required by PCI Express spec a delay for at least 100ms after > > de-asserting PERST# signal is needed before link training is enabled. > > > > Linux kernels prior to 5.8 version do not automatically disable link > > training before de-asserting PERST# signal, therefore this requirement is > > not fulfilled. > > > > Above requirement is needed for proper detection of some Compex PCIe WiFi > > cards. Otherwise Linux kernel cannot detect it. > > > > To allow using those PCIe cards with older Linux kernel versions booted by > > U-Boot compiled with U-Boot a37xx pci driver, disable link training in > > U-Boot when unloading this pci driver. > > > > Thanks to DM_FLAG_OS_PREPARE flag, U-Boot automatically unload this driver > > when booting Linux kernel. > > > > Signed-off-by: Pali Rohár <pali@kernel.org> > > Reviewed-by: Stefan Roese <sr@denx.de> > > Thanks, > Stefan Ok! Stefan, will you send this patch to main u-boot, so it would be part of the u-boot 2020.10 release? > > --- > > drivers/pci/pci-aardvark.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/pci/pci-aardvark.c b/drivers/pci/pci-aardvark.c > > index b2c417701f..babb84ca93 100644 > > --- a/drivers/pci/pci-aardvark.c > > +++ b/drivers/pci/pci-aardvark.c > > @@ -647,10 +647,15 @@ static int pcie_advk_probe(struct udevice *dev) > > static int pcie_advk_remove(struct udevice *dev) > > { > > struct pcie_advk *pcie = dev_get_priv(dev); > > + u32 reg; > > if (dm_gpio_is_valid(&pcie->reset_gpio)) > > dm_gpio_set_value(&pcie->reset_gpio, 1); > > + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); > > + reg &= ~LINK_TRAINING_EN; > > + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); > > + > > return 0; > > } > > > > > Viele Grüße, > Stefan > > -- > DENX Software Engineering GmbH, Managing Director: Wolfgang Denk > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany > Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr@denx.de
On 22.09.20 13:21, Pali Rohár wrote: > As required by PCI Express spec a delay for at least 100ms after > de-asserting PERST# signal is needed before link training is enabled. > > Linux kernels prior to 5.8 version do not automatically disable link > training before de-asserting PERST# signal, therefore this requirement is > not fulfilled. > > Above requirement is needed for proper detection of some Compex PCIe WiFi > cards. Otherwise Linux kernel cannot detect it. > > To allow using those PCIe cards with older Linux kernel versions booted by > U-Boot compiled with U-Boot a37xx pci driver, disable link training in > U-Boot when unloading this pci driver. > > Thanks to DM_FLAG_OS_PREPARE flag, U-Boot automatically unload this driver > when booting Linux kernel. > > Signed-off-by: Pali Rohár <pali@kernel.org> Applied to u-boot-marvell/master Thanks, Stefan > --- > drivers/pci/pci-aardvark.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/pci/pci-aardvark.c b/drivers/pci/pci-aardvark.c > index b2c417701f..babb84ca93 100644 > --- a/drivers/pci/pci-aardvark.c > +++ b/drivers/pci/pci-aardvark.c > @@ -647,10 +647,15 @@ static int pcie_advk_probe(struct udevice *dev) > static int pcie_advk_remove(struct udevice *dev) > { > struct pcie_advk *pcie = dev_get_priv(dev); > + u32 reg; > > if (dm_gpio_is_valid(&pcie->reset_gpio)) > dm_gpio_set_value(&pcie->reset_gpio, 1); > > + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); > + reg &= ~LINK_TRAINING_EN; > + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); > + > return 0; > } > >
diff --git a/drivers/pci/pci-aardvark.c b/drivers/pci/pci-aardvark.c index b2c417701f..babb84ca93 100644 --- a/drivers/pci/pci-aardvark.c +++ b/drivers/pci/pci-aardvark.c @@ -647,10 +647,15 @@ static int pcie_advk_probe(struct udevice *dev) static int pcie_advk_remove(struct udevice *dev) { struct pcie_advk *pcie = dev_get_priv(dev); + u32 reg; if (dm_gpio_is_valid(&pcie->reset_gpio)) dm_gpio_set_value(&pcie->reset_gpio, 1); + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); + reg &= ~LINK_TRAINING_EN; + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); + return 0; }
As required by PCI Express spec a delay for at least 100ms after de-asserting PERST# signal is needed before link training is enabled. Linux kernels prior to 5.8 version do not automatically disable link training before de-asserting PERST# signal, therefore this requirement is not fulfilled. Above requirement is needed for proper detection of some Compex PCIe WiFi cards. Otherwise Linux kernel cannot detect it. To allow using those PCIe cards with older Linux kernel versions booted by U-Boot compiled with U-Boot a37xx pci driver, disable link training in U-Boot when unloading this pci driver. Thanks to DM_FLAG_OS_PREPARE flag, U-Boot automatically unload this driver when booting Linux kernel. Signed-off-by: Pali Rohár <pali@kernel.org> --- drivers/pci/pci-aardvark.c | 5 +++++ 1 file changed, 5 insertions(+)