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; |