diff options
author | David S. Miller <davem@davemloft.net> | 2011-09-23 13:46:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-23 13:46:03 -0400 |
commit | 120deefa0bef266d4e01e986f272de2f0f5d3ef3 (patch) | |
tree | 7bb1e1d2427ae91469238c77d25b3418bb4bd8f4 | |
parent | 757216efb8f1bcab152c3f4c33ad7862b2f6663a (diff) | |
parent | d58d46b5d85139d18eb939aa7279c160bab70484 (diff) |
Merge branch 'davem-next.r8169' of git://violet.fr.zoreil.com/romieu/linux
-rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 487 |
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 | ||
147 | static const struct { | 162 | static 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); | |||
714 | MODULE_FIRMWARE(FIRMWARE_8168E_2); | 754 | MODULE_FIRMWARE(FIRMWARE_8168E_2); |
715 | MODULE_FIRMWARE(FIRMWARE_8168E_3); | 755 | MODULE_FIRMWARE(FIRMWARE_8168E_3); |
716 | MODULE_FIRMWARE(FIRMWARE_8105E_1); | 756 | MODULE_FIRMWARE(FIRMWARE_8105E_1); |
757 | MODULE_FIRMWARE(FIRMWARE_8168F_1); | ||
758 | MODULE_FIRMWARE(FIRMWARE_8168F_2); | ||
717 | 759 | ||
718 | static int rtl8169_open(struct net_device *dev); | 760 | static int rtl8169_open(struct net_device *dev); |
719 | static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | 761 | static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, |
@@ -732,6 +774,19 @@ static void rtl8169_down(struct net_device *dev); | |||
732 | static void rtl8169_rx_clear(struct rtl8169_private *tp); | 774 | static void rtl8169_rx_clear(struct rtl8169_private *tp); |
733 | static int rtl8169_poll(struct napi_struct *napi, int budget); | 775 | static int rtl8169_poll(struct napi_struct *napi, int budget); |
734 | 776 | ||
777 | static 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 | |||
735 | static u32 ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg) | 790 | static 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 | ||
1488 | static u32 rtl8169_fix_features(struct net_device *dev, u32 features) | 1556 | static 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 | ||
2956 | static 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 | |||
3023 | static 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 | |||
2878 | static void rtl8102e_hw_phy_config(struct rtl8169_private *tp) | 3047 | static 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 | ||
3486 | static void rtl_pll_power_op(struct rtl8169_private *tp, | 3661 | static 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 | ||
3493 | static void rtl_pll_power_down(struct rtl8169_private *tp) | 3668 | static 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 | ||
3498 | static void rtl_pll_power_up(struct rtl8169_private *tp) | 3673 | static 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 | ||
3503 | static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp) | 3678 | static 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 | ||
3766 | static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) | ||
3767 | { | ||
3768 | rtl_generic_op(tp, tp->jumbo_ops.enable); | ||
3769 | } | ||
3770 | |||
3771 | static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) | ||
3772 | { | ||
3773 | rtl_generic_op(tp, tp->jumbo_ops.disable); | ||
3774 | } | ||
3775 | |||
3776 | static 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 | |||
3785 | static 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 | |||
3794 | static 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 | |||
3801 | static 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 | |||
3808 | static 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 | |||
3819 | static 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 | |||
3830 | static 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 | |||
3836 | static 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 | |||
3842 | static 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 | |||
3851 | static 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 | |||
3860 | static 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 | |||
3589 | static void rtl_hw_reset(struct rtl8169_private *tp) | 3910 | static 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 | ||
4170 | static 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 | |||
4183 | static void rtl_csi_access_enable(void __iomem *ioaddr, u32 bits) | 4500 | static 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 | |||
4814 | static 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 | ||
4760 | static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) | 5125 | static 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 |