linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] net/r8169: Remove the firmware of RTL8111D
@ 2010-12-01  5:22 Hayes Wang
  2010-12-01  8:07 ` Francois Romieu
  0 siblings, 1 reply; 8+ messages in thread
From: Hayes Wang @ 2010-12-01  5:22 UTC (permalink / raw)
  To: romieu; +Cc: netdev, linux-kernel, Hayes Wang

Remove the firmware of RTL8111D from the kernel.
The binary file of firmware would be moved to linux-firmware repository.

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
---
 drivers/net/r8169.c |  776 +++++++--------------------------------------------
 1 files changed, 97 insertions(+), 679 deletions(-)

diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 7d33ef4..cad1ba8 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/dma-mapping.h>
 #include <linux/pm_runtime.h>
+#include <linux/firmware.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -1383,6 +1384,28 @@ static void rtl_phy_write(void __iomem *ioaddr, const struct phy_reg *regs, int
 	}
 }
 
+static void rtl_phy_write_fw(void __iomem *ioaddr, const struct firmware *fw)
+{
+	u32 *ptr = (u32 *)fw->data;
+	u32 action;
+	size_t len = fw->size / sizeof(*ptr);
+
+	while (len-- > 0) {
+		action = le32_to_cpu(*ptr);
+		switch(action & 0xFF000000) {
+		case 0x80000000:
+			mdio_write(ioaddr, (action & 0x00FF0000) >> 16,
+				   action & 0x0000FFFF);
+			break;
+		default:
+			printk(KERN_WARNING "%s: Unknown action\n",
+				__FUNCTION__);
+			break;
+		}
+		ptr++;
+	}
+}
+
 static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
 {
 	static const struct phy_reg phy_reg_init[] = {
@@ -1715,9 +1738,10 @@ static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
 	rtl8168c_3_hw_phy_config(ioaddr);
 }
 
-static void rtl8168d_1_hw_phy_config(void __iomem *ioaddr)
+static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
 {
 	static const struct phy_reg phy_reg_init_0[] = {
+		/* Channel Estimation */
 		{ 0x1f, 0x0001 },
 		{ 0x06, 0x4064 },
 		{ 0x07, 0x2863 },
@@ -1734,379 +1758,41 @@ static void rtl8168d_1_hw_phy_config(void __iomem *ioaddr)
 		{ 0x12, 0xf49f },
 		{ 0x13, 0x070b },
 		{ 0x1a, 0x05ad },
-		{ 0x14, 0x94c0 }
-	};
-	static const struct phy_reg phy_reg_init_1[] = {
+		{ 0x14, 0x94c0 },
+
+		/*
+		 * Tx Error Issue
+		 * enhance line driver power
+		 */
 		{ 0x1f, 0x0002 },
 		{ 0x06, 0x5561 },
 		{ 0x1f, 0x0005 },
 		{ 0x05, 0x8332 },
-		{ 0x06, 0x5561 }
-	};
-	static const struct phy_reg phy_reg_init_2[] = {
-		{ 0x1f, 0x0005 },
-		{ 0x05, 0xffc2 },
-		{ 0x1f, 0x0005 },
-		{ 0x05, 0x8000 },
-		{ 0x06, 0xf8f9 },
-		{ 0x06, 0xfaef },
-		{ 0x06, 0x59ee },
-		{ 0x06, 0xf8ea },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0xf8eb },
-		{ 0x06, 0x00e0 },
-		{ 0x06, 0xf87c },
-		{ 0x06, 0xe1f8 },
-		{ 0x06, 0x7d59 },
-		{ 0x06, 0x0fef },
-		{ 0x06, 0x0139 },
-		{ 0x06, 0x029e },
-		{ 0x06, 0x06ef },
-		{ 0x06, 0x1039 },
-		{ 0x06, 0x089f },
-		{ 0x06, 0x2aee },
-		{ 0x06, 0xf8ea },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0xf8eb },
-		{ 0x06, 0x01e0 },
-		{ 0x06, 0xf87c },
-		{ 0x06, 0xe1f8 },
-		{ 0x06, 0x7d58 },
-		{ 0x06, 0x409e },
-		{ 0x06, 0x0f39 },
-		{ 0x06, 0x46aa },
-		{ 0x06, 0x0bbf },
-		{ 0x06, 0x8290 },
-		{ 0x06, 0xd682 },
-		{ 0x06, 0x9802 },
-		{ 0x06, 0x014f },
-		{ 0x06, 0xae09 },
-		{ 0x06, 0xbf82 },
-		{ 0x06, 0x98d6 },
-		{ 0x06, 0x82a0 },
-		{ 0x06, 0x0201 },
-		{ 0x06, 0x4fef },
-		{ 0x06, 0x95fe },
-		{ 0x06, 0xfdfc },
-		{ 0x06, 0x05f8 },
-		{ 0x06, 0xf9fa },
-		{ 0x06, 0xeef8 },
-		{ 0x06, 0xea00 },
-		{ 0x06, 0xeef8 },
-		{ 0x06, 0xeb00 },
-		{ 0x06, 0xe2f8 },
-		{ 0x06, 0x7ce3 },
-		{ 0x06, 0xf87d },
-		{ 0x06, 0xa511 },
-		{ 0x06, 0x1112 },
-		{ 0x06, 0xd240 },
-		{ 0x06, 0xd644 },
-		{ 0x06, 0x4402 },
-		{ 0x06, 0x8217 },
-		{ 0x06, 0xd2a0 },
-		{ 0x06, 0xd6aa },
-		{ 0x06, 0xaa02 },
-		{ 0x06, 0x8217 },
-		{ 0x06, 0xae0f },
-		{ 0x06, 0xa544 },
-		{ 0x06, 0x4402 },
-		{ 0x06, 0xae4d },
-		{ 0x06, 0xa5aa },
-		{ 0x06, 0xaa02 },
-		{ 0x06, 0xae47 },
-		{ 0x06, 0xaf82 },
-		{ 0x06, 0x13ee },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0x834d },
-		{ 0x06, 0x0fee },
-		{ 0x06, 0x834c },
-		{ 0x06, 0x0fee },
-		{ 0x06, 0x834f },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0x8351 },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0x834a },
-		{ 0x06, 0xffee },
-		{ 0x06, 0x834b },
-		{ 0x06, 0xffe0 },
-		{ 0x06, 0x8330 },
-		{ 0x06, 0xe183 },
-		{ 0x06, 0x3158 },
-		{ 0x06, 0xfee4 },
-		{ 0x06, 0xf88a },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x8be0 },
-		{ 0x06, 0x8332 },
-		{ 0x06, 0xe183 },
-		{ 0x06, 0x3359 },
-		{ 0x06, 0x0fe2 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0x0c24 },
-		{ 0x06, 0x5af0 },
-		{ 0x06, 0x1e12 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x8ce5 },
-		{ 0x06, 0xf88d },
-		{ 0x06, 0xaf82 },
-		{ 0x06, 0x13e0 },
-		{ 0x06, 0x834f },
-		{ 0x06, 0x10e4 },
-		{ 0x06, 0x834f },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x009f },
-		{ 0x06, 0x0ae0 },
-		{ 0x06, 0x834f },
-		{ 0x06, 0xa010 },
-		{ 0x06, 0xa5ee },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x01e0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7805 },
-		{ 0x06, 0x9e9a },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x049e },
-		{ 0x06, 0x10e0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7803 },
-		{ 0x06, 0x9e0f },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x019e },
-		{ 0x06, 0x05ae },
-		{ 0x06, 0x0caf },
-		{ 0x06, 0x81f8 },
-		{ 0x06, 0xaf81 },
-		{ 0x06, 0xa3af },
-		{ 0x06, 0x81dc },
-		{ 0x06, 0xaf82 },
-		{ 0x06, 0x13ee },
-		{ 0x06, 0x8348 },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0x8349 },
-		{ 0x06, 0x00e0 },
-		{ 0x06, 0x8351 },
-		{ 0x06, 0x10e4 },
-		{ 0x06, 0x8351 },
-		{ 0x06, 0x5801 },
-		{ 0x06, 0x9fea },
-		{ 0x06, 0xd000 },
-		{ 0x06, 0xd180 },
-		{ 0x06, 0x1f66 },
-		{ 0x06, 0xe2f8 },
-		{ 0x06, 0xeae3 },
-		{ 0x06, 0xf8eb },
-		{ 0x06, 0x5af8 },
-		{ 0x06, 0x1e20 },
-		{ 0x06, 0xe6f8 },
-		{ 0x06, 0xeae5 },
-		{ 0x06, 0xf8eb },
-		{ 0x06, 0xd302 },
-		{ 0x06, 0xb3fe },
-		{ 0x06, 0xe2f8 },
-		{ 0x06, 0x7cef },
-		{ 0x06, 0x325b },
-		{ 0x06, 0x80e3 },
-		{ 0x06, 0xf87d },
-		{ 0x06, 0x9e03 },
-		{ 0x06, 0x7dff },
-		{ 0x06, 0xff0d },
-		{ 0x06, 0x581c },
-		{ 0x06, 0x551a },
-		{ 0x06, 0x6511 },
-		{ 0x06, 0xa190 },
-		{ 0x06, 0xd3e2 },
-		{ 0x06, 0x8348 },
-		{ 0x06, 0xe383 },
-		{ 0x06, 0x491b },
-		{ 0x06, 0x56ab },
-		{ 0x06, 0x08ef },
-		{ 0x06, 0x56e6 },
-		{ 0x06, 0x8348 },
-		{ 0x06, 0xe783 },
-		{ 0x06, 0x4910 },
-		{ 0x06, 0xd180 },
-		{ 0x06, 0x1f66 },
-		{ 0x06, 0xa004 },
-		{ 0x06, 0xb9e2 },
-		{ 0x06, 0x8348 },
-		{ 0x06, 0xe383 },
-		{ 0x06, 0x49ef },
-		{ 0x06, 0x65e2 },
-		{ 0x06, 0x834a },
-		{ 0x06, 0xe383 },
-		{ 0x06, 0x4b1b },
-		{ 0x06, 0x56aa },
-		{ 0x06, 0x0eef },
-		{ 0x06, 0x56e6 },
-		{ 0x06, 0x834a },
-		{ 0x06, 0xe783 },
-		{ 0x06, 0x4be2 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0xe683 },
-		{ 0x06, 0x4ce0 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0xa000 },
-		{ 0x06, 0x0caf },
-		{ 0x06, 0x81dc },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4d10 },
-		{ 0x06, 0xe483 },
-		{ 0x06, 0x4dae },
-		{ 0x06, 0x0480 },
-		{ 0x06, 0xe483 },
-		{ 0x06, 0x4de0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7803 },
-		{ 0x06, 0x9e0b },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x049e },
-		{ 0x06, 0x04ee },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x02e0 },
-		{ 0x06, 0x8332 },
-		{ 0x06, 0xe183 },
-		{ 0x06, 0x3359 },
-		{ 0x06, 0x0fe2 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0x0c24 },
-		{ 0x06, 0x5af0 },
-		{ 0x06, 0x1e12 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x8ce5 },
-		{ 0x06, 0xf88d },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x30e1 },
-		{ 0x06, 0x8331 },
-		{ 0x06, 0x6801 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x8ae5 },
-		{ 0x06, 0xf88b },
-		{ 0x06, 0xae37 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4e03 },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4ce1 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0x1b01 },
-		{ 0x06, 0x9e04 },
-		{ 0x06, 0xaaa1 },
-		{ 0x06, 0xaea8 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4e04 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4f00 },
-		{ 0x06, 0xaeab },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4f78 },
-		{ 0x06, 0x039f },
-		{ 0x06, 0x14ee },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x05d2 },
-		{ 0x06, 0x40d6 },
-		{ 0x06, 0x5554 },
-		{ 0x06, 0x0282 },
-		{ 0x06, 0x17d2 },
-		{ 0x06, 0xa0d6 },
-		{ 0x06, 0xba00 },
-		{ 0x06, 0x0282 },
-		{ 0x06, 0x17fe },
-		{ 0x06, 0xfdfc },
-		{ 0x06, 0x05f8 },
-		{ 0x06, 0xe0f8 },
-		{ 0x06, 0x60e1 },
-		{ 0x06, 0xf861 },
-		{ 0x06, 0x6802 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x60e5 },
-		{ 0x06, 0xf861 },
-		{ 0x06, 0xe0f8 },
-		{ 0x06, 0x48e1 },
-		{ 0x06, 0xf849 },
-		{ 0x06, 0x580f },
-		{ 0x06, 0x1e02 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x48e5 },
-		{ 0x06, 0xf849 },
-		{ 0x06, 0xd000 },
-		{ 0x06, 0x0282 },
-		{ 0x06, 0x5bbf },
-		{ 0x06, 0x8350 },
-		{ 0x06, 0xef46 },
-		{ 0x06, 0xdc19 },
-		{ 0x06, 0xddd0 },
-		{ 0x06, 0x0102 },
-		{ 0x06, 0x825b },
-		{ 0x06, 0x0282 },
-		{ 0x06, 0x77e0 },
-		{ 0x06, 0xf860 },
-		{ 0x06, 0xe1f8 },
-		{ 0x06, 0x6158 },
-		{ 0x06, 0xfde4 },
-		{ 0x06, 0xf860 },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x61fc },
-		{ 0x06, 0x04f9 },
-		{ 0x06, 0xfafb },
-		{ 0x06, 0xc6bf },
-		{ 0x06, 0xf840 },
-		{ 0x06, 0xbe83 },
-		{ 0x06, 0x50a0 },
-		{ 0x06, 0x0101 },
-		{ 0x06, 0x071b },
-		{ 0x06, 0x89cf },
-		{ 0x06, 0xd208 },
-		{ 0x06, 0xebdb },
-		{ 0x06, 0x19b2 },
-		{ 0x06, 0xfbff },
-		{ 0x06, 0xfefd },
-		{ 0x06, 0x04f8 },
-		{ 0x06, 0xe0f8 },
-		{ 0x06, 0x48e1 },
-		{ 0x06, 0xf849 },
-		{ 0x06, 0x6808 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x48e5 },
-		{ 0x06, 0xf849 },
-		{ 0x06, 0x58f7 },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x48e5 },
-		{ 0x06, 0xf849 },
-		{ 0x06, 0xfc04 },
-		{ 0x06, 0x4d20 },
-		{ 0x06, 0x0002 },
-		{ 0x06, 0x4e22 },
-		{ 0x06, 0x0002 },
-		{ 0x06, 0x4ddf },
-		{ 0x06, 0xff01 },
-		{ 0x06, 0x4edd },
-		{ 0x06, 0xff01 },
-		{ 0x05, 0x83d4 },
-		{ 0x06, 0x8000 },
-		{ 0x05, 0x83d8 },
-		{ 0x06, 0x8051 },
-		{ 0x02, 0x6010 },
-		{ 0x03, 0xdc00 },
-		{ 0x05, 0xfff6 },
-		{ 0x06, 0x00fc },
-		{ 0x1f, 0x0000 },
+		{ 0x06, 0x5561 },
+
+		/*
+		 * Can not link to 1Gbps with bad cable
+		 * Decrease SNR threshold form 21.07dB to 19.04dB
+		 */
+		{ 0x1f, 0x0001 },
+		{ 0x17, 0x0cc0 },
 
 		{ 0x1f, 0x0000 },
-		{ 0x0d, 0xf880 },
-		{ 0x1f, 0x0000 }
+		{ 0x0d, 0xf880 }
 	};
+	void __iomem *ioaddr = tp->mmio_addr;
+	const struct firmware *fw;
 
 	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
 
+	/*
+	 * Rx Error Issue
+	 * Fine Tune Switching regulator parameter
+	 */
 	mdio_write(ioaddr, 0x1f, 0x0002);
 	mdio_plus_minus(ioaddr, 0x0b, 0x0010, 0x00ef);
 	mdio_plus_minus(ioaddr, 0x0c, 0xa200, 0x5d00);
 
-	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
-
 	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
 		static const struct phy_reg phy_reg_init[] = {
 			{ 0x1f, 0x0002 },
@@ -2147,20 +1833,36 @@ static void rtl8168d_1_hw_phy_config(void __iomem *ioaddr)
 		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
 	}
 
+	/* RSET couple improve */
 	mdio_write(ioaddr, 0x1f, 0x0002);
 	mdio_patch(ioaddr, 0x0d, 0x0300);
 	mdio_patch(ioaddr, 0x0f, 0x0010);
 
+	/* Fine tune PLL performance */
 	mdio_write(ioaddr, 0x1f, 0x0002);
 	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
 	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
 
-	rtl_phy_write(ioaddr, phy_reg_init_2, ARRAY_SIZE(phy_reg_init_2));
+	mdio_write(ioaddr, 0x1F, 0x0005);
+	mdio_write(ioaddr, 0x05, 0x001B);
+	if (mdio_read(ioaddr, 0x06) == 0xBF00 &&
+	    request_firmware(&fw, "rtl_nic/rtl8168d-1.fw", &tp->pci_dev->dev) == 0) {
+		rtl_phy_write_fw(ioaddr, fw);
+		release_firmware(fw);
+	} else {
+		printk(KERN_WARNING "%s: unable to apply firmware patch\n",
+			tp->dev->name);
+	}
+
+	mdio_write(ioaddr, 0x1f, 0x0000);
 }
 
-static void rtl8168d_2_hw_phy_config(void __iomem *ioaddr)
+MODULE_FIRMWARE("rtl_nic/rtl8168d-1.fw");
+
+static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
 {
 	static const struct phy_reg phy_reg_init_0[] = {
+		/* Channel Estimation */
 		{ 0x1f, 0x0001 },
 		{ 0x06, 0x4064 },
 		{ 0x07, 0x2863 },
@@ -2179,324 +1881,28 @@ static void rtl8168d_2_hw_phy_config(void __iomem *ioaddr)
 		{ 0x1a, 0x05ad },
 		{ 0x14, 0x94c0 },
 
+		/*
+		 * Tx Error Issue
+		 * enhance line driver power
+		 */
 		{ 0x1f, 0x0002 },
 		{ 0x06, 0x5561 },
 		{ 0x1f, 0x0005 },
 		{ 0x05, 0x8332 },
-		{ 0x06, 0x5561 }
-	};
-	static const struct phy_reg phy_reg_init_1[] = {
-		{ 0x1f, 0x0005 },
-		{ 0x05, 0xffc2 },
-		{ 0x1f, 0x0005 },
-		{ 0x05, 0x8000 },
-		{ 0x06, 0xf8f9 },
-		{ 0x06, 0xfaee },
-		{ 0x06, 0xf8ea },
-		{ 0x06, 0x00ee },
-		{ 0x06, 0xf8eb },
-		{ 0x06, 0x00e2 },
-		{ 0x06, 0xf87c },
-		{ 0x06, 0xe3f8 },
-		{ 0x06, 0x7da5 },
-		{ 0x06, 0x1111 },
-		{ 0x06, 0x12d2 },
-		{ 0x06, 0x40d6 },
-		{ 0x06, 0x4444 },
-		{ 0x06, 0x0281 },
-		{ 0x06, 0xc6d2 },
-		{ 0x06, 0xa0d6 },
-		{ 0x06, 0xaaaa },
-		{ 0x06, 0x0281 },
-		{ 0x06, 0xc6ae },
-		{ 0x06, 0x0fa5 },
-		{ 0x06, 0x4444 },
-		{ 0x06, 0x02ae },
-		{ 0x06, 0x4da5 },
-		{ 0x06, 0xaaaa },
-		{ 0x06, 0x02ae },
-		{ 0x06, 0x47af },
-		{ 0x06, 0x81c2 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4e00 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4d0f },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4c0f },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4f00 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x5100 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4aff },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4bff },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x30e1 },
-		{ 0x06, 0x8331 },
-		{ 0x06, 0x58fe },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x8ae5 },
-		{ 0x06, 0xf88b },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x32e1 },
-		{ 0x06, 0x8333 },
-		{ 0x06, 0x590f },
-		{ 0x06, 0xe283 },
-		{ 0x06, 0x4d0c },
-		{ 0x06, 0x245a },
-		{ 0x06, 0xf01e },
-		{ 0x06, 0x12e4 },
-		{ 0x06, 0xf88c },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x8daf },
-		{ 0x06, 0x81c2 },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4f10 },
-		{ 0x06, 0xe483 },
-		{ 0x06, 0x4fe0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7800 },
-		{ 0x06, 0x9f0a },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4fa0 },
-		{ 0x06, 0x10a5 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4e01 },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x059e },
-		{ 0x06, 0x9ae0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7804 },
-		{ 0x06, 0x9e10 },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x039e },
-		{ 0x06, 0x0fe0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7801 },
-		{ 0x06, 0x9e05 },
-		{ 0x06, 0xae0c },
-		{ 0x06, 0xaf81 },
-		{ 0x06, 0xa7af },
-		{ 0x06, 0x8152 },
-		{ 0x06, 0xaf81 },
-		{ 0x06, 0x8baf },
-		{ 0x06, 0x81c2 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4800 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4900 },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x5110 },
-		{ 0x06, 0xe483 },
-		{ 0x06, 0x5158 },
-		{ 0x06, 0x019f },
-		{ 0x06, 0xead0 },
-		{ 0x06, 0x00d1 },
-		{ 0x06, 0x801f },
-		{ 0x06, 0x66e2 },
-		{ 0x06, 0xf8ea },
-		{ 0x06, 0xe3f8 },
-		{ 0x06, 0xeb5a },
-		{ 0x06, 0xf81e },
-		{ 0x06, 0x20e6 },
-		{ 0x06, 0xf8ea },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0xebd3 },
-		{ 0x06, 0x02b3 },
-		{ 0x06, 0xfee2 },
-		{ 0x06, 0xf87c },
-		{ 0x06, 0xef32 },
-		{ 0x06, 0x5b80 },
-		{ 0x06, 0xe3f8 },
-		{ 0x06, 0x7d9e },
-		{ 0x06, 0x037d },
-		{ 0x06, 0xffff },
-		{ 0x06, 0x0d58 },
-		{ 0x06, 0x1c55 },
-		{ 0x06, 0x1a65 },
-		{ 0x06, 0x11a1 },
-		{ 0x06, 0x90d3 },
-		{ 0x06, 0xe283 },
-		{ 0x06, 0x48e3 },
-		{ 0x06, 0x8349 },
-		{ 0x06, 0x1b56 },
-		{ 0x06, 0xab08 },
-		{ 0x06, 0xef56 },
-		{ 0x06, 0xe683 },
-		{ 0x06, 0x48e7 },
-		{ 0x06, 0x8349 },
-		{ 0x06, 0x10d1 },
-		{ 0x06, 0x801f },
-		{ 0x06, 0x66a0 },
-		{ 0x06, 0x04b9 },
-		{ 0x06, 0xe283 },
-		{ 0x06, 0x48e3 },
-		{ 0x06, 0x8349 },
-		{ 0x06, 0xef65 },
-		{ 0x06, 0xe283 },
-		{ 0x06, 0x4ae3 },
-		{ 0x06, 0x834b },
-		{ 0x06, 0x1b56 },
-		{ 0x06, 0xaa0e },
-		{ 0x06, 0xef56 },
-		{ 0x06, 0xe683 },
-		{ 0x06, 0x4ae7 },
-		{ 0x06, 0x834b },
-		{ 0x06, 0xe283 },
-		{ 0x06, 0x4de6 },
-		{ 0x06, 0x834c },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4da0 },
-		{ 0x06, 0x000c },
-		{ 0x06, 0xaf81 },
-		{ 0x06, 0x8be0 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0x10e4 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0xae04 },
-		{ 0x06, 0x80e4 },
-		{ 0x06, 0x834d },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x4e78 },
-		{ 0x06, 0x039e },
-		{ 0x06, 0x0be0 },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x7804 },
-		{ 0x06, 0x9e04 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4e02 },
-		{ 0x06, 0xe083 },
-		{ 0x06, 0x32e1 },
-		{ 0x06, 0x8333 },
-		{ 0x06, 0x590f },
-		{ 0x06, 0xe283 },
-		{ 0x06, 0x4d0c },
-		{ 0x06, 0x245a },
-		{ 0x06, 0xf01e },
-		{ 0x06, 0x12e4 },
-		{ 0x06, 0xf88c },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x8de0 },
-		{ 0x06, 0x8330 },
-		{ 0x06, 0xe183 },
-		{ 0x06, 0x3168 },
-		{ 0x06, 0x01e4 },
-		{ 0x06, 0xf88a },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x8bae },
-		{ 0x06, 0x37ee },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x03e0 },
-		{ 0x06, 0x834c },
-		{ 0x06, 0xe183 },
-		{ 0x06, 0x4d1b },
-		{ 0x06, 0x019e },
-		{ 0x06, 0x04aa },
-		{ 0x06, 0xa1ae },
-		{ 0x06, 0xa8ee },
-		{ 0x06, 0x834e },
-		{ 0x06, 0x04ee },
-		{ 0x06, 0x834f },
-		{ 0x06, 0x00ae },
-		{ 0x06, 0xabe0 },
-		{ 0x06, 0x834f },
-		{ 0x06, 0x7803 },
-		{ 0x06, 0x9f14 },
-		{ 0x06, 0xee83 },
-		{ 0x06, 0x4e05 },
-		{ 0x06, 0xd240 },
-		{ 0x06, 0xd655 },
-		{ 0x06, 0x5402 },
-		{ 0x06, 0x81c6 },
-		{ 0x06, 0xd2a0 },
-		{ 0x06, 0xd6ba },
-		{ 0x06, 0x0002 },
-		{ 0x06, 0x81c6 },
-		{ 0x06, 0xfefd },
-		{ 0x06, 0xfc05 },
-		{ 0x06, 0xf8e0 },
-		{ 0x06, 0xf860 },
-		{ 0x06, 0xe1f8 },
-		{ 0x06, 0x6168 },
-		{ 0x06, 0x02e4 },
-		{ 0x06, 0xf860 },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x61e0 },
-		{ 0x06, 0xf848 },
-		{ 0x06, 0xe1f8 },
-		{ 0x06, 0x4958 },
-		{ 0x06, 0x0f1e },
-		{ 0x06, 0x02e4 },
-		{ 0x06, 0xf848 },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x49d0 },
-		{ 0x06, 0x0002 },
-		{ 0x06, 0x820a },
-		{ 0x06, 0xbf83 },
-		{ 0x06, 0x50ef },
-		{ 0x06, 0x46dc },
-		{ 0x06, 0x19dd },
-		{ 0x06, 0xd001 },
-		{ 0x06, 0x0282 },
-		{ 0x06, 0x0a02 },
-		{ 0x06, 0x8226 },
-		{ 0x06, 0xe0f8 },
-		{ 0x06, 0x60e1 },
-		{ 0x06, 0xf861 },
-		{ 0x06, 0x58fd },
-		{ 0x06, 0xe4f8 },
-		{ 0x06, 0x60e5 },
-		{ 0x06, 0xf861 },
-		{ 0x06, 0xfc04 },
-		{ 0x06, 0xf9fa },
-		{ 0x06, 0xfbc6 },
-		{ 0x06, 0xbff8 },
-		{ 0x06, 0x40be },
-		{ 0x06, 0x8350 },
-		{ 0x06, 0xa001 },
-		{ 0x06, 0x0107 },
-		{ 0x06, 0x1b89 },
-		{ 0x06, 0xcfd2 },
-		{ 0x06, 0x08eb },
-		{ 0x06, 0xdb19 },
-		{ 0x06, 0xb2fb },
-		{ 0x06, 0xfffe },
-		{ 0x06, 0xfd04 },
-		{ 0x06, 0xf8e0 },
-		{ 0x06, 0xf848 },
-		{ 0x06, 0xe1f8 },
-		{ 0x06, 0x4968 },
-		{ 0x06, 0x08e4 },
-		{ 0x06, 0xf848 },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x4958 },
-		{ 0x06, 0xf7e4 },
-		{ 0x06, 0xf848 },
-		{ 0x06, 0xe5f8 },
-		{ 0x06, 0x49fc },
-		{ 0x06, 0x044d },
-		{ 0x06, 0x2000 },
-		{ 0x06, 0x024e },
-		{ 0x06, 0x2200 },
-		{ 0x06, 0x024d },
-		{ 0x06, 0xdfff },
-		{ 0x06, 0x014e },
-		{ 0x06, 0xddff },
-		{ 0x06, 0x0100 },
-		{ 0x05, 0x83d8 },
-		{ 0x06, 0x8000 },
-		{ 0x03, 0xdc00 },
-		{ 0x05, 0xfff6 },
-		{ 0x06, 0x00fc },
-		{ 0x1f, 0x0000 },
+		{ 0x06, 0x5561 },
+
+		/*
+		 * Can not link to 1Gbps with bad cable
+		 * Decrease SNR threshold form 21.07dB to 19.04dB
+		 */
+		{ 0x1f, 0x0001 },
+		{ 0x17, 0x0cc0 },
 
 		{ 0x1f, 0x0000 },
-		{ 0x0d, 0xf880 },
-		{ 0x1f, 0x0000 }
+		{ 0x0d, 0xf880 }
 	};
+	void __iomem *ioaddr = tp->mmio_addr;
+	const struct firmware *fw;
 
 	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
 
@@ -2540,19 +1946,31 @@ static void rtl8168d_2_hw_phy_config(void __iomem *ioaddr)
 		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
 	}
 
+	/* Fine tune PLL performance */
 	mdio_write(ioaddr, 0x1f, 0x0002);
 	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
 	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
 
-	mdio_write(ioaddr, 0x1f, 0x0001);
-	mdio_write(ioaddr, 0x17, 0x0cc0);
-
+	/* Switching regulator Slew rate */
 	mdio_write(ioaddr, 0x1f, 0x0002);
 	mdio_patch(ioaddr, 0x0f, 0x0017);
 
-	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
+	mdio_write(ioaddr, 0x1F, 0x0005);
+	mdio_write(ioaddr, 0x05, 0x001B);
+	if (mdio_read(ioaddr, 0x06) == 0xB300 &&
+	    request_firmware(&fw, "rtl_nic/rtl8168d-2.fw", &tp->pci_dev->dev) == 0) {
+		rtl_phy_write_fw(ioaddr, fw);
+		release_firmware(fw);
+	} else {
+		printk(KERN_WARNING "%s: unable to apply firmware patch\n",
+			tp->dev->name);
+	}
+
+	mdio_write(ioaddr, 0x1f, 0x0000);
 }
 
+MODULE_FIRMWARE("rtl_nic/rtl8168d-2.fw");
+
 static void rtl8168d_3_hw_phy_config(void __iomem *ioaddr)
 {
 	static const struct phy_reg phy_reg_init[] = {
@@ -2688,10 +2106,10 @@ static void rtl_hw_phy_config(struct net_device *dev)
 		rtl8168cp_2_hw_phy_config(ioaddr);
 		break;
 	case RTL_GIGA_MAC_VER_25:
-		rtl8168d_1_hw_phy_config(ioaddr);
+		rtl8168d_1_hw_phy_config(tp);
 		break;
 	case RTL_GIGA_MAC_VER_26:
-		rtl8168d_2_hw_phy_config(ioaddr);
+		rtl8168d_2_hw_phy_config(tp);
 		break;
 	case RTL_GIGA_MAC_VER_27:
 		rtl8168d_3_hw_phy_config(ioaddr);
-- 
1.7.3.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-01  5:22 [PATCH] net/r8169: Remove the firmware of RTL8111D Hayes Wang
@ 2010-12-01  8:07 ` Francois Romieu
  2010-12-01  9:54   ` hayeswang
                     ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Francois Romieu @ 2010-12-01  8:07 UTC (permalink / raw)
  To: Hayes Wang; +Cc: netdev, linux-kernel, Ben Hutchings

Hayes Wang <hayeswang@realtek.com> :
> Remove the firmware of RTL8111D from the kernel.
> The binary file of firmware would be moved to linux-firmware repository.

The driver can not simply go along when request_firmware fails. Though Ben's
code did not take care of it, the driver should imho propagate some return
code. Ben ?

There is no change in rtl8168d_3_hw_phy_config : could you add a comment
so that people know it is different ?

Could you Cc: the linux-firmware patch as well ?

Minor nit: please keep the code free of capitalized hex data.

> diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
> index 7d33ef4..cad1ba8 100644
> --- a/drivers/net/r8169.c
> +++ b/drivers/net/r8169.c
[...]
> @@ -1383,6 +1384,28 @@ static void rtl_phy_write(void __iomem *ioaddr, const struct phy_reg *regs, int
>  	}
>  }
>  
> +static void rtl_phy_write_fw(void __iomem *ioaddr, const struct firmware *fw)
> +{
[...]
> +		default:
> +			printk(KERN_WARNING "%s: Unknown action\n",
> +				__FUNCTION__);

A bit old school. It gives no information about the device.
Use netif_{err/info} or such ?

Thanks.

-- 
Ueimor

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-01  8:07 ` Francois Romieu
@ 2010-12-01  9:54   ` hayeswang
  2010-12-01 16:36   ` Stefan Lippers-Hollmann
  2010-12-06  4:38   ` Ben Hutchings
  2 siblings, 0 replies; 8+ messages in thread
From: hayeswang @ 2010-12-01  9:54 UTC (permalink / raw)
  To: 'Francois Romieu'; +Cc: netdev, linux-kernel, 'Ben Hutchings'

[-- Attachment #1: Type: text/plain, Size: 1930 bytes --]

Hi Romieu,

the rtl8168d_3_hw_phy_config is RTL8111DP which is different from RTL8111D(L).
I want to deal with RTL8111D first.

The attatched file is the linux-firmware patch.

I would think the situation for the failure of request_firmware. However, maybe
it is fine to go along.

Thanks for your suggestion and reply.
 
Best Regards,
Hayes


> -----Original Message-----
> From: Francois Romieu [mailto:romieu@fr.zoreil.com] 
> Sent: Wednesday, December 01, 2010 4:08 PM
> To: Hayeswang
> Cc: netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Ben 
> Hutchings
> Subject: Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
> 
> Hayes Wang <hayeswang@realtek.com> :
> > Remove the firmware of RTL8111D from the kernel.
> > The binary file of firmware would be moved to 
> linux-firmware repository.
> 
> The driver can not simply go along when request_firmware 
> fails. Though Ben's
> code did not take care of it, the driver should imho 
> propagate some return
> code. Ben ?
> 
> There is no change in rtl8168d_3_hw_phy_config : could you 
> add a comment
> so that people know it is different ?
> 
> Could you Cc: the linux-firmware patch as well ?
> 
> Minor nit: please keep the code free of capitalized hex data.
> 
> > diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
> > index 7d33ef4..cad1ba8 100644
> > --- a/drivers/net/r8169.c
> > +++ b/drivers/net/r8169.c
> [...]
> > @@ -1383,6 +1384,28 @@ static void rtl_phy_write(void 
> __iomem *ioaddr, const struct phy_reg *regs, int
> >  	}
> >  }
> >  
> > +static void rtl_phy_write_fw(void __iomem *ioaddr, const 
> struct firmware *fw)
> > +{
> [...]
> > +		default:
> > +			printk(KERN_WARNING "%s: Unknown action\n",
> > +				__FUNCTION__);
> 
> A bit old school. It gives no information about the device.
> Use netif_{err/info} or such ?
> 
> Thanks.
> 
> -- 
> Ueimor
> 
> 
> ------Please consider the environment before printing this e-mail. 
> 
> 
> 

[-- Attachment #2: 0001-rtl_nic-Add-firmware-for-RTL8111D-L.patch --]
[-- Type: application/octet-stream, Size: 3982 bytes --]

>From 706b34566b9318ae50b9b931178ee6b66b05080a Mon Sep 17 00:00:00 2001
From: Hayes Wang <hayeswang@realtek.com>
Date: Wed, 1 Dec 2010 10:21:47 +0800
Subject: [PATCH] rtl_nic: Add firmware for RTL8111D(L)

Add firmware for r8169 of kernel for RTL8111D
	rtl_nic/rtl8168d-1.fw
	rtl_nic/rtl8168d-2.fw

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
---
 WHENCE                |   14 ++++++++++++++
 rtl_nic/rtl8168d-1.fw |  Bin 0 -> 1492 bytes
 rtl_nic/rtl8168d-2.fw |  Bin 0 -> 1324 bytes
 3 files changed, 14 insertions(+), 0 deletions(-)
 create mode 100644 rtl_nic/rtl8168d-1.fw
 create mode 100644 rtl_nic/rtl8168d-2.fw

diff --git a/WHENCE b/WHENCE
index 907fe68..e2aca61 100644
--- a/WHENCE
+++ b/WHENCE
@@ -1451,3 +1451,17 @@ Licence: Redistributable. See LICENCE.rtlwifi_firmware for details.
 
 --------------------------------------------------------------------------
 
+Driver: r8169 - RealTek 8169/8168/8101 ethernet driver.
+
+File: rtl_nic/rtl8168d-1.fw
+File: rtl_nic/rtl8168d-2.fw
+
+Licence:
+ * Copyright (c) 2010, Realtek Semiconductor Corporation 
+ *
+ * Permission is hereby granted for the distribution of this firmware
+ * data in hexadecimal or equivalent format, provided this copyright
+ * notice is accompanying it.
+
+--------------------------------------------------------------------------
+
diff --git a/rtl_nic/rtl8168d-1.fw b/rtl_nic/rtl8168d-1.fw
new file mode 100644
index 0000000000000000000000000000000000000000..99e002de1fb965d53822bc9ea0f5a8ca12d27f62
GIT binary patch
literal 1492
zcmb7^&2LO$6vppN=N_%1<0Fx(AYx^uEX1yhrar4ANXv!=@gJx}lSjwKS7IZ?qOFKT
zM$#s%SeTtHN*bc#8Z8OQj1|)lQ@=C!PBeBFH_v<C^YK3KbIyIkV55F6gi>G%6l$ho
zD$klqeWq`$OYDCKBk%%P`DE%FAg0B%D`gr=vo_XQ({Lm4TmQ);rk>YJ-cSdz<mS6f
zg=W)@LDS%bDSg}2Lu}J1cEL1(J%TUg^?OX!o2L2SoFAHIXTTDCza{t`ESf%FFb%+Q
z<$cqtm8OnyQ>WMNG_9r92zK7>d~COHRwuFU?`EC%HNM@>VT`-1HXY2x8gx6t`#^#{
z$^PL4_c<<@_Ja|)4a}icZ@X!#YP#auP2;<2+Mf9Oc9@FP^x9jNnSLCH_XgsoOw-p)
z*U51n5j_07DKvJ>MW+6P=uJ<erSV>Ng!AF=d?R#p4Es%YhW^G6W$;nMeGT|p7W>E<
z4NYV4s9ZE%<lM1)rb*UyE%uP-^RO56dGNbCC&yGTeIKSLFHL%7I<qn92|e=psc^SV
zezz~&E!j)Irmv6VxH7#vv7H_&?qLJm7MPdiXt|!+>yFab)6C0VG$YTs<UX6)_L?3Z
zV@8<0FJNu|t0~KVoks?3ickLLl<^g*<vpv_*iY}h#)`N`ZJ!!N_PsYbI7bKKbwDlG
z$aV2PWV=E7H3|xSeI2o`Yuvn8WBesP_eIS0|IC4(^=X@_o!rz}G~=A<E2gVxyOVj%
zmFOumQHx8srrJyy&cB;CJxF3Q9z$%<gKoY@-G0`?4RBi%a~o$4COS+<(0mY{<7=@;
z$axyuRqXn|SaDt_O{d_IuJcOlnr{#Dg0F=hroI2pJK6JD@%n`mrbFDTt88kWG`;*l
zY>Ii{pLKt9&UBI*{`T~qV&-@UYW6fduxHS8jyJ3D+|)r_?iv63A#|cf+Y-}@%ce&D
z{r9{Rk6M|lIn(bd^~hVyv9ZoS;r9#9i}_~enPGaH4osWT(eWd8iW&WY?KsQ%W$G8s
z6T`aoEu7z>?<Mw{OwasI{szI--@9Afxk_G0?FDpA!7Bj${%>=k4h!u;e+%D$0d{s%
VTES$40^aVxniVE*_&j`k?+=A!Np1iD

literal 0
HcmV?d00001

diff --git a/rtl_nic/rtl8168d-2.fw b/rtl_nic/rtl8168d-2.fw
new file mode 100644
index 0000000000000000000000000000000000000000..7022ab0af4753c529a1646bc921d9d1889767fde
GIT binary patch
literal 1324
zcmb7^OGs2<6vyv8?#a}eDFQJ=C8D+3qOA)l&Bs_&Ot#U5;ihF^kZ^R`qy_DQ7UQ@W
ziU~%jRV@lyxXlNMk<wL11BJ0w`JR5?eAl#PtMi@r|NPIn*L7<2SHV?vL>+Z?Yg078
zExKkTwsqtZ@)2@#Su{N$dg_$u^l8!AM$x7w(ZL}41bRv|ld*ahJsq+BEdF%6^_lnh
zRngCbqKP~`JFJZ0H+rPax5s>W-O9o>U$!DW(ZxE^`h@6y99%ikm0{5lFcy6cqL=VR
z?w~J;mQ%ayf@t+m(Hyv+npsxB@yy3Ty{PF&9S_+-uG24CI%?~su%)BC!51)iiSI`y
zUE*Kb_%QL&<Pl#8U&Q(X_*{JDS-2Ue?<>(8%wK$u9O0tb_HbHkov4`|OmXCBKy-3V
zbjlH}QFe0A?#S$<Yn|DcX|>k3G20BbcW}M5Z+F+QA*y%n4wLL~0DOf4wNHrNIw#tD
zR&<QL&OE0loGpW;1s-l!iI%)UlAl-={o&iE;KSfZf#ZGn-<)0(Yih8wR=>u{%#j+t
z-NdZ2n>Jz$rzzg$j^)LJmv-zq`WP98yBz(@`!D|?I4(QnKWzBViw4=v|J;Gc9n_h+
zi=ut?^nvSP_%t_?1xNm}?cvd{h?Tf1uqKJiFne~4nAbKYj~=5|mN`6lGw%@lKVxnQ
zY%bUur{R1SoHs=$2ALcEgVD(``W`!TcgY7sx52Rpt{!j&eH~mLdb96~b1&5q>o3~y
zPhvCmN{8tCNpz!AbpDFyLM1mmDLO>0V5#Uu{F@%%Q@3aj_4eZE+}w(<hrzME1+E?J
z)cM#b+R03Tl<2X5=o9W^`V0Sw64A<UqC0Q-Cb_Hdp2dHFu@5{sVh->b%(>r(`Yw7q
z+&Q)I2sY<DI<oK`oj!#H`XhJvH$CLO43;@!zB12aFdrXfCTz3!MIQ`-kKBzIc`rnF
s;j_ZExGJa-aHx-eF5&XeBL^8HCt4d+XFjA3|3pX1)b;<3yC$CZAI_u&^8f$<

literal 0
HcmV?d00001

-- 
1.7.3.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-01  8:07 ` Francois Romieu
  2010-12-01  9:54   ` hayeswang
@ 2010-12-01 16:36   ` Stefan Lippers-Hollmann
  2010-12-01 17:05     ` Ben Hutchings
  2010-12-01 22:40     ` Francois Romieu
  2010-12-06  4:38   ` Ben Hutchings
  2 siblings, 2 replies; 8+ messages in thread
From: Stefan Lippers-Hollmann @ 2010-12-01 16:36 UTC (permalink / raw)
  To: Francois Romieu; +Cc: Hayes Wang, netdev, linux-kernel, Ben Hutchings

Hi

On Wednesday 01 December 2010, Francois Romieu wrote:
> Hayes Wang <hayeswang@realtek.com> :
> > Remove the firmware of RTL8111D from the kernel.
> > The binary file of firmware would be moved to linux-firmware repository.
> 
> The driver can not simply go along when request_firmware fails. Though Ben's
> code did not take care of it, the driver should imho propagate some return
> code. Ben ?
[...]

At least for RTL8111D-1 (rtl8168d_1_hw_phy_config(), phy_reg_init_2[])
a missing firmware update doesn't seem to be fatal
	http://bugs.debian.org/561309#45

I'm running that card (onboard of the Intel D945GSEJT mainboard), with
rtl8168d_1_hw_phy_config()/ phy_reg_init_2[] stripped out, without any 
noticable issues for about a year as always-on home server and good 
GBit/s performance.

[    3.861378] r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded
[    3.861462] r8169 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[    3.861575] r8169 0000:01:00.0: setting latency timer to 64
[    3.861703] r8169 0000:01:00.0: irq 45 for MSI/MSI-X
[    3.865188] r8169 0000:01:00.0: eth0: RTL8168d/8111d at 0xf8406000, 00:1c:c0:ee:22:88, XID 081000c0 IRQ 45

using Debian's firmware removal patch and without the required firmware
image being present
[    3.870663] eth0: unable to apply firmware patch

[   16.364231] r8169 0000:01:00.0: eth0: link up
[   26.562069] eth0: no IPv6 routers present

Debian has been shipping (unstable and a little later squeeze, the 
upcoming stable) kernels with this firmware stripped out since late 
december 2009.

Therefore I'd think it's safe to just make some noise about missing 
firmware images and not cease operations completely for this chipset.

Regards
	Stefan Lippers-Hollmann

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-01 16:36   ` Stefan Lippers-Hollmann
@ 2010-12-01 17:05     ` Ben Hutchings
  2010-12-01 22:40     ` Francois Romieu
  1 sibling, 0 replies; 8+ messages in thread
From: Ben Hutchings @ 2010-12-01 17:05 UTC (permalink / raw)
  To: Stefan Lippers-Hollmann; +Cc: Francois Romieu, Hayes Wang, netdev, linux-kernel

On Wed, Dec 01, 2010 at 05:36:55PM +0100, Stefan Lippers-Hollmann wrote:
> Hi
> 
> On Wednesday 01 December 2010, Francois Romieu wrote:
> > Hayes Wang <hayeswang@realtek.com> :
> > > Remove the firmware of RTL8111D from the kernel.
> > > The binary file of firmware would be moved to linux-firmware repository.
> > 
> > The driver can not simply go along when request_firmware fails. Though Ben's
> > code did not take care of it, the driver should imho propagate some return
> > code. Ben ?
> [...]
> 
> At least for RTL8111D-1 (rtl8168d_1_hw_phy_config(), phy_reg_init_2[])
> a missing firmware update doesn't seem to be fatal
> 	http://bugs.debian.org/561309#45
[...]

Yes.  Though it does clearly affect operation with some combinations of
cable and link partner.  There was a recent bug report on this, though
I can't find it now.

Ben.

-- 
Ben Hutchings
We get into the habit of living before acquiring the habit of thinking.
                                                              - Albert Camus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-01 16:36   ` Stefan Lippers-Hollmann
  2010-12-01 17:05     ` Ben Hutchings
@ 2010-12-01 22:40     ` Francois Romieu
  1 sibling, 0 replies; 8+ messages in thread
From: Francois Romieu @ 2010-12-01 22:40 UTC (permalink / raw)
  To: Stefan Lippers-Hollmann; +Cc: Hayes Wang, netdev, linux-kernel, Ben Hutchings

Stefan Lippers-Hollmann <s.L-H@gmx.de> :
[...]
> Therefore I'd think it's safe to just make some noise about missing 
> firmware images and not cease operations completely for this chipset.

Ok, fine.

-- 
Ueimor

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-01  8:07 ` Francois Romieu
  2010-12-01  9:54   ` hayeswang
  2010-12-01 16:36   ` Stefan Lippers-Hollmann
@ 2010-12-06  4:38   ` Ben Hutchings
  2010-12-06 22:04     ` Francois Romieu
  2 siblings, 1 reply; 8+ messages in thread
From: Ben Hutchings @ 2010-12-06  4:38 UTC (permalink / raw)
  To: Francois Romieu; +Cc: Hayes Wang, netdev, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1031 bytes --]

On Wed, 2010-12-01 at 09:07 +0100, Francois Romieu wrote:
> Hayes Wang <hayeswang@realtek.com> :
> > Remove the firmware of RTL8111D from the kernel.
> > The binary file of firmware would be moved to linux-firmware repository.
> 
> The driver can not simply go along when request_firmware fails. Though Ben's
> code did not take care of it, the driver should imho propagate some return
> code. Ben ?
[...]

Sorry I haven't been more responsive on this.

I have reports that the RTL8111D/8168D hardware can work without this
firmware, possibly with limited functionality or compatibility.  (I
assume it is a patch for the original firmware loaded from ROM or
flash.)  So I feel obliged to give users the choice to use the driver
without installing non-free firmware.  If you want to make the warning
on failure of request_firmware() more explicit then that's OK with me.
If you make the failure fatal I will probably revert that in Debian.

Ben.

-- 
Ben Hutchings, Debian Developer and kernel team member


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/r8169: Remove the firmware of RTL8111D
  2010-12-06  4:38   ` Ben Hutchings
@ 2010-12-06 22:04     ` Francois Romieu
  0 siblings, 0 replies; 8+ messages in thread
From: Francois Romieu @ 2010-12-06 22:04 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: Hayes Wang, netdev, linux-kernel

Ben Hutchings <benh@debian.org> :
[...]
> I have reports that the RTL8111D/8168D hardware can work without this
> firmware, possibly with limited functionality or compatibility.  (I
> assume it is a patch for the original firmware loaded from ROM or
> flash.)  So I feel obliged to give users the choice to use the driver
> without installing non-free firmware. If you want to make the warning
> on failure of request_firmware() more explicit then that's OK with me.

I'll make it more explicit regarding what it loads, yes.

> If you make the failure fatal I will probably revert that in Debian.

I have no technical argument against yours to make the failure fatal
yet: even Realtek's wording is rather soft. I will reconsider it if
things turn ugly.

Btw, it is not too hard to build a firmware-of-freedom binary : all
zero should be fine here.

--
Ueimor

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-12-06 22:04 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-01  5:22 [PATCH] net/r8169: Remove the firmware of RTL8111D Hayes Wang
2010-12-01  8:07 ` Francois Romieu
2010-12-01  9:54   ` hayeswang
2010-12-01 16:36   ` Stefan Lippers-Hollmann
2010-12-01 17:05     ` Ben Hutchings
2010-12-01 22:40     ` Francois Romieu
2010-12-06  4:38   ` Ben Hutchings
2010-12-06 22:04     ` Francois Romieu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).