diff options
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r-- | drivers/net/r8169.c | 99 |
1 files changed, 97 insertions, 2 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 96b9b0bb4705..02b11a0814dd 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -113,7 +113,8 @@ enum mac_version { | |||
113 | RTL_GIGA_MAC_VER_21 = 0x15, // 8168C | 113 | RTL_GIGA_MAC_VER_21 = 0x15, // 8168C |
114 | RTL_GIGA_MAC_VER_22 = 0x16, // 8168C | 114 | RTL_GIGA_MAC_VER_22 = 0x16, // 8168C |
115 | RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP | 115 | RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP |
116 | RTL_GIGA_MAC_VER_24 = 0x18 // 8168CP | 116 | RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP |
117 | RTL_GIGA_MAC_VER_25 = 0x19 // 8168D | ||
117 | }; | 118 | }; |
118 | 119 | ||
119 | #define _R(NAME,MAC,MASK) \ | 120 | #define _R(NAME,MAC,MASK) \ |
@@ -147,7 +148,8 @@ static const struct { | |||
147 | _R("RTL8168c/8111c", RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E | 148 | _R("RTL8168c/8111c", RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E |
148 | _R("RTL8168c/8111c", RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E | 149 | _R("RTL8168c/8111c", RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E |
149 | _R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E | 150 | _R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E |
150 | _R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_24, 0xff7e1880) // PCI-E | 151 | _R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E |
152 | _R("RTL8168d/8111d", RTL_GIGA_MAC_VER_25, 0xff7e1880) // PCI-E | ||
151 | }; | 153 | }; |
152 | #undef _R | 154 | #undef _R |
153 | 155 | ||
@@ -1224,6 +1226,9 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp, | |||
1224 | u32 val; | 1226 | u32 val; |
1225 | int mac_version; | 1227 | int mac_version; |
1226 | } mac_info[] = { | 1228 | } mac_info[] = { |
1229 | /* 8168D family. */ | ||
1230 | { 0x7c800000, 0x28000000, RTL_GIGA_MAC_VER_25 }, | ||
1231 | |||
1227 | /* 8168C family. */ | 1232 | /* 8168C family. */ |
1228 | { 0x7cf00000, 0x3ca00000, RTL_GIGA_MAC_VER_24 }, | 1233 | { 0x7cf00000, 0x3ca00000, RTL_GIGA_MAC_VER_24 }, |
1229 | { 0x7cf00000, 0x3c900000, RTL_GIGA_MAC_VER_23 }, | 1234 | { 0x7cf00000, 0x3c900000, RTL_GIGA_MAC_VER_23 }, |
@@ -1499,6 +1504,76 @@ static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr) | |||
1499 | rtl8168c_3_hw_phy_config(ioaddr); | 1504 | rtl8168c_3_hw_phy_config(ioaddr); |
1500 | } | 1505 | } |
1501 | 1506 | ||
1507 | static void rtl8168d_hw_phy_config(void __iomem *ioaddr) | ||
1508 | { | ||
1509 | struct phy_reg phy_reg_init_0[] = { | ||
1510 | { 0x1f, 0x0001 }, | ||
1511 | { 0x09, 0x2770 }, | ||
1512 | { 0x08, 0x04d0 }, | ||
1513 | { 0x0b, 0xad15 }, | ||
1514 | { 0x0c, 0x5bf0 }, | ||
1515 | { 0x1c, 0xf101 }, | ||
1516 | { 0x1f, 0x0003 }, | ||
1517 | { 0x14, 0x94d7 }, | ||
1518 | { 0x12, 0xf4d6 }, | ||
1519 | { 0x09, 0xca0f }, | ||
1520 | { 0x1f, 0x0002 }, | ||
1521 | { 0x0b, 0x0b10 }, | ||
1522 | { 0x0c, 0xd1f7 }, | ||
1523 | { 0x1f, 0x0002 }, | ||
1524 | { 0x06, 0x5461 }, | ||
1525 | { 0x1f, 0x0002 }, | ||
1526 | { 0x05, 0x6662 }, | ||
1527 | { 0x1f, 0x0000 }, | ||
1528 | { 0x14, 0x0060 }, | ||
1529 | { 0x1f, 0x0000 }, | ||
1530 | { 0x0d, 0xf8a0 }, | ||
1531 | { 0x1f, 0x0005 }, | ||
1532 | { 0x05, 0xffc2 } | ||
1533 | }; | ||
1534 | |||
1535 | rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0)); | ||
1536 | |||
1537 | if (mdio_read(ioaddr, 0x06) == 0xc400) { | ||
1538 | struct phy_reg phy_reg_init_1[] = { | ||
1539 | { 0x1f, 0x0005 }, | ||
1540 | { 0x01, 0x0300 }, | ||
1541 | { 0x1f, 0x0000 }, | ||
1542 | { 0x11, 0x401c }, | ||
1543 | { 0x16, 0x4100 }, | ||
1544 | { 0x1f, 0x0005 }, | ||
1545 | { 0x07, 0x0010 }, | ||
1546 | { 0x05, 0x83dc }, | ||
1547 | { 0x06, 0x087d }, | ||
1548 | { 0x05, 0x8300 }, | ||
1549 | { 0x06, 0x0101 }, | ||
1550 | { 0x06, 0x05f8 }, | ||
1551 | { 0x06, 0xf9fa }, | ||
1552 | { 0x06, 0xfbef }, | ||
1553 | { 0x06, 0x79e2 }, | ||
1554 | { 0x06, 0x835f }, | ||
1555 | { 0x06, 0xe0f8 }, | ||
1556 | { 0x06, 0x9ae1 }, | ||
1557 | { 0x06, 0xf89b }, | ||
1558 | { 0x06, 0xef31 }, | ||
1559 | { 0x06, 0x3b65 }, | ||
1560 | { 0x06, 0xaa07 }, | ||
1561 | { 0x06, 0x81e4 }, | ||
1562 | { 0x06, 0xf89a }, | ||
1563 | { 0x06, 0xe5f8 }, | ||
1564 | { 0x06, 0x9baf }, | ||
1565 | { 0x06, 0x06ae }, | ||
1566 | { 0x05, 0x83dc }, | ||
1567 | { 0x06, 0x8300 }, | ||
1568 | }; | ||
1569 | |||
1570 | rtl_phy_write(ioaddr, phy_reg_init_1, | ||
1571 | ARRAY_SIZE(phy_reg_init_1)); | ||
1572 | } | ||
1573 | |||
1574 | mdio_write(ioaddr, 0x1f, 0x0000); | ||
1575 | } | ||
1576 | |||
1502 | static void rtl8102e_hw_phy_config(void __iomem *ioaddr) | 1577 | static void rtl8102e_hw_phy_config(void __iomem *ioaddr) |
1503 | { | 1578 | { |
1504 | struct phy_reg phy_reg_init[] = { | 1579 | struct phy_reg phy_reg_init[] = { |
@@ -1565,6 +1640,9 @@ static void rtl_hw_phy_config(struct net_device *dev) | |||
1565 | case RTL_GIGA_MAC_VER_24: | 1640 | case RTL_GIGA_MAC_VER_24: |
1566 | rtl8168cp_2_hw_phy_config(ioaddr); | 1641 | rtl8168cp_2_hw_phy_config(ioaddr); |
1567 | break; | 1642 | break; |
1643 | case RTL_GIGA_MAC_VER_25: | ||
1644 | rtl8168d_hw_phy_config(ioaddr); | ||
1645 | break; | ||
1568 | 1646 | ||
1569 | default: | 1647 | default: |
1570 | break; | 1648 | break; |
@@ -2595,6 +2673,19 @@ static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev) | |||
2595 | __rtl_hw_start_8168cp(ioaddr, pdev); | 2673 | __rtl_hw_start_8168cp(ioaddr, pdev); |
2596 | } | 2674 | } |
2597 | 2675 | ||
2676 | static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev) | ||
2677 | { | ||
2678 | rtl_csi_access_enable(ioaddr); | ||
2679 | |||
2680 | rtl_disable_clock_request(pdev); | ||
2681 | |||
2682 | RTL_W8(EarlyTxThres, EarlyTxThld); | ||
2683 | |||
2684 | rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT); | ||
2685 | |||
2686 | RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK); | ||
2687 | } | ||
2688 | |||
2598 | static void rtl_hw_start_8168(struct net_device *dev) | 2689 | static void rtl_hw_start_8168(struct net_device *dev) |
2599 | { | 2690 | { |
2600 | struct rtl8169_private *tp = netdev_priv(dev); | 2691 | struct rtl8169_private *tp = netdev_priv(dev); |
@@ -2666,6 +2757,10 @@ static void rtl_hw_start_8168(struct net_device *dev) | |||
2666 | rtl_hw_start_8168cp_3(ioaddr, pdev); | 2757 | rtl_hw_start_8168cp_3(ioaddr, pdev); |
2667 | break; | 2758 | break; |
2668 | 2759 | ||
2760 | case RTL_GIGA_MAC_VER_25: | ||
2761 | rtl_hw_start_8168d(ioaddr, pdev); | ||
2762 | break; | ||
2763 | |||
2669 | default: | 2764 | default: |
2670 | printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n", | 2765 | printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n", |
2671 | dev->name, tp->mac_version); | 2766 | dev->name, tp->mac_version); |