summaryrefslogtreecommitdiffstats
path: root/main/linux-grsec/r8169-fix-random-mdio_write-failures.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/linux-grsec/r8169-fix-random-mdio_write-failures.patch')
-rw-r--r--main/linux-grsec/r8169-fix-random-mdio_write-failures.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/main/linux-grsec/r8169-fix-random-mdio_write-failures.patch b/main/linux-grsec/r8169-fix-random-mdio_write-failures.patch
new file mode 100644
index 000000000..1e2beadd0
--- /dev/null
+++ b/main/linux-grsec/r8169-fix-random-mdio_write-failures.patch
@@ -0,0 +1,48 @@
+From 024a07bacf8287a6ddfa83e9d5b951c5e8b4070e Mon Sep 17 00:00:00 2001
+From: =?utf8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
+Date: Sun, 6 Jun 2010 15:38:47 -0700
+Subject: [PATCH 1/1] r8169: fix random mdio_write failures
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf8
+Content-Transfer-Encoding: 8bit
+
+Some configurations need delay between the "write completed" indication
+and new write to work reliably.
+
+Realtek driver seems to use longer delay when polling the "write complete"
+bit, so it waits long enough between writes with high probability (but
+could probably break too). This patch adds a new udelay to make sure we
+wait unconditionally some time after the write complete indication.
+
+This caused a regression with XID 18000000 boards when the board specific
+phy configuration writing many mdio registers was added in commit
+2e955856ff (r8169: phy init for the 8169scd). Some of the configration
+mdio writes would almost always fail, and depending on failure might leave
+the PHY in non-working state.
+
+Signed-off-by: Timo Teräs <timo.teras@iki.fi>
+Acked-off-by: Francois Romieu <romieu@fr.zoreil.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/r8169.c | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 217e709..03a8318 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -559,6 +559,11 @@ static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
+ break;
+ udelay(25);
+ }
++ /*
++ * Some configurations require a small delay even after the write
++ * completed indication or the next write might fail.
++ */
++ udelay(25);
+ }
+
+ static int mdio_read(void __iomem *ioaddr, int reg_addr)
+--
+1.7.1
+