aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-09-23 13:46:03 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-23 13:46:03 -0400
commit120deefa0bef266d4e01e986f272de2f0f5d3ef3 (patch)
tree7bb1e1d2427ae91469238c77d25b3418bb4bd8f4
parent757216efb8f1bcab152c3f4c33ad7862b2f6663a (diff)
parentd58d46b5d85139d18eb939aa7279c160bab70484 (diff)
Merge branch 'davem-next.r8169' of git://violet.fr.zoreil.com/romieu/linux
-rw-r--r--drivers/net/ethernet/realtek/r8169.c487
1 files changed, 430 insertions, 57 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 6eb9f4ea3bf..2ce60709a45 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -42,6 +42,8 @@
42#define FIRMWARE_8168E_1 "rtl_nic/rtl8168e-1.fw" 42#define FIRMWARE_8168E_1 "rtl_nic/rtl8168e-1.fw"
43#define FIRMWARE_8168E_2 "rtl_nic/rtl8168e-2.fw" 43#define FIRMWARE_8168E_2 "rtl_nic/rtl8168e-2.fw"
44#define FIRMWARE_8168E_3 "rtl_nic/rtl8168e-3.fw" 44#define FIRMWARE_8168E_3 "rtl_nic/rtl8168e-3.fw"
45#define FIRMWARE_8168F_1 "rtl_nic/rtl8168f-1.fw"
46#define FIRMWARE_8168F_2 "rtl_nic/rtl8168f-2.fw"
45#define FIRMWARE_8105E_1 "rtl_nic/rtl8105e-1.fw" 47#define FIRMWARE_8105E_1 "rtl_nic/rtl8105e-1.fw"
46 48
47#ifdef RTL8169_DEBUG 49#ifdef RTL8169_DEBUG
@@ -133,6 +135,8 @@ enum mac_version {
133 RTL_GIGA_MAC_VER_32, 135 RTL_GIGA_MAC_VER_32,
134 RTL_GIGA_MAC_VER_33, 136 RTL_GIGA_MAC_VER_33,
135 RTL_GIGA_MAC_VER_34, 137 RTL_GIGA_MAC_VER_34,
138 RTL_GIGA_MAC_VER_35,
139 RTL_GIGA_MAC_VER_36,
136 RTL_GIGA_MAC_NONE = 0xff, 140 RTL_GIGA_MAC_NONE = 0xff,
137}; 141};
138 142
@@ -141,84 +145,110 @@ enum rtl_tx_desc_version {
141 RTL_TD_1 = 1, 145 RTL_TD_1 = 1,
142}; 146};
143 147
144#define _R(NAME,TD,FW) \ 148#define JUMBO_1K ETH_DATA_LEN
145 { .name = NAME, .txd_version = TD, .fw_name = FW } 149#define JUMBO_4K (4*1024 - ETH_HLEN - 2)
150#define JUMBO_6K (6*1024 - ETH_HLEN - 2)
151#define JUMBO_7K (7*1024 - ETH_HLEN - 2)
152#define JUMBO_9K (9*1024 - ETH_HLEN - 2)
153
154#define _R(NAME,TD,FW,SZ,B) { \
155 .name = NAME, \
156 .txd_version = TD, \
157 .fw_name = FW, \
158 .jumbo_max = SZ, \
159 .jumbo_tx_csum = B \
160}
146 161
147static const struct { 162static const struct {
148 const char *name; 163 const char *name;
149 enum rtl_tx_desc_version txd_version; 164 enum rtl_tx_desc_version txd_version;
150 const char *fw_name; 165 const char *fw_name;
166 u16 jumbo_max;
167 bool jumbo_tx_csum;
151} rtl_chip_infos[] = { 168} rtl_chip_infos[] = {
152 /* PCI devices. */ 169 /* PCI devices. */
153 [RTL_GIGA_MAC_VER_01] = 170 [RTL_GIGA_MAC_VER_01] =
154 _R("RTL8169", RTL_TD_0, NULL), 171 _R("RTL8169", RTL_TD_0, NULL, JUMBO_7K, true),
155 [RTL_GIGA_MAC_VER_02] = 172 [RTL_GIGA_MAC_VER_02] =
156 _R("RTL8169s", RTL_TD_0, NULL), 173 _R("RTL8169s", RTL_TD_0, NULL, JUMBO_7K, true),
157 [RTL_GIGA_MAC_VER_03] = 174 [RTL_GIGA_MAC_VER_03] =
158 _R("RTL8110s", RTL_TD_0, NULL), 175 _R("RTL8110s", RTL_TD_0, NULL, JUMBO_7K, true),
159 [RTL_GIGA_MAC_VER_04] = 176 [RTL_GIGA_MAC_VER_04] =
160 _R("RTL8169sb/8110sb", RTL_TD_0, NULL), 177 _R("RTL8169sb/8110sb", RTL_TD_0, NULL, JUMBO_7K, true),
161 [RTL_GIGA_MAC_VER_05] = 178 [RTL_GIGA_MAC_VER_05] =
162 _R("RTL8169sc/8110sc", RTL_TD_0, NULL), 179 _R("RTL8169sc/8110sc", RTL_TD_0, NULL, JUMBO_7K, true),
163 [RTL_GIGA_MAC_VER_06] = 180 [RTL_GIGA_MAC_VER_06] =
164 _R("RTL8169sc/8110sc", RTL_TD_0, NULL), 181 _R("RTL8169sc/8110sc", RTL_TD_0, NULL, JUMBO_7K, true),
165 /* PCI-E devices. */ 182 /* PCI-E devices. */
166 [RTL_GIGA_MAC_VER_07] = 183 [RTL_GIGA_MAC_VER_07] =
167 _R("RTL8102e", RTL_TD_1, NULL), 184 _R("RTL8102e", RTL_TD_1, NULL, JUMBO_1K, true),
168 [RTL_GIGA_MAC_VER_08] = 185 [RTL_GIGA_MAC_VER_08] =
169 _R("RTL8102e", RTL_TD_1, NULL), 186 _R("RTL8102e", RTL_TD_1, NULL, JUMBO_1K, true),
170 [RTL_GIGA_MAC_VER_09] = 187 [RTL_GIGA_MAC_VER_09] =
171 _R("RTL8102e", RTL_TD_1, NULL), 188 _R("RTL8102e", RTL_TD_1, NULL, JUMBO_1K, true),
172 [RTL_GIGA_MAC_VER_10] = 189 [RTL_GIGA_MAC_VER_10] =
173 _R("RTL8101e", RTL_TD_0, NULL), 190 _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K, true),
174 [RTL_GIGA_MAC_VER_11] = 191 [RTL_GIGA_MAC_VER_11] =
175 _R("RTL8168b/8111b", RTL_TD_0, NULL), 192 _R("RTL8168b/8111b", RTL_TD_0, NULL, JUMBO_4K, false),
176 [RTL_GIGA_MAC_VER_12] = 193 [RTL_GIGA_MAC_VER_12] =
177 _R("RTL8168b/8111b", RTL_TD_0, NULL), 194 _R("RTL8168b/8111b", RTL_TD_0, NULL, JUMBO_4K, false),
178 [RTL_GIGA_MAC_VER_13] = 195 [RTL_GIGA_MAC_VER_13] =
179 _R("RTL8101e", RTL_TD_0, NULL), 196 _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K, true),
180 [RTL_GIGA_MAC_VER_14] = 197 [RTL_GIGA_MAC_VER_14] =
181 _R("RTL8100e", RTL_TD_0, NULL), 198 _R("RTL8100e", RTL_TD_0, NULL, JUMBO_1K, true),
182 [RTL_GIGA_MAC_VER_15] = 199 [RTL_GIGA_MAC_VER_15] =
183 _R("RTL8100e", RTL_TD_0, NULL), 200 _R("RTL8100e", RTL_TD_0, NULL, JUMBO_1K, true),
184 [RTL_GIGA_MAC_VER_16] = 201 [RTL_GIGA_MAC_VER_16] =
185 _R("RTL8101e", RTL_TD_0, NULL), 202 _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K, true),
186 [RTL_GIGA_MAC_VER_17] = 203 [RTL_GIGA_MAC_VER_17] =
187 _R("RTL8168b/8111b", RTL_TD_0, NULL), 204 _R("RTL8168b/8111b", RTL_TD_1, NULL, JUMBO_4K, false),
188 [RTL_GIGA_MAC_VER_18] = 205 [RTL_GIGA_MAC_VER_18] =
189 _R("RTL8168cp/8111cp", RTL_TD_1, NULL), 206 _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K, false),
190 [RTL_GIGA_MAC_VER_19] = 207 [RTL_GIGA_MAC_VER_19] =
191 _R("RTL8168c/8111c", RTL_TD_1, NULL), 208 _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K, false),
192 [RTL_GIGA_MAC_VER_20] = 209 [RTL_GIGA_MAC_VER_20] =
193 _R("RTL8168c/8111c", RTL_TD_1, NULL), 210 _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K, false),
194 [RTL_GIGA_MAC_VER_21] = 211 [RTL_GIGA_MAC_VER_21] =
195 _R("RTL8168c/8111c", RTL_TD_1, NULL), 212 _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K, false),
196 [RTL_GIGA_MAC_VER_22] = 213 [RTL_GIGA_MAC_VER_22] =
197 _R("RTL8168c/8111c", RTL_TD_1, NULL), 214 _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K, false),
198 [RTL_GIGA_MAC_VER_23] = 215 [RTL_GIGA_MAC_VER_23] =
199 _R("RTL8168cp/8111cp", RTL_TD_1, NULL), 216 _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K, false),
200 [RTL_GIGA_MAC_VER_24] = 217 [RTL_GIGA_MAC_VER_24] =
201 _R("RTL8168cp/8111cp", RTL_TD_1, NULL), 218 _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K, false),
202 [RTL_GIGA_MAC_VER_25] = 219 [RTL_GIGA_MAC_VER_25] =
203 _R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_1), 220 _R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_1,
221 JUMBO_9K, false),
204 [RTL_GIGA_MAC_VER_26] = 222 [RTL_GIGA_MAC_VER_26] =
205 _R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_2), 223 _R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_2,
224 JUMBO_9K, false),
206 [RTL_GIGA_MAC_VER_27] = 225 [RTL_GIGA_MAC_VER_27] =
207 _R("RTL8168dp/8111dp", RTL_TD_1, NULL), 226 _R("RTL8168dp/8111dp", RTL_TD_1, NULL, JUMBO_9K, false),
208 [RTL_GIGA_MAC_VER_28] = 227 [RTL_GIGA_MAC_VER_28] =
209 _R("RTL8168dp/8111dp", RTL_TD_1, NULL), 228 _R("RTL8168dp/8111dp", RTL_TD_1, NULL, JUMBO_9K, false),
210 [RTL_GIGA_MAC_VER_29] = 229 [RTL_GIGA_MAC_VER_29] =
211 _R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1), 230 _R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1,
231 JUMBO_1K, true),
212 [RTL_GIGA_MAC_VER_30] = 232 [RTL_GIGA_MAC_VER_30] =
213 _R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1), 233 _R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1,
234 JUMBO_1K, true),
214 [RTL_GIGA_MAC_VER_31] = 235 [RTL_GIGA_MAC_VER_31] =
215 _R("RTL8168dp/8111dp", RTL_TD_1, NULL), 236 _R("RTL8168dp/8111dp", RTL_TD_1, NULL, JUMBO_9K, false),
216 [RTL_GIGA_MAC_VER_32] = 237 [RTL_GIGA_MAC_VER_32] =
217 _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_1), 238 _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_1,
239 JUMBO_9K, false),
218 [RTL_GIGA_MAC_VER_33] = 240 [RTL_GIGA_MAC_VER_33] =
219 _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_2), 241 _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_2,
242 JUMBO_9K, false),
220 [RTL_GIGA_MAC_VER_34] = 243 [RTL_GIGA_MAC_VER_34] =
221 _R("RTL8168evl/8111evl",RTL_TD_1, FIRMWARE_8168E_3) 244 _R("RTL8168evl/8111evl",RTL_TD_1, FIRMWARE_8168E_3,
245 JUMBO_9K, false),
246 [RTL_GIGA_MAC_VER_35] =
247 _R("RTL8168f/8111f", RTL_TD_1, FIRMWARE_8168F_1,
248 JUMBO_9K, false),
249 [RTL_GIGA_MAC_VER_36] =
250 _R("RTL8168f/8111f", RTL_TD_1, FIRMWARE_8168F_2,
251 JUMBO_9K, false),
222}; 252};
223#undef _R 253#undef _R
224 254
@@ -311,6 +341,7 @@ enum rtl_registers {
311 MaxTxPacketSize = 0xec, /* 8101/8168. Unit of 128 bytes. */ 341 MaxTxPacketSize = 0xec, /* 8101/8168. Unit of 128 bytes. */
312 342
313#define TxPacketMax (8064 >> 7) 343#define TxPacketMax (8064 >> 7)
344#define EarlySize 0x27
314 345
315 FuncEvent = 0xf0, 346 FuncEvent = 0xf0,
316 FuncEventMask = 0xf4, 347 FuncEventMask = 0xf4,
@@ -460,8 +491,12 @@ enum rtl_register_content {
460 /* Config3 register p.25 */ 491 /* Config3 register p.25 */
461 MagicPacket = (1 << 5), /* Wake up when receives a Magic Packet */ 492 MagicPacket = (1 << 5), /* Wake up when receives a Magic Packet */
462 LinkUp = (1 << 4), /* Wake up when the cable connection is re-established */ 493 LinkUp = (1 << 4), /* Wake up when the cable connection is re-established */
494 Jumbo_En0 = (1 << 2), /* 8168 only. Reserved in the 8168b */
463 Beacon_en = (1 << 0), /* 8168 only. Reserved in the 8168b */ 495 Beacon_en = (1 << 0), /* 8168 only. Reserved in the 8168b */
464 496
497 /* Config4 register */
498 Jumbo_En1 = (1 << 1), /* 8168 only. Reserved in the 8168b */
499
465 /* Config5 register p.27 */ 500 /* Config5 register p.27 */
466 BWF = (1 << 6), /* Accept Broadcast wakeup frame */ 501 BWF = (1 << 6), /* Accept Broadcast wakeup frame */
467 MWF = (1 << 5), /* Accept Multicast wakeup frame */ 502 MWF = (1 << 5), /* Accept Multicast wakeup frame */
@@ -670,6 +705,11 @@ struct rtl8169_private {
670 void (*up)(struct rtl8169_private *); 705 void (*up)(struct rtl8169_private *);
671 } pll_power_ops; 706 } pll_power_ops;
672 707
708 struct jumbo_ops {
709 void (*enable)(struct rtl8169_private *);
710 void (*disable)(struct rtl8169_private *);
711 } jumbo_ops;
712
673 int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv); 713 int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
674 int (*get_settings)(struct net_device *, struct ethtool_cmd *); 714 int (*get_settings)(struct net_device *, struct ethtool_cmd *);
675 void (*phy_reset_enable)(struct rtl8169_private *tp); 715 void (*phy_reset_enable)(struct rtl8169_private *tp);
@@ -714,6 +754,8 @@ MODULE_FIRMWARE(FIRMWARE_8168E_1);
714MODULE_FIRMWARE(FIRMWARE_8168E_2); 754MODULE_FIRMWARE(FIRMWARE_8168E_2);
715MODULE_FIRMWARE(FIRMWARE_8168E_3); 755MODULE_FIRMWARE(FIRMWARE_8168E_3);
716MODULE_FIRMWARE(FIRMWARE_8105E_1); 756MODULE_FIRMWARE(FIRMWARE_8105E_1);
757MODULE_FIRMWARE(FIRMWARE_8168F_1);
758MODULE_FIRMWARE(FIRMWARE_8168F_2);
717 759
718static int rtl8169_open(struct net_device *dev); 760static int rtl8169_open(struct net_device *dev);
719static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, 761static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
@@ -732,6 +774,19 @@ static void rtl8169_down(struct net_device *dev);
732static void rtl8169_rx_clear(struct rtl8169_private *tp); 774static void rtl8169_rx_clear(struct rtl8169_private *tp);
733static int rtl8169_poll(struct napi_struct *napi, int budget); 775static int rtl8169_poll(struct napi_struct *napi, int budget);
734 776
777static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
778{
779 int cap = pci_pcie_cap(pdev);
780
781 if (cap) {
782 u16 ctl;
783
784 pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
785 ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
786 pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
787 }
788}
789
735static u32 ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg) 790static u32 ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
736{ 791{
737 void __iomem *ioaddr = tp->mmio_addr; 792 void __iomem *ioaddr = tp->mmio_addr;
@@ -1202,6 +1257,19 @@ static void rtl_link_chg_patch(struct rtl8169_private *tp)
1202 ERIAR_EXGMAC); 1257 ERIAR_EXGMAC);
1203 rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, 1258 rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00,
1204 ERIAR_EXGMAC); 1259 ERIAR_EXGMAC);
1260 } else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
1261 tp->mac_version == RTL_GIGA_MAC_VER_36) {
1262 if (RTL_R8(PHYstatus) & _1000bpsF) {
1263 rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
1264 0x00000011, ERIAR_EXGMAC);
1265 rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
1266 0x00000005, ERIAR_EXGMAC);
1267 } else {
1268 rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
1269 0x0000001f, ERIAR_EXGMAC);
1270 rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
1271 0x0000003f, ERIAR_EXGMAC);
1272 }
1205 } 1273 }
1206} 1274}
1207 1275
@@ -1487,9 +1555,15 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1487 1555
1488static u32 rtl8169_fix_features(struct net_device *dev, u32 features) 1556static u32 rtl8169_fix_features(struct net_device *dev, u32 features)
1489{ 1557{
1558 struct rtl8169_private *tp = netdev_priv(dev);
1559
1490 if (dev->mtu > TD_MSS_MAX) 1560 if (dev->mtu > TD_MSS_MAX)
1491 features &= ~NETIF_F_ALL_TSO; 1561 features &= ~NETIF_F_ALL_TSO;
1492 1562
1563 if (dev->mtu > JUMBO_1K &&
1564 !rtl_chip_infos[tp->mac_version].jumbo_tx_csum)
1565 features &= ~NETIF_F_IP_CSUM;
1566
1493 return features; 1567 return features;
1494} 1568}
1495 1569
@@ -1741,6 +1815,10 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
1741 u32 val; 1815 u32 val;
1742 int mac_version; 1816 int mac_version;
1743 } mac_info[] = { 1817 } mac_info[] = {
1818 /* 8168F family. */
1819 { 0x7cf00000, 0x48100000, RTL_GIGA_MAC_VER_36 },
1820 { 0x7cf00000, 0x48000000, RTL_GIGA_MAC_VER_35 },
1821
1744 /* 8168E family. */ 1822 /* 8168E family. */
1745 { 0x7c800000, 0x2c800000, RTL_GIGA_MAC_VER_34 }, 1823 { 0x7c800000, 0x2c800000, RTL_GIGA_MAC_VER_34 },
1746 { 0x7cf00000, 0x2c200000, RTL_GIGA_MAC_VER_33 }, 1824 { 0x7cf00000, 0x2c200000, RTL_GIGA_MAC_VER_33 },
@@ -2875,6 +2953,97 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
2875 rtl_writephy(tp, 0x1f, 0x0000); 2953 rtl_writephy(tp, 0x1f, 0x0000);
2876} 2954}
2877 2955
2956static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)
2957{
2958 static const struct phy_reg phy_reg_init[] = {
2959 /* Channel estimation fine tune */
2960 { 0x1f, 0x0003 },
2961 { 0x09, 0xa20f },
2962 { 0x1f, 0x0000 },
2963
2964 /* Modify green table for giga & fnet */
2965 { 0x1f, 0x0005 },
2966 { 0x05, 0x8b55 },
2967 { 0x06, 0x0000 },
2968 { 0x05, 0x8b5e },
2969 { 0x06, 0x0000 },
2970 { 0x05, 0x8b67 },
2971 { 0x06, 0x0000 },
2972 { 0x05, 0x8b70 },
2973 { 0x06, 0x0000 },
2974 { 0x1f, 0x0000 },
2975 { 0x1f, 0x0007 },
2976 { 0x1e, 0x0078 },
2977 { 0x17, 0x0000 },
2978 { 0x19, 0x00fb },
2979 { 0x1f, 0x0000 },
2980
2981 /* Modify green table for 10M */
2982 { 0x1f, 0x0005 },
2983 { 0x05, 0x8b79 },
2984 { 0x06, 0xaa00 },
2985 { 0x1f, 0x0000 },
2986
2987 /* Disable hiimpedance detection (RTCT) */
2988 { 0x1f, 0x0003 },
2989 { 0x01, 0x328a },
2990 { 0x1f, 0x0000 }
2991 };
2992
2993 rtl_apply_firmware(tp);
2994
2995 rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2996
2997 /* For 4-corner performance improve */
2998 rtl_writephy(tp, 0x1f, 0x0005);
2999 rtl_writephy(tp, 0x05, 0x8b80);
3000 rtl_w1w0_phy(tp, 0x06, 0x0006, 0x0000);
3001 rtl_writephy(tp, 0x1f, 0x0000);
3002
3003 /* PHY auto speed down */
3004 rtl_writephy(tp, 0x1f, 0x0007);
3005 rtl_writephy(tp, 0x1e, 0x002d);
3006 rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
3007 rtl_writephy(tp, 0x1f, 0x0000);
3008 rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
3009
3010 /* Improve 10M EEE waveform */
3011 rtl_writephy(tp, 0x1f, 0x0005);
3012 rtl_writephy(tp, 0x05, 0x8b86);
3013 rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
3014 rtl_writephy(tp, 0x1f, 0x0000);
3015
3016 /* Improve 2-pair detection performance */
3017 rtl_writephy(tp, 0x1f, 0x0005);
3018 rtl_writephy(tp, 0x05, 0x8b85);
3019 rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
3020 rtl_writephy(tp, 0x1f, 0x0000);
3021}
3022
3023static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
3024{
3025 rtl_apply_firmware(tp);
3026
3027 /* For 4-corner performance improve */
3028 rtl_writephy(tp, 0x1f, 0x0005);
3029 rtl_writephy(tp, 0x05, 0x8b80);
3030 rtl_w1w0_phy(tp, 0x06, 0x0006, 0x0000);
3031 rtl_writephy(tp, 0x1f, 0x0000);
3032
3033 /* PHY auto speed down */
3034 rtl_writephy(tp, 0x1f, 0x0007);
3035 rtl_writephy(tp, 0x1e, 0x002d);
3036 rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
3037 rtl_writephy(tp, 0x1f, 0x0000);
3038 rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
3039
3040 /* Improve 10M EEE waveform */
3041 rtl_writephy(tp, 0x1f, 0x0005);
3042 rtl_writephy(tp, 0x05, 0x8b86);
3043 rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
3044 rtl_writephy(tp, 0x1f, 0x0000);
3045}
3046
2878static void rtl8102e_hw_phy_config(struct rtl8169_private *tp) 3047static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
2879{ 3048{
2880 static const struct phy_reg phy_reg_init[] = { 3049 static const struct phy_reg phy_reg_init[] = {
@@ -2999,6 +3168,12 @@ static void rtl_hw_phy_config(struct net_device *dev)
2999 case RTL_GIGA_MAC_VER_34: 3168 case RTL_GIGA_MAC_VER_34:
3000 rtl8168e_2_hw_phy_config(tp); 3169 rtl8168e_2_hw_phy_config(tp);
3001 break; 3170 break;
3171 case RTL_GIGA_MAC_VER_35:
3172 rtl8168f_1_hw_phy_config(tp);
3173 break;
3174 case RTL_GIGA_MAC_VER_36:
3175 rtl8168f_2_hw_phy_config(tp);
3176 break;
3002 3177
3003 default: 3178 default:
3004 break; 3179 break;
@@ -3483,8 +3658,8 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
3483 r8168_phy_power_up(tp); 3658 r8168_phy_power_up(tp);
3484} 3659}
3485 3660
3486static void rtl_pll_power_op(struct rtl8169_private *tp, 3661static void rtl_generic_op(struct rtl8169_private *tp,
3487 void (*op)(struct rtl8169_private *)) 3662 void (*op)(struct rtl8169_private *))
3488{ 3663{
3489 if (op) 3664 if (op)
3490 op(tp); 3665 op(tp);
@@ -3492,12 +3667,12 @@ static void rtl_pll_power_op(struct rtl8169_private *tp,
3492 3667
3493static void rtl_pll_power_down(struct rtl8169_private *tp) 3668static void rtl_pll_power_down(struct rtl8169_private *tp)
3494{ 3669{
3495 rtl_pll_power_op(tp, tp->pll_power_ops.down); 3670 rtl_generic_op(tp, tp->pll_power_ops.down);
3496} 3671}
3497 3672
3498static void rtl_pll_power_up(struct rtl8169_private *tp) 3673static void rtl_pll_power_up(struct rtl8169_private *tp)
3499{ 3674{
3500 rtl_pll_power_op(tp, tp->pll_power_ops.up); 3675 rtl_generic_op(tp, tp->pll_power_ops.up);
3501} 3676}
3502 3677
3503static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp) 3678static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
@@ -3534,6 +3709,8 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
3534 case RTL_GIGA_MAC_VER_32: 3709 case RTL_GIGA_MAC_VER_32:
3535 case RTL_GIGA_MAC_VER_33: 3710 case RTL_GIGA_MAC_VER_33:
3536 case RTL_GIGA_MAC_VER_34: 3711 case RTL_GIGA_MAC_VER_34:
3712 case RTL_GIGA_MAC_VER_35:
3713 case RTL_GIGA_MAC_VER_36:
3537 ops->down = r8168_pll_power_down; 3714 ops->down = r8168_pll_power_down;
3538 ops->up = r8168_pll_power_up; 3715 ops->up = r8168_pll_power_up;
3539 break; 3716 break;
@@ -3586,6 +3763,150 @@ static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
3586 tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0; 3763 tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
3587} 3764}
3588 3765
3766static void rtl_hw_jumbo_enable(struct rtl8169_private *tp)
3767{
3768 rtl_generic_op(tp, tp->jumbo_ops.enable);
3769}
3770
3771static void rtl_hw_jumbo_disable(struct rtl8169_private *tp)
3772{
3773 rtl_generic_op(tp, tp->jumbo_ops.disable);
3774}
3775
3776static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
3777{
3778 void __iomem *ioaddr = tp->mmio_addr;
3779
3780 RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
3781 RTL_W8(Config4, RTL_R8(Config4) | Jumbo_En1);
3782 rtl_tx_performance_tweak(tp->pci_dev, 0x2 << MAX_READ_REQUEST_SHIFT);
3783}
3784
3785static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
3786{
3787 void __iomem *ioaddr = tp->mmio_addr;
3788
3789 RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
3790 RTL_W8(Config4, RTL_R8(Config4) & ~Jumbo_En1);
3791 rtl_tx_performance_tweak(tp->pci_dev, 0x5 << MAX_READ_REQUEST_SHIFT);
3792}
3793
3794static void r8168dp_hw_jumbo_enable(struct rtl8169_private *tp)
3795{
3796 void __iomem *ioaddr = tp->mmio_addr;
3797
3798 RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
3799}
3800
3801static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
3802{
3803 void __iomem *ioaddr = tp->mmio_addr;
3804
3805 RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
3806}
3807
3808static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
3809{
3810 void __iomem *ioaddr = tp->mmio_addr;
3811 struct pci_dev *pdev = tp->pci_dev;
3812
3813 RTL_W8(MaxTxPacketSize, 0x3f);
3814 RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
3815 RTL_W8(Config4, RTL_R8(Config4) | 0x01);
3816 pci_write_config_byte(pdev, 0x79, 0x20);
3817}
3818
3819static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
3820{
3821 void __iomem *ioaddr = tp->mmio_addr;
3822 struct pci_dev *pdev = tp->pci_dev;
3823
3824 RTL_W8(MaxTxPacketSize, 0x0c);
3825 RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
3826 RTL_W8(Config4, RTL_R8(Config4) & ~0x01);
3827 pci_write_config_byte(pdev, 0x79, 0x50);
3828}
3829
3830static void r8168b_0_hw_jumbo_enable(struct rtl8169_private *tp)
3831{
3832 rtl_tx_performance_tweak(tp->pci_dev,
3833 (0x2 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
3834}
3835
3836static void r8168b_0_hw_jumbo_disable(struct rtl8169_private *tp)
3837{
3838 rtl_tx_performance_tweak(tp->pci_dev,
3839 (0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
3840}
3841
3842static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
3843{
3844 void __iomem *ioaddr = tp->mmio_addr;
3845
3846 r8168b_0_hw_jumbo_enable(tp);
3847
3848 RTL_W8(Config4, RTL_R8(Config4) | (1 << 0));
3849}
3850
3851static void r8168b_1_hw_jumbo_disable(struct rtl8169_private *tp)
3852{
3853 void __iomem *ioaddr = tp->mmio_addr;
3854
3855 r8168b_0_hw_jumbo_disable(tp);
3856
3857 RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
3858}
3859
3860static void __devinit rtl_init_jumbo_ops(struct rtl8169_private *tp)
3861{
3862 struct jumbo_ops *ops = &tp->jumbo_ops;
3863
3864 switch (tp->mac_version) {
3865 case RTL_GIGA_MAC_VER_11:
3866 ops->disable = r8168b_0_hw_jumbo_disable;
3867 ops->enable = r8168b_0_hw_jumbo_enable;
3868 break;
3869 case RTL_GIGA_MAC_VER_12:
3870 case RTL_GIGA_MAC_VER_17:
3871 ops->disable = r8168b_1_hw_jumbo_disable;
3872 ops->enable = r8168b_1_hw_jumbo_enable;
3873 break;
3874 case RTL_GIGA_MAC_VER_18: /* Wild guess. Needs info from Realtek. */
3875 case RTL_GIGA_MAC_VER_19:
3876 case RTL_GIGA_MAC_VER_20:
3877 case RTL_GIGA_MAC_VER_21: /* Wild guess. Needs info from Realtek. */
3878 case RTL_GIGA_MAC_VER_22:
3879 case RTL_GIGA_MAC_VER_23:
3880 case RTL_GIGA_MAC_VER_24:
3881 case RTL_GIGA_MAC_VER_25:
3882 case RTL_GIGA_MAC_VER_26:
3883 ops->disable = r8168c_hw_jumbo_disable;
3884 ops->enable = r8168c_hw_jumbo_enable;
3885 break;
3886 case RTL_GIGA_MAC_VER_27:
3887 case RTL_GIGA_MAC_VER_28:
3888 ops->disable = r8168dp_hw_jumbo_disable;
3889 ops->enable = r8168dp_hw_jumbo_enable;
3890 break;
3891 case RTL_GIGA_MAC_VER_31: /* Wild guess. Needs info from Realtek. */
3892 case RTL_GIGA_MAC_VER_32:
3893 case RTL_GIGA_MAC_VER_33:
3894 case RTL_GIGA_MAC_VER_34:
3895 ops->disable = r8168e_hw_jumbo_disable;
3896 ops->enable = r8168e_hw_jumbo_enable;
3897 break;
3898
3899 /*
3900 * No action needed for jumbo frames with 8169.
3901 * No jumbo for 810x at all.
3902 */
3903 default:
3904 ops->disable = NULL;
3905 ops->enable = NULL;
3906 break;
3907 }
3908}
3909
3589static void rtl_hw_reset(struct rtl8169_private *tp) 3910static void rtl_hw_reset(struct rtl8169_private *tp)
3590{ 3911{
3591 void __iomem *ioaddr = tp->mmio_addr; 3912 void __iomem *ioaddr = tp->mmio_addr;
@@ -3730,6 +4051,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3730 4051
3731 rtl_init_mdio_ops(tp); 4052 rtl_init_mdio_ops(tp);
3732 rtl_init_pll_power_ops(tp); 4053 rtl_init_pll_power_ops(tp);
4054 rtl_init_jumbo_ops(tp);
3733 4055
3734 rtl8169_print_mac_version(tp); 4056 rtl8169_print_mac_version(tp);
3735 4057
@@ -3813,6 +4135,12 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3813 netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n", 4135 netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
3814 rtl_chip_infos[chipset].name, dev->base_addr, dev->dev_addr, 4136 rtl_chip_infos[chipset].name, dev->base_addr, dev->dev_addr,
3815 (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq); 4137 (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
4138 if (rtl_chip_infos[chipset].jumbo_max != JUMBO_1K) {
4139 netif_info(tp, probe, dev, "jumbo features [frames: %d bytes, "
4140 "tx checksumming: %s]\n",
4141 rtl_chip_infos[chipset].jumbo_max,
4142 rtl_chip_infos[chipset].jumbo_tx_csum ? "ok" : "ko");
4143 }
3816 4144
3817 if (tp->mac_version == RTL_GIGA_MAC_VER_27 || 4145 if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
3818 tp->mac_version == RTL_GIGA_MAC_VER_28 || 4146 tp->mac_version == RTL_GIGA_MAC_VER_28 ||
@@ -4008,7 +4336,9 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
4008 tp->mac_version == RTL_GIGA_MAC_VER_31) { 4336 tp->mac_version == RTL_GIGA_MAC_VER_31) {
4009 while (RTL_R8(TxPoll) & NPQ) 4337 while (RTL_R8(TxPoll) & NPQ)
4010 udelay(20); 4338 udelay(20);
4011 } else if (tp->mac_version == RTL_GIGA_MAC_VER_34) { 4339 } else if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
4340 tp->mac_version == RTL_GIGA_MAC_VER_35 ||
4341 tp->mac_version == RTL_GIGA_MAC_VER_36) {
4012 RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq); 4342 RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
4013 while (!(RTL_R32(TxConfig) & TXCFG_EMPTY)) 4343 while (!(RTL_R32(TxConfig) & TXCFG_EMPTY))
4014 udelay(100); 4344 udelay(100);
@@ -4167,19 +4497,6 @@ static void rtl_hw_start_8169(struct net_device *dev)
4167 RTL_W16(IntrMask, tp->intr_event); 4497 RTL_W16(IntrMask, tp->intr_event);
4168} 4498}
4169 4499
4170static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
4171{
4172 int cap = pci_pcie_cap(pdev);
4173
4174 if (cap) {
4175 u16 ctl;
4176
4177 pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
4178 ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
4179 pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
4180 }
4181}
4182
4183static void rtl_csi_access_enable(void __iomem *ioaddr, u32 bits) 4500static void rtl_csi_access_enable(void __iomem *ioaddr, u32 bits)
4184{ 4501{
4185 u32 csi; 4502 u32 csi;
@@ -4479,7 +4796,50 @@ static void rtl_hw_start_8168e_2(void __iomem *ioaddr, struct pci_dev *pdev)
4479 rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00, 4796 rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00,
4480 ERIAR_EXGMAC); 4797 ERIAR_EXGMAC);
4481 4798
4482 RTL_W8(MaxTxPacketSize, 0x27); 4799 RTL_W8(MaxTxPacketSize, EarlySize);
4800
4801 rtl_disable_clock_request(pdev);
4802
4803 RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
4804 RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
4805
4806 /* Adjust EEE LED frequency */
4807 RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
4808
4809 RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
4810 RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
4811 RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
4812}
4813
4814static void rtl_hw_start_8168f_1(void __iomem *ioaddr, struct pci_dev *pdev)
4815{
4816 static const struct ephy_info e_info_8168f_1[] = {
4817 { 0x06, 0x00c0, 0x0020 },
4818 { 0x08, 0x0001, 0x0002 },
4819 { 0x09, 0x0000, 0x0080 },
4820 { 0x19, 0x0000, 0x0224 }
4821 };
4822
4823 rtl_csi_access_enable_1(ioaddr);
4824
4825 rtl_ephy_init(ioaddr, e_info_8168f_1, ARRAY_SIZE(e_info_8168f_1));
4826
4827 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
4828
4829 rtl_eri_write(ioaddr, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
4830 rtl_eri_write(ioaddr, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
4831 rtl_eri_write(ioaddr, 0xc8, ERIAR_MASK_1111, 0x00100002, ERIAR_EXGMAC);
4832 rtl_eri_write(ioaddr, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
4833 rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x00, 0x01, ERIAR_EXGMAC);
4834 rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
4835 rtl_w1w0_eri(ioaddr, 0x1b0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
4836 rtl_w1w0_eri(ioaddr, 0x1d0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
4837 rtl_eri_write(ioaddr, 0xcc, ERIAR_MASK_1111, 0x00000050, ERIAR_EXGMAC);
4838 rtl_eri_write(ioaddr, 0xd0, ERIAR_MASK_1111, 0x00000060, ERIAR_EXGMAC);
4839 rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00,
4840 ERIAR_EXGMAC);
4841
4842 RTL_W8(MaxTxPacketSize, EarlySize);
4483 4843
4484 rtl_disable_clock_request(pdev); 4844 rtl_disable_clock_request(pdev);
4485 4845
@@ -4588,6 +4948,11 @@ static void rtl_hw_start_8168(struct net_device *dev)
4588 rtl_hw_start_8168e_2(ioaddr, pdev); 4948 rtl_hw_start_8168e_2(ioaddr, pdev);
4589 break; 4949 break;
4590 4950
4951 case RTL_GIGA_MAC_VER_35:
4952 case RTL_GIGA_MAC_VER_36:
4953 rtl_hw_start_8168f_1(ioaddr, pdev);
4954 break;
4955
4591 default: 4956 default:
4592 printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n", 4957 printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
4593 dev->name, tp->mac_version); 4958 dev->name, tp->mac_version);
@@ -4759,9 +5124,17 @@ static void rtl_hw_start_8101(struct net_device *dev)
4759 5124
4760static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) 5125static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
4761{ 5126{
4762 if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu) 5127 struct rtl8169_private *tp = netdev_priv(dev);
5128
5129 if (new_mtu < ETH_ZLEN ||
5130 new_mtu > rtl_chip_infos[tp->mac_version].jumbo_max)
4763 return -EINVAL; 5131 return -EINVAL;
4764 5132
5133 if (new_mtu > ETH_DATA_LEN)
5134 rtl_hw_jumbo_enable(tp);
5135 else
5136 rtl_hw_jumbo_disable(tp);
5137
4765 dev->mtu = new_mtu; 5138 dev->mtu = new_mtu;
4766 netdev_update_features(dev); 5139 netdev_update_features(dev);
4767 5140
@@ -5356,7 +5729,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
5356 } else { 5729 } else {
5357 struct sk_buff *skb; 5730 struct sk_buff *skb;
5358 dma_addr_t addr = le64_to_cpu(desc->addr); 5731 dma_addr_t addr = le64_to_cpu(desc->addr);
5359 int pkt_size = (status & 0x00001FFF) - 4; 5732 int pkt_size = (status & 0x00003fff) - 4;
5360 5733
5361 /* 5734 /*
5362 * The driver does not support incoming fragmented 5735 * The driver does not support incoming fragmented