linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* 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).