Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mt76: mt76x2e: disable pcie_aspm by default
On same device (e.g. U7612E-H1) PCIE_ASPM causes continuous mcu hangs and instability. Since mt76x2 series does not manage PCIE PS states, first we try to disable ASPM using pci_disable_link_state. If it fails, we will disable PCIE PS configuring PCI registers. This patch has been successfully tested on U7612E-H1 mini-pice card Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name> Signed-off-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
- Loading branch information
1 parent
58e1e96
commit c14d656
Showing
4 changed files
with
51 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// SPDX-License-Identifier: ISC | ||
/* | ||
* Copyright (C) 2019 Lorenzo Bianconi <lorenzo@kernel.org> | ||
*/ | ||
|
||
#include <linux/pci.h> | ||
|
||
void mt76_pci_disable_aspm(struct pci_dev *pdev) | ||
{ | ||
struct pci_dev *parent = pdev->bus->self; | ||
u16 aspm_conf, parent_aspm_conf = 0; | ||
|
||
pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf); | ||
aspm_conf &= PCI_EXP_LNKCTL_ASPMC; | ||
if (parent) { | ||
pcie_capability_read_word(parent, PCI_EXP_LNKCTL, | ||
&parent_aspm_conf); | ||
parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC; | ||
} | ||
|
||
if (!aspm_conf && (!parent || !parent_aspm_conf)) { | ||
/* aspm already disabled */ | ||
return; | ||
} | ||
|
||
dev_info(&pdev->dev, "disabling ASPM %s %s\n", | ||
(aspm_conf & PCI_EXP_LNKCTL_ASPM_L0S) ? "L0s" : "", | ||
(aspm_conf & PCI_EXP_LNKCTL_ASPM_L1) ? "L1" : ""); | ||
|
||
if (IS_ENABLED(CONFIG_PCIEASPM)) { | ||
int err; | ||
|
||
err = pci_disable_link_state(pdev, aspm_conf); | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
Borromini
|
||
if (!err) | ||
return; | ||
} | ||
|
||
/* both device and parent should have the same ASPM setting. | ||
* disable ASPM in downstream component first and then upstream. | ||
*/ | ||
pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf); | ||
if (parent) | ||
pcie_capability_clear_word(parent, PCI_EXP_LNKCTL, | ||
aspm_conf); | ||
} | ||
EXPORT_SYMBOL_GPL(mt76_pci_disable_aspm); |
pci.c:33:7: error: void value not ignored as it ought to be
err = pci_disable_link_state(pdev, aspm_conf);