r8169_main.c 139.0 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
#define D3COLD_NO_PLL_DOWN		BIT(7)
#define D3HOT_NO_PLL_DOWN		BIT(6)
#define D3_NO_PLL_DOWN			(BIT(7) | BIT(6))
267 268 269 270 271 272
	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
273
	DLLPR			= 0xd0,
H
Hayes Wang 已提交
274
#define	PFM_EN				(1 << 6)
275
#define	TX_10M_PS_EN			(1 << 7)
276 277 278
	DBG_REG			= 0xd1,
#define	FIX_NAK_1			(1 << 4)
#define	FIX_NAK_2			(1 << 3)
279 280
	TWSI			= 0xd2,
	MCU			= 0xd3,
H
Hayes Wang 已提交
281
#define	NOW_IS_OOB			(1 << 7)
H
Hayes Wang 已提交
282 283 284
#define	TX_EMPTY			(1 << 5)
#define	RX_EMPTY			(1 << 4)
#define	RXTX_EMPTY			(TX_EMPTY | RX_EMPTY)
285 286
#define	EN_NDP				(1 << 3)
#define	EN_OOB_RESET			(1 << 2)
H
Hayes Wang 已提交
287
#define	LINK_LIST_RDY			(1 << 1)
288 289 290 291 292 293 294
	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
295 296
	MISC_1			= 0xf2,
#define	PFM_D3COLD_EN			(1 << 6)
297 298
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

468 469 470
	/* ResetCounterCommand */
	CounterReset	= 0x1,

471
	/* DumpCounterCommand */
F
Francois Romieu 已提交
472
	CounterDump	= 0x8,
473 474 475

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

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

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

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

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

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

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

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

struct RxDesc {
551 552 553
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
554 555 556 557 558 559 560
};

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

561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
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;
};

577 578 579 580 581
struct rtl8169_tc_offsets {
	bool	inited;
	__le64	tx_errors;
	__le32	tx_multi_collision;
	__le16	tx_aborted;
582
	__le16	rx_missed;
583 584
};

585
enum rtl_flag {
586
	RTL_FLAG_TASK_ENABLED = 0,
587 588 589 590
	RTL_FLAG_TASK_RESET_PENDING,
	RTL_FLAG_MAX
};

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

611
	struct {
612
		DECLARE_BITMAP(flags, RTL_FLAG_MAX);
613 614 615
		struct work_struct work;
	} wk;

616
	unsigned supports_gmii:1;
617
	unsigned aspm_manageable:1;
618 619
	dma_addr_t counters_phys_addr;
	struct rtl8169_counters *counters;
620
	struct rtl8169_tc_offsets tc_offset;
621
	u32 saved_wolopts;
622
	int eee_adv;
623

624
	const char *fw_name;
625
	struct rtl_fw *rtl_fw;
H
Hayes Wang 已提交
626 627

	u32 ocp_base;
L
Linus Torvalds 已提交
628 629
};

630 631
typedef void (*rtl_generic_fct)(struct rtl8169_private *tp);

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

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

664 665 666 667 668 669 670 671 672 673
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);
}

674 675 676 677 678 679
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 已提交
680 681 682 683 684
static bool rtl_is_8125(struct rtl8169_private *tp)
{
	return tp->mac_version >= RTL_GIGA_MAC_VER_60;
}

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

692 693 694 695 696 697 698
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;
}

699 700 701 702 703 704 705 706
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);
}

707 708 709 710 711 712
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,
713
			  unsigned long usecs, int n, bool high)
714 715 716 717 718 719
{
	int i;

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

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

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

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

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

753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
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;

770 771 772
	if (WARN(addr & 3 || !mask, "addr: 0x%x, mask: 0x%08x\n", addr, mask))
		return;

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 816 817 818
	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);
}

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

DECLARE_RTL_COND(rtl_ocp_gphy_cond)
{
826
	return RTL_R32(tp, GPHY_OCP) & OCPAR_FLAG;
H
Hayes Wang 已提交
827 828 829 830
}

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

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

836
	rtl_loop_wait_low(tp, &rtl_ocp_gphy_cond, 25, 10);
H
Hayes Wang 已提交
837 838
}

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

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

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

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

855
	RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
H
Hayes Wang 已提交
856 857 858 859
}

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

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

865
	return RTL_R32(tp, OCPDR);
H
Hayes Wang 已提交
866 867
}

868 869 870 871 872 873 874 875
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);
}

876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894
/* 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 已提交
895 896 897 898 899 900 901 902 903 904
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;

905 906 907
	if (tp->ocp_base == OCP_STD_PHY_BASE && reg == MII_BMCR)
		rtl8168g_phy_suspend_quirk(tp, value);

H
Hayes Wang 已提交
908 909 910 911 912
	r8168_phy_ocp_write(tp, tp->ocp_base + reg * 2, value);
}

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

H
Hayes Wang 已提交
916 917 918 919 920 921
	if (tp->ocp_base != OCP_STD_PHY_BASE)
		reg -= 0x10;

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

922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
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);
}

937 938
DECLARE_RTL_COND(rtl_phyar_cond)
{
939
	return RTL_R32(tp, PHYAR) & 0x80000000;
940 941
}

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

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

954
static int r8169_mdio_read(struct rtl8169_private *tp, int reg)
L
Linus Torvalds 已提交
955
{
956
	int value;
L
Linus Torvalds 已提交
957

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

960
	value = rtl_loop_wait_high(tp, &rtl_phyar_cond, 25, 20) ?
961
		RTL_R32(tp, PHYAR) & 0xffff : -ETIMEDOUT;
962

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

L
Linus Torvalds 已提交
969 970 971
	return value;
}

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

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

983
	rtl_loop_wait_low(tp, &rtl_ocpar_cond, 1000, 100);
984 985
}

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

992
static int r8168dp_1_mdio_read(struct rtl8169_private *tp, int reg)
993
{
994
	r8168dp_1_mdio_access(tp, reg, OCPDR_READ_CMD);
995 996

	mdelay(1);
997 998
	RTL_W32(tp, OCPAR, OCPAR_GPHY_READ_CMD);
	RTL_W32(tp, EPHY_RXER_NUM, 0);
999

1000
	return rtl_loop_wait_high(tp, &rtl_ocpar_cond, 1000, 100) ?
1001
		RTL_R32(tp, OCPDR) & OCPDR_DATA_MASK : -ETIMEDOUT;
1002 1003
}

F
françois romieu 已提交
1004 1005
#define R8168DP_1_MDIO_ACCESS_BIT	0x00020000

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

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

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

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

1022
	r8168dp_2_mdio_stop(tp);
F
françois romieu 已提交
1023 1024
}

1025
static int r8168dp_2_mdio_read(struct rtl8169_private *tp, int reg)
F
françois romieu 已提交
1026 1027 1028
{
	int value;

1029 1030 1031 1032
	/* Work around issue with chip reporting wrong PHY ID */
	if (reg == MII_PHYSID2)
		return 0xc912;

1033
	r8168dp_2_mdio_start(tp);
F
françois romieu 已提交
1034

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

1037
	r8168dp_2_mdio_stop(tp);
F
françois romieu 已提交
1038 1039 1040 1041

	return value;
}

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

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

1076 1077
DECLARE_RTL_COND(rtl_ephyar_cond)
{
1078
	return RTL_R32(tp, EPHYAR) & EPHYAR_FLAG;
1079 1080
}

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

1086
	rtl_loop_wait_low(tp, &rtl_ephyar_cond, 10, 100);
1087 1088

	udelay(10);
1089 1090
}

1091
static u16 rtl_ephy_read(struct rtl8169_private *tp, int reg_addr)
1092
{
1093
	RTL_W32(tp, EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
1094

1095
	return rtl_loop_wait_high(tp, &rtl_ephyar_cond, 10, 100) ?
1096
		RTL_R32(tp, EPHYAR) & EPHYAR_DATA_MASK : ~0;
1097 1098
}

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

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

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

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

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

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

#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 已提交
1142
DECLARE_RTL_COND(rtl_dp_ocp_read_cond)
1143 1144 1145 1146 1147
{
	u16 reg;

	reg = rtl8168_get_ocp_reg(tp);

1148
	return r8168dp_ocp_read(tp, reg) & 0x00000800;
1149 1150
}

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

DECLARE_RTL_COND(rtl_ocp_tx_cond)
{
1158
	return RTL_R8(tp, IBISR0) & 0x20;
C
Chun-Hao Lin 已提交
1159
}
1160

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

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

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

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 已提交
1190
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
C
Chun-Hao Lin 已提交
1191 1192 1193 1194 1195 1196 1197
		rtl8168ep_driver_start(tp);
		break;
	default:
		BUG();
		break;
	}
}
1198

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

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

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 已提交
1221
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
C
Chun-Hao Lin 已提交
1222 1223 1224 1225 1226 1227 1228 1229
		rtl8168ep_driver_stop(tp);
		break;
	default:
		BUG();
		break;
	}
}

1230
static bool r8168dp_check_dash(struct rtl8169_private *tp)
1231 1232 1233
{
	u16 reg = rtl8168_get_ocp_reg(tp);

1234
	return !!(r8168dp_ocp_read(tp, reg) & 0x00008000);
1235 1236
}

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

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

1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271
static void rtl_set_d3_pll_down(struct rtl8169_private *tp, bool enable)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_37:
	case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63:
		if (enable)
			RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~D3_NO_PLL_DOWN);
		else
			RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | D3_NO_PLL_DOWN);
		break;
	default:
		break;
	}
}

1272 1273
static void rtl_reset_packet_filter(struct rtl8169_private *tp)
{
1274 1275
	rtl_eri_clear_bits(tp, 0xdc, BIT(0));
	rtl_eri_set_bits(tp, 0xdc, BIT(0));
1276 1277
}

1278 1279
DECLARE_RTL_COND(rtl_efusear_cond)
{
1280
	return RTL_R32(tp, EFUSEAR) & EFUSEAR_FLAG;
1281 1282
}

H
Heiner Kallweit 已提交
1283
u8 rtl8168d_efuse_read(struct rtl8169_private *tp, int reg_addr)
1284
{
1285
	RTL_W32(tp, EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
1286

1287
	return rtl_loop_wait_high(tp, &rtl_efusear_cond, 100, 300) ?
1288
		RTL_R32(tp, EFUSEAR) & EFUSEAR_DATA_MASK : ~0;
1289 1290
}

1291 1292
static u32 rtl_get_events(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1293 1294 1295 1296
	if (rtl_is_8125(tp))
		return RTL_R32(tp, IntrStatus_8125);
	else
		return RTL_R16(tp, IntrStatus);
1297 1298 1299
}

static void rtl_ack_events(struct rtl8169_private *tp, u32 bits)
F
Francois Romieu 已提交
1300
{
H
Heiner Kallweit 已提交
1301 1302 1303 1304
	if (rtl_is_8125(tp))
		RTL_W32(tp, IntrStatus_8125, bits);
	else
		RTL_W16(tp, IntrStatus, bits);
F
Francois Romieu 已提交
1305 1306 1307 1308
}

static void rtl_irq_disable(struct rtl8169_private *tp)
{
H
Heiner Kallweit 已提交
1309 1310 1311 1312
	if (rtl_is_8125(tp))
		RTL_W32(tp, IntrMask_8125, 0);
	else
		RTL_W16(tp, IntrMask, 0);
1313 1314
}

1315
static void rtl_irq_enable(struct rtl8169_private *tp)
1316
{
H
Heiner Kallweit 已提交
1317 1318 1319 1320
	if (rtl_is_8125(tp))
		RTL_W32(tp, IntrMask_8125, tp->irq_mask);
	else
		RTL_W16(tp, IntrMask, tp->irq_mask);
1321 1322
}

F
françois romieu 已提交
1323
static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1324
{
F
Francois Romieu 已提交
1325
	rtl_irq_disable(tp);
1326
	rtl_ack_events(tp, 0xffffffff);
1327
	rtl_pci_commit(tp);
L
Linus Torvalds 已提交
1328 1329
}

H
Hayes Wang 已提交
1330 1331
static void rtl_link_chg_patch(struct rtl8169_private *tp)
{
1332
	struct phy_device *phydev = tp->phydev;
H
Hayes Wang 已提交
1333

1334 1335
	if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_38) {
1336
		if (phydev->speed == SPEED_1000) {
1337 1338
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
1339
		} else if (phydev->speed == SPEED_100) {
1340 1341
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
H
Hayes Wang 已提交
1342
		} else {
1343 1344
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x0000003f);
H
Hayes Wang 已提交
1345
		}
1346
		rtl_reset_packet_filter(tp);
1347 1348
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
		   tp->mac_version == RTL_GIGA_MAC_VER_36) {
1349
		if (phydev->speed == SPEED_1000) {
1350 1351
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005);
1352
		} else {
1353 1354
			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x0000003f);
1355
		}
1356
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_37) {
1357
		if (phydev->speed == SPEED_10) {
1358 1359
			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x4d02);
			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_0011, 0x0060a);
1360
		} else {
1361
			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000);
1362
		}
H
Hayes Wang 已提交
1363 1364 1365
	}
}

1366 1367 1368
#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 已提交
1369 1370
{
	struct rtl8169_private *tp = netdev_priv(dev);
1371 1372

	wol->supported = WAKE_ANY;
1373
	wol->wolopts = tp->saved_wolopts;
1374 1375 1376 1377
}

static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
{
1378
	static const struct {
F
Francois Romieu 已提交
1379 1380 1381 1382 1383 1384 1385 1386
		u32 opt;
		u16 reg;
		u8  mask;
	} cfg[] = {
		{ WAKE_PHY,   Config3, LinkUp },
		{ WAKE_UCAST, Config5, UWF },
		{ WAKE_BCAST, Config5, BWF },
		{ WAKE_MCAST, Config5, MWF },
1387 1388
		{ WAKE_ANY,   Config5, LanWake },
		{ WAKE_MAGIC, Config3, MagicPacket }
F
Francois Romieu 已提交
1389
	};
H
Heiner Kallweit 已提交
1390
	unsigned int i, tmp = ARRAY_SIZE(cfg);
1391
	u8 options;
F
Francois Romieu 已提交
1392

1393
	rtl_unlock_config_regs(tp);
F
Francois Romieu 已提交
1394

1395
	if (rtl_is_8168evl_up(tp)) {
H
Heiner Kallweit 已提交
1396
		tmp--;
1397
		if (wolopts & WAKE_MAGIC)
1398
			rtl_eri_set_bits(tp, 0x0dc, MagicPacket_v2);
1399
		else
1400
			rtl_eri_clear_bits(tp, 0x0dc, MagicPacket_v2);
H
Heiner Kallweit 已提交
1401 1402 1403 1404 1405 1406
	} 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);
1407 1408 1409
	}

	for (i = 0; i < tmp; i++) {
1410
		options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
1411
		if (wolopts & cfg[i].opt)
F
Francois Romieu 已提交
1412
			options |= cfg[i].mask;
1413
		RTL_W8(tp, cfg[i].reg, options);
F
Francois Romieu 已提交
1414 1415
	}

1416
	switch (tp->mac_version) {
1417
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
1418
		options = RTL_R8(tp, Config1) & ~PMEnable;
1419 1420
		if (wolopts)
			options |= PMEnable;
1421
		RTL_W8(tp, Config1, options);
1422
		break;
1423 1424
	case RTL_GIGA_MAC_VER_34:
	case RTL_GIGA_MAC_VER_37:
1425
	case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63:
1426
		options = RTL_R8(tp, Config2) & ~PME_SIGNAL;
1427 1428
		if (wolopts)
			options |= PME_SIGNAL;
1429
		RTL_W8(tp, Config2, options);
1430
		break;
1431 1432
	default:
		break;
1433 1434
	}

1435
	rtl_lock_config_regs(tp);
1436 1437

	device_set_wakeup_enable(tp_to_dev(tp), wolopts);
1438
	rtl_set_d3_pll_down(tp, !wolopts);
1439
	tp->dev->wol_enabled = wolopts ? 1 : 0;
1440 1441 1442 1443 1444
}

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

1446 1447 1448 1449
	if (wol->wolopts & ~WAKE_ANY)
		return -EINVAL;

	tp->saved_wolopts = wol->wolopts;
1450
	__rtl8169_set_wol(tp, tp->saved_wolopts);
1451

F
Francois Romieu 已提交
1452 1453 1454
	return 0;
}

L
Linus Torvalds 已提交
1455 1456 1457 1458
static void rtl8169_get_drvinfo(struct net_device *dev,
				struct ethtool_drvinfo *info)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1459
	struct rtl_fw *rtl_fw = tp->rtl_fw;
L
Linus Torvalds 已提交
1460

1461 1462
	strlcpy(info->driver, MODULENAME, sizeof(info->driver));
	strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
1463
	BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
1464
	if (rtl_fw)
1465 1466
		strlcpy(info->fw_version, rtl_fw->version,
			sizeof(info->fw_version));
L
Linus Torvalds 已提交
1467 1468 1469 1470 1471 1472 1473
}

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

1474 1475
static netdev_features_t rtl8169_fix_features(struct net_device *dev,
	netdev_features_t features)
L
Linus Torvalds 已提交
1476
{
F
Francois Romieu 已提交
1477 1478
	struct rtl8169_private *tp = netdev_priv(dev);

F
Francois Romieu 已提交
1479
	if (dev->mtu > TD_MSS_MAX)
1480
		features &= ~NETIF_F_ALL_TSO;
L
Linus Torvalds 已提交
1481

1482
	if (dev->mtu > ETH_DATA_LEN &&
1483
	    tp->mac_version > RTL_GIGA_MAC_VER_06)
1484
		features &= ~(NETIF_F_CSUM_MASK | NETIF_F_ALL_TSO);
F
Francois Romieu 已提交
1485

1486
	return features;
L
Linus Torvalds 已提交
1487 1488
}

1489 1490
static void rtl_set_rx_config_features(struct rtl8169_private *tp,
				       netdev_features_t features)
L
Linus Torvalds 已提交
1491
{
1492
	u32 rx_config = RTL_R32(tp, RxConfig);
1493

H
hayeswang 已提交
1494
	if (features & NETIF_F_RXALL)
1495
		rx_config |= RX_CONFIG_ACCEPT_ERR_MASK;
H
hayeswang 已提交
1496
	else
1497
		rx_config &= ~RX_CONFIG_ACCEPT_ERR_MASK;
L
Linus Torvalds 已提交
1498

H
Heiner Kallweit 已提交
1499 1500 1501 1502 1503 1504 1505
	if (rtl_is_8125(tp)) {
		if (features & NETIF_F_HW_VLAN_CTAG_RX)
			rx_config |= RX_VLAN_8125;
		else
			rx_config &= ~RX_VLAN_8125;
	}

1506
	RTL_W32(tp, RxConfig, rx_config);
1507 1508 1509 1510 1511 1512 1513 1514
}

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

H
hayeswang 已提交
1516 1517 1518 1519
	if (features & NETIF_F_RXCSUM)
		tp->cp_cmd |= RxChkSum;
	else
		tp->cp_cmd &= ~RxChkSum;
B
Ben Greear 已提交
1520

H
Heiner Kallweit 已提交
1521 1522 1523 1524 1525 1526
	if (!rtl_is_8125(tp)) {
		if (features & NETIF_F_HW_VLAN_CTAG_RX)
			tp->cp_cmd |= RxVlan;
		else
			tp->cp_cmd &= ~RxVlan;
	}
H
hayeswang 已提交
1527

1528
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
1529
	rtl_pci_commit(tp);
L
Linus Torvalds 已提交
1530 1531 1532 1533

	return 0;
}

1534
static inline u32 rtl8169_tx_vlan_tag(struct sk_buff *skb)
L
Linus Torvalds 已提交
1535
{
1536
	return (skb_vlan_tag_present(skb)) ?
1537
		TxVlanTag | swab16(skb_vlan_tag_get(skb)) : 0x00;
L
Linus Torvalds 已提交
1538 1539
}

1540
static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
L
Linus Torvalds 已提交
1541 1542 1543
{
	u32 opts2 = le32_to_cpu(desc->opts2);

1544
	if (opts2 & RxVlanTag)
1545
		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
L
Linus Torvalds 已提交
1546 1547 1548 1549 1550
}

static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
			     void *p)
{
1551
	struct rtl8169_private *tp = netdev_priv(dev);
P
Peter Wu 已提交
1552 1553 1554
	u32 __iomem *data = tp->mmio_addr;
	u32 *dw = p;
	int i;
L
Linus Torvalds 已提交
1555

P
Peter Wu 已提交
1556 1557
	for (i = 0; i < R8169_REGS_SIZE; i += 4)
		memcpy_fromio(dw++, data++, 4);
L
Linus Torvalds 已提交
1558 1559
}

1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575
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",
};

1576
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
1577
{
1578 1579 1580 1581 1582 1583
	switch (sset) {
	case ETH_SS_STATS:
		return ARRAY_SIZE(rtl8169_gstrings);
	default:
		return -EOPNOTSUPP;
	}
1584 1585
}

1586
DECLARE_RTL_COND(rtl_counters_cond)
1587
{
1588
	return RTL_R32(tp, CounterAddrLow) & (CounterReset | CounterDump);
1589 1590
}

1591
static void rtl8169_do_counters(struct rtl8169_private *tp, u32 counter_cmd)
1592
{
1593 1594
	dma_addr_t paddr = tp->counters_phys_addr;
	u32 cmd;
1595

1596
	RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
1597
	rtl_pci_commit(tp);
1598
	cmd = (u64)paddr & DMA_BIT_MASK(32);
1599 1600
	RTL_W32(tp, CounterAddrLow, cmd);
	RTL_W32(tp, CounterAddrLow, cmd | counter_cmd);
1601

1602
	rtl_loop_wait_low(tp, &rtl_counters_cond, 10, 1000);
1603 1604
}

1605
static void rtl8169_update_counters(struct rtl8169_private *tp)
1606
{
1607 1608
	u8 val = RTL_R8(tp, ChipCmd);

1609 1610
	/*
	 * Some chips are unable to dump tally counters when the receiver
1611
	 * is disabled. If 0xff chip may be in a PCI power-save state.
1612
	 */
1613 1614
	if (val & CmdRxEnb && val != 0xff)
		rtl8169_do_counters(tp, CounterDump);
1615 1616
}

1617
static void rtl8169_init_counter_offsets(struct rtl8169_private *tp)
1618
{
1619
	struct rtl8169_counters *counters = tp->counters;
1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636

	/*
	 * 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)
1637
		return;
1638

1639 1640 1641 1642 1643 1644 1645 1646 1647
	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;
	}
1648 1649

	tp->tc_offset.inited = true;
1650 1651
}

1652 1653 1654 1655
static void rtl8169_get_ethtool_stats(struct net_device *dev,
				      struct ethtool_stats *stats, u64 *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1656
	struct rtl8169_counters *counters;
1657

1658 1659
	counters = tp->counters;
	rtl8169_update_counters(tp);
1660

1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
	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);
1674 1675
}

1676 1677 1678 1679 1680 1681 1682 1683 1684
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;
	}
}

1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715
/*
 * 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;
1716
	u32 scale_nsecs[4];
1717 1718
};

1719 1720 1721
/* produce array with base delay *1, *8, *8*2, *8*2*2 */
#define COALESCE_DELAY(d) { (d), 8 * (d), 16 * (d), 32 * (d) }

1722
static const struct rtl_coalesce_info rtl_coalesce_info_8169[] = {
1723
	{ SPEED_1000,	COALESCE_DELAY(320) },
1724 1725
	{ SPEED_100,	COALESCE_DELAY(2560) },
	{ SPEED_10,	COALESCE_DELAY(40960) },
1726 1727 1728 1729
	{ 0 },
};

static const struct rtl_coalesce_info rtl_coalesce_info_8168_8136[] = {
1730
	{ SPEED_1000,	COALESCE_DELAY(5000) },
1731 1732
	{ SPEED_100,	COALESCE_DELAY(2560) },
	{ SPEED_10,	COALESCE_DELAY(40960) },
1733 1734
	{ 0 },
};
1735
#undef COALESCE_DELAY
1736 1737

/* get rx/tx scale vector corresponding to current speed */
1738 1739
static const struct rtl_coalesce_info *
rtl_coalesce_info(struct rtl8169_private *tp)
1740 1741 1742
{
	const struct rtl_coalesce_info *ci;

1743 1744 1745 1746
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		ci = rtl_coalesce_info_8169;
	else
		ci = rtl_coalesce_info_8168_8136;
1747

1748 1749 1750 1751
	/* if speed is unknown assume highest one */
	if (tp->phydev->speed == SPEED_UNKNOWN)
		return ci;

1752 1753
	for (; ci->speed; ci++) {
		if (tp->phydev->speed == ci->speed)
1754 1755 1756 1757 1758 1759 1760 1761 1762 1763
			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;
1764 1765
	u32 scale, c_us, c_fr;
	u16 intrmit;
1766

H
Heiner Kallweit 已提交
1767 1768 1769
	if (rtl_is_8125(tp))
		return -EOPNOTSUPP;

1770 1771 1772
	memset(ec, 0, sizeof(*ec));

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

1777
	scale = ci->scale_nsecs[tp->cp_cmd & INTT_MASK];
1778

1779
	intrmit = RTL_R16(tp, IntrMitigate);
1780

1781 1782
	c_us = FIELD_GET(RTL_COALESCE_TX_USECS, intrmit);
	ec->tx_coalesce_usecs = DIV_ROUND_UP(c_us * scale, 1000);
1783

1784 1785 1786 1787 1788 1789 1790 1791 1792
	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;
1793 1794 1795 1796

	return 0;
}

1797 1798
/* choose appropriate scale factor and CPlusCmd[0:1] for (speed, usec) */
static int rtl_coalesce_choose_scale(struct rtl8169_private *tp, u32 usec,
1799
				     u16 *cp01)
1800 1801 1802 1803
{
	const struct rtl_coalesce_info *ci;
	u16 i;

1804
	ci = rtl_coalesce_info(tp);
1805
	if (IS_ERR(ci))
1806
		return PTR_ERR(ci);
1807 1808

	for (i = 0; i < 4; i++) {
1809
		if (usec <= ci->scale_nsecs[i] * RTL_COALESCE_T_MAX / 1000U) {
1810
			*cp01 = i;
1811
			return ci->scale_nsecs[i];
1812 1813 1814
		}
	}

1815
	return -ERANGE;
1816 1817 1818 1819 1820
}

static int rtl_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1821 1822 1823
	u32 tx_fr = ec->tx_max_coalesced_frames;
	u32 rx_fr = ec->rx_max_coalesced_frames;
	u32 coal_usec_max, units;
1824
	u16 w = 0, cp01 = 0;
1825
	int scale;
1826

H
Heiner Kallweit 已提交
1827 1828 1829
	if (rtl_is_8125(tp))
		return -EOPNOTSUPP;

1830 1831 1832
	if (rx_fr > RTL_COALESCE_FRAME_MAX || tx_fr > RTL_COALESCE_FRAME_MAX)
		return -ERANGE;

1833 1834
	coal_usec_max = max(ec->rx_coalesce_usecs, ec->tx_coalesce_usecs);
	scale = rtl_coalesce_choose_scale(tp, coal_usec_max, &cp01);
1835 1836
	if (scale < 0)
		return scale;
1837

1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
	/* 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;
1852

1853 1854 1855 1856 1857
	/* 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;

1858 1859
	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));
1860

1861 1862 1863 1864
	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);
1865

1866
	RTL_W16(tp, IntrMitigate, w);
1867

1868 1869 1870 1871 1872 1873 1874 1875 1876
	/* 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;
	}

1877
	tp->cp_cmd = (tp->cp_cmd & ~INTT_MASK) | cp01;
1878
	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
1879
	rtl_pci_commit(tp);
1880 1881 1882 1883

	return 0;
}

1884 1885 1886 1887
static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);

1888 1889 1890
	if (!rtl_supports_eee(tp))
		return -EOPNOTSUPP;

1891
	return phy_ethtool_get_eee(tp->phydev, data);
1892 1893 1894 1895 1896
}

static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1897 1898 1899 1900
	int ret;

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

1902
	ret = phy_ethtool_set_eee(tp->phydev, data);
1903 1904 1905 1906

	if (!ret)
		tp->eee_adv = phy_read_mmd(dev->phydev, MDIO_MMD_AN,
					   MDIO_AN_EEE_ADV);
1907
	return ret;
1908 1909
}

1910
static const struct ethtool_ops rtl8169_ethtool_ops = {
1911 1912
	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
				     ETHTOOL_COALESCE_MAX_FRAMES,
L
Linus Torvalds 已提交
1913 1914 1915
	.get_drvinfo		= rtl8169_get_drvinfo,
	.get_regs_len		= rtl8169_get_regs_len,
	.get_link		= ethtool_op_get_link,
1916 1917
	.get_coalesce		= rtl_get_coalesce,
	.set_coalesce		= rtl_set_coalesce,
L
Linus Torvalds 已提交
1918
	.get_regs		= rtl8169_get_regs,
F
Francois Romieu 已提交
1919 1920
	.get_wol		= rtl8169_get_wol,
	.set_wol		= rtl8169_set_wol,
1921
	.get_strings		= rtl8169_get_strings,
1922
	.get_sset_count		= rtl8169_get_sset_count,
1923
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
1924
	.get_ts_info		= ethtool_op_get_ts_info,
1925
	.nway_reset		= phy_ethtool_nway_reset,
1926 1927
	.get_eee		= rtl8169_get_eee,
	.set_eee		= rtl8169_set_eee,
1928 1929
	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
L
Linus Torvalds 已提交
1930 1931
};

1932 1933
static void rtl_enable_eee(struct rtl8169_private *tp)
{
1934
	struct phy_device *phydev = tp->phydev;
1935 1936 1937 1938 1939 1940 1941
	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);
1942

1943 1944
	if (adv >= 0)
		phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
1945 1946
}

1947
static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
L
Linus Torvalds 已提交
1948
{
1949 1950 1951 1952 1953
	/*
	 * The driver currently handles the 8168Bf and the 8168Be identically
	 * but they can be identified more specifically through the test below
	 * if needed:
	 *
1954
	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
F
Francois Romieu 已提交
1955 1956 1957
	 *
	 * Same thing for the 8101Eb and the 8101Ec:
	 *
1958
	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
1959
	 */
1960
	static const struct rtl_mac_info {
1961 1962
		u16 mask;
		u16 val;
1963
		enum mac_version ver;
L
Linus Torvalds 已提交
1964
	} mac_info[] = {
1965 1966 1967 1968
		/* 8125B family. */
		{ 0x7cf, 0x641,	RTL_GIGA_MAC_VER_63 },

		/* 8125A family. */
H
Heiner Kallweit 已提交
1969 1970 1971
		{ 0x7cf, 0x608,	RTL_GIGA_MAC_VER_60 },
		{ 0x7c8, 0x608,	RTL_GIGA_MAC_VER_61 },

H
Heiner Kallweit 已提交
1972 1973 1974
		/* RTL8117 */
		{ 0x7cf, 0x54a,	RTL_GIGA_MAC_VER_52 },

C
Chun-Hao Lin 已提交
1975
		/* 8168EP family. */
1976 1977 1978
		{ 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 已提交
1979

1980
		/* 8168H family. */
1981 1982
		{ 0x7cf, 0x541,	RTL_GIGA_MAC_VER_46 },
		{ 0x7cf, 0x540,	RTL_GIGA_MAC_VER_45 },
1983

H
Hayes Wang 已提交
1984
		/* 8168G family. */
1985 1986 1987 1988
		{ 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 已提交
1989

1990
		/* 8168F family. */
1991 1992 1993
		{ 0x7c8, 0x488,	RTL_GIGA_MAC_VER_38 },
		{ 0x7cf, 0x481,	RTL_GIGA_MAC_VER_36 },
		{ 0x7cf, 0x480,	RTL_GIGA_MAC_VER_35 },
1994

H
hayeswang 已提交
1995
		/* 8168E family. */
1996 1997 1998
		{ 0x7c8, 0x2c8,	RTL_GIGA_MAC_VER_34 },
		{ 0x7cf, 0x2c1,	RTL_GIGA_MAC_VER_32 },
		{ 0x7c8, 0x2c0,	RTL_GIGA_MAC_VER_33 },
H
hayeswang 已提交
1999

F
Francois Romieu 已提交
2000
		/* 8168D family. */
2001 2002
		{ 0x7cf, 0x281,	RTL_GIGA_MAC_VER_25 },
		{ 0x7c8, 0x280,	RTL_GIGA_MAC_VER_26 },
F
Francois Romieu 已提交
2003

F
françois romieu 已提交
2004
		/* 8168DP family. */
2005 2006 2007 2008 2009
		/* 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 },
		 */
2010 2011
		{ 0x7cf, 0x28a,	RTL_GIGA_MAC_VER_28 },
		{ 0x7cf, 0x28b,	RTL_GIGA_MAC_VER_31 },
F
françois romieu 已提交
2012

2013
		/* 8168C family. */
2014 2015 2016 2017 2018 2019 2020
		{ 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 已提交
2021 2022

		/* 8168B family. */
2023 2024 2025
		{ 0x7cf, 0x380,	RTL_GIGA_MAC_VER_12 },
		{ 0x7c8, 0x380,	RTL_GIGA_MAC_VER_17 },
		{ 0x7c8, 0x300,	RTL_GIGA_MAC_VER_11 },
F
Francois Romieu 已提交
2026 2027

		/* 8101 family. */
2028 2029 2030 2031 2032 2033 2034 2035 2036
		{ 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 },
2037
		{ 0x7cf, 0x240,	RTL_GIGA_MAC_VER_14 },
2038 2039 2040 2041 2042
		{ 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 已提交
2043
		/* FIXME: where did these entries come from ? -- FR */
2044 2045
		{ 0xfc8, 0x388,	RTL_GIGA_MAC_VER_13 },
		{ 0xfc8, 0x308,	RTL_GIGA_MAC_VER_13 },
F
Francois Romieu 已提交
2046 2047

		/* 8110 family. */
2048 2049 2050 2051 2052
		{ 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 已提交
2053

2054
		/* Catch-all */
2055
		{ 0x000, 0x000,	RTL_GIGA_MAC_NONE   }
2056 2057
	};
	const struct rtl_mac_info *p = mac_info;
2058
	enum mac_version ver;
L
Linus Torvalds 已提交
2059

2060
	while ((xid & p->mask) != p->val)
L
Linus Torvalds 已提交
2061
		p++;
2062 2063 2064 2065 2066 2067 2068 2069 2070
	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;
2071
	}
2072 2073

	return ver;
L
Linus Torvalds 已提交
2074 2075
}

2076 2077
static void rtl_release_firmware(struct rtl8169_private *tp)
{
2078
	if (tp->rtl_fw) {
2079
		rtl_fw_release_firmware(tp->rtl_fw);
2080
		kfree(tp->rtl_fw);
2081
		tp->rtl_fw = NULL;
2082
	}
2083 2084
}

H
Heiner Kallweit 已提交
2085
void r8169_apply_firmware(struct rtl8169_private *tp)
2086
{
2087 2088
	int val;

2089
	/* TODO: release firmware if rtl_fw_write_firmware signals failure. */
2090
	if (tp->rtl_fw) {
2091
		rtl_fw_write_firmware(tp, tp->rtl_fw);
2092 2093
		/* At least one firmware doesn't reset tp->ocp_base. */
		tp->ocp_base = OCP_STD_PHY_BASE;
2094 2095 2096 2097 2098

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

2102 2103
static void rtl8168_config_eee_mac(struct rtl8169_private *tp)
{
2104 2105 2106 2107
	/* Adjust EEE LED frequency */
	if (tp->mac_version != RTL_GIGA_MAC_VER_38)
		RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);

2108
	rtl_eri_set_bits(tp, 0x1b0, 0x0003);
2109 2110
}

2111
static void rtl8125a_config_eee_mac(struct rtl8169_private *tp)
2112 2113 2114 2115 2116
{
	r8168_mac_ocp_modify(tp, 0xe040, 0, BIT(1) | BIT(0));
	r8168_mac_ocp_modify(tp, 0xeb62, 0, BIT(2) | BIT(1));
}

2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127
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));
}

2128
static void rtl_rar_exgmac_set(struct rtl8169_private *tp, const u8 *addr)
2129
{
2130 2131 2132 2133
	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));
2134 2135
}

H
Heiner Kallweit 已提交
2136
u16 rtl8168h_2_get_adc_bias_ioffset(struct rtl8169_private *tp)
2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151
{
	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;
}

2152 2153
static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)
{
2154 2155
	set_bit(flag, tp->wk.flags);
	schedule_work(&tp->wk.work);
2156 2157
}

2158
static void rtl8169_init_phy(struct rtl8169_private *tp)
2159
{
2160
	r8169_hw_phy_config(tp, tp->phydev, tp->mac_version);
2161

2162
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
2163 2164
		pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
2165
		/* set undocumented MAC Reg C+CR Offset 0x82h */
2166
		RTL_W8(tp, 0x82, 0x01);
2167
	}
2168

2169 2170 2171 2172 2173
	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);

2174
	/* We may have called phy_speed_down before */
2175
	phy_speed_up(tp->phydev);
2176

2177 2178 2179
	if (rtl_supports_eee(tp))
		rtl_enable_eee(tp);

2180
	genphy_soft_reset(tp->phydev);
2181 2182
}

2183
static void rtl_rar_set(struct rtl8169_private *tp, const u8 *addr)
2184
{
2185
	rtl_unlock_config_regs(tp);
2186

2187
	RTL_W32(tp, MAC4, get_unaligned_le16(addr + 4));
2188
	rtl_pci_commit(tp);
2189

2190
	RTL_W32(tp, MAC0, get_unaligned_le32(addr));
2191
	rtl_pci_commit(tp);
2192

2193 2194
	if (tp->mac_version == RTL_GIGA_MAC_VER_34)
		rtl_rar_exgmac_set(tp, addr);
2195

2196
	rtl_lock_config_regs(tp);
2197 2198 2199 2200 2201
}

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

2204 2205 2206
	ret = eth_mac_addr(dev, p);
	if (ret)
		return ret;
2207

2208
	rtl_rar_set(tp, dev->dev_addr);
2209 2210 2211 2212

	return 0;
}

2213 2214 2215
static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
2216 2217
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
2218 2219 2220 2221 2222
	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:
2223
	case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_63:
2224
		RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) |
2225 2226 2227 2228 2229 2230 2231
			AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
		break;
	default:
		break;
	}
}

2232
static void rtl_prepare_power_down(struct rtl8169_private *tp)
F
françois romieu 已提交
2233
{
2234
	if (r8168_check_dash(tp))
F
françois romieu 已提交
2235 2236
		return;

H
hayeswang 已提交
2237 2238
	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_33)
2239
		rtl_ephy_write(tp, 0x19, 0xff64);
H
hayeswang 已提交
2240

2241 2242 2243
	if (device_may_wakeup(tp_to_dev(tp))) {
		phy_speed_down(tp->phydev, false);
		rtl_wol_suspend_quirk(tp);
F
françois romieu 已提交
2244 2245 2246
	}
}

2247 2248 2249
static void rtl_init_rxcfg(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
2250
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
2251
	case RTL_GIGA_MAC_VER_10 ... RTL_GIGA_MAC_VER_17:
2252
		RTL_W32(tp, RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
2253
		break;
2254
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_24:
2255 2256
	case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_36:
	case RTL_GIGA_MAC_VER_38:
2257
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
2258
		break;
H
Heiner Kallweit 已提交
2259
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_52:
2260
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF);
2261
		break;
2262
	case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63:
2263
		RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST);
H
Heiner Kallweit 已提交
2264
		break;
2265
	default:
2266
		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_DMA_BURST);
2267 2268 2269 2270
		break;
	}
}

2271 2272
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
{
2273
	tp->dirty_tx = tp->cur_tx = tp->cur_rx = 0;
2274 2275
}

F
Francois Romieu 已提交
2276 2277
static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
{
2278 2279
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
F
Francois Romieu 已提交
2280 2281 2282 2283
}

static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
{
2284 2285
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
F
Francois Romieu 已提交
2286 2287 2288 2289
}

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

static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
{
2295
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
F
Francois Romieu 已提交
2296 2297 2298 2299
}

static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
{
2300 2301 2302
	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 已提交
2303 2304 2305 2306
}

static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
{
2307 2308 2309
	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 已提交
2310 2311 2312 2313
}

static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
{
2314
	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
F
Francois Romieu 已提交
2315 2316 2317 2318
}

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

2322
static void rtl_jumbo_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2323
{
2324
	bool jumbo = tp->dev->mtu > ETH_DATA_LEN;
2325
	int readrq = 4096;
F
Francois Romieu 已提交
2326

H
Heiner Kallweit 已提交
2327 2328 2329 2330
	rtl_unlock_config_regs(tp);
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
2331
		if (jumbo) {
2332
			readrq = 512;
2333 2334 2335 2336
			r8168b_1_hw_jumbo_enable(tp);
		} else {
			r8168b_1_hw_jumbo_disable(tp);
		}
H
Heiner Kallweit 已提交
2337 2338
		break;
	case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_26:
2339
		if (jumbo) {
2340
			readrq = 512;
2341 2342 2343 2344
			r8168c_hw_jumbo_enable(tp);
		} else {
			r8168c_hw_jumbo_disable(tp);
		}
H
Heiner Kallweit 已提交
2345 2346
		break;
	case RTL_GIGA_MAC_VER_27 ... RTL_GIGA_MAC_VER_28:
2347 2348 2349 2350
		if (jumbo)
			r8168dp_hw_jumbo_enable(tp);
		else
			r8168dp_hw_jumbo_disable(tp);
H
Heiner Kallweit 已提交
2351
		break;
2352
	case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_33:
2353
		if (jumbo)
2354
			r8168e_hw_jumbo_enable(tp);
2355
		else
2356
			r8168e_hw_jumbo_disable(tp);
H
Heiner Kallweit 已提交
2357
		break;
F
Francois Romieu 已提交
2358 2359 2360
	default:
		break;
	}
H
Heiner Kallweit 已提交
2361
	rtl_lock_config_regs(tp);
2362

2363 2364
	if (pci_is_pcie(tp->pci_dev) && tp->supports_gmii)
		pcie_set_readrq(tp->pci_dev, readrq);
F
Francois Romieu 已提交
2365 2366
}

2367 2368
DECLARE_RTL_COND(rtl_chipcmd_cond)
{
2369
	return RTL_R8(tp, ChipCmd) & CmdReset;
2370 2371
}

2372 2373
static void rtl_hw_reset(struct rtl8169_private *tp)
{
2374
	RTL_W8(tp, ChipCmd, CmdReset);
2375

2376
	rtl_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100);
2377 2378
}

2379
static void rtl_request_firmware(struct rtl8169_private *tp)
2380
{
2381
	struct rtl_fw *rtl_fw;
2382

2383 2384 2385
	/* firmware loaded already or no firmware available */
	if (tp->rtl_fw || !tp->fw_name)
		return;
2386

2387
	rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
2388
	if (!rtl_fw)
2389
		return;
2390

2391 2392 2393 2394
	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;
2395 2396
	rtl_fw->fw_name = tp->fw_name;
	rtl_fw->dev = tp_to_dev(tp);
2397

2398 2399 2400 2401
	if (rtl_fw_request_firmware(rtl_fw))
		kfree(rtl_fw);
	else
		tp->rtl_fw = rtl_fw;
2402 2403
}

2404 2405
static void rtl_rx_close(struct rtl8169_private *tp)
{
2406
	RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~RX_CONFIG_ACCEPT_MASK);
2407 2408
}

2409 2410
DECLARE_RTL_COND(rtl_npq_cond)
{
2411
	return RTL_R8(tp, TxPoll) & NPQ;
2412 2413 2414 2415
}

DECLARE_RTL_COND(rtl_txcfg_empty_cond)
{
2416
	return RTL_R32(tp, TxConfig) & TXCFG_EMPTY;
2417 2418
}

2419 2420 2421 2422 2423
DECLARE_RTL_COND(rtl_rxtx_empty_cond)
{
	return (RTL_R8(tp, MCU) & RXTX_EMPTY) == RXTX_EMPTY;
}

2424 2425 2426 2427 2428 2429
DECLARE_RTL_COND(rtl_rxtx_empty_cond_2)
{
	/* IntrMitigate has new functionality on RTL8125 */
	return (RTL_R16(tp, IntrMitigate) & 0x0103) == 0x0103;
}

2430 2431 2432 2433 2434 2435 2436 2437 2438 2439
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;
2440 2441 2442 2443 2444
	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;
2445 2446 2447 2448 2449
	default:
		break;
	}
}

2450 2451 2452 2453
static void rtl_enable_rxdvgate(struct rtl8169_private *tp)
{
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | RXDV_GATED_EN);
	fsleep(2000);
2454
	rtl_wait_txrx_fifo_empty(tp);
2455 2456
}

2457
static void rtl_set_tx_config_registers(struct rtl8169_private *tp)
2458
{
2459 2460 2461
	u32 val = TX_DMA_BURST << TxDMAShift |
		  InterFrameGap << TxInterFrameGapShift;

2462
	if (rtl_is_8168evl_up(tp))
2463 2464 2465
		val |= TXCFG_AUTO_FIFO;

	RTL_W32(tp, TxConfig, val);
2466 2467
}

2468
static void rtl_set_rx_max_size(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
2469
{
2470 2471
	/* Low hurts. Let's disable the filtering. */
	RTL_W16(tp, RxMaxSize, R8169_RX_BUF_SIZE + 1);
2472 2473
}

2474
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp)
2475 2476 2477 2478 2479 2480
{
	/*
	 * 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.
	 */
2481 2482 2483 2484
	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));
2485 2486
}

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

2504 2505
static void rtl_set_rx_mode(struct net_device *dev)
{
H
Heiner Kallweit 已提交
2506 2507 2508
	u32 rx_mode = AcceptBroadcast | AcceptMyPhys | AcceptMulticast;
	/* Multicast hash filter */
	u32 mc_filter[2] = { 0xffffffff, 0xffffffff };
2509
	struct rtl8169_private *tp = netdev_priv(dev);
H
Heiner Kallweit 已提交
2510
	u32 tmp;
2511 2512

	if (dev->flags & IFF_PROMISC) {
H
Heiner Kallweit 已提交
2513 2514 2515 2516 2517 2518 2519
		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;
2520 2521 2522 2523 2524
	} else {
		struct netdev_hw_addr *ha;

		mc_filter[1] = mc_filter[0] = 0;
		netdev_for_each_mc_addr(ha, dev) {
2525
			u32 bit_nr = eth_hw_addr_crc(ha) >> 26;
H
Heiner Kallweit 已提交
2526 2527 2528 2529 2530 2531 2532
			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);
2533 2534 2535
		}
	}

2536 2537
	RTL_W32(tp, MAR0 + 4, mc_filter[1]);
	RTL_W32(tp, MAR0 + 0, mc_filter[0]);
2538

H
Heiner Kallweit 已提交
2539
	tmp = RTL_R32(tp, RxConfig);
2540
	RTL_W32(tp, RxConfig, (tmp & ~RX_CONFIG_ACCEPT_OK_MASK) | rx_mode);
2541 2542
}

2543 2544
DECLARE_RTL_COND(rtl_csiar_cond)
{
2545
	return RTL_R32(tp, CSIAR) & CSIAR_FLAG;
2546 2547
}

2548
static void rtl_csi_write(struct rtl8169_private *tp, int addr, int value)
2549
{
2550
	u32 func = PCI_FUNC(tp->pci_dev->devfn);
2551

2552 2553
	RTL_W32(tp, CSIDR, value);
	RTL_W32(tp, CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
2554
		CSIAR_BYTE_ENABLE | func << 16);
2555

2556
	rtl_loop_wait_low(tp, &rtl_csiar_cond, 10, 100);
2557 2558
}

2559
static u32 rtl_csi_read(struct rtl8169_private *tp, int addr)
2560
{
2561 2562 2563 2564
	u32 func = PCI_FUNC(tp->pci_dev->devfn);

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

2566
	return rtl_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
2567
		RTL_R32(tp, CSIDR) : ~0;
2568 2569
}

2570
static void rtl_csi_access_enable(struct rtl8169_private *tp, u8 val)
H
hayeswang 已提交
2571
{
2572 2573
	struct pci_dev *pdev = tp->pci_dev;
	u32 csi;
H
hayeswang 已提交
2574

2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586
	/* 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 已提交
2587 2588
}

2589
static void rtl_set_def_aspm_entry_latency(struct rtl8169_private *tp)
2590
{
2591
	rtl_csi_access_enable(tp, 0x27);
2592 2593 2594 2595 2596 2597 2598 2599
}

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

2600 2601
static void __rtl_ephy_init(struct rtl8169_private *tp,
			    const struct ephy_info *e, int len)
2602 2603 2604 2605
{
	u16 w;

	while (len-- > 0) {
2606 2607
		w = (rtl_ephy_read(tp, e->offset) & ~e->mask) | e->bits;
		rtl_ephy_write(tp, e->offset, w);
2608 2609 2610 2611
		e++;
	}
}

2612 2613
#define rtl_ephy_init(tp, a) __rtl_ephy_init(tp, a, ARRAY_SIZE(a))

2614
static void rtl_disable_clock_request(struct rtl8169_private *tp)
2615
{
2616
	pcie_capability_clear_word(tp->pci_dev, PCI_EXP_LNKCTL,
2617
				   PCI_EXP_LNKCTL_CLKREQ_EN);
2618 2619
}

2620
static void rtl_enable_clock_request(struct rtl8169_private *tp)
F
françois romieu 已提交
2621
{
2622
	pcie_capability_set_word(tp->pci_dev, PCI_EXP_LNKCTL,
2623
				 PCI_EXP_LNKCTL_CLKREQ_EN);
F
françois romieu 已提交
2624 2625
}

2626
static void rtl_pcie_state_l2l3_disable(struct rtl8169_private *tp)
H
hayeswang 已提交
2627
{
2628 2629
	/* 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 已提交
2630 2631
}

K
Kai-Heng Feng 已提交
2632 2633
static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
{
2634 2635
	/* Don't enable ASPM in the chip if OS can't control ASPM */
	if (enable && tp->aspm_manageable) {
K
Kai-Heng Feng 已提交
2636
		RTL_W8(tp, Config5, RTL_R8(tp, Config5) | ASPM_en);
2637
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) | ClkReqEn);
K
Kai-Heng Feng 已提交
2638 2639 2640 2641
	} else {
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
		RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
	}
2642 2643

	udelay(10);
K
Kai-Heng Feng 已提交
2644 2645
}

H
Heiner Kallweit 已提交
2646 2647 2648 2649 2650 2651 2652 2653 2654 2655
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);
}

2656 2657 2658 2659 2660 2661 2662 2663
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);
}

2664
static void rtl_hw_start_8168b(struct rtl8169_private *tp)
2665
{
2666
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
2667 2668
}

2669
static void __rtl_hw_start_8168cp(struct rtl8169_private *tp)
2670
{
2671
	RTL_W8(tp, Config1, RTL_R8(tp, Config1) | Speed_down);
2672

2673
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
2674

2675
	rtl_disable_clock_request(tp);
2676 2677
}

2678
static void rtl_hw_start_8168cp_1(struct rtl8169_private *tp)
2679
{
2680
	static const struct ephy_info e_info_8168cp[] = {
2681 2682 2683 2684 2685 2686 2687
		{ 0x01, 0,	0x0001 },
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0042 },
		{ 0x06, 0x0080,	0x0000 },
		{ 0x07, 0,	0x2000 }
	};

2688
	rtl_set_def_aspm_entry_latency(tp);
2689

2690
	rtl_ephy_init(tp, e_info_8168cp);
2691

2692
	__rtl_hw_start_8168cp(tp);
2693 2694
}

2695
static void rtl_hw_start_8168cp_2(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2696
{
2697
	rtl_set_def_aspm_entry_latency(tp);
F
Francois Romieu 已提交
2698

2699
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
F
Francois Romieu 已提交
2700 2701
}

2702
static void rtl_hw_start_8168cp_3(struct rtl8169_private *tp)
2703
{
2704
	rtl_set_def_aspm_entry_latency(tp);
2705

2706
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
2707 2708

	/* Magic. */
2709
	RTL_W8(tp, DBG_REG, 0x20);
2710 2711
}

2712
static void rtl_hw_start_8168c_1(struct rtl8169_private *tp)
2713
{
2714
	static const struct ephy_info e_info_8168c_1[] = {
2715 2716 2717 2718 2719
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0002 },
		{ 0x06, 0x0080,	0x0000 }
	};

2720
	rtl_set_def_aspm_entry_latency(tp);
2721

2722
	RTL_W8(tp, DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
2723

2724
	rtl_ephy_init(tp, e_info_8168c_1);
2725

2726
	__rtl_hw_start_8168cp(tp);
2727 2728
}

2729
static void rtl_hw_start_8168c_2(struct rtl8169_private *tp)
2730
{
2731
	static const struct ephy_info e_info_8168c_2[] = {
2732
		{ 0x01, 0,	0x0001 },
2733
		{ 0x03, 0x0400,	0x0020 }
2734 2735
	};

2736
	rtl_set_def_aspm_entry_latency(tp);
2737

2738
	rtl_ephy_init(tp, e_info_8168c_2);
2739

2740
	__rtl_hw_start_8168cp(tp);
2741 2742
}

2743
static void rtl_hw_start_8168c_3(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2744
{
2745
	rtl_hw_start_8168c_2(tp);
F
Francois Romieu 已提交
2746 2747
}

2748
static void rtl_hw_start_8168c_4(struct rtl8169_private *tp)
2749
{
2750
	rtl_set_def_aspm_entry_latency(tp);
2751

2752
	__rtl_hw_start_8168cp(tp);
2753 2754
}

2755
static void rtl_hw_start_8168d(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2756
{
2757
	rtl_set_def_aspm_entry_latency(tp);
F
Francois Romieu 已提交
2758

2759
	rtl_disable_clock_request(tp);
F
Francois Romieu 已提交
2760 2761
}

2762
static void rtl_hw_start_8168d_4(struct rtl8169_private *tp)
F
françois romieu 已提交
2763 2764
{
	static const struct ephy_info e_info_8168d_4[] = {
2765 2766
		{ 0x0b, 0x0000,	0x0048 },
		{ 0x19, 0x0020,	0x0050 },
2767 2768
		{ 0x0c, 0x0100,	0x0020 },
		{ 0x10, 0x0004,	0x0000 },
F
françois romieu 已提交
2769 2770
	};

2771
	rtl_set_def_aspm_entry_latency(tp);
F
françois romieu 已提交
2772

2773
	rtl_ephy_init(tp, e_info_8168d_4);
F
françois romieu 已提交
2774

2775
	rtl_enable_clock_request(tp);
F
françois romieu 已提交
2776 2777
}

2778
static void rtl_hw_start_8168e_1(struct rtl8169_private *tp)
H
hayeswang 已提交
2779
{
H
Hayes Wang 已提交
2780
	static const struct ephy_info e_info_8168e_1[] = {
H
hayeswang 已提交
2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795
		{ 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 }
	};

2796
	rtl_set_def_aspm_entry_latency(tp);
H
hayeswang 已提交
2797

2798
	rtl_ephy_init(tp, e_info_8168e_1);
H
hayeswang 已提交
2799

2800
	rtl_disable_clock_request(tp);
H
hayeswang 已提交
2801 2802

	/* Reset tx FIFO pointer */
2803 2804
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | TXPLA_RST);
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~TXPLA_RST);
H
hayeswang 已提交
2805

2806
	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
H
hayeswang 已提交
2807 2808
}

2809
static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
H
Hayes Wang 已提交
2810 2811 2812
{
	static const struct ephy_info e_info_8168e_2[] = {
		{ 0x09, 0x0000,	0x0080 },
2813 2814 2815
		{ 0x19, 0x0000,	0x0224 },
		{ 0x00, 0x0000,	0x0004 },
		{ 0x0c, 0x3df0,	0x0200 },
H
Hayes Wang 已提交
2816 2817
	};

2818
	rtl_set_def_aspm_entry_latency(tp);
H
Hayes Wang 已提交
2819

2820
	rtl_ephy_init(tp, e_info_8168e_2);
H
Hayes Wang 已提交
2821

2822
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
2823
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_1111, 0x0000);
H
Heiner Kallweit 已提交
2824
	rtl_set_fifo_size(tp, 0x10, 0x10, 0x02, 0x06);
2825 2826 2827 2828
	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));
2829 2830
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x07ff0060);
H
Hayes Wang 已提交
2831

2832
	rtl_disable_clock_request(tp);
2833

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

2836 2837
	rtl8168_config_eee_mac(tp);

2838 2839 2840
	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);
2841 2842

	rtl_hw_aspm_clkreq_enable(tp, true);
H
Hayes Wang 已提交
2843 2844
}

2845
static void rtl_hw_start_8168f(struct rtl8169_private *tp)
2846
{
2847
	rtl_set_def_aspm_entry_latency(tp);
2848

2849
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
2850
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_1111, 0x0000);
H
Heiner Kallweit 已提交
2851
	rtl_set_fifo_size(tp, 0x10, 0x10, 0x02, 0x06);
2852
	rtl_reset_packet_filter(tp);
2853
	rtl_eri_set_bits(tp, 0x1b0, BIT(4));
2854
	rtl_eri_set_bits(tp, 0x1d0, BIT(4) | BIT(1));
2855 2856
	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050);
	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x00000060);
2857

2858
	rtl_disable_clock_request(tp);
2859

2860 2861 2862 2863
	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);
2864 2865

	rtl8168_config_eee_mac(tp);
2866 2867
}

2868 2869 2870 2871 2872 2873
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 },
2874
		{ 0x19, 0x0000,	0x0224 },
2875
		{ 0x00, 0x0000,	0x0008 },
2876
		{ 0x0c, 0x3df0,	0x0200 },
2877 2878 2879 2880
	};

	rtl_hw_start_8168f(tp);

2881
	rtl_ephy_init(tp, e_info_8168f_1);
2882

2883
	rtl_eri_set_bits(tp, 0x0d4, 0x1f00);
2884 2885
}

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

	rtl_hw_start_8168f(tp);
2897
	rtl_pcie_state_l2l3_disable(tp);
2898

2899
	rtl_ephy_init(tp, e_info_8168f_1);
2900

2901
	rtl_eri_set_bits(tp, 0x0d4, 0x0c00);
2902 2903
}

2904
static void rtl_hw_start_8168g(struct rtl8169_private *tp)
H
Hayes Wang 已提交
2905
{
H
Heiner Kallweit 已提交
2906
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
2907
	rtl8168g_set_pause_thresholds(tp, 0x38, 0x48);
H
Hayes Wang 已提交
2908

2909
	rtl_set_def_aspm_entry_latency(tp);
H
Hayes Wang 已提交
2910

2911
	rtl_reset_packet_filter(tp);
2912
	rtl_eri_write(tp, 0x2f8, ERIAR_MASK_0011, 0x1d8f);
H
Hayes Wang 已提交
2913

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

2916 2917
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
2918
	rtl_eri_set_bits(tp, 0x0d4, 0x1f80);
H
Hayes Wang 已提交
2919

2920 2921
	rtl8168_config_eee_mac(tp);

2922 2923
	rtl_w0w1_eri(tp, 0x2fc, 0x01, 0x06);
	rtl_eri_clear_bits(tp, 0x1b0, BIT(12));
H
hayeswang 已提交
2924

2925
	rtl_pcie_state_l2l3_disable(tp);
H
Hayes Wang 已提交
2926 2927
}

2928 2929 2930
static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168g_1[] = {
2931 2932
		{ 0x00, 0x0008,	0x0000 },
		{ 0x0c, 0x3ff0,	0x0820 },
2933 2934 2935 2936 2937 2938 2939
		{ 0x1e, 0x0000,	0x0001 },
		{ 0x19, 0x8000,	0x0000 }
	};

	rtl_hw_start_8168g(tp);

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
2940
	rtl_hw_aspm_clkreq_enable(tp, false);
2941
	rtl_ephy_init(tp, e_info_8168g_1);
K
Kai-Heng Feng 已提交
2942
	rtl_hw_aspm_clkreq_enable(tp, true);
2943 2944
}

H
hayeswang 已提交
2945 2946 2947
static void rtl_hw_start_8168g_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168g_2[] = {
2948 2949 2950 2951 2952 2953 2954 2955 2956
		{ 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 已提交
2957 2958
	};

2959
	rtl_hw_start_8168g(tp);
H
hayeswang 已提交
2960 2961

	/* disable aspm and clock request before access ephy */
2962
	rtl_hw_aspm_clkreq_enable(tp, false);
2963
	rtl_ephy_init(tp, e_info_8168g_2);
H
hayeswang 已提交
2964 2965
}

H
hayeswang 已提交
2966 2967 2968
static void rtl_hw_start_8411_2(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8411_2[] = {
2969 2970 2971 2972 2973 2974 2975 2976 2977 2978
		{ 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 已提交
2979 2980
	};

2981
	rtl_hw_start_8168g(tp);
H
hayeswang 已提交
2982 2983

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
2984
	rtl_hw_aspm_clkreq_enable(tp, false);
2985
	rtl_ephy_init(tp, e_info_8411_2);
2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 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

	/* 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 已提交
3123
	rtl_hw_aspm_clkreq_enable(tp, true);
H
hayeswang 已提交
3124 3125
}

3126 3127 3128 3129 3130 3131 3132
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 },
3133
		{ 0x04, 0xffff,	0x854a },
3134 3135
		{ 0x01, 0xffff,	0x068b }
	};
3136
	int rg_saw_cnt;
3137 3138

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

H
Heiner Kallweit 已提交
3142
	rtl_set_fifo_size(tp, 0x08, 0x10, 0x02, 0x06);
3143
	rtl8168g_set_pause_thresholds(tp, 0x38, 0x48);
3144

3145
	rtl_set_def_aspm_entry_latency(tp);
3146

3147
	rtl_reset_packet_filter(tp);
3148

3149
	rtl_eri_set_bits(tp, 0xd4, 0x1f00);
3150
	rtl_eri_set_bits(tp, 0xdc, 0x001c);
3151

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

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

3156 3157
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
3158

3159 3160
	rtl8168_config_eee_mac(tp);

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

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

3166
	rtl_eri_clear_bits(tp, 0x1b0, BIT(12));
3167

3168
	rtl_pcie_state_l2l3_disable(tp);
3169

3170
	rg_saw_cnt = phy_read_paged(tp->phydev, 0x0c42, 0x13) & 0x3fff;
3171 3172 3173 3174 3175
	if (rg_saw_cnt > 0) {
		u16 sw_cnt_1ms_ini;

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

3179 3180 3181 3182
	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);
3183 3184 3185 3186 3187

	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 已提交
3188 3189

	rtl_hw_aspm_clkreq_enable(tp, true);
3190 3191
}

C
Chun-Hao Lin 已提交
3192 3193
static void rtl_hw_start_8168ep(struct rtl8169_private *tp)
{
C
Chun-Hao Lin 已提交
3194 3195
	rtl8168ep_stop_cmac(tp);

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

3199
	rtl_set_def_aspm_entry_latency(tp);
C
Chun-Hao Lin 已提交
3200

3201
	rtl_reset_packet_filter(tp);
C
Chun-Hao Lin 已提交
3202

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

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

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

3209 3210
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
C
Chun-Hao Lin 已提交
3211

3212 3213
	rtl8168_config_eee_mac(tp);

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

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

3218
	rtl_pcie_state_l2l3_disable(tp);
C
Chun-Hao Lin 已提交
3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231
}

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 已提交
3232
	rtl_hw_aspm_clkreq_enable(tp, false);
3233
	rtl_ephy_init(tp, e_info_8168ep_1);
C
Chun-Hao Lin 已提交
3234 3235

	rtl_hw_start_8168ep(tp);
K
Kai-Heng Feng 已提交
3236 3237

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248
}

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 已提交
3249
	rtl_hw_aspm_clkreq_enable(tp, false);
3250
	rtl_ephy_init(tp, e_info_8168ep_2);
C
Chun-Hao Lin 已提交
3251 3252 3253

	rtl_hw_start_8168ep(tp);

3254 3255
	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 已提交
3256 3257

	rtl_hw_aspm_clkreq_enable(tp, true);
C
Chun-Hao Lin 已提交
3258 3259 3260 3261 3262
}

static void rtl_hw_start_8168ep_3(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8168ep_3[] = {
3263 3264 3265 3266
		{ 0x00, 0x0000,	0x0080 },
		{ 0x0d, 0x0100,	0x0200 },
		{ 0x19, 0x8021,	0x0000 },
		{ 0x1e, 0x0000,	0x2000 },
C
Chun-Hao Lin 已提交
3267 3268 3269
	};

	/* disable aspm and clock request before access ephy */
K
Kai-Heng Feng 已提交
3270
	rtl_hw_aspm_clkreq_enable(tp, false);
3271
	rtl_ephy_init(tp, e_info_8168ep_3);
C
Chun-Hao Lin 已提交
3272 3273 3274

	rtl_hw_start_8168ep(tp);

3275 3276
	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 已提交
3277

3278 3279 3280
	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 已提交
3281 3282

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

H
Heiner Kallweit 已提交
3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305
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);

3306
	rtl_eri_set_bits(tp, 0xd4, 0x1f90);
H
Heiner Kallweit 已提交
3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321

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

3322
	rtl_eri_clear_bits(tp, 0x1b0, BIT(12));
H
Heiner Kallweit 已提交
3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343

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

3344
	/* firmware is for MAC only */
3345
	r8169_apply_firmware(tp);
3346

H
Heiner Kallweit 已提交
3347 3348 3349
	rtl_hw_aspm_clkreq_enable(tp, true);
}

3350
static void rtl_hw_start_8102e_1(struct rtl8169_private *tp)
3351
{
3352
	static const struct ephy_info e_info_8102e_1[] = {
3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363
		{ 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;

3364
	rtl_set_def_aspm_entry_latency(tp);
3365

3366
	RTL_W8(tp, DBG_REG, FIX_NAK_1);
3367

3368
	RTL_W8(tp, Config1,
3369
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
3370
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
3371

3372
	cfg1 = RTL_R8(tp, Config1);
3373
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
3374
		RTL_W8(tp, Config1, cfg1 & ~LEDS0);
3375

3376
	rtl_ephy_init(tp, e_info_8102e_1);
3377 3378
}

3379
static void rtl_hw_start_8102e_2(struct rtl8169_private *tp)
3380
{
3381
	rtl_set_def_aspm_entry_latency(tp);
3382

3383 3384
	RTL_W8(tp, Config1, MEMMAP | IOMAP | VPD | PMEnable);
	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
3385 3386
}

3387
static void rtl_hw_start_8102e_3(struct rtl8169_private *tp)
3388
{
3389
	rtl_hw_start_8102e_2(tp);
3390

3391
	rtl_ephy_write(tp, 0x03, 0xc2f9);
3392 3393
}

3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406
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);
}

3407
static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419
{
	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 已提交
3420
	/* Force LAN exit from ASPM if Rx/Tx are not idle */
3421
	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
3422

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

3426 3427
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) | EN_NDP | EN_OOB_RESET);
	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
3428

3429
	rtl_ephy_init(tp, e_info_8105e_1);
H
hayeswang 已提交
3430

3431
	rtl_pcie_state_l2l3_disable(tp);
3432 3433
}

3434
static void rtl_hw_start_8105e_2(struct rtl8169_private *tp)
3435
{
3436
	rtl_hw_start_8105e_1(tp);
3437
	rtl_ephy_write(tp, 0x1e, rtl_ephy_read(tp, 0x1e) | 0x8000);
3438 3439
}

3440 3441 3442 3443 3444 3445 3446
static void rtl_hw_start_8402(struct rtl8169_private *tp)
{
	static const struct ephy_info e_info_8402[] = {
		{ 0x19,	0xffff, 0xff64 },
		{ 0x1e,	0, 0x4000 }
	};

3447
	rtl_set_def_aspm_entry_latency(tp);
3448 3449

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

3452
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
3453

3454
	rtl_ephy_init(tp, e_info_8402);
3455

H
Heiner Kallweit 已提交
3456
	rtl_set_fifo_size(tp, 0x00, 0x00, 0x02, 0x06);
3457
	rtl_reset_packet_filter(tp);
3458 3459
	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000);
	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000);
3460
	rtl_w0w1_eri(tp, 0x0d4, 0x0e00, 0xff00);
H
hayeswang 已提交
3461

3462 3463 3464
	/* disable EEE */
	rtl_eri_write(tp, 0x1b0, ERIAR_MASK_0011, 0x0000);

3465
	rtl_pcie_state_l2l3_disable(tp);
3466 3467
}

H
Hayes Wang 已提交
3468 3469
static void rtl_hw_start_8106(struct rtl8169_private *tp)
{
K
Kai-Heng Feng 已提交
3470 3471
	rtl_hw_aspm_clkreq_enable(tp, false);

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

3475 3476 3477
	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 已提交
3478

3479 3480
	rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000);

3481 3482 3483
	/* disable EEE */
	rtl_eri_write(tp, 0x1b0, ERIAR_MASK_0011, 0x0000);

3484
	rtl_pcie_state_l2l3_disable(tp);
K
Kai-Heng Feng 已提交
3485
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Hayes Wang 已提交
3486 3487
}

H
Heiner Kallweit 已提交
3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515
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);

3516 3517 3518 3519 3520 3521 3522 3523 3524 3525
	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 已提交
3526 3527 3528 3529 3530
	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);
3531
	r8168_mac_ocp_modify(tp, 0xea1c, 0x0003, 0x0001);
H
Heiner Kallweit 已提交
3532
	r8168_mac_ocp_modify(tp, 0xe0c0, 0x4f0f, 0x4403);
3533
	r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0068);
H
Heiner Kallweit 已提交
3534 3535
	r8168_mac_ocp_modify(tp, 0xc0ac, 0x0080, 0x1f00);
	r8168_mac_ocp_modify(tp, 0xd430, 0x0fff, 0x047f);
3536

H
Heiner Kallweit 已提交
3537 3538 3539 3540 3541 3542 3543 3544
	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);

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

3547 3548 3549 3550
	if (tp->mac_version == RTL_GIGA_MAC_VER_63)
		rtl8125b_config_eee_mac(tp);
	else
		rtl8125a_config_eee_mac(tp);
3551

H
Heiner Kallweit 已提交
3552 3553 3554 3555
	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
	udelay(10);
}

3556
static void rtl_hw_start_8125a_1(struct rtl8169_private *tp)
H
Heiner Kallweit 已提交
3557
{
3558
	static const struct ephy_info e_info_8125a_1[] = {
H
Heiner Kallweit 已提交
3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589
		{ 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);
3590
	rtl_ephy_init(tp, e_info_8125a_1);
H
Heiner Kallweit 已提交
3591 3592

	rtl_hw_start_8125_common(tp);
3593
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Heiner Kallweit 已提交
3594 3595
}

3596
static void rtl_hw_start_8125a_2(struct rtl8169_private *tp)
H
Heiner Kallweit 已提交
3597
{
3598
	static const struct ephy_info e_info_8125a_2[] = {
H
Heiner Kallweit 已提交
3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617
		{ 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);
3618
	rtl_ephy_init(tp, e_info_8125a_2);
H
Heiner Kallweit 已提交
3619 3620

	rtl_hw_start_8125_common(tp);
3621
	rtl_hw_aspm_clkreq_enable(tp, true);
H
Heiner Kallweit 已提交
3622 3623
}

3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643
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);
}

3644 3645 3646 3647 3648 3649 3650
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,
3651 3652
		[RTL_GIGA_MAC_VER_11] = rtl_hw_start_8168b,
		[RTL_GIGA_MAC_VER_12] = rtl_hw_start_8168b,
3653
		[RTL_GIGA_MAC_VER_13] = NULL,
3654
		[RTL_GIGA_MAC_VER_14] = rtl_hw_start_8401,
3655
		[RTL_GIGA_MAC_VER_16] = NULL,
3656
		[RTL_GIGA_MAC_VER_17] = rtl_hw_start_8168b,
3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669
		[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,
3670
		[RTL_GIGA_MAC_VER_31] = rtl_hw_start_8168d,
3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690
		[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 已提交
3691
		[RTL_GIGA_MAC_VER_52] = rtl_hw_start_8117,
3692 3693
		[RTL_GIGA_MAC_VER_60] = rtl_hw_start_8125a_1,
		[RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2,
3694
		[RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b,
3695 3696 3697 3698 3699 3700
	};

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

H
Heiner Kallweit 已提交
3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711
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);
}

3712
static void rtl_hw_start_8168(struct rtl8169_private *tp)
3713
{
3714 3715 3716 3717
	if (rtl_is_8168evl_up(tp))
		RTL_W8(tp, MaxTxPacketSize, EarlySize);
	else
		RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
H
hayeswang 已提交
3718

3719
	rtl_hw_config(tp);
3720 3721 3722

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

3725 3726 3727 3728 3729 3730 3731
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 已提交
3732 3733
	    tp->mac_version == RTL_GIGA_MAC_VER_03)
		tp->cp_cmd |= EnAnaPLL;
3734 3735 3736

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

3737
	rtl8169_set_magic_reg(tp);
3738

3739 3740
	/* disable interrupt coalescing */
	RTL_W16(tp, IntrMitigate, 0x0000);
3741 3742 3743 3744 3745 3746 3747 3748 3749 3750
}

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 已提交
3751 3752
	else if (rtl_is_8125(tp))
		rtl_hw_start_8125(tp);
3753 3754 3755 3756 3757 3758 3759
	else
		rtl_hw_start_8168(tp);

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

3760
	rtl_jumbo_config(tp);
3761

3762
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
3763 3764
	rtl_pci_commit(tp);

3765 3766 3767
	RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
	rtl_init_rxcfg(tp);
	rtl_set_tx_config_registers(tp);
3768
	rtl_set_rx_config_features(tp, tp->dev->features);
3769 3770 3771 3772
	rtl_set_rx_mode(tp->dev);
	rtl_irq_enable(tp);
}

L
Linus Torvalds 已提交
3773 3774
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
{
F
Francois Romieu 已提交
3775 3776
	struct rtl8169_private *tp = netdev_priv(dev);

L
Linus Torvalds 已提交
3777
	dev->mtu = new_mtu;
3778
	netdev_update_features(dev);
3779
	rtl_jumbo_config(tp);
3780

3781 3782 3783 3784 3785 3786 3787 3788 3789
	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 已提交
3790
	return 0;
L
Linus Torvalds 已提交
3791 3792
}

3793
static void rtl8169_mark_to_asic(struct RxDesc *desc)
L
Linus Torvalds 已提交
3794 3795 3796
{
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;

3797
	desc->opts2 = 0;
3798 3799
	/* Force memory writes to complete before releasing descriptor */
	dma_wmb();
3800
	WRITE_ONCE(desc->opts1, cpu_to_le32(DescOwn | eor | R8169_RX_BUF_SIZE));
L
Linus Torvalds 已提交
3801 3802
}

3803 3804
static struct page *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
					  struct RxDesc *desc)
L
Linus Torvalds 已提交
3805
{
H
Heiner Kallweit 已提交
3806
	struct device *d = tp_to_dev(tp);
3807
	int node = dev_to_node(d);
3808 3809
	dma_addr_t mapping;
	struct page *data;
L
Linus Torvalds 已提交
3810

3811
	data = alloc_pages_node(node, GFP_KERNEL, get_order(R8169_RX_BUF_SIZE));
E
Eric Dumazet 已提交
3812 3813
	if (!data)
		return NULL;
3814

3815
	mapping = dma_map_page(d, data, 0, R8169_RX_BUF_SIZE, DMA_FROM_DEVICE);
3816
	if (unlikely(dma_mapping_error(d, mapping))) {
3817
		netdev_err(tp->dev, "Failed to map RX DMA!\n");
3818 3819
		__free_pages(data, get_order(R8169_RX_BUF_SIZE));
		return NULL;
3820
	}
L
Linus Torvalds 已提交
3821

3822 3823
	desc->addr = cpu_to_le64(mapping);
	rtl8169_mark_to_asic(desc);
3824

3825
	return data;
L
Linus Torvalds 已提交
3826 3827 3828 3829
}

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

3832 3833 3834 3835 3836 3837
	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;
3838 3839
		tp->RxDescArray[i].addr = 0;
		tp->RxDescArray[i].opts1 = 0;
L
Linus Torvalds 已提交
3840 3841 3842
	}
}

S
Stanislaw Gruszka 已提交
3843 3844
static int rtl8169_rx_fill(struct rtl8169_private *tp)
{
3845
	int i;
L
Linus Torvalds 已提交
3846

S
Stanislaw Gruszka 已提交
3847
	for (i = 0; i < NUM_RX_DESC; i++) {
3848
		struct page *data;
3849

S
Stanislaw Gruszka 已提交
3850
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
E
Eric Dumazet 已提交
3851
		if (!data) {
H
Heiner Kallweit 已提交
3852 3853
			rtl8169_rx_clear(tp);
			return -ENOMEM;
E
Eric Dumazet 已提交
3854 3855
		}
		tp->Rx_databuff[i] = data;
L
Linus Torvalds 已提交
3856 3857
	}

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

H
Heiner Kallweit 已提交
3861
	return 0;
L
Linus Torvalds 已提交
3862 3863
}

3864
static int rtl8169_init_ring(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
3865 3866 3867
{
	rtl8169_init_ring_indexes(tp);

3868 3869
	memset(tp->tx_skb, 0, sizeof(tp->tx_skb));
	memset(tp->Rx_databuff, 0, sizeof(tp->Rx_databuff));
L
Linus Torvalds 已提交
3870

S
Stanislaw Gruszka 已提交
3871
	return rtl8169_rx_fill(tp);
L
Linus Torvalds 已提交
3872 3873
}

3874
static void rtl8169_unmap_tx_skb(struct rtl8169_private *tp, unsigned int entry)
L
Linus Torvalds 已提交
3875
{
3876 3877
	struct ring_info *tx_skb = tp->tx_skb + entry;
	struct TxDesc *desc = tp->TxDescArray + entry;
L
Linus Torvalds 已提交
3878

3879 3880
	dma_unmap_single(tp_to_dev(tp), le64_to_cpu(desc->addr), tx_skb->len,
			 DMA_TO_DEVICE);
3881 3882
	memset(desc, 0, sizeof(*desc));
	memset(tx_skb, 0, sizeof(*tx_skb));
L
Linus Torvalds 已提交
3883 3884
}

3885 3886
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
				   unsigned int n)
L
Linus Torvalds 已提交
3887 3888 3889
{
	unsigned int i;

3890 3891
	for (i = 0; i < n; i++) {
		unsigned int entry = (start + i) % NUM_TX_DESC;
L
Linus Torvalds 已提交
3892 3893 3894 3895 3896 3897
		struct ring_info *tx_skb = tp->tx_skb + entry;
		unsigned int len = tx_skb->len;

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

3898
			rtl8169_unmap_tx_skb(tp, entry);
3899
			if (skb)
3900
				dev_consume_skb_any(skb);
L
Linus Torvalds 已提交
3901 3902
		}
	}
3903 3904 3905 3906 3907
}

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

3911
static void rtl8169_cleanup(struct rtl8169_private *tp, bool going_down)
3912
{
3913 3914
	napi_disable(&tp->napi);

3915
	/* Give a racing hard_start_xmit a few cycles to complete. */
3916
	synchronize_net();
3917 3918 3919 3920 3921 3922

	/* Disable interrupts */
	rtl8169_irq_mask_and_ack(tp);

	rtl_rx_close(tp);

H
Heiner Kallweit 已提交
3923 3924 3925
	if (going_down && tp->dev->wol_enabled)
		goto no_reset;

3926 3927 3928 3929 3930 3931 3932 3933 3934 3935
	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;
3936
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
3937 3938 3939 3940 3941 3942 3943 3944 3945 3946
		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 已提交
3947
no_reset:
3948 3949 3950 3951
	rtl8169_tx_clear(tp);
	rtl8169_init_ring_indexes(tp);
}

3952
static void rtl_reset_work(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
3953
{
3954
	int i;
L
Linus Torvalds 已提交
3955

3956
	netif_stop_queue(tp->dev);
L
Linus Torvalds 已提交
3957

3958
	rtl8169_cleanup(tp, false);
3959

3960
	for (i = 0; i < NUM_RX_DESC; i++)
3961
		rtl8169_mark_to_asic(tp->RxDescArray + i);
3962

3963
	napi_enable(&tp->napi);
3964
	rtl_hw_start(tp);
L
Linus Torvalds 已提交
3965 3966
}

3967
static void rtl8169_tx_timeout(struct net_device *dev, unsigned int txqueue)
L
Linus Torvalds 已提交
3968
{
3969 3970 3971
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
L
Linus Torvalds 已提交
3972 3973
}

3974 3975
static int rtl8169_tx_map(struct rtl8169_private *tp, const u32 *opts, u32 len,
			  void *addr, unsigned int entry, bool desc_own)
3976
{
3977 3978 3979 3980 3981 3982 3983 3984 3985 3986
	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())
3987
			netdev_err(tp->dev, "Failed to map TX data!\n");
3988 3989 3990 3991 3992
		return ret;
	}

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

3994
	opts1 = opts[0] | len;
3995
	if (entry == NUM_TX_DESC - 1)
3996 3997 3998 3999
		opts1 |= RingEnd;
	if (desc_own)
		opts1 |= DescOwn;
	txd->opts1 = cpu_to_le32(opts1);
4000

4001 4002 4003
	tp->tx_skb[entry].len = len;

	return 0;
4004 4005
}

L
Linus Torvalds 已提交
4006
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
4007
			      const u32 *opts, unsigned int entry)
L
Linus Torvalds 已提交
4008 4009
{
	struct skb_shared_info *info = skb_shinfo(skb);
4010
	unsigned int cur_frag;
L
Linus Torvalds 已提交
4011 4012

	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
E
Eric Dumazet 已提交
4013
		const skb_frag_t *frag = info->frags + cur_frag;
4014 4015
		void *addr = skb_frag_address(frag);
		u32 len = skb_frag_size(frag);
L
Linus Torvalds 已提交
4016 4017 4018

		entry = (entry + 1) % NUM_TX_DESC;

4019
		if (unlikely(rtl8169_tx_map(tp, opts, len, addr, entry, true)))
4020
			goto err_out;
L
Linus Torvalds 已提交
4021 4022
	}

4023
	return 0;
4024 4025 4026 4027

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

4030
static bool rtl_test_hw_pad_bug(struct rtl8169_private *tp)
4031
{
4032 4033 4034 4035 4036 4037 4038 4039 4040
	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;
	}
4041 4042
}

4043
static void rtl8169_tso_csum_v1(struct sk_buff *skb, u32 *opts)
L
Linus Torvalds 已提交
4044
{
4045 4046
	u32 mss = skb_shinfo(skb)->gso_size;

F
Francois Romieu 已提交
4047 4048
	if (mss) {
		opts[0] |= TD_LSO;
4049
		opts[0] |= mss << TD0_MSS_SHIFT;
H
hayeswang 已提交
4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064
	} 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 已提交
4065
	u32 transport_offset = (u32)skb_transport_offset(skb);
4066 4067
	struct skb_shared_info *shinfo = skb_shinfo(skb);
	u32 mss = shinfo->gso_size;
H
hayeswang 已提交
4068 4069

	if (mss) {
4070
		if (shinfo->gso_type & SKB_GSO_TCPV4) {
H
hayeswang 已提交
4071
			opts[0] |= TD1_GTSENV4;
4072
		} else if (shinfo->gso_type & SKB_GSO_TCPV6) {
4073
			if (skb_cow_head(skb, 0))
H
hayeswang 已提交
4074 4075
				return false;

4076
			tcp_v6_gso_csum_prep(skb);
H
hayeswang 已提交
4077
			opts[0] |= TD1_GTSENV6;
4078
		} else {
H
hayeswang 已提交
4079 4080 4081
			WARN_ON_ONCE(1);
		}

H
hayeswang 已提交
4082
		opts[0] |= transport_offset << GTTCPHO_SHIFT;
4083
		opts[1] |= mss << TD1_MSS_SHIFT;
F
Francois Romieu 已提交
4084
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
H
hayeswang 已提交
4085
		u8 ip_protocol;
L
Linus Torvalds 已提交
4086

4087
		switch (vlan_get_protocol(skb)) {
H
hayeswang 已提交
4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106
		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 已提交
4107 4108
		else
			WARN_ON_ONCE(1);
H
hayeswang 已提交
4109 4110

		opts[1] |= transport_offset << TCPHO_SHIFT;
4111
	} else {
4112
		if (unlikely(skb->len < ETH_ZLEN && rtl_test_hw_pad_bug(tp)))
4113 4114
			/* eth_skb_pad would free the skb on error */
			return !__skb_put_padto(skb, ETH_ZLEN, false);
L
Linus Torvalds 已提交
4115
	}
H
hayeswang 已提交
4116

4117
	return true;
L
Linus Torvalds 已提交
4118 4119
}

4120
static bool rtl_tx_slots_avail(struct rtl8169_private *tp)
4121
{
4122 4123
	unsigned int slots_avail = READ_ONCE(tp->dirty_tx) + NUM_TX_DESC
					- READ_ONCE(tp->cur_tx);
4124 4125

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

4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140
/* 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 已提交
4141 4142 4143 4144 4145 4146 4147 4148
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);
}

4149 4150
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
				      struct net_device *dev)
L
Linus Torvalds 已提交
4151
{
4152
	unsigned int frags = skb_shinfo(skb)->nr_frags;
L
Linus Torvalds 已提交
4153
	struct rtl8169_private *tp = netdev_priv(dev);
4154
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
4155 4156 4157 4158
	struct TxDesc *txd_first, *txd_last;
	bool stop_queue, door_bell;
	u32 opts[2];

4159
	if (unlikely(!rtl_tx_slots_avail(tp))) {
4160 4161
		if (net_ratelimit())
			netdev_err(dev, "BUG! Tx Ring full when queue awake!\n");
4162
		goto err_stop_0;
L
Linus Torvalds 已提交
4163 4164
	}

4165
	opts[1] = rtl8169_tx_vlan_tag(skb);
4166
	opts[0] = 0;
4167

4168
	if (!rtl_chip_supports_csum_v2(tp))
4169
		rtl8169_tso_csum_v1(skb, opts);
4170
	else if (!rtl8169_tso_csum_v2(tp, skb, opts))
4171 4172
		goto err_dma_0;

4173 4174 4175
	if (unlikely(rtl8169_tx_map(tp, opts, skb_headlen(skb), skb->data,
				    entry, false)))
		goto err_dma_0;
L
Linus Torvalds 已提交
4176

4177 4178
	txd_first = tp->TxDescArray + entry;

4179 4180
	if (frags) {
		if (rtl8169_xmit_frags(tp, skb, opts, entry))
4181
			goto err_dma_1;
4182
		entry = (entry + frags) % NUM_TX_DESC;
L
Linus Torvalds 已提交
4183 4184
	}

4185 4186 4187
	txd_last = tp->TxDescArray + entry;
	txd_last->opts1 |= cpu_to_le32(LastFrag);
	tp->tx_skb[entry].skb = skb;
F
Francois Romieu 已提交
4188

4189 4190
	skb_tx_timestamp(skb);

4191 4192
	/* Force memory writes to complete before releasing descriptor */
	dma_wmb();
L
Linus Torvalds 已提交
4193

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

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

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

4201
	WRITE_ONCE(tp->cur_tx, tp->cur_tx + frags + 1);
4202

4203
	stop_queue = !rtl_tx_slots_avail(tp);
H
Heiner Kallweit 已提交
4204
	if (unlikely(stop_queue)) {
4205 4206 4207 4208 4209
		/* 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);
4210 4211 4212 4213 4214 4215 4216
		/* 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.
		 */
4217
		smp_mb__after_atomic();
4218
		if (rtl_tx_slots_avail(tp))
4219
			netif_start_queue(dev);
4220
		door_bell = true;
L
Linus Torvalds 已提交
4221 4222
	}

4223 4224 4225
	if (door_bell)
		rtl8169_doorbell(tp);

4226
	return NETDEV_TX_OK;
L
Linus Torvalds 已提交
4227

4228
err_dma_1:
4229
	rtl8169_unmap_tx_skb(tp, entry);
4230
err_dma_0:
4231
	dev_kfree_skb_any(skb);
4232 4233 4234 4235
	dev->stats.tx_dropped++;
	return NETDEV_TX_OK;

err_stop_0:
L
Linus Torvalds 已提交
4236
	netif_stop_queue(dev);
4237
	dev->stats.tx_dropped++;
4238
	return NETDEV_TX_BUSY;
L
Linus Torvalds 已提交
4239 4240
}

4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271
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;
}

4272 4273 4274 4275 4276 4277 4278 4279
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)) {
4280 4281 4282
		if (tp->mac_version == RTL_GIGA_MAC_VER_34)
			features = rtl8168evl_fix_tso(skb, features);

4283 4284 4285 4286
		if (transport_offset > GTTCPHO_MAX &&
		    rtl_chip_supports_csum_v2(tp))
			features &= ~NETIF_F_ALL_TSO;
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
4287 4288 4289
		/* work around hw bug on some chip versions */
		if (skb->len < ETH_ZLEN)
			features &= ~NETIF_F_CSUM_MASK;
4290 4291 4292 4293 4294 4295 4296 4297 4298

		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 已提交
4299 4300 4301 4302
static void rtl8169_pcierr_interrupt(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
4303 4304
	int pci_status_errs;
	u16 pci_cmd;
L
Linus Torvalds 已提交
4305 4306 4307

	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);

4308 4309
	pci_status_errs = pci_status_get_and_clear_errors(pdev);

4310 4311 4312
	if (net_ratelimit())
		netdev_err(dev, "PCI error (cmd = 0x%04x, status_errs = 0x%04x)\n",
			   pci_cmd, pci_status_errs);
L
Linus Torvalds 已提交
4313 4314 4315
	/*
	 * The recovery sequence below admits a very elaborated explanation:
	 * - it seems to work;
4316 4317
	 * - I did not see what else could be done;
	 * - it makes iop3xx happy.
L
Linus Torvalds 已提交
4318 4319 4320
	 *
	 * Feel free to adjust to your needs.
	 */
4321
	if (pdev->broken_parity_status)
4322 4323 4324 4325 4326
		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 已提交
4327

4328
	rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
L
Linus Torvalds 已提交
4329 4330
}

4331 4332
static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
		   int budget)
L
Linus Torvalds 已提交
4333
{
H
Heiner Kallweit 已提交
4334
	unsigned int dirty_tx, bytes_compl = 0, pkts_compl = 0;
4335
	struct sk_buff *skb;
L
Linus Torvalds 已提交
4336 4337 4338

	dirty_tx = tp->dirty_tx;

H
Heiner Kallweit 已提交
4339
	while (READ_ONCE(tp->cur_tx) != dirty_tx) {
L
Linus Torvalds 已提交
4340 4341 4342 4343 4344 4345 4346
		unsigned int entry = dirty_tx % NUM_TX_DESC;
		u32 status;

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

4347
		skb = tp->tx_skb[entry].skb;
4348 4349
		rtl8169_unmap_tx_skb(tp, entry);

4350
		if (skb) {
4351
			pkts_compl++;
4352 4353
			bytes_compl += skb->len;
			napi_consume_skb(skb, budget);
L
Linus Torvalds 已提交
4354 4355 4356 4357 4358
		}
		dirty_tx++;
	}

	if (tp->dirty_tx != dirty_tx) {
4359
		netdev_completed_queue(dev, pkts_compl, bytes_compl);
4360
		dev_sw_netstats_tx_add(dev, pkts_compl, bytes_compl);
4361

4362 4363 4364 4365 4366 4367 4368
		/* 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 已提交
4369
		smp_store_mb(tp->dirty_tx, dirty_tx);
4370
		if (netif_queue_stopped(dev) && rtl_tx_slots_avail(tp))
L
Linus Torvalds 已提交
4371
			netif_wake_queue(dev);
4372 4373 4374 4375 4376
		/*
		 * 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
4377 4378
		 * If skb is NULL then we come here again once a tx irq is
		 * triggered after the last fragment is marked transmitted.
4379
		 */
4380
		if (tp->cur_tx != dirty_tx && skb)
H
Heiner Kallweit 已提交
4381
			rtl8169_doorbell(tp);
L
Linus Torvalds 已提交
4382 4383 4384
	}
}

4385 4386 4387 4388 4389
static inline int rtl8169_fragmented_frame(u32 status)
{
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
}

E
Eric Dumazet 已提交
4390
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
L
Linus Torvalds 已提交
4391 4392 4393 4394
{
	u32 status = opts1 & RxProtoMask;

	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
S
Shan Wei 已提交
4395
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
L
Linus Torvalds 已提交
4396 4397
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	else
4398
		skb_checksum_none_assert(skb);
L
Linus Torvalds 已提交
4399 4400
}

H
Heiner Kallweit 已提交
4401
static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, int budget)
L
Linus Torvalds 已提交
4402
{
4403
	struct device *d = tp_to_dev(tp);
H
Heiner Kallweit 已提交
4404
	int count;
L
Linus Torvalds 已提交
4405

H
Heiner Kallweit 已提交
4406 4407
	for (count = 0; count < budget; count++, tp->cur_rx++) {
		unsigned int pkt_size, entry = tp->cur_rx % NUM_RX_DESC;
4408
		struct RxDesc *desc = tp->RxDescArray + entry;
4409 4410 4411
		struct sk_buff *skb;
		const void *rx_buf;
		dma_addr_t addr;
L
Linus Torvalds 已提交
4412 4413
		u32 status;

4414
		status = le32_to_cpu(desc->opts1);
L
Linus Torvalds 已提交
4415 4416
		if (status & DescOwn)
			break;
4417 4418 4419 4420 4421 4422 4423

		/* 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 已提交
4424
		if (unlikely(status & RxRES)) {
4425 4426 4427
			if (net_ratelimit())
				netdev_warn(dev, "Rx ERROR. status = %08x\n",
					    status);
4428
			dev->stats.rx_errors++;
L
Linus Torvalds 已提交
4429
			if (status & (RxRWT | RxRUNT))
4430
				dev->stats.rx_length_errors++;
L
Linus Torvalds 已提交
4431
			if (status & RxCRC)
4432
				dev->stats.rx_crc_errors++;
4433

4434
			if (!(dev->features & NETIF_F_RXALL))
4435
				goto release_descriptor;
4436 4437 4438
			else if (status & RxRWT || !(status & (RxRUNT | RxCRC)))
				goto release_descriptor;
		}
L
Linus Torvalds 已提交
4439

4440 4441 4442
		pkt_size = status & GENMASK(13, 0);
		if (likely(!(dev->features & NETIF_F_RXFCS)))
			pkt_size -= ETH_FCS_LEN;
H
Heiner Kallweit 已提交
4443

4444 4445 4446 4447 4448 4449 4450 4451
		/* 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;
		}
4452

4453 4454 4455 4456 4457
		skb = napi_alloc_skb(&tp->napi, pkt_size);
		if (unlikely(!skb)) {
			dev->stats.rx_dropped++;
			goto release_descriptor;
		}
L
Linus Torvalds 已提交
4458

4459 4460
		addr = le64_to_cpu(desc->addr);
		rx_buf = page_address(tp->Rx_databuff[entry]);
4461

4462 4463 4464 4465 4466 4467
		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);
4468

4469 4470 4471 4472 4473 4474 4475 4476 4477 4478
		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);

4479
		dev_sw_netstats_rx_add(dev, pkt_size);
4480
release_descriptor:
4481
		rtl8169_mark_to_asic(desc);
L
Linus Torvalds 已提交
4482 4483 4484 4485 4486
	}

	return count;
}

F
Francois Romieu 已提交
4487
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
L
Linus Torvalds 已提交
4488
{
4489
	struct rtl8169_private *tp = dev_instance;
4490
	u32 status = rtl_get_events(tp);
L
Linus Torvalds 已提交
4491

4492
	if ((status & 0xffff) == 0xffff || !(status & tp->irq_mask))
4493
		return IRQ_NONE;
L
Linus Torvalds 已提交
4494

4495 4496 4497 4498
	if (unlikely(status & SYSErr)) {
		rtl8169_pcierr_interrupt(tp->dev);
		goto out;
	}
4499

4500 4501
	if (status & LinkChg)
		phy_mac_interrupt(tp->phydev);
L
Linus Torvalds 已提交
4502

4503 4504 4505
	if (unlikely(status & RxFIFOOver &&
	    tp->mac_version == RTL_GIGA_MAC_VER_11)) {
		netif_stop_queue(tp->dev);
4506
		rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
4507
	}
L
Linus Torvalds 已提交
4508

4509
	rtl_irq_disable(tp);
4510
	napi_schedule(&tp->napi);
4511 4512
out:
	rtl_ack_events(tp, status);
L
Linus Torvalds 已提交
4513

4514
	return IRQ_HANDLED;
L
Linus Torvalds 已提交
4515 4516
}

4517 4518 4519 4520
static void rtl_task(struct work_struct *work)
{
	struct rtl8169_private *tp =
		container_of(work, struct rtl8169_private, wk.work);
4521

4522
	rtnl_lock();
4523

H
Heiner Kallweit 已提交
4524
	if (!netif_running(tp->dev) ||
4525
	    !test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
4526 4527
		goto out_unlock;

4528
	if (test_and_clear_bit(RTL_FLAG_TASK_RESET_PENDING, tp->wk.flags)) {
H
Heiner Kallweit 已提交
4529
		rtl_reset_work(tp);
4530 4531
		netif_wake_queue(tp->dev);
	}
4532
out_unlock:
4533
	rtnl_unlock();
4534 4535
}

4536
static int rtl8169_poll(struct napi_struct *napi, int budget)
L
Linus Torvalds 已提交
4537
{
4538 4539
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
	struct net_device *dev = tp->dev;
4540
	int work_done;
4541

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

4544
	rtl_tx(dev, tp, budget);
L
Linus Torvalds 已提交
4545

4546
	if (work_done < budget && napi_complete_done(napi, work_done))
4547
		rtl_irq_enable(tp);
L
Linus Torvalds 已提交
4548

4549
	return work_done;
L
Linus Torvalds 已提交
4550 4551
}

4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563
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())
4564
		phy_print_status(tp->phydev);
4565 4566 4567 4568
}

static int r8169_phy_connect(struct rtl8169_private *tp)
{
4569
	struct phy_device *phydev = tp->phydev;
4570 4571 4572
	phy_interface_t phy_mode;
	int ret;

4573
	phy_mode = tp->supports_gmii ? PHY_INTERFACE_MODE_GMII :
4574 4575 4576 4577 4578 4579 4580
		   PHY_INTERFACE_MODE_MII;

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

4581
	if (!tp->supports_gmii)
4582 4583
		phy_set_max_speed(phydev, SPEED_100);

4584
	phy_support_asym_pause(phydev);
4585 4586 4587 4588 4589 4590

	phy_attached_info(phydev);

	return 0;
}

4591
static void rtl8169_down(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
4592
{
4593 4594
	/* Clear all task flags */
	bitmap_zero(tp->wk.flags, RTL_FLAG_MAX);
4595

4596
	phy_stop(tp->phydev);
L
Linus Torvalds 已提交
4597

4598 4599
	rtl8169_update_counters(tp);

4600
	rtl8169_cleanup(tp, true);
L
Linus Torvalds 已提交
4601

4602
	rtl_prepare_power_down(tp);
L
Linus Torvalds 已提交
4603 4604
}

H
Heiner Kallweit 已提交
4605 4606
static void rtl8169_up(struct rtl8169_private *tp)
{
4607
	phy_resume(tp->phydev);
H
Heiner Kallweit 已提交
4608 4609 4610 4611 4612 4613 4614 4615
	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 已提交
4616 4617 4618 4619 4620
static int rtl8169_close(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;

4621 4622
	pm_runtime_get_sync(&pdev->dev);

4623 4624 4625
	netif_stop_queue(dev);
	rtl8169_down(tp);
	rtl8169_rx_clear(tp);
L
Linus Torvalds 已提交
4626

4627 4628
	cancel_work_sync(&tp->wk.work);

4629
	phy_disconnect(tp->phydev);
4630

4631
	free_irq(pci_irq_vector(pdev, 0), tp);
L
Linus Torvalds 已提交
4632

4633 4634 4635 4636
	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 已提交
4637 4638 4639
	tp->TxDescArray = NULL;
	tp->RxDescArray = NULL;

4640 4641
	pm_runtime_put_sync(&pdev->dev);

L
Linus Torvalds 已提交
4642 4643 4644
	return 0;
}

4645 4646 4647 4648 4649
#ifdef CONFIG_NET_POLL_CONTROLLER
static void rtl8169_netpoll(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

V
Ville Syrjälä 已提交
4650
	rtl8169_interrupt(pci_irq_vector(tp->pci_dev, 0), tp);
4651 4652 4653
}
#endif

4654 4655 4656 4657
static int rtl_open(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
4658
	unsigned long irqflags;
4659 4660 4661 4662 4663
	int retval = -ENOMEM;

	pm_runtime_get_sync(&pdev->dev);

	/*
4664
	 * Rx and Tx descriptors needs 256 bytes alignment.
4665 4666 4667 4668 4669
	 * dma_alloc_coherent provides more.
	 */
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
					     &tp->TxPhyAddr, GFP_KERNEL);
	if (!tp->TxDescArray)
4670
		goto out;
4671 4672 4673 4674 4675 4676

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

4677
	retval = rtl8169_init_ring(tp);
4678 4679 4680 4681 4682
	if (retval < 0)
		goto err_free_rx_1;

	rtl_request_firmware(tp);

4683
	irqflags = pci_dev_msi_enabled(pdev) ? IRQF_NO_THREAD : IRQF_SHARED;
4684
	retval = request_irq(pci_irq_vector(pdev, 0), rtl8169_interrupt,
4685
			     irqflags, dev->name, tp);
4686 4687 4688
	if (retval < 0)
		goto err_release_fw_2;

4689 4690 4691 4692
	retval = r8169_phy_connect(tp);
	if (retval)
		goto err_free_irq;

H
Heiner Kallweit 已提交
4693
	rtl8169_up(tp);
4694
	rtl8169_init_counter_offsets(tp);
4695 4696
	netif_start_queue(dev);
out:
4697 4698
	pm_runtime_put_sync(&pdev->dev);

4699 4700
	return retval;

4701
err_free_irq:
4702
	free_irq(pci_irq_vector(pdev, 0), tp);
4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716
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;
}

4717
static void
J
Junchang Wang 已提交
4718
rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
L
Linus Torvalds 已提交
4719 4720
{
	struct rtl8169_private *tp = netdev_priv(dev);
4721
	struct pci_dev *pdev = tp->pci_dev;
4722
	struct rtl8169_counters *counters = tp->counters;
L
Linus Torvalds 已提交
4723

4724 4725
	pm_runtime_get_noresume(&pdev->dev);

4726
	netdev_stats_to_stats64(stats, &dev->stats);
4727
	dev_fetch_sw_netstats(stats, dev->tstats);
J
Junchang Wang 已提交
4728

4729
	/*
C
Corentin Musard 已提交
4730
	 * Fetch additional counter values missing in stats collected by driver
4731 4732
	 * from tally counters.
	 */
4733
	if (pm_runtime_active(&pdev->dev))
4734
		rtl8169_update_counters(tp);
4735 4736 4737 4738 4739

	/*
	 * Subtract values fetched during initalization.
	 * See rtl8169_init_counter_offsets for a description why we do that.
	 */
4740
	stats->tx_errors = le64_to_cpu(counters->tx_errors) -
4741
		le64_to_cpu(tp->tc_offset.tx_errors);
4742
	stats->collisions = le32_to_cpu(counters->tx_multi_collision) -
4743
		le32_to_cpu(tp->tc_offset.tx_multi_collision);
4744
	stats->tx_aborted_errors = le16_to_cpu(counters->tx_aborted) -
4745
		le16_to_cpu(tp->tc_offset.tx_aborted);
4746 4747
	stats->rx_missed_errors = le16_to_cpu(counters->rx_missed) -
		le16_to_cpu(tp->tc_offset.rx_missed);
4748

4749
	pm_runtime_put_noidle(&pdev->dev);
L
Linus Torvalds 已提交
4750 4751
}

H
Heiner Kallweit 已提交
4752
static void rtl8169_net_suspend(struct rtl8169_private *tp)
4753
{
H
Heiner Kallweit 已提交
4754
	netif_device_detach(tp->dev);
4755 4756 4757

	if (netif_running(tp->dev))
		rtl8169_down(tp);
4758 4759 4760 4761
}

#ifdef CONFIG_PM

H
Heiner Kallweit 已提交
4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773
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;
}

4774
static int __maybe_unused rtl8169_suspend(struct device *device)
4775
{
H
Heiner Kallweit 已提交
4776
	struct rtl8169_private *tp = dev_get_drvdata(device);
4777

4778
	rtnl_lock();
H
Heiner Kallweit 已提交
4779
	rtl8169_net_suspend(tp);
H
Heiner Kallweit 已提交
4780 4781
	if (!device_may_wakeup(tp_to_dev(tp)))
		clk_disable_unprepare(tp->clk);
4782
	rtnl_unlock();
4783

4784 4785 4786
	return 0;
}

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

H
Heiner Kallweit 已提交
4791 4792
	if (!device_may_wakeup(tp_to_dev(tp)))
		clk_prepare_enable(tp->clk);
4793

4794 4795 4796
	/* Reportedly at least Asus X453MA truncates packets otherwise */
	if (tp->mac_version == RTL_GIGA_MAC_VER_37)
		rtl_init_rxcfg(tp);
4797

H
Heiner Kallweit 已提交
4798
	return rtl8169_net_resume(tp);
4799 4800 4801 4802
}

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

4805 4806
	if (!tp->TxDescArray) {
		netif_device_detach(tp->dev);
4807
		return 0;
4808
	}
4809

4810
	rtnl_lock();
4811
	__rtl8169_set_wol(tp, WAKE_PHY);
H
Heiner Kallweit 已提交
4812
	rtl8169_net_suspend(tp);
4813
	rtnl_unlock();
4814 4815 4816 4817 4818 4819

	return 0;
}

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

4822 4823
	__rtl8169_set_wol(tp, tp->saved_wolopts);

H
Heiner Kallweit 已提交
4824
	return rtl8169_net_resume(tp);
4825 4826
}

4827 4828
static int rtl8169_runtime_idle(struct device *device)
{
H
Heiner Kallweit 已提交
4829
	struct rtl8169_private *tp = dev_get_drvdata(device);
4830

H
Heiner Kallweit 已提交
4831
	if (!netif_running(tp->dev) || !netif_carrier_ok(tp->dev))
4832 4833 4834
		pm_schedule_suspend(device, 10000);

	return -EBUSY;
4835 4836
}

4837
static const struct dev_pm_ops rtl8169_pm_ops = {
4838 4839 4840
	SET_SYSTEM_SLEEP_PM_OPS(rtl8169_suspend, rtl8169_resume)
	SET_RUNTIME_PM_OPS(rtl8169_runtime_suspend, rtl8169_runtime_resume,
			   rtl8169_runtime_idle)
4841 4842
};

4843
#endif /* CONFIG_PM */
4844

4845 4846 4847 4848 4849 4850 4851 4852 4853
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);

4854
		RTL_W8(tp, ChipCmd, CmdRxEnb);
4855
		rtl_pci_commit(tp);
4856 4857 4858 4859 4860 4861
		break;
	default:
		break;
	}
}

F
Francois Romieu 已提交
4862 4863
static void rtl_shutdown(struct pci_dev *pdev)
{
H
Heiner Kallweit 已提交
4864
	struct rtl8169_private *tp = pci_get_drvdata(pdev);
4865

4866
	rtnl_lock();
H
Heiner Kallweit 已提交
4867
	rtl8169_net_suspend(tp);
4868
	rtnl_unlock();
F
Francois Romieu 已提交
4869

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

4873
	if (system_state == SYSTEM_POWER_OFF) {
4874
		if (tp->saved_wolopts) {
4875 4876
			rtl_wol_suspend_quirk(tp);
			rtl_wol_shutdown_quirk(tp);
4877 4878
		}

4879
		pci_wake_from_d3(pdev, tp->saved_wolopts);
4880 4881 4882
		pci_set_power_state(pdev, PCI_D3hot);
	}
}
4883

B
Bill Pemberton 已提交
4884
static void rtl_remove_one(struct pci_dev *pdev)
4885
{
H
Heiner Kallweit 已提交
4886
	struct rtl8169_private *tp = pci_get_drvdata(pdev);
4887

H
Heiner Kallweit 已提交
4888 4889
	if (pci_dev_run_wake(pdev))
		pm_runtime_get_noresume(&pdev->dev);
4890

H
Heiner Kallweit 已提交
4891
	unregister_netdev(tp->dev);
4892

H
Heiner Kallweit 已提交
4893 4894
	if (r8168_check_dash(tp))
		rtl8168_driver_stop(tp);
4895

H
Heiner Kallweit 已提交
4896
	rtl_release_firmware(tp);
4897 4898

	/* restore original MAC address */
H
Heiner Kallweit 已提交
4899
	rtl_rar_set(tp, tp->dev->perm_addr);
4900 4901
}

4902
static const struct net_device_ops rtl_netdev_ops = {
4903
	.ndo_open		= rtl_open,
4904 4905 4906
	.ndo_stop		= rtl8169_close,
	.ndo_get_stats64	= rtl8169_get_stats64,
	.ndo_start_xmit		= rtl8169_start_xmit,
4907
	.ndo_features_check	= rtl8169_features_check,
4908 4909 4910 4911 4912 4913
	.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,
4914
	.ndo_do_ioctl		= phy_do_ioctl_running,
4915 4916 4917 4918 4919 4920 4921
	.ndo_set_rx_mode	= rtl_set_rx_mode,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= rtl8169_netpoll,
#endif

};

4922 4923
static void rtl_set_irq_mask(struct rtl8169_private *tp)
{
4924
	tp->irq_mask = RxOK | RxErr | TxOK | TxErr | LinkChg;
4925 4926 4927 4928 4929 4930 4931 4932 4933 4934

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

4935
static int rtl_alloc_irq(struct rtl8169_private *tp)
4936
{
4937
	unsigned int flags;
4938

4939 4940
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
4941
		rtl_unlock_config_regs(tp);
4942
		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable);
4943
		rtl_lock_config_regs(tp);
4944
		fallthrough;
4945
	case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_17:
4946
		flags = PCI_IRQ_LEGACY;
4947 4948
		break;
	default:
4949
		flags = PCI_IRQ_ALL_TYPES;
4950
		break;
4951
	}
4952 4953

	return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);
4954 4955
}

4956 4957 4958 4959
static void rtl_read_mac_address(struct rtl8169_private *tp,
				 u8 mac_addr[ETH_ALEN])
{
	/* Get MAC address */
4960
	if (rtl_is_8168evl_up(tp) && tp->mac_version != RTL_GIGA_MAC_VER_34) {
4961
		u32 value;
T
Thierry Reding 已提交
4962

4963 4964
		value = rtl_eri_read(tp, 0xe0);
		put_unaligned_le32(value, mac_addr);
4965
		value = rtl_eri_read(tp, 0xe4);
4966
		put_unaligned_le16(value, mac_addr + 4);
H
Heiner Kallweit 已提交
4967 4968
	} else if (rtl_is_8125(tp)) {
		rtl_read_mac_from_reg(tp, mac_addr, MAC0_BKP);
4969 4970 4971
	}
}

H
Hayes Wang 已提交
4972 4973
DECLARE_RTL_COND(rtl_link_list_ready_cond)
{
4974
	return RTL_R8(tp, MCU) & LINK_LIST_RDY;
H
Hayes Wang 已提交
4975 4976
}

4977 4978 4979 4980 4981
static void r8168g_wait_ll_share_fifo_ready(struct rtl8169_private *tp)
{
	rtl_loop_wait_high(tp, &rtl_link_list_ready_cond, 100, 42);
}

4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018
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 已提交
5019
	snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x", pci_dev_id(pdev));
5020 5021 5022 5023

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

5024
	ret = devm_mdiobus_register(&pdev->dev, new_bus);
5025 5026 5027
	if (ret)
		return ret;

5028 5029
	tp->phydev = mdiobus_get_phy(new_bus, 0);
	if (!tp->phydev) {
5030
		return -ENODEV;
5031 5032 5033 5034
	} else if (!tp->phydev->drv) {
		/* Most chip versions fail with the genphy driver.
		 * Therefore ensure that the dedicated PHY driver is loaded.
		 */
5035 5036
		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);
5037
		return -EUNATCH;
5038 5039
	}

5040
	/* PHY will be woken up in rtl_open() */
5041
	phy_suspend(tp->phydev);
5042 5043 5044 5045

	return 0;
}

B
Bill Pemberton 已提交
5046
static void rtl_hw_init_8168g(struct rtl8169_private *tp)
H
Hayes Wang 已提交
5047
{
5048
	rtl_enable_rxdvgate(tp);
H
Hayes Wang 已提交
5049

5050
	RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) & ~(CmdTxEnb | CmdRxEnb));
H
Hayes Wang 已提交
5051
	msleep(1);
5052
	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
H
Hayes Wang 已提交
5053

5054
	r8168_mac_ocp_modify(tp, 0xe8de, BIT(14), 0);
5055
	r8168g_wait_ll_share_fifo_ready(tp);
H
Hayes Wang 已提交
5056

5057
	r8168_mac_ocp_modify(tp, 0xe8de, 0, BIT(15));
5058
	r8168g_wait_ll_share_fifo_ready(tp);
H
Hayes Wang 已提交
5059 5060
}

H
Heiner Kallweit 已提交
5061 5062
static void rtl_hw_init_8125(struct rtl8169_private *tp)
{
5063
	rtl_enable_rxdvgate(tp);
H
Heiner Kallweit 已提交
5064 5065 5066 5067 5068 5069

	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);
5070
	r8168g_wait_ll_share_fifo_ready(tp);
H
Heiner Kallweit 已提交
5071 5072 5073 5074

	r8168_mac_ocp_write(tp, 0xc0aa, 0x07d0);
	r8168_mac_ocp_write(tp, 0xc0a6, 0x0150);
	r8168_mac_ocp_write(tp, 0xc01e, 0x5555);
5075
	r8168g_wait_ll_share_fifo_ready(tp);
H
Heiner Kallweit 已提交
5076 5077
}

B
Bill Pemberton 已提交
5078
static void rtl_hw_initialize(struct rtl8169_private *tp)
H
Hayes Wang 已提交
5079 5080
{
	switch (tp->mac_version) {
H
Heiner Kallweit 已提交
5081
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
5082
		rtl8168ep_stop_cmac(tp);
5083
		fallthrough;
5084
	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48:
C
Chun-Hao Lin 已提交
5085 5086
		rtl_hw_init_8168g(tp);
		break;
5087
	case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63:
H
Heiner Kallweit 已提交
5088 5089
		rtl_hw_init_8125(tp);
		break;
H
Hayes Wang 已提交
5090 5091 5092 5093 5094
	default:
		break;
	}
}

5095 5096 5097 5098
static int rtl_jumbo_max(struct rtl8169_private *tp)
{
	/* Non-GBit versions don't support jumbo frames */
	if (!tp->supports_gmii)
5099
		return 0;
5100 5101 5102

	switch (tp->mac_version) {
	/* RTL8169 */
5103
	case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117
		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;
	}
}

5118 5119 5120 5121 5122
static void rtl_disable_clk(void *data)
{
	clk_disable_unprepare(data);
}

5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134
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;
5135 5136
		else
			dev_err_probe(d, rc, "failed to get clk\n");
5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148
	} 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;
}

5149 5150 5151 5152
static void rtl_init_mac_address(struct rtl8169_private *tp)
{
	struct net_device *dev = tp->dev;
	u8 *mac_addr = dev->dev_addr;
5153
	int rc;
5154 5155 5156 5157 5158 5159 5160 5161 5162

	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;

5163
	rtl_read_mac_from_reg(tp, mac_addr, MAC0);
5164 5165 5166 5167 5168 5169 5170 5171 5172
	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 已提交
5173
static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
5174 5175
{
	struct rtl8169_private *tp;
5176 5177
	int jumbo_max, region, rc;
	enum mac_version chipset;
5178
	struct net_device *dev;
5179
	u16 xid;
5180

5181 5182 5183
	dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
	if (!dev)
		return -ENOMEM;
5184 5185

	SET_NETDEV_DEV(dev, &pdev->dev);
5186
	dev->netdev_ops = &rtl_netdev_ops;
5187 5188 5189
	tp = netdev_priv(dev);
	tp->dev = dev;
	tp->pci_dev = pdev;
5190
	tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1;
5191
	tp->eee_adv = -1;
5192
	tp->ocp_base = OCP_STD_PHY_BASE;
5193

5194 5195 5196 5197 5198
	dev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev,
						   struct pcpu_sw_netstats);
	if (!dev->tstats)
		return -ENOMEM;

5199
	/* Get the *optional* external "ether_clk" used on some boards */
5200 5201 5202
	rc = rtl_get_ether_clk(tp);
	if (rc)
		return rc;
5203

H
Heiner Kallweit 已提交
5204 5205 5206
	/* Disable ASPM completely as that cause random device stop working
	 * problems as well as full system hangs for some PCIe devices users.
	 */
5207 5208 5209
	rc = pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
					  PCIE_LINK_STATE_L1);
	tp->aspm_manageable = !rc;
H
Heiner Kallweit 已提交
5210

5211
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
5212
	rc = pcim_enable_device(pdev);
5213
	if (rc < 0) {
5214
		dev_err(&pdev->dev, "enable failure\n");
5215
		return rc;
5216 5217
	}

5218
	if (pcim_set_mwi(pdev) < 0)
5219
		dev_info(&pdev->dev, "Mem-Wr-Inval unavailable\n");
5220

5221 5222 5223
	/* use first MMIO region */
	region = ffs(pci_select_bars(pdev, IORESOURCE_MEM)) - 1;
	if (region < 0) {
5224
		dev_err(&pdev->dev, "no MMIO resource found\n");
5225
		return -ENODEV;
5226 5227 5228 5229
	}

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

5234
	rc = pcim_iomap_regions(pdev, BIT(region), MODULENAME);
5235
	if (rc < 0) {
5236
		dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
5237
		return rc;
5238 5239
	}

5240
	tp->mmio_addr = pcim_iomap_table(pdev)[region];
5241

5242 5243
	xid = (RTL_R32(tp, TxConfig) >> 20) & 0xfcf;

5244
	/* Identify chip attached to board */
5245 5246
	chipset = rtl8169_get_mac_version(xid, tp->supports_gmii);
	if (chipset == RTL_GIGA_MAC_NONE) {
5247
		dev_err(&pdev->dev, "unknown chip XID %03x, contact r8169 maintainers (see MAINTAINERS file)\n", xid);
5248
		return -ENODEV;
5249 5250 5251
	}

	tp->mac_version = chipset;
5252

5253
	tp->cp_cmd = RTL_R16(tp, CPlusCmd) & CPCMD_MASK;
5254

H
Heiner Kallweit 已提交
5255
	if (sizeof(dma_addr_t) > 4 && tp->mac_version >= RTL_GIGA_MAC_VER_18 &&
5256
	    !dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)))
5257 5258
		dev->features |= NETIF_F_HIGHDMA;

5259 5260
	rtl_init_rxcfg(tp);

5261
	rtl8169_irq_mask_and_ack(tp);
5262

H
Hayes Wang 已提交
5263 5264
	rtl_hw_initialize(tp);

5265 5266 5267 5268
	rtl_hw_reset(tp);

	pci_set_master(pdev);

5269 5270
	rc = rtl_alloc_irq(tp);
	if (rc < 0) {
5271
		dev_err(&pdev->dev, "Can't allocate interrupt\n");
5272 5273
		return rc;
	}
5274

5275
	INIT_WORK(&tp->wk.work, rtl_task);
5276

5277
	rtl_init_mac_address(tp);
5278

5279
	dev->ethtool_ops = &rtl8169_ethtool_ops;
5280

5281
	netif_napi_add(dev, &tp->napi, rtl8169_poll, NAPI_POLL_WEIGHT);
5282

5283 5284
	dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
			   NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
5285
	dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
H
Heiner Kallweit 已提交
5286
	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
5287

H
hayeswang 已提交
5288 5289 5290 5291
	/*
	 * Pretend we are using VLANs; This bypasses a nasty bug where
	 * Interrupts stop flowing on high load on 8110SCd controllers.
	 */
5292
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
H
hayeswang 已提交
5293
		/* Disallow toggling */
5294
		dev->hw_features &= ~NETIF_F_HW_VLAN_CTAG_RX;
5295

5296 5297 5298 5299 5300 5301 5302 5303 5304 5305
	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!
	 */
5306
	if (rtl_chip_supports_csum_v2(tp)) {
5307
		dev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6;
5308 5309 5310
		dev->gso_max_size = RTL_GSO_MAX_SIZE_V2;
		dev->gso_max_segs = RTL_GSO_MAX_SEGS_V2;
	} else {
5311
		dev->hw_features |= NETIF_F_SG | NETIF_F_TSO;
5312 5313 5314
		dev->gso_max_size = RTL_GSO_MAX_SIZE_V1;
		dev->gso_max_segs = RTL_GSO_MAX_SEGS_V1;
	}
H
hayeswang 已提交
5315

5316 5317 5318
	dev->hw_features |= NETIF_F_RXALL;
	dev->hw_features |= NETIF_F_RXFCS;

5319 5320 5321
	/* configure chip for default features */
	rtl8169_set_features(dev, dev->features);

5322 5323
	rtl_set_d3_pll_down(tp, true);

5324
	jumbo_max = rtl_jumbo_max(tp);
5325 5326
	if (jumbo_max)
		dev->max_mtu = jumbo_max;
5327

5328
	rtl_set_irq_mask(tp);
5329

5330
	tp->fw_name = rtl_chip_infos[chipset].fw_name;
5331

5332 5333 5334
	tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
					    &tp->counters_phys_addr,
					    GFP_KERNEL);
5335 5336
	if (!tp->counters)
		return -ENOMEM;
5337

H
Heiner Kallweit 已提交
5338
	pci_set_drvdata(pdev, tp);
5339

5340 5341
	rc = r8169_mdio_register(tp);
	if (rc)
5342
		return rc;
5343

5344 5345
	rc = register_netdev(dev);
	if (rc)
5346
		return rc;
5347

5348 5349 5350
	netdev_info(dev, "%s, %pM, XID %03x, IRQ %d\n",
		    rtl_chip_infos[chipset].name, dev->dev_addr, xid,
		    pci_irq_vector(pdev, 0));
5351

5352
	if (jumbo_max)
5353 5354 5355
		netdev_info(dev, "jumbo features [frames: %d bytes, tx checksumming: %s]\n",
			    jumbo_max, tp->mac_version <= RTL_GIGA_MAC_VER_06 ?
			    "ok" : "ko");
5356

5357 5358
	if (r8168_check_dash(tp)) {
		netdev_info(dev, "DASH enabled\n");
5359
		rtl8168_driver_start(tp);
5360
	}
5361

5362 5363 5364
	if (pci_dev_run_wake(pdev))
		pm_runtime_put_sync(&pdev->dev);

5365
	return 0;
5366 5367
}

L
Linus Torvalds 已提交
5368 5369 5370
static struct pci_driver rtl8169_pci_driver = {
	.name		= MODULENAME,
	.id_table	= rtl8169_pci_tbl,
5371
	.probe		= rtl_init_one,
B
Bill Pemberton 已提交
5372
	.remove		= rtl_remove_one,
F
Francois Romieu 已提交
5373
	.shutdown	= rtl_shutdown,
5374 5375 5376
#ifdef CONFIG_PM
	.driver.pm	= &rtl8169_pm_ops,
#endif
L
Linus Torvalds 已提交
5377 5378
};

5379
module_pci_driver(rtl8169_pci_driver);