aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/r8169.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r--drivers/net/r8169.c87
1 files changed, 64 insertions, 23 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index c290aa505347..9deda50752cf 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -112,10 +112,15 @@ enum mac_version {
112 RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd 112 RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
113 RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe 113 RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
114 RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb 114 RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
115 RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be 8168Bf 115 RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
116 RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb 8101Ec 116 RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
117 RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 117 RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
118 RTL_GIGA_MAC_VER_15 = 0x0f // 8101 118 RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
119 RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
120 RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
121 RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
122 RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
123 RTL_GIGA_MAC_VER_20 = 0x14 // 8168C
119}; 124};
120 125
121enum phy_version { 126enum phy_version {
@@ -145,7 +150,12 @@ static const struct {
145 _R("RTL8168b/8111b", RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E 150 _R("RTL8168b/8111b", RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
146 _R("RTL8101e", RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139 151 _R("RTL8101e", RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
147 _R("RTL8100e", RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139 152 _R("RTL8100e", RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
148 _R("RTL8100e", RTL_GIGA_MAC_VER_15, 0xff7e1880) // PCI-E 8139 153 _R("RTL8100e", RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
154 _R("RTL8168b/8111b", RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
155 _R("RTL8101e", RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
156 _R("RTL8168cp/8111cp", RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
157 _R("RTL8168c/8111c", RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
158 _R("RTL8168c/8111c", RTL_GIGA_MAC_VER_20, 0xff7e1880) // PCI-E
149}; 159};
150#undef _R 160#undef _R
151 161
@@ -716,7 +726,8 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
716 726
717 /* This tweak comes straight from Realtek's driver. */ 727 /* This tweak comes straight from Realtek's driver. */
718 if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) && 728 if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) &&
719 (tp->mac_version == RTL_GIGA_MAC_VER_13)) { 729 ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
730 (tp->mac_version == RTL_GIGA_MAC_VER_16))) {
720 auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA; 731 auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA;
721 } 732 }
722 } 733 }
@@ -724,7 +735,8 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
724 /* The 8100e/8101e do Fast Ethernet only. */ 735 /* The 8100e/8101e do Fast Ethernet only. */
725 if ((tp->mac_version == RTL_GIGA_MAC_VER_13) || 736 if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
726 (tp->mac_version == RTL_GIGA_MAC_VER_14) || 737 (tp->mac_version == RTL_GIGA_MAC_VER_14) ||
727 (tp->mac_version == RTL_GIGA_MAC_VER_15)) { 738 (tp->mac_version == RTL_GIGA_MAC_VER_15) ||
739 (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
728 if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF)) && 740 if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF)) &&
729 netif_msg_link(tp)) { 741 netif_msg_link(tp)) {
730 printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n", 742 printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n",
@@ -735,7 +747,8 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
735 747
736 auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; 748 auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
737 749
738 if (tp->mac_version == RTL_GIGA_MAC_VER_12) { 750 if ((tp->mac_version == RTL_GIGA_MAC_VER_12) ||
751 (tp->mac_version == RTL_GIGA_MAC_VER_17)) {
739 /* Vendor specific (0x1f) and reserved (0x0e) MII registers. */ 752 /* Vendor specific (0x1f) and reserved (0x0e) MII registers. */
740 mdio_write(ioaddr, 0x1f, 0x0000); 753 mdio_write(ioaddr, 0x1f, 0x0000);
741 mdio_write(ioaddr, 0x0e, 0x0000); 754 mdio_write(ioaddr, 0x0e, 0x0000);
@@ -1113,26 +1126,51 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
1113 */ 1126 */
1114 const struct { 1127 const struct {
1115 u32 mask; 1128 u32 mask;
1129 u32 val;
1116 int mac_version; 1130 int mac_version;
1117 } mac_info[] = { 1131 } mac_info[] = {
1118 { 0x38800000, RTL_GIGA_MAC_VER_15 }, 1132 /* 8168B family. */
1119 { 0x38000000, RTL_GIGA_MAC_VER_12 }, 1133 { 0x7c800000, 0x3c800000, RTL_GIGA_MAC_VER_18 },
1120 { 0x34000000, RTL_GIGA_MAC_VER_13 }, 1134 { 0x7cf00000, 0x3c000000, RTL_GIGA_MAC_VER_19 },
1121 { 0x30800000, RTL_GIGA_MAC_VER_14 }, 1135 { 0x7cf00000, 0x3c200000, RTL_GIGA_MAC_VER_20 },
1122 { 0x30000000, RTL_GIGA_MAC_VER_11 }, 1136 { 0x7c800000, 0x3c000000, RTL_GIGA_MAC_VER_20 },
1123 { 0x98000000, RTL_GIGA_MAC_VER_06 }, 1137
1124 { 0x18000000, RTL_GIGA_MAC_VER_05 }, 1138 /* 8168B family. */
1125 { 0x10000000, RTL_GIGA_MAC_VER_04 }, 1139 { 0x7cf00000, 0x38000000, RTL_GIGA_MAC_VER_12 },
1126 { 0x04000000, RTL_GIGA_MAC_VER_03 }, 1140 { 0x7cf00000, 0x38500000, RTL_GIGA_MAC_VER_17 },
1127 { 0x00800000, RTL_GIGA_MAC_VER_02 }, 1141 { 0x7c800000, 0x38000000, RTL_GIGA_MAC_VER_17 },
1128 { 0x00000000, RTL_GIGA_MAC_VER_01 } /* Catch-all */ 1142 { 0x7c800000, 0x30000000, RTL_GIGA_MAC_VER_11 },
1143
1144 /* 8101 family. */
1145 { 0x7cf00000, 0x34000000, RTL_GIGA_MAC_VER_13 },
1146 { 0x7cf00000, 0x34200000, RTL_GIGA_MAC_VER_16 },
1147 { 0x7c800000, 0x34000000, RTL_GIGA_MAC_VER_16 },
1148 /* FIXME: where did these entries come from ? -- FR */
1149 { 0xfc800000, 0x38800000, RTL_GIGA_MAC_VER_15 },
1150 { 0xfc800000, 0x30800000, RTL_GIGA_MAC_VER_14 },
1151
1152 /* 8110 family. */
1153 { 0xfc800000, 0x98000000, RTL_GIGA_MAC_VER_06 },
1154 { 0xfc800000, 0x18000000, RTL_GIGA_MAC_VER_05 },
1155 { 0xfc800000, 0x10000000, RTL_GIGA_MAC_VER_04 },
1156 { 0xfc800000, 0x04000000, RTL_GIGA_MAC_VER_03 },
1157 { 0xfc800000, 0x00800000, RTL_GIGA_MAC_VER_02 },
1158 { 0xfc800000, 0x00000000, RTL_GIGA_MAC_VER_01 },
1159
1160 { 0x00000000, 0x00000000, RTL_GIGA_MAC_VER_01 } /* Catch-all */
1129 }, *p = mac_info; 1161 }, *p = mac_info;
1130 u32 reg; 1162 u32 reg;
1131 1163
1132 reg = RTL_R32(TxConfig) & 0xfc800000; 1164 reg = RTL_R32(TxConfig);
1133 while ((reg & p->mask) != p->mask) 1165 while ((reg & p->mask) != p->val)
1134 p++; 1166 p++;
1135 tp->mac_version = p->mac_version; 1167 tp->mac_version = p->mac_version;
1168
1169 if (p->mask == 0x00000000) {
1170 struct pci_dev *pdev = tp->pci_dev;
1171
1172 dev_info(&pdev->dev, "unknown MAC (%08x)\n", reg);
1173 }
1136} 1174}
1137 1175
1138static void rtl8169_print_mac_version(struct rtl8169_private *tp) 1176static void rtl8169_print_mac_version(struct rtl8169_private *tp)
@@ -2074,7 +2112,8 @@ static void rtl_hw_start_8101(struct net_device *dev)
2074 void __iomem *ioaddr = tp->mmio_addr; 2112 void __iomem *ioaddr = tp->mmio_addr;
2075 struct pci_dev *pdev = tp->pci_dev; 2113 struct pci_dev *pdev = tp->pci_dev;
2076 2114
2077 if (tp->mac_version == RTL_GIGA_MAC_VER_13) { 2115 if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
2116 (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
2078 pci_write_config_word(pdev, 0x68, 0x00); 2117 pci_write_config_word(pdev, 0x68, 0x00);
2079 pci_write_config_word(pdev, 0x69, 0x08); 2118 pci_write_config_word(pdev, 0x69, 0x08);
2080 } 2119 }
@@ -3030,7 +3069,9 @@ static void rtl_set_rx_mode(struct net_device *dev)
3030 (tp->mac_version == RTL_GIGA_MAC_VER_12) || 3069 (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
3031 (tp->mac_version == RTL_GIGA_MAC_VER_13) || 3070 (tp->mac_version == RTL_GIGA_MAC_VER_13) ||
3032 (tp->mac_version == RTL_GIGA_MAC_VER_14) || 3071 (tp->mac_version == RTL_GIGA_MAC_VER_14) ||
3033 (tp->mac_version == RTL_GIGA_MAC_VER_15)) { 3072 (tp->mac_version == RTL_GIGA_MAC_VER_15) ||
3073 (tp->mac_version == RTL_GIGA_MAC_VER_16) ||
3074 (tp->mac_version == RTL_GIGA_MAC_VER_17)) {
3034 mc_filter[0] = 0xffffffff; 3075 mc_filter[0] = 0xffffffff;
3035 mc_filter[1] = 0xffffffff; 3076 mc_filter[1] = 0xffffffff;
3036 } 3077 }