diff options
Diffstat (limited to 'drivers/net/wireless/ath5k/base.c')
-rw-r--r-- | drivers/net/wireless/ath5k/base.c | 32 |
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; |
643 | err_irq: | 640 | err_irq: |
644 | free_irq(pdev->irq, sc); | 641 | free_irq(pdev->irq, sc); |
645 | err_msi: | 642 | err_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; |
2754 | end: | 2760 | end: |
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 | |||
3055 | ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb) | 3058 | ath5k_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 | } |