| Index: chromeos/compat-wireless/drivers/net/wireless/ath/ath5k/base.c
|
| diff --git a/chromeos/compat-wireless/drivers/net/wireless/ath/ath5k/base.c b/chromeos/compat-wireless/drivers/net/wireless/ath/ath5k/base.c
|
| index e2a34fad30ac8c515faa1e0521a7ba9c15d614c7..0b6ca52e9a2f97ac055a230a5535dc518c0ac6ba 100644
|
| --- a/chromeos/compat-wireless/drivers/net/wireless/ath/ath5k/base.c
|
| +++ b/chromeos/compat-wireless/drivers/net/wireless/ath/ath5k/base.c
|
| @@ -48,6 +48,7 @@
|
| #include <linux/netdevice.h>
|
| #include <linux/cache.h>
|
| #include <linux/pci.h>
|
| +#include <linux/pci-aspm.h>
|
| #include <linux/ethtool.h>
|
| #include <linux/uaccess.h>
|
| #include <linux/slab.h>
|
| @@ -512,6 +513,26 @@ ath5k_pci_probe(struct pci_dev *pdev,
|
| int ret;
|
| u8 csz;
|
|
|
| + /*
|
| + * L0s needs to be disabled on all ath5k cards.
|
| + *
|
| + * 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.
|
| + */
|
| + pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S);
|
| +
|
| ret = pci_enable_device(pdev);
|
| if (ret) {
|
| dev_err(&pdev->dev, "can't enable device\n");
|
| @@ -1342,6 +1363,10 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
|
| PCI_DMA_TODEVICE);
|
|
|
| rate = ieee80211_get_tx_rate(sc->hw, info);
|
| + if (!rate) {
|
| + ret = -EINVAL;
|
| + goto err_unmap;
|
| + }
|
|
|
| if (info->flags & IEEE80211_TX_CTL_NO_ACK)
|
| flags |= AR5K_TXDESC_NOACK;
|
|
|