From 81634067e51cf01ce13a7232dcbb475165b2d8bd Mon Sep 17 00:00:00 2001 From: maximilian attems Date: Wed, 1 Nov 2006 21:44:09 +0000 Subject: [PATCH] bcm43xx round2 svn path=/dists/trunk/linux-2.6/; revision=7679 --- debian/changelog | 4 +- .../bugfix/net-bcm43xx_netdev_watchdog.patch | 63 +++++++++++++++++++ debian/patches/series/4 | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 debian/patches/bugfix/net-bcm43xx_netdev_watchdog.patch diff --git a/debian/changelog b/debian/changelog index f1641c4ac..547ca7167 100644 --- a/debian/changelog +++ b/debian/changelog @@ -44,6 +44,8 @@ linux-2.6 (2.6.18-4) UNRELEASED; urgency=high * r8169: pull revert mac address change support. * [amd64]: Add upstream fix C3 timer test for dual core laptops. * [s390]: Fix funny timespeed on hercules emulator. (closes: 395247) + * bcm43xx: Add full netdev watchout timeout patch. (closes: 392065) + Thanks Sjoerd Simons for the testing. [ Sven Luther ] * [powerpc] Added exception alignement patch from Benjamin Herrenschmidt. @@ -51,7 +53,7 @@ linux-2.6 (2.6.18-4) UNRELEASED; urgency=high [ Frederik Schüler ] * Bump ABI to 2. - -- maximilian attems Wed, 1 Nov 2006 22:36:16 +0100 + -- maximilian attems Wed, 1 Nov 2006 22:42:06 +0100 linux-2.6 (2.6.18-3) unstable; urgency=low diff --git a/debian/patches/bugfix/net-bcm43xx_netdev_watchdog.patch b/debian/patches/bugfix/net-bcm43xx_netdev_watchdog.patch new file mode 100644 index 000000000..febf2fff5 --- /dev/null +++ b/debian/patches/bugfix/net-bcm43xx_netdev_watchdog.patch @@ -0,0 +1,63 @@ +Index: linux-2.6.18/drivers/net/wireless/bcm43xx/bcm43xx_main.c +=================================================================== +--- linux-2.6.18.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c ++++ linux-2.6.18/drivers/net/wireless/bcm43xx/bcm43xx_main.c +@@ -3159,24 +3159,42 @@ static int estimate_periodic_work_badnes + static void bcm43xx_periodic_work_handler(void *d) + { + struct bcm43xx_private *bcm = d; ++ struct net_device *net_dev = bcm->net_dev; + unsigned long flags; + u32 savedirqs = 0; + int badness; ++ unsigned long orig_trans_start = 0; + +- badness = estimate_periodic_work_badness(bcm->periodic_state); + mutex_lock(&bcm->mutex); +- netif_tx_disable(bcm->net_dev); +- spin_lock_irqsave(&bcm->irq_lock, flags); ++ badness = estimate_periodic_work_badness(bcm->periodic_state); + if (badness > BADNESS_LIMIT) { + /* Periodic work will take a long time, so we want it to + * be preemtible. + */ ++ ++ netif_tx_lock_bh(net_dev); ++ /* We must fake a started transmission here, as we are going to ++ * disable TX. If we wouldn't fake a TX, it would be possible to ++ * trigger the netdev watchdog, if the last real TX is already ++ * some time on the past (slightly less than 5secs) ++ */ ++ orig_trans_start = net_dev->trans_start; ++ net_dev->trans_start = jiffies; ++ netif_stop_queue(net_dev); ++ netif_tx_unlock_bh(net_dev); ++ ++ spin_lock_irqsave(&bcm->irq_lock, flags); + bcm43xx_mac_suspend(bcm); + if (bcm43xx_using_pio(bcm)) + bcm43xx_pio_freeze_txqueues(bcm); + savedirqs = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + bcm43xx_synchronize_irq(bcm); ++ } else { ++ /* Periodic work should take short time, so we want low ++ * locking overhead. ++ */ ++ spin_lock_irqsave(&bcm->irq_lock, flags); + } + + do_periodic_work(bcm); +@@ -3188,10 +3206,11 @@ static void bcm43xx_periodic_work_handle + if (bcm43xx_using_pio(bcm)) + bcm43xx_pio_thaw_txqueues(bcm); + bcm43xx_mac_enable(bcm); ++ netif_wake_queue(bcm->net_dev); ++ net_dev->trans_start = orig_trans_start; + } + mmiowb(); + spin_unlock_irqrestore(&bcm->irq_lock, flags); +- netif_wake_queue(bcm->net_dev); + mutex_unlock(&bcm->mutex); + } + diff --git a/debian/patches/series/4 b/debian/patches/series/4 index 4c019ecf3..0e9b829af 100644 --- a/debian/patches/series/4 +++ b/debian/patches/series/4 @@ -23,3 +23,4 @@ + bugfix/powerpc/interrupt-alignement.patch + bugfix/sparc/sunblade1k-boot-fix.patch + bugfix/__div64_32-for-31-bit.patch ++ bugfix/net-bcm43xx_netdev_watchdog.patch