diff mbox series

[1/2] PCI/LINK: bw_notification: Clear interrupt before enabling it

Message ID 87006d1f5b6868c0a6bb2fbb2765ee4dde550f28.1553078908.git.lukas@wunner.de (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show
Series Link bandwidth notification fixes | expand

Commit Message

Lukas Wunner March 20, 2019, 11:05 a.m. UTC
When booting a MacBookPro9,1, duplicate link downtraining messages are
logged for the devices directly attached to the two CPU-internal Root
Ports of the Core i7 3615QM:  Once on device enumeration and once on
enablement of the bandwidth notification interrupt on the Root Ports.

Duplicate messages do not occur with Root Ports on the PCH and Downstream
Ports on the Thunderbolt controller:  Only a single message is logged for
these, namely on device enumeration.

The reason for the duplicate messages is a stale interrupt in the Link
Status register of the 3615QM's internal Root Ports.  Avoid by clearing
the interrupt before enabling it.

An alternative approach would be to clear the interrupt already on device
enumeration or to report link downtraining only if the speed has changed.
That way, link downtraining occurring between device enumeration and
enablement of the bandwidth notification interrupt could be catched.
However clearing stale interrupts before enabling them is a standard
operating procedure for any driver and keeping the two steps in one place
makes the code easier to follow.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
---
 drivers/pci/pcie/bw_notification.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Alex_Gagniuc@Dellteam.com March 25, 2019, 6:50 p.m. UTC | #1
On 3/20/19 6:14 AM, Lukas Wunner wrote:
> 
> [EXTERNAL EMAIL]
> 
> When booting a MacBookPro9,1, duplicate link downtraining messages are
> logged for the devices directly attached to the two CPU-internal Root
> Ports of the Core i7 3615QM:  Once on device enumeration and once on
> enablement of the bandwidth notification interrupt on the Root Ports.
> 
> Duplicate messages do not occur with Root Ports on the PCH and Downstream
> Ports on the Thunderbolt controller:  Only a single message is logged for
> these, namely on device enumeration.
> 
> The reason for the duplicate messages is a stale interrupt in the Link
> Status register of the 3615QM's internal Root Ports.  Avoid by clearing
> the interrupt before enabling it.
> 
> An alternative approach would be to clear the interrupt already on device
> enumeration or to report link downtraining only if the speed has changed.
> That way, link downtraining occurring between device enumeration and
> enablement of the bandwidth notification interrupt could be catched.
> However clearing stale interrupts before enabling them is a standard
> operating procedure for any driver and keeping the two steps in one place
> makes the code easier to follow.
> 
> Signed-off-by: Lukas Wunner <lukas@wunner.de>

Reviewed-by: Alexandru Gagniuc <alex.gagniuc@dellteam.com>

> ---
>   drivers/pci/pcie/bw_notification.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/pci/pcie/bw_notification.c b/drivers/pci/pcie/bw_notification.c
> index 001d6253ad48..69e6ba2558bf 100644
> --- a/drivers/pci/pcie/bw_notification.c
> +++ b/drivers/pci/pcie/bw_notification.c
> @@ -30,6 +30,8 @@ static void pcie_enable_link_bandwidth_notification(struct pci_dev *dev)
>   {
>   	u16 lnk_ctl;
>   
> +	pcie_capability_write_word(dev, PCI_EXP_LNKSTA, PCI_EXP_LNKSTA_LBMS);
> +
>   	pcie_capability_read_word(dev, PCI_EXP_LNKCTL, &lnk_ctl);
>   	lnk_ctl |= PCI_EXP_LNKCTL_LBMIE;
>   	pcie_capability_write_word(dev, PCI_EXP_LNKCTL, lnk_ctl);
>
diff mbox series

Patch

diff --git a/drivers/pci/pcie/bw_notification.c b/drivers/pci/pcie/bw_notification.c
index 001d6253ad48..69e6ba2558bf 100644
--- a/drivers/pci/pcie/bw_notification.c
+++ b/drivers/pci/pcie/bw_notification.c
@@ -30,6 +30,8 @@  static void pcie_enable_link_bandwidth_notification(struct pci_dev *dev)
 {
 	u16 lnk_ctl;
 
+	pcie_capability_write_word(dev, PCI_EXP_LNKSTA, PCI_EXP_LNKSTA_LBMS);
+
 	pcie_capability_read_word(dev, PCI_EXP_LNKCTL, &lnk_ctl);
 	lnk_ctl |= PCI_EXP_LNKCTL_LBMIE;
 	pcie_capability_write_word(dev, PCI_EXP_LNKCTL, lnk_ctl);