Skip to content

Commit 6ccf15a

Browse files
maximlevitskylinvjw
authored andcommitted
ath5k: disable ASPM L0s for all cards
Atheros PCIe wireless cards handled by ath5k do require L0s disabled. For distributions shipping with CONFIG_PCIEASPM (this will be enabled by default in the future in 2.6.36) this will also mean both L1 and L0s will be disabled when a pre 1.1 PCIe device is detected. We do know L1 works correctly even for all ath5k pre 1.1 PCIe devices though but cannot currently undue the effect of a blacklist, for details you can read pcie_aspm_sanity_check() and see how it adjusts the device link capability. It may be possible in the future to implement some PCI API to allow drivers to override blacklists for pre 1.1 PCIe but for now it is best to accept that both L0s and L1 will be disabled completely for distributions shipping with CONFIG_PCIEASPM rather than having this issue present. Motivation for adding this new API will be to help with power consumption for some of these devices. Example of issues you'd see: - On the Acer Aspire One (AOA150, Atheros Communications Inc. AR5001 Wireless Network Adapter [168c:001c] (rev 01)) doesn't work well with ASPM enabled, the card will eventually stall on heavy traffic with often 'unsupported jumbo' warnings appearing. Disabling ASPM L0s in ath5k fixes these problems. - On the same card you would see a storm of RXORN interrupts even though medium is idle. Credit for root causing and fixing the bug goes to Jussi Kivilinna. Cc: David Quan <David.Quan@atheros.com> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Tim Gardner <tim.gardner@canonical.com> Cc: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> Cc: stable@kernel.org Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
1 parent ca6cff1 commit 6ccf15a

File tree

1 file changed

+21
-0
lines changed
  • drivers/net/wireless/ath/ath5k

1 file changed

+21
-0
lines changed

drivers/net/wireless/ath/ath5k/base.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include <linux/netdevice.h>
4949
#include <linux/cache.h>
5050
#include <linux/pci.h>
51+
#include <linux/pci-aspm.h>
5152
#include <linux/ethtool.h>
5253
#include <linux/uaccess.h>
5354
#include <linux/slab.h>
@@ -476,6 +477,26 @@ ath5k_pci_probe(struct pci_dev *pdev,
476477
int ret;
477478
u8 csz;
478479

480+
/*
481+
* L0s needs to be disabled on all ath5k cards.
482+
*
483+
* For distributions shipping with CONFIG_PCIEASPM (this will be enabled
484+
* by default in the future in 2.6.36) this will also mean both L1 and
485+
* L0s will be disabled when a pre 1.1 PCIe device is detected. We do
486+
* know L1 works correctly even for all ath5k pre 1.1 PCIe devices
487+
* though but cannot currently undue the effect of a blacklist, for
488+
* details you can read pcie_aspm_sanity_check() and see how it adjusts
489+
* the device link capability.
490+
*
491+
* It may be possible in the future to implement some PCI API to allow
492+
* drivers to override blacklists for pre 1.1 PCIe but for now it is
493+
* best to accept that both L0s and L1 will be disabled completely for
494+
* distributions shipping with CONFIG_PCIEASPM rather than having this
495+
* issue present. Motivation for adding this new API will be to help
496+
* with power consumption for some of these devices.
497+
*/
498+
pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S);
499+
479500
ret = pci_enable_device(pdev);
480501
if (ret) {
481502
dev_err(&pdev->dev, "can't enable device\n");

0 commit comments

Comments
 (0)