aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath5k/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath5k/base.c')
-rw-r--r--drivers/net/wireless/ath5k/base.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index 2028866f5995..0676c6d84383 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -40,7 +40,6 @@
40 * 40 *
41 */ 41 */
42 42
43#include <linux/version.h>
44#include <linux/module.h> 43#include <linux/module.h>
45#include <linux/delay.h> 44#include <linux/delay.h>
46#include <linux/hardirq.h> 45#include <linux/hardirq.h>
@@ -252,7 +251,7 @@ static inline void ath5k_txbuf_free(struct ath5k_softc *sc,
252 return; 251 return;
253 pci_unmap_single(sc->pdev, bf->skbaddr, bf->skb->len, 252 pci_unmap_single(sc->pdev, bf->skbaddr, bf->skb->len,
254 PCI_DMA_TODEVICE); 253 PCI_DMA_TODEVICE);
255 dev_kfree_skb(bf->skb); 254 dev_kfree_skb_any(bf->skb);
256 bf->skb = NULL; 255 bf->skb = NULL;
257} 256}
258 257
@@ -467,6 +466,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
467 mutex_init(&sc->lock); 466 mutex_init(&sc->lock);
468 spin_lock_init(&sc->rxbuflock); 467 spin_lock_init(&sc->rxbuflock);
469 spin_lock_init(&sc->txbuflock); 468 spin_lock_init(&sc->txbuflock);
469 spin_lock_init(&sc->block);
470 470
471 /* Set private data */ 471 /* Set private data */
472 pci_set_drvdata(pdev, hw); 472 pci_set_drvdata(pdev, hw);
@@ -587,7 +587,6 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state)
587 ath5k_stop_hw(sc); 587 ath5k_stop_hw(sc);
588 588
589 free_irq(pdev->irq, sc); 589 free_irq(pdev->irq, sc);
590 pci_disable_msi(pdev);
591 pci_save_state(pdev); 590 pci_save_state(pdev);
592 pci_disable_device(pdev); 591 pci_disable_device(pdev);
593 pci_set_power_state(pdev, PCI_D3hot); 592 pci_set_power_state(pdev, PCI_D3hot);
@@ -616,12 +615,10 @@ ath5k_pci_resume(struct pci_dev *pdev)
616 */ 615 */
617 pci_write_config_byte(pdev, 0x41, 0); 616 pci_write_config_byte(pdev, 0x41, 0);
618 617
619 pci_enable_msi(pdev);
620
621 err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); 618 err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc);
622 if (err) { 619 if (err) {
623 ATH5K_ERR(sc, "request_irq failed\n"); 620 ATH5K_ERR(sc, "request_irq failed\n");
624 goto err_msi; 621 goto err_no_irq;
625 } 622 }
626 623
627 err = ath5k_init(sc); 624 err = ath5k_init(sc);
@@ -642,8 +639,7 @@ ath5k_pci_resume(struct pci_dev *pdev)
642 return 0; 639 return 0;
643err_irq: 640err_irq:
644 free_irq(pdev->irq, sc); 641 free_irq(pdev->irq, sc);
645err_msi: 642err_no_irq:
646 pci_disable_msi(pdev);
647 pci_disable_device(pdev); 643 pci_disable_device(pdev);
648 return err; 644 return err;
649} 645}
@@ -2184,8 +2180,11 @@ ath5k_beacon_config(struct ath5k_softc *sc)
2184 2180
2185 sc->imask |= AR5K_INT_SWBA; 2181 sc->imask |= AR5K_INT_SWBA;
2186 2182
2187 if (ath5k_hw_hasveol(ah)) 2183 if (ath5k_hw_hasveol(ah)) {
2184 spin_lock(&sc->block);
2188 ath5k_beacon_send(sc); 2185 ath5k_beacon_send(sc);
2186 spin_unlock(&sc->block);
2187 }
2189 } 2188 }
2190 /* TODO else AP */ 2189 /* TODO else AP */
2191 2190
@@ -2408,7 +2407,9 @@ ath5k_intr(int irq, void *dev_id)
2408 TSF_TO_TU(tsf), 2407 TSF_TO_TU(tsf),
2409 (unsigned long long) tsf); 2408 (unsigned long long) tsf);
2410 } else { 2409 } else {
2410 spin_lock(&sc->block);
2411 ath5k_beacon_send(sc); 2411 ath5k_beacon_send(sc);
2412 spin_unlock(&sc->block);
2412 } 2413 }
2413 } 2414 }
2414 if (status & AR5K_INT_RXEOL) { 2415 if (status & AR5K_INT_RXEOL) {
@@ -2750,6 +2751,11 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
2750 ret = -EOPNOTSUPP; 2751 ret = -EOPNOTSUPP;
2751 goto end; 2752 goto end;
2752 } 2753 }
2754
2755 /* Set to a reasonable value. Note that this will
2756 * be set to mac80211's value at ath5k_config(). */
2757 sc->bintval = 1000;
2758
2753 ret = 0; 2759 ret = 0;
2754end: 2760end:
2755 mutex_unlock(&sc->lock); 2761 mutex_unlock(&sc->lock);
@@ -2794,9 +2800,6 @@ ath5k_config_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2794 struct ath5k_hw *ah = sc->ah; 2800 struct ath5k_hw *ah = sc->ah;
2795 int ret; 2801 int ret;
2796 2802
2797 /* Set to a reasonable value. Note that this will
2798 * be set to mac80211's value at ath5k_config(). */
2799 sc->bintval = 1000;
2800 mutex_lock(&sc->lock); 2803 mutex_lock(&sc->lock);
2801 if (sc->vif != vif) { 2804 if (sc->vif != vif) {
2802 ret = -EIO; 2805 ret = -EIO;
@@ -3055,6 +3058,7 @@ static int
3055ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb) 3058ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
3056{ 3059{
3057 struct ath5k_softc *sc = hw->priv; 3060 struct ath5k_softc *sc = hw->priv;
3061 unsigned long flags;
3058 int ret; 3062 int ret;
3059 3063
3060 ath5k_debug_dump_skb(sc, skb, "BC ", 1); 3064 ath5k_debug_dump_skb(sc, skb, "BC ", 1);
@@ -3064,12 +3068,14 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
3064 goto end; 3068 goto end;
3065 } 3069 }
3066 3070
3071 spin_lock_irqsave(&sc->block, flags);
3067 ath5k_txbuf_free(sc, sc->bbuf); 3072 ath5k_txbuf_free(sc, sc->bbuf);
3068 sc->bbuf->skb = skb; 3073 sc->bbuf->skb = skb;
3069 ret = ath5k_beacon_setup(sc, sc->bbuf); 3074 ret = ath5k_beacon_setup(sc, sc->bbuf);
3070 if (ret) 3075 if (ret)
3071 sc->bbuf->skb = NULL; 3076 sc->bbuf->skb = NULL;
3072 else { 3077 spin_unlock_irqrestore(&sc->block, flags);
3078 if (!ret) {
3073 ath5k_beacon_config(sc); 3079 ath5k_beacon_config(sc);
3074 mmiowb(); 3080 mmiowb();
3075 } 3081 }