* Re: [PATCH 4/5] b43: reinit on too many PHY TX errors [not found] ` <20071124201301.178475691@polimi.it> @ 2007-11-24 20:31 ` Michael Buesch 2007-11-24 22:35 ` [PATCH 4/5 V2] " Stefano Brivio 0 siblings, 1 reply; 3+ messages in thread From: Michael Buesch @ 2007-11-24 20:31 UTC (permalink / raw) To: Stefano Brivio; +Cc: John Linville, linux-wireless On Saturday 24 November 2007 21:11:11 Stefano Brivio wrote: > Restart the hardware on too many PHY TX errors. A thousand PHY TX errors > per 15 seconds means we won't be able to recover for sure. > > > Signed-off-by: Stefano Brivio <stefano.brivio@polimi.it> > To: Michael Buesch <mb@bu3sch.de> > > --- > > Index: wireless-2.6/drivers/net/wireless/b43/b43.h > =================================================================== > --- wireless-2.6.orig/drivers/net/wireless/b43/b43.h > +++ wireless-2.6/drivers/net/wireless/b43/b43.h > @@ -391,6 +391,8 @@ enum { > #define B43_DEFAULT_SHORT_RETRY_LIMIT 7 > #define B43_DEFAULT_LONG_RETRY_LIMIT 4 > > +#define B43_PHY_TX_BADNESS_LIMIT 1000 > + > /* Max size of a security key */ > #define B43_SEC_KEYSIZE 16 > /* Security algorithms. */ > @@ -546,6 +548,9 @@ struct b43_phy { > /* OFDM address read/write caching for hardware auto-increment. */ > u16 ofdm_addr; > u8 ofdm_valid; /* 0: invalid, 1: read, 2: write */ > + > + /* PHY TX errors counter. */ > + u16 txerr_cnt; > }; > > /* Data structures for DMA transmission, per 80211 core. */ > Index: wireless-2.6/drivers/net/wireless/b43/main.c > =================================================================== > --- wireless-2.6.orig/drivers/net/wireless/b43/main.c > +++ wireless-2.6/drivers/net/wireless/b43/main.c > @@ -1394,8 +1394,17 @@ static void b43_interrupt_tasklet(struct > if (unlikely(reason & B43_IRQ_MAC_TXERR)) > b43err(dev->wl, "MAC transmission error\n"); > > - if (unlikely(reason & B43_IRQ_PHY_TXERR)) > + if (unlikely(reason & B43_IRQ_PHY_TXERR)) { > b43err(dev->wl, "PHY transmission error\n"); > + if (dev->phy.txerr_cnt < B43_PHY_TX_BADNESS_LIMIT) > + dev->phy.txerr_cnt++; > + else { > + dev->phy.txerr_cnt = 0; > + b43err(dev->wl, "Too many PHY TX errors, " > + "restarting the controller\n"); > + b43_controller_restart(dev, "PHY TX errors"); > + } > + } > > if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK | > B43_DMAIRQ_NONFATALMASK))) { > @@ -2259,6 +2268,9 @@ static int b43_chip_init(struct b43_wlde > /* OFDM address caching. */ > phy->ofdm_valid = 0; > > + /* PHY TX errors counter. */ > + phy->txerr_cnt = 0; > + > err = 0; > b43dbg(dev->wl, "Chip initialized\n"); > out: > @@ -2344,6 +2356,8 @@ static void b43_periodic_every15sec(stru > } > b43_phy_xmitpower(dev); //FIXME: unless scanning? > //TODO for APHY (temperature?) > + > + phy->txerr_cnt = 0; Needs either atomic_t plus memory barriers or spin_lock(&wl->irq_lock). I'd suggest atomic_t with mb()s as it's a bad idea to completely sync with IRQs on every 15sec pwork for this error counter. -- Greetings Michael. ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 4/5 V2] b43: reinit on too many PHY TX errors 2007-11-24 20:31 ` [PATCH 4/5] b43: reinit on too many PHY TX errors Michael Buesch @ 2007-11-24 22:35 ` Stefano Brivio 0 siblings, 0 replies; 3+ messages in thread From: Stefano Brivio @ 2007-11-24 22:35 UTC (permalink / raw) To: Michael Buesch; +Cc: John Linville, linux-wireless Restart the hardware on too many PHY TX errors. A thousand PHY TX errors per 15 seconds means we won't be able to recover for sure. Signed-off-by: Stefano Brivio <stefano.brivio@polimi.it> --- Index: wireless-2.6/drivers/net/wireless/b43/b43.h =================================================================== --- wireless-2.6.orig/drivers/net/wireless/b43/b43.h +++ wireless-2.6/drivers/net/wireless/b43/b43.h @@ -391,6 +391,8 @@ enum { #define B43_DEFAULT_SHORT_RETRY_LIMIT 7 #define B43_DEFAULT_LONG_RETRY_LIMIT 4 +#define B43_PHY_TX_BADNESS_LIMIT 1000 + /* Max size of a security key */ #define B43_SEC_KEYSIZE 16 /* Security algorithms. */ @@ -546,6 +548,9 @@ struct b43_phy { /* OFDM address read/write caching for hardware auto-increment. */ u16 ofdm_addr; u8 ofdm_valid; /* 0: invalid, 1: read, 2: write */ + + /* PHY TX errors counter. */ + atomic_t txerr_cnt; }; /* Data structures for DMA transmission, per 80211 core. */ Index: wireless-2.6/drivers/net/wireless/b43/main.c =================================================================== --- wireless-2.6.orig/drivers/net/wireless/b43/main.c +++ wireless-2.6/drivers/net/wireless/b43/main.c @@ -1394,8 +1394,17 @@ static void b43_interrupt_tasklet(struct if (unlikely(reason & B43_IRQ_MAC_TXERR)) b43err(dev->wl, "MAC transmission error\n"); - if (unlikely(reason & B43_IRQ_PHY_TXERR)) + if (unlikely(reason & B43_IRQ_PHY_TXERR)) { b43err(dev->wl, "PHY transmission error\n"); + rmb(); + if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) { + atomic_set(&dev->phy.txerr_cnt, + B43_PHY_TX_BADNESS_LIMIT); + b43err(dev->wl, "Too many PHY TX errors, " + "restarting the controller\n"); + b43_controller_restart(dev, "PHY TX errors"); + } + } if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK | B43_DMAIRQ_NONFATALMASK))) { @@ -2259,6 +2268,9 @@ static int b43_chip_init(struct b43_wlde /* OFDM address caching. */ phy->ofdm_valid = 0; + /* PHY TX errors counter. */ + atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT); + err = 0; b43dbg(dev->wl, "Chip initialized\n"); out: @@ -2344,6 +2356,9 @@ static void b43_periodic_every15sec(stru } b43_phy_xmitpower(dev); //FIXME: unless scanning? //TODO for APHY (temperature?) + + atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT); + wmb(); } static void do_periodic_work(struct b43_wldev *dev) -- Ciao Stefano ^ permalink raw reply [flat|nested] 3+ messages in thread
[parent not found: <20071124201301.797261738@polimi.it>]
* [PATCH 5/5 V2] b43legacy: reinit on too many PHY TX errors [not found] ` <20071124201301.797261738@polimi.it> @ 2007-11-24 22:35 ` Stefano Brivio 0 siblings, 0 replies; 3+ messages in thread From: Stefano Brivio @ 2007-11-24 22:35 UTC (permalink / raw) To: John Linville; +Cc: linux-wireless Restart the hardware on too many PHY TX errors. A thousand PHY TX errors per 15 seconds means we won't be able to recover for sure. Signed-off-by: Stefano Brivio <stefano.brivio@polimi.it> --- Index: wireless-2.6/drivers/net/wireless/b43legacy/b43legacy.h =================================================================== --- wireless-2.6.orig/drivers/net/wireless/b43legacy/b43legacy.h +++ wireless-2.6/drivers/net/wireless/b43legacy/b43legacy.h @@ -276,6 +276,8 @@ #define B43legacy_DEFAULT_SHORT_RETRY_LIMIT 7 #define B43legacy_DEFAULT_LONG_RETRY_LIMIT 4 +#define B43legacy_PHY_TX_BADNESS_LIMIT 1000 + /* Max size of a security key */ #define B43legacy_SEC_KEYSIZE 16 /* Security algorithms. */ @@ -511,6 +513,9 @@ struct b43legacy_phy { u16 lofcal; u16 initval; + + /* PHY TX errors counter. */ + atomic_t txerr_cnt; }; /* Data structures for DMA transmission, per 80211 core. */ Index: wireless-2.6/drivers/net/wireless/b43legacy/main.c =================================================================== --- wireless-2.6.orig/drivers/net/wireless/b43legacy/main.c +++ wireless-2.6/drivers/net/wireless/b43legacy/main.c @@ -1221,8 +1221,15 @@ static void b43legacy_interrupt_tasklet( if (unlikely(reason & B43legacy_IRQ_MAC_TXERR)) b43legacyerr(dev->wl, "MAC transmission error\n"); - if (unlikely(reason & B43legacy_IRQ_PHY_TXERR)) + if (unlikely(reason & B43legacy_IRQ_PHY_TXERR)) { b43legacyerr(dev->wl, "PHY transmission error\n"); + rmb(); + if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) { + b43legacyerr(dev->wl, "Too many PHY TX errors, " + "restarting the controller\n"); + b43legacy_controller_restart(dev, "PHY TX errors"); + } + } if (unlikely(merged_dma_reason & (B43legacy_DMAIRQ_FATALMASK | B43legacy_DMAIRQ_NONFATALMASK))) { @@ -2094,6 +2101,9 @@ static int b43legacy_chip_init(struct b4 b43legacy_write16(dev, B43legacy_MMIO_POWERUP_DELAY, dev->dev->bus->chipco.fast_pwrup_delay); + /* PHY TX errors counter. */ + atomic_set(&phy->txerr_cnt, B43legacy_PHY_TX_BADNESS_LIMIT); + B43legacy_WARN_ON(err != 0); b43legacydbg(dev->wl, "Chip initialized\n"); out: @@ -2138,6 +2148,9 @@ static void b43legacy_periodic_every30se static void b43legacy_periodic_every15sec(struct b43legacy_wldev *dev) { b43legacy_phy_xmitpower(dev); /* FIXME: unless scanning? */ + + atomic_set(&dev->phy.txerr_cnt, B43legacy_PHY_TX_BADNESS_LIMIT); + wmb(); } static void do_periodic_work(struct b43legacy_wldev *dev) -- Ciao Stefano ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-11-24 22:36 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20071124201107.785472828@polimi.it>
[not found] ` <20071124201301.178475691@polimi.it>
2007-11-24 20:31 ` [PATCH 4/5] b43: reinit on too many PHY TX errors Michael Buesch
2007-11-24 22:35 ` [PATCH 4/5 V2] " Stefano Brivio
[not found] ` <20071124201301.797261738@polimi.it>
2007-11-24 22:35 ` [PATCH 5/5 V2] b43legacy: " Stefano Brivio
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).