* 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
* [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).