It seems RTL8168D version 1 (but not version 2) was previously supported
without the need for this firmware update (rtl8168d-1.fw). So perhaps
the driver should carry on without it if it is missing. Please try
applying the following patch, which implements that behaviour.
Ben.
diff -u b/drivers/net/r8169.c b/drivers/net/r8169.c
--- b/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -1709,7 +1709,7 @@
rtl8168c_3_hw_phy_config(ioaddr);
}
-static int rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
+static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
{
static struct phy_reg phy_reg_init_0[] = {
{ 0x1f, 0x0001 },
@@ -1739,11 +1739,6 @@
};
void __iomem *ioaddr = tp->mmio_addr;
const struct firmware *fw;
- int rc;
-
- rc = request_firmware(&fw, "rtl8168d-1.fw", &tp->pci_dev->dev);
- if (rc)
- return rc;
rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
@@ -1801,15 +1796,15 @@
mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
- rtl_phy_write_fw(ioaddr, fw);
-
- release_firmware(fw);
- return 0;
+ if (request_firmware(&fw, "rtl8168d-1.fw", &tp->pci_dev->dev) == 0) {
+ rtl_phy_write_fw(ioaddr, fw);
+ release_firmware(fw);
+ }
}
MODULE_FIRMWARE("rtl8168d-1.fw");
-static int rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
+static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
{
static struct phy_reg phy_reg_init_0[] = {
{ 0x1f, 0x0001 },
@@ -1838,11 +1833,6 @@
};
void __iomem *ioaddr = tp->mmio_addr;
const struct firmware *fw;
- int rc;
-
- rc = request_firmware(&fw, "rtl8168d-2.fw", &tp->pci_dev->dev);
- if (rc)
- return rc;
rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
@@ -1896,10 +1886,10 @@
mdio_write(ioaddr, 0x1f, 0x0002);
mdio_patch(ioaddr, 0x0f, 0x0017);
- rtl_phy_write_fw(ioaddr, fw);
-
- release_firmware(fw);
- return 0;
+ if (request_firmware(&fw, "rtl8168d-2.fw", &tp->pci_dev->dev) == 0) {
+ rtl_phy_write_fw(ioaddr, fw);
+ release_firmware(fw);
+ }
}
MODULE_FIRMWARE("rtl8168d-2.fw");
@@ -2039,9 +2029,11 @@
rtl8168cp_2_hw_phy_config(ioaddr);
break;
case RTL_GIGA_MAC_VER_25:
- return rtl8168d_1_hw_phy_config(tp);
+ rtl8168d_1_hw_phy_config(tp);
+ break;
case RTL_GIGA_MAC_VER_26:
- return rtl8168d_2_hw_phy_config(tp);
+ rtl8168d_2_hw_phy_config(tp);
+ break;
case RTL_GIGA_MAC_VER_27:
rtl8168d_3_hw_phy_config(ioaddr);
break;
--- END ---
--
Ben Hutchings
Humans are not rational beings; they are rationalising beings.
Attachment:
signature.asc
Description: This is a digitally signed message part