[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <Pine.LNX.4.64.0903291509460.8069@zem.cjw.nep>
Date: Sun, 29 Mar 2009 15:25:16 +0200 (CEST)
From: Christiaan Welvaart <cjw@...eel.dyndns.org>
To: netdev@...r.kernel.org
Subject: [PATCH] drivers/net/b44.c: fix regressions in error recovery
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=fedb0eefe286a6409aa2c6c6f2353c595e68d33d
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@...eel.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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists