[PATCH] drivers/net/b44.c: fix regressions in error recovery

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Christiaan Welvaart
Date: Sunday, March 29, 2009 - 6:25 am

hi,

When I max out a b44 device using NFS and then add http traffic (both 
inbound), the device resets every few minutes. This causes huge delays due 
to the PHY reset which was introduced by commit 
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=fedb0e...
It changes b44_halt() to disable the PHY but this function 
gets called in 2 error recovery situations and some configuration changes. IMHO 
disabling the PHY in those cases is a total waste of time. This patch reverts 
those cases to the old behavior.

(please CC: me on replies as I'm not subscribed to the list)


Signed-off-by: Christiaan Welvaart <cjw@daneel.dyndns.org>

diff -pruN a/drivers/net/b44.c b/drivers/net/b44.c
--- a/drivers/net/b44.c	2009-03-28 14:12:30.087884295 +0100
+++ b/drivers/net/b44.c	2009-03-28 14:11:57.293902007 +0100
@@ -124,6 +124,7 @@ MODULE_DEVICE_TABLE(ssb, b44_ssb_tbl);

   static void b44_halt(struct b44 *);
   static void b44_init_rings(struct b44 *);
+static void b44_chip_reset(struct b44 *bp, int reset_kind);

   #define B44_FULL_RESET		1
   #define B44_FULL_RESET_SKIP_PHY	2
@@ -865,7 +866,8 @@ static int b44_poll(struct napi_struct *
  		 unsigned long flags;

  		spin_lock_irqsave(&bp->lock, flags);
-		b44_halt(bp);
+		b44_disable_ints(bp);
+		b44_chip_reset(bp, B44_CHIP_RESET_FULL);
  		 b44_init_rings(bp);
  		 b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY);
  		 netif_wake_queue(bp->dev);
@@ -935,7 +937,8 @@ static void b44_tx_timeout(struct net_de

  	spin_lock_irq(&bp->lock);

-	b44_halt(bp);
+	b44_disable_ints(bp);
+	b44_chip_reset(bp, B44_CHIP_RESET_FULL);
  	 b44_init_rings(bp);
  	 b44_init_hw(bp, B44_FULL_RESET);

@@ -1052,7 +1055,8 @@ static int b44_change_mtu(struct net_dev
  	 }

  	spin_lock_irq(&bp->lock);
-	b44_halt(bp);
+	b44_disable_ints(bp);
+	b44_chip_reset(bp, B44_CHIP_RESET_FULL);
  	 dev->mtu = new_mtu;
  	 b44_init_rings(bp);
  	 b44_init_hw(bp, B44_FULL_RESET);
@@ -1917,7 +1921,8 @@ static int b44_set_ringparam(struct net_
  	 bp->rx_pending = ering->rx_pending;
  	 bp->tx_pending = ering->tx_pending;

-	b44_halt(bp);
+	b44_disable_ints(bp);
+	b44_chip_reset(bp, B44_CHIP_RESET_FULL);
  	 b44_init_rings(bp);
  	 b44_init_hw(bp, B44_FULL_RESET);
  	 netif_wake_queue(bp->dev);
@@ -1960,7 +1965,8 @@ static int b44_set_pauseparam(struct net
  	 else
  	 	bp->flags &= ~B44_FLAG_TX_PAUSE;
  	if (bp->flags & B44_FLAG_PAUSE_AUTO) {
-		b44_halt(bp);
+		b44_disable_ints(bp);
+		b44_chip_reset(bp, B44_CHIP_RESET_FULL);
  		 b44_init_rings(bp);
  		 b44_init_hw(bp, B44_FULL_RESET);
  	 } else {
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] drivers/net/b44.c: fix regressions in error recovery, Christiaan Welvaart, (Sun Mar 29, 6:25 am)