lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ