[JAUNTY] UBUNTU: SAUCE: Added patch to ath5k driver: protect reset sequence by a spinlock
Manoj Iyer
manoj.iyer at canonical.com
Thu Apr 30 14:49:35 UTC 2009
SRU JUSTIFICATION:
IMPACT: ath5k driver hangs periodically
FIX: protect reset sequence by a spinlock
TEST: Both amd64 and i386 kernels in
http://people.ubuntu.com/~manjo/lp356768-jaunty/
were tested.
The following changes since commit
a63b7d7beeaa1f8f33369cab6419831fa8991e40:
Tyler Hicks (1):
UBUNTU: SAUCE: (drop after 2.6.28) [PATCH] eCryptfs: Larger buffer
for encrypted symlink targets
are available in the git repository at:
git://kernel.ubuntu.com/manjo/ubuntu-jaunty.git lp356768
Manoj Iyer (1):
UBUNTU: SAUCE: Added patch to ath5k driver: protect reset sequence
by a spinlock
drivers/net/wireless/ath5k/base.c | 6 ++++++
drivers/net/wireless/ath5k/base.h | 1 +
drivers/net/wireless/ath5k/phy.c | 2 +-
3 files changed, 8 insertions(+), 1 deletions(-)
>From 9f03cfed8629c1e8cef710cf6d0ddc972ba38768 Mon Sep 17 00:00:00 2001
From: Manoj Iyer <manoj.iyer at canonical.com>
Date: Wed, 22 Apr 2009 13:41:11 -0500
Subject: [PATCH] UBUNTU: SAUCE: Added patch to ath5k driver: protect reset sequence by a spinlock
OriginalAuthor: Bob Copeland <me at bobcopeland.com>
Bug: #356768
BugLink: https://bugs.launchpad.net/linux/+bug/356768
Signed-off-by: Manoj Iyer <manoj.iyer at canonical.com>
---
drivers/net/wireless/ath5k/base.c | 6 ++++++
drivers/net/wireless/ath5k/base.h | 1 +
drivers/net/wireless/ath5k/phy.c | 2 +-
3 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index e521555..0f59b4d 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -525,6 +525,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
sc->cachelsz = csz * sizeof(u32); /* convert to bytes */
sc->opmode = NL80211_IFTYPE_STATION;
mutex_init(&sc->lock);
+ spin_lock_init(&sc->restlock);
spin_lock_init(&sc->rxbuflock);
spin_lock_init(&sc->txbuflock);
spin_lock_init(&sc->block);
@@ -2665,6 +2666,7 @@ ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel)
{
struct ath5k_hw *ah = sc->ah;
int ret;
+ unsigned long flags;
ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n");
@@ -2673,7 +2675,11 @@ ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel)
ath5k_txq_cleanup(sc);
ath5k_rx_stop(sc);
}
+
+ spin_lock_irqsave(&sc->restlock, flags);
ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true);
+ spin_unlock_irqrestore(&sc->restlock, flags);
+
if (ret) {
ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret);
goto err;
diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h
index facc60d..bd08aae 100644
--- a/drivers/net/wireless/ath5k/base.h
+++ b/drivers/net/wireless/ath5k/base.h
@@ -152,6 +152,7 @@ struct ath5k_softc {
led_off; /* off time for current blink */
struct tasklet_struct restq; /* reset tasklet */
+ spinlock_t restlock; /* protects reset state */
unsigned int rxbufsize; /* rx size based on mtu */
struct list_head rxbuf; /* receive buffer */
diff --git a/drivers/net/wireless/ath5k/phy.c b/drivers/net/wireless/ath5k/phy.c
index 35c7eb1..51e20d5 100644
--- a/drivers/net/wireless/ath5k/phy.c
+++ b/drivers/net/wireless/ath5k/phy.c
@@ -1620,7 +1620,7 @@ int ath5k_hw_rfregs(struct ath5k_hw *ah, struct ieee80211_channel *channel,
if (ah->ah_rf_banks == NULL) {
/* XXX do extra checks? */
- ah->ah_rf_banks = kmalloc(ah->ah_rf_banks_size, GFP_KERNEL);
+ ah->ah_rf_banks = kmalloc(ah->ah_rf_banks_size, GFP_ATOMIC);
if (ah->ah_rf_banks == NULL) {
ATH5K_ERR(ah->ah_sc, "out of memory\n");
return -ENOMEM;
--
1.6.0.4
Cheers
--- manjo
More information about the kernel-team
mailing list