r8169_main.c 172.4 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
L
Linus Torvalds 已提交
2
/*
F
Francois Romieu 已提交
3 4 5 6 7 8 9
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
 *
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
 * Copyright (c) a lot of people too. Please respect their work.
 *
 * See MAINTAINERS file for support contact information.
L
Linus Torvalds 已提交
10 11 12 13 14 15 16
 */

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/pci.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
17
#include <linux/clk.h>
L
Linus Torvalds 已提交
18 19
#include <linux/delay.h>
#include <linux/ethtool.h>
20
#include <linux/phy.h>
L
Linus Torvalds 已提交
21 22 23
#include <linux/if_vlan.h>
#include <linux/crc32.h>
#include <linux/in.h>
24
#include <linux/io.h>
L
Linus Torvalds 已提交
25 26
#include <linux/ip.h>
#include <linux/tcp.h>
27
#include <linux/interrupt.h>
L
Linus Torvalds 已提交
28
#include <linux/dma-mapping.h>
29
#include <linux/pm_runtime.h>
30
#include <linux/prefetch.h>
H
Heiner Kallweit 已提交
31
#include <linux/pci-aspm.h>
H
hayeswang 已提交
32 33
#include <linux/ipv6.h>
#include <net/ip6_checksum.h>
L
Linus Torvalds 已提交
34

35 36
#include "r8169_firmware.h"

L
Linus Torvalds 已提交
37 38
#define MODULENAME "r8169"

39 40
#define FIRMWARE_8168D_1	"rtl_nic/rtl8168d-1.fw"
#define FIRMWARE_8168D_2	"rtl_nic/rtl8168d-2.fw"
H
hayeswang 已提交
41 42
#define FIRMWARE_8168E_1	"rtl_nic/rtl8168e-1.fw"
#define FIRMWARE_8168E_2	"rtl_nic/rtl8168e-2.fw"
H
Hayes Wang 已提交
43
#define FIRMWARE_8168E_3	"rtl_nic/rtl8168e-3.fw"
44 45
#define FIRMWARE_8168F_1	"rtl_nic/rtl8168f-1.fw"
#define FIRMWARE_8168F_2	"rtl_nic/rtl8168f-2.fw"
46
#define FIRMWARE_8105E_1	"rtl_nic/rtl8105e-1.fw"
47
#define FIRMWARE_8402_1		"rtl_nic/rtl8402-1.fw"
48
#define FIRMWARE_8411_1		"rtl_nic/rtl8411-1.fw"
H
hayeswang 已提交
49
#define FIRMWARE_8411_2		"rtl_nic/rtl8411-2.fw"
H
Hayes Wang 已提交
50
#define FIRMWARE_8106E_1	"rtl_nic/rtl8106e-1.fw"
H
hayeswang 已提交
51
#define FIRMWARE_8106E_2	"rtl_nic/rtl8106e-2.fw"
52
#define FIRMWARE_8168G_2	"rtl_nic/rtl8168g-2.fw"
H
hayeswang 已提交
53
#define FIRMWARE_8168G_3	"rtl_nic/rtl8168g-3.fw"
54 55 56 57
#define FIRMWARE_8168H_1	"rtl_nic/rtl8168h-1.fw"
#define FIRMWARE_8168H_2	"rtl_nic/rtl8168h-2.fw"
#define FIRMWARE_8107E_1	"rtl_nic/rtl8107e-1.fw"
#define FIRMWARE_8107E_2	"rtl_nic/rtl8107e-2.fw"
58

59
#define R8169_MSG_DEFAULT \
60
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
61

L
Linus Torvalds 已提交
62 63
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
H
Heiner Kallweit 已提交
64
#define	MC_FILTER_LIMIT	32
L
Linus Torvalds 已提交
65

66
#define TX_DMA_BURST	7	/* Maximum PCI burst, '7' is unlimited */
L
Linus Torvalds 已提交
67 68 69
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */

#define R8169_REGS_SIZE		256
70
#define R8169_RX_BUF_SIZE	(SZ_16K - 1)
L
Linus Torvalds 已提交
71
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
72
#define NUM_RX_DESC	256U	/* Number of Rx descriptor registers */
L
Linus Torvalds 已提交
73 74 75
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))

76 77
#define RTL_CFG_NO_GBIT	1

L
Linus Torvalds 已提交
78
/* write/read MMIO register */
79 80 81 82 83 84
#define RTL_W8(tp, reg, val8)	writeb((val8), tp->mmio_addr + (reg))
#define RTL_W16(tp, reg, val16)	writew((val16), tp->mmio_addr + (reg))
#define RTL_W32(tp, reg, val32)	writel((val32), tp->mmio_addr + (reg))
#define RTL_R8(tp, reg)		readb(tp->mmio_addr + (reg))
#define RTL_R16(tp, reg)		readw(tp->mmio_addr + (reg))
#define RTL_R32(tp, reg)		readl(tp->mmio_addr + (reg))
L
Linus Torvalds 已提交
85 86

enum mac_version {
87
	/* support for ancient RTL_GIGA_MAC_VER_01 has been removed */
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
	RTL_GIGA_MAC_VER_02,
	RTL_GIGA_MAC_VER_03,
	RTL_GIGA_MAC_VER_04,
	RTL_GIGA_MAC_VER_05,
	RTL_GIGA_MAC_VER_06,
	RTL_GIGA_MAC_VER_07,
	RTL_GIGA_MAC_VER_08,
	RTL_GIGA_MAC_VER_09,
	RTL_GIGA_MAC_VER_10,
	RTL_GIGA_MAC_VER_11,
	RTL_GIGA_MAC_VER_12,
	RTL_GIGA_MAC_VER_13,
	RTL_GIGA_MAC_VER_14,
	RTL_GIGA_MAC_VER_15,
	RTL_GIGA_MAC_VER_16,
	RTL_GIGA_MAC_VER_17,
	RTL_GIGA_MAC_VER_18,
	RTL_GIGA_MAC_VER_19,
	RTL_GIGA_MAC_VER_20,
	RTL_GIGA_MAC_VER_21,
	RTL_GIGA_MAC_VER_22,
	RTL_GIGA_MAC_VER_23,
	RTL_GIGA_MAC_VER_24,
	RTL_GIGA_MAC_VER_25,
	RTL_GIGA_MAC_VER_26,
	RTL_GIGA_MAC_VER_27,
	RTL_GIGA_MAC_VER_28,
	RTL_GIGA_MAC_VER_29,
	RTL_GIGA_MAC_VER_30,
	RTL_GIGA_MAC_VER_31,
	RTL_GIGA_MAC_VER_32,
	RTL_GIGA_MAC_VER_33,
H
Hayes Wang 已提交
120
	RTL_GIGA_MAC_VER_34,
121 122
	RTL_GIGA_MAC_VER_35,
	RTL_GIGA_MAC_VER_36,
123
	RTL_GIGA_MAC_VER_37,
124
	RTL_GIGA_MAC_VER_38,
H
Hayes Wang 已提交
125
	RTL_GIGA_MAC_VER_39,
H
Hayes Wang 已提交
126 127
	RTL_GIGA_MAC_VER_40,
	RTL_GIGA_MAC_VER_41,
H
hayeswang 已提交
128
	RTL_GIGA_MAC_VER_42,
H
hayeswang 已提交
129
	RTL_GIGA_MAC_VER_43,
H
hayeswang 已提交
130
	RTL_GIGA_MAC_VER_44,
131 132 133 134
	RTL_GIGA_MAC_VER_45,
	RTL_GIGA_MAC_VER_46,
	RTL_GIGA_MAC_VER_47,
	RTL_GIGA_MAC_VER_48,
C
Chun-Hao Lin 已提交
135 136 137
	RTL_GIGA_MAC_VER_49,
	RTL_GIGA_MAC_VER_50,
	RTL_GIGA_MAC_VER_51,
138
	RTL_GIGA_MAC_NONE
L
Linus Torvalds 已提交
139 140
};

F
Francois Romieu 已提交
141 142 143 144 145 146
#define JUMBO_1K	ETH_DATA_LEN
#define JUMBO_4K	(4*1024 - ETH_HLEN - 2)
#define JUMBO_6K	(6*1024 - ETH_HLEN - 2)
#define JUMBO_7K	(7*1024 - ETH_HLEN - 2)
#define JUMBO_9K	(9*1024 - ETH_HLEN - 2)

147
static const struct {
L
Linus Torvalds 已提交
148
	const char *name;
149
	const char *fw_name;
150 151
} rtl_chip_infos[] = {
	/* PCI devices. */
152 153 154 155 156
	[RTL_GIGA_MAC_VER_02] = {"RTL8169s"				},
	[RTL_GIGA_MAC_VER_03] = {"RTL8110s"				},
	[RTL_GIGA_MAC_VER_04] = {"RTL8169sb/8110sb"			},
	[RTL_GIGA_MAC_VER_05] = {"RTL8169sc/8110sc"			},
	[RTL_GIGA_MAC_VER_06] = {"RTL8169sc/8110sc"			},
157
	/* PCI-E devices. */
158 159
	[RTL_GIGA_MAC_VER_07] = {"RTL8102e"				},
	[RTL_GIGA_MAC_VER_08] = {"RTL8102e"				},
160
	[RTL_GIGA_MAC_VER_09] = {"RTL8102e/RTL8103e"			},
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	[RTL_GIGA_MAC_VER_10] = {"RTL8101e"				},
	[RTL_GIGA_MAC_VER_11] = {"RTL8168b/8111b"			},
	[RTL_GIGA_MAC_VER_12] = {"RTL8168b/8111b"			},
	[RTL_GIGA_MAC_VER_13] = {"RTL8101e"				},
	[RTL_GIGA_MAC_VER_14] = {"RTL8100e"				},
	[RTL_GIGA_MAC_VER_15] = {"RTL8100e"				},
	[RTL_GIGA_MAC_VER_16] = {"RTL8101e"				},
	[RTL_GIGA_MAC_VER_17] = {"RTL8168b/8111b"			},
	[RTL_GIGA_MAC_VER_18] = {"RTL8168cp/8111cp"			},
	[RTL_GIGA_MAC_VER_19] = {"RTL8168c/8111c"			},
	[RTL_GIGA_MAC_VER_20] = {"RTL8168c/8111c"			},
	[RTL_GIGA_MAC_VER_21] = {"RTL8168c/8111c"			},
	[RTL_GIGA_MAC_VER_22] = {"RTL8168c/8111c"			},
	[RTL_GIGA_MAC_VER_23] = {"RTL8168cp/8111cp"			},
	[RTL_GIGA_MAC_VER_24] = {"RTL8168cp/8111cp"			},
	[RTL_GIGA_MAC_VER_25] = {"RTL8168d/8111d",	FIRMWARE_8168D_1},
	[RTL_GIGA_MAC_VER_26] = {"RTL8168d/8111d",	FIRMWARE_8168D_2},
	[RTL_GIGA_MAC_VER_27] = {"RTL8168dp/8111dp"			},
	[RTL_GIGA_MAC_VER_28] = {"RTL8168dp/8111dp"			},
	[RTL_GIGA_MAC_VER_29] = {"RTL8105e",		FIRMWARE_8105E_1},
	[RTL_GIGA_MAC_VER_30] = {"RTL8105e",		FIRMWARE_8105E_1},
	[RTL_GIGA_MAC_VER_31] = {"RTL8168dp/8111dp"			},
	[RTL_GIGA_MAC_VER_32] = {"RTL8168e/8111e",	FIRMWARE_8168E_1},
	[RTL_GIGA_MAC_VER_33] = {"RTL8168e/8111e",	FIRMWARE_8168E_2},
	[RTL_GIGA_MAC_VER_34] = {"RTL8168evl/8111evl",	FIRMWARE_8168E_3},
	[RTL_GIGA_MAC_VER_35] = {"RTL8168f/8111f",	FIRMWARE_8168F_1},
	[RTL_GIGA_MAC_VER_36] = {"RTL8168f/8111f",	FIRMWARE_8168F_2},
	[RTL_GIGA_MAC_VER_37] = {"RTL8402",		FIRMWARE_8402_1 },
	[RTL_GIGA_MAC_VER_38] = {"RTL8411",		FIRMWARE_8411_1 },
	[RTL_GIGA_MAC_VER_39] = {"RTL8106e",		FIRMWARE_8106E_1},
	[RTL_GIGA_MAC_VER_40] = {"RTL8168g/8111g",	FIRMWARE_8168G_2},
	[RTL_GIGA_MAC_VER_41] = {"RTL8168g/8111g"			},
193 194 195
	[RTL_GIGA_MAC_VER_42] = {"RTL8168gu/8111gu",	FIRMWARE_8168G_3},
	[RTL_GIGA_MAC_VER_43] = {"RTL8106eus",		FIRMWARE_8106E_2},
	[RTL_GIGA_MAC_VER_44] = {"RTL8411b",		FIRMWARE_8411_2 },
196 197 198 199 200 201 202
	[RTL_GIGA_MAC_VER_45] = {"RTL8168h/8111h",	FIRMWARE_8168H_1},
	[RTL_GIGA_MAC_VER_46] = {"RTL8168h/8111h",	FIRMWARE_8168H_2},
	[RTL_GIGA_MAC_VER_47] = {"RTL8107e",		FIRMWARE_8107E_1},
	[RTL_GIGA_MAC_VER_48] = {"RTL8107e",		FIRMWARE_8107E_2},
	[RTL_GIGA_MAC_VER_49] = {"RTL8168ep/8111ep"			},
	[RTL_GIGA_MAC_VER_50] = {"RTL8168ep/8111ep"			},
	[RTL_GIGA_MAC_VER_51] = {"RTL8168ep/8111ep"			},
203 204
};

205
static const struct pci_device_id rtl8169_pci_tbl[] = {
206 207 208 209 210 211 212 213 214
	{ PCI_VDEVICE(REALTEK,	0x2502) },
	{ PCI_VDEVICE(REALTEK,	0x2600) },
	{ PCI_VDEVICE(REALTEK,	0x8129) },
	{ PCI_VDEVICE(REALTEK,	0x8136), RTL_CFG_NO_GBIT },
	{ PCI_VDEVICE(REALTEK,	0x8161) },
	{ PCI_VDEVICE(REALTEK,	0x8167) },
	{ PCI_VDEVICE(REALTEK,	0x8168) },
	{ PCI_VDEVICE(NCUBE,	0x8168) },
	{ PCI_VDEVICE(REALTEK,	0x8169) },
H
Heiner Kallweit 已提交
215
	{ PCI_VENDOR_ID_DLINK,	0x4300,
216
		PCI_VENDOR_ID_DLINK, 0x4b10, 0, 0 },
217 218 219 220 221 222
	{ PCI_VDEVICE(DLINK,	0x4300) },
	{ PCI_VDEVICE(DLINK,	0x4302) },
	{ PCI_VDEVICE(AT,	0xc107) },
	{ PCI_VDEVICE(USR,	0x0116) },
	{ PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0024 },
	{ 0x0001, 0x8168, PCI_ANY_ID, 0x2410 },
H
Heiner Kallweit 已提交
223
	{}
L
Linus Torvalds 已提交
224 225 226 227
};

MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);

228 229 230
static struct {
	u32 msg_enable;
} debug = { -1 };
L
Linus Torvalds 已提交
231

F
Francois Romieu 已提交
232 233
enum rtl_registers {
	MAC0		= 0,	/* Ethernet hardware address. */
234
	MAC4		= 4,
F
Francois Romieu 已提交
235 236 237 238 239 240 241 242 243 244 245 246 247
	MAR0		= 8,	/* Multicast filter. */
	CounterAddrLow		= 0x10,
	CounterAddrHigh		= 0x14,
	TxDescStartAddrLow	= 0x20,
	TxDescStartAddrHigh	= 0x24,
	TxHDescStartAddrLow	= 0x28,
	TxHDescStartAddrHigh	= 0x2c,
	FLASH		= 0x30,
	ERSR		= 0x36,
	ChipCmd		= 0x37,
	TxPoll		= 0x38,
	IntrMask	= 0x3c,
	IntrStatus	= 0x3e,
H
Hayes Wang 已提交
248

F
Francois Romieu 已提交
249
	TxConfig	= 0x40,
H
Hayes Wang 已提交
250 251
#define	TXCFG_AUTO_FIFO			(1 << 7)	/* 8111e-vl */
#define	TXCFG_EMPTY			(1 << 11)	/* 8111e-vl */
F
Francois Romieu 已提交
252

H
Hayes Wang 已提交
253 254 255 256 257 258
	RxConfig	= 0x44,
#define	RX128_INT_EN			(1 << 15)	/* 8111c and later */
#define	RX_MULTI_EN			(1 << 14)	/* 8111c only */
#define	RXCFG_FIFO_SHIFT		13
					/* No threshold before first PCI xfer */
#define	RX_FIFO_THRESH			(7 << RXCFG_FIFO_SHIFT)
259
#define	RX_EARLY_OFF			(1 << 11)
H
Hayes Wang 已提交
260 261 262
#define	RXCFG_DMA_SHIFT			8
					/* Unlimited maximum PCI burst. */
#define	RX_DMA_BURST			(7 << RXCFG_DMA_SHIFT)
F
Francois Romieu 已提交
263

F
Francois Romieu 已提交
264 265 266 267 268
	RxMissed	= 0x4c,
	Cfg9346		= 0x50,
	Config0		= 0x51,
	Config1		= 0x52,
	Config2		= 0x53,
269 270
#define PME_SIGNAL			(1 << 5)	/* 8168c and later */

F
Francois Romieu 已提交
271 272 273 274 275 276 277 278
	Config3		= 0x54,
	Config4		= 0x55,
	Config5		= 0x56,
	PHYAR		= 0x60,
	PHYstatus	= 0x6c,
	RxMaxSize	= 0xda,
	CPlusCmd	= 0xe0,
	IntrMitigate	= 0xe2,
279 280 281 282 283 284

#define RTL_COALESCE_MASK	0x0f
#define RTL_COALESCE_SHIFT	4
#define RTL_COALESCE_T_MAX	(RTL_COALESCE_MASK)
#define RTL_COALESCE_FRAME_MAX	(RTL_COALESCE_MASK << 2)

F
Francois Romieu 已提交
285 286
	RxDescAddrLow	= 0xe4,
	RxDescAddrHigh	= 0xe8,
287 288 289 290 291 292 293
	EarlyTxThres	= 0xec,	/* 8169. Unit of 32 bytes. */

#define NoEarlyTx	0x3f	/* Max value : no early transmit. */

	MaxTxPacketSize	= 0xec,	/* 8101/8168. Unit of 128 bytes. */

#define TxPacketMax	(8064 >> 7)
294
#define EarlySize	0x27
295

F
Francois Romieu 已提交
296 297 298
	FuncEvent	= 0xf0,
	FuncEventMask	= 0xf4,
	FuncPresetState	= 0xf8,
C
Chun-Hao Lin 已提交
299 300 301 302
	IBCR0           = 0xf8,
	IBCR2           = 0xf9,
	IBIMR0          = 0xfa,
	IBISR0          = 0xfb,
F
Francois Romieu 已提交
303
	FuncForceEvent	= 0xfc,
L
Linus Torvalds 已提交
304 305
};

306 307 308 309 310
enum rtl8168_8101_registers {
	CSIDR			= 0x64,
	CSIAR			= 0x68,
#define	CSIAR_FLAG			0x80000000
#define	CSIAR_WRITE_CMD			0x80000000
311 312
#define	CSIAR_BYTE_ENABLE		0x0000f000
#define	CSIAR_ADDR_MASK			0x00000fff
F
françois romieu 已提交
313
	PMCH			= 0x6f,
314 315 316 317 318 319
	EPHYAR			= 0x80,
#define	EPHYAR_FLAG			0x80000000
#define	EPHYAR_WRITE_CMD		0x80000000
#define	EPHYAR_REG_MASK			0x1f
#define	EPHYAR_REG_SHIFT		16
#define	EPHYAR_DATA_MASK		0xffff
320
	DLLPR			= 0xd0,
H
Hayes Wang 已提交
321
#define	PFM_EN				(1 << 6)
322
#define	TX_10M_PS_EN			(1 << 7)
323 324 325
	DBG_REG			= 0xd1,
#define	FIX_NAK_1			(1 << 4)
#define	FIX_NAK_2			(1 << 3)
326 327
	TWSI			= 0xd2,
	MCU			= 0xd3,
H
Hayes Wang 已提交
328
#define	NOW_IS_OOB			(1 << 7)
H
Hayes Wang 已提交
329 330 331
#define	TX_EMPTY			(1 << 5)
#define	RX_EMPTY			(1 << 4)
#define	RXTX_EMPTY			(TX_EMPTY | RX_EMPTY)
332 333
#define	EN_NDP				(1 << 3)
#define	EN_OOB_RESET			(1 << 2)
H
Hayes Wang 已提交
334
#define	LINK_LIST_RDY			(1 << 1)
335 336 337 338 339 340 341
	EFUSEAR			= 0xdc,
#define	EFUSEAR_FLAG			0x80000000
#define	EFUSEAR_WRITE_CMD		0x80000000
#define	EFUSEAR_READ_CMD		0x00000000
#define	EFUSEAR_REG_MASK		0x03ff
#define	EFUSEAR_REG_SHIFT		8
#define	EFUSEAR_DATA_MASK		0xff
342 343
	MISC_1			= 0xf2,
#define	PFM_D3COLD_EN			(1 << 6)
344 345
};

346
enum rtl8168_registers {
H
Hayes Wang 已提交
347 348
	LED_FREQ		= 0x1a,
	EEE_LED			= 0x1b,
F
françois romieu 已提交
349 350 351 352 353 354 355
	ERIDR			= 0x70,
	ERIAR			= 0x74,
#define ERIAR_FLAG			0x80000000
#define ERIAR_WRITE_CMD			0x80000000
#define ERIAR_READ_CMD			0x00000000
#define ERIAR_ADDR_BYTE_ALIGN		4
#define ERIAR_TYPE_SHIFT		16
H
Hayes Wang 已提交
356 357 358
#define ERIAR_EXGMAC			(0x00 << ERIAR_TYPE_SHIFT)
#define ERIAR_MSIX			(0x01 << ERIAR_TYPE_SHIFT)
#define ERIAR_ASF			(0x02 << ERIAR_TYPE_SHIFT)
C
Chun-Hao Lin 已提交
359
#define ERIAR_OOB			(0x02 << ERIAR_TYPE_SHIFT)
H
Hayes Wang 已提交
360 361 362
#define ERIAR_MASK_SHIFT		12
#define ERIAR_MASK_0001			(0x1 << ERIAR_MASK_SHIFT)
#define ERIAR_MASK_0011			(0x3 << ERIAR_MASK_SHIFT)
363
#define ERIAR_MASK_0100			(0x4 << ERIAR_MASK_SHIFT)
H
Hayes Wang 已提交
364
#define ERIAR_MASK_0101			(0x5 << ERIAR_MASK_SHIFT)
H
Hayes Wang 已提交
365
#define ERIAR_MASK_1111			(0xf << ERIAR_MASK_SHIFT)
366 367 368 369 370 371 372 373 374 375 376
	EPHY_RXER_NUM		= 0x7c,
	OCPDR			= 0xb0,	/* OCP GPHY access */
#define OCPDR_WRITE_CMD			0x80000000
#define OCPDR_READ_CMD			0x00000000
#define OCPDR_REG_MASK			0x7f
#define OCPDR_GPHY_REG_SHIFT		16
#define OCPDR_DATA_MASK			0xffff
	OCPAR			= 0xb4,
#define OCPAR_FLAG			0x80000000
#define OCPAR_GPHY_WRITE_CMD		0x8000f060
#define OCPAR_GPHY_READ_CMD		0x0000f060
H
Hayes Wang 已提交
377
	GPHY_OCP		= 0xb8,
H
hayeswang 已提交
378 379
	RDSAR1			= 0xd0,	/* 8168c only. Undocumented on 8168dp */
	MISC			= 0xf0,	/* 8168e only. */
F
Francois Romieu 已提交
380
#define TXPLA_RST			(1 << 29)
H
Hayes Wang 已提交
381
#define DISABLE_LAN_EN			(1 << 23) /* Enable GPIO pin */
H
Hayes Wang 已提交
382
#define PWM_EN				(1 << 22)
H
Hayes Wang 已提交
383
#define RXDV_GATED_EN			(1 << 19)
H
Hayes Wang 已提交
384
#define EARLY_TALLY_EN			(1 << 16)
385 386
};

F
Francois Romieu 已提交
387
enum rtl_register_content {
L
Linus Torvalds 已提交
388
	/* InterruptStatusBits */
F
Francois Romieu 已提交
389 390 391 392 393 394 395 396 397 398 399
	SYSErr		= 0x8000,
	PCSTimeout	= 0x4000,
	SWInt		= 0x0100,
	TxDescUnavail	= 0x0080,
	RxFIFOOver	= 0x0040,
	LinkChg		= 0x0020,
	RxOverflow	= 0x0010,
	TxErr		= 0x0008,
	TxOK		= 0x0004,
	RxErr		= 0x0002,
	RxOK		= 0x0001,
L
Linus Torvalds 已提交
400 401

	/* RxStatusDesc */
402 403 404 405
	RxRWT	= (1 << 22),
	RxRES	= (1 << 21),
	RxRUNT	= (1 << 20),
	RxCRC	= (1 << 19),
L
Linus Torvalds 已提交
406 407

	/* ChipCmdBits */
H
Hayes Wang 已提交
408
	StopReq		= 0x80,
F
Francois Romieu 已提交
409 410 411 412
	CmdReset	= 0x10,
	CmdRxEnb	= 0x08,
	CmdTxEnb	= 0x04,
	RxBufEmpty	= 0x01,
L
Linus Torvalds 已提交
413

414 415 416 417 418
	/* TXPoll register p.5 */
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
	FSWInt		= 0x01,		/* Forced software interrupt */

L
Linus Torvalds 已提交
419
	/* Cfg9346Bits */
F
Francois Romieu 已提交
420 421
	Cfg9346_Lock	= 0x00,
	Cfg9346_Unlock	= 0xc0,
L
Linus Torvalds 已提交
422 423

	/* rx_mode_bits */
F
Francois Romieu 已提交
424 425 426 427 428 429
	AcceptErr	= 0x20,
	AcceptRunt	= 0x10,
	AcceptBroadcast	= 0x08,
	AcceptMulticast	= 0x04,
	AcceptMyPhys	= 0x02,
	AcceptAllPhys	= 0x01,
430
#define RX_CONFIG_ACCEPT_MASK		0x3f
L
Linus Torvalds 已提交
431 432 433 434 435

	/* TxConfigBits */
	TxInterFrameGapShift = 24,
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */

436
	/* Config1 register p.24 */
437 438 439 440 441 442
	LEDS1		= (1 << 7),
	LEDS0		= (1 << 6),
	Speed_down	= (1 << 4),
	MEMMAP		= (1 << 3),
	IOMAP		= (1 << 2),
	VPD		= (1 << 1),
443 444
	PMEnable	= (1 << 0),	/* Power Management Enable */

445
	/* Config2 register p. 25 */
H
hayeswang 已提交
446
	ClkReqEn	= (1 << 7),	/* Clock Request Enable */
447
	MSIEnable	= (1 << 5),	/* 8169 only. Reserved in the 8168. */
448 449 450
	PCI_Clock_66MHz = 0x01,
	PCI_Clock_33MHz = 0x00,

F
Francois Romieu 已提交
451 452 453
	/* Config3 register p.25 */
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
F
Francois Romieu 已提交
454
	Jumbo_En0	= (1 << 2),	/* 8168 only. Reserved in the 8168b */
H
hayeswang 已提交
455
	Rdy_to_L23	= (1 << 1),	/* L23 Enable */
456
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
F
Francois Romieu 已提交
457

F
Francois Romieu 已提交
458 459 460
	/* Config4 register */
	Jumbo_En1	= (1 << 1),	/* 8168 only. Reserved in the 8168b */

461
	/* Config5 register p.27 */
F
Francois Romieu 已提交
462 463 464
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
F
Francois Romieu 已提交
465
	Spi_en		= (1 << 3),
F
Francois Romieu 已提交
466
	LanWake		= (1 << 1),	/* LanWake enable/disable */
467
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
H
hayeswang 已提交
468
	ASPM_en		= (1 << 0),	/* ASPM enable */
469

L
Linus Torvalds 已提交
470
	/* CPlusCmd p.31 */
471 472 473 474 475 476 477 478 479 480
	EnableBist	= (1 << 15),	// 8168 8101
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
	Normal_mode	= (1 << 13),	// unused
	Force_half_dup	= (1 << 12),	// 8168 8101
	Force_rxflow_en	= (1 << 11),	// 8168 8101
	Force_txflow_en	= (1 << 10),	// 8168 8101
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
	ASF		= (1 << 8),	// 8168 8101
	PktCntrDisable	= (1 << 7),	// 8168 8101
	Mac_dbgo_sel	= 0x001c,	// 8168
L
Linus Torvalds 已提交
481 482 483 484
	RxVlan		= (1 << 6),
	RxChkSum	= (1 << 5),
	PCIDAC		= (1 << 4),
	PCIMulRW	= (1 << 3),
485
#define INTT_MASK	GENMASK(1, 0)
486
#define CPCMD_MASK	(Normal_mode | RxVlan | RxChkSum | INTT_MASK)
L
Linus Torvalds 已提交
487 488

	/* rtl8169_PHYstatus */
F
Francois Romieu 已提交
489 490 491 492 493 494 495 496
	TBI_Enable	= 0x80,
	TxFlowCtrl	= 0x40,
	RxFlowCtrl	= 0x20,
	_1000bpsF	= 0x10,
	_100bps		= 0x08,
	_10bps		= 0x04,
	LinkStatus	= 0x02,
	FullDup		= 0x01,
L
Linus Torvalds 已提交
497

498 499 500
	/* ResetCounterCommand */
	CounterReset	= 0x1,

501
	/* DumpCounterCommand */
F
Francois Romieu 已提交
502
	CounterDump	= 0x8,
503 504 505

	/* magic enable v2 */
	MagicPacket_v2	= (1 << 16),	/* Wake up when receives a Magic Packet */
L
Linus Torvalds 已提交
506 507
};

F
Francois Romieu 已提交
508 509
enum rtl_desc_bit {
	/* First doubleword. */
L
Linus Torvalds 已提交
510 511 512 513
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
	RingEnd		= (1 << 30), /* End of descriptor ring */
	FirstFrag	= (1 << 29), /* First segment of a packet */
	LastFrag	= (1 << 28), /* Final segment of a packet */
F
Francois Romieu 已提交
514 515 516 517 518 519 520
};

/* Generic case. */
enum rtl_tx_desc_bit {
	/* First doubleword. */
	TD_LSO		= (1 << 27),		/* Large Send Offload */
#define TD_MSS_MAX			0x07ffu	/* MSS value */
L
Linus Torvalds 已提交
521

F
Francois Romieu 已提交
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
	/* Second doubleword. */
	TxVlanTag	= (1 << 17),		/* Add VLAN tag */
};

/* 8169, 8168b and 810x except 8102e. */
enum rtl_tx_desc_bit_0 {
	/* First doubleword. */
#define TD0_MSS_SHIFT			16	/* MSS position (11 bits) */
	TD0_TCP_CS	= (1 << 16),		/* Calculate TCP/IP checksum */
	TD0_UDP_CS	= (1 << 17),		/* Calculate UDP/IP checksum */
	TD0_IP_CS	= (1 << 18),		/* Calculate IP checksum */
};

/* 8102e, 8168c and beyond. */
enum rtl_tx_desc_bit_1 {
H
hayeswang 已提交
537 538
	/* First doubleword. */
	TD1_GTSENV4	= (1 << 26),		/* Giant Send for IPv4 */
H
hayeswang 已提交
539
	TD1_GTSENV6	= (1 << 25),		/* Giant Send for IPv6 */
H
hayeswang 已提交
540
#define GTTCPHO_SHIFT			18
541
#define GTTCPHO_MAX			0x7f
H
hayeswang 已提交
542

F
Francois Romieu 已提交
543
	/* Second doubleword. */
H
hayeswang 已提交
544
#define TCPHO_SHIFT			18
545
#define TCPHO_MAX			0x3ff
F
Francois Romieu 已提交
546
#define TD1_MSS_SHIFT			18	/* MSS position (11 bits) */
H
hayeswang 已提交
547 548
	TD1_IPv6_CS	= (1 << 28),		/* Calculate IPv6 checksum */
	TD1_IPv4_CS	= (1 << 29),		/* Calculate IPv4 checksum */
F
Francois Romieu 已提交
549 550 551
	TD1_TCP_CS	= (1 << 30),		/* Calculate TCP/IP checksum */
	TD1_UDP_CS	= (1 << 31),		/* Calculate UDP/IP checksum */
};
L
Linus Torvalds 已提交
552

F
Francois Romieu 已提交
553
enum rtl_rx_desc_bit {
L
Linus Torvalds 已提交
554 555
	/* Rx private */
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
Z
Zhu Yanjun 已提交
556
	PID0		= (1 << 17), /* Protocol ID bit 0/2 */
L
Linus Torvalds 已提交
557 558 559 560 561 562 563 564 565 566 567 568 569 570

#define RxProtoUDP	(PID1)
#define RxProtoTCP	(PID0)
#define RxProtoIP	(PID1 | PID0)
#define RxProtoMask	RxProtoIP

	IPFail		= (1 << 16), /* IP checksum failed */
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
	RxVlanTag	= (1 << 16), /* VLAN tag available */
};

#define RsvdMask	0x3fffc000

571 572 573 574 575
#define RTL_GSO_MAX_SIZE_V1	32000
#define RTL_GSO_MAX_SEGS_V1	24
#define RTL_GSO_MAX_SIZE_V2	64000
#define RTL_GSO_MAX_SEGS_V2	64

L
Linus Torvalds 已提交
576
struct TxDesc {
577 578 579
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
580 581 582
};

struct RxDesc {
583 584 585
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
586 587 588 589 590 591 592
};

struct ring_info {
	struct sk_buff	*skb;
	u32		len;
};

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
struct rtl8169_counters {
	__le64	tx_packets;
	__le64	rx_packets;
	__le64	tx_errors;
	__le32	rx_errors;
	__le16	rx_missed;
	__le16	align_errors;
	__le32	tx_one_collision;
	__le32	tx_multi_collision;
	__le64	rx_unicast;
	__le64	rx_broadcast;
	__le32	rx_multicast;
	__le16	tx_aborted;
	__le16	tx_underun;
};

609 610 611 612 613 614 615
struct rtl8169_tc_offsets {
	bool	inited;
	__le64	tx_errors;
	__le32	tx_multi_collision;
	__le16	tx_aborted;
};

616
enum rtl_flag {
617
	RTL_FLAG_TASK_ENABLED = 0,
618 619 620 621
	RTL_FLAG_TASK_RESET_PENDING,
	RTL_FLAG_MAX
};

J
Junchang Wang 已提交
622 623 624 625 626 627
struct rtl8169_stats {
	u64			packets;
	u64			bytes;
	struct u64_stats_sync	syncp;
};

L
Linus Torvalds 已提交
628 629
struct rtl8169_private {
	void __iomem *mmio_addr;	/* memory map physical address */
F
Francois Romieu 已提交
630
	struct pci_dev *pci_dev;
D
David Howells 已提交
631
	struct net_device *dev;
632
	struct phy_device *phydev;
633
	struct napi_struct napi;
634
	u32 msg_enable;
635
	enum mac_version mac_version;
L
Linus Torvalds 已提交
636 637 638
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
	u32 dirty_tx;
J
Junchang Wang 已提交
639 640
	struct rtl8169_stats rx_stats;
	struct rtl8169_stats tx_stats;
L
Linus Torvalds 已提交
641 642 643 644
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
	dma_addr_t TxPhyAddr;
	dma_addr_t RxPhyAddr;
645
	struct page *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
L
Linus Torvalds 已提交
646 647
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
	u16 cp_cmd;
648
	u16 irq_mask;
649
	struct clk *clk;
650

651
	struct {
652 653
		DECLARE_BITMAP(flags, RTL_FLAG_MAX);
		struct mutex mutex;
654 655 656
		struct work_struct work;
	} wk;

657
	unsigned irq_enabled:1;
658
	unsigned supports_gmii:1;
659
	unsigned aspm_manageable:1;
660 661
	dma_addr_t counters_phys_addr;
	struct rtl8169_counters *counters;
662
	struct rtl8169_tc_offsets tc_offset;
663
	u32 saved_wolopts;
664

665
	const char *fw_name;
666
	struct rtl_fw *rtl_fw;
H
Hayes Wang 已提交
667 668

	u32 ocp_base;
L
Linus Torvalds 已提交
669 670
};

671 672
typedef void (*rtl_generic_fct)(struct rtl8169_private *tp);

673
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
L
Linus Torvalds 已提交
674
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
675 676
module_param_named(debug, debug.msg_enable, int, 0);
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
677
MODULE_SOFTDEP("pre: realtek");
L
Linus Torvalds 已提交
678
MODULE_LICENSE("GPL");
679 680
MODULE_FIRMWARE(FIRMWARE_8168D_1);
MODULE_FIRMWARE(FIRMWARE_8168D_2);
H
hayeswang 已提交
681 682
MODULE_FIRMWARE(FIRMWARE_8168E_1);
MODULE_FIRMWARE(FIRMWARE_8168E_2);
683
MODULE_FIRMWARE(FIRMWARE_8168E_3);
684
MODULE_FIRMWARE(FIRMWARE_8105E_1);
685 686
MODULE_FIRMWARE(FIRMWARE_8168F_1);
MODULE_FIRMWARE(FIRMWARE_8168F_2);
687
MODULE_FIRMWARE(FIRMWARE_8402_1);
688
MODULE_FIRMWARE(FIRMWARE_8411_1);
H
hayeswang 已提交
689
MODULE_FIRMWARE(FIRMWARE_8411_2);
H
Hayes Wang 已提交
690
MODULE_FIRMWARE(FIRMWARE_8106E_1);
H
hayeswang 已提交
691
MODULE_FIRMWARE(FIRMWARE_8106E_2);
692
MODULE_FIRMWARE(FIRMWARE_8168G_2);
H
hayeswang 已提交
693
MODULE_FIRMWARE(FIRMWARE_8168G_3);
694 695
MODULE_FIRMWARE(FIRMWARE_8168H_1);
MODULE_FIRMWARE(FIRMWARE_8168H_2);
696 697
MODULE_FIRMWARE(FIRMWARE_8107E_1);
MODULE_FIRMWARE(FIRMWARE_8107E_2);
L
Linus Torvalds 已提交
698

H
Heiner Kallweit 已提交
699 700 701 702 703
static inline struct device *tp_to_dev(struct rtl8169_private *tp)
{
	return &tp->pci_dev->dev;
}

704 705 706 707 708 709 710 711 712 713
static void rtl_lock_work(struct rtl8169_private *tp)
{
	mutex_lock(&tp->wk.mutex);
}

static void rtl_unlock_work(struct rtl8169_private *tp)
{
	mutex_unlock(&tp->wk.mutex);
}

714 715 716 717 718 719 720 721 722 723
static void rtl_lock_config_regs(struct rtl8169_private *tp)
{
	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
}

static void rtl_unlock_config_regs(struct rtl8169_private *tp)
{
	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
}

724
static void rtl_tx_performance_tweak(struct rtl8169_private *tp, u16 force)
F
Francois Romieu 已提交
725
{
726
	pcie_capability_clear_and_set_word(tp->pci_dev, PCI_EXP_DEVCTL,
727
					   PCI_EXP_DEVCTL_READRQ, force);
F
Francois Romieu 已提交
728 729
}

730 731 732 733 734 735
static bool rtl_is_8168evl_up(struct rtl8169_private *tp)
{
	return tp->mac_version >= RTL_GIGA_MAC_VER_34 &&
	       tp->mac_version != RTL_GIGA_MAC_VER_39;
}

736 737 738 739 740 741 742
static bool rtl_supports_eee(struct rtl8169_private *tp)
{
	return tp->mac_version >= RTL_GIGA_MAC_VER_34 &&
	       tp->mac_version != RTL_GIGA_MAC_VER_37 &&
	       tp->mac_version != RTL_GIGA_MAC_VER_39;
}

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
struct rtl_cond {
	bool (*check)(struct rtl8169_private *);
	const char *msg;
};

static void rtl_udelay(unsigned int d)
{
	udelay(d);
}

static bool rtl_loop_wait(struct rtl8169_private *tp, const struct rtl_cond *c,
			  void (*delay)(unsigned int), unsigned int d, int n,
			  bool high)
{
	int i;

	for (i = 0; i < n; i++) {
		if (c->check(tp) == high)
			return true;
H
Heiner Kallweit 已提交
762
		delay(d);
763
	}
F
Francois Romieu 已提交
764 765
	netif_err(tp, drv, tp->dev, "%s == %d (loop: %d, delay: %d).\n",
		  c->msg, !high, n, d);
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
	return false;
}

static bool rtl_udelay_loop_wait_high(struct rtl8169_private *tp,
				      const struct rtl_cond *c,
				      unsigned int d, int n)
{
	return rtl_loop_wait(tp, c, rtl_udelay, d, n, true);
}

static bool rtl_udelay_loop_wait_low(struct rtl8169_private *tp,
				     const struct rtl_cond *c,
				     unsigned int d, int n)
{
	return rtl_loop_wait(tp, c, rtl_udelay, d, n, false);
}

static bool rtl_msleep_loop_wait_high(struct rtl8169_private *tp,
				      const struct rtl_cond *c,
				      unsigned int d, int n)
{
	return rtl_loop_wait(tp, c, msleep, d, n, true);
}

static bool rtl_msleep_loop_wait_low(struct rtl8169_private *tp,
				     const struct rtl_cond *c,
				     unsigned int d, int n)
{
	return rtl_loop_wait(tp, c, msleep, d, n, false);
}

#define DECLARE_RTL_COND(name)				\
static bool name ## _check(struct rtl8169_private *);	\
							\
static const struct rtl_cond name = {			\
	.check	= name ## _check,			\
	.msg	= #name					\
};							\
							\
static bool name ## _check(struct rtl8169_private *tp)

H
Hayes Wang 已提交
807 808 809 810 811 812 813 814 815 816 817
static bool rtl_ocp_reg_failure(struct rtl8169_private *tp, u32 reg)
{
	if (reg & 0xffff0001) {
		netif_err(tp, drv, tp->dev, "Invalid ocp reg %x!\n", reg);
		return true;
	}
	return false;
}

DECLARE_RTL_COND(rtl_ocp_gphy_cond)
{
818
	return RTL_R32(tp, GPHY_OCP) & OCPAR_FLAG;
H
Hayes Wang 已提交
819 820 821 822 823 824 825
}

static void r8168_phy_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
{
	if (rtl_ocp_reg_failure(tp, reg))
		return;

826
	RTL_W32(tp, GPHY_OCP, OCPAR_FLAG | (reg << 15) | data);
H
Hayes Wang 已提交
827 828 829 830

	rtl_udelay_loop_wait_low(tp, &rtl_ocp_gphy_cond, 25, 10);
}

831
static int r8168_phy_ocp_read(struct rtl8169_private *tp, u32 reg)
H
Hayes Wang 已提交
832 833 834 835
{
	if (rtl_ocp_reg_failure(tp, reg))
		return 0;

836
	RTL_W32(tp, GPHY_OCP, reg << 15);
H
Hayes Wang 已提交
837 838

	return rtl_udelay_loop_wait_high(tp, &rtl_ocp_gphy_cond, 25, 10) ?
839
		(RTL_R32(tp, GPHY_OCP) & 0xffff) : -ETIMEDOUT;
H
Hayes Wang 已提交
840 841 842 843 844 845 846
}

static void r8168_mac_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
{
	if (rtl_ocp_reg_failure(tp, reg))
		return;

847
	RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
H
Hayes Wang 已提交
848 849 850 851 852 853 854
}

static u16 r8168_mac_ocp_read(struct rtl8169_private *tp, u32 reg)
{
	if (rtl_ocp_reg_failure(tp, reg))
		return 0;

855
	RTL_W32(tp, OCPDR, reg << 15);
H
Hayes Wang 已提交
856

857
	return RTL_R32(tp, OCPDR);
H
Hayes Wang 已提交
858 859
}

860 861 862 863 864 865 866 867
static void r8168_mac_ocp_modify(struct rtl8169_private *tp, u32 reg, u16 mask,
				 u16 set)
{
	u16 data = r8168_mac_ocp_read(tp, reg);

	r8168_mac_ocp_write(tp, reg, (data & ~mask) | set);
}

H
Hayes Wang 已提交
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890
#define OCP_STD_PHY_BASE	0xa400

static void r8168g_mdio_write(struct rtl8169_private *tp, int reg, int value)
{
	if (reg == 0x1f) {
		tp->ocp_base = value ? value << 4 : OCP_STD_PHY_BASE;
		return;
	}

	if (tp->ocp_base != OCP_STD_PHY_BASE)
		reg -= 0x10;

	r8168_phy_ocp_write(tp, tp->ocp_base + reg * 2, value);
}

static int r8168g_mdio_read(struct rtl8169_private *tp, int reg)
{
	if (tp->ocp_base != OCP_STD_PHY_BASE)
		reg -= 0x10;

	return r8168_phy_ocp_read(tp, tp->ocp_base + reg * 2);
}

891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
static void mac_mcu_write(struct rtl8169_private *tp, int reg, int value)
{
	if (reg == 0x1f) {
		tp->ocp_base = value << 4;
		return;
	}

	r8168_mac_ocp_write(tp, tp->ocp_base + reg, value);
}

static int mac_mcu_read(struct rtl8169_private *tp, int reg)
{
	return r8168_mac_ocp_read(tp, tp->ocp_base + reg);
}

906 907
DECLARE_RTL_COND(rtl_phyar_cond)
{
908
	return RTL_R32(tp, PHYAR) & 0x80000000;
909 910
}

911
static void r8169_mdio_write(struct rtl8169_private *tp, int reg, int value)
L
Linus Torvalds 已提交
912
{
913
	RTL_W32(tp, PHYAR, 0x80000000 | (reg & 0x1f) << 16 | (value & 0xffff));
L
Linus Torvalds 已提交
914

915
	rtl_udelay_loop_wait_low(tp, &rtl_phyar_cond, 25, 20);
916
	/*
917 918
	 * According to hardware specs a 20us delay is required after write
	 * complete indication, but before sending next command.
919
	 */
920
	udelay(20);
L
Linus Torvalds 已提交
921 922
}

923
static int r8169_mdio_read(struct rtl8169_private *tp, int reg)
L
Linus Torvalds 已提交
924
{
925
	int value;
L
Linus Torvalds 已提交
926

927
	RTL_W32(tp, PHYAR, 0x0 | (reg & 0x1f) << 16);
L
Linus Torvalds 已提交
928

929
	value = rtl_udelay_loop_wait_high(tp, &rtl_phyar_cond, 25, 20) ?
930
		RTL_R32(tp, PHYAR) & 0xffff : -ETIMEDOUT;
931

932 933 934 935 936 937
	/*
	 * According to hardware specs a 20us delay is required after read
	 * complete indication, but before sending next command.
	 */
	udelay(20);

L
Linus Torvalds 已提交
938 939 940
	return value;
}

C
Chun-Hao Lin 已提交
941 942
DECLARE_RTL_COND(rtl_ocpar_cond)
{
943
	return RTL_R32(tp, OCPAR) & OCPAR_FLAG;
C
Chun-Hao Lin 已提交
944 945
}

946
static void r8168dp_1_mdio_access(struct rtl8169_private *tp, int reg, u32 data)
947
{
948 949 950
	RTL_W32(tp, OCPDR, data | ((reg & OCPDR_REG_MASK) << OCPDR_GPHY_REG_SHIFT));
	RTL_W32(tp, OCPAR, OCPAR_GPHY_WRITE_CMD);
	RTL_W32(tp, EPHY_RXER_NUM, 0);
951

952
	rtl_udelay_loop_wait_low(tp, &rtl_ocpar_cond, 1000, 100);
953 954
}

955
static void r8168dp_1_mdio_write(struct rtl8169_private *tp, int reg, int value)
956
{
957 958
	r8168dp_1_mdio_access(tp, reg,
			      OCPDR_WRITE_CMD | (value & OCPDR_DATA_MASK));
959 960
}

961
static int r8168dp_1_mdio_read(struct rtl8169_private *tp, int reg)
962
{
963
	r8168dp_1_mdio_access(tp, reg, OCPDR_READ_CMD);
964 965

	mdelay(1);
966 967
	RTL_W32(tp, OCPAR, OCPAR_GPHY_READ_CMD);
	RTL_W32(tp, EPHY_RXER_NUM, 0);
968

969
	return rtl_udelay_loop_wait_high(tp, &rtl_ocpar_cond, 1000, 100) ?
970
		RTL_R32(tp, OCPDR) & OCPDR_DATA_MASK : -ETIMEDOUT;
971 972
}

F
françois romieu 已提交
973 974
#define R8168DP_1_MDIO_ACCESS_BIT	0x00020000

975
static void r8168dp_2_mdio_start(struct rtl8169_private *tp)
F
françois romieu 已提交
976
{
977
	RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) & ~R8168DP_1_MDIO_ACCESS_BIT);
F
françois romieu 已提交
978 979
}

980
static void r8168dp_2_mdio_stop(struct rtl8169_private *tp)
F
françois romieu 已提交
981
{
982
	RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) | R8168DP_1_MDIO_ACCESS_BIT);
F
françois romieu 已提交
983 984
}

985
static void r8168dp_2_mdio_write(struct rtl8169_private *tp, int reg, int value)
F
françois romieu 已提交
986
{
987
	r8168dp_2_mdio_start(tp);
F
françois romieu 已提交
988

989
	r8169_mdio_write(tp, reg, value);
F
françois romieu 已提交
990

991
	r8168dp_2_mdio_stop(tp);
F
françois romieu 已提交
992 993
}

994
static int r8168dp_2_mdio_read(struct rtl8169_private *tp, int reg)
F
françois romieu 已提交
995 996 997
{
	int value;

998
	r8168dp_2_mdio_start(tp);
F
françois romieu 已提交
999

1000
	value = r8169_mdio_read(tp, reg);
F
françois romieu 已提交
1001

1002
	r8168dp_2_mdio_stop(tp);
F
françois romieu 已提交
1003 1004 1005 1006

	return value;
}

1007
static void rtl_writephy(struct rtl8169_private *tp, int location, int val)
1008
{
H
Heiner Kallweit 已提交
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
		r8168dp_1_mdio_write(tp, location, val);
		break;
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		r8168dp_2_mdio_write(tp, location, val);
		break;
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:
		r8168g_mdio_write(tp, location, val);
		break;
	default:
		r8169_mdio_write(tp, location, val);
		break;
	}
1024 1025
}

1026 1027
static int rtl_readphy(struct rtl8169_private *tp, int location)
{
H
Heiner Kallweit 已提交
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
		return r8168dp_1_mdio_read(tp, location);
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		return r8168dp_2_mdio_read(tp, location);
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:
		return r8168g_mdio_read(tp, location);
	default:
		return r8169_mdio_read(tp, location);
	}
1039 1040 1041 1042 1043 1044 1045
}

static void rtl_patchphy(struct rtl8169_private *tp, int reg_addr, int value)
{
	rtl_writephy(tp, reg_addr, rtl_readphy(tp, reg_addr) | value);
}

1046
static void rtl_w0w1_phy(struct rtl8169_private *tp, int reg_addr, int p, int m)
1047 1048 1049
{
	int val;

1050
	val = rtl_readphy(tp, reg_addr);
1051
	rtl_writephy(tp, reg_addr, (val & ~m) | p);
1052 1053
}

1054 1055
DECLARE_RTL_COND(rtl_ephyar_cond)
{
1056
	return RTL_R32(tp, EPHYAR) & EPHYAR_FLAG;
1057 1058
}

1059
static void rtl_ephy_write(struct rtl8169_private *tp, int reg_addr, int value)
1060
{
1061
	RTL_W32(tp, EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
1062 1063
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);

1064 1065 1066
	rtl_udelay_loop_wait_low(tp, &rtl_ephyar_cond, 10, 100);

	udelay(10);
1067 1068
}

1069
static u16 rtl_ephy_read(struct rtl8169_private *tp, int reg_addr)
1070
{
1071
	RTL_W32(tp, EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
1072

1073
	return rtl_udelay_loop_wait_high(tp, &rtl_ephyar_cond, 10, 100) ?
1074
		RTL_R32(tp, EPHYAR) & EPHYAR_DATA_MASK : ~0;
1075 1076
}

C
Chun-Hao Lin 已提交
1077 1078
DECLARE_RTL_COND(rtl_eriar_cond)
{
1079
	return RTL_R32(tp, ERIAR) & ERIAR_FLAG;
C
Chun-Hao Lin 已提交
1080 1081
}

1082 1083
static void _rtl_eri_write(struct rtl8169_private *tp, int addr, u32 mask,
			   u32 val, int type)
H
Hayes Wang 已提交
1084 1085
{
	BUG_ON((addr & 3) || (mask == 0));
1086 1087
	RTL_W32(tp, ERIDR, val);
	RTL_W32(tp, ERIAR, ERIAR_WRITE_CMD | type | mask | addr);
H
Hayes Wang 已提交
1088

1089
	rtl_udelay_loop_wait_low(tp, &rtl_eriar_cond, 100, 100);
H
Hayes Wang 已提交
1090 1091
}

1092 1093 1094 1095 1096 1097 1098
static void rtl_eri_write(struct rtl8169_private *tp, int addr, u32 mask,
			  u32 val)
{
	_rtl_eri_write(tp, addr, mask, val, ERIAR_EXGMAC);
}

static u32 _rtl_eri_read(struct rtl8169_private *tp, int addr, int type)
H
Hayes Wang 已提交
1099
{
1100
	RTL_W32(tp, ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr);
H
Hayes Wang 已提交
1101

1102
	return rtl_udelay_loop_wait_high(tp, &rtl_eriar_cond, 100, 100) ?
1103
		RTL_R32(tp, ERIDR) : ~0;
H
Hayes Wang 已提交
1104 1105
}

1106 1107 1108 1109 1110
static u32 rtl_eri_read(struct rtl8169_private *tp, int addr)
{
	return _rtl_eri_read(tp, addr, ERIAR_EXGMAC);
}

1111
static void rtl_w0w1_eri(struct rtl8169_private *tp, int addr, u32 mask, u32 p,
1112
			 u32 m)
H
Hayes Wang 已提交
1113 1114 1115
{
	u32 val;

1116 1117
	val = rtl_eri_read(tp, addr);
	rtl_eri_write(tp, addr, mask, (val & ~m) | p);
H
Hayes Wang 已提交
1118 1119
}

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
static void rtl_eri_set_bits(struct rtl8169_private *tp, int addr, u32 mask,
			     u32 p)
{
	rtl_w0w1_eri(tp, addr, mask, p, 0);
}

static void rtl_eri_clear_bits(struct rtl8169_private *tp, int addr, u32 mask,
			       u32 m)
{
	rtl_w0w1_eri(tp, addr, mask, 0, m);
}

C
Chun-Hao Lin 已提交
1132 1133
static u32 r8168dp_ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
{
1134
	RTL_W32(tp, OCPAR, ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
C
Chun-Hao Lin 已提交
1135
	return rtl_udelay_loop_wait_high(tp, &rtl_ocpar_cond, 100, 20) ?
1136
		RTL_R32(tp, OCPDR) : ~0;
C
Chun-Hao Lin 已提交
1137 1138 1139 1140
}

static u32 r8168ep_ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
{
1141
	return _rtl_eri_read(tp, reg, ERIAR_OOB);
C
Chun-Hao Lin 已提交
1142 1143 1144 1145 1146
}

static void r8168dp_ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg,
			      u32 data)
{
1147 1148
	RTL_W32(tp, OCPDR, data);
	RTL_W32(tp, OCPAR, OCPAR_FLAG | ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
C
Chun-Hao Lin 已提交
1149 1150 1151 1152 1153 1154
	rtl_udelay_loop_wait_low(tp, &rtl_ocpar_cond, 100, 20);
}

static void r8168ep_ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg,
			      u32 data)
{
1155 1156
	_rtl_eri_write(tp, reg, ((u32)mask & 0x0f) << ERIAR_MASK_SHIFT,
		       data, ERIAR_OOB);
C
Chun-Hao Lin 已提交
1157 1158
}

H
Heiner Kallweit 已提交
1159
static void r8168dp_oob_notify(struct rtl8169_private *tp, u8 cmd)
1160
{
1161
	rtl_eri_write(tp, 0xe8, ERIAR_MASK_0001, cmd);
1162

H
Heiner Kallweit 已提交
1163
	r8168dp_ocp_write(tp, 0x1, 0x30, 0x00000001);
1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
}

#define OOB_CMD_RESET		0x00
#define OOB_CMD_DRIVER_START	0x05
#define OOB_CMD_DRIVER_STOP	0x06

static u16 rtl8168_get_ocp_reg(struct rtl8169_private *tp)
{
	return (tp->mac_version == RTL_GIGA_MAC_VER_31) ? 0xb8 : 0x10;
}

H
Heiner Kallweit 已提交
1175
DECLARE_RTL_COND(rtl_dp_ocp_read_cond)
1176 1177 1178 1179 1180
{
	u16 reg;

	reg = rtl8168_get_ocp_reg(tp);

H
Heiner Kallweit 已提交
1181
	return r8168dp_ocp_read(tp, 0x0f, reg) & 0x00000800;
1182 1183
}

C
Chun-Hao Lin 已提交
1184
DECLARE_RTL_COND(rtl_ep_ocp_read_cond)
1185
{
H
Heiner Kallweit 已提交
1186
	return r8168ep_ocp_read(tp, 0x0f, 0x124) & 0x00000001;
C
Chun-Hao Lin 已提交
1187 1188 1189 1190
}

DECLARE_RTL_COND(rtl_ocp_tx_cond)
{
1191
	return RTL_R8(tp, IBISR0) & 0x20;
C
Chun-Hao Lin 已提交
1192
}
1193

C
Chun-Hao Lin 已提交
1194 1195
static void rtl8168ep_stop_cmac(struct rtl8169_private *tp)
{
1196
	RTL_W8(tp, IBCR2, RTL_R8(tp, IBCR2) & ~0x01);
1197
	rtl_msleep_loop_wait_high(tp, &rtl_ocp_tx_cond, 50, 2000);
1198 1199
	RTL_W8(tp, IBISR0, RTL_R8(tp, IBISR0) | 0x20);
	RTL_W8(tp, IBCR0, RTL_R8(tp, IBCR0) & ~0x01);
C
Chun-Hao Lin 已提交
1200 1201
}

C
Chun-Hao Lin 已提交
1202 1203
static void rtl8168dp_driver_start(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1204 1205
	r8168dp_oob_notify(tp, OOB_CMD_DRIVER_START);
	rtl_msleep_loop_wait_high(tp, &rtl_dp_ocp_read_cond, 10, 10);
1206 1207
}

C
Chun-Hao Lin 已提交
1208
static void rtl8168ep_driver_start(struct rtl8169_private *tp)
1209
{
H
Heiner Kallweit 已提交
1210 1211 1212
	r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_START);
	r8168ep_ocp_write(tp, 0x01, 0x30,
			  r8168ep_ocp_read(tp, 0x01, 0x30) | 0x01);
C
Chun-Hao Lin 已提交
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
	rtl_msleep_loop_wait_high(tp, &rtl_ep_ocp_read_cond, 10, 10);
}

static void rtl8168_driver_start(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		rtl8168dp_driver_start(tp);
		break;
	case RTL_GIGA_MAC_VER_49:
	case RTL_GIGA_MAC_VER_50:
	case RTL_GIGA_MAC_VER_51:
		rtl8168ep_driver_start(tp);
		break;
	default:
		BUG();
		break;
	}
}
1234

C
Chun-Hao Lin 已提交
1235 1236
static void rtl8168dp_driver_stop(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1237 1238
	r8168dp_oob_notify(tp, OOB_CMD_DRIVER_STOP);
	rtl_msleep_loop_wait_low(tp, &rtl_dp_ocp_read_cond, 10, 10);
1239 1240
}

C
Chun-Hao Lin 已提交
1241 1242
static void rtl8168ep_driver_stop(struct rtl8169_private *tp)
{
C
Chun-Hao Lin 已提交
1243
	rtl8168ep_stop_cmac(tp);
H
Heiner Kallweit 已提交
1244 1245 1246
	r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_STOP);
	r8168ep_ocp_write(tp, 0x01, 0x30,
			  r8168ep_ocp_read(tp, 0x01, 0x30) | 0x01);
C
Chun-Hao Lin 已提交
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268
	rtl_msleep_loop_wait_low(tp, &rtl_ep_ocp_read_cond, 10, 10);
}

static void rtl8168_driver_stop(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		rtl8168dp_driver_stop(tp);
		break;
	case RTL_GIGA_MAC_VER_49:
	case RTL_GIGA_MAC_VER_50:
	case RTL_GIGA_MAC_VER_51:
		rtl8168ep_driver_stop(tp);
		break;
	default:
		BUG();
		break;
	}
}

1269
static bool r8168dp_check_dash(struct rtl8169_private *tp)
1270 1271 1272
{
	u16 reg = rtl8168_get_ocp_reg(tp);

H
Heiner Kallweit 已提交
1273
	return !!(r8168dp_ocp_read(tp, 0x0f, reg) & 0x00008000);
1274 1275
}

1276
static bool r8168ep_check_dash(struct rtl8169_private *tp)
C
Chun-Hao Lin 已提交
1277
{
H
Heiner Kallweit 已提交
1278
	return !!(r8168ep_ocp_read(tp, 0x0f, 0x128) & 0x00000001);
C
Chun-Hao Lin 已提交
1279 1280
}

1281
static bool r8168_check_dash(struct rtl8169_private *tp)
C
Chun-Hao Lin 已提交
1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		return r8168dp_check_dash(tp);
	case RTL_GIGA_MAC_VER_49:
	case RTL_GIGA_MAC_VER_50:
	case RTL_GIGA_MAC_VER_51:
		return r8168ep_check_dash(tp);
	default:
1293
		return false;
C
Chun-Hao Lin 已提交
1294 1295 1296
	}
}

1297 1298 1299 1300 1301 1302
static void rtl_reset_packet_filter(struct rtl8169_private *tp)
{
	rtl_eri_clear_bits(tp, 0xdc, ERIAR_MASK_0001, BIT(0));
	rtl_eri_set_bits(tp, 0xdc, ERIAR_MASK_0001, BIT(0));
}

1303 1304
DECLARE_RTL_COND(rtl_efusear_cond)
{
1305
	return RTL_R32(tp, EFUSEAR) & EFUSEAR_FLAG;
1306 1307
}

1308
static u8 rtl8168d_efuse_read(struct rtl8169_private *tp, int reg_addr)
1309
{
1310
	RTL_W32(tp, EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
1311

1312
	return rtl_udelay_loop_wait_high(tp, &rtl_efusear_cond, 100, 300) ?
1313
		RTL_R32(tp, EFUSEAR) & EFUSEAR_DATA_MASK : ~0;
1314 1315
}

F
Francois Romieu 已提交
1316 1317
static void rtl_ack_events(struct rtl8169_private *tp, u16 bits)
{
1318
	RTL_W16(tp, IntrStatus, bits);
F
Francois Romieu 已提交
1319 1320 1321 1322
}

static void rtl_irq_disable(struct rtl8169_private *tp)
{
1323
	RTL_W16(tp, IntrMask, 0);
1324
	tp->irq_enabled = 0;
1325 1326
}

1327 1328 1329 1330
#define RTL_EVENT_NAPI_RX	(RxOK | RxErr)
#define RTL_EVENT_NAPI_TX	(TxOK | TxErr)
#define RTL_EVENT_NAPI		(RTL_EVENT_NAPI_RX | RTL_EVENT_NAPI_TX)

1331
static void rtl_irq_enable(struct rtl8169_private *tp)
1332
{
1333
	tp->irq_enabled = 1;
1334
	RTL_W16(tp, IntrMask, tp->irq_mask);
1335 1336
}

F
françois romieu 已提交
1337
static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1338
{
F
Francois Romieu 已提交
1339
	rtl_irq_disable(tp);
1340 1341
	rtl_ack_events(tp, 0xffff);
	/* PCI commit */
1342
	RTL_R8(tp, ChipCmd);
L
Linus Torvalds 已提交
1343 1344
}

H
Hayes Wang 已提交
1345 1346 1347
static void rtl_link_chg_patch(struct rtl8169_private *tp)
{
	struct net_device *dev = tp->dev;
1348
	struct phy_device *phydev = tp->phydev;
H
Hayes Wang 已提交
1349 1350 1351 1352

	if (!netif_running(dev))
		return;

1353 1354
	if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_38) {
1355
		if (phydev->speed == SPEED_1000) {
1356 1357
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
1358
		} else if (phydev->speed == SPEED_100) {
1359 1360
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
H
Hayes Wang 已提交
1361
		} else {
1362 1363
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x0000003f);
H
Hayes Wang 已提交
1364
		}
1365
		rtl_reset_packet_filter(tp);
1366 1367
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
		   tp->mac_version == RTL_GIGA_MAC_VER_36) {
1368
		if (phydev->speed == SPEED_1000) {
1369 1370
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
1371
		} else {
1372 1373
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x0000003f);
1374
		}
1375
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_37) {
1376
		if (phydev->speed == SPEED_10) {
1377 1378
			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x4d02);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_0011, 0x0060a);
1379
		} else {
1380
			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000);
1381
		}
H
Hayes Wang 已提交
1382 1383 1384
	}
}

1385 1386 1387
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)

static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
F
Francois Romieu 已提交
1388 1389
{
	struct rtl8169_private *tp = netdev_priv(dev);
1390

1391
	rtl_lock_work(tp);
1392
	wol->supported = WAKE_ANY;
1393
	wol->wolopts = tp->saved_wolopts;
1394
	rtl_unlock_work(tp);
1395 1396 1397 1398
}

static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
{
1399
	unsigned int i, tmp;
1400
	static const struct {
F
Francois Romieu 已提交
1401 1402 1403 1404 1405 1406 1407 1408
		u32 opt;
		u16 reg;
		u8  mask;
	} cfg[] = {
		{ WAKE_PHY,   Config3, LinkUp },
		{ WAKE_UCAST, Config5, UWF },
		{ WAKE_BCAST, Config5, BWF },
		{ WAKE_MCAST, Config5, MWF },
1409 1410
		{ WAKE_ANY,   Config5, LanWake },
		{ WAKE_MAGIC, Config3, MagicPacket }
F
Francois Romieu 已提交
1411
	};
1412
	u8 options;
F
Francois Romieu 已提交
1413

1414
	rtl_unlock_config_regs(tp);
F
Francois Romieu 已提交
1415

1416
	if (rtl_is_8168evl_up(tp)) {
1417 1418
		tmp = ARRAY_SIZE(cfg) - 1;
		if (wolopts & WAKE_MAGIC)
1419 1420
			rtl_eri_set_bits(tp, 0x0dc, ERIAR_MASK_0100,
					 MagicPacket_v2);
1421
		else
1422 1423
			rtl_eri_clear_bits(tp, 0x0dc, ERIAR_MASK_0100,
					   MagicPacket_v2);
1424
	} else {
1425 1426 1427 1428
		tmp = ARRAY_SIZE(cfg);
	}

	for (i = 0; i < tmp; i++) {
1429
		options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
1430
		if (wolopts & cfg[i].opt)
F
Francois Romieu 已提交
1431
			options |= cfg[i].mask;
1432
		RTL_W8(tp, cfg[i].reg, options);
F
Francois Romieu 已提交
1433 1434
	}

1435
	switch (tp->mac_version) {
1436
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
1437
		options = RTL_R8(tp, Config1) & ~PMEnable;
1438 1439
		if (wolopts)
			options |= PMEnable;
1440
		RTL_W8(tp, Config1, options);
1441
		break;
1442 1443 1444
	case RTL_GIGA_MAC_VER_34:
	case RTL_GIGA_MAC_VER_37:
	case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_51:
1445
		options = RTL_R8(tp, Config2) & ~PME_SIGNAL;
1446 1447
		if (wolopts)
			options |= PME_SIGNAL;
1448
		RTL_W8(tp, Config2, options);
1449
		break;
1450 1451
	default:
		break;
1452 1453
	}

1454
	rtl_lock_config_regs(tp);
1455 1456

	device_set_wakeup_enable(tp_to_dev(tp), wolopts);
1457 1458 1459 1460 1461
}

static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
	struct rtl8169_private *tp = netdev_priv(dev);
H
Heiner Kallweit 已提交
1462
	struct device *d = tp_to_dev(tp);
1463

1464 1465 1466
	if (wol->wolopts & ~WAKE_ANY)
		return -EINVAL;

1467
	pm_runtime_get_noresume(d);
1468

1469
	rtl_lock_work(tp);
F
Francois Romieu 已提交
1470

1471
	tp->saved_wolopts = wol->wolopts;
1472

1473
	if (pm_runtime_active(d))
1474
		__rtl8169_set_wol(tp, tp->saved_wolopts);
1475 1476

	rtl_unlock_work(tp);
F
Francois Romieu 已提交
1477

1478 1479
	pm_runtime_put_noidle(d);

F
Francois Romieu 已提交
1480 1481 1482
	return 0;
}

L
Linus Torvalds 已提交
1483 1484 1485 1486
static void rtl8169_get_drvinfo(struct net_device *dev,
				struct ethtool_drvinfo *info)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1487
	struct rtl_fw *rtl_fw = tp->rtl_fw;
L
Linus Torvalds 已提交
1488

1489 1490
	strlcpy(info->driver, MODULENAME, sizeof(info->driver));
	strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
1491
	BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
1492
	if (rtl_fw)
1493 1494
		strlcpy(info->fw_version, rtl_fw->version,
			sizeof(info->fw_version));
L
Linus Torvalds 已提交
1495 1496 1497 1498 1499 1500 1501
}

static int rtl8169_get_regs_len(struct net_device *dev)
{
	return R8169_REGS_SIZE;
}

1502 1503
static netdev_features_t rtl8169_fix_features(struct net_device *dev,
	netdev_features_t features)
L
Linus Torvalds 已提交
1504
{
F
Francois Romieu 已提交
1505 1506
	struct rtl8169_private *tp = netdev_priv(dev);

F
Francois Romieu 已提交
1507
	if (dev->mtu > TD_MSS_MAX)
1508
		features &= ~NETIF_F_ALL_TSO;
L
Linus Torvalds 已提交
1509

F
Francois Romieu 已提交
1510
	if (dev->mtu > JUMBO_1K &&
1511
	    tp->mac_version > RTL_GIGA_MAC_VER_06)
F
Francois Romieu 已提交
1512 1513
		features &= ~NETIF_F_IP_CSUM;

1514
	return features;
L
Linus Torvalds 已提交
1515 1516
}

1517 1518
static int rtl8169_set_features(struct net_device *dev,
				netdev_features_t features)
L
Linus Torvalds 已提交
1519 1520
{
	struct rtl8169_private *tp = netdev_priv(dev);
H
hayeswang 已提交
1521
	u32 rx_config;
L
Linus Torvalds 已提交
1522

1523 1524
	rtl_lock_work(tp);

1525
	rx_config = RTL_R32(tp, RxConfig);
H
hayeswang 已提交
1526 1527 1528 1529
	if (features & NETIF_F_RXALL)
		rx_config |= (AcceptErr | AcceptRunt);
	else
		rx_config &= ~(AcceptErr | AcceptRunt);
L
Linus Torvalds 已提交
1530

1531
	RTL_W32(tp, RxConfig, rx_config);
1532

H
hayeswang 已提交
1533 1534 1535 1536
	if (features & NETIF_F_RXCSUM)
		tp->cp_cmd |= RxChkSum;
	else
		tp->cp_cmd &= ~RxChkSum;
B
Ben Greear 已提交
1537

H
hayeswang 已提交
1538 1539 1540 1541 1542
	if (features & NETIF_F_HW_VLAN_CTAG_RX)
		tp->cp_cmd |= RxVlan;
	else
		tp->cp_cmd &= ~RxVlan;

1543 1544
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
	RTL_R16(tp, CPlusCmd);
L
Linus Torvalds 已提交
1545

1546
	rtl_unlock_work(tp);
L
Linus Torvalds 已提交
1547 1548 1549 1550

	return 0;
}

1551
static inline u32 rtl8169_tx_vlan_tag(struct sk_buff *skb)
L
Linus Torvalds 已提交
1552
{
1553
	return (skb_vlan_tag_present(skb)) ?
1554
		TxVlanTag | swab16(skb_vlan_tag_get(skb)) : 0x00;
L
Linus Torvalds 已提交
1555 1556
}

1557
static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
L
Linus Torvalds 已提交
1558 1559 1560
{
	u32 opts2 = le32_to_cpu(desc->opts2);

1561
	if (opts2 & RxVlanTag)
1562
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
L
Linus Torvalds 已提交
1563 1564 1565 1566 1567
}

static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
			     void *p)
{
1568
	struct rtl8169_private *tp = netdev_priv(dev);
P
Peter Wu 已提交
1569 1570 1571
	u32 __iomem *data = tp->mmio_addr;
	u32 *dw = p;
	int i;
L
Linus Torvalds 已提交
1572

1573
	rtl_lock_work(tp);
P
Peter Wu 已提交
1574 1575
	for (i = 0; i < R8169_REGS_SIZE; i += 4)
		memcpy_fromio(dw++, data++, 4);
1576
	rtl_unlock_work(tp);
L
Linus Torvalds 已提交
1577 1578
}

1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
static u32 rtl8169_get_msglevel(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	return tp->msg_enable;
}

static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	tp->msg_enable = value;
}

1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
	"tx_packets",
	"rx_packets",
	"tx_errors",
	"rx_errors",
	"rx_missed",
	"align_errors",
	"tx_single_collisions",
	"tx_multi_collisions",
	"unicast",
	"broadcast",
	"multicast",
	"tx_aborted",
	"tx_underrun",
};

1609
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
1610
{
1611 1612 1613 1614 1615 1616
	switch (sset) {
	case ETH_SS_STATS:
		return ARRAY_SIZE(rtl8169_gstrings);
	default:
		return -EOPNOTSUPP;
	}
1617 1618
}

1619
DECLARE_RTL_COND(rtl_counters_cond)
1620
{
1621
	return RTL_R32(tp, CounterAddrLow) & (CounterReset | CounterDump);
1622 1623
}

1624
static bool rtl8169_do_counters(struct rtl8169_private *tp, u32 counter_cmd)
1625
{
1626 1627
	dma_addr_t paddr = tp->counters_phys_addr;
	u32 cmd;
1628

1629 1630
	RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
	RTL_R32(tp, CounterAddrHigh);
1631
	cmd = (u64)paddr & DMA_BIT_MASK(32);
1632 1633
	RTL_W32(tp, CounterAddrLow, cmd);
	RTL_W32(tp, CounterAddrLow, cmd | counter_cmd);
1634

1635
	return rtl_udelay_loop_wait_low(tp, &rtl_counters_cond, 10, 1000);
1636 1637
}

1638
static bool rtl8169_reset_counters(struct rtl8169_private *tp)
1639 1640 1641 1642 1643 1644 1645 1646
{
	/*
	 * Versions prior to RTL_GIGA_MAC_VER_19 don't support resetting the
	 * tally counters.
	 */
	if (tp->mac_version < RTL_GIGA_MAC_VER_19)
		return true;

1647
	return rtl8169_do_counters(tp, CounterReset);
1648 1649
}

1650
static bool rtl8169_update_counters(struct rtl8169_private *tp)
1651
{
1652 1653
	u8 val = RTL_R8(tp, ChipCmd);

1654 1655
	/*
	 * Some chips are unable to dump tally counters when the receiver
1656
	 * is disabled. If 0xff chip may be in a PCI power-save state.
1657
	 */
1658
	if (!(val & CmdRxEnb) || val == 0xff)
1659
		return true;
1660

1661
	return rtl8169_do_counters(tp, CounterDump);
1662 1663
}

1664
static bool rtl8169_init_counter_offsets(struct rtl8169_private *tp)
1665
{
1666
	struct rtl8169_counters *counters = tp->counters;
1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687
	bool ret = false;

	/*
	 * rtl8169_init_counter_offsets is called from rtl_open.  On chip
	 * versions prior to RTL_GIGA_MAC_VER_19 the tally counters are only
	 * reset by a power cycle, while the counter values collected by the
	 * driver are reset at every driver unload/load cycle.
	 *
	 * To make sure the HW values returned by @get_stats64 match the SW
	 * values, we collect the initial values at first open(*) and use them
	 * as offsets to normalize the values returned by @get_stats64.
	 *
	 * (*) We can't call rtl8169_init_counter_offsets from rtl_init_one
	 * for the reason stated in rtl8169_update_counters; CmdRxEnb is only
	 * set at open time by rtl_hw_start.
	 */

	if (tp->tc_offset.inited)
		return true;

	/* If both, reset and update fail, propagate to caller. */
1688
	if (rtl8169_reset_counters(tp))
1689 1690
		ret = true;

1691
	if (rtl8169_update_counters(tp))
1692 1693
		ret = true;

1694 1695 1696
	tp->tc_offset.tx_errors = counters->tx_errors;
	tp->tc_offset.tx_multi_collision = counters->tx_multi_collision;
	tp->tc_offset.tx_aborted = counters->tx_aborted;
1697 1698 1699
	tp->tc_offset.inited = true;

	return ret;
1700 1701
}

1702 1703 1704 1705
static void rtl8169_get_ethtool_stats(struct net_device *dev,
				      struct ethtool_stats *stats, u64 *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
H
Heiner Kallweit 已提交
1706
	struct device *d = tp_to_dev(tp);
1707
	struct rtl8169_counters *counters = tp->counters;
1708 1709 1710

	ASSERT_RTNL();

1711 1712 1713
	pm_runtime_get_noresume(d);

	if (pm_runtime_active(d))
1714
		rtl8169_update_counters(tp);
1715 1716

	pm_runtime_put_noidle(d);
1717

1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730
	data[0] = le64_to_cpu(counters->tx_packets);
	data[1] = le64_to_cpu(counters->rx_packets);
	data[2] = le64_to_cpu(counters->tx_errors);
	data[3] = le32_to_cpu(counters->rx_errors);
	data[4] = le16_to_cpu(counters->rx_missed);
	data[5] = le16_to_cpu(counters->align_errors);
	data[6] = le32_to_cpu(counters->tx_one_collision);
	data[7] = le32_to_cpu(counters->tx_multi_collision);
	data[8] = le64_to_cpu(counters->rx_unicast);
	data[9] = le64_to_cpu(counters->rx_broadcast);
	data[10] = le32_to_cpu(counters->rx_multicast);
	data[11] = le16_to_cpu(counters->tx_aborted);
	data[12] = le16_to_cpu(counters->tx_underun);
1731 1732
}

1733 1734 1735 1736 1737 1738 1739 1740 1741
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
{
	switch(stringset) {
	case ETH_SS_STATS:
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
		break;
	}
}

1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811
/*
 * Interrupt coalescing
 *
 * > 1 - the availability of the IntrMitigate (0xe2) register through the
 * >     8169, 8168 and 810x line of chipsets
 *
 * 8169, 8168, and 8136(810x) serial chipsets support it.
 *
 * > 2 - the Tx timer unit at gigabit speed
 *
 * The unit of the timer depends on both the speed and the setting of CPlusCmd
 * (0xe0) bit 1 and bit 0.
 *
 * For 8169
 * bit[1:0] \ speed        1000M           100M            10M
 * 0 0                     320ns           2.56us          40.96us
 * 0 1                     2.56us          20.48us         327.7us
 * 1 0                     5.12us          40.96us         655.4us
 * 1 1                     10.24us         81.92us         1.31ms
 *
 * For the other
 * bit[1:0] \ speed        1000M           100M            10M
 * 0 0                     5us             2.56us          40.96us
 * 0 1                     40us            20.48us         327.7us
 * 1 0                     80us            40.96us         655.4us
 * 1 1                     160us           81.92us         1.31ms
 */

/* rx/tx scale factors for one particular CPlusCmd[0:1] value */
struct rtl_coalesce_scale {
	/* Rx / Tx */
	u32 nsecs[2];
};

/* rx/tx scale factors for all CPlusCmd[0:1] cases */
struct rtl_coalesce_info {
	u32 speed;
	struct rtl_coalesce_scale scalev[4];	/* each CPlusCmd[0:1] case */
};

/* produce (r,t) pairs with each being in series of *1, *8, *8*2, *8*2*2 */
#define rxtx_x1822(r, t) {		\
	{{(r),		(t)}},		\
	{{(r)*8,	(t)*8}},	\
	{{(r)*8*2,	(t)*8*2}},	\
	{{(r)*8*2*2,	(t)*8*2*2}},	\
}
static const struct rtl_coalesce_info rtl_coalesce_info_8169[] = {
	/* speed	delays:     rx00   tx00	*/
	{ SPEED_10,	rxtx_x1822(40960, 40960)	},
	{ SPEED_100,	rxtx_x1822( 2560,  2560)	},
	{ SPEED_1000,	rxtx_x1822(  320,   320)	},
	{ 0 },
};

static const struct rtl_coalesce_info rtl_coalesce_info_8168_8136[] = {
	/* speed	delays:     rx00   tx00	*/
	{ SPEED_10,	rxtx_x1822(40960, 40960)	},
	{ SPEED_100,	rxtx_x1822( 2560,  2560)	},
	{ SPEED_1000,	rxtx_x1822( 5000,  5000)	},
	{ 0 },
};
#undef rxtx_x1822

/* get rx/tx scale vector corresponding to current speed */
static const struct rtl_coalesce_info *rtl_coalesce_info(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	const struct rtl_coalesce_info *ci;

1812 1813 1814 1815
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		ci = rtl_coalesce_info_8169;
	else
		ci = rtl_coalesce_info_8168_8136;
1816

1817 1818
	for (; ci->speed; ci++) {
		if (tp->phydev->speed == ci->speed)
1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846
			return ci;
	}

	return ERR_PTR(-ELNRNG);
}

static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	const struct rtl_coalesce_info *ci;
	const struct rtl_coalesce_scale *scale;
	struct {
		u32 *max_frames;
		u32 *usecs;
	} coal_settings [] = {
		{ &ec->rx_max_coalesced_frames, &ec->rx_coalesce_usecs },
		{ &ec->tx_max_coalesced_frames, &ec->tx_coalesce_usecs }
	}, *p = coal_settings;
	int i;
	u16 w;

	memset(ec, 0, sizeof(*ec));

	/* get rx/tx scale corresponding to current speed and CPlusCmd[0:1] */
	ci = rtl_coalesce_info(dev);
	if (IS_ERR(ci))
		return PTR_ERR(ci);

1847
	scale = &ci->scalev[tp->cp_cmd & INTT_MASK];
1848 1849

	/* read IntrMitigate and adjust according to scale */
1850
	for (w = RTL_R16(tp, IntrMitigate); w; w >>= RTL_COALESCE_SHIFT, p++) {
1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943
		*p->max_frames = (w & RTL_COALESCE_MASK) << 2;
		w >>= RTL_COALESCE_SHIFT;
		*p->usecs = w & RTL_COALESCE_MASK;
	}

	for (i = 0; i < 2; i++) {
		p = coal_settings + i;
		*p->usecs = (*p->usecs * scale->nsecs[i]) / 1000;

		/*
		 * ethtool_coalesce says it is illegal to set both usecs and
		 * max_frames to 0.
		 */
		if (!*p->usecs && !*p->max_frames)
			*p->max_frames = 1;
	}

	return 0;
}

/* choose appropriate scale factor and CPlusCmd[0:1] for (speed, nsec) */
static const struct rtl_coalesce_scale *rtl_coalesce_choose_scale(
			struct net_device *dev, u32 nsec, u16 *cp01)
{
	const struct rtl_coalesce_info *ci;
	u16 i;

	ci = rtl_coalesce_info(dev);
	if (IS_ERR(ci))
		return ERR_CAST(ci);

	for (i = 0; i < 4; i++) {
		u32 rxtx_maxscale = max(ci->scalev[i].nsecs[0],
					ci->scalev[i].nsecs[1]);
		if (nsec <= rxtx_maxscale * RTL_COALESCE_T_MAX) {
			*cp01 = i;
			return &ci->scalev[i];
		}
	}

	return ERR_PTR(-EINVAL);
}

static int rtl_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	const struct rtl_coalesce_scale *scale;
	struct {
		u32 frames;
		u32 usecs;
	} coal_settings [] = {
		{ ec->rx_max_coalesced_frames, ec->rx_coalesce_usecs },
		{ ec->tx_max_coalesced_frames, ec->tx_coalesce_usecs }
	}, *p = coal_settings;
	u16 w = 0, cp01;
	int i;

	scale = rtl_coalesce_choose_scale(dev,
			max(p[0].usecs, p[1].usecs) * 1000, &cp01);
	if (IS_ERR(scale))
		return PTR_ERR(scale);

	for (i = 0; i < 2; i++, p++) {
		u32 units;

		/*
		 * accept max_frames=1 we returned in rtl_get_coalesce.
		 * accept it not only when usecs=0 because of e.g. the following scenario:
		 *
		 * - both rx_usecs=0 & rx_frames=0 in hardware (no delay on RX)
		 * - rtl_get_coalesce returns rx_usecs=0, rx_frames=1
		 * - then user does `ethtool -C eth0 rx-usecs 100`
		 *
		 * since ethtool sends to kernel whole ethtool_coalesce
		 * settings, if we do not handle rx_usecs=!0, rx_frames=1
		 * we'll reject it below in `frames % 4 != 0`.
		 */
		if (p->frames == 1) {
			p->frames = 0;
		}

		units = p->usecs * 1000 / scale->nsecs[i];
		if (p->frames > RTL_COALESCE_FRAME_MAX || p->frames % 4)
			return -EINVAL;

		w <<= RTL_COALESCE_SHIFT;
		w |= units;
		w <<= RTL_COALESCE_SHIFT;
		w |= p->frames >> 2;
	}

	rtl_lock_work(tp);

1944
	RTL_W16(tp, IntrMitigate, swab16(w));
1945

1946
	tp->cp_cmd = (tp->cp_cmd & ~INTT_MASK) | cp01;
1947 1948
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
	RTL_R16(tp, CPlusCmd);
1949 1950 1951 1952 1953 1954

	rtl_unlock_work(tp);

	return 0;
}

1955 1956 1957 1958 1959 1960
static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct device *d = tp_to_dev(tp);
	int ret;

1961 1962 1963
	if (!rtl_supports_eee(tp))
		return -EOPNOTSUPP;

1964 1965 1966 1967
	pm_runtime_get_noresume(d);

	if (!pm_runtime_active(d)) {
		ret = -EOPNOTSUPP;
1968 1969
	} else {
		ret = phy_ethtool_get_eee(tp->phydev, data);
1970 1971 1972
	}

	pm_runtime_put_noidle(d);
1973 1974

	return ret;
1975 1976 1977 1978 1979 1980
}

static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct device *d = tp_to_dev(tp);
1981 1982 1983 1984
	int ret;

	if (!rtl_supports_eee(tp))
		return -EOPNOTSUPP;
1985 1986 1987

	pm_runtime_get_noresume(d);

1988
	if (!pm_runtime_active(d)) {
1989 1990 1991 1992 1993 1994 1995 1996 1997 1998
		ret = -EOPNOTSUPP;
		goto out;
	}

	if (dev->phydev->autoneg == AUTONEG_DISABLE ||
	    dev->phydev->duplex != DUPLEX_FULL) {
		ret = -EPROTONOSUPPORT;
		goto out;
	}

1999
	ret = phy_ethtool_set_eee(tp->phydev, data);
2000 2001
out:
	pm_runtime_put_noidle(d);
2002
	return ret;
2003 2004
}

2005
static const struct ethtool_ops rtl8169_ethtool_ops = {
L
Linus Torvalds 已提交
2006 2007 2008
	.get_drvinfo		= rtl8169_get_drvinfo,
	.get_regs_len		= rtl8169_get_regs_len,
	.get_link		= ethtool_op_get_link,
2009 2010
	.get_coalesce		= rtl_get_coalesce,
	.set_coalesce		= rtl_set_coalesce,
2011 2012
	.get_msglevel		= rtl8169_get_msglevel,
	.set_msglevel		= rtl8169_set_msglevel,
L
Linus Torvalds 已提交
2013
	.get_regs		= rtl8169_get_regs,
F
Francois Romieu 已提交
2014 2015
	.get_wol		= rtl8169_get_wol,
	.set_wol		= rtl8169_set_wol,
2016
	.get_strings		= rtl8169_get_strings,
2017
	.get_sset_count		= rtl8169_get_sset_count,
2018
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
2019
	.get_ts_info		= ethtool_op_get_ts_info,
2020
	.nway_reset		= phy_ethtool_nway_reset,
2021 2022
	.get_eee		= rtl8169_get_eee,
	.set_eee		= rtl8169_set_eee,
2023 2024
	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
L
Linus Torvalds 已提交
2025 2026
};

2027 2028
static void rtl_enable_eee(struct rtl8169_private *tp)
{
2029 2030
	struct phy_device *phydev = tp->phydev;
	int supported = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
2031 2032

	if (supported > 0)
2033
		phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, supported);
2034 2035
}

2036
static void rtl8169_get_mac_version(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
2037
{
2038 2039 2040 2041 2042
	/*
	 * The driver currently handles the 8168Bf and the 8168Be identically
	 * but they can be identified more specifically through the test below
	 * if needed:
	 *
2043
	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
F
Francois Romieu 已提交
2044 2045 2046
	 *
	 * Same thing for the 8101Eb and the 8101Ec:
	 *
2047
	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
2048
	 */
2049
	static const struct rtl_mac_info {
2050 2051 2052
		u16 mask;
		u16 val;
		u16 mac_version;
L
Linus Torvalds 已提交
2053
	} mac_info[] = {
C
Chun-Hao Lin 已提交
2054
		/* 8168EP family. */
2055 2056 2057
		{ 0x7cf, 0x502,	RTL_GIGA_MAC_VER_51 },
		{ 0x7cf, 0x501,	RTL_GIGA_MAC_VER_50 },
		{ 0x7cf, 0x500,	RTL_GIGA_MAC_VER_49 },
C
Chun-Hao Lin 已提交
2058

2059
		/* 8168H family. */
2060 2061
		{ 0x7cf, 0x541,	RTL_GIGA_MAC_VER_46 },
		{ 0x7cf, 0x540,	RTL_GIGA_MAC_VER_45 },
2062

H
Hayes Wang 已提交
2063
		/* 8168G family. */
2064 2065 2066 2067
		{ 0x7cf, 0x5c8,	RTL_GIGA_MAC_VER_44 },
		{ 0x7cf, 0x509,	RTL_GIGA_MAC_VER_42 },
		{ 0x7cf, 0x4c1,	RTL_GIGA_MAC_VER_41 },
		{ 0x7cf, 0x4c0,	RTL_GIGA_MAC_VER_40 },
H
Hayes Wang 已提交
2068

2069
		/* 8168F family. */
2070 2071 2072
		{ 0x7c8, 0x488,	RTL_GIGA_MAC_VER_38 },
		{ 0x7cf, 0x481,	RTL_GIGA_MAC_VER_36 },
		{ 0x7cf, 0x480,	RTL_GIGA_MAC_VER_35 },
2073

H
hayeswang 已提交
2074
		/* 8168E family. */
2075 2076 2077
		{ 0x7c8, 0x2c8,	RTL_GIGA_MAC_VER_34 },
		{ 0x7cf, 0x2c1,	RTL_GIGA_MAC_VER_32 },
		{ 0x7c8, 0x2c0,	RTL_GIGA_MAC_VER_33 },
H
hayeswang 已提交
2078

F
Francois Romieu 已提交
2079
		/* 8168D family. */
2080 2081
		{ 0x7cf, 0x281,	RTL_GIGA_MAC_VER_25 },
		{ 0x7c8, 0x280,	RTL_GIGA_MAC_VER_26 },
F
Francois Romieu 已提交
2082

F
françois romieu 已提交
2083
		/* 8168DP family. */
2084 2085 2086
		{ 0x7cf, 0x288,	RTL_GIGA_MAC_VER_27 },
		{ 0x7cf, 0x28a,	RTL_GIGA_MAC_VER_28 },
		{ 0x7cf, 0x28b,	RTL_GIGA_MAC_VER_31 },
F
françois romieu 已提交
2087

2088
		/* 8168C family. */
2089 2090 2091 2092 2093 2094 2095
		{ 0x7cf, 0x3c9,	RTL_GIGA_MAC_VER_23 },
		{ 0x7cf, 0x3c8,	RTL_GIGA_MAC_VER_18 },
		{ 0x7c8, 0x3c8,	RTL_GIGA_MAC_VER_24 },
		{ 0x7cf, 0x3c0,	RTL_GIGA_MAC_VER_19 },
		{ 0x7cf, 0x3c2,	RTL_GIGA_MAC_VER_20 },
		{ 0x7cf, 0x3c3,	RTL_GIGA_MAC_VER_21 },
		{ 0x7c8, 0x3c0,	RTL_GIGA_MAC_VER_22 },
F
Francois Romieu 已提交
2096 2097

		/* 8168B family. */
2098 2099 2100
		{ 0x7cf, 0x380,	RTL_GIGA_MAC_VER_12 },
		{ 0x7c8, 0x380,	RTL_GIGA_MAC_VER_17 },
		{ 0x7c8, 0x300,	RTL_GIGA_MAC_VER_11 },
F
Francois Romieu 已提交
2101 2102

		/* 8101 family. */
2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116
		{ 0x7c8, 0x448,	RTL_GIGA_MAC_VER_39 },
		{ 0x7c8, 0x440,	RTL_GIGA_MAC_VER_37 },
		{ 0x7cf, 0x409,	RTL_GIGA_MAC_VER_29 },
		{ 0x7c8, 0x408,	RTL_GIGA_MAC_VER_30 },
		{ 0x7cf, 0x349,	RTL_GIGA_MAC_VER_08 },
		{ 0x7cf, 0x249,	RTL_GIGA_MAC_VER_08 },
		{ 0x7cf, 0x348,	RTL_GIGA_MAC_VER_07 },
		{ 0x7cf, 0x248,	RTL_GIGA_MAC_VER_07 },
		{ 0x7cf, 0x340,	RTL_GIGA_MAC_VER_13 },
		{ 0x7cf, 0x343,	RTL_GIGA_MAC_VER_10 },
		{ 0x7cf, 0x342,	RTL_GIGA_MAC_VER_16 },
		{ 0x7c8, 0x348,	RTL_GIGA_MAC_VER_09 },
		{ 0x7c8, 0x248,	RTL_GIGA_MAC_VER_09 },
		{ 0x7c8, 0x340,	RTL_GIGA_MAC_VER_16 },
F
Francois Romieu 已提交
2117
		/* FIXME: where did these entries come from ? -- FR */
2118 2119
		{ 0xfc8, 0x388,	RTL_GIGA_MAC_VER_15 },
		{ 0xfc8, 0x308,	RTL_GIGA_MAC_VER_14 },
F
Francois Romieu 已提交
2120 2121

		/* 8110 family. */
2122 2123 2124 2125 2126
		{ 0xfc8, 0x980,	RTL_GIGA_MAC_VER_06 },
		{ 0xfc8, 0x180,	RTL_GIGA_MAC_VER_05 },
		{ 0xfc8, 0x100,	RTL_GIGA_MAC_VER_04 },
		{ 0xfc8, 0x040,	RTL_GIGA_MAC_VER_03 },
		{ 0xfc8, 0x008,	RTL_GIGA_MAC_VER_02 },
F
Francois Romieu 已提交
2127

2128
		/* Catch-all */
2129
		{ 0x000, 0x000,	RTL_GIGA_MAC_NONE   }
2130 2131
	};
	const struct rtl_mac_info *p = mac_info;
2132
	u16 reg = RTL_R32(tp, TxConfig) >> 20;
L
Linus Torvalds 已提交
2133

F
Francois Romieu 已提交
2134
	while ((reg & p->mask) != p->val)
L
Linus Torvalds 已提交
2135 2136
		p++;
	tp->mac_version = p->mac_version;
2137 2138

	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
2139
		dev_err(tp_to_dev(tp), "unknown chip XID %03x\n", reg & 0xfcf);
2140 2141 2142 2143 2144 2145 2146
	} else if (!tp->supports_gmii) {
		if (tp->mac_version == RTL_GIGA_MAC_VER_42)
			tp->mac_version = RTL_GIGA_MAC_VER_43;
		else if (tp->mac_version == RTL_GIGA_MAC_VER_45)
			tp->mac_version = RTL_GIGA_MAC_VER_47;
		else if (tp->mac_version == RTL_GIGA_MAC_VER_46)
			tp->mac_version = RTL_GIGA_MAC_VER_48;
2147
	}
L
Linus Torvalds 已提交
2148 2149
}

F
Francois Romieu 已提交
2150 2151 2152 2153 2154
struct phy_reg {
	u16 reg;
	u16 val;
};

2155 2156
static void __rtl_writephy_batch(struct rtl8169_private *tp,
				 const struct phy_reg *regs, int len)
F
Francois Romieu 已提交
2157 2158
{
	while (len-- > 0) {
2159
		rtl_writephy(tp, regs->reg, regs->val);
F
Francois Romieu 已提交
2160 2161 2162 2163
		regs++;
	}
}

2164 2165
#define rtl_writephy_batch(tp, a) __rtl_writephy_batch(tp, a, ARRAY_SIZE(a))

2166 2167
static void rtl_release_firmware(struct rtl8169_private *tp)
{
2168
	if (tp->rtl_fw) {
2169
		rtl_fw_release_firmware(tp->rtl_fw);
2170
		kfree(tp->rtl_fw);
2171
		tp->rtl_fw = NULL;
2172
	}
2173 2174
}

2175
static void rtl_apply_firmware(struct rtl8169_private *tp)
2176
{
2177
	/* TODO: release firmware if rtl_fw_write_firmware signals failure. */
2178
	if (tp->rtl_fw)
2179
		rtl_fw_write_firmware(tp, tp->rtl_fw);
2180 2181 2182 2183 2184 2185 2186 2187
}

static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
{
	if (rtl_readphy(tp, reg) != val)
		netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n");
	else
		rtl_apply_firmware(tp);
2188 2189
}

2190 2191
static void rtl8168_config_eee_mac(struct rtl8169_private *tp)
{
2192 2193 2194 2195
	/* Adjust EEE LED frequency */
	if (tp->mac_version != RTL_GIGA_MAC_VER_38)
		RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);

2196
	rtl_eri_set_bits(tp, 0x1b0, ERIAR_MASK_1111, 0x0003);
2197 2198
}

2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213
static void rtl8168f_config_eee_phy(struct rtl8169_private *tp)
{
	struct phy_device *phydev = tp->phydev;

	phy_write(phydev, 0x1f, 0x0007);
	phy_write(phydev, 0x1e, 0x0020);
	phy_set_bits(phydev, 0x15, BIT(8));

	phy_write(phydev, 0x1f, 0x0005);
	phy_write(phydev, 0x05, 0x8b85);
	phy_set_bits(phydev, 0x06, BIT(13));

	phy_write(phydev, 0x1f, 0x0000);
}

2214 2215
static void rtl8168g_config_eee_phy(struct rtl8169_private *tp)
{
2216
	phy_modify_paged(tp->phydev, 0x0a43, 0x11, 0, BIT(4));
2217 2218
}

2219 2220 2221 2222 2223 2224 2225 2226 2227 2228
static void rtl8168h_config_eee_phy(struct rtl8169_private *tp)
{
	struct phy_device *phydev = tp->phydev;

	rtl8168g_config_eee_phy(tp);

	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0000, 0x0200);
	phy_modify_paged(phydev, 0xa42, 0x14, 0x0000, 0x0080);
}

2229
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
2230
{
2231
	static const struct phy_reg phy_reg_init[] = {
F
françois romieu 已提交
2232 2233 2234 2235 2236
		{ 0x1f, 0x0001 },
		{ 0x06, 0x006e },
		{ 0x08, 0x0708 },
		{ 0x15, 0x4000 },
		{ 0x18, 0x65c7 },
L
Linus Torvalds 已提交
2237

F
françois romieu 已提交
2238 2239 2240 2241 2242 2243 2244
		{ 0x1f, 0x0001 },
		{ 0x03, 0x00a1 },
		{ 0x02, 0x0008 },
		{ 0x01, 0x0120 },
		{ 0x00, 0x1000 },
		{ 0x04, 0x0800 },
		{ 0x04, 0x0000 },
L
Linus Torvalds 已提交
2245

F
françois romieu 已提交
2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291
		{ 0x03, 0xff41 },
		{ 0x02, 0xdf60 },
		{ 0x01, 0x0140 },
		{ 0x00, 0x0077 },
		{ 0x04, 0x7800 },
		{ 0x04, 0x7000 },

		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf0f9 },
		{ 0x04, 0x9800 },
		{ 0x04, 0x9000 },

		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0xff95 },
		{ 0x00, 0xba00 },
		{ 0x04, 0xa800 },
		{ 0x04, 0xa000 },

		{ 0x03, 0xff41 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x0140 },
		{ 0x00, 0x00bb },
		{ 0x04, 0xb800 },
		{ 0x04, 0xb000 },

		{ 0x03, 0xdf41 },
		{ 0x02, 0xdc60 },
		{ 0x01, 0x6340 },
		{ 0x00, 0x007d },
		{ 0x04, 0xd800 },
		{ 0x04, 0xd000 },

		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x100a },
		{ 0x00, 0xa0ff },
		{ 0x04, 0xf800 },
		{ 0x04, 0xf000 },

		{ 0x1f, 0x0000 },
		{ 0x0b, 0x0000 },
		{ 0x00, 0x9200 }
	};
L
Linus Torvalds 已提交
2292

2293
	rtl_writephy_batch(tp, phy_reg_init);
L
Linus Torvalds 已提交
2294 2295
}

2296
static void rtl8169sb_hw_phy_config(struct rtl8169_private *tp)
2297
{
2298
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2299 2300 2301 2302 2303
		{ 0x1f, 0x0002 },
		{ 0x01, 0x90d0 },
		{ 0x1f, 0x0000 }
	};

2304
	rtl_writephy_batch(tp, phy_reg_init);
2305 2306
}

2307
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp)
2308 2309 2310
{
	struct pci_dev *pdev = tp->pci_dev;

2311 2312
	if ((pdev->subsystem_vendor != PCI_VENDOR_ID_GIGABYTE) ||
	    (pdev->subsystem_device != 0xe000))
2313 2314
		return;

2315 2316 2317
	rtl_writephy(tp, 0x1f, 0x0001);
	rtl_writephy(tp, 0x10, 0xf01b);
	rtl_writephy(tp, 0x1f, 0x0000);
2318 2319
}

2320
static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp)
2321
{
2322
	static const struct phy_reg phy_reg_init[] = {
2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361
		{ 0x1f, 0x0001 },
		{ 0x04, 0x0000 },
		{ 0x03, 0x00a1 },
		{ 0x02, 0x0008 },
		{ 0x01, 0x0120 },
		{ 0x00, 0x1000 },
		{ 0x04, 0x0800 },
		{ 0x04, 0x9000 },
		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf099 },
		{ 0x04, 0x9800 },
		{ 0x04, 0xa000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0xff95 },
		{ 0x00, 0xba00 },
		{ 0x04, 0xa800 },
		{ 0x04, 0xf000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x101a },
		{ 0x00, 0xa0ff },
		{ 0x04, 0xf800 },
		{ 0x04, 0x0000 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0001 },
		{ 0x10, 0xf41b },
		{ 0x14, 0xfb54 },
		{ 0x18, 0xf5c7 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },
		{ 0x1f, 0x0000 }
	};

2362
	rtl_writephy_batch(tp, phy_reg_init);
2363

2364
	rtl8169scd_hw_phy_config_quirk(tp);
2365 2366
}

2367
static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp)
2368
{
2369
	static const struct phy_reg phy_reg_init[] = {
2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416
		{ 0x1f, 0x0001 },
		{ 0x04, 0x0000 },
		{ 0x03, 0x00a1 },
		{ 0x02, 0x0008 },
		{ 0x01, 0x0120 },
		{ 0x00, 0x1000 },
		{ 0x04, 0x0800 },
		{ 0x04, 0x9000 },
		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf099 },
		{ 0x04, 0x9800 },
		{ 0x04, 0xa000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0xff95 },
		{ 0x00, 0xba00 },
		{ 0x04, 0xa800 },
		{ 0x04, 0xf000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x101a },
		{ 0x00, 0xa0ff },
		{ 0x04, 0xf800 },
		{ 0x04, 0x0000 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0001 },
		{ 0x0b, 0x8480 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0001 },
		{ 0x18, 0x67c7 },
		{ 0x04, 0x2000 },
		{ 0x03, 0x002f },
		{ 0x02, 0x4360 },
		{ 0x01, 0x0109 },
		{ 0x00, 0x3022 },
		{ 0x04, 0x2800 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },
		{ 0x1f, 0x0000 }
	};

2417
	rtl_writephy_batch(tp, phy_reg_init);
2418 2419
}

2420
static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp)
2421
{
2422
	static const struct phy_reg phy_reg_init[] = {
2423 2424 2425 2426
		{ 0x10, 0xf41b },
		{ 0x1f, 0x0000 }
	};

2427 2428
	rtl_writephy(tp, 0x1f, 0x0001);
	rtl_patchphy(tp, 0x16, 1 << 0);
2429

2430
	rtl_writephy_batch(tp, phy_reg_init);
2431 2432
}

2433
static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp)
2434
{
2435
	static const struct phy_reg phy_reg_init[] = {
2436 2437 2438 2439 2440
		{ 0x1f, 0x0001 },
		{ 0x10, 0xf41b },
		{ 0x1f, 0x0000 }
	};

2441
	rtl_writephy_batch(tp, phy_reg_init);
2442 2443
}

2444
static void rtl8168cp_1_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2445
{
2446
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2447 2448 2449 2450 2451 2452 2453
		{ 0x1f, 0x0000 },
		{ 0x1d, 0x0f00 },
		{ 0x1f, 0x0002 },
		{ 0x0c, 0x1ec8 },
		{ 0x1f, 0x0000 }
	};

2454
	rtl_writephy_batch(tp, phy_reg_init);
F
Francois Romieu 已提交
2455 2456
}

2457
static void rtl8168cp_2_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2458
{
2459
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2460 2461 2462 2463 2464
		{ 0x1f, 0x0001 },
		{ 0x1d, 0x3d98 },
		{ 0x1f, 0x0000 }
	};

2465 2466 2467
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
F
Francois Romieu 已提交
2468

2469
	rtl_writephy_batch(tp, phy_reg_init);
F
Francois Romieu 已提交
2470 2471
}

2472
static void rtl8168c_1_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2473
{
2474
	static const struct phy_reg phy_reg_init[] = {
2475 2476
		{ 0x1f, 0x0001 },
		{ 0x12, 0x2300 },
F
Francois Romieu 已提交
2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487
		{ 0x1f, 0x0002 },
		{ 0x00, 0x88d4 },
		{ 0x01, 0x82b1 },
		{ 0x03, 0x7002 },
		{ 0x08, 0x9e30 },
		{ 0x09, 0x01f0 },
		{ 0x0a, 0x5500 },
		{ 0x0c, 0x00c8 },
		{ 0x1f, 0x0003 },
		{ 0x12, 0xc096 },
		{ 0x16, 0x000a },
2488 2489 2490 2491
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0000 },
		{ 0x09, 0x2000 },
		{ 0x09, 0x0000 }
F
Francois Romieu 已提交
2492 2493
	};

2494
	rtl_writephy_batch(tp, phy_reg_init);
2495

2496 2497 2498
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
	rtl_writephy(tp, 0x1f, 0x0000);
F
Francois Romieu 已提交
2499 2500
}

2501
static void rtl8168c_2_hw_phy_config(struct rtl8169_private *tp)
2502
{
2503
	static const struct phy_reg phy_reg_init[] = {
2504
		{ 0x1f, 0x0001 },
2505
		{ 0x12, 0x2300 },
2506 2507 2508 2509 2510 2511 2512
		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf099 },
		{ 0x04, 0x9800 },
		{ 0x04, 0x9000 },
		{ 0x1d, 0x3d98 },
2513 2514
		{ 0x1f, 0x0002 },
		{ 0x0c, 0x7eb8 },
2515 2516 2517
		{ 0x06, 0x0761 },
		{ 0x1f, 0x0003 },
		{ 0x16, 0x0f0a },
2518 2519 2520
		{ 0x1f, 0x0000 }
	};

2521
	rtl_writephy_batch(tp, phy_reg_init);
2522

2523 2524 2525 2526
	rtl_patchphy(tp, 0x16, 1 << 0);
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
	rtl_writephy(tp, 0x1f, 0x0000);
2527 2528
}

2529
static void rtl8168c_3_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2530
{
2531
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542
		{ 0x1f, 0x0001 },
		{ 0x12, 0x2300 },
		{ 0x1d, 0x3d98 },
		{ 0x1f, 0x0002 },
		{ 0x0c, 0x7eb8 },
		{ 0x06, 0x5461 },
		{ 0x1f, 0x0003 },
		{ 0x16, 0x0f0a },
		{ 0x1f, 0x0000 }
	};

2543
	rtl_writephy_batch(tp, phy_reg_init);
F
Francois Romieu 已提交
2544

2545 2546 2547 2548
	rtl_patchphy(tp, 0x16, 1 << 0);
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
	rtl_writephy(tp, 0x1f, 0x0000);
F
Francois Romieu 已提交
2549 2550
}

2551
static void rtl8168c_4_hw_phy_config(struct rtl8169_private *tp)
2552
{
2553
	rtl8168c_3_hw_phy_config(tp);
2554 2555
}

2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574
static const struct phy_reg rtl8168d_1_phy_reg_init_0[] = {
	/* Channel Estimation */
	{ 0x1f, 0x0001 },
	{ 0x06, 0x4064 },
	{ 0x07, 0x2863 },
	{ 0x08, 0x059c },
	{ 0x09, 0x26b4 },
	{ 0x0a, 0x6a19 },
	{ 0x0b, 0xdcc8 },
	{ 0x10, 0xf06d },
	{ 0x14, 0x7f68 },
	{ 0x18, 0x7fd9 },
	{ 0x1c, 0xf0ff },
	{ 0x1d, 0x3d9c },
	{ 0x1f, 0x0003 },
	{ 0x12, 0xf49f },
	{ 0x13, 0x070b },
	{ 0x1a, 0x05ad },
	{ 0x14, 0x94c0 },
2575

2576 2577 2578 2579 2580 2581 2582 2583 2584
	/*
	 * Tx Error Issue
	 * Enhance line driver power
	 */
	{ 0x1f, 0x0002 },
	{ 0x06, 0x5561 },
	{ 0x1f, 0x0005 },
	{ 0x05, 0x8332 },
	{ 0x06, 0x5561 },
2585

2586 2587 2588 2589 2590 2591
	/*
	 * Can not link to 1Gbps with bad cable
	 * Decrease SNR threshold form 21.07dB to 19.04dB
	 */
	{ 0x1f, 0x0001 },
	{ 0x17, 0x0cc0 },
2592

2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604
	{ 0x1f, 0x0000 },
	{ 0x0d, 0xf880 }
};

static const struct phy_reg rtl8168d_1_phy_reg_init_1[] = {
	{ 0x1f, 0x0002 },
	{ 0x05, 0x669a },
	{ 0x1f, 0x0005 },
	{ 0x05, 0x8330 },
	{ 0x06, 0x669a },
	{ 0x1f, 0x0002 }
};
2605

2606 2607 2608
static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
{
	rtl_writephy_batch(tp, rtl8168d_1_phy_reg_init_0);
2609

2610 2611 2612 2613
	/*
	 * Rx Error Issue
	 * Fine Tune Switching regulator parameter
	 */
2614
	rtl_writephy(tp, 0x1f, 0x0002);
2615 2616
	rtl_w0w1_phy(tp, 0x0b, 0x0010, 0x00ef);
	rtl_w0w1_phy(tp, 0x0c, 0xa200, 0x5d00);
2617

2618
	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
2619 2620
		int val;

2621
		rtl_writephy_batch(tp, rtl8168d_1_phy_reg_init_1);
2622

2623
		val = rtl_readphy(tp, 0x0d);
2624 2625

		if ((val & 0x00ff) != 0x006c) {
2626
			static const u32 set[] = {
2627 2628 2629 2630 2631
				0x0065, 0x0066, 0x0067, 0x0068,
				0x0069, 0x006a, 0x006b, 0x006c
			};
			int i;

2632
			rtl_writephy(tp, 0x1f, 0x0002);
2633 2634 2635

			val &= 0xff00;
			for (i = 0; i < ARRAY_SIZE(set); i++)
2636
				rtl_writephy(tp, 0x0d, val | set[i]);
2637 2638
		}
	} else {
2639
		static const struct phy_reg phy_reg_init[] = {
2640 2641 2642 2643 2644 2645 2646
			{ 0x1f, 0x0002 },
			{ 0x05, 0x6662 },
			{ 0x1f, 0x0005 },
			{ 0x05, 0x8330 },
			{ 0x06, 0x6662 }
		};

2647
		rtl_writephy_batch(tp, phy_reg_init);
2648 2649
	}

2650
	/* RSET couple improve */
2651 2652 2653
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_patchphy(tp, 0x0d, 0x0300);
	rtl_patchphy(tp, 0x0f, 0x0010);
2654

2655
	/* Fine tune PLL performance */
2656
	rtl_writephy(tp, 0x1f, 0x0002);
2657 2658
	rtl_w0w1_phy(tp, 0x02, 0x0100, 0x0600);
	rtl_w0w1_phy(tp, 0x03, 0x0000, 0xe000);
2659

2660 2661
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x001b);
2662 2663

	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00);
2664

2665
	rtl_writephy(tp, 0x1f, 0x0000);
2666 2667
}

2668
static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
2669
{
2670
	rtl_writephy_batch(tp, rtl8168d_1_phy_reg_init_0);
F
Francois Romieu 已提交
2671

2672
	if (rtl8168d_efuse_read(tp, 0x01) == 0xb1) {
2673 2674
		int val;

2675
		rtl_writephy_batch(tp, rtl8168d_1_phy_reg_init_1);
2676

2677
		val = rtl_readphy(tp, 0x0d);
2678
		if ((val & 0x00ff) != 0x006c) {
J
Joe Perches 已提交
2679
			static const u32 set[] = {
2680 2681 2682 2683 2684
				0x0065, 0x0066, 0x0067, 0x0068,
				0x0069, 0x006a, 0x006b, 0x006c
			};
			int i;

2685
			rtl_writephy(tp, 0x1f, 0x0002);
2686 2687 2688

			val &= 0xff00;
			for (i = 0; i < ARRAY_SIZE(set); i++)
2689
				rtl_writephy(tp, 0x0d, val | set[i]);
2690 2691
		}
	} else {
2692
		static const struct phy_reg phy_reg_init[] = {
2693 2694
			{ 0x1f, 0x0002 },
			{ 0x05, 0x2642 },
F
Francois Romieu 已提交
2695
			{ 0x1f, 0x0005 },
2696 2697
			{ 0x05, 0x8330 },
			{ 0x06, 0x2642 }
F
Francois Romieu 已提交
2698 2699
		};

2700
		rtl_writephy_batch(tp, phy_reg_init);
F
Francois Romieu 已提交
2701 2702
	}

2703
	/* Fine tune PLL performance */
2704
	rtl_writephy(tp, 0x1f, 0x0002);
2705 2706
	rtl_w0w1_phy(tp, 0x02, 0x0100, 0x0600);
	rtl_w0w1_phy(tp, 0x03, 0x0000, 0xe000);
2707

2708
	/* Switching regulator Slew rate */
2709 2710
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_patchphy(tp, 0x0f, 0x0017);
2711

2712 2713
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x001b);
2714 2715

	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300);
2716

2717
	rtl_writephy(tp, 0x1f, 0x0000);
2718 2719
}

2720
static void rtl8168d_3_hw_phy_config(struct rtl8169_private *tp)
2721
{
2722
	static const struct phy_reg phy_reg_init[] = {
2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777
		{ 0x1f, 0x0002 },
		{ 0x10, 0x0008 },
		{ 0x0d, 0x006c },

		{ 0x1f, 0x0000 },
		{ 0x0d, 0xf880 },

		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },

		{ 0x1f, 0x0001 },
		{ 0x0b, 0xa4d8 },
		{ 0x09, 0x281c },
		{ 0x07, 0x2883 },
		{ 0x0a, 0x6b35 },
		{ 0x1d, 0x3da4 },
		{ 0x1c, 0xeffd },
		{ 0x14, 0x7f52 },
		{ 0x18, 0x7fc6 },
		{ 0x08, 0x0601 },
		{ 0x06, 0x4063 },
		{ 0x10, 0xf074 },
		{ 0x1f, 0x0003 },
		{ 0x13, 0x0789 },
		{ 0x12, 0xf4bd },
		{ 0x1a, 0x04fd },
		{ 0x14, 0x84b0 },
		{ 0x1f, 0x0000 },
		{ 0x00, 0x9200 },

		{ 0x1f, 0x0005 },
		{ 0x01, 0x0340 },
		{ 0x1f, 0x0001 },
		{ 0x04, 0x4000 },
		{ 0x03, 0x1d21 },
		{ 0x02, 0x0c32 },
		{ 0x01, 0x0200 },
		{ 0x00, 0x5554 },
		{ 0x04, 0x4800 },
		{ 0x04, 0x4000 },
		{ 0x04, 0xf000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x101a },
		{ 0x00, 0xa0ff },
		{ 0x04, 0xf800 },
		{ 0x04, 0xf000 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0007 },
		{ 0x1e, 0x0023 },
		{ 0x16, 0x0000 },
		{ 0x1f, 0x0000 }
	};

2778
	rtl_writephy_batch(tp, phy_reg_init);
F
Francois Romieu 已提交
2779 2780
}

F
françois romieu 已提交
2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792
static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },

		{ 0x1f, 0x0007 },
		{ 0x1e, 0x002d },
		{ 0x18, 0x0040 },
		{ 0x1f, 0x0000 }
	};

2793
	rtl_writephy_batch(tp, phy_reg_init);
F
françois romieu 已提交
2794 2795 2796
	rtl_patchphy(tp, 0x0d, 1 << 5);
}

H
Hayes Wang 已提交
2797
static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
H
hayeswang 已提交
2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826
{
	static const struct phy_reg phy_reg_init[] = {
		/* Enable Delay cap */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b80 },
		{ 0x06, 0xc896 },
		{ 0x1f, 0x0000 },

		/* Channel estimation fine tune */
		{ 0x1f, 0x0001 },
		{ 0x0b, 0x6c20 },
		{ 0x07, 0x2872 },
		{ 0x1c, 0xefff },
		{ 0x1f, 0x0003 },
		{ 0x14, 0x6420 },
		{ 0x1f, 0x0000 },

		/* Update PFM & 10M TX idle timer */
		{ 0x1f, 0x0007 },
		{ 0x1e, 0x002f },
		{ 0x15, 0x1919 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0007 },
		{ 0x1e, 0x00ac },
		{ 0x18, 0x0006 },
		{ 0x1f, 0x0000 }
	};

F
Francois Romieu 已提交
2827 2828
	rtl_apply_firmware(tp);

2829
	rtl_writephy_batch(tp, phy_reg_init);
H
hayeswang 已提交
2830 2831 2832 2833

	/* DCO enable for 10M IDLE Power */
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x0023);
2834
	rtl_w0w1_phy(tp, 0x17, 0x0006, 0x0000);
H
hayeswang 已提交
2835 2836 2837 2838
	rtl_writephy(tp, 0x1f, 0x0000);

	/* For impedance matching */
	rtl_writephy(tp, 0x1f, 0x0002);
2839
	rtl_w0w1_phy(tp, 0x08, 0x8000, 0x7f00);
F
Francois Romieu 已提交
2840
	rtl_writephy(tp, 0x1f, 0x0000);
H
hayeswang 已提交
2841 2842 2843 2844

	/* PHY auto speed down */
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x002d);
2845
	rtl_w0w1_phy(tp, 0x18, 0x0050, 0x0000);
H
hayeswang 已提交
2846
	rtl_writephy(tp, 0x1f, 0x0000);
2847
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0x0000);
H
hayeswang 已提交
2848 2849 2850

	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b86);
2851
	rtl_w0w1_phy(tp, 0x06, 0x0001, 0x0000);
H
hayeswang 已提交
2852 2853 2854 2855
	rtl_writephy(tp, 0x1f, 0x0000);

	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
2856
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x2000);
H
hayeswang 已提交
2857 2858
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x0020);
2859
	rtl_w0w1_phy(tp, 0x15, 0x0000, 0x1100);
H
hayeswang 已提交
2860 2861 2862 2863 2864 2865 2866 2867 2868 2869
	rtl_writephy(tp, 0x1f, 0x0006);
	rtl_writephy(tp, 0x00, 0x5a00);
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, 0x0d, 0x0007);
	rtl_writephy(tp, 0x0e, 0x003c);
	rtl_writephy(tp, 0x0d, 0x4007);
	rtl_writephy(tp, 0x0e, 0x0000);
	rtl_writephy(tp, 0x0d, 0x0000);
}

2870 2871 2872 2873 2874 2875 2876 2877
static void rtl_rar_exgmac_set(struct rtl8169_private *tp, u8 *addr)
{
	const u16 w[] = {
		addr[0] | (addr[1] << 8),
		addr[2] | (addr[3] << 8),
		addr[4] | (addr[5] << 8)
	};

2878 2879 2880 2881
	rtl_eri_write(tp, 0xe0, ERIAR_MASK_1111, w[0] | (w[1] << 16));
	rtl_eri_write(tp, 0xe4, ERIAR_MASK_1111, w[2]);
	rtl_eri_write(tp, 0xf0, ERIAR_MASK_1111, w[0] << 16);
	rtl_eri_write(tp, 0xf4, ERIAR_MASK_1111, w[1] | (w[2] << 16));
2882 2883
}

H
Hayes Wang 已提交
2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914
static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		/* Enable Delay cap */
		{ 0x1f, 0x0004 },
		{ 0x1f, 0x0007 },
		{ 0x1e, 0x00ac },
		{ 0x18, 0x0006 },
		{ 0x1f, 0x0002 },
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0000 },

		/* Channel estimation fine tune */
		{ 0x1f, 0x0003 },
		{ 0x09, 0xa20f },
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0000 },

		/* Green Setting */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b5b },
		{ 0x06, 0x9222 },
		{ 0x05, 0x8b6d },
		{ 0x06, 0x8000 },
		{ 0x05, 0x8b76 },
		{ 0x06, 0x8000 },
		{ 0x1f, 0x0000 }
	};

	rtl_apply_firmware(tp);

2915
	rtl_writephy_batch(tp, phy_reg_init);
H
Hayes Wang 已提交
2916 2917 2918 2919

	/* For 4-corner performance improve */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b80);
2920
	rtl_w0w1_phy(tp, 0x17, 0x0006, 0x0000);
H
Hayes Wang 已提交
2921 2922 2923 2924 2925 2926
	rtl_writephy(tp, 0x1f, 0x0000);

	/* PHY auto speed down */
	rtl_writephy(tp, 0x1f, 0x0004);
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x002d);
2927
	rtl_w0w1_phy(tp, 0x18, 0x0010, 0x0000);
H
Hayes Wang 已提交
2928 2929
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_writephy(tp, 0x1f, 0x0000);
2930
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0x0000);
H
Hayes Wang 已提交
2931 2932 2933 2934

	/* improve 10M EEE waveform */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b86);
2935
	rtl_w0w1_phy(tp, 0x06, 0x0001, 0x0000);
H
Hayes Wang 已提交
2936 2937 2938 2939 2940
	rtl_writephy(tp, 0x1f, 0x0000);

	/* Improve 2-pair detection performance */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
2941
	rtl_w0w1_phy(tp, 0x06, 0x4000, 0x0000);
H
Hayes Wang 已提交
2942 2943
	rtl_writephy(tp, 0x1f, 0x0000);

2944
	rtl8168f_config_eee_phy(tp);
2945
	rtl_enable_eee(tp);
H
Hayes Wang 已提交
2946 2947 2948

	/* Green feature */
	rtl_writephy(tp, 0x1f, 0x0003);
2949 2950
	rtl_w0w1_phy(tp, 0x19, 0x0001, 0x0000);
	rtl_w0w1_phy(tp, 0x10, 0x0400, 0x0000);
H
Hayes Wang 已提交
2951
	rtl_writephy(tp, 0x1f, 0x0000);
2952 2953 2954
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_w0w1_phy(tp, 0x01, 0x0100, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);
H
hayeswang 已提交
2955

2956 2957
	/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */
	rtl_rar_exgmac_set(tp, tp->dev->dev_addr);
H
Hayes Wang 已提交
2958 2959
}

2960 2961 2962 2963 2964
static void rtl8168f_hw_phy_config(struct rtl8169_private *tp)
{
	/* For 4-corner performance improve */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b80);
2965
	rtl_w0w1_phy(tp, 0x06, 0x0006, 0x0000);
2966 2967 2968 2969 2970
	rtl_writephy(tp, 0x1f, 0x0000);

	/* PHY auto speed down */
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x002d);
2971
	rtl_w0w1_phy(tp, 0x18, 0x0010, 0x0000);
2972
	rtl_writephy(tp, 0x1f, 0x0000);
2973
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0x0000);
2974 2975 2976 2977

	/* Improve 10M EEE waveform */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b86);
2978
	rtl_w0w1_phy(tp, 0x06, 0x0001, 0x0000);
2979
	rtl_writephy(tp, 0x1f, 0x0000);
2980 2981

	rtl8168f_config_eee_phy(tp);
2982
	rtl_enable_eee(tp);
2983 2984
}

2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023
static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		/* Channel estimation fine tune */
		{ 0x1f, 0x0003 },
		{ 0x09, 0xa20f },
		{ 0x1f, 0x0000 },

		/* Modify green table for giga & fnet */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b55 },
		{ 0x06, 0x0000 },
		{ 0x05, 0x8b5e },
		{ 0x06, 0x0000 },
		{ 0x05, 0x8b67 },
		{ 0x06, 0x0000 },
		{ 0x05, 0x8b70 },
		{ 0x06, 0x0000 },
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0007 },
		{ 0x1e, 0x0078 },
		{ 0x17, 0x0000 },
		{ 0x19, 0x00fb },
		{ 0x1f, 0x0000 },

		/* Modify green table for 10M */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b79 },
		{ 0x06, 0xaa00 },
		{ 0x1f, 0x0000 },

		/* Disable hiimpedance detection (RTCT) */
		{ 0x1f, 0x0003 },
		{ 0x01, 0x328a },
		{ 0x1f, 0x0000 }
	};

	rtl_apply_firmware(tp);

3024
	rtl_writephy_batch(tp, phy_reg_init);
3025

3026
	rtl8168f_hw_phy_config(tp);
3027 3028 3029 3030

	/* Improve 2-pair detection performance */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
3031
	rtl_w0w1_phy(tp, 0x06, 0x4000, 0x0000);
3032 3033 3034 3035 3036 3037 3038
	rtl_writephy(tp, 0x1f, 0x0000);
}

static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
{
	rtl_apply_firmware(tp);

3039
	rtl8168f_hw_phy_config(tp);
3040 3041
}

3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086
static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		/* Channel estimation fine tune */
		{ 0x1f, 0x0003 },
		{ 0x09, 0xa20f },
		{ 0x1f, 0x0000 },

		/* Modify green table for giga & fnet */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b55 },
		{ 0x06, 0x0000 },
		{ 0x05, 0x8b5e },
		{ 0x06, 0x0000 },
		{ 0x05, 0x8b67 },
		{ 0x06, 0x0000 },
		{ 0x05, 0x8b70 },
		{ 0x06, 0x0000 },
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0007 },
		{ 0x1e, 0x0078 },
		{ 0x17, 0x0000 },
		{ 0x19, 0x00aa },
		{ 0x1f, 0x0000 },

		/* Modify green table for 10M */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b79 },
		{ 0x06, 0xaa00 },
		{ 0x1f, 0x0000 },

		/* Disable hiimpedance detection (RTCT) */
		{ 0x1f, 0x0003 },
		{ 0x01, 0x328a },
		{ 0x1f, 0x0000 }
	};


	rtl_apply_firmware(tp);

	rtl8168f_hw_phy_config(tp);

	/* Improve 2-pair detection performance */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
3087
	rtl_w0w1_phy(tp, 0x06, 0x4000, 0x0000);
3088 3089
	rtl_writephy(tp, 0x1f, 0x0000);

3090
	rtl_writephy_batch(tp, phy_reg_init);
3091 3092 3093 3094

	/* Modify green table for giga */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b54);
3095
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x0800);
3096
	rtl_writephy(tp, 0x05, 0x8b5d);
3097
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x0800);
3098
	rtl_writephy(tp, 0x05, 0x8a7c);
3099
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x0100);
3100
	rtl_writephy(tp, 0x05, 0x8a7f);
3101
	rtl_w0w1_phy(tp, 0x06, 0x0100, 0x0000);
3102
	rtl_writephy(tp, 0x05, 0x8a82);
3103
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x0100);
3104
	rtl_writephy(tp, 0x05, 0x8a85);
3105
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x0100);
3106
	rtl_writephy(tp, 0x05, 0x8a88);
3107
	rtl_w0w1_phy(tp, 0x06, 0x0000, 0x0100);
3108 3109 3110 3111 3112
	rtl_writephy(tp, 0x1f, 0x0000);

	/* uc same-seed solution */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
3113
	rtl_w0w1_phy(tp, 0x06, 0x8000, 0x0000);
3114 3115 3116 3117
	rtl_writephy(tp, 0x1f, 0x0000);

	/* Green feature */
	rtl_writephy(tp, 0x1f, 0x0003);
3118 3119
	rtl_w0w1_phy(tp, 0x19, 0x0000, 0x0001);
	rtl_w0w1_phy(tp, 0x10, 0x0000, 0x0400);
3120 3121 3122
	rtl_writephy(tp, 0x1f, 0x0000);
}

3123 3124
static void rtl8168g_disable_aldps(struct rtl8169_private *tp)
{
3125
	phy_modify_paged(tp->phydev, 0x0a43, 0x10, BIT(2), 0);
3126 3127
}

3128 3129 3130 3131
static void rtl8168g_phy_adjust_10m_aldps(struct rtl8169_private *tp)
{
	struct phy_device *phydev = tp->phydev;

3132 3133
	phy_modify_paged(phydev, 0x0bcc, 0x14, BIT(8), 0);
	phy_modify_paged(phydev, 0x0a44, 0x11, 0, BIT(7) | BIT(6));
3134 3135 3136 3137 3138 3139 3140 3141
	phy_write(phydev, 0x1f, 0x0a43);
	phy_write(phydev, 0x13, 0x8084);
	phy_clear_bits(phydev, 0x14, BIT(14) | BIT(13));
	phy_set_bits(phydev, 0x10, BIT(12) | BIT(1) | BIT(0));

	phy_write(phydev, 0x1f, 0x0000);
}

H
Hayes Wang 已提交
3142 3143
static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp)
{
3144 3145
	int ret;

H
Hayes Wang 已提交
3146 3147
	rtl_apply_firmware(tp);

3148 3149 3150 3151 3152
	ret = phy_read_paged(tp->phydev, 0x0a46, 0x10);
	if (ret & BIT(8))
		phy_modify_paged(tp->phydev, 0x0bcc, 0x12, BIT(15), 0);
	else
		phy_modify_paged(tp->phydev, 0x0bcc, 0x12, 0, BIT(15));
H
Hayes Wang 已提交
3153

3154 3155
	ret = phy_read_paged(tp->phydev, 0x0a46, 0x13);
	if (ret & BIT(8))
T
Thomas Voegtle 已提交
3156
		phy_modify_paged(tp->phydev, 0x0c41, 0x15, 0, BIT(1));
3157
	else
T
Thomas Voegtle 已提交
3158
		phy_modify_paged(tp->phydev, 0x0c41, 0x15, BIT(1), 0);
H
Hayes Wang 已提交
3159

3160
	/* Enable PHY auto speed down */
3161
	phy_modify_paged(tp->phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
H
Hayes Wang 已提交
3162

3163
	rtl8168g_phy_adjust_10m_aldps(tp);
3164

3165
	/* EEE auto-fallback function */
3166
	phy_modify_paged(tp->phydev, 0x0a4b, 0x11, 0, BIT(2));
H
Hayes Wang 已提交
3167

3168 3169 3170
	/* Enable UC LPF tune function */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x8012);
3171
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0x0000);
3172

3173
	phy_modify_paged(tp->phydev, 0x0c42, 0x11, BIT(13), BIT(14));
3174

3175 3176 3177 3178 3179 3180 3181 3182 3183 3184
	/* Improve SWR Efficiency */
	rtl_writephy(tp, 0x1f, 0x0bcd);
	rtl_writephy(tp, 0x14, 0x5065);
	rtl_writephy(tp, 0x14, 0xd065);
	rtl_writephy(tp, 0x1f, 0x0bc8);
	rtl_writephy(tp, 0x11, 0x5655);
	rtl_writephy(tp, 0x1f, 0x0bcd);
	rtl_writephy(tp, 0x14, 0x1065);
	rtl_writephy(tp, 0x14, 0x9065);
	rtl_writephy(tp, 0x14, 0x1065);
3185
	rtl_writephy(tp, 0x1f, 0x0000);
3186

3187
	rtl8168g_disable_aldps(tp);
3188
	rtl8168g_config_eee_phy(tp);
3189
	rtl_enable_eee(tp);
H
Hayes Wang 已提交
3190 3191
}

H
hayeswang 已提交
3192 3193 3194
static void rtl8168g_2_hw_phy_config(struct rtl8169_private *tp)
{
	rtl_apply_firmware(tp);
3195
	rtl8168g_config_eee_phy(tp);
3196
	rtl_enable_eee(tp);
H
hayeswang 已提交
3197 3198
}

3199 3200 3201 3202 3203 3204 3205 3206 3207 3208
static void rtl8168h_1_hw_phy_config(struct rtl8169_private *tp)
{
	u16 dout_tapbin;
	u32 data;

	rtl_apply_firmware(tp);

	/* CHN EST parameters adjust - giga master */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x809b);
3209
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0xf800);
3210
	rtl_writephy(tp, 0x13, 0x80a2);
3211
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0xff00);
3212
	rtl_writephy(tp, 0x13, 0x80a4);
3213
	rtl_w0w1_phy(tp, 0x14, 0x8500, 0xff00);
3214
	rtl_writephy(tp, 0x13, 0x809c);
3215
	rtl_w0w1_phy(tp, 0x14, 0xbd00, 0xff00);
3216 3217 3218 3219 3220
	rtl_writephy(tp, 0x1f, 0x0000);

	/* CHN EST parameters adjust - giga slave */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x80ad);
3221
	rtl_w0w1_phy(tp, 0x14, 0x7000, 0xf800);
3222
	rtl_writephy(tp, 0x13, 0x80b4);
3223
	rtl_w0w1_phy(tp, 0x14, 0x5000, 0xff00);
3224
	rtl_writephy(tp, 0x13, 0x80ac);
3225
	rtl_w0w1_phy(tp, 0x14, 0x4000, 0xff00);
3226 3227 3228 3229 3230
	rtl_writephy(tp, 0x1f, 0x0000);

	/* CHN EST parameters adjust - fnet */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x808e);
3231
	rtl_w0w1_phy(tp, 0x14, 0x1200, 0xff00);
3232
	rtl_writephy(tp, 0x13, 0x8090);
3233
	rtl_w0w1_phy(tp, 0x14, 0xe500, 0xff00);
3234
	rtl_writephy(tp, 0x13, 0x8092);
3235
	rtl_w0w1_phy(tp, 0x14, 0x9f00, 0xff00);
3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253
	rtl_writephy(tp, 0x1f, 0x0000);

	/* enable R-tune & PGA-retune function */
	dout_tapbin = 0;
	rtl_writephy(tp, 0x1f, 0x0a46);
	data = rtl_readphy(tp, 0x13);
	data &= 3;
	data <<= 2;
	dout_tapbin |= data;
	data = rtl_readphy(tp, 0x12);
	data &= 0xc000;
	data >>= 14;
	dout_tapbin |= data;
	dout_tapbin = ~(dout_tapbin^0x08);
	dout_tapbin <<= 12;
	dout_tapbin &= 0xf000;
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x827a);
3254
	rtl_w0w1_phy(tp, 0x14, dout_tapbin, 0xf000);
3255
	rtl_writephy(tp, 0x13, 0x827b);
3256
	rtl_w0w1_phy(tp, 0x14, dout_tapbin, 0xf000);
3257
	rtl_writephy(tp, 0x13, 0x827c);
3258
	rtl_w0w1_phy(tp, 0x14, dout_tapbin, 0xf000);
3259
	rtl_writephy(tp, 0x13, 0x827d);
3260
	rtl_w0w1_phy(tp, 0x14, dout_tapbin, 0xf000);
3261 3262 3263

	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x0811);
3264
	rtl_w0w1_phy(tp, 0x14, 0x0800, 0x0000);
3265
	rtl_writephy(tp, 0x1f, 0x0a42);
3266
	rtl_w0w1_phy(tp, 0x16, 0x0002, 0x0000);
3267 3268 3269
	rtl_writephy(tp, 0x1f, 0x0000);

	/* enable GPHY 10M */
3270
	phy_modify_paged(tp->phydev, 0x0a44, 0x11, 0, BIT(11));
3271 3272

	/* SAR ADC performance */
3273
	phy_modify_paged(tp->phydev, 0x0bca, 0x17, BIT(12) | BIT(13), BIT(14));
3274 3275 3276

	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x803f);
3277
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3278
	rtl_writephy(tp, 0x13, 0x8047);
3279
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3280
	rtl_writephy(tp, 0x13, 0x804f);
3281
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3282
	rtl_writephy(tp, 0x13, 0x8057);
3283
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3284
	rtl_writephy(tp, 0x13, 0x805f);
3285
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3286
	rtl_writephy(tp, 0x13, 0x8067);
3287
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3288
	rtl_writephy(tp, 0x13, 0x806f);
3289
	rtl_w0w1_phy(tp, 0x14, 0x0000, 0x3000);
3290 3291 3292
	rtl_writephy(tp, 0x1f, 0x0000);

	/* disable phy pfm mode */
3293
	phy_modify_paged(tp->phydev, 0x0a44, 0x11, BIT(7), 0);
3294

3295
	rtl8168g_disable_aldps(tp);
3296
	rtl8168h_config_eee_phy(tp);
3297
	rtl_enable_eee(tp);
3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310
}

static void rtl8168h_2_hw_phy_config(struct rtl8169_private *tp)
{
	u16 ioffset_p3, ioffset_p2, ioffset_p1, ioffset_p0;
	u16 rlen;
	u32 data;

	rtl_apply_firmware(tp);

	/* CHIN EST parameter update */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x808a);
3311
	rtl_w0w1_phy(tp, 0x14, 0x000a, 0x003f);
3312 3313 3314 3315 3316
	rtl_writephy(tp, 0x1f, 0x0000);

	/* enable R-tune & PGA-retune function */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x0811);
3317
	rtl_w0w1_phy(tp, 0x14, 0x0800, 0x0000);
3318
	rtl_writephy(tp, 0x1f, 0x0a42);
3319
	rtl_w0w1_phy(tp, 0x16, 0x0002, 0x0000);
3320 3321 3322
	rtl_writephy(tp, 0x1f, 0x0000);

	/* enable GPHY 10M */
3323
	phy_modify_paged(tp->phydev, 0x0a44, 0x11, 0, BIT(11));
3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338

	r8168_mac_ocp_write(tp, 0xdd02, 0x807d);
	data = r8168_mac_ocp_read(tp, 0xdd02);
	ioffset_p3 = ((data & 0x80)>>7);
	ioffset_p3 <<= 3;

	data = r8168_mac_ocp_read(tp, 0xdd00);
	ioffset_p3 |= ((data & (0xe000))>>13);
	ioffset_p2 = ((data & (0x1e00))>>9);
	ioffset_p1 = ((data & (0x01e0))>>5);
	ioffset_p0 = ((data & 0x0010)>>4);
	ioffset_p0 <<= 3;
	ioffset_p0 |= (data & (0x07));
	data = (ioffset_p3<<12)|(ioffset_p2<<8)|(ioffset_p1<<4)|(ioffset_p0);

3339
	if ((ioffset_p3 != 0x0f) || (ioffset_p2 != 0x0f) ||
3340
	    (ioffset_p1 != 0x0f) || (ioffset_p0 != 0x0f)) {
3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358
		rtl_writephy(tp, 0x1f, 0x0bcf);
		rtl_writephy(tp, 0x16, data);
		rtl_writephy(tp, 0x1f, 0x0000);
	}

	/* Modify rlen (TX LPF corner frequency) level */
	rtl_writephy(tp, 0x1f, 0x0bcd);
	data = rtl_readphy(tp, 0x16);
	data &= 0x000f;
	rlen = 0;
	if (data > 3)
		rlen = data - 3;
	data = rlen | (rlen<<4) | (rlen<<8) | (rlen<<12);
	rtl_writephy(tp, 0x17, data);
	rtl_writephy(tp, 0x1f, 0x0bcd);
	rtl_writephy(tp, 0x1f, 0x0000);

	/* disable phy pfm mode */
3359
	phy_modify_paged(tp->phydev, 0x0a44, 0x11, BIT(7), 0);
3360

3361
	rtl8168g_disable_aldps(tp);
3362
	rtl8168g_config_eee_phy(tp);
3363
	rtl_enable_eee(tp);
3364 3365
}

C
Chun-Hao Lin 已提交
3366 3367 3368
static void rtl8168ep_1_hw_phy_config(struct rtl8169_private *tp)
{
	/* Enable PHY auto speed down */
3369
	phy_modify_paged(tp->phydev, 0x0a44, 0x11, 0, BIT(3) | BIT(2));
C
Chun-Hao Lin 已提交
3370

3371
	rtl8168g_phy_adjust_10m_aldps(tp);
C
Chun-Hao Lin 已提交
3372 3373

	/* Enable EEE auto-fallback function */
3374
	phy_modify_paged(tp->phydev, 0x0a4b, 0x11, 0, BIT(2));
C
Chun-Hao Lin 已提交
3375 3376 3377 3378 3379 3380 3381 3382

	/* Enable UC LPF tune function */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x8012);
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);

	/* set rg_sel_sdm_rate */
3383
	phy_modify_paged(tp->phydev, 0x0c42, 0x11, BIT(13), BIT(14));
C
Chun-Hao Lin 已提交
3384

3385
	rtl8168g_disable_aldps(tp);
3386
	rtl8168g_config_eee_phy(tp);
3387
	rtl_enable_eee(tp);
C
Chun-Hao Lin 已提交
3388 3389 3390 3391
}

static void rtl8168ep_2_hw_phy_config(struct rtl8169_private *tp)
{
3392
	rtl8168g_phy_adjust_10m_aldps(tp);
C
Chun-Hao Lin 已提交
3393 3394 3395 3396 3397 3398 3399 3400

	/* Enable UC LPF tune function */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x8012);
	rtl_w0w1_phy(tp, 0x14, 0x8000, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);

	/* Set rg_sel_sdm_rate */
3401
	phy_modify_paged(tp->phydev, 0x0c42, 0x11, BIT(13), BIT(14));
C
Chun-Hao Lin 已提交
3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461

	/* Channel estimation parameters */
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x80f3);
	rtl_w0w1_phy(tp, 0x14, 0x8b00, ~0x8bff);
	rtl_writephy(tp, 0x13, 0x80f0);
	rtl_w0w1_phy(tp, 0x14, 0x3a00, ~0x3aff);
	rtl_writephy(tp, 0x13, 0x80ef);
	rtl_w0w1_phy(tp, 0x14, 0x0500, ~0x05ff);
	rtl_writephy(tp, 0x13, 0x80f6);
	rtl_w0w1_phy(tp, 0x14, 0x6e00, ~0x6eff);
	rtl_writephy(tp, 0x13, 0x80ec);
	rtl_w0w1_phy(tp, 0x14, 0x6800, ~0x68ff);
	rtl_writephy(tp, 0x13, 0x80ed);
	rtl_w0w1_phy(tp, 0x14, 0x7c00, ~0x7cff);
	rtl_writephy(tp, 0x13, 0x80f2);
	rtl_w0w1_phy(tp, 0x14, 0xf400, ~0xf4ff);
	rtl_writephy(tp, 0x13, 0x80f4);
	rtl_w0w1_phy(tp, 0x14, 0x8500, ~0x85ff);
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x8110);
	rtl_w0w1_phy(tp, 0x14, 0xa800, ~0xa8ff);
	rtl_writephy(tp, 0x13, 0x810f);
	rtl_w0w1_phy(tp, 0x14, 0x1d00, ~0x1dff);
	rtl_writephy(tp, 0x13, 0x8111);
	rtl_w0w1_phy(tp, 0x14, 0xf500, ~0xf5ff);
	rtl_writephy(tp, 0x13, 0x8113);
	rtl_w0w1_phy(tp, 0x14, 0x6100, ~0x61ff);
	rtl_writephy(tp, 0x13, 0x8115);
	rtl_w0w1_phy(tp, 0x14, 0x9200, ~0x92ff);
	rtl_writephy(tp, 0x13, 0x810e);
	rtl_w0w1_phy(tp, 0x14, 0x0400, ~0x04ff);
	rtl_writephy(tp, 0x13, 0x810c);
	rtl_w0w1_phy(tp, 0x14, 0x7c00, ~0x7cff);
	rtl_writephy(tp, 0x13, 0x810b);
	rtl_w0w1_phy(tp, 0x14, 0x5a00, ~0x5aff);
	rtl_writephy(tp, 0x1f, 0x0a43);
	rtl_writephy(tp, 0x13, 0x80d1);
	rtl_w0w1_phy(tp, 0x14, 0xff00, ~0xffff);
	rtl_writephy(tp, 0x13, 0x80cd);
	rtl_w0w1_phy(tp, 0x14, 0x9e00, ~0x9eff);
	rtl_writephy(tp, 0x13, 0x80d3);
	rtl_w0w1_phy(tp, 0x14, 0x0e00, ~0x0eff);
	rtl_writephy(tp, 0x13, 0x80d5);
	rtl_w0w1_phy(tp, 0x14, 0xca00, ~0xcaff);
	rtl_writephy(tp, 0x13, 0x80d7);
	rtl_w0w1_phy(tp, 0x14, 0x8400, ~0x84ff);

	/* Force PWM-mode */
	rtl_writephy(tp, 0x1f, 0x0bcd);
	rtl_writephy(tp, 0x14, 0x5065);
	rtl_writephy(tp, 0x14, 0xd065);
	rtl_writephy(tp, 0x1f, 0x0bc8);
	rtl_writephy(tp, 0x12, 0x00ed);
	rtl_writephy(tp, 0x1f, 0x0bcd);
	rtl_writephy(tp, 0x14, 0x1065);
	rtl_writephy(tp, 0x14, 0x9065);
	rtl_writephy(tp, 0x14, 0x1065);
	rtl_writephy(tp, 0x1f, 0x0000);

3462
	rtl8168g_disable_aldps(tp);
3463
	rtl8168g_config_eee_phy(tp);
3464
	rtl_enable_eee(tp);
C
Chun-Hao Lin 已提交
3465 3466
}

3467
static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
3468
{
3469
	static const struct phy_reg phy_reg_init[] = {
3470 3471 3472 3473 3474 3475
		{ 0x1f, 0x0003 },
		{ 0x08, 0x441d },
		{ 0x01, 0x9100 },
		{ 0x1f, 0x0000 }
	};

3476 3477 3478 3479
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_patchphy(tp, 0x11, 1 << 12);
	rtl_patchphy(tp, 0x19, 1 << 13);
	rtl_patchphy(tp, 0x10, 1 << 15);
3480

3481
	rtl_writephy_batch(tp, phy_reg_init);
3482 3483
}

3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500
static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		{ 0x1f, 0x0005 },
		{ 0x1a, 0x0000 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0004 },
		{ 0x1c, 0x0000 },
		{ 0x1f, 0x0000 },

		{ 0x1f, 0x0001 },
		{ 0x15, 0x7701 },
		{ 0x1f, 0x0000 }
	};

	/* Disable ALDPS before ram code */
3501 3502 3503
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, 0x18, 0x0310);
	msleep(100);
3504

3505
	rtl_apply_firmware(tp);
3506

3507
	rtl_writephy_batch(tp, phy_reg_init);
3508 3509
}

3510 3511 3512
static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
{
	/* Disable ALDPS before setting firmware */
3513 3514 3515
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, 0x18, 0x0310);
	msleep(20);
3516 3517 3518 3519

	rtl_apply_firmware(tp);

	/* EEE setting */
3520
	rtl_eri_write(tp, 0x1b0, ERIAR_MASK_0011, 0x0000);
3521 3522 3523 3524 3525 3526
	rtl_writephy(tp, 0x1f, 0x0004);
	rtl_writephy(tp, 0x10, 0x401f);
	rtl_writephy(tp, 0x19, 0x7030);
	rtl_writephy(tp, 0x1f, 0x0000);
}

H
Hayes Wang 已提交
3527 3528 3529 3530 3531 3532 3533 3534 3535 3536
static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		{ 0x1f, 0x0004 },
		{ 0x10, 0xc07f },
		{ 0x19, 0x7030 },
		{ 0x1f, 0x0000 }
	};

	/* Disable ALDPS before ram code */
3537 3538 3539
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, 0x18, 0x0310);
	msleep(100);
H
Hayes Wang 已提交
3540 3541 3542

	rtl_apply_firmware(tp);

3543
	rtl_eri_write(tp, 0x1b0, ERIAR_MASK_0011, 0x0000);
3544
	rtl_writephy_batch(tp, phy_reg_init);
H
Hayes Wang 已提交
3545

3546
	rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000);
H
Hayes Wang 已提交
3547 3548
}

3549 3550
static void rtl_hw_phy_config(struct net_device *dev)
{
3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604
	static const rtl_generic_fct phy_configs[] = {
		/* PCI devices. */
		[RTL_GIGA_MAC_VER_02] = rtl8169s_hw_phy_config,
		[RTL_GIGA_MAC_VER_03] = rtl8169s_hw_phy_config,
		[RTL_GIGA_MAC_VER_04] = rtl8169sb_hw_phy_config,
		[RTL_GIGA_MAC_VER_05] = rtl8169scd_hw_phy_config,
		[RTL_GIGA_MAC_VER_06] = rtl8169sce_hw_phy_config,
		/* PCI-E devices. */
		[RTL_GIGA_MAC_VER_07] = rtl8102e_hw_phy_config,
		[RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
		[RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
		[RTL_GIGA_MAC_VER_10] = NULL,
		[RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
		[RTL_GIGA_MAC_VER_12] = rtl8168bef_hw_phy_config,
		[RTL_GIGA_MAC_VER_13] = NULL,
		[RTL_GIGA_MAC_VER_14] = NULL,
		[RTL_GIGA_MAC_VER_15] = NULL,
		[RTL_GIGA_MAC_VER_16] = NULL,
		[RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
		[RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_19] = rtl8168c_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_20] = rtl8168c_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_21] = rtl8168c_3_hw_phy_config,
		[RTL_GIGA_MAC_VER_22] = rtl8168c_4_hw_phy_config,
		[RTL_GIGA_MAC_VER_23] = rtl8168cp_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_24] = rtl8168cp_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_25] = rtl8168d_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_26] = rtl8168d_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_27] = rtl8168d_3_hw_phy_config,
		[RTL_GIGA_MAC_VER_28] = rtl8168d_4_hw_phy_config,
		[RTL_GIGA_MAC_VER_29] = rtl8105e_hw_phy_config,
		[RTL_GIGA_MAC_VER_30] = rtl8105e_hw_phy_config,
		[RTL_GIGA_MAC_VER_31] = NULL,
		[RTL_GIGA_MAC_VER_32] = rtl8168e_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_33] = rtl8168e_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_34] = rtl8168e_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_35] = rtl8168f_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_36] = rtl8168f_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_37] = rtl8402_hw_phy_config,
		[RTL_GIGA_MAC_VER_38] = rtl8411_hw_phy_config,
		[RTL_GIGA_MAC_VER_39] = rtl8106e_hw_phy_config,
		[RTL_GIGA_MAC_VER_40] = rtl8168g_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_41] = NULL,
		[RTL_GIGA_MAC_VER_42] = rtl8168g_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_43] = rtl8168g_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_44] = rtl8168g_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_45] = rtl8168h_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_46] = rtl8168h_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_47] = rtl8168h_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_48] = rtl8168h_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_49] = rtl8168ep_1_hw_phy_config,
		[RTL_GIGA_MAC_VER_50] = rtl8168ep_2_hw_phy_config,
		[RTL_GIGA_MAC_VER_51] = rtl8168ep_2_hw_phy_config,
	};
3605 3606
	struct rtl8169_private *tp = netdev_priv(dev);

3607 3608
	if (phy_configs[tp->mac_version])
		phy_configs[tp->mac_version](tp);
3609 3610
}

3611 3612 3613 3614 3615 3616
static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)
{
	if (!test_and_set_bit(flag, tp->wk.flags))
		schedule_work(&tp->wk.work);
}

3617 3618
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
{
3619
	rtl_hw_phy_config(dev);
3620

3621
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
3622 3623
		pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
3624 3625
		netif_dbg(tp, drv, dev,
			  "Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
3626
		RTL_W8(tp, 0x82, 0x01);
3627
	}
3628

3629
	/* We may have called phy_speed_down before */
3630
	phy_speed_up(tp->phydev);
3631

3632
	genphy_soft_reset(tp->phydev);
3633 3634
}

3635 3636
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
{
3637
	rtl_lock_work(tp);
3638

3639
	rtl_unlock_config_regs(tp);
3640

3641 3642
	RTL_W32(tp, MAC4, addr[4] | addr[5] << 8);
	RTL_R32(tp, MAC4);
3643

3644 3645
	RTL_W32(tp, MAC0, addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
	RTL_R32(tp, MAC0);
3646

3647 3648
	if (tp->mac_version == RTL_GIGA_MAC_VER_34)
		rtl_rar_exgmac_set(tp, addr);
3649

3650
	rtl_lock_config_regs(tp);
3651

3652
	rtl_unlock_work(tp);
3653 3654 3655 3656 3657
}

static int rtl_set_mac_address(struct net_device *dev, void *p)
{
	struct rtl8169_private *tp = netdev_priv(dev);
H
Heiner Kallweit 已提交
3658
	struct device *d = tp_to_dev(tp);
3659
	int ret;
3660

3661 3662 3663
	ret = eth_mac_addr(dev, p);
	if (ret)
		return ret;
3664

3665 3666 3667 3668 3669 3670
	pm_runtime_get_noresume(d);

	if (pm_runtime_active(d))
		rtl_rar_set(tp, dev->dev_addr);

	pm_runtime_put_noidle(d);
3671 3672 3673 3674

	return 0;
}

3675
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
F
Francois Romieu 已提交
3676
{
3677 3678
	struct rtl8169_private *tp = netdev_priv(dev);

H
Heiner Kallweit 已提交
3679 3680
	if (!netif_running(dev))
		return -ENODEV;
3681

3682
	return phy_mii_ioctl(tp->phydev, ifr, cmd);
F
Francois Romieu 已提交
3683 3684
}

3685 3686 3687
static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
3688 3689
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
3690 3691 3692 3693 3694
	case RTL_GIGA_MAC_VER_29:
	case RTL_GIGA_MAC_VER_30:
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
	case RTL_GIGA_MAC_VER_34:
3695
	case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_51:
3696
		RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) |
3697 3698 3699 3700 3701 3702 3703
			AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
		break;
	default:
		break;
	}
}

3704
static void rtl_pll_power_down(struct rtl8169_private *tp)
F
françois romieu 已提交
3705
{
3706
	if (r8168_check_dash(tp))
F
françois romieu 已提交
3707 3708
		return;

H
hayeswang 已提交
3709 3710
	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_33)
3711
		rtl_ephy_write(tp, 0x19, 0xff64);
H
hayeswang 已提交
3712

3713 3714 3715
	if (device_may_wakeup(tp_to_dev(tp))) {
		phy_speed_down(tp->phydev, false);
		rtl_wol_suspend_quirk(tp);
F
françois romieu 已提交
3716
		return;
3717
	}
F
françois romieu 已提交
3718 3719

	switch (tp->mac_version) {
3720
	case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33:
3721 3722 3723
	case RTL_GIGA_MAC_VER_37:
	case RTL_GIGA_MAC_VER_39:
	case RTL_GIGA_MAC_VER_43:
3724
	case RTL_GIGA_MAC_VER_44:
3725 3726
	case RTL_GIGA_MAC_VER_45:
	case RTL_GIGA_MAC_VER_46:
3727 3728
	case RTL_GIGA_MAC_VER_47:
	case RTL_GIGA_MAC_VER_48:
C
Chun-Hao Lin 已提交
3729 3730
	case RTL_GIGA_MAC_VER_50:
	case RTL_GIGA_MAC_VER_51:
3731
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80);
F
françois romieu 已提交
3732
		break;
3733 3734
	case RTL_GIGA_MAC_VER_40:
	case RTL_GIGA_MAC_VER_41:
C
Chun-Hao Lin 已提交
3735
	case RTL_GIGA_MAC_VER_49:
3736
		rtl_eri_clear_bits(tp, 0x1a8, ERIAR_MASK_1111, 0xfc000000);
3737
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80);
3738
		break;
3739 3740
	default:
		break;
F
françois romieu 已提交
3741 3742 3743
	}
}

3744
static void rtl_pll_power_up(struct rtl8169_private *tp)
F
françois romieu 已提交
3745 3746
{
	switch (tp->mac_version) {
3747
	case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33:
3748 3749 3750
	case RTL_GIGA_MAC_VER_37:
	case RTL_GIGA_MAC_VER_39:
	case RTL_GIGA_MAC_VER_43:
3751
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0x80);
F
françois romieu 已提交
3752
		break;
3753
	case RTL_GIGA_MAC_VER_44:
3754 3755
	case RTL_GIGA_MAC_VER_45:
	case RTL_GIGA_MAC_VER_46:
3756 3757
	case RTL_GIGA_MAC_VER_47:
	case RTL_GIGA_MAC_VER_48:
C
Chun-Hao Lin 已提交
3758 3759
	case RTL_GIGA_MAC_VER_50:
	case RTL_GIGA_MAC_VER_51:
3760
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0);
3761
		break;
3762 3763
	case RTL_GIGA_MAC_VER_40:
	case RTL_GIGA_MAC_VER_41:
C
Chun-Hao Lin 已提交
3764
	case RTL_GIGA_MAC_VER_49:
3765
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0);
3766
		rtl_eri_set_bits(tp, 0x1a8, ERIAR_MASK_1111, 0xfc000000);
3767
		break;
3768 3769
	default:
		break;
F
françois romieu 已提交
3770 3771
	}

3772
	phy_resume(tp->phydev);
3773 3774
	/* give MAC/PHY some time to resume */
	msleep(20);
F
françois romieu 已提交
3775 3776
}

3777 3778 3779
static void rtl_init_rxcfg(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
3780
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
3781
	case RTL_GIGA_MAC_VER_10 ... RTL_GIGA_MAC_VER_17:
3782
		RTL_W32(tp, RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
3783
		break;
3784
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_24:
3785 3786
	case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_36:
	case RTL_GIGA_MAC_VER_38:
3787
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
3788
		break;
3789
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:
3790
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF);
3791
		break;
3792
	default:
3793
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_DMA_BURST);
3794 3795 3796 3797
		break;
	}
}

3798 3799
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
{
3800
	tp->dirty_tx = tp->cur_tx = tp->cur_rx = 0;
3801 3802
}

F
Francois Romieu 已提交
3803 3804
static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
{
3805 3806
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
3807
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_512B);
F
Francois Romieu 已提交
3808 3809 3810 3811
}

static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
{
3812 3813
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
3814
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
F
Francois Romieu 已提交
3815 3816 3817 3818
}

static void r8168dp_hw_jumbo_enable(struct rtl8169_private *tp)
{
3819
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
F
Francois Romieu 已提交
3820 3821 3822 3823
}

static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
{
3824
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
F
Francois Romieu 已提交
3825 3826 3827 3828
}

static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
{
3829 3830 3831
	RTL_W8(tp, MaxTxPacketSize, 0x3f);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | 0x01);
3832
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_512B);
F
Francois Romieu 已提交
3833 3834 3835 3836
}

static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
{
3837 3838 3839
	RTL_W8(tp, MaxTxPacketSize, 0x0c);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~0x01);
3840
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
F
Francois Romieu 已提交
3841 3842 3843 3844
}

static void r8168b_0_hw_jumbo_enable(struct rtl8169_private *tp)
{
3845
	rtl_tx_performance_tweak(tp,
3846
		PCI_EXP_DEVCTL_READRQ_512B | PCI_EXP_DEVCTL_NOSNOOP_EN);
F
Francois Romieu 已提交
3847 3848 3849 3850
}

static void r8168b_0_hw_jumbo_disable(struct rtl8169_private *tp)
{
3851
	rtl_tx_performance_tweak(tp,
3852
		PCI_EXP_DEVCTL_READRQ_4096B | PCI_EXP_DEVCTL_NOSNOOP_EN);
F
Francois Romieu 已提交
3853 3854 3855 3856 3857 3858
}

static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
{
	r8168b_0_hw_jumbo_enable(tp);

3859
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
F
Francois Romieu 已提交
3860 3861 3862 3863 3864 3865
}

static void r8168b_1_hw_jumbo_disable(struct rtl8169_private *tp)
{
	r8168b_0_hw_jumbo_disable(tp);

3866
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
F
Francois Romieu 已提交
3867 3868
}

H
Heiner Kallweit 已提交
3869
static void rtl_hw_jumbo_enable(struct rtl8169_private *tp)
F
Francois Romieu 已提交
3870
{
H
Heiner Kallweit 已提交
3871
	rtl_unlock_config_regs(tp);
F
Francois Romieu 已提交
3872 3873
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_11:
H
Heiner Kallweit 已提交
3874
		r8168b_0_hw_jumbo_enable(tp);
F
Francois Romieu 已提交
3875 3876 3877
		break;
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
H
Heiner Kallweit 已提交
3878
		r8168b_1_hw_jumbo_enable(tp);
F
Francois Romieu 已提交
3879
		break;
H
Heiner Kallweit 已提交
3880 3881
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_26:
		r8168c_hw_jumbo_enable(tp);
F
Francois Romieu 已提交
3882
		break;
H
Heiner Kallweit 已提交
3883 3884
	case RTL_GIGA_MAC_VER_27 ... RTL_GIGA_MAC_VER_28:
		r8168dp_hw_jumbo_enable(tp);
F
Francois Romieu 已提交
3885
		break;
H
Heiner Kallweit 已提交
3886 3887 3888 3889
	case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_34:
		r8168e_hw_jumbo_enable(tp);
		break;
	default:
F
Francois Romieu 已提交
3890
		break;
H
Heiner Kallweit 已提交
3891 3892 3893
	}
	rtl_lock_config_regs(tp);
}
F
Francois Romieu 已提交
3894

H
Heiner Kallweit 已提交
3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914
static void rtl_hw_jumbo_disable(struct rtl8169_private *tp)
{
	rtl_unlock_config_regs(tp);
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_11:
		r8168b_0_hw_jumbo_disable(tp);
		break;
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
		r8168b_1_hw_jumbo_disable(tp);
		break;
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_26:
		r8168c_hw_jumbo_disable(tp);
		break;
	case RTL_GIGA_MAC_VER_27 ... RTL_GIGA_MAC_VER_28:
		r8168dp_hw_jumbo_disable(tp);
		break;
	case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_34:
		r8168e_hw_jumbo_disable(tp);
		break;
F
Francois Romieu 已提交
3915 3916 3917
	default:
		break;
	}
H
Heiner Kallweit 已提交
3918
	rtl_lock_config_regs(tp);
F
Francois Romieu 已提交
3919 3920
}

3921 3922
DECLARE_RTL_COND(rtl_chipcmd_cond)
{
3923
	return RTL_R8(tp, ChipCmd) & CmdReset;
3924 3925
}

3926 3927
static void rtl_hw_reset(struct rtl8169_private *tp)
{
3928
	RTL_W8(tp, ChipCmd, CmdReset);
3929

3930
	rtl_udelay_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100);
3931 3932
}

3933
static void rtl_request_firmware(struct rtl8169_private *tp)
3934
{
3935
	struct rtl_fw *rtl_fw;
3936

3937 3938 3939
	/* firmware loaded already or no firmware available */
	if (tp->rtl_fw || !tp->fw_name)
		return;
3940

3941
	rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
3942 3943 3944 3945
	if (!rtl_fw) {
		netif_warn(tp, ifup, tp->dev, "Unable to load firmware, out of memory\n");
		return;
	}
3946

3947 3948 3949 3950
	rtl_fw->phy_write = rtl_writephy;
	rtl_fw->phy_read = rtl_readphy;
	rtl_fw->mac_mcu_write = mac_mcu_write;
	rtl_fw->mac_mcu_read = mac_mcu_read;
3951 3952
	rtl_fw->fw_name = tp->fw_name;
	rtl_fw->dev = tp_to_dev(tp);
3953

3954 3955 3956 3957
	if (rtl_fw_request_firmware(rtl_fw))
		kfree(rtl_fw);
	else
		tp->rtl_fw = rtl_fw;
3958 3959
}

3960 3961
static void rtl_rx_close(struct rtl8169_private *tp)
{
3962
	RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~RX_CONFIG_ACCEPT_MASK);
3963 3964
}

3965 3966
DECLARE_RTL_COND(rtl_npq_cond)
{
3967
	return RTL_R8(tp, TxPoll) & NPQ;
3968 3969 3970 3971
}

DECLARE_RTL_COND(rtl_txcfg_empty_cond)
{
3972
	return RTL_R32(tp, TxConfig) & TXCFG_EMPTY;
3973 3974
}

F
françois romieu 已提交
3975
static void rtl8169_hw_reset(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
3976 3977
{
	/* Disable interrupts */
F
françois romieu 已提交
3978
	rtl8169_irq_mask_and_ack(tp);
L
Linus Torvalds 已提交
3979

3980 3981
	rtl_rx_close(tp);

3982 3983 3984 3985
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
3986
		rtl_udelay_loop_wait_low(tp, &rtl_npq_cond, 20, 42*42);
3987 3988 3989
		break;
	case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:
3990
		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
3991
		rtl_udelay_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
3992 3993
		break;
	default:
3994
		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
3995
		udelay(100);
3996
		break;
F
françois romieu 已提交
3997 3998
	}

3999
	rtl_hw_reset(tp);
L
Linus Torvalds 已提交
4000 4001
}

4002
static void rtl_set_tx_config_registers(struct rtl8169_private *tp)
4003
{
4004 4005 4006
	u32 val = TX_DMA_BURST << TxDMAShift |
		  InterFrameGap << TxInterFrameGapShift;

4007
	if (rtl_is_8168evl_up(tp))
4008 4009 4010
		val |= TXCFG_AUTO_FIFO;

	RTL_W32(tp, TxConfig, val);
4011 4012
}

4013
static void rtl_set_rx_max_size(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
4014
{
4015 4016
	/* Low hurts. Let's disable the filtering. */
	RTL_W16(tp, RxMaxSize, R8169_RX_BUF_SIZE + 1);
4017 4018
}

4019
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp)
4020 4021 4022 4023 4024 4025
{
	/*
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
	 * register to be written before TxDescAddrLow to work.
	 * Switching from MMIO to I/O access fixes the issue as well.
	 */
4026 4027 4028 4029
	RTL_W32(tp, TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
	RTL_W32(tp, TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
	RTL_W32(tp, RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
	RTL_W32(tp, RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
4030 4031
}

4032
static void rtl8169_set_magic_reg(struct rtl8169_private *tp, unsigned mac_version)
4033
{
4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046
	u32 val;

	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
		val = 0x000fff00;
	else if (tp->mac_version == RTL_GIGA_MAC_VER_06)
		val = 0x00ffff00;
	else
		return;

	if (RTL_R8(tp, Config2) & PCI_Clock_66MHz)
		val |= 0xff;

	RTL_W32(tp, 0x7c, val);
4047 4048
}

4049 4050
static void rtl_set_rx_mode(struct net_device *dev)
{
H
Heiner Kallweit 已提交
4051 4052 4053
	u32 rx_mode = AcceptBroadcast | AcceptMyPhys | AcceptMulticast;
	/* Multicast hash filter */
	u32 mc_filter[2] = { 0xffffffff, 0xffffffff };
4054
	struct rtl8169_private *tp = netdev_priv(dev);
H
Heiner Kallweit 已提交
4055
	u32 tmp;
4056 4057 4058 4059

	if (dev->flags & IFF_PROMISC) {
		/* Unconditionally log net taps. */
		netif_notice(tp, link, dev, "Promiscuous mode enabled\n");
H
Heiner Kallweit 已提交
4060 4061 4062 4063 4064 4065 4066
		rx_mode |= AcceptAllPhys;
	} else if (netdev_mc_count(dev) > MC_FILTER_LIMIT ||
		   dev->flags & IFF_ALLMULTI ||
		   tp->mac_version == RTL_GIGA_MAC_VER_35) {
		/* accept all multicasts */
	} else if (netdev_mc_empty(dev)) {
		rx_mode &= ~AcceptMulticast;
4067 4068 4069 4070 4071
	} else {
		struct netdev_hw_addr *ha;

		mc_filter[1] = mc_filter[0] = 0;
		netdev_for_each_mc_addr(ha, dev) {
H
Heiner Kallweit 已提交
4072 4073 4074 4075 4076 4077 4078 4079
			u32 bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
			mc_filter[bit_nr >> 5] |= BIT(bit_nr & 31);
		}

		if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
			tmp = mc_filter[0];
			mc_filter[0] = swab32(mc_filter[1]);
			mc_filter[1] = swab32(tmp);
4080 4081 4082 4083 4084 4085
		}
	}

	if (dev->features & NETIF_F_RXALL)
		rx_mode |= (AcceptErr | AcceptRunt);

4086 4087
	RTL_W32(tp, MAR0 + 4, mc_filter[1]);
	RTL_W32(tp, MAR0 + 0, mc_filter[0]);
4088

H
Heiner Kallweit 已提交
4089 4090
	tmp = RTL_R32(tp, RxConfig);
	RTL_W32(tp, RxConfig, (tmp & ~RX_CONFIG_ACCEPT_MASK) | rx_mode);
4091 4092
}

4093 4094
DECLARE_RTL_COND(rtl_csiar_cond)
{
4095
	return RTL_R32(tp, CSIAR) & CSIAR_FLAG;
4096 4097
}

4098
static void rtl_csi_write(struct rtl8169_private *tp, int addr, int value)
4099
{
4100
	u32 func = PCI_FUNC(tp->pci_dev->devfn);
4101

4102 4103
	RTL_W32(tp, CSIDR, value);
	RTL_W32(tp, CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
4104
		CSIAR_BYTE_ENABLE | func << 16);
4105

4106
	rtl_udelay_loop_wait_low(tp, &rtl_csiar_cond, 10, 100);
4107 4108
}

4109
static u32 rtl_csi_read(struct rtl8169_private *tp, int addr)
4110
{
4111 4112 4113 4114
	u32 func = PCI_FUNC(tp->pci_dev->devfn);

	RTL_W32(tp, CSIAR, (addr & CSIAR_ADDR_MASK) | func << 16 |
		CSIAR_BYTE_ENABLE);
4115

4116
	return rtl_udelay_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
4117
		RTL_R32(tp, CSIDR) : ~0;
4118 4119
}

4120
static void rtl_csi_access_enable(struct rtl8169_private *tp, u8 val)
H
hayeswang 已提交
4121
{
4122 4123
	struct pci_dev *pdev = tp->pci_dev;
	u32 csi;
H
hayeswang 已提交
4124

4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136
	/* According to Realtek the value at config space address 0x070f
	 * controls the L0s/L1 entrance latency. We try standard ECAM access
	 * first and if it fails fall back to CSI.
	 */
	if (pdev->cfg_size > 0x070f &&
	    pci_write_config_byte(pdev, 0x070f, val) == PCIBIOS_SUCCESSFUL)
		return;

	netdev_notice_once(tp->dev,
		"No native access to PCI extended config space, falling back to CSI\n");
	csi = rtl_csi_read(tp, 0x070c) & 0x00ffffff;
	rtl_csi_write(tp, 0x070c, csi | val << 24);
H
hayeswang 已提交
4137 4138
}

4139
static void rtl_set_def_aspm_entry_latency(struct rtl8169_private *tp)
4140
{
4141
	rtl_csi_access_enable(tp, 0x27);
4142 4143 4144 4145 4146 4147 4148 4149
}

struct ephy_info {
	unsigned int offset;
	u16 mask;
	u16 bits;
};

4150 4151
static void __rtl_ephy_init(struct rtl8169_private *tp,
			    const struct ephy_info *e, int len)
4152 4153 4154 4155
{
	u16 w;

	while (len-- > 0) {
4156 4157
		w = (rtl_ephy_read(tp, e->offset) & ~e->mask) | e->bits;
		rtl_ephy_write(tp, e->offset, w);
4158 4159 4160 4161
		e++;
	}
}

4162 4163
#define rtl_ephy_init(tp, a) __rtl_ephy_init(tp, a, ARRAY_SIZE(a))

4164
static void rtl_disable_clock_request(struct rtl8169_private *tp)
4165
{
4166
	pcie_capability_clear_word(tp->pci_dev, PCI_EXP_LNKCTL,
4167
				   PCI_EXP_LNKCTL_CLKREQ_EN);
4168 4169
}

4170
static void rtl_enable_clock_request(struct rtl8169_private *tp)
F
françois romieu 已提交
4171
{
4172
	pcie_capability_set_word(tp->pci_dev, PCI_EXP_LNKCTL,
4173
				 PCI_EXP_LNKCTL_CLKREQ_EN);
F
françois romieu 已提交
4174 4175
}

4176
static void rtl_pcie_state_l2l3_disable(struct rtl8169_private *tp)
H
hayeswang 已提交
4177
{
4178 4179
	/* work around an issue when PCI reset occurs during L2/L3 state */
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Rdy_to_L23);
H
hayeswang 已提交
4180 4181
}

K
Kai-Heng Feng 已提交
4182 4183
static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
{
4184 4185
	/* Don't enable ASPM in the chip if OS can't control ASPM */
	if (enable && tp->aspm_manageable) {
K
Kai-Heng Feng 已提交
4186
		RTL_W8(tp, Config5, RTL_R8(tp, Config5) | ASPM_en);
4187
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) | ClkReqEn);
K
Kai-Heng Feng 已提交
4188 4189 4190 4191
	} else {
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
		RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
	}
4192 4193

	udelay(10);
K
Kai-Heng Feng 已提交
4194 4195
}

H
Heiner Kallweit 已提交
4196 4197 4198 4199 4200 4201 4202 4203 4204 4205
static void rtl_set_fifo_size(struct rtl8169_private *tp, u16 rx_stat,
			      u16 tx_stat, u16 rx_dyn, u16 tx_dyn)
{
	/* Usage of dynamic vs. static FIFO is controlled by bit
	 * TXCFG_AUTO_FIFO. Exact meaning of FIFO values isn't known.
	 */
	rtl_eri_write(tp, 0xc8, ERIAR_MASK_1111, (rx_stat << 16) | rx_dyn);
	rtl_eri_write(tp, 0xe8, ERIAR_MASK_1111, (tx_stat << 16) | tx_dyn);
}

4206 4207 4208 4209 4210 4211 4212 4213
static void rtl8168g_set_pause_thresholds(struct rtl8169_private *tp,
					  u8 low, u8 high)
{
	/* FIFO thresholds for pause flow control */
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_0001, low);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_0001, high);
}

4214
static void rtl_hw_start_8168bb(struct rtl8169_private *tp)
4215
{
4216
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
4217

4218
	if (tp->dev->mtu <= ETH_DATA_LEN) {
4219
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B |
4220 4221
					 PCI_EXP_DEVCTL_NOSNOOP_EN);
	}
4222 4223
}

4224
static void rtl_hw_start_8168bef(struct rtl8169_private *tp)
4225
{
4226
	rtl_hw_start_8168bb(tp);
4227

4228
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
4229 4230
}

4231
static void __rtl_hw_start_8168cp(struct rtl8169_private *tp)
4232
{
4233
	RTL_W8(tp, Config1, RTL_R8(tp, Config1) | Speed_down);
4234

4235
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
4236

4237
	if (tp->dev->mtu <= ETH_DATA_LEN)
4238
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4239

4240
	rtl_disable_clock_request(tp);
4241 4242
}

4243
static void rtl_hw_start_8168cp_1(struct rtl8169_private *tp)
4244
{
4245
	static const struct ephy_info e_info_8168cp[] = {
4246 4247 4248 4249 4250 4251 4252
		{ 0x01, 0,	0x0001 },
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0042 },
		{ 0x06, 0x0080,	0x0000 },
		{ 0x07, 0,	0x2000 }
	};

4253
	rtl_set_def_aspm_entry_latency(tp);
4254

4255
	rtl_ephy_init(tp, e_info_8168cp);
4256

4257
	__rtl_hw_start_8168cp(tp);
4258 4259
}

4260
static void rtl_hw_start_8168cp_2(struct rtl8169_private *tp)
F
Francois Romieu 已提交
4261
{
4262
	rtl_set_def_aspm_entry_latency(tp);
F
Francois Romieu 已提交
4263

4264
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
F
Francois Romieu 已提交
4265

4266
	if (tp->dev->mtu <= ETH_DATA_LEN)
4267
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
F
Francois Romieu 已提交
4268 4269
}

4270
static void rtl_hw_start_8168cp_3(struct rtl8169_private *tp)
4271
{
4272
	rtl_set_def_aspm_entry_latency(tp);
4273

4274
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
4275 4276

	/* Magic. */
4277
	RTL_W8(tp, DBG_REG, 0x20);
4278

4279
	if (tp->dev->mtu <= ETH_DATA_LEN)
4280
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4281 4282
}

4283
static void rtl_hw_start_8168c_1(struct rtl8169_private *tp)
4284
{
4285
	static const struct ephy_info e_info_8168c_1[] = {
4286 4287 4288 4289 4290
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0002 },
		{ 0x06, 0x0080,	0x0000 }
	};

4291
	rtl_set_def_aspm_entry_latency(tp);
4292

4293
	RTL_W8(tp, DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
4294

4295
	rtl_ephy_init(tp, e_info_8168c_1);
4296

4297
	__rtl_hw_start_8168cp(tp);
4298 4299
}

4300
static void rtl_hw_start_8168c_2(struct rtl8169_private *tp)
4301
{
4302
	static const struct ephy_info e_info_8168c_2[] = {
4303
		{ 0x01, 0,	0x0001 },
4304
		{ 0x03, 0x0400,	0x0020 }
4305 4306
	};

4307
	rtl_set_def_aspm_entry_latency(tp);
4308

4309
	rtl_ephy_init(tp, e_info_8168c_2);
4310

4311
	__rtl_hw_start_8168cp(tp);
4312 4313
}

4314
static void rtl_hw_start_8168c_3(struct rtl8169_private *tp)
F
Francois Romieu 已提交
4315
{
4316
	rtl_hw_start_8168c_2(tp);
F
Francois Romieu 已提交
4317 4318
}

4319
static void rtl_hw_start_8168c_4(struct rtl8169_private *tp)
4320
{
4321
	rtl_set_def_aspm_entry_latency(tp);
4322

4323
	__rtl_hw_start_8168cp(tp);
4324 4325
}

4326
static void rtl_hw_start_8168d(struct rtl8169_private *tp)
F
Francois Romieu 已提交
4327
{
4328
	rtl_set_def_aspm_entry_latency(tp);
F
Francois Romieu 已提交
4329

4330
	rtl_disable_clock_request(tp);
F
Francois Romieu 已提交
4331

4332
	if (tp->dev->mtu <= ETH_DATA_LEN)
4333
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
F
Francois Romieu 已提交
4334 4335
}

4336
static void rtl_hw_start_8168dp(struct rtl8169_private *tp)
4337
{
4338
	rtl_set_def_aspm_entry_latency(tp);
4339

4340
	if (tp->dev->mtu <= ETH_DATA_LEN)
4341
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4342

4343
	rtl_disable_clock_request(tp);
4344 4345
}

4346
static void rtl_hw_start_8168d_4(struct rtl8169_private *tp)
F
françois romieu 已提交
4347 4348
{
	static const struct ephy_info e_info_8168d_4[] = {
4349 4350
		{ 0x0b, 0x0000,	0x0048 },
		{ 0x19, 0x0020,	0x0050 },
4351 4352
		{ 0x0c, 0x0100,	0x0020 },
		{ 0x10, 0x0004,	0x0000 },
F
françois romieu 已提交
4353 4354
	};

4355
	rtl_set_def_aspm_entry_latency(tp);
F
françois romieu 已提交
4356

4357
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
F
françois romieu 已提交
4358

4359
	rtl_ephy_init(tp, e_info_8168d_4);
F
françois romieu 已提交
4360

4361
	rtl_enable_clock_request(tp);
F
françois romieu 已提交
4362 4363
}

4364
static void rtl_hw_start_8168e_1(struct rtl8169_private *tp)
H
hayeswang 已提交
4365
{
H
Hayes Wang 已提交
4366
	static const struct ephy_info e_info_8168e_1[] = {
H
hayeswang 已提交
4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381
		{ 0x00, 0x0200,	0x0100 },
		{ 0x00, 0x0000,	0x0004 },
		{ 0x06, 0x0002,	0x0001 },
		{ 0x06, 0x0000,	0x0030 },
		{ 0x07, 0x0000,	0x2000 },
		{ 0x00, 0x0000,	0x0020 },
		{ 0x03, 0x5800,	0x2000 },
		{ 0x03, 0x0000,	0x0001 },
		{ 0x01, 0x0800,	0x1000 },
		{ 0x07, 0x0000,	0x4000 },
		{ 0x1e, 0x0000,	0x2000 },
		{ 0x19, 0xffff,	0xfe6c },
		{ 0x0a, 0x0000,	0x0040 }
	};

4382
	rtl_set_def_aspm_entry_latency(tp);
H
hayeswang 已提交
4383

4384
	rtl_ephy_init(tp, e_info_8168e_1);
H
hayeswang 已提交
4385

4386
	if (tp->dev->mtu <= ETH_DATA_LEN)
4387
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
H
hayeswang 已提交
4388

4389
	rtl_disable_clock_request(tp);
H
hayeswang 已提交
4390 4391

	/* Reset tx FIFO pointer */
4392 4393
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | TXPLA_RST);
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~TXPLA_RST);
H
hayeswang 已提交
4394

4395
	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
H
hayeswang 已提交
4396 4397
}

4398
static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
H
Hayes Wang 已提交
4399 4400 4401
{
	static const struct ephy_info e_info_8168e_2[] = {
		{ 0x09, 0x0000,	0x0080 },
4402 4403 4404
		{ 0x19, 0x0000,	0x0224 },
		{ 0x00, 0x0000,	0x0004 },
		{ 0x0c, 0x3df0,	0x0200 },
H
Hayes Wang 已提交
4405 4406
	};

4407
	rtl_set_def_aspm_entry_latency(tp);
H
Hayes Wang 已提交
4408

4409
	rtl_ephy_init(tp, e_info_8168e_2);
H
Hayes Wang 已提交
4410

4411
	if (tp->dev->mtu <= ETH_DATA_LEN)
4412
		rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
H
Hayes Wang 已提交
4413

4414 4415
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
H
Heiner Kallweit 已提交
4416
	rtl_set_fifo_size(tp, 0x10, 0x10, 0x02, 0x06);
4417 4418
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x07ff0060);
4419
	rtl_eri_set_bits(tp, 0x1b0, ERIAR_MASK_0001, BIT(4));
4420
	rtl_w0w1_eri(tp, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00);
H
Hayes Wang 已提交
4421

4422
	rtl_disable_clock_request(tp);
4423

4424
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
H
Hayes Wang 已提交
4425

4426 4427
	rtl8168_config_eee_mac(tp);

4428 4429 4430
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | PWM_EN);
	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
4431 4432

	rtl_hw_aspm_clkreq_enable(tp, true);
H
Hayes Wang 已提交
4433 4434
}

4435
static void rtl_hw_start_8168f(struct rtl8169_private *tp)
4436
{
4437
	rtl_set_def_aspm_entry_latency(tp);
4438

4439
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4440

4441 4442
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
H
Heiner Kallweit 已提交
4443
	rtl_set_fifo_size(tp, 0x10, 0x10, 0x02, 0x06);
4444
	rtl_reset_packet_filter(tp);
4445 4446
	rtl_eri_set_bits(tp, 0x1b0, ERIAR_MASK_0001, BIT(4));
	rtl_eri_set_bits(tp, 0x1d0, ERIAR_MASK_0001, BIT(4));
4447 4448
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x00000060);
4449

4450
	rtl_disable_clock_request(tp);
4451

4452 4453 4454 4455
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | PWM_EN);
	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
4456 4457

	rtl8168_config_eee_mac(tp);
4458 4459
}

4460 4461 4462 4463 4464 4465
static void rtl_hw_start_8168f_1(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168f_1[] = {
		{ 0x06, 0x00c0,	0x0020 },
		{ 0x08, 0x0001,	0x0002 },
		{ 0x09, 0x0000,	0x0080 },
4466 4467 4468
		{ 0x19, 0x0000,	0x0224 },
		{ 0x00, 0x0000,	0x0004 },
		{ 0x0c, 0x3df0,	0x0200 },
4469 4470 4471 4472
	};

	rtl_hw_start_8168f(tp);

4473
	rtl_ephy_init(tp, e_info_8168f_1);
4474

4475
	rtl_w0w1_eri(tp, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00);
4476 4477
}

4478 4479 4480 4481 4482
static void rtl_hw_start_8411(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168f_1[] = {
		{ 0x06, 0x00c0,	0x0020 },
		{ 0x0f, 0xffff,	0x5200 },
4483 4484 4485
		{ 0x19, 0x0000,	0x0224 },
		{ 0x00, 0x0000,	0x0004 },
		{ 0x0c, 0x3df0,	0x0200 },
4486 4487 4488
	};

	rtl_hw_start_8168f(tp);
4489
	rtl_pcie_state_l2l3_disable(tp);
4490

4491
	rtl_ephy_init(tp, e_info_8168f_1);
4492

4493
	rtl_eri_set_bits(tp, 0x0d4, ERIAR_MASK_0011, 0x0c00);
4494 4495
}

4496
static void rtl_hw_start_8168g(struct rtl8169_private *tp)
H
Hayes Wang 已提交
4497
{
H
Heiner Kallweit 已提交
4498
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
4499
	rtl8168g_set_pause_thresholds(tp, 0x38, 0x48);
H
Hayes Wang 已提交
4500

4501
	rtl_set_def_aspm_entry_latency(tp);
H
Hayes Wang 已提交
4502

4503
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
H
Hayes Wang 已提交
4504

4505
	rtl_reset_packet_filter(tp);
4506
	rtl_eri_write(tp, 0x2f8, ERIAR_MASK_0011, 0x1d8f);
H
Hayes Wang 已提交
4507

4508
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
H
Hayes Wang 已提交
4509

4510 4511
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
H
Hayes Wang 已提交
4512

4513 4514
	rtl8168_config_eee_mac(tp);

4515
	rtl_w0w1_eri(tp, 0x2fc, ERIAR_MASK_0001, 0x01, 0x06);
4516
	rtl_eri_clear_bits(tp, 0x1b0, ERIAR_MASK_0011, BIT(12));
H
hayeswang 已提交
4517

4518
	rtl_pcie_state_l2l3_disable(tp);
H
Hayes Wang 已提交
4519 4520
}

4521 4522 4523
static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168g_1[] = {
4524 4525
		{ 0x00, 0x0008,	0x0000 },
		{ 0x0c, 0x3ff0,	0x0820 },
4526 4527 4528 4529 4530 4531 4532
		{ 0x1e, 0x0000,	0x0001 },
		{ 0x19, 0x8000,	0x0000 }
	};

	rtl_hw_start_8168g(tp);

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
4533
	rtl_hw_aspm_clkreq_enable(tp, false);
4534
	rtl_ephy_init(tp, e_info_8168g_1);
K
Kai-Heng Feng 已提交
4535
	rtl_hw_aspm_clkreq_enable(tp, true);
4536 4537
}

H
hayeswang 已提交
4538 4539 4540
static void rtl_hw_start_8168g_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168g_2[] = {
4541 4542 4543 4544 4545 4546 4547 4548 4549
		{ 0x00, 0x0008,	0x0000 },
		{ 0x0c, 0x3ff0,	0x0820 },
		{ 0x19, 0xffff,	0x7c00 },
		{ 0x1e, 0xffff,	0x20eb },
		{ 0x0d, 0xffff,	0x1666 },
		{ 0x00, 0xffff,	0x10a3 },
		{ 0x06, 0xffff,	0xf050 },
		{ 0x04, 0x0000,	0x0010 },
		{ 0x1d, 0x4000,	0x0000 },
H
hayeswang 已提交
4550 4551
	};

4552
	rtl_hw_start_8168g(tp);
H
hayeswang 已提交
4553 4554

	/* disable aspm and clock request before access ephy */
4555 4556
	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
4557
	rtl_ephy_init(tp, e_info_8168g_2);
H
hayeswang 已提交
4558 4559
}

H
hayeswang 已提交
4560 4561 4562
static void rtl_hw_start_8411_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8411_2[] = {
4563 4564 4565 4566 4567 4568 4569 4570 4571 4572
		{ 0x00, 0x0008,	0x0000 },
		{ 0x0c, 0x37d0,	0x0820 },
		{ 0x1e, 0x0000,	0x0001 },
		{ 0x19, 0x8021,	0x0000 },
		{ 0x1e, 0x0000,	0x2000 },
		{ 0x0d, 0x0100,	0x0200 },
		{ 0x00, 0x0000,	0x0080 },
		{ 0x06, 0x0000,	0x0010 },
		{ 0x04, 0x0000,	0x0010 },
		{ 0x1d, 0x0000,	0x4000 },
H
hayeswang 已提交
4573 4574
	};

4575
	rtl_hw_start_8168g(tp);
H
hayeswang 已提交
4576 4577

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
4578
	rtl_hw_aspm_clkreq_enable(tp, false);
4579
	rtl_ephy_init(tp, e_info_8411_2);
4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716

	/* The following Realtek-provided magic fixes an issue with the RX unit
	 * getting confused after the PHY having been powered-down.
	 */
	r8168_mac_ocp_write(tp, 0xFC28, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC2A, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC2C, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC2E, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC30, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC32, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC34, 0x0000);
	r8168_mac_ocp_write(tp, 0xFC36, 0x0000);
	mdelay(3);
	r8168_mac_ocp_write(tp, 0xFC26, 0x0000);

	r8168_mac_ocp_write(tp, 0xF800, 0xE008);
	r8168_mac_ocp_write(tp, 0xF802, 0xE00A);
	r8168_mac_ocp_write(tp, 0xF804, 0xE00C);
	r8168_mac_ocp_write(tp, 0xF806, 0xE00E);
	r8168_mac_ocp_write(tp, 0xF808, 0xE027);
	r8168_mac_ocp_write(tp, 0xF80A, 0xE04F);
	r8168_mac_ocp_write(tp, 0xF80C, 0xE05E);
	r8168_mac_ocp_write(tp, 0xF80E, 0xE065);
	r8168_mac_ocp_write(tp, 0xF810, 0xC602);
	r8168_mac_ocp_write(tp, 0xF812, 0xBE00);
	r8168_mac_ocp_write(tp, 0xF814, 0x0000);
	r8168_mac_ocp_write(tp, 0xF816, 0xC502);
	r8168_mac_ocp_write(tp, 0xF818, 0xBD00);
	r8168_mac_ocp_write(tp, 0xF81A, 0x074C);
	r8168_mac_ocp_write(tp, 0xF81C, 0xC302);
	r8168_mac_ocp_write(tp, 0xF81E, 0xBB00);
	r8168_mac_ocp_write(tp, 0xF820, 0x080A);
	r8168_mac_ocp_write(tp, 0xF822, 0x6420);
	r8168_mac_ocp_write(tp, 0xF824, 0x48C2);
	r8168_mac_ocp_write(tp, 0xF826, 0x8C20);
	r8168_mac_ocp_write(tp, 0xF828, 0xC516);
	r8168_mac_ocp_write(tp, 0xF82A, 0x64A4);
	r8168_mac_ocp_write(tp, 0xF82C, 0x49C0);
	r8168_mac_ocp_write(tp, 0xF82E, 0xF009);
	r8168_mac_ocp_write(tp, 0xF830, 0x74A2);
	r8168_mac_ocp_write(tp, 0xF832, 0x8CA5);
	r8168_mac_ocp_write(tp, 0xF834, 0x74A0);
	r8168_mac_ocp_write(tp, 0xF836, 0xC50E);
	r8168_mac_ocp_write(tp, 0xF838, 0x9CA2);
	r8168_mac_ocp_write(tp, 0xF83A, 0x1C11);
	r8168_mac_ocp_write(tp, 0xF83C, 0x9CA0);
	r8168_mac_ocp_write(tp, 0xF83E, 0xE006);
	r8168_mac_ocp_write(tp, 0xF840, 0x74F8);
	r8168_mac_ocp_write(tp, 0xF842, 0x48C4);
	r8168_mac_ocp_write(tp, 0xF844, 0x8CF8);
	r8168_mac_ocp_write(tp, 0xF846, 0xC404);
	r8168_mac_ocp_write(tp, 0xF848, 0xBC00);
	r8168_mac_ocp_write(tp, 0xF84A, 0xC403);
	r8168_mac_ocp_write(tp, 0xF84C, 0xBC00);
	r8168_mac_ocp_write(tp, 0xF84E, 0x0BF2);
	r8168_mac_ocp_write(tp, 0xF850, 0x0C0A);
	r8168_mac_ocp_write(tp, 0xF852, 0xE434);
	r8168_mac_ocp_write(tp, 0xF854, 0xD3C0);
	r8168_mac_ocp_write(tp, 0xF856, 0x49D9);
	r8168_mac_ocp_write(tp, 0xF858, 0xF01F);
	r8168_mac_ocp_write(tp, 0xF85A, 0xC526);
	r8168_mac_ocp_write(tp, 0xF85C, 0x64A5);
	r8168_mac_ocp_write(tp, 0xF85E, 0x1400);
	r8168_mac_ocp_write(tp, 0xF860, 0xF007);
	r8168_mac_ocp_write(tp, 0xF862, 0x0C01);
	r8168_mac_ocp_write(tp, 0xF864, 0x8CA5);
	r8168_mac_ocp_write(tp, 0xF866, 0x1C15);
	r8168_mac_ocp_write(tp, 0xF868, 0xC51B);
	r8168_mac_ocp_write(tp, 0xF86A, 0x9CA0);
	r8168_mac_ocp_write(tp, 0xF86C, 0xE013);
	r8168_mac_ocp_write(tp, 0xF86E, 0xC519);
	r8168_mac_ocp_write(tp, 0xF870, 0x74A0);
	r8168_mac_ocp_write(tp, 0xF872, 0x48C4);
	r8168_mac_ocp_write(tp, 0xF874, 0x8CA0);
	r8168_mac_ocp_write(tp, 0xF876, 0xC516);
	r8168_mac_ocp_write(tp, 0xF878, 0x74A4);
	r8168_mac_ocp_write(tp, 0xF87A, 0x48C8);
	r8168_mac_ocp_write(tp, 0xF87C, 0x48CA);
	r8168_mac_ocp_write(tp, 0xF87E, 0x9CA4);
	r8168_mac_ocp_write(tp, 0xF880, 0xC512);
	r8168_mac_ocp_write(tp, 0xF882, 0x1B00);
	r8168_mac_ocp_write(tp, 0xF884, 0x9BA0);
	r8168_mac_ocp_write(tp, 0xF886, 0x1B1C);
	r8168_mac_ocp_write(tp, 0xF888, 0x483F);
	r8168_mac_ocp_write(tp, 0xF88A, 0x9BA2);
	r8168_mac_ocp_write(tp, 0xF88C, 0x1B04);
	r8168_mac_ocp_write(tp, 0xF88E, 0xC508);
	r8168_mac_ocp_write(tp, 0xF890, 0x9BA0);
	r8168_mac_ocp_write(tp, 0xF892, 0xC505);
	r8168_mac_ocp_write(tp, 0xF894, 0xBD00);
	r8168_mac_ocp_write(tp, 0xF896, 0xC502);
	r8168_mac_ocp_write(tp, 0xF898, 0xBD00);
	r8168_mac_ocp_write(tp, 0xF89A, 0x0300);
	r8168_mac_ocp_write(tp, 0xF89C, 0x051E);
	r8168_mac_ocp_write(tp, 0xF89E, 0xE434);
	r8168_mac_ocp_write(tp, 0xF8A0, 0xE018);
	r8168_mac_ocp_write(tp, 0xF8A2, 0xE092);
	r8168_mac_ocp_write(tp, 0xF8A4, 0xDE20);
	r8168_mac_ocp_write(tp, 0xF8A6, 0xD3C0);
	r8168_mac_ocp_write(tp, 0xF8A8, 0xC50F);
	r8168_mac_ocp_write(tp, 0xF8AA, 0x76A4);
	r8168_mac_ocp_write(tp, 0xF8AC, 0x49E3);
	r8168_mac_ocp_write(tp, 0xF8AE, 0xF007);
	r8168_mac_ocp_write(tp, 0xF8B0, 0x49C0);
	r8168_mac_ocp_write(tp, 0xF8B2, 0xF103);
	r8168_mac_ocp_write(tp, 0xF8B4, 0xC607);
	r8168_mac_ocp_write(tp, 0xF8B6, 0xBE00);
	r8168_mac_ocp_write(tp, 0xF8B8, 0xC606);
	r8168_mac_ocp_write(tp, 0xF8BA, 0xBE00);
	r8168_mac_ocp_write(tp, 0xF8BC, 0xC602);
	r8168_mac_ocp_write(tp, 0xF8BE, 0xBE00);
	r8168_mac_ocp_write(tp, 0xF8C0, 0x0C4C);
	r8168_mac_ocp_write(tp, 0xF8C2, 0x0C28);
	r8168_mac_ocp_write(tp, 0xF8C4, 0x0C2C);
	r8168_mac_ocp_write(tp, 0xF8C6, 0xDC00);
	r8168_mac_ocp_write(tp, 0xF8C8, 0xC707);
	r8168_mac_ocp_write(tp, 0xF8CA, 0x1D00);
	r8168_mac_ocp_write(tp, 0xF8CC, 0x8DE2);
	r8168_mac_ocp_write(tp, 0xF8CE, 0x48C1);
	r8168_mac_ocp_write(tp, 0xF8D0, 0xC502);
	r8168_mac_ocp_write(tp, 0xF8D2, 0xBD00);
	r8168_mac_ocp_write(tp, 0xF8D4, 0x00AA);
	r8168_mac_ocp_write(tp, 0xF8D6, 0xE0C0);
	r8168_mac_ocp_write(tp, 0xF8D8, 0xC502);
	r8168_mac_ocp_write(tp, 0xF8DA, 0xBD00);
	r8168_mac_ocp_write(tp, 0xF8DC, 0x0132);

	r8168_mac_ocp_write(tp, 0xFC26, 0x8000);

	r8168_mac_ocp_write(tp, 0xFC2A, 0x0743);
	r8168_mac_ocp_write(tp, 0xFC2C, 0x0801);
	r8168_mac_ocp_write(tp, 0xFC2E, 0x0BE9);
	r8168_mac_ocp_write(tp, 0xFC30, 0x02FD);
	r8168_mac_ocp_write(tp, 0xFC32, 0x0C25);
	r8168_mac_ocp_write(tp, 0xFC34, 0x00A9);
	r8168_mac_ocp_write(tp, 0xFC36, 0x012D);

K
Kai-Heng Feng 已提交
4717
	rtl_hw_aspm_clkreq_enable(tp, true);
H
hayeswang 已提交
4718 4719
}

4720 4721 4722 4723 4724 4725 4726
static void rtl_hw_start_8168h_1(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168h_1[] = {
		{ 0x1e, 0x0800,	0x0001 },
		{ 0x1d, 0x0000,	0x0800 },
		{ 0x05, 0xffff,	0x2089 },
		{ 0x06, 0xffff,	0x5881 },
4727
		{ 0x04, 0xffff,	0x854a },
4728 4729
		{ 0x01, 0xffff,	0x068b }
	};
4730
	int rg_saw_cnt;
4731 4732

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
4733
	rtl_hw_aspm_clkreq_enable(tp, false);
4734
	rtl_ephy_init(tp, e_info_8168h_1);
4735

H
Heiner Kallweit 已提交
4736
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
4737
	rtl8168g_set_pause_thresholds(tp, 0x38, 0x48);
4738

4739
	rtl_set_def_aspm_entry_latency(tp);
4740

4741
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4742

4743
	rtl_reset_packet_filter(tp);
4744

4745
	rtl_eri_set_bits(tp, 0xdc, ERIAR_MASK_1111, BIT(4));
4746

4747
	rtl_eri_set_bits(tp, 0xd4, ERIAR_MASK_1111, 0x1f00);
4748

4749
	rtl_eri_write(tp, 0x5f0, ERIAR_MASK_0011, 0x4f87);
4750

4751
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
4752

4753 4754
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
4755

4756 4757
	rtl8168_config_eee_mac(tp);

4758 4759
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
4760

4761
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~TX_10M_PS_EN);
4762

4763
	rtl_eri_clear_bits(tp, 0x1b0, ERIAR_MASK_0011, BIT(12));
4764

4765
	rtl_pcie_state_l2l3_disable(tp);
4766 4767

	rtl_writephy(tp, 0x1f, 0x0c42);
4768
	rg_saw_cnt = (rtl_readphy(tp, 0x13) & 0x3fff);
4769 4770 4771 4772 4773 4774
	rtl_writephy(tp, 0x1f, 0x0000);
	if (rg_saw_cnt > 0) {
		u16 sw_cnt_1ms_ini;

		sw_cnt_1ms_ini = 16000000/rg_saw_cnt;
		sw_cnt_1ms_ini &= 0x0fff;
4775
		r8168_mac_ocp_modify(tp, 0xd412, 0x0fff, sw_cnt_1ms_ini);
4776 4777
	}

4778 4779 4780 4781
	r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0070);
	r8168_mac_ocp_modify(tp, 0xe052, 0x6000, 0x8008);
	r8168_mac_ocp_modify(tp, 0xe0d6, 0x01ff, 0x017f);
	r8168_mac_ocp_modify(tp, 0xd420, 0x0fff, 0x047f);
4782 4783 4784 4785 4786

	r8168_mac_ocp_write(tp, 0xe63e, 0x0001);
	r8168_mac_ocp_write(tp, 0xe63e, 0x0000);
	r8168_mac_ocp_write(tp, 0xc094, 0x0000);
	r8168_mac_ocp_write(tp, 0xc09e, 0x0000);
K
Kai-Heng Feng 已提交
4787 4788

	rtl_hw_aspm_clkreq_enable(tp, true);
4789 4790
}

C
Chun-Hao Lin 已提交
4791 4792
static void rtl_hw_start_8168ep(struct rtl8169_private *tp)
{
C
Chun-Hao Lin 已提交
4793 4794
	rtl8168ep_stop_cmac(tp);

H
Heiner Kallweit 已提交
4795
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
4796
	rtl8168g_set_pause_thresholds(tp, 0x2f, 0x5f);
C
Chun-Hao Lin 已提交
4797

4798
	rtl_set_def_aspm_entry_latency(tp);
C
Chun-Hao Lin 已提交
4799

4800
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
C
Chun-Hao Lin 已提交
4801

4802
	rtl_reset_packet_filter(tp);
C
Chun-Hao Lin 已提交
4803

4804
	rtl_eri_set_bits(tp, 0xd4, ERIAR_MASK_1111, 0x1f80);
C
Chun-Hao Lin 已提交
4805

4806
	rtl_eri_write(tp, 0x5f0, ERIAR_MASK_0011, 0x4f87);
C
Chun-Hao Lin 已提交
4807

4808
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
C
Chun-Hao Lin 已提交
4809

4810 4811
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
C
Chun-Hao Lin 已提交
4812

4813 4814
	rtl8168_config_eee_mac(tp);

4815
	rtl_w0w1_eri(tp, 0x2fc, ERIAR_MASK_0001, 0x01, 0x06);
C
Chun-Hao Lin 已提交
4816

4817
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~TX_10M_PS_EN);
C
Chun-Hao Lin 已提交
4818

4819
	rtl_pcie_state_l2l3_disable(tp);
C
Chun-Hao Lin 已提交
4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832
}

static void rtl_hw_start_8168ep_1(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168ep_1[] = {
		{ 0x00, 0xffff,	0x10ab },
		{ 0x06, 0xffff,	0xf030 },
		{ 0x08, 0xffff,	0x2006 },
		{ 0x0d, 0xffff,	0x1666 },
		{ 0x0c, 0x3ff0,	0x0000 }
	};

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
4833
	rtl_hw_aspm_clkreq_enable(tp, false);
4834
	rtl_ephy_init(tp, e_info_8168ep_1);
C
Chun-Hao Lin 已提交
4835 4836

	rtl_hw_start_8168ep(tp);
K
Kai-Heng Feng 已提交
4837 4838

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849
}

static void rtl_hw_start_8168ep_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168ep_2[] = {
		{ 0x00, 0xffff,	0x10a3 },
		{ 0x19, 0xffff,	0xfc00 },
		{ 0x1e, 0xffff,	0x20ea }
	};

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
4850
	rtl_hw_aspm_clkreq_enable(tp, false);
4851
	rtl_ephy_init(tp, e_info_8168ep_2);
C
Chun-Hao Lin 已提交
4852 4853 4854

	rtl_hw_start_8168ep(tp);

4855 4856
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
K
Kai-Heng Feng 已提交
4857 4858

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
4859 4860 4861 4862 4863
}

static void rtl_hw_start_8168ep_3(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168ep_3[] = {
4864 4865 4866 4867
		{ 0x00, 0x0000,	0x0080 },
		{ 0x0d, 0x0100,	0x0200 },
		{ 0x19, 0x8021,	0x0000 },
		{ 0x1e, 0x0000,	0x2000 },
C
Chun-Hao Lin 已提交
4868 4869 4870
	};

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
4871
	rtl_hw_aspm_clkreq_enable(tp, false);
4872
	rtl_ephy_init(tp, e_info_8168ep_3);
C
Chun-Hao Lin 已提交
4873 4874 4875

	rtl_hw_start_8168ep(tp);

4876 4877
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
C
Chun-Hao Lin 已提交
4878

4879 4880 4881
	r8168_mac_ocp_modify(tp, 0xd3e2, 0x0fff, 0x0271);
	r8168_mac_ocp_modify(tp, 0xd3e4, 0x00ff, 0x0000);
	r8168_mac_ocp_modify(tp, 0xe860, 0x0000, 0x0080);
K
Kai-Heng Feng 已提交
4882 4883

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
4884 4885
}

4886
static void rtl_hw_start_8102e_1(struct rtl8169_private *tp)
4887
{
4888
	static const struct ephy_info e_info_8102e_1[] = {
4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899
		{ 0x01,	0, 0x6e65 },
		{ 0x02,	0, 0x091f },
		{ 0x03,	0, 0xc2f9 },
		{ 0x06,	0, 0xafb5 },
		{ 0x07,	0, 0x0e00 },
		{ 0x19,	0, 0xec80 },
		{ 0x01,	0, 0x2e65 },
		{ 0x01,	0, 0x6e65 }
	};
	u8 cfg1;

4900
	rtl_set_def_aspm_entry_latency(tp);
4901

4902
	RTL_W8(tp, DBG_REG, FIX_NAK_1);
4903

4904
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4905

4906
	RTL_W8(tp, Config1,
4907
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
4908
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
4909

4910
	cfg1 = RTL_R8(tp, Config1);
4911
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
4912
		RTL_W8(tp, Config1, cfg1 & ~LEDS0);
4913

4914
	rtl_ephy_init(tp, e_info_8102e_1);
4915 4916
}

4917
static void rtl_hw_start_8102e_2(struct rtl8169_private *tp)
4918
{
4919
	rtl_set_def_aspm_entry_latency(tp);
4920

4921
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4922

4923 4924
	RTL_W8(tp, Config1, MEMMAP | IOMAP | VPD | PMEnable);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
4925 4926
}

4927
static void rtl_hw_start_8102e_3(struct rtl8169_private *tp)
4928
{
4929
	rtl_hw_start_8102e_2(tp);
4930

4931
	rtl_ephy_write(tp, 0x03, 0xc2f9);
4932 4933
}

4934
static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946
{
	static const struct ephy_info e_info_8105e_1[] = {
		{ 0x07,	0, 0x4000 },
		{ 0x19,	0, 0x0200 },
		{ 0x19,	0, 0x0020 },
		{ 0x1e,	0, 0x2000 },
		{ 0x03,	0, 0x0001 },
		{ 0x19,	0, 0x0100 },
		{ 0x19,	0, 0x0004 },
		{ 0x0a,	0, 0x0020 }
	};

F
Francois Romieu 已提交
4947
	/* Force LAN exit from ASPM if Rx/Tx are not idle */
4948
	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
4949

F
Francois Romieu 已提交
4950
	/* Disable Early Tally Counter */
4951
	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) & ~0x010000);
4952

4953 4954
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) | EN_NDP | EN_OOB_RESET);
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
4955

4956
	rtl_ephy_init(tp, e_info_8105e_1);
H
hayeswang 已提交
4957

4958
	rtl_pcie_state_l2l3_disable(tp);
4959 4960
}

4961
static void rtl_hw_start_8105e_2(struct rtl8169_private *tp)
4962
{
4963
	rtl_hw_start_8105e_1(tp);
4964
	rtl_ephy_write(tp, 0x1e, rtl_ephy_read(tp, 0x1e) | 0x8000);
4965 4966
}

4967 4968 4969 4970 4971 4972 4973
static void rtl_hw_start_8402(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8402[] = {
		{ 0x19,	0xffff, 0xff64 },
		{ 0x1e,	0, 0x4000 }
	};

4974
	rtl_set_def_aspm_entry_latency(tp);
4975 4976

	/* Force LAN exit from ASPM if Rx/Tx are not idle */
4977
	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
4978

4979
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
4980

4981
	rtl_ephy_init(tp, e_info_8402);
4982

4983
	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
4984

H
Heiner Kallweit 已提交
4985
	rtl_set_fifo_size(tp, 0x00, 0x00, 0x02, 0x06);
4986
	rtl_reset_packet_filter(tp);
4987 4988 4989
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
	rtl_w0w1_eri(tp, 0x0d4, ERIAR_MASK_0011, 0x0e00, 0xff00);
H
hayeswang 已提交
4990

4991
	rtl_pcie_state_l2l3_disable(tp);
4992 4993
}

H
Hayes Wang 已提交
4994 4995
static void rtl_hw_start_8106(struct rtl8169_private *tp)
{
K
Kai-Heng Feng 已提交
4996 4997
	rtl_hw_aspm_clkreq_enable(tp, false);

H
Hayes Wang 已提交
4998
	/* Force LAN exit from ASPM if Rx/Tx are not idle */
4999
	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
H
Hayes Wang 已提交
5000

5001 5002 5003
	RTL_W32(tp, MISC, (RTL_R32(tp, MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) | EN_NDP | EN_OOB_RESET);
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
H
hayeswang 已提交
5004

5005
	rtl_pcie_state_l2l3_disable(tp);
K
Kai-Heng Feng 已提交
5006
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Hayes Wang 已提交
5007 5008
}

5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063
static void rtl_hw_config(struct rtl8169_private *tp)
{
	static const rtl_generic_fct hw_configs[] = {
		[RTL_GIGA_MAC_VER_07] = rtl_hw_start_8102e_1,
		[RTL_GIGA_MAC_VER_08] = rtl_hw_start_8102e_3,
		[RTL_GIGA_MAC_VER_09] = rtl_hw_start_8102e_2,
		[RTL_GIGA_MAC_VER_10] = NULL,
		[RTL_GIGA_MAC_VER_11] = rtl_hw_start_8168bb,
		[RTL_GIGA_MAC_VER_12] = rtl_hw_start_8168bef,
		[RTL_GIGA_MAC_VER_13] = NULL,
		[RTL_GIGA_MAC_VER_14] = NULL,
		[RTL_GIGA_MAC_VER_15] = NULL,
		[RTL_GIGA_MAC_VER_16] = NULL,
		[RTL_GIGA_MAC_VER_17] = rtl_hw_start_8168bef,
		[RTL_GIGA_MAC_VER_18] = rtl_hw_start_8168cp_1,
		[RTL_GIGA_MAC_VER_19] = rtl_hw_start_8168c_1,
		[RTL_GIGA_MAC_VER_20] = rtl_hw_start_8168c_2,
		[RTL_GIGA_MAC_VER_21] = rtl_hw_start_8168c_3,
		[RTL_GIGA_MAC_VER_22] = rtl_hw_start_8168c_4,
		[RTL_GIGA_MAC_VER_23] = rtl_hw_start_8168cp_2,
		[RTL_GIGA_MAC_VER_24] = rtl_hw_start_8168cp_3,
		[RTL_GIGA_MAC_VER_25] = rtl_hw_start_8168d,
		[RTL_GIGA_MAC_VER_26] = rtl_hw_start_8168d,
		[RTL_GIGA_MAC_VER_27] = rtl_hw_start_8168d,
		[RTL_GIGA_MAC_VER_28] = rtl_hw_start_8168d_4,
		[RTL_GIGA_MAC_VER_29] = rtl_hw_start_8105e_1,
		[RTL_GIGA_MAC_VER_30] = rtl_hw_start_8105e_2,
		[RTL_GIGA_MAC_VER_31] = rtl_hw_start_8168dp,
		[RTL_GIGA_MAC_VER_32] = rtl_hw_start_8168e_1,
		[RTL_GIGA_MAC_VER_33] = rtl_hw_start_8168e_1,
		[RTL_GIGA_MAC_VER_34] = rtl_hw_start_8168e_2,
		[RTL_GIGA_MAC_VER_35] = rtl_hw_start_8168f_1,
		[RTL_GIGA_MAC_VER_36] = rtl_hw_start_8168f_1,
		[RTL_GIGA_MAC_VER_37] = rtl_hw_start_8402,
		[RTL_GIGA_MAC_VER_38] = rtl_hw_start_8411,
		[RTL_GIGA_MAC_VER_39] = rtl_hw_start_8106,
		[RTL_GIGA_MAC_VER_40] = rtl_hw_start_8168g_1,
		[RTL_GIGA_MAC_VER_41] = rtl_hw_start_8168g_1,
		[RTL_GIGA_MAC_VER_42] = rtl_hw_start_8168g_2,
		[RTL_GIGA_MAC_VER_43] = rtl_hw_start_8168g_2,
		[RTL_GIGA_MAC_VER_44] = rtl_hw_start_8411_2,
		[RTL_GIGA_MAC_VER_45] = rtl_hw_start_8168h_1,
		[RTL_GIGA_MAC_VER_46] = rtl_hw_start_8168h_1,
		[RTL_GIGA_MAC_VER_47] = rtl_hw_start_8168h_1,
		[RTL_GIGA_MAC_VER_48] = rtl_hw_start_8168h_1,
		[RTL_GIGA_MAC_VER_49] = rtl_hw_start_8168ep_1,
		[RTL_GIGA_MAC_VER_50] = rtl_hw_start_8168ep_2,
		[RTL_GIGA_MAC_VER_51] = rtl_hw_start_8168ep_3,
	};

	if (hw_configs[tp->mac_version])
		hw_configs[tp->mac_version](tp);
}

static void rtl_hw_start_8168(struct rtl8169_private *tp)
5064
{
F
Francois Romieu 已提交
5065
	if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
5066
	    tp->mac_version == RTL_GIGA_MAC_VER_16)
5067
		pcie_capability_set_word(tp->pci_dev, PCI_EXP_DEVCTL,
5068
					 PCI_EXP_DEVCTL_NOSNOOP_EN);
5069

5070 5071 5072 5073
	if (rtl_is_8168evl_up(tp))
		RTL_W8(tp, MaxTxPacketSize, EarlySize);
	else
		RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
H
hayeswang 已提交
5074

5075
	rtl_hw_config(tp);
L
Linus Torvalds 已提交
5076 5077
}

5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127
static void rtl_hw_start_8169(struct rtl8169_private *tp)
{
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);

	RTL_W8(tp, EarlyTxThres, NoEarlyTx);

	tp->cp_cmd |= PCIMulRW;

	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
		netif_dbg(tp, drv, tp->dev,
			  "Set MAC Reg C+CR Offset 0xe0. Bit 3 and Bit 14 MUST be 1\n");
		tp->cp_cmd |= (1 << 14);
	}

	RTL_W16(tp, CPlusCmd, tp->cp_cmd);

	rtl8169_set_magic_reg(tp, tp->mac_version);

	RTL_W32(tp, RxMissed, 0);
}

static void rtl_hw_start(struct  rtl8169_private *tp)
{
	rtl_unlock_config_regs(tp);

	tp->cp_cmd &= CPCMD_MASK;
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);

	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		rtl_hw_start_8169(tp);
	else
		rtl_hw_start_8168(tp);

	rtl_set_rx_max_size(tp);
	rtl_set_rx_tx_desc_registers(tp);
	rtl_lock_config_regs(tp);

	/* disable interrupt coalescing */
	RTL_W16(tp, IntrMitigate, 0x0000);
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
	RTL_R8(tp, IntrMask);
	RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
	rtl_init_rxcfg(tp);
	rtl_set_tx_config_registers(tp);
	rtl_set_rx_mode(tp->dev);
	rtl_irq_enable(tp);
}

L
Linus Torvalds 已提交
5128 5129
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
{
F
Francois Romieu 已提交
5130 5131 5132 5133 5134 5135 5136
	struct rtl8169_private *tp = netdev_priv(dev);

	if (new_mtu > ETH_DATA_LEN)
		rtl_hw_jumbo_enable(tp);
	else
		rtl_hw_jumbo_disable(tp);

L
Linus Torvalds 已提交
5137
	dev->mtu = new_mtu;
5138 5139
	netdev_update_features(dev);

S
Stanislaw Gruszka 已提交
5140
	return 0;
L
Linus Torvalds 已提交
5141 5142 5143 5144
}

static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
{
A
Al Viro 已提交
5145
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
L
Linus Torvalds 已提交
5146 5147 5148
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
}

5149
static inline void rtl8169_mark_to_asic(struct RxDesc *desc)
L
Linus Torvalds 已提交
5150 5151 5152
{
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;

5153 5154 5155
	/* Force memory writes to complete before releasing descriptor */
	dma_wmb();

5156
	desc->opts1 = cpu_to_le32(DescOwn | eor | R8169_RX_BUF_SIZE);
L
Linus Torvalds 已提交
5157 5158
}

5159 5160
static struct page *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
					  struct RxDesc *desc)
L
Linus Torvalds 已提交
5161
{
H
Heiner Kallweit 已提交
5162
	struct device *d = tp_to_dev(tp);
5163
	int node = dev_to_node(d);
5164 5165
	dma_addr_t mapping;
	struct page *data;
L
Linus Torvalds 已提交
5166

5167
	data = alloc_pages_node(node, GFP_KERNEL, get_order(R8169_RX_BUF_SIZE));
E
Eric Dumazet 已提交
5168 5169
	if (!data)
		return NULL;
5170

5171
	mapping = dma_map_page(d, data, 0, R8169_RX_BUF_SIZE, DMA_FROM_DEVICE);
5172 5173 5174
	if (unlikely(dma_mapping_error(d, mapping))) {
		if (net_ratelimit())
			netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
5175 5176
		__free_pages(data, get_order(R8169_RX_BUF_SIZE));
		return NULL;
5177
	}
L
Linus Torvalds 已提交
5178

5179 5180
	desc->addr = cpu_to_le64(mapping);
	rtl8169_mark_to_asic(desc);
5181

5182
	return data;
L
Linus Torvalds 已提交
5183 5184 5185 5186
}

static void rtl8169_rx_clear(struct rtl8169_private *tp)
{
F
Francois Romieu 已提交
5187
	unsigned int i;
L
Linus Torvalds 已提交
5188

5189 5190 5191 5192 5193 5194 5195
	for (i = 0; i < NUM_RX_DESC && tp->Rx_databuff[i]; i++) {
		dma_unmap_page(tp_to_dev(tp),
			       le64_to_cpu(tp->RxDescArray[i].addr),
			       R8169_RX_BUF_SIZE, DMA_FROM_DEVICE);
		__free_pages(tp->Rx_databuff[i], get_order(R8169_RX_BUF_SIZE));
		tp->Rx_databuff[i] = NULL;
		rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
L
Linus Torvalds 已提交
5196 5197 5198
	}
}

S
Stanislaw Gruszka 已提交
5199
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
L
Linus Torvalds 已提交
5200
{
S
Stanislaw Gruszka 已提交
5201 5202
	desc->opts1 |= cpu_to_le32(RingEnd);
}
5203

S
Stanislaw Gruszka 已提交
5204 5205 5206
static int rtl8169_rx_fill(struct rtl8169_private *tp)
{
	unsigned int i;
L
Linus Torvalds 已提交
5207

S
Stanislaw Gruszka 已提交
5208
	for (i = 0; i < NUM_RX_DESC; i++) {
5209
		struct page *data;
5210

S
Stanislaw Gruszka 已提交
5211
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
E
Eric Dumazet 已提交
5212 5213
		if (!data) {
			rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
S
Stanislaw Gruszka 已提交
5214
			goto err_out;
E
Eric Dumazet 已提交
5215 5216
		}
		tp->Rx_databuff[i] = data;
L
Linus Torvalds 已提交
5217 5218
	}

S
Stanislaw Gruszka 已提交
5219 5220 5221 5222 5223 5224
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
	return 0;

err_out:
	rtl8169_rx_clear(tp);
	return -ENOMEM;
L
Linus Torvalds 已提交
5225 5226
}

5227
static int rtl8169_init_ring(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
5228 5229 5230
{
	rtl8169_init_ring_indexes(tp);

5231 5232
	memset(tp->tx_skb, 0, sizeof(tp->tx_skb));
	memset(tp->Rx_databuff, 0, sizeof(tp->Rx_databuff));
L
Linus Torvalds 已提交
5233

S
Stanislaw Gruszka 已提交
5234
	return rtl8169_rx_fill(tp);
L
Linus Torvalds 已提交
5235 5236
}

5237
static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
L
Linus Torvalds 已提交
5238 5239 5240 5241
				 struct TxDesc *desc)
{
	unsigned int len = tx_skb->len;

5242 5243
	dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);

L
Linus Torvalds 已提交
5244 5245 5246 5247 5248 5249
	desc->opts1 = 0x00;
	desc->opts2 = 0x00;
	desc->addr = 0x00;
	tx_skb->len = 0;
}

5250 5251
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
				   unsigned int n)
L
Linus Torvalds 已提交
5252 5253 5254
{
	unsigned int i;

5255 5256
	for (i = 0; i < n; i++) {
		unsigned int entry = (start + i) % NUM_TX_DESC;
L
Linus Torvalds 已提交
5257 5258 5259 5260 5261 5262
		struct ring_info *tx_skb = tp->tx_skb + entry;
		unsigned int len = tx_skb->len;

		if (len) {
			struct sk_buff *skb = tx_skb->skb;

H
Heiner Kallweit 已提交
5263
			rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
L
Linus Torvalds 已提交
5264 5265
					     tp->TxDescArray + entry);
			if (skb) {
5266
				dev_consume_skb_any(skb);
L
Linus Torvalds 已提交
5267 5268 5269 5270
				tx_skb->skb = NULL;
			}
		}
	}
5271 5272 5273 5274 5275
}

static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
L
Linus Torvalds 已提交
5276
	tp->cur_tx = tp->dirty_tx = 0;
5277
	netdev_reset_queue(tp->dev);
L
Linus Torvalds 已提交
5278 5279
}

5280
static void rtl_reset_work(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
5281
{
D
David Howells 已提交
5282
	struct net_device *dev = tp->dev;
5283
	int i;
L
Linus Torvalds 已提交
5284

5285 5286
	napi_disable(&tp->napi);
	netif_stop_queue(dev);
5287
	synchronize_rcu();
L
Linus Torvalds 已提交
5288

5289 5290
	rtl8169_hw_reset(tp);

5291
	for (i = 0; i < NUM_RX_DESC; i++)
5292
		rtl8169_mark_to_asic(tp->RxDescArray + i);
5293

L
Linus Torvalds 已提交
5294
	rtl8169_tx_clear(tp);
5295
	rtl8169_init_ring_indexes(tp);
L
Linus Torvalds 已提交
5296

5297
	napi_enable(&tp->napi);
5298
	rtl_hw_start(tp);
5299
	netif_wake_queue(dev);
L
Linus Torvalds 已提交
5300 5301 5302 5303
}

static void rtl8169_tx_timeout(struct net_device *dev)
{
5304 5305 5306
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
L
Linus Torvalds 已提交
5307 5308
}

5309 5310 5311 5312 5313 5314 5315 5316 5317 5318
static __le32 rtl8169_get_txd_opts1(u32 opts0, u32 len, unsigned int entry)
{
	u32 status = opts0 | len;

	if (entry == NUM_TX_DESC - 1)
		status |= RingEnd;

	return cpu_to_le32(status);
}

L
Linus Torvalds 已提交
5319
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
F
Francois Romieu 已提交
5320
			      u32 *opts)
L
Linus Torvalds 已提交
5321 5322 5323
{
	struct skb_shared_info *info = skb_shinfo(skb);
	unsigned int cur_frag, entry;
5324
	struct TxDesc *uninitialized_var(txd);
H
Heiner Kallweit 已提交
5325
	struct device *d = tp_to_dev(tp);
L
Linus Torvalds 已提交
5326 5327 5328

	entry = tp->cur_tx;
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
E
Eric Dumazet 已提交
5329
		const skb_frag_t *frag = info->frags + cur_frag;
L
Linus Torvalds 已提交
5330
		dma_addr_t mapping;
5331
		u32 len;
L
Linus Torvalds 已提交
5332 5333 5334 5335 5336
		void *addr;

		entry = (entry + 1) % NUM_TX_DESC;

		txd = tp->TxDescArray + entry;
E
Eric Dumazet 已提交
5337
		len = skb_frag_size(frag);
5338
		addr = skb_frag_address(frag);
5339
		mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
5340 5341 5342 5343
		if (unlikely(dma_mapping_error(d, mapping))) {
			if (net_ratelimit())
				netif_err(tp, drv, tp->dev,
					  "Failed to map TX fragments DMA!\n");
5344
			goto err_out;
5345
		}
L
Linus Torvalds 已提交
5346

5347
		txd->opts1 = rtl8169_get_txd_opts1(opts[0], len, entry);
F
Francois Romieu 已提交
5348
		txd->opts2 = cpu_to_le32(opts[1]);
L
Linus Torvalds 已提交
5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359
		txd->addr = cpu_to_le64(mapping);

		tp->tx_skb[entry].len = len;
	}

	if (cur_frag) {
		tp->tx_skb[entry].skb = skb;
		txd->opts1 |= cpu_to_le32(LastFrag);
	}

	return cur_frag;
5360 5361 5362 5363

err_out:
	rtl8169_tx_clear_range(tp, tp->cur_tx + 1, cur_frag);
	return -EIO;
L
Linus Torvalds 已提交
5364 5365
}

5366 5367 5368 5369 5370
static bool rtl_test_hw_pad_bug(struct rtl8169_private *tp, struct sk_buff *skb)
{
	return skb->len < ETH_ZLEN && tp->mac_version == RTL_GIGA_MAC_VER_34;
}

H
hayeswang 已提交
5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393
/* msdn_giant_send_check()
 * According to the document of microsoft, the TCP Pseudo Header excludes the
 * packet length for IPv6 TCP large packets.
 */
static int msdn_giant_send_check(struct sk_buff *skb)
{
	const struct ipv6hdr *ipv6h;
	struct tcphdr *th;
	int ret;

	ret = skb_cow_head(skb, 0);
	if (ret)
		return ret;

	ipv6h = ipv6_hdr(skb);
	th = tcp_hdr(skb);

	th->check = 0;
	th->check = ~tcp_v6_check(0, &ipv6h->saddr, &ipv6h->daddr, 0);

	return ret;
}

5394
static void rtl8169_tso_csum_v1(struct sk_buff *skb, u32 *opts)
L
Linus Torvalds 已提交
5395
{
5396 5397
	u32 mss = skb_shinfo(skb)->gso_size;

F
Francois Romieu 已提交
5398 5399
	if (mss) {
		opts[0] |= TD_LSO;
H
hayeswang 已提交
5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415
		opts[0] |= min(mss, TD_MSS_MAX) << TD0_MSS_SHIFT;
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
		const struct iphdr *ip = ip_hdr(skb);

		if (ip->protocol == IPPROTO_TCP)
			opts[0] |= TD0_IP_CS | TD0_TCP_CS;
		else if (ip->protocol == IPPROTO_UDP)
			opts[0] |= TD0_IP_CS | TD0_UDP_CS;
		else
			WARN_ON_ONCE(1);
	}
}

static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
				struct sk_buff *skb, u32 *opts)
{
H
hayeswang 已提交
5416
	u32 transport_offset = (u32)skb_transport_offset(skb);
H
hayeswang 已提交
5417 5418 5419
	u32 mss = skb_shinfo(skb)->gso_size;

	if (mss) {
5420
		switch (vlan_get_protocol(skb)) {
H
hayeswang 已提交
5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436
		case htons(ETH_P_IP):
			opts[0] |= TD1_GTSENV4;
			break;

		case htons(ETH_P_IPV6):
			if (msdn_giant_send_check(skb))
				return false;

			opts[0] |= TD1_GTSENV6;
			break;

		default:
			WARN_ON_ONCE(1);
			break;
		}

H
hayeswang 已提交
5437
		opts[0] |= transport_offset << GTTCPHO_SHIFT;
H
hayeswang 已提交
5438
		opts[1] |= min(mss, TD_MSS_MAX) << TD1_MSS_SHIFT;
F
Francois Romieu 已提交
5439
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
H
hayeswang 已提交
5440
		u8 ip_protocol;
L
Linus Torvalds 已提交
5441

5442
		switch (vlan_get_protocol(skb)) {
H
hayeswang 已提交
5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461
		case htons(ETH_P_IP):
			opts[1] |= TD1_IPv4_CS;
			ip_protocol = ip_hdr(skb)->protocol;
			break;

		case htons(ETH_P_IPV6):
			opts[1] |= TD1_IPv6_CS;
			ip_protocol = ipv6_hdr(skb)->nexthdr;
			break;

		default:
			ip_protocol = IPPROTO_RAW;
			break;
		}

		if (ip_protocol == IPPROTO_TCP)
			opts[1] |= TD1_TCP_CS;
		else if (ip_protocol == IPPROTO_UDP)
			opts[1] |= TD1_UDP_CS;
F
Francois Romieu 已提交
5462 5463
		else
			WARN_ON_ONCE(1);
H
hayeswang 已提交
5464 5465

		opts[1] |= transport_offset << TCPHO_SHIFT;
5466 5467
	} else {
		if (unlikely(rtl_test_hw_pad_bug(tp, skb)))
A
Alexander Duyck 已提交
5468
			return !eth_skb_pad(skb);
L
Linus Torvalds 已提交
5469
	}
H
hayeswang 已提交
5470

5471
	return true;
L
Linus Torvalds 已提交
5472 5473
}

5474 5475 5476 5477 5478 5479 5480 5481 5482
static bool rtl_tx_slots_avail(struct rtl8169_private *tp,
			       unsigned int nr_frags)
{
	unsigned int slots_avail = tp->dirty_tx + NUM_TX_DESC - tp->cur_tx;

	/* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */
	return slots_avail > nr_frags;
}

5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494
/* Versions RTL8102e and from RTL8168c onwards support csum_v2 */
static bool rtl_chip_supports_csum_v2(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
	case RTL_GIGA_MAC_VER_10 ... RTL_GIGA_MAC_VER_17:
		return false;
	default:
		return true;
	}
}

5495 5496
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
				      struct net_device *dev)
L
Linus Torvalds 已提交
5497 5498
{
	struct rtl8169_private *tp = netdev_priv(dev);
5499
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
L
Linus Torvalds 已提交
5500
	struct TxDesc *txd = tp->TxDescArray + entry;
H
Heiner Kallweit 已提交
5501
	struct device *d = tp_to_dev(tp);
L
Linus Torvalds 已提交
5502
	dma_addr_t mapping;
5503
	u32 opts[2], len;
H
Heiner Kallweit 已提交
5504 5505
	bool stop_queue;
	bool door_bell;
5506
	int frags;
5507

5508
	if (unlikely(!rtl_tx_slots_avail(tp, skb_shinfo(skb)->nr_frags))) {
5509
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
5510
		goto err_stop_0;
L
Linus Torvalds 已提交
5511 5512 5513
	}

	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
5514 5515
		goto err_stop_0;

5516
	opts[1] = rtl8169_tx_vlan_tag(skb);
5517 5518
	opts[0] = DescOwn;

5519
	if (rtl_chip_supports_csum_v2(tp)) {
5520 5521
		if (!rtl8169_tso_csum_v2(tp, skb, opts))
			goto err_dma_0;
5522 5523
	} else {
		rtl8169_tso_csum_v1(skb, opts);
H
hayeswang 已提交
5524
	}
5525

5526
	len = skb_headlen(skb);
5527
	mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
5528 5529 5530
	if (unlikely(dma_mapping_error(d, mapping))) {
		if (net_ratelimit())
			netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
5531
		goto err_dma_0;
5532
	}
5533 5534 5535

	tp->tx_skb[entry].len = len;
	txd->addr = cpu_to_le64(mapping);
L
Linus Torvalds 已提交
5536

F
Francois Romieu 已提交
5537
	frags = rtl8169_xmit_frags(tp, skb, opts);
5538 5539 5540
	if (frags < 0)
		goto err_dma_1;
	else if (frags)
F
Francois Romieu 已提交
5541
		opts[0] |= FirstFrag;
5542
	else {
F
Francois Romieu 已提交
5543
		opts[0] |= FirstFrag | LastFrag;
L
Linus Torvalds 已提交
5544 5545 5546
		tp->tx_skb[entry].skb = skb;
	}

F
Francois Romieu 已提交
5547 5548
	txd->opts2 = cpu_to_le32(opts[1]);

5549 5550
	skb_tx_timestamp(skb);

5551 5552
	/* Force memory writes to complete before releasing descriptor */
	dma_wmb();
L
Linus Torvalds 已提交
5553

H
Heiner Kallweit 已提交
5554 5555
	door_bell = __netdev_sent_queue(dev, skb->len, netdev_xmit_more());

5556
	txd->opts1 = rtl8169_get_txd_opts1(opts[0], len, entry);
L
Linus Torvalds 已提交
5557

5558
	/* Force all memory writes to complete before notifying device */
5559
	wmb();
L
Linus Torvalds 已提交
5560

5561 5562
	tp->cur_tx += frags + 1;

H
Heiner Kallweit 已提交
5563 5564
	stop_queue = !rtl_tx_slots_avail(tp, MAX_SKB_FRAGS);
	if (unlikely(stop_queue)) {
5565 5566 5567 5568 5569
		/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
		 * not miss a ring update when it notices a stopped queue.
		 */
		smp_wmb();
		netif_stop_queue(dev);
5570
		door_bell = true;
H
Heiner Kallweit 已提交
5571 5572 5573 5574 5575 5576
	}

	if (door_bell)
		RTL_W8(tp, TxPoll, NPQ);

	if (unlikely(stop_queue)) {
5577 5578 5579 5580 5581 5582 5583
		/* Sync with rtl_tx:
		 * - publish queue status and cur_tx ring index (write barrier)
		 * - refresh dirty_tx ring index (read barrier).
		 * May the current thread have a pessimistic view of the ring
		 * status and forget to wake up queue, a racing rtl_tx thread
		 * can't.
		 */
F
Francois Romieu 已提交
5584
		smp_mb();
5585
		if (rtl_tx_slots_avail(tp, MAX_SKB_FRAGS))
5586
			netif_start_queue(dev);
L
Linus Torvalds 已提交
5587 5588
	}

5589
	return NETDEV_TX_OK;
L
Linus Torvalds 已提交
5590

5591
err_dma_1:
5592
	rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
5593
err_dma_0:
5594
	dev_kfree_skb_any(skb);
5595 5596 5597 5598
	dev->stats.tx_dropped++;
	return NETDEV_TX_OK;

err_stop_0:
L
Linus Torvalds 已提交
5599
	netif_stop_queue(dev);
5600
	dev->stats.tx_dropped++;
5601
	return NETDEV_TX_BUSY;
L
Linus Torvalds 已提交
5602 5603
}

5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636
static netdev_features_t rtl8169_features_check(struct sk_buff *skb,
						struct net_device *dev,
						netdev_features_t features)
{
	int transport_offset = skb_transport_offset(skb);
	struct rtl8169_private *tp = netdev_priv(dev);

	if (skb_is_gso(skb)) {
		if (transport_offset > GTTCPHO_MAX &&
		    rtl_chip_supports_csum_v2(tp))
			features &= ~NETIF_F_ALL_TSO;
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
		if (skb->len < ETH_ZLEN) {
			switch (tp->mac_version) {
			case RTL_GIGA_MAC_VER_11:
			case RTL_GIGA_MAC_VER_12:
			case RTL_GIGA_MAC_VER_17:
			case RTL_GIGA_MAC_VER_34:
				features &= ~NETIF_F_CSUM_MASK;
				break;
			default:
				break;
			}
		}

		if (transport_offset > TCPHO_MAX &&
		    rtl_chip_supports_csum_v2(tp))
			features &= ~NETIF_F_CSUM_MASK;
	}

	return vlan_features_check(skb, features);
}

L
Linus Torvalds 已提交
5637 5638 5639 5640 5641 5642 5643 5644 5645
static void rtl8169_pcierr_interrupt(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
	u16 pci_status, pci_cmd;

	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);

5646 5647
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
		  pci_cmd, pci_status);
L
Linus Torvalds 已提交
5648 5649 5650 5651

	/*
	 * The recovery sequence below admits a very elaborated explanation:
	 * - it seems to work;
5652 5653
	 * - I did not see what else could be done;
	 * - it makes iop3xx happy.
L
Linus Torvalds 已提交
5654 5655 5656
	 *
	 * Feel free to adjust to your needs.
	 */
5657
	if (pdev->broken_parity_status)
5658 5659 5660 5661 5662
		pci_cmd &= ~PCI_COMMAND_PARITY;
	else
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;

	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
L
Linus Torvalds 已提交
5663 5664 5665 5666 5667 5668

	pci_write_config_word(pdev, PCI_STATUS,
		pci_status & (PCI_STATUS_DETECTED_PARITY |
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));

5669
	rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
L
Linus Torvalds 已提交
5670 5671
}

5672 5673
static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
		   int budget)
L
Linus Torvalds 已提交
5674
{
5675
	unsigned int dirty_tx, tx_left, bytes_compl = 0, pkts_compl = 0;
L
Linus Torvalds 已提交
5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689

	dirty_tx = tp->dirty_tx;
	smp_rmb();
	tx_left = tp->cur_tx - dirty_tx;

	while (tx_left > 0) {
		unsigned int entry = dirty_tx % NUM_TX_DESC;
		struct ring_info *tx_skb = tp->tx_skb + entry;
		u32 status;

		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
		if (status & DescOwn)
			break;

5690 5691 5692 5693 5694 5695
		/* This barrier is needed to keep us from reading
		 * any other fields out of the Tx descriptor until
		 * we know the status of DescOwn
		 */
		dma_rmb();

H
Heiner Kallweit 已提交
5696
		rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
5697
				     tp->TxDescArray + entry);
L
Linus Torvalds 已提交
5698
		if (status & LastFrag) {
5699 5700
			pkts_compl++;
			bytes_compl += tx_skb->skb->len;
5701
			napi_consume_skb(tx_skb->skb, budget);
L
Linus Torvalds 已提交
5702 5703 5704 5705 5706 5707 5708
			tx_skb->skb = NULL;
		}
		dirty_tx++;
		tx_left--;
	}

	if (tp->dirty_tx != dirty_tx) {
5709 5710 5711 5712 5713 5714 5715
		netdev_completed_queue(dev, pkts_compl, bytes_compl);

		u64_stats_update_begin(&tp->tx_stats.syncp);
		tp->tx_stats.packets += pkts_compl;
		tp->tx_stats.bytes += bytes_compl;
		u64_stats_update_end(&tp->tx_stats.syncp);

L
Linus Torvalds 已提交
5716
		tp->dirty_tx = dirty_tx;
5717 5718 5719 5720 5721 5722 5723
		/* Sync with rtl8169_start_xmit:
		 * - publish dirty_tx ring index (write barrier)
		 * - refresh cur_tx ring index and queue status (read barrier)
		 * May the current thread miss the stopped queue condition,
		 * a racing xmit thread can only have a right view of the
		 * ring status.
		 */
F
Francois Romieu 已提交
5724
		smp_mb();
L
Linus Torvalds 已提交
5725
		if (netif_queue_stopped(dev) &&
5726
		    rtl_tx_slots_avail(tp, MAX_SKB_FRAGS)) {
L
Linus Torvalds 已提交
5727 5728
			netif_wake_queue(dev);
		}
5729 5730 5731 5732 5733 5734
		/*
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
		 * too close. Let's kick an extra TxPoll request when a burst
		 * of start_xmit activity is detected (if it is not detected,
		 * it is slow enough). -- FR
		 */
5735 5736
		if (tp->cur_tx != dirty_tx)
			RTL_W8(tp, TxPoll, NPQ);
L
Linus Torvalds 已提交
5737 5738 5739
	}
}

5740 5741 5742 5743 5744
static inline int rtl8169_fragmented_frame(u32 status)
{
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
}

E
Eric Dumazet 已提交
5745
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
L
Linus Torvalds 已提交
5746 5747 5748 5749
{
	u32 status = opts1 & RxProtoMask;

	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
S
Shan Wei 已提交
5750
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
L
Linus Torvalds 已提交
5751 5752
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	else
5753
		skb_checksum_none_assert(skb);
L
Linus Torvalds 已提交
5754 5755
}

5756
static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget)
L
Linus Torvalds 已提交
5757 5758
{
	unsigned int cur_rx, rx_left;
E
Eric Dumazet 已提交
5759
	unsigned int count;
L
Linus Torvalds 已提交
5760 5761 5762

	cur_rx = tp->cur_rx;

5763
	for (rx_left = min(budget, NUM_RX_DESC); rx_left > 0; rx_left--, cur_rx++) {
L
Linus Torvalds 已提交
5764
		unsigned int entry = cur_rx % NUM_RX_DESC;
5765
		const void *rx_buf = page_address(tp->Rx_databuff[entry]);
5766
		struct RxDesc *desc = tp->RxDescArray + entry;
L
Linus Torvalds 已提交
5767 5768
		u32 status;

5769
		status = le32_to_cpu(desc->opts1);
L
Linus Torvalds 已提交
5770 5771
		if (status & DescOwn)
			break;
5772 5773 5774 5775 5776 5777 5778

		/* This barrier is needed to keep us from reading
		 * any other fields out of the Rx descriptor until
		 * we know the status of DescOwn
		 */
		dma_rmb();

R
Richard Dawe 已提交
5779
		if (unlikely(status & RxRES)) {
5780 5781
			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
				   status);
5782
			dev->stats.rx_errors++;
L
Linus Torvalds 已提交
5783
			if (status & (RxRWT | RxRUNT))
5784
				dev->stats.rx_length_errors++;
L
Linus Torvalds 已提交
5785
			if (status & RxCRC)
5786
				dev->stats.rx_crc_errors++;
5787 5788
			if (status & (RxRUNT | RxCRC) && !(status & RxRWT) &&
			    dev->features & NETIF_F_RXALL) {
B
Ben Greear 已提交
5789
				goto process_pkt;
5790
			}
L
Linus Torvalds 已提交
5791
		} else {
H
Heiner Kallweit 已提交
5792
			unsigned int pkt_size;
E
Eric Dumazet 已提交
5793
			struct sk_buff *skb;
B
Ben Greear 已提交
5794 5795

process_pkt:
H
Heiner Kallweit 已提交
5796
			pkt_size = status & GENMASK(13, 0);
B
Ben Greear 已提交
5797
			if (likely(!(dev->features & NETIF_F_RXFCS)))
H
Heiner Kallweit 已提交
5798
				pkt_size -= ETH_FCS_LEN;
5799 5800 5801 5802 5803 5804
			/*
			 * The driver does not support incoming fragmented
			 * frames. They are seen as a symptom of over-mtu
			 * sized frames.
			 */
			if (unlikely(rtl8169_fragmented_frame(status))) {
5805 5806
				dev->stats.rx_dropped++;
				dev->stats.rx_length_errors++;
5807
				goto release_descriptor;
5808 5809
			}

H
Heiner Kallweit 已提交
5810 5811 5812 5813 5814 5815
			dma_sync_single_for_cpu(tp_to_dev(tp),
						le64_to_cpu(desc->addr),
						pkt_size, DMA_FROM_DEVICE);

			skb = napi_alloc_skb(&tp->napi, pkt_size);
			if (unlikely(!skb)) {
E
Eric Dumazet 已提交
5816
				dev->stats.rx_dropped++;
5817
				goto release_descriptor;
L
Linus Torvalds 已提交
5818 5819
			}

5820 5821
			prefetch(rx_buf);
			skb_copy_to_linear_data(skb, rx_buf, pkt_size);
H
Heiner Kallweit 已提交
5822 5823 5824
			skb->tail += pkt_size;
			skb->len = pkt_size;

5825 5826 5827 5828
			dma_sync_single_for_device(tp_to_dev(tp),
						   le64_to_cpu(desc->addr),
						   pkt_size, DMA_FROM_DEVICE);

E
Eric Dumazet 已提交
5829
			rtl8169_rx_csum(skb, status);
L
Linus Torvalds 已提交
5830 5831
			skb->protocol = eth_type_trans(skb, dev);

5832 5833
			rtl8169_rx_vlan_tag(desc, skb);

5834 5835 5836
			if (skb->pkt_type == PACKET_MULTICAST)
				dev->stats.multicast++;

5837
			napi_gro_receive(&tp->napi, skb);
L
Linus Torvalds 已提交
5838

J
Junchang Wang 已提交
5839 5840 5841 5842
			u64_stats_update_begin(&tp->rx_stats.syncp);
			tp->rx_stats.packets++;
			tp->rx_stats.bytes += pkt_size;
			u64_stats_update_end(&tp->rx_stats.syncp);
L
Linus Torvalds 已提交
5843
		}
5844 5845
release_descriptor:
		desc->opts2 = 0;
5846
		rtl8169_mark_to_asic(desc);
L
Linus Torvalds 已提交
5847 5848 5849 5850 5851 5852 5853 5854
	}

	count = cur_rx - tp->cur_rx;
	tp->cur_rx = cur_rx;

	return count;
}

F
Francois Romieu 已提交
5855
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
L
Linus Torvalds 已提交
5856
{
5857
	struct rtl8169_private *tp = dev_instance;
H
Heiner Kallweit 已提交
5858
	u16 status = RTL_R16(tp, IntrStatus);
L
Linus Torvalds 已提交
5859

5860
	if (!tp->irq_enabled || status == 0xffff || !(status & tp->irq_mask))
5861
		return IRQ_NONE;
L
Linus Torvalds 已提交
5862

5863 5864 5865 5866
	if (unlikely(status & SYSErr)) {
		rtl8169_pcierr_interrupt(tp->dev);
		goto out;
	}
5867

5868 5869
	if (status & LinkChg)
		phy_mac_interrupt(tp->phydev);
L
Linus Torvalds 已提交
5870

5871 5872 5873 5874 5875
	if (unlikely(status & RxFIFOOver &&
	    tp->mac_version == RTL_GIGA_MAC_VER_11)) {
		netif_stop_queue(tp->dev);
		/* XXX - Hack alert. See rtl_task(). */
		set_bit(RTL_FLAG_TASK_RESET_PENDING, tp->wk.flags);
5876
	}
L
Linus Torvalds 已提交
5877

5878 5879
	rtl_irq_disable(tp);
	napi_schedule_irqoff(&tp->napi);
5880 5881
out:
	rtl_ack_events(tp, status);
L
Linus Torvalds 已提交
5882

5883
	return IRQ_HANDLED;
L
Linus Torvalds 已提交
5884 5885
}

5886 5887
static void rtl_task(struct work_struct *work)
{
5888 5889 5890 5891 5892 5893
	static const struct {
		int bitnr;
		void (*action)(struct rtl8169_private *);
	} rtl_work[] = {
		{ RTL_FLAG_TASK_RESET_PENDING,	rtl_reset_work },
	};
5894 5895
	struct rtl8169_private *tp =
		container_of(work, struct rtl8169_private, wk.work);
5896 5897 5898 5899 5900
	struct net_device *dev = tp->dev;
	int i;

	rtl_lock_work(tp);

5901 5902
	if (!netif_running(dev) ||
	    !test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
5903 5904 5905 5906 5907 5908 5909 5910 5911
		goto out_unlock;

	for (i = 0; i < ARRAY_SIZE(rtl_work); i++) {
		bool pending;

		pending = test_and_clear_bit(rtl_work[i].bitnr, tp->wk.flags);
		if (pending)
			rtl_work[i].action(tp);
	}
5912

5913 5914
out_unlock:
	rtl_unlock_work(tp);
5915 5916
}

5917
static int rtl8169_poll(struct napi_struct *napi, int budget)
L
Linus Torvalds 已提交
5918
{
5919 5920
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
	struct net_device *dev = tp->dev;
5921
	int work_done;
5922

5923
	work_done = rtl_rx(dev, tp, (u32) budget);
5924

5925
	rtl_tx(dev, tp, budget);
L
Linus Torvalds 已提交
5926

5927
	if (work_done < budget) {
5928
		napi_complete_done(napi, work_done);
5929
		rtl_irq_enable(tp);
L
Linus Torvalds 已提交
5930 5931
	}

5932
	return work_done;
L
Linus Torvalds 已提交
5933 5934
}

5935
static void rtl8169_rx_missed(struct net_device *dev)
5936 5937 5938 5939 5940 5941
{
	struct rtl8169_private *tp = netdev_priv(dev);

	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
		return;

5942 5943
	dev->stats.rx_missed_errors += RTL_R32(tp, RxMissed) & 0xffffff;
	RTL_W32(tp, RxMissed, 0);
5944 5945
}

5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957
static void r8169_phylink_handler(struct net_device *ndev)
{
	struct rtl8169_private *tp = netdev_priv(ndev);

	if (netif_carrier_ok(ndev)) {
		rtl_link_chg_patch(tp);
		pm_request_resume(&tp->pci_dev->dev);
	} else {
		pm_runtime_idle(&tp->pci_dev->dev);
	}

	if (net_ratelimit())
5958
		phy_print_status(tp->phydev);
5959 5960 5961 5962
}

static int r8169_phy_connect(struct rtl8169_private *tp)
{
5963
	struct phy_device *phydev = tp->phydev;
5964 5965 5966
	phy_interface_t phy_mode;
	int ret;

5967
	phy_mode = tp->supports_gmii ? PHY_INTERFACE_MODE_GMII :
5968 5969 5970 5971 5972 5973 5974
		   PHY_INTERFACE_MODE_MII;

	ret = phy_connect_direct(tp->dev, phydev, r8169_phylink_handler,
				 phy_mode);
	if (ret)
		return ret;

5975
	if (!tp->supports_gmii)
5976 5977
		phy_set_max_speed(phydev, SPEED_100);

5978
	phy_support_asym_pause(phydev);
5979 5980 5981 5982 5983 5984

	phy_attached_info(phydev);

	return 0;
}

L
Linus Torvalds 已提交
5985 5986 5987 5988
static void rtl8169_down(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

5989
	phy_stop(tp->phydev);
5990

5991
	napi_disable(&tp->napi);
5992
	netif_stop_queue(dev);
L
Linus Torvalds 已提交
5993

5994
	rtl8169_hw_reset(tp);
S
Stanislaw Gruszka 已提交
5995 5996
	/*
	 * At this point device interrupts can not be enabled in any function,
5997 5998
	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task)
	 * and napi is disabled (rtl8169_poll).
S
Stanislaw Gruszka 已提交
5999
	 */
6000
	rtl8169_rx_missed(dev);
L
Linus Torvalds 已提交
6001 6002

	/* Give a racing hard_start_xmit a few cycles to complete. */
6003
	synchronize_rcu();
L
Linus Torvalds 已提交
6004 6005 6006 6007

	rtl8169_tx_clear(tp);

	rtl8169_rx_clear(tp);
F
françois romieu 已提交
6008 6009

	rtl_pll_power_down(tp);
L
Linus Torvalds 已提交
6010 6011 6012 6013 6014 6015 6016
}

static int rtl8169_close(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;

6017 6018
	pm_runtime_get_sync(&pdev->dev);

F
Francois Romieu 已提交
6019
	/* Update counters before going down */
6020
	rtl8169_update_counters(tp);
6021

6022
	rtl_lock_work(tp);
6023 6024
	/* Clear all task flags */
	bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);
6025

L
Linus Torvalds 已提交
6026
	rtl8169_down(dev);
6027
	rtl_unlock_work(tp);
L
Linus Torvalds 已提交
6028

6029 6030
	cancel_work_sync(&tp->wk.work);

6031
	phy_disconnect(tp->phydev);
6032

6033
	pci_free_irq(pdev, 0, tp);
L
Linus Torvalds 已提交
6034

6035 6036 6037 6038
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
			  tp->RxPhyAddr);
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
			  tp->TxPhyAddr);
L
Linus Torvalds 已提交
6039 6040 6041
	tp->TxDescArray = NULL;
	tp->RxDescArray = NULL;

6042 6043
	pm_runtime_put_sync(&pdev->dev);

L
Linus Torvalds 已提交
6044 6045 6046
	return 0;
}

6047 6048 6049 6050 6051
#ifdef CONFIG_NET_POLL_CONTROLLER
static void rtl8169_netpoll(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

V
Ville Syrjälä 已提交
6052
	rtl8169_interrupt(pci_irq_vector(tp->pci_dev, 0), tp);
6053 6054 6055
}
#endif

6056 6057 6058 6059 6060 6061 6062 6063 6064
static int rtl_open(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
	int retval = -ENOMEM;

	pm_runtime_get_sync(&pdev->dev);

	/*
6065
	 * Rx and Tx descriptors needs 256 bytes alignment.
6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077
	 * dma_alloc_coherent provides more.
	 */
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
					     &tp->TxPhyAddr, GFP_KERNEL);
	if (!tp->TxDescArray)
		goto err_pm_runtime_put;

	tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
					     &tp->RxPhyAddr, GFP_KERNEL);
	if (!tp->RxDescArray)
		goto err_free_tx_0;

6078
	retval = rtl8169_init_ring(tp);
6079 6080 6081 6082 6083
	if (retval < 0)
		goto err_free_rx_1;

	rtl_request_firmware(tp);

6084
	retval = pci_request_irq(pdev, 0, rtl8169_interrupt, NULL, tp,
6085
				 dev->name);
6086 6087 6088
	if (retval < 0)
		goto err_release_fw_2;

6089 6090 6091 6092
	retval = r8169_phy_connect(tp);
	if (retval)
		goto err_free_irq;

6093 6094 6095 6096 6097 6098 6099 6100 6101 6102
	rtl_lock_work(tp);

	set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);

	napi_enable(&tp->napi);

	rtl8169_init_phy(dev, tp);

	rtl_pll_power_up(tp);

6103
	rtl_hw_start(tp);
6104

6105
	if (!rtl8169_init_counter_offsets(tp))
6106 6107
		netif_warn(tp, hw, dev, "counter reset/update failed\n");

6108
	phy_start(tp->phydev);
6109 6110 6111 6112
	netif_start_queue(dev);

	rtl_unlock_work(tp);

6113
	pm_runtime_put_sync(&pdev->dev);
6114 6115 6116
out:
	return retval;

6117 6118
err_free_irq:
	pci_free_irq(pdev, 0, tp);
6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134
err_release_fw_2:
	rtl_release_firmware(tp);
	rtl8169_rx_clear(tp);
err_free_rx_1:
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
			  tp->RxPhyAddr);
	tp->RxDescArray = NULL;
err_free_tx_0:
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
			  tp->TxPhyAddr);
	tp->TxDescArray = NULL;
err_pm_runtime_put:
	pm_runtime_put_noidle(&pdev->dev);
	goto out;
}

6135
static void
J
Junchang Wang 已提交
6136
rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
L
Linus Torvalds 已提交
6137 6138
{
	struct rtl8169_private *tp = netdev_priv(dev);
6139
	struct pci_dev *pdev = tp->pci_dev;
6140
	struct rtl8169_counters *counters = tp->counters;
J
Junchang Wang 已提交
6141
	unsigned int start;
L
Linus Torvalds 已提交
6142

6143 6144 6145
	pm_runtime_get_noresume(&pdev->dev);

	if (netif_running(dev) && pm_runtime_active(&pdev->dev))
6146
		rtl8169_rx_missed(dev);
6147

J
Junchang Wang 已提交
6148
	do {
6149
		start = u64_stats_fetch_begin_irq(&tp->rx_stats.syncp);
J
Junchang Wang 已提交
6150 6151
		stats->rx_packets = tp->rx_stats.packets;
		stats->rx_bytes	= tp->rx_stats.bytes;
6152
	} while (u64_stats_fetch_retry_irq(&tp->rx_stats.syncp, start));
J
Junchang Wang 已提交
6153 6154

	do {
6155
		start = u64_stats_fetch_begin_irq(&tp->tx_stats.syncp);
J
Junchang Wang 已提交
6156 6157
		stats->tx_packets = tp->tx_stats.packets;
		stats->tx_bytes	= tp->tx_stats.bytes;
6158
	} while (u64_stats_fetch_retry_irq(&tp->tx_stats.syncp, start));
J
Junchang Wang 已提交
6159 6160 6161 6162 6163 6164 6165 6166

	stats->rx_dropped	= dev->stats.rx_dropped;
	stats->tx_dropped	= dev->stats.tx_dropped;
	stats->rx_length_errors = dev->stats.rx_length_errors;
	stats->rx_errors	= dev->stats.rx_errors;
	stats->rx_crc_errors	= dev->stats.rx_crc_errors;
	stats->rx_fifo_errors	= dev->stats.rx_fifo_errors;
	stats->rx_missed_errors = dev->stats.rx_missed_errors;
6167
	stats->multicast	= dev->stats.multicast;
J
Junchang Wang 已提交
6168

6169
	/*
C
Corentin Musard 已提交
6170
	 * Fetch additional counter values missing in stats collected by driver
6171 6172
	 * from tally counters.
	 */
6173
	if (pm_runtime_active(&pdev->dev))
6174
		rtl8169_update_counters(tp);
6175 6176 6177 6178 6179

	/*
	 * Subtract values fetched during initalization.
	 * See rtl8169_init_counter_offsets for a description why we do that.
	 */
6180
	stats->tx_errors = le64_to_cpu(counters->tx_errors) -
6181
		le64_to_cpu(tp->tc_offset.tx_errors);
6182
	stats->collisions = le32_to_cpu(counters->tx_multi_collision) -
6183
		le32_to_cpu(tp->tc_offset.tx_multi_collision);
6184
	stats->tx_aborted_errors = le16_to_cpu(counters->tx_aborted) -
6185 6186
		le16_to_cpu(tp->tc_offset.tx_aborted);

6187
	pm_runtime_put_noidle(&pdev->dev);
L
Linus Torvalds 已提交
6188 6189
}

6190
static void rtl8169_net_suspend(struct net_device *dev)
6191
{
F
françois romieu 已提交
6192 6193
	struct rtl8169_private *tp = netdev_priv(dev);

6194
	if (!netif_running(dev))
6195
		return;
6196

6197
	phy_stop(tp->phydev);
6198
	netif_device_detach(dev);
6199 6200 6201

	rtl_lock_work(tp);
	napi_disable(&tp->napi);
6202 6203 6204
	/* Clear all task flags */
	bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);

6205 6206 6207
	rtl_unlock_work(tp);

	rtl_pll_power_down(tp);
6208 6209 6210 6211 6212 6213
}

#ifdef CONFIG_PM

static int rtl8169_suspend(struct device *device)
{
6214
	struct net_device *dev = dev_get_drvdata(device);
6215
	struct rtl8169_private *tp = netdev_priv(dev);
6216

6217
	rtl8169_net_suspend(dev);
6218
	clk_disable_unprepare(tp->clk);
6219

6220 6221 6222
	return 0;
}

6223 6224
static void __rtl8169_resume(struct net_device *dev)
{
F
françois romieu 已提交
6225 6226
	struct rtl8169_private *tp = netdev_priv(dev);

6227
	netif_device_attach(dev);
F
françois romieu 已提交
6228 6229

	rtl_pll_power_up(tp);
6230
	rtl8169_init_phy(dev, tp);
F
françois romieu 已提交
6231

6232
	phy_start(tp->phydev);
6233

A
Artem Savkov 已提交
6234 6235
	rtl_lock_work(tp);
	napi_enable(&tp->napi);
6236
	set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
6237
	rtl_reset_work(tp);
A
Artem Savkov 已提交
6238
	rtl_unlock_work(tp);
6239 6240
}

6241
static int rtl8169_resume(struct device *device)
6242
{
6243
	struct net_device *dev = dev_get_drvdata(device);
6244 6245
	struct rtl8169_private *tp = netdev_priv(dev);

6246 6247
	rtl_rar_set(tp, dev->dev_addr);

6248
	clk_prepare_enable(tp->clk);
6249

6250 6251
	if (netif_running(dev))
		__rtl8169_resume(dev);
6252

6253 6254 6255 6256 6257
	return 0;
}

static int rtl8169_runtime_suspend(struct device *device)
{
6258
	struct net_device *dev = dev_get_drvdata(device);
6259 6260
	struct rtl8169_private *tp = netdev_priv(dev);

6261
	if (!tp->TxDescArray)
6262 6263
		return 0;

6264
	rtl_lock_work(tp);
6265
	__rtl8169_set_wol(tp, WAKE_ANY);
6266
	rtl_unlock_work(tp);
6267 6268 6269

	rtl8169_net_suspend(dev);

6270
	/* Update counters before going runtime suspend */
6271
	rtl8169_rx_missed(dev);
6272
	rtl8169_update_counters(tp);
6273

6274 6275 6276 6277 6278
	return 0;
}

static int rtl8169_runtime_resume(struct device *device)
{
6279
	struct net_device *dev = dev_get_drvdata(device);
6280
	struct rtl8169_private *tp = netdev_priv(dev);
6281

6282
	rtl_rar_set(tp, dev->dev_addr);
6283 6284 6285 6286

	if (!tp->TxDescArray)
		return 0;

6287
	rtl_lock_work(tp);
6288
	__rtl8169_set_wol(tp, tp->saved_wolopts);
6289
	rtl_unlock_work(tp);
6290 6291

	__rtl8169_resume(dev);
6292 6293 6294 6295

	return 0;
}

6296 6297
static int rtl8169_runtime_idle(struct device *device)
{
6298
	struct net_device *dev = dev_get_drvdata(device);
6299

6300 6301 6302 6303
	if (!netif_running(dev) || !netif_carrier_ok(dev))
		pm_schedule_suspend(device, 10000);

	return -EBUSY;
6304 6305
}

6306
static const struct dev_pm_ops rtl8169_pm_ops = {
F
Francois Romieu 已提交
6307 6308 6309 6310 6311 6312 6313 6314 6315
	.suspend		= rtl8169_suspend,
	.resume			= rtl8169_resume,
	.freeze			= rtl8169_suspend,
	.thaw			= rtl8169_resume,
	.poweroff		= rtl8169_suspend,
	.restore		= rtl8169_resume,
	.runtime_suspend	= rtl8169_runtime_suspend,
	.runtime_resume		= rtl8169_runtime_resume,
	.runtime_idle		= rtl8169_runtime_idle,
6316 6317 6318 6319 6320 6321 6322 6323 6324 6325
};

#define RTL8169_PM_OPS	(&rtl8169_pm_ops)

#else /* !CONFIG_PM */

#define RTL8169_PM_OPS	NULL

#endif /* !CONFIG_PM */

6326 6327 6328 6329 6330 6331 6332 6333 6334
static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp)
{
	/* WoL fails with 8168b when the receiver is disabled. */
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_11:
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
		pci_clear_master(tp->pci_dev);

6335
		RTL_W8(tp, ChipCmd, CmdRxEnb);
6336
		/* PCI commit */
6337
		RTL_R8(tp, ChipCmd);
6338 6339 6340 6341 6342 6343
		break;
	default:
		break;
	}
}

F
Francois Romieu 已提交
6344 6345
static void rtl_shutdown(struct pci_dev *pdev)
{
6346
	struct net_device *dev = pci_get_drvdata(pdev);
6347
	struct rtl8169_private *tp = netdev_priv(dev);
6348 6349

	rtl8169_net_suspend(dev);
F
Francois Romieu 已提交
6350

F
Francois Romieu 已提交
6351
	/* Restore original MAC address */
6352 6353
	rtl_rar_set(tp, dev->perm_addr);

6354
	rtl8169_hw_reset(tp);
6355

6356
	if (system_state == SYSTEM_POWER_OFF) {
6357
		if (tp->saved_wolopts) {
6358 6359
			rtl_wol_suspend_quirk(tp);
			rtl_wol_shutdown_quirk(tp);
6360 6361
		}

6362 6363 6364 6365
		pci_wake_from_d3(pdev, true);
		pci_set_power_state(pdev, PCI_D3hot);
	}
}
6366

B
Bill Pemberton 已提交
6367
static void rtl_remove_one(struct pci_dev *pdev)
6368 6369 6370 6371
{
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rtl8169_private *tp = netdev_priv(dev);

6372
	if (r8168_check_dash(tp))
6373 6374
		rtl8168_driver_stop(tp);

6375 6376
	netif_napi_del(&tp->napi);

6377
	unregister_netdev(dev);
6378
	mdiobus_unregister(tp->phydev->mdio.bus);
6379 6380 6381 6382 6383 6384 6385 6386 6387 6388

	rtl_release_firmware(tp);

	if (pci_dev_run_wake(pdev))
		pm_runtime_get_noresume(&pdev->dev);

	/* restore original MAC address */
	rtl_rar_set(tp, dev->perm_addr);
}

6389
static const struct net_device_ops rtl_netdev_ops = {
6390
	.ndo_open		= rtl_open,
6391 6392 6393
	.ndo_stop		= rtl8169_close,
	.ndo_get_stats64	= rtl8169_get_stats64,
	.ndo_start_xmit		= rtl8169_start_xmit,
6394
	.ndo_features_check	= rtl8169_features_check,
6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408
	.ndo_tx_timeout		= rtl8169_tx_timeout,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_change_mtu		= rtl8169_change_mtu,
	.ndo_fix_features	= rtl8169_fix_features,
	.ndo_set_features	= rtl8169_set_features,
	.ndo_set_mac_address	= rtl_set_mac_address,
	.ndo_do_ioctl		= rtl8169_ioctl,
	.ndo_set_rx_mode	= rtl_set_rx_mode,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= rtl8169_netpoll,
#endif

};

6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421
static void rtl_set_irq_mask(struct rtl8169_private *tp)
{
	tp->irq_mask = RTL_EVENT_NAPI | LinkChg;

	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		tp->irq_mask |= SYSErr | RxOverflow | RxFIFOOver;
	else if (tp->mac_version == RTL_GIGA_MAC_VER_11)
		/* special workaround needed */
		tp->irq_mask |= RxFIFOOver;
	else
		tp->irq_mask |= RxOverflow;
}

6422
static int rtl_alloc_irq(struct rtl8169_private *tp)
6423
{
6424
	unsigned int flags;
6425

6426 6427
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
6428
		rtl_unlock_config_regs(tp);
6429
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable);
6430
		rtl_lock_config_regs(tp);
6431 6432
		/* fall through */
	case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_24:
6433
		flags = PCI_IRQ_LEGACY;
6434 6435
		break;
	default:
6436
		flags = PCI_IRQ_ALL_TYPES;
6437
		break;
6438
	}
6439 6440

	return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);
6441 6442
}

6443 6444 6445 6446
static void rtl_read_mac_address(struct rtl8169_private *tp,
				 u8 mac_addr[ETH_ALEN])
{
	/* Get MAC address */
6447 6448 6449
	if (rtl_is_8168evl_up(tp) && tp->mac_version != RTL_GIGA_MAC_VER_34) {
		u32 value = rtl_eri_read(tp, 0xe0);

T
Thierry Reding 已提交
6450 6451 6452 6453 6454
		mac_addr[0] = (value >>  0) & 0xff;
		mac_addr[1] = (value >>  8) & 0xff;
		mac_addr[2] = (value >> 16) & 0xff;
		mac_addr[3] = (value >> 24) & 0xff;

6455
		value = rtl_eri_read(tp, 0xe4);
T
Thierry Reding 已提交
6456 6457
		mac_addr[4] = (value >>  0) & 0xff;
		mac_addr[5] = (value >>  8) & 0xff;
6458 6459 6460
	}
}

H
Hayes Wang 已提交
6461 6462
DECLARE_RTL_COND(rtl_link_list_ready_cond)
{
6463
	return RTL_R8(tp, MCU) & LINK_LIST_RDY;
H
Hayes Wang 已提交
6464 6465 6466 6467
}

DECLARE_RTL_COND(rtl_rxtx_empty_cond)
{
6468
	return (RTL_R8(tp, MCU) & RXTX_EMPTY) == RXTX_EMPTY;
H
Hayes Wang 已提交
6469 6470
}

6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507
static int r8169_mdio_read_reg(struct mii_bus *mii_bus, int phyaddr, int phyreg)
{
	struct rtl8169_private *tp = mii_bus->priv;

	if (phyaddr > 0)
		return -ENODEV;

	return rtl_readphy(tp, phyreg);
}

static int r8169_mdio_write_reg(struct mii_bus *mii_bus, int phyaddr,
				int phyreg, u16 val)
{
	struct rtl8169_private *tp = mii_bus->priv;

	if (phyaddr > 0)
		return -ENODEV;

	rtl_writephy(tp, phyreg, val);

	return 0;
}

static int r8169_mdio_register(struct rtl8169_private *tp)
{
	struct pci_dev *pdev = tp->pci_dev;
	struct mii_bus *new_bus;
	int ret;

	new_bus = devm_mdiobus_alloc(&pdev->dev);
	if (!new_bus)
		return -ENOMEM;

	new_bus->name = "r8169";
	new_bus->priv = tp;
	new_bus->parent = &pdev->dev;
	new_bus->irq[0] = PHY_IGNORE_INTERRUPT;
H
Heiner Kallweit 已提交
6508
	snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x", pci_dev_id(pdev));
6509 6510 6511 6512 6513 6514 6515 6516

	new_bus->read = r8169_mdio_read_reg;
	new_bus->write = r8169_mdio_write_reg;

	ret = mdiobus_register(new_bus);
	if (ret)
		return ret;

6517 6518
	tp->phydev = mdiobus_get_phy(new_bus, 0);
	if (!tp->phydev) {
6519 6520 6521 6522
		mdiobus_unregister(new_bus);
		return -ENODEV;
	}

6523
	/* PHY will be woken up in rtl_open() */
6524
	phy_suspend(tp->phydev);
6525 6526 6527 6528

	return 0;
}

B
Bill Pemberton 已提交
6529
static void rtl_hw_init_8168g(struct rtl8169_private *tp)
H
Hayes Wang 已提交
6530 6531 6532
{
	tp->ocp_base = OCP_STD_PHY_BASE;

6533
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | RXDV_GATED_EN);
H
Hayes Wang 已提交
6534 6535 6536 6537 6538 6539 6540

	if (!rtl_udelay_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 42))
		return;

	if (!rtl_udelay_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42))
		return;

6541
	RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) & ~(CmdTxEnb | CmdRxEnb));
H
Hayes Wang 已提交
6542
	msleep(1);
6543
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
H
Hayes Wang 已提交
6544

6545
	r8168_mac_ocp_modify(tp, 0xe8de, BIT(14), 0);
H
Hayes Wang 已提交
6546 6547 6548 6549

	if (!rtl_udelay_loop_wait_high(tp, &rtl_link_list_ready_cond, 100, 42))
		return;

6550
	r8168_mac_ocp_modify(tp, 0xe8de, 0, BIT(15));
H
Hayes Wang 已提交
6551

6552
	rtl_udelay_loop_wait_high(tp, &rtl_link_list_ready_cond, 100, 42);
H
Hayes Wang 已提交
6553 6554
}

B
Bill Pemberton 已提交
6555
static void rtl_hw_initialize(struct rtl8169_private *tp)
H
Hayes Wang 已提交
6556 6557
{
	switch (tp->mac_version) {
6558 6559 6560
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_51:
		rtl8168ep_stop_cmac(tp);
		/* fall through */
6561
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48:
C
Chun-Hao Lin 已提交
6562 6563
		rtl_hw_init_8168g(tp);
		break;
H
Hayes Wang 已提交
6564 6565 6566 6567 6568
	default:
		break;
	}
}

6569 6570 6571 6572 6573 6574 6575 6576
static int rtl_jumbo_max(struct rtl8169_private *tp)
{
	/* Non-GBit versions don't support jumbo frames */
	if (!tp->supports_gmii)
		return JUMBO_1K;

	switch (tp->mac_version) {
	/* RTL8169 */
6577
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591
		return JUMBO_7K;
	/* RTL8168b */
	case RTL_GIGA_MAC_VER_11:
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
		return JUMBO_4K;
	/* RTL8168c */
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_24:
		return JUMBO_6K;
	default:
		return JUMBO_9K;
	}
}

6592 6593 6594 6595 6596
static void rtl_disable_clk(void *data)
{
	clk_disable_unprepare(data);
}

6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622
static int rtl_get_ether_clk(struct rtl8169_private *tp)
{
	struct device *d = tp_to_dev(tp);
	struct clk *clk;
	int rc;

	clk = devm_clk_get(d, "ether_clk");
	if (IS_ERR(clk)) {
		rc = PTR_ERR(clk);
		if (rc == -ENOENT)
			/* clk-core allows NULL (for suspend / resume) */
			rc = 0;
		else if (rc != -EPROBE_DEFER)
			dev_err(d, "failed to get clk: %d\n", rc);
	} else {
		tp->clk = clk;
		rc = clk_prepare_enable(clk);
		if (rc)
			dev_err(d, "failed to enable clk: %d\n", rc);
		else
			rc = devm_add_action_or_reset(d, rtl_disable_clk, clk);
	}

	return rc;
}

6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647
static void rtl_init_mac_address(struct rtl8169_private *tp)
{
	struct net_device *dev = tp->dev;
	u8 *mac_addr = dev->dev_addr;
	int rc, i;

	rc = eth_platform_get_mac_address(tp_to_dev(tp), mac_addr);
	if (!rc)
		goto done;

	rtl_read_mac_address(tp, mac_addr);
	if (is_valid_ether_addr(mac_addr))
		goto done;

	for (i = 0; i < ETH_ALEN; i++)
		mac_addr[i] = RTL_R8(tp, MAC0 + i);
	if (is_valid_ether_addr(mac_addr))
		goto done;

	eth_hw_addr_random(dev);
	dev_warn(tp_to_dev(tp), "can't read MAC address, setting random one\n");
done:
	rtl_rar_set(tp, mac_addr);
}

H
hayeswang 已提交
6648
static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
6649 6650 6651
{
	struct rtl8169_private *tp;
	struct net_device *dev;
6652
	int chipset, region;
6653
	int jumbo_max, rc;
6654

6655 6656 6657
	dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
	if (!dev)
		return -ENOMEM;
6658 6659

	SET_NETDEV_DEV(dev, &pdev->dev);
6660
	dev->netdev_ops = &rtl_netdev_ops;
6661 6662 6663 6664
	tp = netdev_priv(dev);
	tp->dev = dev;
	tp->pci_dev = pdev;
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
6665
	tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1;
6666

6667
	/* Get the *optional* external "ether_clk" used on some boards */
6668 6669 6670
	rc = rtl_get_ether_clk(tp);
	if (rc)
		return rc;
6671

H
Heiner Kallweit 已提交
6672 6673 6674
	/* Disable ASPM completely as that cause random device stop working
	 * problems as well as full system hangs for some PCIe devices users.
	 */
6675 6676 6677
	rc = pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
					  PCIE_LINK_STATE_L1);
	tp->aspm_manageable = !rc;
H
Heiner Kallweit 已提交
6678

6679
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
6680
	rc = pcim_enable_device(pdev);
6681
	if (rc < 0) {
6682
		dev_err(&pdev->dev, "enable failure\n");
6683
		return rc;
6684 6685
	}

6686
	if (pcim_set_mwi(pdev) < 0)
6687
		dev_info(&pdev->dev, "Mem-Wr-Inval unavailable\n");
6688

6689 6690 6691
	/* use first MMIO region */
	region = ffs(pci_select_bars(pdev, IORESOURCE_MEM)) - 1;
	if (region < 0) {
6692
		dev_err(&pdev->dev, "no MMIO resource found\n");
6693
		return -ENODEV;
6694 6695 6696 6697
	}

	/* check for weird/broken PCI region reporting */
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
6698
		dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n");
6699
		return -ENODEV;
6700 6701
	}

6702
	rc = pcim_iomap_regions(pdev, BIT(region), MODULENAME);
6703
	if (rc < 0) {
6704
		dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
6705
		return rc;
6706 6707
	}

6708
	tp->mmio_addr = pcim_iomap_table(pdev)[region];
6709 6710

	/* Identify chip attached to board */
6711 6712 6713
	rtl8169_get_mac_version(tp);
	if (tp->mac_version == RTL_GIGA_MAC_NONE)
		return -ENODEV;
6714

6715
	tp->cp_cmd = RTL_R16(tp, CPlusCmd);
6716

H
Heiner Kallweit 已提交
6717
	if (sizeof(dma_addr_t) > 4 && tp->mac_version >= RTL_GIGA_MAC_VER_18 &&
6718
	    !dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)))
6719 6720
		dev->features |= NETIF_F_HIGHDMA;

6721 6722
	rtl_init_rxcfg(tp);

6723
	rtl8169_irq_mask_and_ack(tp);
6724

H
Hayes Wang 已提交
6725 6726
	rtl_hw_initialize(tp);

6727 6728 6729 6730 6731 6732
	rtl_hw_reset(tp);

	pci_set_master(pdev);

	chipset = tp->mac_version;

6733 6734
	rc = rtl_alloc_irq(tp);
	if (rc < 0) {
6735
		dev_err(&pdev->dev, "Can't allocate interrupt\n");
6736 6737
		return rc;
	}
6738 6739

	mutex_init(&tp->wk.mutex);
6740
	INIT_WORK(&tp->wk.work, rtl_task);
6741 6742
	u64_stats_init(&tp->rx_stats.syncp);
	u64_stats_init(&tp->tx_stats.syncp);
6743

6744
	rtl_init_mac_address(tp);
6745

6746
	dev->ethtool_ops = &rtl8169_ethtool_ops;
6747

6748
	netif_napi_add(dev, &tp->napi, rtl8169_poll, NAPI_POLL_WEIGHT);
6749

H
Heiner Kallweit 已提交
6750 6751 6752
	dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
		NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_TX |
		NETIF_F_HW_VLAN_CTAG_RX;
6753
	dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
6754 6755
		NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_TX |
		NETIF_F_HW_VLAN_CTAG_RX;
6756 6757
	dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
		NETIF_F_HIGHDMA;
H
Heiner Kallweit 已提交
6758
	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
6759

H
hayeswang 已提交
6760 6761 6762 6763 6764 6765
	tp->cp_cmd |= RxChkSum | RxVlan;

	/*
	 * Pretend we are using VLANs; This bypasses a nasty bug where
	 * Interrupts stop flowing on high load on 8110SCd controllers.
	 */
6766
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
H
hayeswang 已提交
6767
		/* Disallow toggling */
6768
		dev->hw_features &= ~NETIF_F_HW_VLAN_CTAG_RX;
6769

6770
	if (rtl_chip_supports_csum_v2(tp)) {
H
hayeswang 已提交
6771
		dev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
H
Heiner Kallweit 已提交
6772
		dev->features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
6773 6774 6775 6776 6777 6778
		dev->gso_max_size = RTL_GSO_MAX_SIZE_V2;
		dev->gso_max_segs = RTL_GSO_MAX_SEGS_V2;
	} else {
		dev->gso_max_size = RTL_GSO_MAX_SIZE_V1;
		dev->gso_max_segs = RTL_GSO_MAX_SEGS_V1;
	}
H
hayeswang 已提交
6779

H
Heiner Kallweit 已提交
6780 6781
	/* RTL8168e-vl has a HW issue with TSO */
	if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
6782 6783 6784
		dev->vlan_features &= ~(NETIF_F_ALL_TSO | NETIF_F_SG);
		dev->hw_features &= ~(NETIF_F_ALL_TSO | NETIF_F_SG);
		dev->features &= ~(NETIF_F_ALL_TSO | NETIF_F_SG);
H
Heiner Kallweit 已提交
6785 6786
	}

6787 6788 6789
	dev->hw_features |= NETIF_F_RXALL;
	dev->hw_features |= NETIF_F_RXFCS;

6790 6791
	/* MTU range: 60 - hw-specific max */
	dev->min_mtu = ETH_ZLEN;
6792 6793
	jumbo_max = rtl_jumbo_max(tp);
	dev->max_mtu = jumbo_max;
6794

6795
	rtl_set_irq_mask(tp);
6796

6797
	tp->fw_name = rtl_chip_infos[chipset].fw_name;
6798

6799 6800 6801
	tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
					    &tp->counters_phys_addr,
					    GFP_KERNEL);
6802 6803
	if (!tp->counters)
		return -ENOMEM;
6804

6805 6806
	pci_set_drvdata(pdev, dev);

6807 6808
	rc = r8169_mdio_register(tp);
	if (rc)
6809
		return rc;
6810

6811 6812 6813
	/* chip gets powered up in rtl_open() */
	rtl_pll_power_down(tp);

6814 6815 6816 6817
	rc = register_netdev(dev);
	if (rc)
		goto err_mdio_unregister;

6818
	netif_info(tp, probe, dev, "%s, %pM, XID %03x, IRQ %d\n",
6819
		   rtl_chip_infos[chipset].name, dev->dev_addr,
6820
		   (RTL_R32(tp, TxConfig) >> 20) & 0xfcf,
6821
		   pci_irq_vector(pdev, 0));
6822 6823 6824 6825 6826 6827

	if (jumbo_max > JUMBO_1K)
		netif_info(tp, probe, dev,
			   "jumbo features [frames: %d bytes, tx checksumming: %s]\n",
			   jumbo_max, tp->mac_version <= RTL_GIGA_MAC_VER_06 ?
			   "ok" : "ko");
6828

6829
	if (r8168_check_dash(tp))
6830 6831
		rtl8168_driver_start(tp);

6832 6833 6834
	if (pci_dev_run_wake(pdev))
		pm_runtime_put_sync(&pdev->dev);

6835
	return 0;
6836 6837

err_mdio_unregister:
6838
	mdiobus_unregister(tp->phydev->mdio.bus);
6839
	return rc;
6840 6841
}

L
Linus Torvalds 已提交
6842 6843 6844
static struct pci_driver rtl8169_pci_driver = {
	.name		= MODULENAME,
	.id_table	= rtl8169_pci_tbl,
6845
	.probe		= rtl_init_one,
B
Bill Pemberton 已提交
6846
	.remove		= rtl_remove_one,
F
Francois Romieu 已提交
6847
	.shutdown	= rtl_shutdown,
6848
	.driver.pm	= RTL8169_PM_OPS,
L
Linus Torvalds 已提交
6849 6850
};

6851
module_pci_driver(rtl8169_pci_driver);