r8169_main.c 139.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
 */

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

H
Heiner Kallweit 已提交
34
#include "r8169.h"
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
#define FIRMWARE_8168H_1	"rtl_nic/rtl8168h-1.fw"
#define FIRMWARE_8168H_2	"rtl_nic/rtl8168h-2.fw"
56
#define FIRMWARE_8168FP_3	"rtl_nic/rtl8168fp-3.fw"
57 58
#define FIRMWARE_8107E_1	"rtl_nic/rtl8107e-1.fw"
#define FIRMWARE_8107E_2	"rtl_nic/rtl8107e-2.fw"
59
#define FIRMWARE_8125A_3	"rtl_nic/rtl8125a-3.fw"
60
#define FIRMWARE_8125B_2	"rtl_nic/rtl8125b-2.fw"
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)
71
#define NUM_TX_DESC	256	/* Number of Tx descriptor registers */
72
#define NUM_RX_DESC	256	/* 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 OCP_STD_PHY_BASE	0xa400

78 79
#define RTL_CFG_NO_GBIT	1

L
Linus Torvalds 已提交
80
/* write/read MMIO register */
81 82 83 84 85 86
#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 已提交
87

88 89 90 91
#define JUMBO_4K	(4 * SZ_1K - VLAN_ETH_HLEN - ETH_FCS_LEN)
#define JUMBO_6K	(6 * SZ_1K - VLAN_ETH_HLEN - ETH_FCS_LEN)
#define JUMBO_7K	(7 * SZ_1K - VLAN_ETH_HLEN - ETH_FCS_LEN)
#define JUMBO_9K	(9 * SZ_1K - VLAN_ETH_HLEN - ETH_FCS_LEN)
F
Francois Romieu 已提交
92

93
static const struct {
L
Linus Torvalds 已提交
94
	const char *name;
95
	const char *fw_name;
96 97
} rtl_chip_infos[] = {
	/* PCI devices. */
98 99 100 101 102
	[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"			},
103
	/* PCI-E devices. */
104 105
	[RTL_GIGA_MAC_VER_07] = {"RTL8102e"				},
	[RTL_GIGA_MAC_VER_08] = {"RTL8102e"				},
106
	[RTL_GIGA_MAC_VER_09] = {"RTL8102e/RTL8103e"			},
107 108 109
	[RTL_GIGA_MAC_VER_10] = {"RTL8101e"				},
	[RTL_GIGA_MAC_VER_11] = {"RTL8168b/8111b"			},
	[RTL_GIGA_MAC_VER_12] = {"RTL8168b/8111b"			},
110
	[RTL_GIGA_MAC_VER_13] = {"RTL8101e/RTL8100e"			},
111
	[RTL_GIGA_MAC_VER_14] = {"RTL8401"				},
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	[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"			},
138 139 140
	[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 },
141 142 143 144 145 146 147
	[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"			},
148
	[RTL_GIGA_MAC_VER_52] = {"RTL8168fp/RTL8117",  FIRMWARE_8168FP_3},
149 150
	[RTL_GIGA_MAC_VER_60] = {"RTL8125A"				},
	[RTL_GIGA_MAC_VER_61] = {"RTL8125A",		FIRMWARE_8125A_3},
151 152
	/* reserve 62 for CFG_METHOD_4 in the vendor driver */
	[RTL_GIGA_MAC_VER_63] = {"RTL8125B",		FIRMWARE_8125B_2},
153 154
};

155
static const struct pci_device_id rtl8169_pci_tbl[] = {
156 157 158 159 160 161 162 163 164
	{ 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 已提交
165
	{ PCI_VENDOR_ID_DLINK,	0x4300,
166
		PCI_VENDOR_ID_DLINK, 0x4b10, 0, 0 },
167 168 169 170 171 172
	{ 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 已提交
173 174
	{ PCI_VDEVICE(REALTEK,	0x8125) },
	{ PCI_VDEVICE(REALTEK,	0x3000) },
H
Heiner Kallweit 已提交
175
	{}
L
Linus Torvalds 已提交
176 177 178 179
};

MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);

F
Francois Romieu 已提交
180 181
enum rtl_registers {
	MAC0		= 0,	/* Ethernet hardware address. */
182
	MAC4		= 4,
F
Francois Romieu 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195
	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 已提交
196

F
Francois Romieu 已提交
197
	TxConfig	= 0x40,
H
Hayes Wang 已提交
198 199
#define	TXCFG_AUTO_FIFO			(1 << 7)	/* 8111e-vl */
#define	TXCFG_EMPTY			(1 << 11)	/* 8111e-vl */
F
Francois Romieu 已提交
200

H
Hayes Wang 已提交
201 202 203 204 205 206
	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)
207
#define	RX_EARLY_OFF			(1 << 11)
H
Hayes Wang 已提交
208 209 210
#define	RXCFG_DMA_SHIFT			8
					/* Unlimited maximum PCI burst. */
#define	RX_DMA_BURST			(7 << RXCFG_DMA_SHIFT)
F
Francois Romieu 已提交
211

F
Francois Romieu 已提交
212 213 214 215
	Cfg9346		= 0x50,
	Config0		= 0x51,
	Config1		= 0x52,
	Config2		= 0x53,
216 217
#define PME_SIGNAL			(1 << 5)	/* 8168c and later */

F
Francois Romieu 已提交
218 219 220 221 222 223 224 225
	Config3		= 0x54,
	Config4		= 0x55,
	Config5		= 0x56,
	PHYAR		= 0x60,
	PHYstatus	= 0x6c,
	RxMaxSize	= 0xda,
	CPlusCmd	= 0xe0,
	IntrMitigate	= 0xe2,
226

227 228 229 230 231
#define RTL_COALESCE_TX_USECS	GENMASK(15, 12)
#define RTL_COALESCE_TX_FRAMES	GENMASK(11, 8)
#define RTL_COALESCE_RX_USECS	GENMASK(7, 4)
#define RTL_COALESCE_RX_FRAMES	GENMASK(3, 0)

232 233
#define RTL_COALESCE_T_MAX	0x0fU
#define RTL_COALESCE_FRAME_MAX	(RTL_COALESCE_T_MAX * 4)
234

F
Francois Romieu 已提交
235 236
	RxDescAddrLow	= 0xe4,
	RxDescAddrHigh	= 0xe8,
237 238 239 240 241 242 243
	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)
244
#define EarlySize	0x27
245

F
Francois Romieu 已提交
246 247 248
	FuncEvent	= 0xf0,
	FuncEventMask	= 0xf4,
	FuncPresetState	= 0xf8,
C
Chun-Hao Lin 已提交
249 250 251 252
	IBCR0           = 0xf8,
	IBCR2           = 0xf9,
	IBIMR0          = 0xfa,
	IBISR0          = 0xfb,
F
Francois Romieu 已提交
253
	FuncForceEvent	= 0xfc,
L
Linus Torvalds 已提交
254 255
};

256 257 258 259 260
enum rtl8168_8101_registers {
	CSIDR			= 0x64,
	CSIAR			= 0x68,
#define	CSIAR_FLAG			0x80000000
#define	CSIAR_WRITE_CMD			0x80000000
261 262
#define	CSIAR_BYTE_ENABLE		0x0000f000
#define	CSIAR_ADDR_MASK			0x00000fff
F
françois romieu 已提交
263
	PMCH			= 0x6f,
264 265 266 267 268 269
	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
270
	DLLPR			= 0xd0,
H
Hayes Wang 已提交
271
#define	PFM_EN				(1 << 6)
272
#define	TX_10M_PS_EN			(1 << 7)
273 274 275
	DBG_REG			= 0xd1,
#define	FIX_NAK_1			(1 << 4)
#define	FIX_NAK_2			(1 << 3)
276 277
	TWSI			= 0xd2,
	MCU			= 0xd3,
H
Hayes Wang 已提交
278
#define	NOW_IS_OOB			(1 << 7)
H
Hayes Wang 已提交
279 280 281
#define	TX_EMPTY			(1 << 5)
#define	RX_EMPTY			(1 << 4)
#define	RXTX_EMPTY			(TX_EMPTY | RX_EMPTY)
282 283
#define	EN_NDP				(1 << 3)
#define	EN_OOB_RESET			(1 << 2)
H
Hayes Wang 已提交
284
#define	LINK_LIST_RDY			(1 << 1)
285 286 287 288 289 290 291
	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
292 293
	MISC_1			= 0xf2,
#define	PFM_D3COLD_EN			(1 << 6)
294 295
};

296
enum rtl8168_registers {
H
Hayes Wang 已提交
297 298
	LED_FREQ		= 0x1a,
	EEE_LED			= 0x1b,
F
françois romieu 已提交
299 300 301 302 303 304 305
	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 已提交
306 307 308
#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 已提交
309
#define ERIAR_OOB			(0x02 << ERIAR_TYPE_SHIFT)
H
Hayes Wang 已提交
310 311 312
#define ERIAR_MASK_SHIFT		12
#define ERIAR_MASK_0001			(0x1 << ERIAR_MASK_SHIFT)
#define ERIAR_MASK_0011			(0x3 << ERIAR_MASK_SHIFT)
313
#define ERIAR_MASK_0100			(0x4 << ERIAR_MASK_SHIFT)
H
Hayes Wang 已提交
314
#define ERIAR_MASK_0101			(0x5 << ERIAR_MASK_SHIFT)
H
Hayes Wang 已提交
315
#define ERIAR_MASK_1111			(0xf << ERIAR_MASK_SHIFT)
316 317 318 319 320 321 322 323 324 325 326
	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 已提交
327
	GPHY_OCP		= 0xb8,
H
hayeswang 已提交
328 329
	RDSAR1			= 0xd0,	/* 8168c only. Undocumented on 8168dp */
	MISC			= 0xf0,	/* 8168e only. */
F
Francois Romieu 已提交
330
#define TXPLA_RST			(1 << 29)
H
Hayes Wang 已提交
331
#define DISABLE_LAN_EN			(1 << 23) /* Enable GPIO pin */
H
Hayes Wang 已提交
332
#define PWM_EN				(1 << 22)
H
Hayes Wang 已提交
333
#define RXDV_GATED_EN			(1 << 19)
H
Hayes Wang 已提交
334
#define EARLY_TALLY_EN			(1 << 16)
335 336
};

H
Heiner Kallweit 已提交
337 338 339 340 341
enum rtl8125_registers {
	IntrMask_8125		= 0x38,
	IntrStatus_8125		= 0x3c,
	TxPoll_8125		= 0x90,
	MAC0_BKP		= 0x19e0,
342
	EEE_TXIDLE_TIMER_8125	= 0x6048,
H
Heiner Kallweit 已提交
343 344 345 346 347 348 349 350
};

#define RX_VLAN_INNER_8125	BIT(22)
#define RX_VLAN_OUTER_8125	BIT(23)
#define RX_VLAN_8125		(RX_VLAN_INNER_8125 | RX_VLAN_OUTER_8125)

#define RX_FETCH_DFLT_8125	(8 << 27)

F
Francois Romieu 已提交
351
enum rtl_register_content {
L
Linus Torvalds 已提交
352
	/* InterruptStatusBits */
F
Francois Romieu 已提交
353 354 355 356 357 358 359 360 361 362 363
	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 已提交
364 365

	/* RxStatusDesc */
366 367 368 369
	RxRWT	= (1 << 22),
	RxRES	= (1 << 21),
	RxRUNT	= (1 << 20),
	RxCRC	= (1 << 19),
L
Linus Torvalds 已提交
370 371

	/* ChipCmdBits */
H
Hayes Wang 已提交
372
	StopReq		= 0x80,
F
Francois Romieu 已提交
373 374 375 376
	CmdReset	= 0x10,
	CmdRxEnb	= 0x08,
	CmdTxEnb	= 0x04,
	RxBufEmpty	= 0x01,
L
Linus Torvalds 已提交
377

378 379 380 381 382
	/* 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 已提交
383
	/* Cfg9346Bits */
F
Francois Romieu 已提交
384 385
	Cfg9346_Lock	= 0x00,
	Cfg9346_Unlock	= 0xc0,
L
Linus Torvalds 已提交
386 387

	/* rx_mode_bits */
F
Francois Romieu 已提交
388 389
	AcceptErr	= 0x20,
	AcceptRunt	= 0x10,
390
#define RX_CONFIG_ACCEPT_ERR_MASK	0x30
F
Francois Romieu 已提交
391 392 393 394
	AcceptBroadcast	= 0x08,
	AcceptMulticast	= 0x04,
	AcceptMyPhys	= 0x02,
	AcceptAllPhys	= 0x01,
395
#define RX_CONFIG_ACCEPT_OK_MASK	0x0f
396
#define RX_CONFIG_ACCEPT_MASK		0x3f
L
Linus Torvalds 已提交
397 398 399 400 401

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

402
	/* Config1 register p.24 */
403 404 405 406 407 408
	LEDS1		= (1 << 7),
	LEDS0		= (1 << 6),
	Speed_down	= (1 << 4),
	MEMMAP		= (1 << 3),
	IOMAP		= (1 << 2),
	VPD		= (1 << 1),
409 410
	PMEnable	= (1 << 0),	/* Power Management Enable */

411
	/* Config2 register p. 25 */
H
hayeswang 已提交
412
	ClkReqEn	= (1 << 7),	/* Clock Request Enable */
413
	MSIEnable	= (1 << 5),	/* 8169 only. Reserved in the 8168. */
414 415 416
	PCI_Clock_66MHz = 0x01,
	PCI_Clock_33MHz = 0x00,

F
Francois Romieu 已提交
417 418 419
	/* 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 已提交
420
	Jumbo_En0	= (1 << 2),	/* 8168 only. Reserved in the 8168b */
H
hayeswang 已提交
421
	Rdy_to_L23	= (1 << 1),	/* L23 Enable */
422
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
F
Francois Romieu 已提交
423

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

427
	/* Config5 register p.27 */
F
Francois Romieu 已提交
428 429 430
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
F
Francois Romieu 已提交
431
	Spi_en		= (1 << 3),
F
Francois Romieu 已提交
432
	LanWake		= (1 << 1),	/* LanWake enable/disable */
433
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
H
hayeswang 已提交
434
	ASPM_en		= (1 << 0),	/* ASPM enable */
435

L
Linus Torvalds 已提交
436
	/* CPlusCmd p.31 */
437 438
	EnableBist	= (1 << 15),	// 8168 8101
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
H
Heiner Kallweit 已提交
439
	EnAnaPLL	= (1 << 14),	// 8169
440 441 442 443 444 445 446 447
	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 已提交
448 449 450 451
	RxVlan		= (1 << 6),
	RxChkSum	= (1 << 5),
	PCIDAC		= (1 << 4),
	PCIMulRW	= (1 << 3),
452
#define INTT_MASK	GENMASK(1, 0)
453
#define CPCMD_MASK	(Normal_mode | RxVlan | RxChkSum | INTT_MASK)
L
Linus Torvalds 已提交
454 455

	/* rtl8169_PHYstatus */
F
Francois Romieu 已提交
456 457 458 459 460 461 462 463
	TBI_Enable	= 0x80,
	TxFlowCtrl	= 0x40,
	RxFlowCtrl	= 0x20,
	_1000bpsF	= 0x10,
	_100bps		= 0x08,
	_10bps		= 0x04,
	LinkStatus	= 0x02,
	FullDup		= 0x01,
L
Linus Torvalds 已提交
464

465 466 467
	/* ResetCounterCommand */
	CounterReset	= 0x1,

468
	/* DumpCounterCommand */
F
Francois Romieu 已提交
469
	CounterDump	= 0x8,
470 471 472

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

F
Francois Romieu 已提交
475 476
enum rtl_desc_bit {
	/* First doubleword. */
L
Linus Torvalds 已提交
477 478 479 480
	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 已提交
481 482 483 484 485 486 487
};

/* 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 已提交
488

F
Francois Romieu 已提交
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
	/* 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 已提交
504 505
	/* First doubleword. */
	TD1_GTSENV4	= (1 << 26),		/* Giant Send for IPv4 */
H
hayeswang 已提交
506
	TD1_GTSENV6	= (1 << 25),		/* Giant Send for IPv6 */
H
hayeswang 已提交
507
#define GTTCPHO_SHIFT			18
508
#define GTTCPHO_MAX			0x7f
H
hayeswang 已提交
509

F
Francois Romieu 已提交
510
	/* Second doubleword. */
H
hayeswang 已提交
511
#define TCPHO_SHIFT			18
512
#define TCPHO_MAX			0x3ff
F
Francois Romieu 已提交
513
#define TD1_MSS_SHIFT			18	/* MSS position (11 bits) */
H
hayeswang 已提交
514 515
	TD1_IPv6_CS	= (1 << 28),		/* Calculate IPv6 checksum */
	TD1_IPv4_CS	= (1 << 29),		/* Calculate IPv4 checksum */
F
Francois Romieu 已提交
516 517 518
	TD1_TCP_CS	= (1 << 30),		/* Calculate TCP/IP checksum */
	TD1_UDP_CS	= (1 << 31),		/* Calculate UDP/IP checksum */
};
L
Linus Torvalds 已提交
519

F
Francois Romieu 已提交
520
enum rtl_rx_desc_bit {
L
Linus Torvalds 已提交
521 522
	/* Rx private */
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
Z
Zhu Yanjun 已提交
523
	PID0		= (1 << 17), /* Protocol ID bit 0/2 */
L
Linus Torvalds 已提交
524 525 526 527 528 529 530 531 532 533 534 535

#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 */
};

536 537 538 539 540
#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 已提交
541
struct TxDesc {
542 543 544
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
545 546 547
};

struct RxDesc {
548 549 550
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
551 552 553 554 555 556 557
};

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

558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
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;
};

574 575 576 577 578
struct rtl8169_tc_offsets {
	bool	inited;
	__le64	tx_errors;
	__le32	tx_multi_collision;
	__le16	tx_aborted;
579
	__le16	rx_missed;
580 581
};

582
enum rtl_flag {
583
	RTL_FLAG_TASK_ENABLED = 0,
584 585 586 587
	RTL_FLAG_TASK_RESET_PENDING,
	RTL_FLAG_MAX
};

L
Linus Torvalds 已提交
588 589
struct rtl8169_private {
	void __iomem *mmio_addr;	/* memory map physical address */
F
Francois Romieu 已提交
590
	struct pci_dev *pci_dev;
D
David Howells 已提交
591
	struct net_device *dev;
592
	struct phy_device *phydev;
593
	struct napi_struct napi;
594
	enum mac_version mac_version;
L
Linus Torvalds 已提交
595 596 597 598 599 600 601
	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;
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
	dma_addr_t TxPhyAddr;
	dma_addr_t RxPhyAddr;
602
	struct page *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
L
Linus Torvalds 已提交
603 604
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
	u16 cp_cmd;
605
	u32 irq_mask;
606
	struct clk *clk;
607

608
	struct {
609
		DECLARE_BITMAP(flags, RTL_FLAG_MAX);
610 611 612
		struct work_struct work;
	} wk;

613
	unsigned supports_gmii:1;
614
	unsigned aspm_manageable:1;
615 616
	dma_addr_t counters_phys_addr;
	struct rtl8169_counters *counters;
617
	struct rtl8169_tc_offsets tc_offset;
618
	u32 saved_wolopts;
619
	int eee_adv;
620

621
	const char *fw_name;
622
	struct rtl_fw *rtl_fw;
H
Hayes Wang 已提交
623 624

	u32 ocp_base;
L
Linus Torvalds 已提交
625 626
};

627 628
typedef void (*rtl_generic_fct)(struct rtl8169_private *tp);

629
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
L
Linus Torvalds 已提交
630
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
631
MODULE_SOFTDEP("pre: realtek");
L
Linus Torvalds 已提交
632
MODULE_LICENSE("GPL");
633 634
MODULE_FIRMWARE(FIRMWARE_8168D_1);
MODULE_FIRMWARE(FIRMWARE_8168D_2);
H
hayeswang 已提交
635 636
MODULE_FIRMWARE(FIRMWARE_8168E_1);
MODULE_FIRMWARE(FIRMWARE_8168E_2);
637
MODULE_FIRMWARE(FIRMWARE_8168E_3);
638
MODULE_FIRMWARE(FIRMWARE_8105E_1);
639 640
MODULE_FIRMWARE(FIRMWARE_8168F_1);
MODULE_FIRMWARE(FIRMWARE_8168F_2);
641
MODULE_FIRMWARE(FIRMWARE_8402_1);
642
MODULE_FIRMWARE(FIRMWARE_8411_1);
H
hayeswang 已提交
643
MODULE_FIRMWARE(FIRMWARE_8411_2);
H
Hayes Wang 已提交
644
MODULE_FIRMWARE(FIRMWARE_8106E_1);
H
hayeswang 已提交
645
MODULE_FIRMWARE(FIRMWARE_8106E_2);
646
MODULE_FIRMWARE(FIRMWARE_8168G_2);
H
hayeswang 已提交
647
MODULE_FIRMWARE(FIRMWARE_8168G_3);
648 649
MODULE_FIRMWARE(FIRMWARE_8168H_1);
MODULE_FIRMWARE(FIRMWARE_8168H_2);
650
MODULE_FIRMWARE(FIRMWARE_8168FP_3);
651 652
MODULE_FIRMWARE(FIRMWARE_8107E_1);
MODULE_FIRMWARE(FIRMWARE_8107E_2);
653
MODULE_FIRMWARE(FIRMWARE_8125A_3);
654
MODULE_FIRMWARE(FIRMWARE_8125B_2);
L
Linus Torvalds 已提交
655

H
Heiner Kallweit 已提交
656 657 658 659 660
static inline struct device *tp_to_dev(struct rtl8169_private *tp)
{
	return &tp->pci_dev->dev;
}

661 662 663 664 665 666 667 668 669 670
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);
}

671 672 673 674 675 676
static void rtl_pci_commit(struct rtl8169_private *tp)
{
	/* Read an arbitrary register to commit a preceding PCI write */
	RTL_R8(tp, ChipCmd);
}

H
Heiner Kallweit 已提交
677 678 679 680 681
static bool rtl_is_8125(struct rtl8169_private *tp)
{
	return tp->mac_version >= RTL_GIGA_MAC_VER_60;
}

682 683 684
static bool rtl_is_8168evl_up(struct rtl8169_private *tp)
{
	return tp->mac_version >= RTL_GIGA_MAC_VER_34 &&
685
	       tp->mac_version != RTL_GIGA_MAC_VER_39 &&
H
Heiner Kallweit 已提交
686
	       tp->mac_version <= RTL_GIGA_MAC_VER_52;
687 688
}

689 690 691 692 693 694 695
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;
}

696 697 698 699 700 701 702 703
static void rtl_read_mac_from_reg(struct rtl8169_private *tp, u8 *mac, int reg)
{
	int i;

	for (i = 0; i < ETH_ALEN; i++)
		mac[i] = RTL_R8(tp, reg + i);
}

704 705 706 707 708 709
struct rtl_cond {
	bool (*check)(struct rtl8169_private *);
	const char *msg;
};

static bool rtl_loop_wait(struct rtl8169_private *tp, const struct rtl_cond *c,
710
			  unsigned long usecs, int n, bool high)
711 712 713 714 715 716
{
	int i;

	for (i = 0; i < n; i++) {
		if (c->check(tp) == high)
			return true;
717
		fsleep(usecs);
718
	}
719 720

	if (net_ratelimit())
721 722
		netdev_err(tp->dev, "%s == %d (loop: %d, delay: %lu).\n",
			   c->msg, !high, n, usecs);
723 724 725
	return false;
}

726 727 728
static bool rtl_loop_wait_high(struct rtl8169_private *tp,
			       const struct rtl_cond *c,
			       unsigned long d, int n)
729
{
730
	return rtl_loop_wait(tp, c, d, n, true);
731 732
}

733 734 735
static bool rtl_loop_wait_low(struct rtl8169_private *tp,
			      const struct rtl_cond *c,
			      unsigned long d, int n)
736
{
737
	return rtl_loop_wait(tp, c, d, n, false);
738 739 740 741 742 743 744 745 746 747 748 749
}

#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)

750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766
static void r8168fp_adjust_ocp_cmd(struct rtl8169_private *tp, u32 *cmd, int type)
{
	/* based on RTL8168FP_OOBMAC_BASE in vendor driver */
	if (tp->mac_version == RTL_GIGA_MAC_VER_52 && type == ERIAR_OOB)
		*cmd |= 0x7f0 << 18;
}

DECLARE_RTL_COND(rtl_eriar_cond)
{
	return RTL_R32(tp, ERIAR) & ERIAR_FLAG;
}

static void _rtl_eri_write(struct rtl8169_private *tp, int addr, u32 mask,
			   u32 val, int type)
{
	u32 cmd = ERIAR_WRITE_CMD | type | mask | addr;

767 768 769
	if (WARN(addr & 3 || !mask, "addr: 0x%x, mask: 0x%08x\n", addr, mask))
		return;

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 807 808 809 810 811 812 813 814 815
	RTL_W32(tp, ERIDR, val);
	r8168fp_adjust_ocp_cmd(tp, &cmd, type);
	RTL_W32(tp, ERIAR, cmd);

	rtl_loop_wait_low(tp, &rtl_eriar_cond, 100, 100);
}

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)
{
	u32 cmd = ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr;

	r8168fp_adjust_ocp_cmd(tp, &cmd, type);
	RTL_W32(tp, ERIAR, cmd);

	return rtl_loop_wait_high(tp, &rtl_eriar_cond, 100, 100) ?
		RTL_R32(tp, ERIDR) : ~0;
}

static u32 rtl_eri_read(struct rtl8169_private *tp, int addr)
{
	return _rtl_eri_read(tp, addr, ERIAR_EXGMAC);
}

static void rtl_w0w1_eri(struct rtl8169_private *tp, int addr, u32 p, u32 m)
{
	u32 val = rtl_eri_read(tp, addr);

	rtl_eri_write(tp, addr, ERIAR_MASK_1111, (val & ~m) | p);
}

static void rtl_eri_set_bits(struct rtl8169_private *tp, int addr, u32 p)
{
	rtl_w0w1_eri(tp, addr, p, 0);
}

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

816
static bool rtl_ocp_reg_failure(u32 reg)
H
Hayes Wang 已提交
817
{
818
	return WARN_ONCE(reg & 0xffff0001, "Invalid ocp reg %x!\n", reg);
H
Hayes Wang 已提交
819 820 821 822
}

DECLARE_RTL_COND(rtl_ocp_gphy_cond)
{
823
	return RTL_R32(tp, GPHY_OCP) & OCPAR_FLAG;
H
Hayes Wang 已提交
824 825 826 827
}

static void r8168_phy_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
{
828
	if (rtl_ocp_reg_failure(reg))
H
Hayes Wang 已提交
829 830
		return;

831
	RTL_W32(tp, GPHY_OCP, OCPAR_FLAG | (reg << 15) | data);
H
Hayes Wang 已提交
832

833
	rtl_loop_wait_low(tp, &rtl_ocp_gphy_cond, 25, 10);
H
Hayes Wang 已提交
834 835
}

836
static int r8168_phy_ocp_read(struct rtl8169_private *tp, u32 reg)
H
Hayes Wang 已提交
837
{
838
	if (rtl_ocp_reg_failure(reg))
H
Hayes Wang 已提交
839 840
		return 0;

841
	RTL_W32(tp, GPHY_OCP, reg << 15);
H
Hayes Wang 已提交
842

843
	return rtl_loop_wait_high(tp, &rtl_ocp_gphy_cond, 25, 10) ?
844
		(RTL_R32(tp, GPHY_OCP) & 0xffff) : -ETIMEDOUT;
H
Hayes Wang 已提交
845 846 847 848
}

static void r8168_mac_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
{
849
	if (rtl_ocp_reg_failure(reg))
H
Hayes Wang 已提交
850 851
		return;

852
	RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
H
Hayes Wang 已提交
853 854 855 856
}

static u16 r8168_mac_ocp_read(struct rtl8169_private *tp, u32 reg)
{
857
	if (rtl_ocp_reg_failure(reg))
H
Hayes Wang 已提交
858 859
		return 0;

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

862
	return RTL_R32(tp, OCPDR);
H
Hayes Wang 已提交
863 864
}

865 866 867 868 869 870 871 872
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);
}

873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891
/* Work around a hw issue with RTL8168g PHY, the quirk disables
 * PHY MCU interrupts before PHY power-down.
 */
static void rtl8168g_phy_suspend_quirk(struct rtl8169_private *tp, int value)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_40:
	case RTL_GIGA_MAC_VER_41:
	case RTL_GIGA_MAC_VER_49:
		if (value & BMCR_RESET || !(value & BMCR_PDOWN))
			rtl_eri_set_bits(tp, 0x1a8, 0xfc000000);
		else
			rtl_eri_clear_bits(tp, 0x1a8, 0xfc000000);
		break;
	default:
		break;
	}
};

H
Hayes Wang 已提交
892 893 894 895 896 897 898 899 900 901
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;

902 903 904
	if (tp->ocp_base == OCP_STD_PHY_BASE && reg == MII_BMCR)
		rtl8168g_phy_suspend_quirk(tp, value);

H
Hayes Wang 已提交
905 906 907 908 909
	r8168_phy_ocp_write(tp, tp->ocp_base + reg * 2, value);
}

static int r8168g_mdio_read(struct rtl8169_private *tp, int reg)
{
910 911 912
	if (reg == 0x1f)
		return tp->ocp_base == OCP_STD_PHY_BASE ? 0 : tp->ocp_base >> 4;

H
Hayes Wang 已提交
913 914 915 916 917 918
	if (tp->ocp_base != OCP_STD_PHY_BASE)
		reg -= 0x10;

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

919 920 921 922 923 924 925 926 927 928 929 930 931 932 933
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);
}

934 935
DECLARE_RTL_COND(rtl_phyar_cond)
{
936
	return RTL_R32(tp, PHYAR) & 0x80000000;
937 938
}

939
static void r8169_mdio_write(struct rtl8169_private *tp, int reg, int value)
L
Linus Torvalds 已提交
940
{
941
	RTL_W32(tp, PHYAR, 0x80000000 | (reg & 0x1f) << 16 | (value & 0xffff));
L
Linus Torvalds 已提交
942

943
	rtl_loop_wait_low(tp, &rtl_phyar_cond, 25, 20);
944
	/*
945 946
	 * According to hardware specs a 20us delay is required after write
	 * complete indication, but before sending next command.
947
	 */
948
	udelay(20);
L
Linus Torvalds 已提交
949 950
}

951
static int r8169_mdio_read(struct rtl8169_private *tp, int reg)
L
Linus Torvalds 已提交
952
{
953
	int value;
L
Linus Torvalds 已提交
954

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

957
	value = rtl_loop_wait_high(tp, &rtl_phyar_cond, 25, 20) ?
958
		RTL_R32(tp, PHYAR) & 0xffff : -ETIMEDOUT;
959

960 961 962 963 964 965
	/*
	 * According to hardware specs a 20us delay is required after read
	 * complete indication, but before sending next command.
	 */
	udelay(20);

L
Linus Torvalds 已提交
966 967 968
	return value;
}

C
Chun-Hao Lin 已提交
969 970
DECLARE_RTL_COND(rtl_ocpar_cond)
{
971
	return RTL_R32(tp, OCPAR) & OCPAR_FLAG;
C
Chun-Hao Lin 已提交
972 973
}

974
static void r8168dp_1_mdio_access(struct rtl8169_private *tp, int reg, u32 data)
975
{
976 977 978
	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);
979

980
	rtl_loop_wait_low(tp, &rtl_ocpar_cond, 1000, 100);
981 982
}

983
static void r8168dp_1_mdio_write(struct rtl8169_private *tp, int reg, int value)
984
{
985 986
	r8168dp_1_mdio_access(tp, reg,
			      OCPDR_WRITE_CMD | (value & OCPDR_DATA_MASK));
987 988
}

989
static int r8168dp_1_mdio_read(struct rtl8169_private *tp, int reg)
990
{
991
	r8168dp_1_mdio_access(tp, reg, OCPDR_READ_CMD);
992 993

	mdelay(1);
994 995
	RTL_W32(tp, OCPAR, OCPAR_GPHY_READ_CMD);
	RTL_W32(tp, EPHY_RXER_NUM, 0);
996

997
	return rtl_loop_wait_high(tp, &rtl_ocpar_cond, 1000, 100) ?
998
		RTL_R32(tp, OCPDR) & OCPDR_DATA_MASK : -ETIMEDOUT;
999 1000
}

F
françois romieu 已提交
1001 1002
#define R8168DP_1_MDIO_ACCESS_BIT	0x00020000

1003
static void r8168dp_2_mdio_start(struct rtl8169_private *tp)
F
françois romieu 已提交
1004
{
1005
	RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) & ~R8168DP_1_MDIO_ACCESS_BIT);
F
françois romieu 已提交
1006 1007
}

1008
static void r8168dp_2_mdio_stop(struct rtl8169_private *tp)
F
françois romieu 已提交
1009
{
1010
	RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) | R8168DP_1_MDIO_ACCESS_BIT);
F
françois romieu 已提交
1011 1012
}

1013
static void r8168dp_2_mdio_write(struct rtl8169_private *tp, int reg, int value)
F
françois romieu 已提交
1014
{
1015
	r8168dp_2_mdio_start(tp);
F
françois romieu 已提交
1016

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

1019
	r8168dp_2_mdio_stop(tp);
F
françois romieu 已提交
1020 1021
}

1022
static int r8168dp_2_mdio_read(struct rtl8169_private *tp, int reg)
F
françois romieu 已提交
1023 1024 1025
{
	int value;

1026 1027 1028 1029
	/* Work around issue with chip reporting wrong PHY ID */
	if (reg == MII_PHYSID2)
		return 0xc912;

1030
	r8168dp_2_mdio_start(tp);
F
françois romieu 已提交
1031

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

1034
	r8168dp_2_mdio_stop(tp);
F
françois romieu 已提交
1035 1036 1037 1038

	return value;
}

1039
static void rtl_writephy(struct rtl8169_private *tp, int location, int val)
1040
{
H
Heiner Kallweit 已提交
1041 1042 1043 1044 1045 1046 1047 1048
	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;
1049
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
H
Heiner Kallweit 已提交
1050 1051 1052 1053 1054 1055
		r8168g_mdio_write(tp, location, val);
		break;
	default:
		r8169_mdio_write(tp, location, val);
		break;
	}
1056 1057
}

1058 1059
static int rtl_readphy(struct rtl8169_private *tp, int location)
{
H
Heiner Kallweit 已提交
1060 1061 1062 1063 1064 1065
	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);
1066
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
H
Heiner Kallweit 已提交
1067 1068 1069 1070
		return r8168g_mdio_read(tp, location);
	default:
		return r8169_mdio_read(tp, location);
	}
1071 1072
}

1073 1074
DECLARE_RTL_COND(rtl_ephyar_cond)
{
1075
	return RTL_R32(tp, EPHYAR) & EPHYAR_FLAG;
1076 1077
}

1078
static void rtl_ephy_write(struct rtl8169_private *tp, int reg_addr, int value)
1079
{
1080
	RTL_W32(tp, EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
1081 1082
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);

1083
	rtl_loop_wait_low(tp, &rtl_ephyar_cond, 10, 100);
1084 1085

	udelay(10);
1086 1087
}

1088
static u16 rtl_ephy_read(struct rtl8169_private *tp, int reg_addr)
1089
{
1090
	RTL_W32(tp, EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
1091

1092
	return rtl_loop_wait_high(tp, &rtl_ephyar_cond, 10, 100) ?
1093
		RTL_R32(tp, EPHYAR) & EPHYAR_DATA_MASK : ~0;
1094 1095
}

1096
static u32 r8168dp_ocp_read(struct rtl8169_private *tp, u16 reg)
C
Chun-Hao Lin 已提交
1097
{
1098
	RTL_W32(tp, OCPAR, 0x0fu << 12 | (reg & 0x0fff));
1099
	return rtl_loop_wait_high(tp, &rtl_ocpar_cond, 100, 20) ?
1100
		RTL_R32(tp, OCPDR) : ~0;
C
Chun-Hao Lin 已提交
1101 1102
}

1103
static u32 r8168ep_ocp_read(struct rtl8169_private *tp, u16 reg)
C
Chun-Hao Lin 已提交
1104
{
1105
	return _rtl_eri_read(tp, reg, ERIAR_OOB);
C
Chun-Hao Lin 已提交
1106 1107 1108 1109 1110
}

static void r8168dp_ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg,
			      u32 data)
{
1111 1112
	RTL_W32(tp, OCPDR, data);
	RTL_W32(tp, OCPAR, OCPAR_FLAG | ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
1113
	rtl_loop_wait_low(tp, &rtl_ocpar_cond, 100, 20);
C
Chun-Hao Lin 已提交
1114 1115 1116 1117 1118
}

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

H
Heiner Kallweit 已提交
1123
static void r8168dp_oob_notify(struct rtl8169_private *tp, u8 cmd)
1124
{
1125
	rtl_eri_write(tp, 0xe8, ERIAR_MASK_0001, cmd);
1126

H
Heiner Kallweit 已提交
1127
	r8168dp_ocp_write(tp, 0x1, 0x30, 0x00000001);
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
}

#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 已提交
1139
DECLARE_RTL_COND(rtl_dp_ocp_read_cond)
1140 1141 1142 1143 1144
{
	u16 reg;

	reg = rtl8168_get_ocp_reg(tp);

1145
	return r8168dp_ocp_read(tp, reg) & 0x00000800;
1146 1147
}

C
Chun-Hao Lin 已提交
1148
DECLARE_RTL_COND(rtl_ep_ocp_read_cond)
1149
{
1150
	return r8168ep_ocp_read(tp, 0x124) & 0x00000001;
C
Chun-Hao Lin 已提交
1151 1152 1153 1154
}

DECLARE_RTL_COND(rtl_ocp_tx_cond)
{
1155
	return RTL_R8(tp, IBISR0) & 0x20;
C
Chun-Hao Lin 已提交
1156
}
1157

C
Chun-Hao Lin 已提交
1158 1159
static void rtl8168ep_stop_cmac(struct rtl8169_private *tp)
{
1160
	RTL_W8(tp, IBCR2, RTL_R8(tp, IBCR2) & ~0x01);
1161
	rtl_loop_wait_high(tp, &rtl_ocp_tx_cond, 50000, 2000);
1162 1163
	RTL_W8(tp, IBISR0, RTL_R8(tp, IBISR0) | 0x20);
	RTL_W8(tp, IBCR0, RTL_R8(tp, IBCR0) & ~0x01);
C
Chun-Hao Lin 已提交
1164 1165
}

C
Chun-Hao Lin 已提交
1166 1167
static void rtl8168dp_driver_start(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1168
	r8168dp_oob_notify(tp, OOB_CMD_DRIVER_START);
1169
	rtl_loop_wait_high(tp, &rtl_dp_ocp_read_cond, 10000, 10);
1170 1171
}

C
Chun-Hao Lin 已提交
1172
static void rtl8168ep_driver_start(struct rtl8169_private *tp)
1173
{
H
Heiner Kallweit 已提交
1174
	r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_START);
1175
	r8168ep_ocp_write(tp, 0x01, 0x30, r8168ep_ocp_read(tp, 0x30) | 0x01);
1176
	rtl_loop_wait_high(tp, &rtl_ep_ocp_read_cond, 10000, 10);
C
Chun-Hao Lin 已提交
1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
}

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;
H
Heiner Kallweit 已提交
1187
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
C
Chun-Hao Lin 已提交
1188 1189 1190 1191 1192 1193 1194
		rtl8168ep_driver_start(tp);
		break;
	default:
		BUG();
		break;
	}
}
1195

C
Chun-Hao Lin 已提交
1196 1197
static void rtl8168dp_driver_stop(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1198
	r8168dp_oob_notify(tp, OOB_CMD_DRIVER_STOP);
1199
	rtl_loop_wait_low(tp, &rtl_dp_ocp_read_cond, 10000, 10);
1200 1201
}

C
Chun-Hao Lin 已提交
1202 1203
static void rtl8168ep_driver_stop(struct rtl8169_private *tp)
{
C
Chun-Hao Lin 已提交
1204
	rtl8168ep_stop_cmac(tp);
H
Heiner Kallweit 已提交
1205
	r8168ep_ocp_write(tp, 0x01, 0x180, OOB_CMD_DRIVER_STOP);
1206
	r8168ep_ocp_write(tp, 0x01, 0x30, r8168ep_ocp_read(tp, 0x30) | 0x01);
1207
	rtl_loop_wait_low(tp, &rtl_ep_ocp_read_cond, 10000, 10);
C
Chun-Hao Lin 已提交
1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
}

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;
H
Heiner Kallweit 已提交
1218
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
C
Chun-Hao Lin 已提交
1219 1220 1221 1222 1223 1224 1225 1226
		rtl8168ep_driver_stop(tp);
		break;
	default:
		BUG();
		break;
	}
}

1227
static bool r8168dp_check_dash(struct rtl8169_private *tp)
1228 1229 1230
{
	u16 reg = rtl8168_get_ocp_reg(tp);

1231
	return !!(r8168dp_ocp_read(tp, reg) & 0x00008000);
1232 1233
}

1234
static bool r8168ep_check_dash(struct rtl8169_private *tp)
C
Chun-Hao Lin 已提交
1235
{
1236
	return r8168ep_ocp_read(tp, 0x128) & 0x00000001;
C
Chun-Hao Lin 已提交
1237 1238
}

1239
static bool r8168_check_dash(struct rtl8169_private *tp)
C
Chun-Hao Lin 已提交
1240 1241 1242 1243 1244 1245
{
	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);
H
Heiner Kallweit 已提交
1246
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
C
Chun-Hao Lin 已提交
1247 1248
		return r8168ep_check_dash(tp);
	default:
1249
		return false;
C
Chun-Hao Lin 已提交
1250 1251 1252
	}
}

1253 1254
static void rtl_reset_packet_filter(struct rtl8169_private *tp)
{
1255 1256
	rtl_eri_clear_bits(tp, 0xdc, BIT(0));
	rtl_eri_set_bits(tp, 0xdc, BIT(0));
1257 1258
}

1259 1260
DECLARE_RTL_COND(rtl_efusear_cond)
{
1261
	return RTL_R32(tp, EFUSEAR) & EFUSEAR_FLAG;
1262 1263
}

H
Heiner Kallweit 已提交
1264
u8 rtl8168d_efuse_read(struct rtl8169_private *tp, int reg_addr)
1265
{
1266
	RTL_W32(tp, EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
1267

1268
	return rtl_loop_wait_high(tp, &rtl_efusear_cond, 100, 300) ?
1269
		RTL_R32(tp, EFUSEAR) & EFUSEAR_DATA_MASK : ~0;
1270 1271
}

1272 1273
static u32 rtl_get_events(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1274 1275 1276 1277
	if (rtl_is_8125(tp))
		return RTL_R32(tp, IntrStatus_8125);
	else
		return RTL_R16(tp, IntrStatus);
1278 1279 1280
}

static void rtl_ack_events(struct rtl8169_private *tp, u32 bits)
F
Francois Romieu 已提交
1281
{
H
Heiner Kallweit 已提交
1282 1283 1284 1285
	if (rtl_is_8125(tp))
		RTL_W32(tp, IntrStatus_8125, bits);
	else
		RTL_W16(tp, IntrStatus, bits);
F
Francois Romieu 已提交
1286 1287 1288 1289
}

static void rtl_irq_disable(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1290 1291 1292 1293
	if (rtl_is_8125(tp))
		RTL_W32(tp, IntrMask_8125, 0);
	else
		RTL_W16(tp, IntrMask, 0);
1294 1295
}

1296
static void rtl_irq_enable(struct rtl8169_private *tp)
1297
{
H
Heiner Kallweit 已提交
1298 1299 1300 1301
	if (rtl_is_8125(tp))
		RTL_W32(tp, IntrMask_8125, tp->irq_mask);
	else
		RTL_W16(tp, IntrMask, tp->irq_mask);
1302 1303
}

F
françois romieu 已提交
1304
static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1305
{
F
Francois Romieu 已提交
1306
	rtl_irq_disable(tp);
1307
	rtl_ack_events(tp, 0xffffffff);
1308
	rtl_pci_commit(tp);
L
Linus Torvalds 已提交
1309 1310
}

H
Hayes Wang 已提交
1311 1312
static void rtl_link_chg_patch(struct rtl8169_private *tp)
{
1313
	struct phy_device *phydev = tp->phydev;
H
Hayes Wang 已提交
1314

1315 1316
	if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_38) {
1317
		if (phydev->speed == SPEED_1000) {
1318 1319
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
1320
		} else if (phydev->speed == SPEED_100) {
1321 1322
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
H
Hayes Wang 已提交
1323
		} else {
1324 1325
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x0000003f);
H
Hayes Wang 已提交
1326
		}
1327
		rtl_reset_packet_filter(tp);
1328 1329
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
		   tp->mac_version == RTL_GIGA_MAC_VER_36) {
1330
		if (phydev->speed == SPEED_1000) {
1331 1332
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
1333
		} else {
1334 1335
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x0000003f);
1336
		}
1337
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_37) {
1338
		if (phydev->speed == SPEED_10) {
1339 1340
			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x4d02);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_0011, 0x0060a);
1341
		} else {
1342
			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000);
1343
		}
H
Hayes Wang 已提交
1344 1345 1346
	}
}

1347 1348 1349
#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 已提交
1350 1351
{
	struct rtl8169_private *tp = netdev_priv(dev);
1352 1353

	wol->supported = WAKE_ANY;
1354
	wol->wolopts = tp->saved_wolopts;
1355 1356 1357 1358
}

static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
{
1359
	static const struct {
F
Francois Romieu 已提交
1360 1361 1362 1363 1364 1365 1366 1367
		u32 opt;
		u16 reg;
		u8  mask;
	} cfg[] = {
		{ WAKE_PHY,   Config3, LinkUp },
		{ WAKE_UCAST, Config5, UWF },
		{ WAKE_BCAST, Config5, BWF },
		{ WAKE_MCAST, Config5, MWF },
1368 1369
		{ WAKE_ANY,   Config5, LanWake },
		{ WAKE_MAGIC, Config3, MagicPacket }
F
Francois Romieu 已提交
1370
	};
H
Heiner Kallweit 已提交
1371
	unsigned int i, tmp = ARRAY_SIZE(cfg);
1372
	u8 options;
F
Francois Romieu 已提交
1373

1374
	rtl_unlock_config_regs(tp);
F
Francois Romieu 已提交
1375

1376
	if (rtl_is_8168evl_up(tp)) {
H
Heiner Kallweit 已提交
1377
		tmp--;
1378
		if (wolopts & WAKE_MAGIC)
1379
			rtl_eri_set_bits(tp, 0x0dc, MagicPacket_v2);
1380
		else
1381
			rtl_eri_clear_bits(tp, 0x0dc, MagicPacket_v2);
H
Heiner Kallweit 已提交
1382 1383 1384 1385 1386 1387
	} else if (rtl_is_8125(tp)) {
		tmp--;
		if (wolopts & WAKE_MAGIC)
			r8168_mac_ocp_modify(tp, 0xc0b6, 0, BIT(0));
		else
			r8168_mac_ocp_modify(tp, 0xc0b6, BIT(0), 0);
1388 1389 1390
	}

	for (i = 0; i < tmp; i++) {
1391
		options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
1392
		if (wolopts & cfg[i].opt)
F
Francois Romieu 已提交
1393
			options |= cfg[i].mask;
1394
		RTL_W8(tp, cfg[i].reg, options);
F
Francois Romieu 已提交
1395 1396
	}

1397
	switch (tp->mac_version) {
1398
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
1399
		options = RTL_R8(tp, Config1) & ~PMEnable;
1400 1401
		if (wolopts)
			options |= PMEnable;
1402
		RTL_W8(tp, Config1, options);
1403
		break;
1404 1405
	case RTL_GIGA_MAC_VER_34:
	case RTL_GIGA_MAC_VER_37:
1406
	case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63:
1407
		options = RTL_R8(tp, Config2) & ~PME_SIGNAL;
1408 1409
		if (wolopts)
			options |= PME_SIGNAL;
1410
		RTL_W8(tp, Config2, options);
1411
		break;
1412 1413
	default:
		break;
1414 1415
	}

1416
	rtl_lock_config_regs(tp);
1417 1418

	device_set_wakeup_enable(tp_to_dev(tp), wolopts);
1419
	tp->dev->wol_enabled = wolopts ? 1 : 0;
1420 1421 1422 1423 1424
}

static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1425

1426 1427 1428 1429
	if (wol->wolopts & ~WAKE_ANY)
		return -EINVAL;

	tp->saved_wolopts = wol->wolopts;
1430
	__rtl8169_set_wol(tp, tp->saved_wolopts);
1431

F
Francois Romieu 已提交
1432 1433 1434
	return 0;
}

L
Linus Torvalds 已提交
1435 1436 1437 1438
static void rtl8169_get_drvinfo(struct net_device *dev,
				struct ethtool_drvinfo *info)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1439
	struct rtl_fw *rtl_fw = tp->rtl_fw;
L
Linus Torvalds 已提交
1440

1441 1442
	strlcpy(info->driver, MODULENAME, sizeof(info->driver));
	strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
1443
	BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
1444
	if (rtl_fw)
1445 1446
		strlcpy(info->fw_version, rtl_fw->version,
			sizeof(info->fw_version));
L
Linus Torvalds 已提交
1447 1448 1449 1450 1451 1452 1453
}

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

1454 1455
static netdev_features_t rtl8169_fix_features(struct net_device *dev,
	netdev_features_t features)
L
Linus Torvalds 已提交
1456
{
F
Francois Romieu 已提交
1457 1458
	struct rtl8169_private *tp = netdev_priv(dev);

F
Francois Romieu 已提交
1459
	if (dev->mtu > TD_MSS_MAX)
1460
		features &= ~NETIF_F_ALL_TSO;
L
Linus Torvalds 已提交
1461

1462
	if (dev->mtu > ETH_DATA_LEN &&
1463
	    tp->mac_version > RTL_GIGA_MAC_VER_06)
1464
		features &= ~(NETIF_F_CSUM_MASK | NETIF_F_ALL_TSO);
F
Francois Romieu 已提交
1465

1466
	return features;
L
Linus Torvalds 已提交
1467 1468
}

1469 1470
static void rtl_set_rx_config_features(struct rtl8169_private *tp,
				       netdev_features_t features)
L
Linus Torvalds 已提交
1471
{
1472
	u32 rx_config = RTL_R32(tp, RxConfig);
1473

H
hayeswang 已提交
1474
	if (features & NETIF_F_RXALL)
1475
		rx_config |= RX_CONFIG_ACCEPT_ERR_MASK;
H
hayeswang 已提交
1476
	else
1477
		rx_config &= ~RX_CONFIG_ACCEPT_ERR_MASK;
L
Linus Torvalds 已提交
1478

H
Heiner Kallweit 已提交
1479 1480 1481 1482 1483 1484 1485
	if (rtl_is_8125(tp)) {
		if (features & NETIF_F_HW_VLAN_CTAG_RX)
			rx_config |= RX_VLAN_8125;
		else
			rx_config &= ~RX_VLAN_8125;
	}

1486
	RTL_W32(tp, RxConfig, rx_config);
1487 1488 1489 1490 1491 1492 1493 1494
}

static int rtl8169_set_features(struct net_device *dev,
				netdev_features_t features)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl_set_rx_config_features(tp, features);
1495

H
hayeswang 已提交
1496 1497 1498 1499
	if (features & NETIF_F_RXCSUM)
		tp->cp_cmd |= RxChkSum;
	else
		tp->cp_cmd &= ~RxChkSum;
B
Ben Greear 已提交
1500

H
Heiner Kallweit 已提交
1501 1502 1503 1504 1505 1506
	if (!rtl_is_8125(tp)) {
		if (features & NETIF_F_HW_VLAN_CTAG_RX)
			tp->cp_cmd |= RxVlan;
		else
			tp->cp_cmd &= ~RxVlan;
	}
H
hayeswang 已提交
1507

1508
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
1509
	rtl_pci_commit(tp);
L
Linus Torvalds 已提交
1510 1511 1512 1513

	return 0;
}

1514
static inline u32 rtl8169_tx_vlan_tag(struct sk_buff *skb)
L
Linus Torvalds 已提交
1515
{
1516
	return (skb_vlan_tag_present(skb)) ?
1517
		TxVlanTag | swab16(skb_vlan_tag_get(skb)) : 0x00;
L
Linus Torvalds 已提交
1518 1519
}

1520
static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
L
Linus Torvalds 已提交
1521 1522 1523
{
	u32 opts2 = le32_to_cpu(desc->opts2);

1524
	if (opts2 & RxVlanTag)
1525
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
L
Linus Torvalds 已提交
1526 1527 1528 1529 1530
}

static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
			     void *p)
{
1531
	struct rtl8169_private *tp = netdev_priv(dev);
P
Peter Wu 已提交
1532 1533 1534
	u32 __iomem *data = tp->mmio_addr;
	u32 *dw = p;
	int i;
L
Linus Torvalds 已提交
1535

P
Peter Wu 已提交
1536 1537
	for (i = 0; i < R8169_REGS_SIZE; i += 4)
		memcpy_fromio(dw++, data++, 4);
L
Linus Torvalds 已提交
1538 1539
}

1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555
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",
};

1556
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
1557
{
1558 1559 1560 1561 1562 1563
	switch (sset) {
	case ETH_SS_STATS:
		return ARRAY_SIZE(rtl8169_gstrings);
	default:
		return -EOPNOTSUPP;
	}
1564 1565
}

1566
DECLARE_RTL_COND(rtl_counters_cond)
1567
{
1568
	return RTL_R32(tp, CounterAddrLow) & (CounterReset | CounterDump);
1569 1570
}

1571
static void rtl8169_do_counters(struct rtl8169_private *tp, u32 counter_cmd)
1572
{
1573 1574
	dma_addr_t paddr = tp->counters_phys_addr;
	u32 cmd;
1575

1576
	RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
1577
	rtl_pci_commit(tp);
1578
	cmd = (u64)paddr & DMA_BIT_MASK(32);
1579 1580
	RTL_W32(tp, CounterAddrLow, cmd);
	RTL_W32(tp, CounterAddrLow, cmd | counter_cmd);
1581

1582
	rtl_loop_wait_low(tp, &rtl_counters_cond, 10, 1000);
1583 1584
}

1585
static void rtl8169_update_counters(struct rtl8169_private *tp)
1586
{
1587 1588
	u8 val = RTL_R8(tp, ChipCmd);

1589 1590
	/*
	 * Some chips are unable to dump tally counters when the receiver
1591
	 * is disabled. If 0xff chip may be in a PCI power-save state.
1592
	 */
1593 1594
	if (val & CmdRxEnb && val != 0xff)
		rtl8169_do_counters(tp, CounterDump);
1595 1596
}

1597
static void rtl8169_init_counter_offsets(struct rtl8169_private *tp)
1598
{
1599
	struct rtl8169_counters *counters = tp->counters;
1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616

	/*
	 * 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)
1617
		return;
1618

1619 1620 1621 1622 1623 1624 1625 1626 1627
	if (tp->mac_version >= RTL_GIGA_MAC_VER_19) {
		rtl8169_do_counters(tp, CounterReset);
	} else {
		rtl8169_update_counters(tp);
		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;
		tp->tc_offset.rx_missed = counters->rx_missed;
	}
1628 1629

	tp->tc_offset.inited = true;
1630 1631
}

1632 1633 1634 1635
static void rtl8169_get_ethtool_stats(struct net_device *dev,
				      struct ethtool_stats *stats, u64 *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1636
	struct rtl8169_counters *counters;
1637

1638 1639
	counters = tp->counters;
	rtl8169_update_counters(tp);
1640

1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653
	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);
1654 1655
}

1656 1657 1658 1659 1660 1661 1662 1663 1664
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;
	}
}

1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695
/*
 * 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 all CPlusCmd[0:1] cases */
struct rtl_coalesce_info {
	u32 speed;
1696
	u32 scale_nsecs[4];
1697 1698
};

1699 1700 1701
/* produce array with base delay *1, *8, *8*2, *8*2*2 */
#define COALESCE_DELAY(d) { (d), 8 * (d), 16 * (d), 32 * (d) }

1702
static const struct rtl_coalesce_info rtl_coalesce_info_8169[] = {
1703
	{ SPEED_1000,	COALESCE_DELAY(320) },
1704 1705
	{ SPEED_100,	COALESCE_DELAY(2560) },
	{ SPEED_10,	COALESCE_DELAY(40960) },
1706 1707 1708 1709
	{ 0 },
};

static const struct rtl_coalesce_info rtl_coalesce_info_8168_8136[] = {
1710
	{ SPEED_1000,	COALESCE_DELAY(5000) },
1711 1712
	{ SPEED_100,	COALESCE_DELAY(2560) },
	{ SPEED_10,	COALESCE_DELAY(40960) },
1713 1714
	{ 0 },
};
1715
#undef COALESCE_DELAY
1716 1717

/* get rx/tx scale vector corresponding to current speed */
1718 1719
static const struct rtl_coalesce_info *
rtl_coalesce_info(struct rtl8169_private *tp)
1720 1721 1722
{
	const struct rtl_coalesce_info *ci;

1723 1724 1725 1726
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		ci = rtl_coalesce_info_8169;
	else
		ci = rtl_coalesce_info_8168_8136;
1727

1728 1729 1730 1731
	/* if speed is unknown assume highest one */
	if (tp->phydev->speed == SPEED_UNKNOWN)
		return ci;

1732 1733
	for (; ci->speed; ci++) {
		if (tp->phydev->speed == ci->speed)
1734 1735 1736 1737 1738 1739 1740 1741 1742 1743
			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;
1744 1745
	u32 scale, c_us, c_fr;
	u16 intrmit;
1746

H
Heiner Kallweit 已提交
1747 1748 1749
	if (rtl_is_8125(tp))
		return -EOPNOTSUPP;

1750 1751 1752
	memset(ec, 0, sizeof(*ec));

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

1757
	scale = ci->scale_nsecs[tp->cp_cmd & INTT_MASK];
1758

1759
	intrmit = RTL_R16(tp, IntrMitigate);
1760

1761 1762
	c_us = FIELD_GET(RTL_COALESCE_TX_USECS, intrmit);
	ec->tx_coalesce_usecs = DIV_ROUND_UP(c_us * scale, 1000);
1763

1764 1765 1766 1767 1768 1769 1770 1771 1772
	c_fr = FIELD_GET(RTL_COALESCE_TX_FRAMES, intrmit);
	/* ethtool_coalesce states usecs and max_frames must not both be 0 */
	ec->tx_max_coalesced_frames = (c_us || c_fr) ? c_fr * 4 : 1;

	c_us = FIELD_GET(RTL_COALESCE_RX_USECS, intrmit);
	ec->rx_coalesce_usecs = DIV_ROUND_UP(c_us * scale, 1000);

	c_fr = FIELD_GET(RTL_COALESCE_RX_FRAMES, intrmit);
	ec->rx_max_coalesced_frames = (c_us || c_fr) ? c_fr * 4 : 1;
1773 1774 1775 1776

	return 0;
}

1777 1778
/* choose appropriate scale factor and CPlusCmd[0:1] for (speed, usec) */
static int rtl_coalesce_choose_scale(struct rtl8169_private *tp, u32 usec,
1779
				     u16 *cp01)
1780 1781 1782 1783
{
	const struct rtl_coalesce_info *ci;
	u16 i;

1784
	ci = rtl_coalesce_info(tp);
1785
	if (IS_ERR(ci))
1786
		return PTR_ERR(ci);
1787 1788

	for (i = 0; i < 4; i++) {
1789
		if (usec <= ci->scale_nsecs[i] * RTL_COALESCE_T_MAX / 1000U) {
1790
			*cp01 = i;
1791
			return ci->scale_nsecs[i];
1792 1793 1794
		}
	}

1795
	return -ERANGE;
1796 1797 1798 1799 1800
}

static int rtl_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1801 1802 1803
	u32 tx_fr = ec->tx_max_coalesced_frames;
	u32 rx_fr = ec->rx_max_coalesced_frames;
	u32 coal_usec_max, units;
1804
	u16 w = 0, cp01 = 0;
1805
	int scale;
1806

H
Heiner Kallweit 已提交
1807 1808 1809
	if (rtl_is_8125(tp))
		return -EOPNOTSUPP;

1810 1811 1812
	if (rx_fr > RTL_COALESCE_FRAME_MAX || tx_fr > RTL_COALESCE_FRAME_MAX)
		return -ERANGE;

1813 1814
	coal_usec_max = max(ec->rx_coalesce_usecs, ec->tx_coalesce_usecs);
	scale = rtl_coalesce_choose_scale(tp, coal_usec_max, &cp01);
1815 1816
	if (scale < 0)
		return scale;
1817

1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831
	/* 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 want to ignore rx_frames then it has to be set to 0.
	 */
	if (rx_fr == 1)
		rx_fr = 0;
	if (tx_fr == 1)
		tx_fr = 0;
1832

1833 1834 1835 1836 1837
	/* HW requires time limit to be set if frame limit is set */
	if ((tx_fr && !ec->tx_coalesce_usecs) ||
	    (rx_fr && !ec->rx_coalesce_usecs))
		return -EINVAL;

1838 1839
	w |= FIELD_PREP(RTL_COALESCE_TX_FRAMES, DIV_ROUND_UP(tx_fr, 4));
	w |= FIELD_PREP(RTL_COALESCE_RX_FRAMES, DIV_ROUND_UP(rx_fr, 4));
1840

1841 1842 1843 1844
	units = DIV_ROUND_UP(ec->tx_coalesce_usecs * 1000U, scale);
	w |= FIELD_PREP(RTL_COALESCE_TX_USECS, units);
	units = DIV_ROUND_UP(ec->rx_coalesce_usecs * 1000U, scale);
	w |= FIELD_PREP(RTL_COALESCE_RX_USECS, units);
1845

1846
	RTL_W16(tp, IntrMitigate, w);
1847

1848 1849 1850 1851 1852 1853 1854 1855 1856
	/* Meaning of PktCntrDisable bit changed from RTL8168e-vl */
	if (rtl_is_8168evl_up(tp)) {
		if (!rx_fr && !tx_fr)
			/* disable packet counter */
			tp->cp_cmd |= PktCntrDisable;
		else
			tp->cp_cmd &= ~PktCntrDisable;
	}

1857
	tp->cp_cmd = (tp->cp_cmd & ~INTT_MASK) | cp01;
1858
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
1859
	rtl_pci_commit(tp);
1860 1861 1862 1863

	return 0;
}

1864 1865 1866 1867
static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);

1868 1869 1870
	if (!rtl_supports_eee(tp))
		return -EOPNOTSUPP;

1871
	return phy_ethtool_get_eee(tp->phydev, data);
1872 1873 1874 1875 1876
}

static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1877 1878 1879 1880
	int ret;

	if (!rtl_supports_eee(tp))
		return -EOPNOTSUPP;
1881

1882
	ret = phy_ethtool_set_eee(tp->phydev, data);
1883 1884 1885 1886

	if (!ret)
		tp->eee_adv = phy_read_mmd(dev->phydev, MDIO_MMD_AN,
					   MDIO_AN_EEE_ADV);
1887
	return ret;
1888 1889
}

1890
static const struct ethtool_ops rtl8169_ethtool_ops = {
1891 1892
	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
				     ETHTOOL_COALESCE_MAX_FRAMES,
L
Linus Torvalds 已提交
1893 1894 1895
	.get_drvinfo		= rtl8169_get_drvinfo,
	.get_regs_len		= rtl8169_get_regs_len,
	.get_link		= ethtool_op_get_link,
1896 1897
	.get_coalesce		= rtl_get_coalesce,
	.set_coalesce		= rtl_set_coalesce,
L
Linus Torvalds 已提交
1898
	.get_regs		= rtl8169_get_regs,
F
Francois Romieu 已提交
1899 1900
	.get_wol		= rtl8169_get_wol,
	.set_wol		= rtl8169_set_wol,
1901
	.get_strings		= rtl8169_get_strings,
1902
	.get_sset_count		= rtl8169_get_sset_count,
1903
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
1904
	.get_ts_info		= ethtool_op_get_ts_info,
1905
	.nway_reset		= phy_ethtool_nway_reset,
1906 1907
	.get_eee		= rtl8169_get_eee,
	.set_eee		= rtl8169_set_eee,
1908 1909
	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
L
Linus Torvalds 已提交
1910 1911
};

1912 1913
static void rtl_enable_eee(struct rtl8169_private *tp)
{
1914
	struct phy_device *phydev = tp->phydev;
1915 1916 1917 1918 1919 1920 1921
	int adv;

	/* respect EEE advertisement the user may have set */
	if (tp->eee_adv >= 0)
		adv = tp->eee_adv;
	else
		adv = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
1922

1923 1924
	if (adv >= 0)
		phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
1925 1926
}

1927
static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
L
Linus Torvalds 已提交
1928
{
1929 1930 1931 1932 1933
	/*
	 * The driver currently handles the 8168Bf and the 8168Be identically
	 * but they can be identified more specifically through the test below
	 * if needed:
	 *
1934
	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
F
Francois Romieu 已提交
1935 1936 1937
	 *
	 * Same thing for the 8101Eb and the 8101Ec:
	 *
1938
	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
1939
	 */
1940
	static const struct rtl_mac_info {
1941 1942
		u16 mask;
		u16 val;
1943
		enum mac_version ver;
L
Linus Torvalds 已提交
1944
	} mac_info[] = {
1945 1946 1947 1948
		/* 8125B family. */
		{ 0x7cf, 0x641,	RTL_GIGA_MAC_VER_63 },

		/* 8125A family. */
H
Heiner Kallweit 已提交
1949 1950 1951
		{ 0x7cf, 0x608,	RTL_GIGA_MAC_VER_60 },
		{ 0x7c8, 0x608,	RTL_GIGA_MAC_VER_61 },

H
Heiner Kallweit 已提交
1952 1953 1954
		/* RTL8117 */
		{ 0x7cf, 0x54a,	RTL_GIGA_MAC_VER_52 },

C
Chun-Hao Lin 已提交
1955
		/* 8168EP family. */
1956 1957 1958
		{ 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 已提交
1959

1960
		/* 8168H family. */
1961 1962
		{ 0x7cf, 0x541,	RTL_GIGA_MAC_VER_46 },
		{ 0x7cf, 0x540,	RTL_GIGA_MAC_VER_45 },
1963

H
Hayes Wang 已提交
1964
		/* 8168G family. */
1965 1966 1967 1968
		{ 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 已提交
1969

1970
		/* 8168F family. */
1971 1972 1973
		{ 0x7c8, 0x488,	RTL_GIGA_MAC_VER_38 },
		{ 0x7cf, 0x481,	RTL_GIGA_MAC_VER_36 },
		{ 0x7cf, 0x480,	RTL_GIGA_MAC_VER_35 },
1974

H
hayeswang 已提交
1975
		/* 8168E family. */
1976 1977 1978
		{ 0x7c8, 0x2c8,	RTL_GIGA_MAC_VER_34 },
		{ 0x7cf, 0x2c1,	RTL_GIGA_MAC_VER_32 },
		{ 0x7c8, 0x2c0,	RTL_GIGA_MAC_VER_33 },
H
hayeswang 已提交
1979

F
Francois Romieu 已提交
1980
		/* 8168D family. */
1981 1982
		{ 0x7cf, 0x281,	RTL_GIGA_MAC_VER_25 },
		{ 0x7c8, 0x280,	RTL_GIGA_MAC_VER_26 },
F
Francois Romieu 已提交
1983

F
françois romieu 已提交
1984
		/* 8168DP family. */
1985 1986 1987 1988 1989
		/* It seems this early RTL8168dp version never made it to
		 * the wild. Let's see whether somebody complains, if not
		 * we'll remove support for this chip version completely.
		 * { 0x7cf, 0x288,      RTL_GIGA_MAC_VER_27 },
		 */
1990 1991
		{ 0x7cf, 0x28a,	RTL_GIGA_MAC_VER_28 },
		{ 0x7cf, 0x28b,	RTL_GIGA_MAC_VER_31 },
F
françois romieu 已提交
1992

1993
		/* 8168C family. */
1994 1995 1996 1997 1998 1999 2000
		{ 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 已提交
2001 2002

		/* 8168B family. */
2003 2004 2005
		{ 0x7cf, 0x380,	RTL_GIGA_MAC_VER_12 },
		{ 0x7c8, 0x380,	RTL_GIGA_MAC_VER_17 },
		{ 0x7c8, 0x300,	RTL_GIGA_MAC_VER_11 },
F
Francois Romieu 已提交
2006 2007

		/* 8101 family. */
2008 2009 2010 2011 2012 2013 2014 2015 2016
		{ 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 },
2017
		{ 0x7cf, 0x240,	RTL_GIGA_MAC_VER_14 },
2018 2019 2020 2021 2022
		{ 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 已提交
2023
		/* FIXME: where did these entries come from ? -- FR */
2024 2025
		{ 0xfc8, 0x388,	RTL_GIGA_MAC_VER_13 },
		{ 0xfc8, 0x308,	RTL_GIGA_MAC_VER_13 },
F
Francois Romieu 已提交
2026 2027

		/* 8110 family. */
2028 2029 2030 2031 2032
		{ 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 已提交
2033

2034
		/* Catch-all */
2035
		{ 0x000, 0x000,	RTL_GIGA_MAC_NONE   }
2036 2037
	};
	const struct rtl_mac_info *p = mac_info;
2038
	enum mac_version ver;
L
Linus Torvalds 已提交
2039

2040
	while ((xid & p->mask) != p->val)
L
Linus Torvalds 已提交
2041
		p++;
2042 2043 2044 2045 2046 2047 2048 2049 2050
	ver = p->ver;

	if (ver != RTL_GIGA_MAC_NONE && !gmii) {
		if (ver == RTL_GIGA_MAC_VER_42)
			ver = RTL_GIGA_MAC_VER_43;
		else if (ver == RTL_GIGA_MAC_VER_45)
			ver = RTL_GIGA_MAC_VER_47;
		else if (ver == RTL_GIGA_MAC_VER_46)
			ver = RTL_GIGA_MAC_VER_48;
2051
	}
2052 2053

	return ver;
L
Linus Torvalds 已提交
2054 2055
}

2056 2057
static void rtl_release_firmware(struct rtl8169_private *tp)
{
2058
	if (tp->rtl_fw) {
2059
		rtl_fw_release_firmware(tp->rtl_fw);
2060
		kfree(tp->rtl_fw);
2061
		tp->rtl_fw = NULL;
2062
	}
2063 2064
}

H
Heiner Kallweit 已提交
2065
void r8169_apply_firmware(struct rtl8169_private *tp)
2066
{
2067 2068
	int val;

2069
	/* TODO: release firmware if rtl_fw_write_firmware signals failure. */
2070
	if (tp->rtl_fw) {
2071
		rtl_fw_write_firmware(tp, tp->rtl_fw);
2072 2073
		/* At least one firmware doesn't reset tp->ocp_base. */
		tp->ocp_base = OCP_STD_PHY_BASE;
2074 2075 2076 2077 2078

		/* PHY soft reset may still be in progress */
		phy_read_poll_timeout(tp->phydev, MII_BMCR, val,
				      !(val & BMCR_RESET),
				      50000, 600000, true);
2079
	}
2080 2081
}

2082 2083
static void rtl8168_config_eee_mac(struct rtl8169_private *tp)
{
2084 2085 2086 2087
	/* Adjust EEE LED frequency */
	if (tp->mac_version != RTL_GIGA_MAC_VER_38)
		RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);

2088
	rtl_eri_set_bits(tp, 0x1b0, 0x0003);
2089 2090
}

2091
static void rtl8125a_config_eee_mac(struct rtl8169_private *tp)
2092 2093 2094 2095 2096
{
	r8168_mac_ocp_modify(tp, 0xe040, 0, BIT(1) | BIT(0));
	r8168_mac_ocp_modify(tp, 0xeb62, 0, BIT(2) | BIT(1));
}

2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107
static void rtl8125_set_eee_txidle_timer(struct rtl8169_private *tp)
{
	RTL_W16(tp, EEE_TXIDLE_TIMER_8125, tp->dev->mtu + ETH_HLEN + 0x20);
}

static void rtl8125b_config_eee_mac(struct rtl8169_private *tp)
{
	rtl8125_set_eee_txidle_timer(tp);
	r8168_mac_ocp_modify(tp, 0xe040, 0, BIT(1) | BIT(0));
}

2108
static void rtl_rar_exgmac_set(struct rtl8169_private *tp, const u8 *addr)
2109
{
2110 2111 2112 2113
	rtl_eri_write(tp, 0xe0, ERIAR_MASK_1111, get_unaligned_le32(addr));
	rtl_eri_write(tp, 0xe4, ERIAR_MASK_1111, get_unaligned_le16(addr + 4));
	rtl_eri_write(tp, 0xf0, ERIAR_MASK_1111, get_unaligned_le16(addr) << 16);
	rtl_eri_write(tp, 0xf4, ERIAR_MASK_1111, get_unaligned_le32(addr + 2));
2114 2115
}

H
Heiner Kallweit 已提交
2116
u16 rtl8168h_2_get_adc_bias_ioffset(struct rtl8169_private *tp)
2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131
{
	u16 data1, data2, ioffset;

	r8168_mac_ocp_write(tp, 0xdd02, 0x807d);
	data1 = r8168_mac_ocp_read(tp, 0xdd02);
	data2 = r8168_mac_ocp_read(tp, 0xdd00);

	ioffset = (data2 >> 1) & 0x7ff8;
	ioffset |= data2 & 0x0007;
	if (data1 & BIT(7))
		ioffset |= BIT(15);

	return ioffset;
}

2132 2133
static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)
{
2134 2135
	set_bit(flag, tp->wk.flags);
	schedule_work(&tp->wk.work);
2136 2137
}

2138
static void rtl8169_init_phy(struct rtl8169_private *tp)
2139
{
2140
	r8169_hw_phy_config(tp, tp->phydev, tp->mac_version);
2141

2142
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
2143 2144
		pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
2145
		/* set undocumented MAC Reg C+CR Offset 0x82h */
2146
		RTL_W8(tp, 0x82, 0x01);
2147
	}
2148

2149 2150 2151 2152 2153
	if (tp->mac_version == RTL_GIGA_MAC_VER_05 &&
	    tp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_GIGABYTE &&
	    tp->pci_dev->subsystem_device == 0xe000)
		phy_write_paged(tp->phydev, 0x0001, 0x10, 0xf01b);

2154
	/* We may have called phy_speed_down before */
2155
	phy_speed_up(tp->phydev);
2156

2157 2158 2159
	if (rtl_supports_eee(tp))
		rtl_enable_eee(tp);

2160
	genphy_soft_reset(tp->phydev);
2161 2162
}

2163
static void rtl_rar_set(struct rtl8169_private *tp, const u8 *addr)
2164
{
2165
	rtl_unlock_config_regs(tp);
2166

2167
	RTL_W32(tp, MAC4, get_unaligned_le16(addr + 4));
2168
	rtl_pci_commit(tp);
2169

2170
	RTL_W32(tp, MAC0, get_unaligned_le32(addr));
2171
	rtl_pci_commit(tp);
2172

2173 2174
	if (tp->mac_version == RTL_GIGA_MAC_VER_34)
		rtl_rar_exgmac_set(tp, addr);
2175

2176
	rtl_lock_config_regs(tp);
2177 2178 2179 2180 2181
}

static int rtl_set_mac_address(struct net_device *dev, void *p)
{
	struct rtl8169_private *tp = netdev_priv(dev);
2182
	int ret;
2183

2184 2185 2186
	ret = eth_mac_addr(dev, p);
	if (ret)
		return ret;
2187

2188
	rtl_rar_set(tp, dev->dev_addr);
2189 2190 2191 2192

	return 0;
}

2193 2194 2195
static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
2196 2197
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
2198 2199 2200 2201 2202
	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:
2203
	case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_63:
2204
		RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) |
2205 2206 2207 2208 2209 2210 2211
			AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
		break;
	default:
		break;
	}
}

2212
static void rtl_pll_power_down(struct rtl8169_private *tp)
F
françois romieu 已提交
2213
{
2214
	if (r8168_check_dash(tp))
F
françois romieu 已提交
2215 2216
		return;

H
hayeswang 已提交
2217 2218
	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_33)
2219
		rtl_ephy_write(tp, 0x19, 0xff64);
H
hayeswang 已提交
2220

2221 2222 2223
	if (device_may_wakeup(tp_to_dev(tp))) {
		phy_speed_down(tp->phydev, false);
		rtl_wol_suspend_quirk(tp);
F
françois romieu 已提交
2224
		return;
2225
	}
F
françois romieu 已提交
2226 2227

	switch (tp->mac_version) {
2228 2229
	case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33:
2230
	case RTL_GIGA_MAC_VER_37:
2231 2232
	case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_41:
	case RTL_GIGA_MAC_VER_43 ... RTL_GIGA_MAC_VER_63:
2233
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80);
2234
		break;
2235 2236
	default:
		break;
F
françois romieu 已提交
2237 2238 2239
	}
}

2240
static void rtl_pll_power_up(struct rtl8169_private *tp)
F
françois romieu 已提交
2241 2242
{
	switch (tp->mac_version) {
2243 2244
	case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33:
2245 2246 2247
	case RTL_GIGA_MAC_VER_37:
	case RTL_GIGA_MAC_VER_39:
	case RTL_GIGA_MAC_VER_43:
2248
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0x80);
F
françois romieu 已提交
2249
		break;
2250 2251
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_41:
	case RTL_GIGA_MAC_VER_44 ... RTL_GIGA_MAC_VER_63:
2252
		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0);
2253
		break;
2254 2255
	default:
		break;
F
françois romieu 已提交
2256 2257
	}

2258
	phy_resume(tp->phydev);
F
françois romieu 已提交
2259 2260
}

2261 2262 2263
static void rtl_init_rxcfg(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
2264
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
2265
	case RTL_GIGA_MAC_VER_10 ... RTL_GIGA_MAC_VER_17:
2266
		RTL_W32(tp, RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
2267
		break;
2268
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_24:
2269 2270
	case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_36:
	case RTL_GIGA_MAC_VER_38:
2271
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
2272
		break;
H
Heiner Kallweit 已提交
2273
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_52:
2274
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF);
2275
		break;
2276
	case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63:
2277
		RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST);
H
Heiner Kallweit 已提交
2278
		break;
2279
	default:
2280
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_DMA_BURST);
2281 2282 2283 2284
		break;
	}
}

2285 2286
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
{
2287
	tp->dirty_tx = tp->cur_tx = tp->cur_rx = 0;
2288 2289
}

F
Francois Romieu 已提交
2290 2291
static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
{
2292 2293
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
F
Francois Romieu 已提交
2294 2295 2296 2297
}

static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
{
2298 2299
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
F
Francois Romieu 已提交
2300 2301 2302 2303
}

static void r8168dp_hw_jumbo_enable(struct rtl8169_private *tp)
{
2304
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
F
Francois Romieu 已提交
2305 2306 2307 2308
}

static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
{
2309
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
F
Francois Romieu 已提交
2310 2311 2312 2313
}

static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
{
2314 2315 2316
	RTL_W8(tp, MaxTxPacketSize, 0x3f);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | 0x01);
F
Francois Romieu 已提交
2317 2318 2319 2320
}

static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
{
2321 2322 2323
	RTL_W8(tp, MaxTxPacketSize, 0x0c);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~0x01);
F
Francois Romieu 已提交
2324 2325 2326 2327
}

static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
{
2328
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
F
Francois Romieu 已提交
2329 2330 2331 2332
}

static void r8168b_1_hw_jumbo_disable(struct rtl8169_private *tp)
{
2333
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
F
Francois Romieu 已提交
2334 2335
}

2336
static void rtl_jumbo_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2337
{
2338
	bool jumbo = tp->dev->mtu > ETH_DATA_LEN;
2339
	int readrq = 4096;
F
Francois Romieu 已提交
2340

H
Heiner Kallweit 已提交
2341 2342 2343 2344
	rtl_unlock_config_regs(tp);
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
2345
		if (jumbo) {
2346
			readrq = 512;
2347 2348 2349 2350
			r8168b_1_hw_jumbo_enable(tp);
		} else {
			r8168b_1_hw_jumbo_disable(tp);
		}
H
Heiner Kallweit 已提交
2351 2352
		break;
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_26:
2353
		if (jumbo) {
2354
			readrq = 512;
2355 2356 2357 2358
			r8168c_hw_jumbo_enable(tp);
		} else {
			r8168c_hw_jumbo_disable(tp);
		}
H
Heiner Kallweit 已提交
2359 2360
		break;
	case RTL_GIGA_MAC_VER_27 ... RTL_GIGA_MAC_VER_28:
2361 2362 2363 2364
		if (jumbo)
			r8168dp_hw_jumbo_enable(tp);
		else
			r8168dp_hw_jumbo_disable(tp);
H
Heiner Kallweit 已提交
2365
		break;
2366
	case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_33:
2367
		if (jumbo)
2368
			r8168e_hw_jumbo_enable(tp);
2369
		else
2370
			r8168e_hw_jumbo_disable(tp);
H
Heiner Kallweit 已提交
2371
		break;
F
Francois Romieu 已提交
2372 2373 2374
	default:
		break;
	}
H
Heiner Kallweit 已提交
2375
	rtl_lock_config_regs(tp);
2376

2377 2378
	if (pci_is_pcie(tp->pci_dev) && tp->supports_gmii)
		pcie_set_readrq(tp->pci_dev, readrq);
F
Francois Romieu 已提交
2379 2380
}

2381 2382
DECLARE_RTL_COND(rtl_chipcmd_cond)
{
2383
	return RTL_R8(tp, ChipCmd) & CmdReset;
2384 2385
}

2386 2387
static void rtl_hw_reset(struct rtl8169_private *tp)
{
2388
	RTL_W8(tp, ChipCmd, CmdReset);
2389

2390
	rtl_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100);
2391 2392
}

2393
static void rtl_request_firmware(struct rtl8169_private *tp)
2394
{
2395
	struct rtl_fw *rtl_fw;
2396

2397 2398 2399
	/* firmware loaded already or no firmware available */
	if (tp->rtl_fw || !tp->fw_name)
		return;
2400

2401
	rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
2402
	if (!rtl_fw)
2403
		return;
2404

2405 2406 2407 2408
	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;
2409 2410
	rtl_fw->fw_name = tp->fw_name;
	rtl_fw->dev = tp_to_dev(tp);
2411

2412 2413 2414 2415
	if (rtl_fw_request_firmware(rtl_fw))
		kfree(rtl_fw);
	else
		tp->rtl_fw = rtl_fw;
2416 2417
}

2418 2419
static void rtl_rx_close(struct rtl8169_private *tp)
{
2420
	RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~RX_CONFIG_ACCEPT_MASK);
2421 2422
}

2423 2424
DECLARE_RTL_COND(rtl_npq_cond)
{
2425
	return RTL_R8(tp, TxPoll) & NPQ;
2426 2427 2428 2429
}

DECLARE_RTL_COND(rtl_txcfg_empty_cond)
{
2430
	return RTL_R32(tp, TxConfig) & TXCFG_EMPTY;
2431 2432
}

2433 2434 2435 2436 2437
DECLARE_RTL_COND(rtl_rxtx_empty_cond)
{
	return (RTL_R8(tp, MCU) & RXTX_EMPTY) == RXTX_EMPTY;
}

2438 2439 2440 2441 2442 2443
DECLARE_RTL_COND(rtl_rxtx_empty_cond_2)
{
	/* IntrMitigate has new functionality on RTL8125 */
	return (RTL_R16(tp, IntrMitigate) & 0x0103) == 0x0103;
}

2444 2445 2446 2447 2448 2449 2450 2451 2452 2453
static void rtl_wait_txrx_fifo_empty(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_52:
		rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 42);
		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
		break;
	case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61:
		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
		break;
2454 2455 2456 2457 2458
	case RTL_GIGA_MAC_VER_63:
		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond_2, 100, 42);
		break;
2459 2460 2461 2462 2463
	default:
		break;
	}
}

2464 2465 2466 2467
static void rtl_enable_rxdvgate(struct rtl8169_private *tp)
{
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | RXDV_GATED_EN);
	fsleep(2000);
2468
	rtl_wait_txrx_fifo_empty(tp);
2469 2470
}

2471
static void rtl_set_tx_config_registers(struct rtl8169_private *tp)
2472
{
2473 2474 2475
	u32 val = TX_DMA_BURST << TxDMAShift |
		  InterFrameGap << TxInterFrameGapShift;

2476
	if (rtl_is_8168evl_up(tp))
2477 2478 2479
		val |= TXCFG_AUTO_FIFO;

	RTL_W32(tp, TxConfig, val);
2480 2481
}

2482
static void rtl_set_rx_max_size(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
2483
{
2484 2485
	/* Low hurts. Let's disable the filtering. */
	RTL_W16(tp, RxMaxSize, R8169_RX_BUF_SIZE + 1);
2486 2487
}

2488
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp)
2489 2490 2491 2492 2493 2494
{
	/*
	 * 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.
	 */
2495 2496 2497 2498
	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));
2499 2500
}

2501
static void rtl8169_set_magic_reg(struct rtl8169_private *tp)
2502
{
2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515
	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);
2516 2517
}

2518 2519
static void rtl_set_rx_mode(struct net_device *dev)
{
H
Heiner Kallweit 已提交
2520 2521 2522
	u32 rx_mode = AcceptBroadcast | AcceptMyPhys | AcceptMulticast;
	/* Multicast hash filter */
	u32 mc_filter[2] = { 0xffffffff, 0xffffffff };
2523
	struct rtl8169_private *tp = netdev_priv(dev);
H
Heiner Kallweit 已提交
2524
	u32 tmp;
2525 2526

	if (dev->flags & IFF_PROMISC) {
H
Heiner Kallweit 已提交
2527 2528 2529 2530 2531 2532 2533
		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;
2534 2535 2536 2537 2538
	} else {
		struct netdev_hw_addr *ha;

		mc_filter[1] = mc_filter[0] = 0;
		netdev_for_each_mc_addr(ha, dev) {
2539
			u32 bit_nr = eth_hw_addr_crc(ha) >> 26;
H
Heiner Kallweit 已提交
2540 2541 2542 2543 2544 2545 2546
			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);
2547 2548 2549
		}
	}

2550 2551
	RTL_W32(tp, MAR0 + 4, mc_filter[1]);
	RTL_W32(tp, MAR0 + 0, mc_filter[0]);
2552

H
Heiner Kallweit 已提交
2553
	tmp = RTL_R32(tp, RxConfig);
2554
	RTL_W32(tp, RxConfig, (tmp & ~RX_CONFIG_ACCEPT_OK_MASK) | rx_mode);
2555 2556
}

2557 2558
DECLARE_RTL_COND(rtl_csiar_cond)
{
2559
	return RTL_R32(tp, CSIAR) & CSIAR_FLAG;
2560 2561
}

2562
static void rtl_csi_write(struct rtl8169_private *tp, int addr, int value)
2563
{
2564
	u32 func = PCI_FUNC(tp->pci_dev->devfn);
2565

2566 2567
	RTL_W32(tp, CSIDR, value);
	RTL_W32(tp, CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
2568
		CSIAR_BYTE_ENABLE | func << 16);
2569

2570
	rtl_loop_wait_low(tp, &rtl_csiar_cond, 10, 100);
2571 2572
}

2573
static u32 rtl_csi_read(struct rtl8169_private *tp, int addr)
2574
{
2575 2576 2577 2578
	u32 func = PCI_FUNC(tp->pci_dev->devfn);

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

2580
	return rtl_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
2581
		RTL_R32(tp, CSIDR) : ~0;
2582 2583
}

2584
static void rtl_csi_access_enable(struct rtl8169_private *tp, u8 val)
H
hayeswang 已提交
2585
{
2586 2587
	struct pci_dev *pdev = tp->pci_dev;
	u32 csi;
H
hayeswang 已提交
2588

2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
	/* 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 已提交
2601 2602
}

2603
static void rtl_set_def_aspm_entry_latency(struct rtl8169_private *tp)
2604
{
2605
	rtl_csi_access_enable(tp, 0x27);
2606 2607 2608 2609 2610 2611 2612 2613
}

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

2614 2615
static void __rtl_ephy_init(struct rtl8169_private *tp,
			    const struct ephy_info *e, int len)
2616 2617 2618 2619
{
	u16 w;

	while (len-- > 0) {
2620 2621
		w = (rtl_ephy_read(tp, e->offset) & ~e->mask) | e->bits;
		rtl_ephy_write(tp, e->offset, w);
2622 2623 2624 2625
		e++;
	}
}

2626 2627
#define rtl_ephy_init(tp, a) __rtl_ephy_init(tp, a, ARRAY_SIZE(a))

2628
static void rtl_disable_clock_request(struct rtl8169_private *tp)
2629
{
2630
	pcie_capability_clear_word(tp->pci_dev, PCI_EXP_LNKCTL,
2631
				   PCI_EXP_LNKCTL_CLKREQ_EN);
2632 2633
}

2634
static void rtl_enable_clock_request(struct rtl8169_private *tp)
F
françois romieu 已提交
2635
{
2636
	pcie_capability_set_word(tp->pci_dev, PCI_EXP_LNKCTL,
2637
				 PCI_EXP_LNKCTL_CLKREQ_EN);
F
françois romieu 已提交
2638 2639
}

2640
static void rtl_pcie_state_l2l3_disable(struct rtl8169_private *tp)
H
hayeswang 已提交
2641
{
2642 2643
	/* 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 已提交
2644 2645
}

K
Kai-Heng Feng 已提交
2646 2647
static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
{
2648 2649
	/* Don't enable ASPM in the chip if OS can't control ASPM */
	if (enable && tp->aspm_manageable) {
K
Kai-Heng Feng 已提交
2650
		RTL_W8(tp, Config5, RTL_R8(tp, Config5) | ASPM_en);
2651
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) | ClkReqEn);
K
Kai-Heng Feng 已提交
2652 2653 2654 2655
	} else {
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
		RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
	}
2656 2657

	udelay(10);
K
Kai-Heng Feng 已提交
2658 2659
}

H
Heiner Kallweit 已提交
2660 2661 2662 2663 2664 2665 2666 2667 2668 2669
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);
}

2670 2671 2672 2673 2674 2675 2676 2677
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);
}

2678
static void rtl_hw_start_8168b(struct rtl8169_private *tp)
2679
{
2680
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
2681 2682
}

2683
static void __rtl_hw_start_8168cp(struct rtl8169_private *tp)
2684
{
2685
	RTL_W8(tp, Config1, RTL_R8(tp, Config1) | Speed_down);
2686

2687
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
2688

2689
	rtl_disable_clock_request(tp);
2690 2691
}

2692
static void rtl_hw_start_8168cp_1(struct rtl8169_private *tp)
2693
{
2694
	static const struct ephy_info e_info_8168cp[] = {
2695 2696 2697 2698 2699 2700 2701
		{ 0x01, 0,	0x0001 },
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0042 },
		{ 0x06, 0x0080,	0x0000 },
		{ 0x07, 0,	0x2000 }
	};

2702
	rtl_set_def_aspm_entry_latency(tp);
2703

2704
	rtl_ephy_init(tp, e_info_8168cp);
2705

2706
	__rtl_hw_start_8168cp(tp);
2707 2708
}

2709
static void rtl_hw_start_8168cp_2(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2710
{
2711
	rtl_set_def_aspm_entry_latency(tp);
F
Francois Romieu 已提交
2712

2713
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
F
Francois Romieu 已提交
2714 2715
}

2716
static void rtl_hw_start_8168cp_3(struct rtl8169_private *tp)
2717
{
2718
	rtl_set_def_aspm_entry_latency(tp);
2719

2720
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
2721 2722

	/* Magic. */
2723
	RTL_W8(tp, DBG_REG, 0x20);
2724 2725
}

2726
static void rtl_hw_start_8168c_1(struct rtl8169_private *tp)
2727
{
2728
	static const struct ephy_info e_info_8168c_1[] = {
2729 2730 2731 2732 2733
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0002 },
		{ 0x06, 0x0080,	0x0000 }
	};

2734
	rtl_set_def_aspm_entry_latency(tp);
2735

2736
	RTL_W8(tp, DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
2737

2738
	rtl_ephy_init(tp, e_info_8168c_1);
2739

2740
	__rtl_hw_start_8168cp(tp);
2741 2742
}

2743
static void rtl_hw_start_8168c_2(struct rtl8169_private *tp)
2744
{
2745
	static const struct ephy_info e_info_8168c_2[] = {
2746
		{ 0x01, 0,	0x0001 },
2747
		{ 0x03, 0x0400,	0x0020 }
2748 2749
	};

2750
	rtl_set_def_aspm_entry_latency(tp);
2751

2752
	rtl_ephy_init(tp, e_info_8168c_2);
2753

2754
	__rtl_hw_start_8168cp(tp);
2755 2756
}

2757
static void rtl_hw_start_8168c_3(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2758
{
2759
	rtl_hw_start_8168c_2(tp);
F
Francois Romieu 已提交
2760 2761
}

2762
static void rtl_hw_start_8168c_4(struct rtl8169_private *tp)
2763
{
2764
	rtl_set_def_aspm_entry_latency(tp);
2765

2766
	__rtl_hw_start_8168cp(tp);
2767 2768
}

2769
static void rtl_hw_start_8168d(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2770
{
2771
	rtl_set_def_aspm_entry_latency(tp);
F
Francois Romieu 已提交
2772

2773
	rtl_disable_clock_request(tp);
F
Francois Romieu 已提交
2774 2775
}

2776
static void rtl_hw_start_8168d_4(struct rtl8169_private *tp)
F
françois romieu 已提交
2777 2778
{
	static const struct ephy_info e_info_8168d_4[] = {
2779 2780
		{ 0x0b, 0x0000,	0x0048 },
		{ 0x19, 0x0020,	0x0050 },
2781 2782
		{ 0x0c, 0x0100,	0x0020 },
		{ 0x10, 0x0004,	0x0000 },
F
françois romieu 已提交
2783 2784
	};

2785
	rtl_set_def_aspm_entry_latency(tp);
F
françois romieu 已提交
2786

2787
	rtl_ephy_init(tp, e_info_8168d_4);
F
françois romieu 已提交
2788

2789
	rtl_enable_clock_request(tp);
F
françois romieu 已提交
2790 2791
}

2792
static void rtl_hw_start_8168e_1(struct rtl8169_private *tp)
H
hayeswang 已提交
2793
{
H
Hayes Wang 已提交
2794
	static const struct ephy_info e_info_8168e_1[] = {
H
hayeswang 已提交
2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809
		{ 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 }
	};

2810
	rtl_set_def_aspm_entry_latency(tp);
H
hayeswang 已提交
2811

2812
	rtl_ephy_init(tp, e_info_8168e_1);
H
hayeswang 已提交
2813

2814
	rtl_disable_clock_request(tp);
H
hayeswang 已提交
2815 2816

	/* Reset tx FIFO pointer */
2817 2818
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | TXPLA_RST);
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~TXPLA_RST);
H
hayeswang 已提交
2819

2820
	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
H
hayeswang 已提交
2821 2822
}

2823
static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
H
Hayes Wang 已提交
2824 2825 2826
{
	static const struct ephy_info e_info_8168e_2[] = {
		{ 0x09, 0x0000,	0x0080 },
2827 2828 2829
		{ 0x19, 0x0000,	0x0224 },
		{ 0x00, 0x0000,	0x0004 },
		{ 0x0c, 0x3df0,	0x0200 },
H
Hayes Wang 已提交
2830 2831
	};

2832
	rtl_set_def_aspm_entry_latency(tp);
H
Hayes Wang 已提交
2833

2834
	rtl_ephy_init(tp, e_info_8168e_2);
H
Hayes Wang 已提交
2835

2836
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
2837
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_1111, 0x0000);
H
Heiner Kallweit 已提交
2838
	rtl_set_fifo_size(tp, 0x10, 0x10, 0x02, 0x06);
2839 2840 2841 2842
	rtl_eri_set_bits(tp, 0x0d4, 0x1f00);
	rtl_eri_set_bits(tp, 0x1d0, BIT(1));
	rtl_reset_packet_filter(tp);
	rtl_eri_set_bits(tp, 0x1b0, BIT(4));
2843 2844
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x07ff0060);
H
Hayes Wang 已提交
2845

2846
	rtl_disable_clock_request(tp);
2847

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

2850 2851
	rtl8168_config_eee_mac(tp);

2852 2853 2854
	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);
2855 2856

	rtl_hw_aspm_clkreq_enable(tp, true);
H
Hayes Wang 已提交
2857 2858
}

2859
static void rtl_hw_start_8168f(struct rtl8169_private *tp)
2860
{
2861
	rtl_set_def_aspm_entry_latency(tp);
2862

2863
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
2864
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_1111, 0x0000);
H
Heiner Kallweit 已提交
2865
	rtl_set_fifo_size(tp, 0x10, 0x10, 0x02, 0x06);
2866
	rtl_reset_packet_filter(tp);
2867
	rtl_eri_set_bits(tp, 0x1b0, BIT(4));
2868
	rtl_eri_set_bits(tp, 0x1d0, BIT(4) | BIT(1));
2869 2870
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x00000060);
2871

2872
	rtl_disable_clock_request(tp);
2873

2874 2875 2876 2877
	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);
2878 2879

	rtl8168_config_eee_mac(tp);
2880 2881
}

2882 2883 2884 2885 2886 2887
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 },
2888
		{ 0x19, 0x0000,	0x0224 },
2889
		{ 0x00, 0x0000,	0x0008 },
2890
		{ 0x0c, 0x3df0,	0x0200 },
2891 2892 2893 2894
	};

	rtl_hw_start_8168f(tp);

2895
	rtl_ephy_init(tp, e_info_8168f_1);
2896

2897
	rtl_eri_set_bits(tp, 0x0d4, 0x1f00);
2898 2899
}

2900 2901 2902 2903 2904
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 },
2905
		{ 0x19, 0x0000,	0x0224 },
2906
		{ 0x00, 0x0000,	0x0008 },
2907
		{ 0x0c, 0x3df0,	0x0200 },
2908 2909 2910
	};

	rtl_hw_start_8168f(tp);
2911
	rtl_pcie_state_l2l3_disable(tp);
2912

2913
	rtl_ephy_init(tp, e_info_8168f_1);
2914

2915
	rtl_eri_set_bits(tp, 0x0d4, 0x0c00);
2916 2917
}

2918
static void rtl_hw_start_8168g(struct rtl8169_private *tp)
H
Hayes Wang 已提交
2919
{
H
Heiner Kallweit 已提交
2920
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
2921
	rtl8168g_set_pause_thresholds(tp, 0x38, 0x48);
H
Hayes Wang 已提交
2922

2923
	rtl_set_def_aspm_entry_latency(tp);
H
Hayes Wang 已提交
2924

2925
	rtl_reset_packet_filter(tp);
2926
	rtl_eri_write(tp, 0x2f8, ERIAR_MASK_0011, 0x1d8f);
H
Hayes Wang 已提交
2927

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

2930 2931
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
2932
	rtl_eri_set_bits(tp, 0x0d4, 0x1f80);
H
Hayes Wang 已提交
2933

2934 2935
	rtl8168_config_eee_mac(tp);

2936 2937
	rtl_w0w1_eri(tp, 0x2fc, 0x01, 0x06);
	rtl_eri_clear_bits(tp, 0x1b0, BIT(12));
H
hayeswang 已提交
2938

2939
	rtl_pcie_state_l2l3_disable(tp);
H
Hayes Wang 已提交
2940 2941
}

2942 2943 2944
static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168g_1[] = {
2945 2946
		{ 0x00, 0x0008,	0x0000 },
		{ 0x0c, 0x3ff0,	0x0820 },
2947 2948 2949 2950 2951 2952 2953
		{ 0x1e, 0x0000,	0x0001 },
		{ 0x19, 0x8000,	0x0000 }
	};

	rtl_hw_start_8168g(tp);

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
2954
	rtl_hw_aspm_clkreq_enable(tp, false);
2955
	rtl_ephy_init(tp, e_info_8168g_1);
K
Kai-Heng Feng 已提交
2956
	rtl_hw_aspm_clkreq_enable(tp, true);
2957 2958
}

H
hayeswang 已提交
2959 2960 2961
static void rtl_hw_start_8168g_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168g_2[] = {
2962 2963 2964 2965 2966 2967 2968 2969 2970
		{ 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 已提交
2971 2972
	};

2973
	rtl_hw_start_8168g(tp);
H
hayeswang 已提交
2974 2975

	/* disable aspm and clock request before access ephy */
2976
	rtl_hw_aspm_clkreq_enable(tp, false);
2977
	rtl_ephy_init(tp, e_info_8168g_2);
H
hayeswang 已提交
2978 2979
}

H
hayeswang 已提交
2980 2981 2982
static void rtl_hw_start_8411_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8411_2[] = {
2983 2984 2985 2986 2987 2988 2989 2990 2991 2992
		{ 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 已提交
2993 2994
	};

2995
	rtl_hw_start_8168g(tp);
H
hayeswang 已提交
2996 2997

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
2998
	rtl_hw_aspm_clkreq_enable(tp, false);
2999
	rtl_ephy_init(tp, e_info_8411_2);
3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 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 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136

	/* 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 已提交
3137
	rtl_hw_aspm_clkreq_enable(tp, true);
H
hayeswang 已提交
3138 3139
}

3140 3141 3142 3143 3144 3145 3146
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 },
3147
		{ 0x04, 0xffff,	0x854a },
3148 3149
		{ 0x01, 0xffff,	0x068b }
	};
3150
	int rg_saw_cnt;
3151 3152

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

H
Heiner Kallweit 已提交
3156
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
3157
	rtl8168g_set_pause_thresholds(tp, 0x38, 0x48);
3158

3159
	rtl_set_def_aspm_entry_latency(tp);
3160

3161
	rtl_reset_packet_filter(tp);
3162

3163
	rtl_eri_set_bits(tp, 0xd4, 0x1f00);
3164
	rtl_eri_set_bits(tp, 0xdc, 0x001c);
3165

3166
	rtl_eri_write(tp, 0x5f0, ERIAR_MASK_0011, 0x4f87);
3167

3168
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
3169

3170 3171
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
3172

3173 3174
	rtl8168_config_eee_mac(tp);

3175 3176
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
3177

3178
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~TX_10M_PS_EN);
3179

3180
	rtl_eri_clear_bits(tp, 0x1b0, BIT(12));
3181

3182
	rtl_pcie_state_l2l3_disable(tp);
3183

3184
	rg_saw_cnt = phy_read_paged(tp->phydev, 0x0c42, 0x13) & 0x3fff;
3185 3186 3187 3188 3189
	if (rg_saw_cnt > 0) {
		u16 sw_cnt_1ms_ini;

		sw_cnt_1ms_ini = 16000000/rg_saw_cnt;
		sw_cnt_1ms_ini &= 0x0fff;
3190
		r8168_mac_ocp_modify(tp, 0xd412, 0x0fff, sw_cnt_1ms_ini);
3191 3192
	}

3193 3194 3195 3196
	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);
3197 3198 3199 3200 3201

	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 已提交
3202 3203

	rtl_hw_aspm_clkreq_enable(tp, true);
3204 3205
}

C
Chun-Hao Lin 已提交
3206 3207
static void rtl_hw_start_8168ep(struct rtl8169_private *tp)
{
C
Chun-Hao Lin 已提交
3208 3209
	rtl8168ep_stop_cmac(tp);

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

3213
	rtl_set_def_aspm_entry_latency(tp);
C
Chun-Hao Lin 已提交
3214

3215
	rtl_reset_packet_filter(tp);
C
Chun-Hao Lin 已提交
3216

3217
	rtl_eri_set_bits(tp, 0xd4, 0x1f80);
C
Chun-Hao Lin 已提交
3218

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

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

3223 3224
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
C
Chun-Hao Lin 已提交
3225

3226 3227
	rtl8168_config_eee_mac(tp);

3228
	rtl_w0w1_eri(tp, 0x2fc, 0x01, 0x06);
C
Chun-Hao Lin 已提交
3229

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

3232
	rtl_pcie_state_l2l3_disable(tp);
C
Chun-Hao Lin 已提交
3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245
}

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 已提交
3246
	rtl_hw_aspm_clkreq_enable(tp, false);
3247
	rtl_ephy_init(tp, e_info_8168ep_1);
C
Chun-Hao Lin 已提交
3248 3249

	rtl_hw_start_8168ep(tp);
K
Kai-Heng Feng 已提交
3250 3251

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262
}

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 已提交
3263
	rtl_hw_aspm_clkreq_enable(tp, false);
3264
	rtl_ephy_init(tp, e_info_8168ep_2);
C
Chun-Hao Lin 已提交
3265 3266 3267

	rtl_hw_start_8168ep(tp);

3268 3269
	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 已提交
3270 3271

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
3272 3273 3274 3275 3276
}

static void rtl_hw_start_8168ep_3(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168ep_3[] = {
3277 3278 3279 3280
		{ 0x00, 0x0000,	0x0080 },
		{ 0x0d, 0x0100,	0x0200 },
		{ 0x19, 0x8021,	0x0000 },
		{ 0x1e, 0x0000,	0x2000 },
C
Chun-Hao Lin 已提交
3281 3282 3283
	};

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
3284
	rtl_hw_aspm_clkreq_enable(tp, false);
3285
	rtl_ephy_init(tp, e_info_8168ep_3);
C
Chun-Hao Lin 已提交
3286 3287 3288

	rtl_hw_start_8168ep(tp);

3289 3290
	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 已提交
3291

3292 3293 3294
	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 已提交
3295 3296

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

H
Heiner Kallweit 已提交
3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319
static void rtl_hw_start_8117(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8117[] = {
		{ 0x19, 0x0040,	0x1100 },
		{ 0x59, 0x0040,	0x1100 },
	};
	int rg_saw_cnt;

	rtl8168ep_stop_cmac(tp);

	/* disable aspm and clock request before access ephy */
	rtl_hw_aspm_clkreq_enable(tp, false);
	rtl_ephy_init(tp, e_info_8117);

	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
	rtl8168g_set_pause_thresholds(tp, 0x2f, 0x5f);

	rtl_set_def_aspm_entry_latency(tp);

	rtl_reset_packet_filter(tp);

3320
	rtl_eri_set_bits(tp, 0xd4, 0x1f90);
H
Heiner Kallweit 已提交
3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335

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

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

	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);

	rtl8168_config_eee_mac(tp);

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

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

3336
	rtl_eri_clear_bits(tp, 0x1b0, BIT(12));
H
Heiner Kallweit 已提交
3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357

	rtl_pcie_state_l2l3_disable(tp);

	rg_saw_cnt = phy_read_paged(tp->phydev, 0x0c42, 0x13) & 0x3fff;
	if (rg_saw_cnt > 0) {
		u16 sw_cnt_1ms_ini;

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

	r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0070);
	r8168_mac_ocp_write(tp, 0xea80, 0x0003);
	r8168_mac_ocp_modify(tp, 0xe052, 0x0000, 0x0009);
	r8168_mac_ocp_modify(tp, 0xd420, 0x0fff, 0x047f);

	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);

3358
	/* firmware is for MAC only */
3359
	r8169_apply_firmware(tp);
3360

H
Heiner Kallweit 已提交
3361 3362 3363
	rtl_hw_aspm_clkreq_enable(tp, true);
}

3364
static void rtl_hw_start_8102e_1(struct rtl8169_private *tp)
3365
{
3366
	static const struct ephy_info e_info_8102e_1[] = {
3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377
		{ 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;

3378
	rtl_set_def_aspm_entry_latency(tp);
3379

3380
	RTL_W8(tp, DBG_REG, FIX_NAK_1);
3381

3382
	RTL_W8(tp, Config1,
3383
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
3384
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
3385

3386
	cfg1 = RTL_R8(tp, Config1);
3387
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
3388
		RTL_W8(tp, Config1, cfg1 & ~LEDS0);
3389

3390
	rtl_ephy_init(tp, e_info_8102e_1);
3391 3392
}

3393
static void rtl_hw_start_8102e_2(struct rtl8169_private *tp)
3394
{
3395
	rtl_set_def_aspm_entry_latency(tp);
3396

3397 3398
	RTL_W8(tp, Config1, MEMMAP | IOMAP | VPD | PMEnable);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
3399 3400
}

3401
static void rtl_hw_start_8102e_3(struct rtl8169_private *tp)
3402
{
3403
	rtl_hw_start_8102e_2(tp);
3404

3405
	rtl_ephy_write(tp, 0x03, 0xc2f9);
3406 3407
}

3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420
static void rtl_hw_start_8401(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8401[] = {
		{ 0x01,	0xffff, 0x6fe5 },
		{ 0x03,	0xffff, 0x0599 },
		{ 0x06,	0xffff, 0xaf25 },
		{ 0x07,	0xffff, 0x8e68 },
	};

	rtl_ephy_init(tp, e_info_8401);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
}

3421
static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433
{
	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 已提交
3434
	/* Force LAN exit from ASPM if Rx/Tx are not idle */
3435
	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
3436

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

3440 3441
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) | EN_NDP | EN_OOB_RESET);
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
3442

3443
	rtl_ephy_init(tp, e_info_8105e_1);
H
hayeswang 已提交
3444

3445
	rtl_pcie_state_l2l3_disable(tp);
3446 3447
}

3448
static void rtl_hw_start_8105e_2(struct rtl8169_private *tp)
3449
{
3450
	rtl_hw_start_8105e_1(tp);
3451
	rtl_ephy_write(tp, 0x1e, rtl_ephy_read(tp, 0x1e) | 0x8000);
3452 3453
}

3454 3455 3456 3457 3458 3459 3460
static void rtl_hw_start_8402(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8402[] = {
		{ 0x19,	0xffff, 0xff64 },
		{ 0x1e,	0, 0x4000 }
	};

3461
	rtl_set_def_aspm_entry_latency(tp);
3462 3463

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

3466
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
3467

3468
	rtl_ephy_init(tp, e_info_8402);
3469

H
Heiner Kallweit 已提交
3470
	rtl_set_fifo_size(tp, 0x00, 0x00, 0x02, 0x06);
3471
	rtl_reset_packet_filter(tp);
3472 3473
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
3474
	rtl_w0w1_eri(tp, 0x0d4, 0x0e00, 0xff00);
H
hayeswang 已提交
3475

3476 3477 3478
	/* disable EEE */
	rtl_eri_write(tp, 0x1b0, ERIAR_MASK_0011, 0x0000);

3479
	rtl_pcie_state_l2l3_disable(tp);
3480 3481
}

H
Hayes Wang 已提交
3482 3483
static void rtl_hw_start_8106(struct rtl8169_private *tp)
{
K
Kai-Heng Feng 已提交
3484 3485
	rtl_hw_aspm_clkreq_enable(tp, false);

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

3489 3490 3491
	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 已提交
3492

3493 3494
	rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000);

3495 3496 3497
	/* disable EEE */
	rtl_eri_write(tp, 0x1b0, ERIAR_MASK_0011, 0x0000);

3498
	rtl_pcie_state_l2l3_disable(tp);
K
Kai-Heng Feng 已提交
3499
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Hayes Wang 已提交
3500 3501
}

H
Heiner Kallweit 已提交
3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529
DECLARE_RTL_COND(rtl_mac_ocp_e00e_cond)
{
	return r8168_mac_ocp_read(tp, 0xe00e) & BIT(13);
}

static void rtl_hw_start_8125_common(struct rtl8169_private *tp)
{
	rtl_pcie_state_l2l3_disable(tp);

	RTL_W16(tp, 0x382, 0x221b);
	RTL_W8(tp, 0x4500, 0);
	RTL_W16(tp, 0x4800, 0);

	/* disable UPS */
	r8168_mac_ocp_modify(tp, 0xd40a, 0x0010, 0x0000);

	RTL_W8(tp, Config1, RTL_R8(tp, Config1) & ~0x10);

	r8168_mac_ocp_write(tp, 0xc140, 0xffff);
	r8168_mac_ocp_write(tp, 0xc142, 0xffff);

	r8168_mac_ocp_modify(tp, 0xd3e2, 0x0fff, 0x03a9);
	r8168_mac_ocp_modify(tp, 0xd3e4, 0x00ff, 0x0000);
	r8168_mac_ocp_modify(tp, 0xe860, 0x0000, 0x0080);

	/* disable new tx descriptor format */
	r8168_mac_ocp_modify(tp, 0xeb58, 0x0001, 0x0000);

3530 3531 3532 3533 3534 3535 3536 3537 3538 3539
	if (tp->mac_version == RTL_GIGA_MAC_VER_63)
		r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0200);
	else
		r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400);

	if (tp->mac_version == RTL_GIGA_MAC_VER_63)
		r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0000);
	else
		r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0020);

H
Heiner Kallweit 已提交
3540 3541 3542 3543 3544
	r8168_mac_ocp_modify(tp, 0xc0b4, 0x0000, 0x000c);
	r8168_mac_ocp_modify(tp, 0xeb6a, 0x00ff, 0x0033);
	r8168_mac_ocp_modify(tp, 0xeb50, 0x03e0, 0x0040);
	r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0030);
	r8168_mac_ocp_modify(tp, 0xe040, 0x1000, 0x0000);
3545
	r8168_mac_ocp_modify(tp, 0xea1c, 0x0003, 0x0001);
H
Heiner Kallweit 已提交
3546
	r8168_mac_ocp_modify(tp, 0xe0c0, 0x4f0f, 0x4403);
3547
	r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0068);
H
Heiner Kallweit 已提交
3548 3549
	r8168_mac_ocp_modify(tp, 0xc0ac, 0x0080, 0x1f00);
	r8168_mac_ocp_modify(tp, 0xd430, 0x0fff, 0x047f);
3550

H
Heiner Kallweit 已提交
3551 3552 3553 3554 3555 3556 3557 3558
	r8168_mac_ocp_modify(tp, 0xea1c, 0x0004, 0x0000);
	r8168_mac_ocp_modify(tp, 0xeb54, 0x0000, 0x0001);
	udelay(1);
	r8168_mac_ocp_modify(tp, 0xeb54, 0x0001, 0x0000);
	RTL_W16(tp, 0x1880, RTL_R16(tp, 0x1880) & ~0x0030);

	r8168_mac_ocp_write(tp, 0xe098, 0xc302);

3559
	rtl_loop_wait_low(tp, &rtl_mac_ocp_e00e_cond, 1000, 10);
H
Heiner Kallweit 已提交
3560

3561 3562 3563 3564
	if (tp->mac_version == RTL_GIGA_MAC_VER_63)
		rtl8125b_config_eee_mac(tp);
	else
		rtl8125a_config_eee_mac(tp);
3565

H
Heiner Kallweit 已提交
3566 3567 3568 3569
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
	udelay(10);
}

3570
static void rtl_hw_start_8125a_1(struct rtl8169_private *tp)
H
Heiner Kallweit 已提交
3571
{
3572
	static const struct ephy_info e_info_8125a_1[] = {
H
Heiner Kallweit 已提交
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
		{ 0x01, 0xffff, 0xa812 },
		{ 0x09, 0xffff, 0x520c },
		{ 0x04, 0xffff, 0xd000 },
		{ 0x0d, 0xffff, 0xf702 },
		{ 0x0a, 0xffff, 0x8653 },
		{ 0x06, 0xffff, 0x001e },
		{ 0x08, 0xffff, 0x3595 },
		{ 0x20, 0xffff, 0x9455 },
		{ 0x21, 0xffff, 0x99ff },
		{ 0x02, 0xffff, 0x6046 },
		{ 0x29, 0xffff, 0xfe00 },
		{ 0x23, 0xffff, 0xab62 },

		{ 0x41, 0xffff, 0xa80c },
		{ 0x49, 0xffff, 0x520c },
		{ 0x44, 0xffff, 0xd000 },
		{ 0x4d, 0xffff, 0xf702 },
		{ 0x4a, 0xffff, 0x8653 },
		{ 0x46, 0xffff, 0x001e },
		{ 0x48, 0xffff, 0x3595 },
		{ 0x60, 0xffff, 0x9455 },
		{ 0x61, 0xffff, 0x99ff },
		{ 0x42, 0xffff, 0x6046 },
		{ 0x69, 0xffff, 0xfe00 },
		{ 0x63, 0xffff, 0xab62 },
	};

	rtl_set_def_aspm_entry_latency(tp);

	/* disable aspm and clock request before access ephy */
	rtl_hw_aspm_clkreq_enable(tp, false);
3604
	rtl_ephy_init(tp, e_info_8125a_1);
H
Heiner Kallweit 已提交
3605 3606

	rtl_hw_start_8125_common(tp);
3607
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Heiner Kallweit 已提交
3608 3609
}

3610
static void rtl_hw_start_8125a_2(struct rtl8169_private *tp)
H
Heiner Kallweit 已提交
3611
{
3612
	static const struct ephy_info e_info_8125a_2[] = {
H
Heiner Kallweit 已提交
3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631
		{ 0x04, 0xffff, 0xd000 },
		{ 0x0a, 0xffff, 0x8653 },
		{ 0x23, 0xffff, 0xab66 },
		{ 0x20, 0xffff, 0x9455 },
		{ 0x21, 0xffff, 0x99ff },
		{ 0x29, 0xffff, 0xfe04 },

		{ 0x44, 0xffff, 0xd000 },
		{ 0x4a, 0xffff, 0x8653 },
		{ 0x63, 0xffff, 0xab66 },
		{ 0x60, 0xffff, 0x9455 },
		{ 0x61, 0xffff, 0x99ff },
		{ 0x69, 0xffff, 0xfe04 },
	};

	rtl_set_def_aspm_entry_latency(tp);

	/* disable aspm and clock request before access ephy */
	rtl_hw_aspm_clkreq_enable(tp, false);
3632
	rtl_ephy_init(tp, e_info_8125a_2);
H
Heiner Kallweit 已提交
3633 3634

	rtl_hw_start_8125_common(tp);
3635
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Heiner Kallweit 已提交
3636 3637
}

3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657
static void rtl_hw_start_8125b(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8125b[] = {
		{ 0x0b, 0xffff, 0xa908 },
		{ 0x1e, 0xffff, 0x20eb },
		{ 0x4b, 0xffff, 0xa908 },
		{ 0x5e, 0xffff, 0x20eb },
		{ 0x22, 0x0030, 0x0020 },
		{ 0x62, 0x0030, 0x0020 },
	};

	rtl_set_def_aspm_entry_latency(tp);
	rtl_hw_aspm_clkreq_enable(tp, false);

	rtl_ephy_init(tp, e_info_8125b);
	rtl_hw_start_8125_common(tp);

	rtl_hw_aspm_clkreq_enable(tp, true);
}

3658 3659 3660 3661 3662 3663 3664
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,
3665 3666
		[RTL_GIGA_MAC_VER_11] = rtl_hw_start_8168b,
		[RTL_GIGA_MAC_VER_12] = rtl_hw_start_8168b,
3667
		[RTL_GIGA_MAC_VER_13] = NULL,
3668
		[RTL_GIGA_MAC_VER_14] = rtl_hw_start_8401,
3669
		[RTL_GIGA_MAC_VER_16] = NULL,
3670
		[RTL_GIGA_MAC_VER_17] = rtl_hw_start_8168b,
3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683
		[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,
3684
		[RTL_GIGA_MAC_VER_31] = rtl_hw_start_8168d,
3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704
		[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,
H
Heiner Kallweit 已提交
3705
		[RTL_GIGA_MAC_VER_52] = rtl_hw_start_8117,
3706 3707
		[RTL_GIGA_MAC_VER_60] = rtl_hw_start_8125a_1,
		[RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2,
3708
		[RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b,
3709 3710 3711 3712 3713 3714
	};

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

H
Heiner Kallweit 已提交
3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725
static void rtl_hw_start_8125(struct rtl8169_private *tp)
{
	int i;

	/* disable interrupt coalescing */
	for (i = 0xa00; i < 0xb00; i += 4)
		RTL_W32(tp, i, 0);

	rtl_hw_config(tp);
}

3726
static void rtl_hw_start_8168(struct rtl8169_private *tp)
3727
{
3728 3729 3730 3731
	if (rtl_is_8168evl_up(tp))
		RTL_W8(tp, MaxTxPacketSize, EarlySize);
	else
		RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
H
hayeswang 已提交
3732

3733
	rtl_hw_config(tp);
3734 3735 3736

	/* disable interrupt coalescing */
	RTL_W16(tp, IntrMitigate, 0x0000);
L
Linus Torvalds 已提交
3737 3738
}

3739 3740 3741 3742 3743 3744 3745
static void rtl_hw_start_8169(struct rtl8169_private *tp)
{
	RTL_W8(tp, EarlyTxThres, NoEarlyTx);

	tp->cp_cmd |= PCIMulRW;

	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
H
Heiner Kallweit 已提交
3746 3747
	    tp->mac_version == RTL_GIGA_MAC_VER_03)
		tp->cp_cmd |= EnAnaPLL;
3748 3749 3750

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

3751
	rtl8169_set_magic_reg(tp);
3752

3753 3754
	/* disable interrupt coalescing */
	RTL_W16(tp, IntrMitigate, 0x0000);
3755 3756 3757 3758 3759 3760 3761 3762 3763 3764
}

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

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

	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		rtl_hw_start_8169(tp);
H
Heiner Kallweit 已提交
3765 3766
	else if (rtl_is_8125(tp))
		rtl_hw_start_8125(tp);
3767 3768 3769 3770 3771 3772 3773
	else
		rtl_hw_start_8168(tp);

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

3774
	rtl_jumbo_config(tp);
3775

3776
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
3777 3778
	rtl_pci_commit(tp);

3779 3780 3781
	RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
	rtl_init_rxcfg(tp);
	rtl_set_tx_config_registers(tp);
3782
	rtl_set_rx_config_features(tp, tp->dev->features);
3783 3784 3785 3786
	rtl_set_rx_mode(tp->dev);
	rtl_irq_enable(tp);
}

L
Linus Torvalds 已提交
3787 3788
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
{
F
Francois Romieu 已提交
3789 3790
	struct rtl8169_private *tp = netdev_priv(dev);

L
Linus Torvalds 已提交
3791
	dev->mtu = new_mtu;
3792
	netdev_update_features(dev);
3793
	rtl_jumbo_config(tp);
3794

3795 3796 3797 3798 3799 3800 3801 3802 3803
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_61:
	case RTL_GIGA_MAC_VER_63:
		rtl8125_set_eee_txidle_timer(tp);
		break;
	default:
		break;
	}

S
Stanislaw Gruszka 已提交
3804
	return 0;
L
Linus Torvalds 已提交
3805 3806
}

3807
static void rtl8169_mark_to_asic(struct RxDesc *desc)
L
Linus Torvalds 已提交
3808 3809 3810
{
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;

3811
	desc->opts2 = 0;
3812 3813
	/* Force memory writes to complete before releasing descriptor */
	dma_wmb();
3814
	WRITE_ONCE(desc->opts1, cpu_to_le32(DescOwn | eor | R8169_RX_BUF_SIZE));
L
Linus Torvalds 已提交
3815 3816
}

3817 3818
static struct page *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
					  struct RxDesc *desc)
L
Linus Torvalds 已提交
3819
{
H
Heiner Kallweit 已提交
3820
	struct device *d = tp_to_dev(tp);
3821
	int node = dev_to_node(d);
3822 3823
	dma_addr_t mapping;
	struct page *data;
L
Linus Torvalds 已提交
3824

3825
	data = alloc_pages_node(node, GFP_KERNEL, get_order(R8169_RX_BUF_SIZE));
E
Eric Dumazet 已提交
3826 3827
	if (!data)
		return NULL;
3828

3829
	mapping = dma_map_page(d, data, 0, R8169_RX_BUF_SIZE, DMA_FROM_DEVICE);
3830
	if (unlikely(dma_mapping_error(d, mapping))) {
3831
		netdev_err(tp->dev, "Failed to map RX DMA!\n");
3832 3833
		__free_pages(data, get_order(R8169_RX_BUF_SIZE));
		return NULL;
3834
	}
L
Linus Torvalds 已提交
3835

3836 3837
	desc->addr = cpu_to_le64(mapping);
	rtl8169_mark_to_asic(desc);
3838

3839
	return data;
L
Linus Torvalds 已提交
3840 3841 3842 3843
}

static void rtl8169_rx_clear(struct rtl8169_private *tp)
{
3844
	int i;
L
Linus Torvalds 已提交
3845

3846 3847 3848 3849 3850 3851
	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;
3852 3853
		tp->RxDescArray[i].addr = 0;
		tp->RxDescArray[i].opts1 = 0;
L
Linus Torvalds 已提交
3854 3855 3856
	}
}

S
Stanislaw Gruszka 已提交
3857 3858
static int rtl8169_rx_fill(struct rtl8169_private *tp)
{
3859
	int i;
L
Linus Torvalds 已提交
3860

S
Stanislaw Gruszka 已提交
3861
	for (i = 0; i < NUM_RX_DESC; i++) {
3862
		struct page *data;
3863

S
Stanislaw Gruszka 已提交
3864
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
E
Eric Dumazet 已提交
3865
		if (!data) {
H
Heiner Kallweit 已提交
3866 3867
			rtl8169_rx_clear(tp);
			return -ENOMEM;
E
Eric Dumazet 已提交
3868 3869
		}
		tp->Rx_databuff[i] = data;
L
Linus Torvalds 已提交
3870 3871
	}

3872 3873
	/* mark as last descriptor in the ring */
	tp->RxDescArray[NUM_RX_DESC - 1].opts1 |= cpu_to_le32(RingEnd);
S
Stanislaw Gruszka 已提交
3874

H
Heiner Kallweit 已提交
3875
	return 0;
L
Linus Torvalds 已提交
3876 3877
}

3878
static int rtl8169_init_ring(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
3879 3880 3881
{
	rtl8169_init_ring_indexes(tp);

3882 3883
	memset(tp->tx_skb, 0, sizeof(tp->tx_skb));
	memset(tp->Rx_databuff, 0, sizeof(tp->Rx_databuff));
L
Linus Torvalds 已提交
3884

S
Stanislaw Gruszka 已提交
3885
	return rtl8169_rx_fill(tp);
L
Linus Torvalds 已提交
3886 3887
}

3888
static void rtl8169_unmap_tx_skb(struct rtl8169_private *tp, unsigned int entry)
L
Linus Torvalds 已提交
3889
{
3890 3891
	struct ring_info *tx_skb = tp->tx_skb + entry;
	struct TxDesc *desc = tp->TxDescArray + entry;
L
Linus Torvalds 已提交
3892

3893 3894
	dma_unmap_single(tp_to_dev(tp), le64_to_cpu(desc->addr), tx_skb->len,
			 DMA_TO_DEVICE);
3895 3896
	memset(desc, 0, sizeof(*desc));
	memset(tx_skb, 0, sizeof(*tx_skb));
L
Linus Torvalds 已提交
3897 3898
}

3899 3900
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
				   unsigned int n)
L
Linus Torvalds 已提交
3901 3902 3903
{
	unsigned int i;

3904 3905
	for (i = 0; i < n; i++) {
		unsigned int entry = (start + i) % NUM_TX_DESC;
L
Linus Torvalds 已提交
3906 3907 3908 3909 3910 3911
		struct ring_info *tx_skb = tp->tx_skb + entry;
		unsigned int len = tx_skb->len;

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

3912
			rtl8169_unmap_tx_skb(tp, entry);
3913
			if (skb)
3914
				dev_consume_skb_any(skb);
L
Linus Torvalds 已提交
3915 3916
		}
	}
3917 3918 3919 3920 3921
}

static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
3922
	netdev_reset_queue(tp->dev);
L
Linus Torvalds 已提交
3923 3924
}

3925
static void rtl8169_cleanup(struct rtl8169_private *tp, bool going_down)
3926
{
3927 3928
	napi_disable(&tp->napi);

3929
	/* Give a racing hard_start_xmit a few cycles to complete. */
3930
	synchronize_net();
3931 3932 3933 3934 3935 3936

	/* Disable interrupts */
	rtl8169_irq_mask_and_ack(tp);

	rtl_rx_close(tp);

H
Heiner Kallweit 已提交
3937 3938 3939
	if (going_down && tp->dev->wol_enabled)
		goto no_reset;

3940 3941 3942 3943 3944 3945 3946 3947 3948 3949
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		rtl_loop_wait_low(tp, &rtl_npq_cond, 20, 2000);
		break;
	case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
		rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
		break;
3950
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
3951 3952 3953 3954 3955 3956 3957 3958 3959 3960
		rtl_enable_rxdvgate(tp);
		fsleep(2000);
		break;
	default:
		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
		fsleep(100);
		break;
	}

	rtl_hw_reset(tp);
H
Heiner Kallweit 已提交
3961
no_reset:
3962 3963 3964 3965
	rtl8169_tx_clear(tp);
	rtl8169_init_ring_indexes(tp);
}

3966
static void rtl_reset_work(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
3967
{
3968
	int i;
L
Linus Torvalds 已提交
3969

3970
	netif_stop_queue(tp->dev);
L
Linus Torvalds 已提交
3971

3972
	rtl8169_cleanup(tp, false);
3973

3974
	for (i = 0; i < NUM_RX_DESC; i++)
3975
		rtl8169_mark_to_asic(tp->RxDescArray + i);
3976

3977
	napi_enable(&tp->napi);
3978
	rtl_hw_start(tp);
L
Linus Torvalds 已提交
3979 3980
}

3981
static void rtl8169_tx_timeout(struct net_device *dev, unsigned int txqueue)
L
Linus Torvalds 已提交
3982
{
3983 3984 3985
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
L
Linus Torvalds 已提交
3986 3987
}

3988 3989
static int rtl8169_tx_map(struct rtl8169_private *tp, const u32 *opts, u32 len,
			  void *addr, unsigned int entry, bool desc_own)
3990
{
3991 3992 3993 3994 3995 3996 3997 3998 3999 4000
	struct TxDesc *txd = tp->TxDescArray + entry;
	struct device *d = tp_to_dev(tp);
	dma_addr_t mapping;
	u32 opts1;
	int ret;

	mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
	ret = dma_mapping_error(d, mapping);
	if (unlikely(ret)) {
		if (net_ratelimit())
4001
			netdev_err(tp->dev, "Failed to map TX data!\n");
4002 4003 4004 4005 4006
		return ret;
	}

	txd->addr = cpu_to_le64(mapping);
	txd->opts2 = cpu_to_le32(opts[1]);
4007

4008
	opts1 = opts[0] | len;
4009
	if (entry == NUM_TX_DESC - 1)
4010 4011 4012 4013
		opts1 |= RingEnd;
	if (desc_own)
		opts1 |= DescOwn;
	txd->opts1 = cpu_to_le32(opts1);
4014

4015 4016 4017
	tp->tx_skb[entry].len = len;

	return 0;
4018 4019
}

L
Linus Torvalds 已提交
4020
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
4021
			      const u32 *opts, unsigned int entry)
L
Linus Torvalds 已提交
4022 4023
{
	struct skb_shared_info *info = skb_shinfo(skb);
4024
	unsigned int cur_frag;
L
Linus Torvalds 已提交
4025 4026

	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
E
Eric Dumazet 已提交
4027
		const skb_frag_t *frag = info->frags + cur_frag;
4028 4029
		void *addr = skb_frag_address(frag);
		u32 len = skb_frag_size(frag);
L
Linus Torvalds 已提交
4030 4031 4032

		entry = (entry + 1) % NUM_TX_DESC;

4033
		if (unlikely(rtl8169_tx_map(tp, opts, len, addr, entry, true)))
4034
			goto err_out;
L
Linus Torvalds 已提交
4035 4036
	}

4037
	return 0;
4038 4039 4040 4041

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

4044
static bool rtl_test_hw_pad_bug(struct rtl8169_private *tp)
4045
{
4046 4047 4048 4049 4050 4051 4052 4053 4054
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_34:
	case RTL_GIGA_MAC_VER_60:
	case RTL_GIGA_MAC_VER_61:
	case RTL_GIGA_MAC_VER_63:
		return true;
	default:
		return false;
	}
4055 4056
}

4057
static void rtl8169_tso_csum_v1(struct sk_buff *skb, u32 *opts)
L
Linus Torvalds 已提交
4058
{
4059 4060
	u32 mss = skb_shinfo(skb)->gso_size;

F
Francois Romieu 已提交
4061 4062
	if (mss) {
		opts[0] |= TD_LSO;
4063
		opts[0] |= mss << TD0_MSS_SHIFT;
H
hayeswang 已提交
4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078
	} 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 已提交
4079
	u32 transport_offset = (u32)skb_transport_offset(skb);
4080 4081
	struct skb_shared_info *shinfo = skb_shinfo(skb);
	u32 mss = shinfo->gso_size;
H
hayeswang 已提交
4082 4083

	if (mss) {
4084
		if (shinfo->gso_type & SKB_GSO_TCPV4) {
H
hayeswang 已提交
4085
			opts[0] |= TD1_GTSENV4;
4086
		} else if (shinfo->gso_type & SKB_GSO_TCPV6) {
4087
			if (skb_cow_head(skb, 0))
H
hayeswang 已提交
4088 4089
				return false;

4090
			tcp_v6_gso_csum_prep(skb);
H
hayeswang 已提交
4091
			opts[0] |= TD1_GTSENV6;
4092
		} else {
H
hayeswang 已提交
4093 4094 4095
			WARN_ON_ONCE(1);
		}

H
hayeswang 已提交
4096
		opts[0] |= transport_offset << GTTCPHO_SHIFT;
4097
		opts[1] |= mss << TD1_MSS_SHIFT;
F
Francois Romieu 已提交
4098
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
H
hayeswang 已提交
4099
		u8 ip_protocol;
L
Linus Torvalds 已提交
4100

4101
		switch (vlan_get_protocol(skb)) {
H
hayeswang 已提交
4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120
		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 已提交
4121 4122
		else
			WARN_ON_ONCE(1);
H
hayeswang 已提交
4123 4124

		opts[1] |= transport_offset << TCPHO_SHIFT;
4125
	} else {
4126
		if (unlikely(skb->len < ETH_ZLEN && rtl_test_hw_pad_bug(tp)))
4127 4128
			/* eth_skb_pad would free the skb on error */
			return !__skb_put_padto(skb, ETH_ZLEN, false);
L
Linus Torvalds 已提交
4129
	}
H
hayeswang 已提交
4130

4131
	return true;
L
Linus Torvalds 已提交
4132 4133
}

4134
static bool rtl_tx_slots_avail(struct rtl8169_private *tp)
4135
{
4136 4137
	unsigned int slots_avail = READ_ONCE(tp->dirty_tx) + NUM_TX_DESC
					- READ_ONCE(tp->cur_tx);
4138 4139

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

4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154
/* 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;
	}
}

H
Heiner Kallweit 已提交
4155 4156 4157 4158 4159 4160 4161 4162
static void rtl8169_doorbell(struct rtl8169_private *tp)
{
	if (rtl_is_8125(tp))
		RTL_W16(tp, TxPoll_8125, BIT(0));
	else
		RTL_W8(tp, TxPoll, NPQ);
}

4163 4164
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
				      struct net_device *dev)
L
Linus Torvalds 已提交
4165
{
4166
	unsigned int frags = skb_shinfo(skb)->nr_frags;
L
Linus Torvalds 已提交
4167
	struct rtl8169_private *tp = netdev_priv(dev);
4168
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
4169 4170 4171 4172
	struct TxDesc *txd_first, *txd_last;
	bool stop_queue, door_bell;
	u32 opts[2];

4173
	if (unlikely(!rtl_tx_slots_avail(tp))) {
4174 4175
		if (net_ratelimit())
			netdev_err(dev, "BUG! Tx Ring full when queue awake!\n");
4176
		goto err_stop_0;
L
Linus Torvalds 已提交
4177 4178
	}

4179
	opts[1] = rtl8169_tx_vlan_tag(skb);
4180
	opts[0] = 0;
4181

4182
	if (!rtl_chip_supports_csum_v2(tp))
4183
		rtl8169_tso_csum_v1(skb, opts);
4184
	else if (!rtl8169_tso_csum_v2(tp, skb, opts))
4185 4186
		goto err_dma_0;

4187 4188 4189
	if (unlikely(rtl8169_tx_map(tp, opts, skb_headlen(skb), skb->data,
				    entry, false)))
		goto err_dma_0;
L
Linus Torvalds 已提交
4190

4191 4192
	txd_first = tp->TxDescArray + entry;

4193 4194
	if (frags) {
		if (rtl8169_xmit_frags(tp, skb, opts, entry))
4195
			goto err_dma_1;
4196
		entry = (entry + frags) % NUM_TX_DESC;
L
Linus Torvalds 已提交
4197 4198
	}

4199 4200 4201
	txd_last = tp->TxDescArray + entry;
	txd_last->opts1 |= cpu_to_le32(LastFrag);
	tp->tx_skb[entry].skb = skb;
F
Francois Romieu 已提交
4202

4203 4204
	skb_tx_timestamp(skb);

4205 4206
	/* Force memory writes to complete before releasing descriptor */
	dma_wmb();
L
Linus Torvalds 已提交
4207

H
Heiner Kallweit 已提交
4208 4209
	door_bell = __netdev_sent_queue(dev, skb->len, netdev_xmit_more());

4210
	txd_first->opts1 |= cpu_to_le32(DescOwn | FirstFrag);
L
Linus Torvalds 已提交
4211

4212 4213
	/* rtl_tx needs to see descriptor changes before updated tp->cur_tx */
	smp_wmb();
L
Linus Torvalds 已提交
4214

4215
	WRITE_ONCE(tp->cur_tx, tp->cur_tx + frags + 1);
4216

4217
	stop_queue = !rtl_tx_slots_avail(tp);
H
Heiner Kallweit 已提交
4218
	if (unlikely(stop_queue)) {
4219 4220 4221 4222 4223
		/* 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);
4224 4225 4226 4227 4228 4229 4230
		/* 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.
		 */
4231
		smp_mb__after_atomic();
4232
		if (rtl_tx_slots_avail(tp))
4233
			netif_start_queue(dev);
4234
		door_bell = true;
L
Linus Torvalds 已提交
4235 4236
	}

4237 4238 4239
	if (door_bell)
		rtl8169_doorbell(tp);

4240
	return NETDEV_TX_OK;
L
Linus Torvalds 已提交
4241

4242
err_dma_1:
4243
	rtl8169_unmap_tx_skb(tp, entry);
4244
err_dma_0:
4245
	dev_kfree_skb_any(skb);
4246 4247 4248 4249
	dev->stats.tx_dropped++;
	return NETDEV_TX_OK;

err_stop_0:
L
Linus Torvalds 已提交
4250
	netif_stop_queue(dev);
4251
	dev->stats.tx_dropped++;
4252
	return NETDEV_TX_BUSY;
L
Linus Torvalds 已提交
4253 4254
}

4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285
static unsigned int rtl_last_frag_len(struct sk_buff *skb)
{
	struct skb_shared_info *info = skb_shinfo(skb);
	unsigned int nr_frags = info->nr_frags;

	if (!nr_frags)
		return UINT_MAX;

	return skb_frag_size(info->frags + nr_frags - 1);
}

/* Workaround for hw issues with TSO on RTL8168evl */
static netdev_features_t rtl8168evl_fix_tso(struct sk_buff *skb,
					    netdev_features_t features)
{
	/* IPv4 header has options field */
	if (vlan_get_protocol(skb) == htons(ETH_P_IP) &&
	    ip_hdrlen(skb) > sizeof(struct iphdr))
		features &= ~NETIF_F_ALL_TSO;

	/* IPv4 TCP header has options field */
	else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4 &&
		 tcp_hdrlen(skb) > sizeof(struct tcphdr))
		features &= ~NETIF_F_ALL_TSO;

	else if (rtl_last_frag_len(skb) <= 6)
		features &= ~NETIF_F_ALL_TSO;

	return features;
}

4286 4287 4288 4289 4290 4291 4292 4293
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)) {
4294 4295 4296
		if (tp->mac_version == RTL_GIGA_MAC_VER_34)
			features = rtl8168evl_fix_tso(skb, features);

4297 4298 4299 4300
		if (transport_offset > GTTCPHO_MAX &&
		    rtl_chip_supports_csum_v2(tp))
			features &= ~NETIF_F_ALL_TSO;
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
4301 4302 4303
		/* work around hw bug on some chip versions */
		if (skb->len < ETH_ZLEN)
			features &= ~NETIF_F_CSUM_MASK;
4304 4305 4306 4307 4308 4309 4310 4311 4312

		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 已提交
4313 4314 4315 4316
static void rtl8169_pcierr_interrupt(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
4317 4318
	int pci_status_errs;
	u16 pci_cmd;
L
Linus Torvalds 已提交
4319 4320 4321

	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);

4322 4323
	pci_status_errs = pci_status_get_and_clear_errors(pdev);

4324 4325 4326
	if (net_ratelimit())
		netdev_err(dev, "PCI error (cmd = 0x%04x, status_errs = 0x%04x)\n",
			   pci_cmd, pci_status_errs);
L
Linus Torvalds 已提交
4327 4328 4329
	/*
	 * The recovery sequence below admits a very elaborated explanation:
	 * - it seems to work;
4330 4331
	 * - I did not see what else could be done;
	 * - it makes iop3xx happy.
L
Linus Torvalds 已提交
4332 4333 4334
	 *
	 * Feel free to adjust to your needs.
	 */
4335
	if (pdev->broken_parity_status)
4336 4337 4338 4339 4340
		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 已提交
4341

4342
	rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
L
Linus Torvalds 已提交
4343 4344
}

4345 4346
static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
		   int budget)
L
Linus Torvalds 已提交
4347
{
H
Heiner Kallweit 已提交
4348
	unsigned int dirty_tx, bytes_compl = 0, pkts_compl = 0;
4349
	struct sk_buff *skb;
L
Linus Torvalds 已提交
4350 4351 4352

	dirty_tx = tp->dirty_tx;

H
Heiner Kallweit 已提交
4353
	while (READ_ONCE(tp->cur_tx) != dirty_tx) {
L
Linus Torvalds 已提交
4354 4355 4356 4357 4358 4359 4360
		unsigned int entry = dirty_tx % NUM_TX_DESC;
		u32 status;

		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
		if (status & DescOwn)
			break;

4361
		skb = tp->tx_skb[entry].skb;
4362 4363
		rtl8169_unmap_tx_skb(tp, entry);

4364
		if (skb) {
4365
			pkts_compl++;
4366 4367
			bytes_compl += skb->len;
			napi_consume_skb(skb, budget);
L
Linus Torvalds 已提交
4368 4369 4370 4371 4372
		}
		dirty_tx++;
	}

	if (tp->dirty_tx != dirty_tx) {
4373
		netdev_completed_queue(dev, pkts_compl, bytes_compl);
4374
		dev_sw_netstats_tx_add(dev, pkts_compl, bytes_compl);
4375

4376 4377 4378 4379 4380 4381 4382
		/* 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.
		 */
H
Heiner Kallweit 已提交
4383
		smp_store_mb(tp->dirty_tx, dirty_tx);
4384
		if (netif_queue_stopped(dev) && rtl_tx_slots_avail(tp))
L
Linus Torvalds 已提交
4385
			netif_wake_queue(dev);
4386 4387 4388 4389 4390
		/*
		 * 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
4391 4392
		 * If skb is NULL then we come here again once a tx irq is
		 * triggered after the last fragment is marked transmitted.
4393
		 */
4394
		if (tp->cur_tx != dirty_tx && skb)
H
Heiner Kallweit 已提交
4395
			rtl8169_doorbell(tp);
L
Linus Torvalds 已提交
4396 4397 4398
	}
}

4399 4400 4401 4402 4403
static inline int rtl8169_fragmented_frame(u32 status)
{
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
}

E
Eric Dumazet 已提交
4404
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
L
Linus Torvalds 已提交
4405 4406 4407 4408
{
	u32 status = opts1 & RxProtoMask;

	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
S
Shan Wei 已提交
4409
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
L
Linus Torvalds 已提交
4410 4411
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	else
4412
		skb_checksum_none_assert(skb);
L
Linus Torvalds 已提交
4413 4414
}

H
Heiner Kallweit 已提交
4415
static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, int budget)
L
Linus Torvalds 已提交
4416
{
4417
	struct device *d = tp_to_dev(tp);
H
Heiner Kallweit 已提交
4418
	int count;
L
Linus Torvalds 已提交
4419

H
Heiner Kallweit 已提交
4420 4421
	for (count = 0; count < budget; count++, tp->cur_rx++) {
		unsigned int pkt_size, entry = tp->cur_rx % NUM_RX_DESC;
4422
		struct RxDesc *desc = tp->RxDescArray + entry;
4423 4424 4425
		struct sk_buff *skb;
		const void *rx_buf;
		dma_addr_t addr;
L
Linus Torvalds 已提交
4426 4427
		u32 status;

4428
		status = le32_to_cpu(desc->opts1);
L
Linus Torvalds 已提交
4429 4430
		if (status & DescOwn)
			break;
4431 4432 4433 4434 4435 4436 4437

		/* 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 已提交
4438
		if (unlikely(status & RxRES)) {
4439 4440 4441
			if (net_ratelimit())
				netdev_warn(dev, "Rx ERROR. status = %08x\n",
					    status);
4442
			dev->stats.rx_errors++;
L
Linus Torvalds 已提交
4443
			if (status & (RxRWT | RxRUNT))
4444
				dev->stats.rx_length_errors++;
L
Linus Torvalds 已提交
4445
			if (status & RxCRC)
4446
				dev->stats.rx_crc_errors++;
4447

4448
			if (!(dev->features & NETIF_F_RXALL))
4449
				goto release_descriptor;
4450 4451 4452
			else if (status & RxRWT || !(status & (RxRUNT | RxCRC)))
				goto release_descriptor;
		}
L
Linus Torvalds 已提交
4453

4454 4455 4456
		pkt_size = status & GENMASK(13, 0);
		if (likely(!(dev->features & NETIF_F_RXFCS)))
			pkt_size -= ETH_FCS_LEN;
H
Heiner Kallweit 已提交
4457

4458 4459 4460 4461 4462 4463 4464 4465
		/* 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))) {
			dev->stats.rx_dropped++;
			dev->stats.rx_length_errors++;
			goto release_descriptor;
		}
4466

4467 4468 4469 4470 4471
		skb = napi_alloc_skb(&tp->napi, pkt_size);
		if (unlikely(!skb)) {
			dev->stats.rx_dropped++;
			goto release_descriptor;
		}
L
Linus Torvalds 已提交
4472

4473 4474
		addr = le64_to_cpu(desc->addr);
		rx_buf = page_address(tp->Rx_databuff[entry]);
4475

4476 4477 4478 4479 4480 4481
		dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
		prefetch(rx_buf);
		skb_copy_to_linear_data(skb, rx_buf, pkt_size);
		skb->tail += pkt_size;
		skb->len = pkt_size;
		dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
4482

4483 4484 4485 4486 4487 4488 4489 4490 4491 4492
		rtl8169_rx_csum(skb, status);
		skb->protocol = eth_type_trans(skb, dev);

		rtl8169_rx_vlan_tag(desc, skb);

		if (skb->pkt_type == PACKET_MULTICAST)
			dev->stats.multicast++;

		napi_gro_receive(&tp->napi, skb);

4493
		dev_sw_netstats_rx_add(dev, pkt_size);
4494
release_descriptor:
4495
		rtl8169_mark_to_asic(desc);
L
Linus Torvalds 已提交
4496 4497 4498 4499 4500
	}

	return count;
}

F
Francois Romieu 已提交
4501
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
L
Linus Torvalds 已提交
4502
{
4503
	struct rtl8169_private *tp = dev_instance;
4504
	u32 status = rtl_get_events(tp);
L
Linus Torvalds 已提交
4505

4506
	if ((status & 0xffff) == 0xffff || !(status & tp->irq_mask))
4507
		return IRQ_NONE;
L
Linus Torvalds 已提交
4508

4509 4510 4511 4512
	if (unlikely(status & SYSErr)) {
		rtl8169_pcierr_interrupt(tp->dev);
		goto out;
	}
4513

4514 4515
	if (status & LinkChg)
		phy_mac_interrupt(tp->phydev);
L
Linus Torvalds 已提交
4516

4517 4518 4519
	if (unlikely(status & RxFIFOOver &&
	    tp->mac_version == RTL_GIGA_MAC_VER_11)) {
		netif_stop_queue(tp->dev);
4520
		rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
4521
	}
L
Linus Torvalds 已提交
4522

4523
	rtl_irq_disable(tp);
4524
	napi_schedule(&tp->napi);
4525 4526
out:
	rtl_ack_events(tp, status);
L
Linus Torvalds 已提交
4527

4528
	return IRQ_HANDLED;
L
Linus Torvalds 已提交
4529 4530
}

4531 4532 4533 4534
static void rtl_task(struct work_struct *work)
{
	struct rtl8169_private *tp =
		container_of(work, struct rtl8169_private, wk.work);
4535

4536
	rtnl_lock();
4537

H
Heiner Kallweit 已提交
4538
	if (!netif_running(tp->dev) ||
4539
	    !test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
4540 4541
		goto out_unlock;

4542
	if (test_and_clear_bit(RTL_FLAG_TASK_RESET_PENDING, tp->wk.flags)) {
H
Heiner Kallweit 已提交
4543
		rtl_reset_work(tp);
4544 4545
		netif_wake_queue(tp->dev);
	}
4546
out_unlock:
4547
	rtnl_unlock();
4548 4549
}

4550
static int rtl8169_poll(struct napi_struct *napi, int budget)
L
Linus Torvalds 已提交
4551
{
4552 4553
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
	struct net_device *dev = tp->dev;
4554
	int work_done;
4555

H
Heiner Kallweit 已提交
4556
	work_done = rtl_rx(dev, tp, budget);
4557

4558
	rtl_tx(dev, tp, budget);
L
Linus Torvalds 已提交
4559

4560
	if (work_done < budget && napi_complete_done(napi, work_done))
4561
		rtl_irq_enable(tp);
L
Linus Torvalds 已提交
4562

4563
	return work_done;
L
Linus Torvalds 已提交
4564 4565
}

4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577
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())
4578
		phy_print_status(tp->phydev);
4579 4580 4581 4582
}

static int r8169_phy_connect(struct rtl8169_private *tp)
{
4583
	struct phy_device *phydev = tp->phydev;
4584 4585 4586
	phy_interface_t phy_mode;
	int ret;

4587
	phy_mode = tp->supports_gmii ? PHY_INTERFACE_MODE_GMII :
4588 4589 4590 4591 4592 4593 4594
		   PHY_INTERFACE_MODE_MII;

	ret = phy_connect_direct(tp->dev, phydev, r8169_phylink_handler,
				 phy_mode);
	if (ret)
		return ret;

4595
	if (!tp->supports_gmii)
4596 4597
		phy_set_max_speed(phydev, SPEED_100);

4598
	phy_support_asym_pause(phydev);
4599 4600 4601 4602 4603 4604

	phy_attached_info(phydev);

	return 0;
}

4605
static void rtl8169_down(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
4606
{
4607 4608
	/* Clear all task flags */
	bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);
4609

4610
	phy_stop(tp->phydev);
L
Linus Torvalds 已提交
4611

4612 4613
	rtl8169_update_counters(tp);

4614
	rtl8169_cleanup(tp, true);
L
Linus Torvalds 已提交
4615

F
françois romieu 已提交
4616
	rtl_pll_power_down(tp);
L
Linus Torvalds 已提交
4617 4618
}

H
Heiner Kallweit 已提交
4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629
static void rtl8169_up(struct rtl8169_private *tp)
{
	rtl_pll_power_up(tp);
	rtl8169_init_phy(tp);
	napi_enable(&tp->napi);
	set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
	rtl_reset_work(tp);

	phy_start(tp->phydev);
}

L
Linus Torvalds 已提交
4630 4631 4632 4633 4634
static int rtl8169_close(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;

4635 4636
	pm_runtime_get_sync(&pdev->dev);

4637 4638 4639
	netif_stop_queue(dev);
	rtl8169_down(tp);
	rtl8169_rx_clear(tp);
L
Linus Torvalds 已提交
4640

4641 4642
	cancel_work_sync(&tp->wk.work);

4643
	phy_disconnect(tp->phydev);
4644

4645
	free_irq(pci_irq_vector(pdev, 0), tp);
L
Linus Torvalds 已提交
4646

4647 4648 4649 4650
	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 已提交
4651 4652 4653
	tp->TxDescArray = NULL;
	tp->RxDescArray = NULL;

4654 4655
	pm_runtime_put_sync(&pdev->dev);

L
Linus Torvalds 已提交
4656 4657 4658
	return 0;
}

4659 4660 4661 4662 4663
#ifdef CONFIG_NET_POLL_CONTROLLER
static void rtl8169_netpoll(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

V
Ville Syrjälä 已提交
4664
	rtl8169_interrupt(pci_irq_vector(tp->pci_dev, 0), tp);
4665 4666 4667
}
#endif

4668 4669 4670 4671
static int rtl_open(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
4672
	unsigned long irqflags;
4673 4674 4675 4676 4677
	int retval = -ENOMEM;

	pm_runtime_get_sync(&pdev->dev);

	/*
4678
	 * Rx and Tx descriptors needs 256 bytes alignment.
4679 4680 4681 4682 4683
	 * dma_alloc_coherent provides more.
	 */
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
					     &tp->TxPhyAddr, GFP_KERNEL);
	if (!tp->TxDescArray)
4684
		goto out;
4685 4686 4687 4688 4689 4690

	tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
					     &tp->RxPhyAddr, GFP_KERNEL);
	if (!tp->RxDescArray)
		goto err_free_tx_0;

4691
	retval = rtl8169_init_ring(tp);
4692 4693 4694 4695 4696
	if (retval < 0)
		goto err_free_rx_1;

	rtl_request_firmware(tp);

4697
	irqflags = pci_dev_msi_enabled(pdev) ? IRQF_NO_THREAD : IRQF_SHARED;
4698
	retval = request_irq(pci_irq_vector(pdev, 0), rtl8169_interrupt,
4699
			     irqflags, dev->name, tp);
4700 4701 4702
	if (retval < 0)
		goto err_release_fw_2;

4703 4704 4705 4706
	retval = r8169_phy_connect(tp);
	if (retval)
		goto err_free_irq;

H
Heiner Kallweit 已提交
4707
	rtl8169_up(tp);
4708
	rtl8169_init_counter_offsets(tp);
4709 4710
	netif_start_queue(dev);
out:
4711 4712
	pm_runtime_put_sync(&pdev->dev);

4713 4714
	return retval;

4715
err_free_irq:
4716
	free_irq(pci_irq_vector(pdev, 0), tp);
4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730
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;
	goto out;
}

4731
static void
J
Junchang Wang 已提交
4732
rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
L
Linus Torvalds 已提交
4733 4734
{
	struct rtl8169_private *tp = netdev_priv(dev);
4735
	struct pci_dev *pdev = tp->pci_dev;
4736
	struct rtl8169_counters *counters = tp->counters;
L
Linus Torvalds 已提交
4737

4738 4739
	pm_runtime_get_noresume(&pdev->dev);

4740
	netdev_stats_to_stats64(stats, &dev->stats);
4741
	dev_fetch_sw_netstats(stats, dev->tstats);
J
Junchang Wang 已提交
4742

4743
	/*
C
Corentin Musard 已提交
4744
	 * Fetch additional counter values missing in stats collected by driver
4745 4746
	 * from tally counters.
	 */
4747
	if (pm_runtime_active(&pdev->dev))
4748
		rtl8169_update_counters(tp);
4749 4750 4751 4752 4753

	/*
	 * Subtract values fetched during initalization.
	 * See rtl8169_init_counter_offsets for a description why we do that.
	 */
4754
	stats->tx_errors = le64_to_cpu(counters->tx_errors) -
4755
		le64_to_cpu(tp->tc_offset.tx_errors);
4756
	stats->collisions = le32_to_cpu(counters->tx_multi_collision) -
4757
		le32_to_cpu(tp->tc_offset.tx_multi_collision);
4758
	stats->tx_aborted_errors = le16_to_cpu(counters->tx_aborted) -
4759
		le16_to_cpu(tp->tc_offset.tx_aborted);
4760 4761
	stats->rx_missed_errors = le16_to_cpu(counters->rx_missed) -
		le16_to_cpu(tp->tc_offset.rx_missed);
4762

4763
	pm_runtime_put_noidle(&pdev->dev);
L
Linus Torvalds 已提交
4764 4765
}

H
Heiner Kallweit 已提交
4766
static void rtl8169_net_suspend(struct rtl8169_private *tp)
4767
{
H
Heiner Kallweit 已提交
4768
	netif_device_detach(tp->dev);
4769 4770 4771

	if (netif_running(tp->dev))
		rtl8169_down(tp);
4772 4773 4774 4775
}

#ifdef CONFIG_PM

H
Heiner Kallweit 已提交
4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787
static int rtl8169_net_resume(struct rtl8169_private *tp)
{
	rtl_rar_set(tp, tp->dev->dev_addr);

	if (tp->TxDescArray)
		rtl8169_up(tp);

	netif_device_attach(tp->dev);

	return 0;
}

4788
static int __maybe_unused rtl8169_suspend(struct device *device)
4789
{
H
Heiner Kallweit 已提交
4790
	struct rtl8169_private *tp = dev_get_drvdata(device);
4791

4792
	rtnl_lock();
H
Heiner Kallweit 已提交
4793
	rtl8169_net_suspend(tp);
H
Heiner Kallweit 已提交
4794 4795
	if (!device_may_wakeup(tp_to_dev(tp)))
		clk_disable_unprepare(tp->clk);
4796
	rtnl_unlock();
4797

4798 4799 4800
	return 0;
}

H
Heiner Kallweit 已提交
4801
static int __maybe_unused rtl8169_resume(struct device *device)
4802
{
H
Heiner Kallweit 已提交
4803
	struct rtl8169_private *tp = dev_get_drvdata(device);
4804

H
Heiner Kallweit 已提交
4805 4806
	if (!device_may_wakeup(tp_to_dev(tp)))
		clk_prepare_enable(tp->clk);
4807

4808 4809 4810
	/* Reportedly at least Asus X453MA truncates packets otherwise */
	if (tp->mac_version == RTL_GIGA_MAC_VER_37)
		rtl_init_rxcfg(tp);
4811

H
Heiner Kallweit 已提交
4812
	return rtl8169_net_resume(tp);
4813 4814 4815 4816
}

static int rtl8169_runtime_suspend(struct device *device)
{
H
Heiner Kallweit 已提交
4817
	struct rtl8169_private *tp = dev_get_drvdata(device);
4818

4819 4820
	if (!tp->TxDescArray) {
		netif_device_detach(tp->dev);
4821
		return 0;
4822
	}
4823

4824
	rtnl_lock();
4825
	__rtl8169_set_wol(tp, WAKE_PHY);
H
Heiner Kallweit 已提交
4826
	rtl8169_net_suspend(tp);
4827
	rtnl_unlock();
4828 4829 4830 4831 4832 4833

	return 0;
}

static int rtl8169_runtime_resume(struct device *device)
{
H
Heiner Kallweit 已提交
4834
	struct rtl8169_private *tp = dev_get_drvdata(device);
4835

4836 4837
	__rtl8169_set_wol(tp, tp->saved_wolopts);

H
Heiner Kallweit 已提交
4838
	return rtl8169_net_resume(tp);
4839 4840
}

4841 4842
static int rtl8169_runtime_idle(struct device *device)
{
H
Heiner Kallweit 已提交
4843
	struct rtl8169_private *tp = dev_get_drvdata(device);
4844

H
Heiner Kallweit 已提交
4845
	if (!netif_running(tp->dev) || !netif_carrier_ok(tp->dev))
4846 4847 4848
		pm_schedule_suspend(device, 10000);

	return -EBUSY;
4849 4850
}

4851
static const struct dev_pm_ops rtl8169_pm_ops = {
4852 4853 4854
	SET_SYSTEM_SLEEP_PM_OPS(rtl8169_suspend, rtl8169_resume)
	SET_RUNTIME_PM_OPS(rtl8169_runtime_suspend, rtl8169_runtime_resume,
			   rtl8169_runtime_idle)
4855 4856
};

4857
#endif /* CONFIG_PM */
4858

4859 4860 4861 4862 4863 4864 4865 4866 4867
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);

4868
		RTL_W8(tp, ChipCmd, CmdRxEnb);
4869
		rtl_pci_commit(tp);
4870 4871 4872 4873 4874 4875
		break;
	default:
		break;
	}
}

F
Francois Romieu 已提交
4876 4877
static void rtl_shutdown(struct pci_dev *pdev)
{
H
Heiner Kallweit 已提交
4878
	struct rtl8169_private *tp = pci_get_drvdata(pdev);
4879

4880
	rtnl_lock();
H
Heiner Kallweit 已提交
4881
	rtl8169_net_suspend(tp);
4882
	rtnl_unlock();
F
Francois Romieu 已提交
4883

F
Francois Romieu 已提交
4884
	/* Restore original MAC address */
H
Heiner Kallweit 已提交
4885
	rtl_rar_set(tp, tp->dev->perm_addr);
4886

4887
	if (system_state == SYSTEM_POWER_OFF) {
4888
		if (tp->saved_wolopts) {
4889 4890
			rtl_wol_suspend_quirk(tp);
			rtl_wol_shutdown_quirk(tp);
4891 4892
		}

4893
		pci_wake_from_d3(pdev, tp->saved_wolopts);
4894 4895 4896
		pci_set_power_state(pdev, PCI_D3hot);
	}
}
4897

B
Bill Pemberton 已提交
4898
static void rtl_remove_one(struct pci_dev *pdev)
4899
{
H
Heiner Kallweit 已提交
4900
	struct rtl8169_private *tp = pci_get_drvdata(pdev);
4901

H
Heiner Kallweit 已提交
4902 4903
	if (pci_dev_run_wake(pdev))
		pm_runtime_get_noresume(&pdev->dev);
4904

H
Heiner Kallweit 已提交
4905
	unregister_netdev(tp->dev);
4906

H
Heiner Kallweit 已提交
4907 4908
	if (r8168_check_dash(tp))
		rtl8168_driver_stop(tp);
4909

H
Heiner Kallweit 已提交
4910
	rtl_release_firmware(tp);
4911 4912

	/* restore original MAC address */
H
Heiner Kallweit 已提交
4913
	rtl_rar_set(tp, tp->dev->perm_addr);
4914 4915
}

4916
static const struct net_device_ops rtl_netdev_ops = {
4917
	.ndo_open		= rtl_open,
4918 4919 4920
	.ndo_stop		= rtl8169_close,
	.ndo_get_stats64	= rtl8169_get_stats64,
	.ndo_start_xmit		= rtl8169_start_xmit,
4921
	.ndo_features_check	= rtl8169_features_check,
4922 4923 4924 4925 4926 4927
	.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,
4928
	.ndo_do_ioctl		= phy_do_ioctl_running,
4929 4930 4931 4932 4933 4934 4935
	.ndo_set_rx_mode	= rtl_set_rx_mode,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= rtl8169_netpoll,
#endif

};

4936 4937
static void rtl_set_irq_mask(struct rtl8169_private *tp)
{
4938
	tp->irq_mask = RxOK | RxErr | TxOK | TxErr | LinkChg;
4939 4940 4941 4942 4943 4944 4945 4946 4947 4948

	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;
}

4949
static int rtl_alloc_irq(struct rtl8169_private *tp)
4950
{
4951
	unsigned int flags;
4952

4953 4954
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
4955
		rtl_unlock_config_regs(tp);
4956
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable);
4957
		rtl_lock_config_regs(tp);
4958
		fallthrough;
4959
	case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_17:
4960
		flags = PCI_IRQ_LEGACY;
4961 4962
		break;
	default:
4963
		flags = PCI_IRQ_ALL_TYPES;
4964
		break;
4965
	}
4966 4967

	return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);
4968 4969
}

4970 4971 4972 4973
static void rtl_read_mac_address(struct rtl8169_private *tp,
				 u8 mac_addr[ETH_ALEN])
{
	/* Get MAC address */
4974
	if (rtl_is_8168evl_up(tp) && tp->mac_version != RTL_GIGA_MAC_VER_34) {
4975
		u32 value;
T
Thierry Reding 已提交
4976

4977 4978
		value = rtl_eri_read(tp, 0xe0);
		put_unaligned_le32(value, mac_addr);
4979
		value = rtl_eri_read(tp, 0xe4);
4980
		put_unaligned_le16(value, mac_addr + 4);
H
Heiner Kallweit 已提交
4981 4982
	} else if (rtl_is_8125(tp)) {
		rtl_read_mac_from_reg(tp, mac_addr, MAC0_BKP);
4983 4984 4985
	}
}

H
Hayes Wang 已提交
4986 4987
DECLARE_RTL_COND(rtl_link_list_ready_cond)
{
4988
	return RTL_R8(tp, MCU) & LINK_LIST_RDY;
H
Hayes Wang 已提交
4989 4990
}

4991 4992 4993 4994 4995
static void r8168g_wait_ll_share_fifo_ready(struct rtl8169_private *tp)
{
	rtl_loop_wait_high(tp, &rtl_link_list_ready_cond, 100, 42);
}

4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 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
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 已提交
5033
	snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x", pci_dev_id(pdev));
5034 5035 5036 5037

	new_bus->read = r8169_mdio_read_reg;
	new_bus->write = r8169_mdio_write_reg;

5038
	ret = devm_mdiobus_register(&pdev->dev, new_bus);
5039 5040 5041
	if (ret)
		return ret;

5042 5043
	tp->phydev = mdiobus_get_phy(new_bus, 0);
	if (!tp->phydev) {
5044
		return -ENODEV;
5045 5046 5047 5048
	} else if (!tp->phydev->drv) {
		/* Most chip versions fail with the genphy driver.
		 * Therefore ensure that the dedicated PHY driver is loaded.
		 */
5049 5050
		dev_err(&pdev->dev, "no dedicated PHY driver found for PHY ID 0x%08x, maybe realtek.ko needs to be added to initramfs?\n",
			tp->phydev->phy_id);
5051
		return -EUNATCH;
5052 5053
	}

5054
	/* PHY will be woken up in rtl_open() */
5055
	phy_suspend(tp->phydev);
5056 5057 5058 5059

	return 0;
}

B
Bill Pemberton 已提交
5060
static void rtl_hw_init_8168g(struct rtl8169_private *tp)
H
Hayes Wang 已提交
5061
{
5062
	rtl_enable_rxdvgate(tp);
H
Hayes Wang 已提交
5063

5064
	RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) & ~(CmdTxEnb | CmdRxEnb));
H
Hayes Wang 已提交
5065
	msleep(1);
5066
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
H
Hayes Wang 已提交
5067

5068
	r8168_mac_ocp_modify(tp, 0xe8de, BIT(14), 0);
5069
	r8168g_wait_ll_share_fifo_ready(tp);
H
Hayes Wang 已提交
5070

5071
	r8168_mac_ocp_modify(tp, 0xe8de, 0, BIT(15));
5072
	r8168g_wait_ll_share_fifo_ready(tp);
H
Hayes Wang 已提交
5073 5074
}

H
Heiner Kallweit 已提交
5075 5076
static void rtl_hw_init_8125(struct rtl8169_private *tp)
{
5077
	rtl_enable_rxdvgate(tp);
H
Heiner Kallweit 已提交
5078 5079 5080 5081 5082 5083

	RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) & ~(CmdTxEnb | CmdRxEnb));
	msleep(1);
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);

	r8168_mac_ocp_modify(tp, 0xe8de, BIT(14), 0);
5084
	r8168g_wait_ll_share_fifo_ready(tp);
H
Heiner Kallweit 已提交
5085 5086 5087 5088

	r8168_mac_ocp_write(tp, 0xc0aa, 0x07d0);
	r8168_mac_ocp_write(tp, 0xc0a6, 0x0150);
	r8168_mac_ocp_write(tp, 0xc01e, 0x5555);
5089
	r8168g_wait_ll_share_fifo_ready(tp);
H
Heiner Kallweit 已提交
5090 5091
}

B
Bill Pemberton 已提交
5092
static void rtl_hw_initialize(struct rtl8169_private *tp)
H
Hayes Wang 已提交
5093 5094
{
	switch (tp->mac_version) {
H
Heiner Kallweit 已提交
5095
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
5096
		rtl8168ep_stop_cmac(tp);
5097
		fallthrough;
5098
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48:
C
Chun-Hao Lin 已提交
5099 5100
		rtl_hw_init_8168g(tp);
		break;
5101
	case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63:
H
Heiner Kallweit 已提交
5102 5103
		rtl_hw_init_8125(tp);
		break;
H
Hayes Wang 已提交
5104 5105 5106 5107 5108
	default:
		break;
	}
}

5109 5110 5111 5112
static int rtl_jumbo_max(struct rtl8169_private *tp)
{
	/* Non-GBit versions don't support jumbo frames */
	if (!tp->supports_gmii)
5113
		return 0;
5114 5115 5116

	switch (tp->mac_version) {
	/* RTL8169 */
5117
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131
		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;
	}
}

5132 5133 5134 5135 5136
static void rtl_disable_clk(void *data)
{
	clk_disable_unprepare(data);
}

5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148
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;
5149 5150
		else
			dev_err_probe(d, rc, "failed to get clk\n");
5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162
	} 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;
}

5163 5164 5165 5166
static void rtl_init_mac_address(struct rtl8169_private *tp)
{
	struct net_device *dev = tp->dev;
	u8 *mac_addr = dev->dev_addr;
5167
	int rc;
5168 5169 5170 5171 5172 5173 5174 5175 5176

	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;

5177
	rtl_read_mac_from_reg(tp, mac_addr, MAC0);
5178 5179 5180 5181 5182 5183 5184 5185 5186
	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 已提交
5187
static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
5188 5189
{
	struct rtl8169_private *tp;
5190 5191
	int jumbo_max, region, rc;
	enum mac_version chipset;
5192
	struct net_device *dev;
5193
	u16 xid;
5194

5195 5196 5197
	dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
	if (!dev)
		return -ENOMEM;
5198 5199

	SET_NETDEV_DEV(dev, &pdev->dev);
5200
	dev->netdev_ops = &rtl_netdev_ops;
5201 5202 5203
	tp = netdev_priv(dev);
	tp->dev = dev;
	tp->pci_dev = pdev;
5204
	tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1;
5205
	tp->eee_adv = -1;
5206
	tp->ocp_base = OCP_STD_PHY_BASE;
5207

5208 5209 5210 5211 5212
	dev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev,
						   struct pcpu_sw_netstats);
	if (!dev->tstats)
		return -ENOMEM;

5213
	/* Get the *optional* external "ether_clk" used on some boards */
5214 5215 5216
	rc = rtl_get_ether_clk(tp);
	if (rc)
		return rc;
5217

H
Heiner Kallweit 已提交
5218 5219 5220
	/* Disable ASPM completely as that cause random device stop working
	 * problems as well as full system hangs for some PCIe devices users.
	 */
5221 5222 5223
	rc = pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
					  PCIE_LINK_STATE_L1);
	tp->aspm_manageable = !rc;
H
Heiner Kallweit 已提交
5224

5225
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
5226
	rc = pcim_enable_device(pdev);
5227
	if (rc < 0) {
5228
		dev_err(&pdev->dev, "enable failure\n");
5229
		return rc;
5230 5231
	}

5232
	if (pcim_set_mwi(pdev) < 0)
5233
		dev_info(&pdev->dev, "Mem-Wr-Inval unavailable\n");
5234

5235 5236 5237
	/* use first MMIO region */
	region = ffs(pci_select_bars(pdev, IORESOURCE_MEM)) - 1;
	if (region < 0) {
5238
		dev_err(&pdev->dev, "no MMIO resource found\n");
5239
		return -ENODEV;
5240 5241 5242 5243
	}

	/* check for weird/broken PCI region reporting */
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
5244
		dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n");
5245
		return -ENODEV;
5246 5247
	}

5248
	rc = pcim_iomap_regions(pdev, BIT(region), MODULENAME);
5249
	if (rc < 0) {
5250
		dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
5251
		return rc;
5252 5253
	}

5254
	tp->mmio_addr = pcim_iomap_table(pdev)[region];
5255

5256 5257
	xid = (RTL_R32(tp, TxConfig) >> 20) & 0xfcf;

5258
	/* Identify chip attached to board */
5259 5260
	chipset = rtl8169_get_mac_version(xid, tp->supports_gmii);
	if (chipset == RTL_GIGA_MAC_NONE) {
5261
		dev_err(&pdev->dev, "unknown chip XID %03x, contact r8169 maintainers (see MAINTAINERS file)\n", xid);
5262
		return -ENODEV;
5263 5264 5265
	}

	tp->mac_version = chipset;
5266

5267
	tp->cp_cmd = RTL_R16(tp, CPlusCmd) & CPCMD_MASK;
5268

H
Heiner Kallweit 已提交
5269
	if (sizeof(dma_addr_t) > 4 && tp->mac_version >= RTL_GIGA_MAC_VER_18 &&
5270
	    !dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)))
5271 5272
		dev->features |= NETIF_F_HIGHDMA;

5273 5274
	rtl_init_rxcfg(tp);

5275
	rtl8169_irq_mask_and_ack(tp);
5276

H
Hayes Wang 已提交
5277 5278
	rtl_hw_initialize(tp);

5279 5280 5281 5282
	rtl_hw_reset(tp);

	pci_set_master(pdev);

5283 5284
	rc = rtl_alloc_irq(tp);
	if (rc < 0) {
5285
		dev_err(&pdev->dev, "Can't allocate interrupt\n");
5286 5287
		return rc;
	}
5288

5289
	INIT_WORK(&tp->wk.work, rtl_task);
5290

5291
	rtl_init_mac_address(tp);
5292

5293
	dev->ethtool_ops = &rtl8169_ethtool_ops;
5294

5295
	netif_napi_add(dev, &tp->napi, rtl8169_poll, NAPI_POLL_WEIGHT);
5296

5297 5298
	dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
			   NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
5299
	dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
H
Heiner Kallweit 已提交
5300
	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
5301

H
hayeswang 已提交
5302 5303 5304 5305
	/*
	 * Pretend we are using VLANs; This bypasses a nasty bug where
	 * Interrupts stop flowing on high load on 8110SCd controllers.
	 */
5306
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
H
hayeswang 已提交
5307
		/* Disallow toggling */
5308
		dev->hw_features &= ~NETIF_F_HW_VLAN_CTAG_RX;
5309

5310 5311 5312 5313 5314 5315 5316 5317 5318 5319
	if (rtl_chip_supports_csum_v2(tp))
		dev->hw_features |= NETIF_F_IPV6_CSUM;

	dev->features |= dev->hw_features;

	/* There has been a number of reports that using SG/TSO results in
	 * tx timeouts. However for a lot of people SG/TSO works fine.
	 * Therefore disable both features by default, but allow users to
	 * enable them. Use at own risk!
	 */
5320
	if (rtl_chip_supports_csum_v2(tp)) {
5321
		dev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6;
5322 5323 5324
		dev->gso_max_size = RTL_GSO_MAX_SIZE_V2;
		dev->gso_max_segs = RTL_GSO_MAX_SEGS_V2;
	} else {
5325
		dev->hw_features |= NETIF_F_SG | NETIF_F_TSO;
5326 5327 5328
		dev->gso_max_size = RTL_GSO_MAX_SIZE_V1;
		dev->gso_max_segs = RTL_GSO_MAX_SEGS_V1;
	}
H
hayeswang 已提交
5329

5330 5331 5332
	dev->hw_features |= NETIF_F_RXALL;
	dev->hw_features |= NETIF_F_RXFCS;

5333 5334 5335
	/* configure chip for default features */
	rtl8169_set_features(dev, dev->features);

5336
	jumbo_max = rtl_jumbo_max(tp);
5337 5338
	if (jumbo_max)
		dev->max_mtu = jumbo_max;
5339

5340
	rtl_set_irq_mask(tp);
5341

5342
	tp->fw_name = rtl_chip_infos[chipset].fw_name;
5343

5344 5345 5346
	tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
					    &tp->counters_phys_addr,
					    GFP_KERNEL);
5347 5348
	if (!tp->counters)
		return -ENOMEM;
5349

H
Heiner Kallweit 已提交
5350
	pci_set_drvdata(pdev, tp);
5351

5352 5353
	rc = r8169_mdio_register(tp);
	if (rc)
5354
		return rc;
5355

5356 5357 5358
	/* chip gets powered up in rtl_open() */
	rtl_pll_power_down(tp);

5359 5360
	rc = register_netdev(dev);
	if (rc)
5361
		return rc;
5362

5363 5364 5365
	netdev_info(dev, "%s, %pM, XID %03x, IRQ %d\n",
		    rtl_chip_infos[chipset].name, dev->dev_addr, xid,
		    pci_irq_vector(pdev, 0));
5366

5367
	if (jumbo_max)
5368 5369 5370
		netdev_info(dev, "jumbo features [frames: %d bytes, tx checksumming: %s]\n",
			    jumbo_max, tp->mac_version <= RTL_GIGA_MAC_VER_06 ?
			    "ok" : "ko");
5371

5372 5373
	if (r8168_check_dash(tp)) {
		netdev_info(dev, "DASH enabled\n");
5374
		rtl8168_driver_start(tp);
5375
	}
5376

5377 5378 5379
	if (pci_dev_run_wake(pdev))
		pm_runtime_put_sync(&pdev->dev);

5380
	return 0;
5381 5382
}

L
Linus Torvalds 已提交
5383 5384 5385
static struct pci_driver rtl8169_pci_driver = {
	.name		= MODULENAME,
	.id_table	= rtl8169_pci_tbl,
5386
	.probe		= rtl_init_one,
B
Bill Pemberton 已提交
5387
	.remove		= rtl_remove_one,
F
Francois Romieu 已提交
5388
	.shutdown	= rtl_shutdown,
5389 5390 5391
#ifdef CONFIG_PM
	.driver.pm	= &rtl8169_pm_ops,
#endif
L
Linus Torvalds 已提交
5392 5393
};

5394
module_pci_driver(rtl8169_pci_driver);