r8169.c 137.3 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
F
Francois Romieu 已提交
2 3 4 5 6 7 8
 * 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 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 */

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/pci.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/delay.h>
#include <linux/ethtool.h>
#include <linux/mii.h>
#include <linux/if_vlan.h>
#include <linux/crc32.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/init.h>
25
#include <linux/interrupt.h>
L
Linus Torvalds 已提交
26
#include <linux/dma-mapping.h>
27
#include <linux/pm_runtime.h>
28
#include <linux/firmware.h>
S
Stanislaw Gruszka 已提交
29
#include <linux/pci-aspm.h>
30
#include <linux/prefetch.h>
L
Linus Torvalds 已提交
31

32
#include <asm/system.h>
L
Linus Torvalds 已提交
33 34 35
#include <asm/io.h>
#include <asm/irq.h>

F
Francois Romieu 已提交
36
#define RTL8169_VERSION "2.3LK-NAPI"
L
Linus Torvalds 已提交
37 38 39
#define MODULENAME "r8169"
#define PFX MODULENAME ": "

40 41
#define FIRMWARE_8168D_1	"rtl_nic/rtl8168d-1.fw"
#define FIRMWARE_8168D_2	"rtl_nic/rtl8168d-2.fw"
H
hayeswang 已提交
42 43
#define FIRMWARE_8168E_1	"rtl_nic/rtl8168e-1.fw"
#define FIRMWARE_8168E_2	"rtl_nic/rtl8168e-2.fw"
H
Hayes Wang 已提交
44
#define FIRMWARE_8168E_3	"rtl_nic/rtl8168e-3.fw"
45
#define FIRMWARE_8105E_1	"rtl_nic/rtl8105e-1.fw"
46

L
Linus Torvalds 已提交
47 48
#ifdef RTL8169_DEBUG
#define assert(expr) \
49 50
	if (!(expr)) {					\
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
51
		#expr,__FILE__,__func__,__LINE__);		\
52
	}
53 54
#define dprintk(fmt, args...) \
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
L
Linus Torvalds 已提交
55 56 57 58 59
#else
#define assert(expr) do {} while (0)
#define dprintk(fmt, args...)	do {} while (0)
#endif /* RTL8169_DEBUG */

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

L
Linus Torvalds 已提交
63 64 65 66 67
#define TX_BUFFS_AVAIL(tp) \
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)

/* 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. */
68
static const int multicast_filter_limit = 32;
L
Linus Torvalds 已提交
69 70 71 72

/* MAC address length */
#define MAC_ADDR_LEN	6

73
#define MAX_READ_REQUEST_SHIFT	12
L
Linus Torvalds 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */

#define R8169_REGS_SIZE		256
#define R8169_NAPI_WEIGHT	64
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))

#define RTL8169_TX_TIMEOUT	(6*HZ)
#define RTL8169_PHY_TIMEOUT	(10*HZ)

89 90
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
91 92
#define RTL_EEPROM_SIG_ADDR	0x0000

L
Linus Torvalds 已提交
93 94 95 96 97 98
/* write/read MMIO register */
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
#define RTL_R8(reg)		readb (ioaddr + (reg))
#define RTL_R16(reg)		readw (ioaddr + (reg))
99
#define RTL_R32(reg)		readl (ioaddr + (reg))
L
Linus Torvalds 已提交
100 101

enum mac_version {
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
	RTL_GIGA_MAC_VER_01 = 0,
	RTL_GIGA_MAC_VER_02,
	RTL_GIGA_MAC_VER_03,
	RTL_GIGA_MAC_VER_04,
	RTL_GIGA_MAC_VER_05,
	RTL_GIGA_MAC_VER_06,
	RTL_GIGA_MAC_VER_07,
	RTL_GIGA_MAC_VER_08,
	RTL_GIGA_MAC_VER_09,
	RTL_GIGA_MAC_VER_10,
	RTL_GIGA_MAC_VER_11,
	RTL_GIGA_MAC_VER_12,
	RTL_GIGA_MAC_VER_13,
	RTL_GIGA_MAC_VER_14,
	RTL_GIGA_MAC_VER_15,
	RTL_GIGA_MAC_VER_16,
	RTL_GIGA_MAC_VER_17,
	RTL_GIGA_MAC_VER_18,
	RTL_GIGA_MAC_VER_19,
	RTL_GIGA_MAC_VER_20,
	RTL_GIGA_MAC_VER_21,
	RTL_GIGA_MAC_VER_22,
	RTL_GIGA_MAC_VER_23,
	RTL_GIGA_MAC_VER_24,
	RTL_GIGA_MAC_VER_25,
	RTL_GIGA_MAC_VER_26,
	RTL_GIGA_MAC_VER_27,
	RTL_GIGA_MAC_VER_28,
	RTL_GIGA_MAC_VER_29,
	RTL_GIGA_MAC_VER_30,
	RTL_GIGA_MAC_VER_31,
	RTL_GIGA_MAC_VER_32,
	RTL_GIGA_MAC_VER_33,
H
Hayes Wang 已提交
135
	RTL_GIGA_MAC_VER_34,
136
	RTL_GIGA_MAC_NONE   = 0xff,
L
Linus Torvalds 已提交
137 138
};

F
Francois Romieu 已提交
139 140 141 142 143
enum rtl_tx_desc_version {
	RTL_TD_0	= 0,
	RTL_TD_1	= 1,
};

144 145
#define _R(NAME,TD,FW) \
	{ .name = NAME, .txd_version = TD, .fw_name = FW }
L
Linus Torvalds 已提交
146

147
static const struct {
L
Linus Torvalds 已提交
148
	const char *name;
F
Francois Romieu 已提交
149
	enum rtl_tx_desc_version txd_version;
150
	const char *fw_name;
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
} rtl_chip_infos[] = {
	/* PCI devices. */
	[RTL_GIGA_MAC_VER_01] =
		_R("RTL8169",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_02] =
		_R("RTL8169s",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_03] =
		_R("RTL8110s",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_04] =
		_R("RTL8169sb/8110sb",	RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_05] =
		_R("RTL8169sc/8110sc",	RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_06] =
		_R("RTL8169sc/8110sc",	RTL_TD_0, NULL),
	/* PCI-E devices. */
	[RTL_GIGA_MAC_VER_07] =
		_R("RTL8102e",		RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_08] =
		_R("RTL8102e",		RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_09] =
		_R("RTL8102e",		RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_10] =
		_R("RTL8101e",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_11] =
		_R("RTL8168b/8111b",	RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_12] =
		_R("RTL8168b/8111b",	RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_13] =
		_R("RTL8101e",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_14] =
		_R("RTL8100e",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_15] =
		_R("RTL8100e",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_16] =
		_R("RTL8101e",		RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_17] =
		_R("RTL8168b/8111b",	RTL_TD_0, NULL),
	[RTL_GIGA_MAC_VER_18] =
		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_19] =
		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_20] =
		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_21] =
		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_22] =
		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_23] =
		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_24] =
		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_25] =
		_R("RTL8168d/8111d",	RTL_TD_1, FIRMWARE_8168D_1),
	[RTL_GIGA_MAC_VER_26] =
		_R("RTL8168d/8111d",	RTL_TD_1, FIRMWARE_8168D_2),
	[RTL_GIGA_MAC_VER_27] =
		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_28] =
		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_29] =
		_R("RTL8105e",		RTL_TD_1, FIRMWARE_8105E_1),
	[RTL_GIGA_MAC_VER_30] =
		_R("RTL8105e",		RTL_TD_1, FIRMWARE_8105E_1),
	[RTL_GIGA_MAC_VER_31] =
		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL),
	[RTL_GIGA_MAC_VER_32] =
		_R("RTL8168e/8111e",	RTL_TD_1, FIRMWARE_8168E_1),
	[RTL_GIGA_MAC_VER_33] =
H
Hayes Wang 已提交
219 220 221
		_R("RTL8168e/8111e",	RTL_TD_1, FIRMWARE_8168E_2),
	[RTL_GIGA_MAC_VER_34] =
		_R("RTL8168evl/8111evl",RTL_TD_1, FIRMWARE_8168E_3)
222
};
223
#undef _R
224

225 226 227 228 229 230
enum cfg_version {
	RTL_CFG_0 = 0x00,
	RTL_CFG_1,
	RTL_CFG_2
};

231 232 233 234
static void rtl_hw_start_8169(struct net_device *);
static void rtl_hw_start_8168(struct net_device *);
static void rtl_hw_start_8101(struct net_device *);

235
static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
236
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
237
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
238
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
239
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
240 241
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
242
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
243 244 245
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
246 247
	{ 0x0001,				0x8168,
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
L
Linus Torvalds 已提交
248 249 250 251 252
	{0,},
};

MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);

E
Eric Dumazet 已提交
253
static int rx_buf_sz = 16383;
254
static int use_dac;
255 256 257
static struct {
	u32 msg_enable;
} debug = { -1 };
L
Linus Torvalds 已提交
258

F
Francois Romieu 已提交
259 260
enum rtl_registers {
	MAC0		= 0,	/* Ethernet hardware address. */
261
	MAC4		= 4,
F
Francois Romieu 已提交
262 263 264 265 266 267 268 269 270 271 272 273 274
	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 已提交
275

F
Francois Romieu 已提交
276
	TxConfig	= 0x40,
H
Hayes Wang 已提交
277 278
#define	TXCFG_AUTO_FIFO			(1 << 7)	/* 8111e-vl */
#define	TXCFG_EMPTY			(1 << 11)	/* 8111e-vl */
F
Francois Romieu 已提交
279

H
Hayes Wang 已提交
280 281 282 283 284 285 286 287 288
	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)
#define	RXCFG_DMA_SHIFT			8
					/* Unlimited maximum PCI burst. */
#define	RX_DMA_BURST			(7 << RXCFG_DMA_SHIFT)
F
Francois Romieu 已提交
289

F
Francois Romieu 已提交
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
	RxMissed	= 0x4c,
	Cfg9346		= 0x50,
	Config0		= 0x51,
	Config1		= 0x52,
	Config2		= 0x53,
	Config3		= 0x54,
	Config4		= 0x55,
	Config5		= 0x56,
	MultiIntr	= 0x5c,
	PHYAR		= 0x60,
	PHYstatus	= 0x6c,
	RxMaxSize	= 0xda,
	CPlusCmd	= 0xe0,
	IntrMitigate	= 0xe2,
	RxDescAddrLow	= 0xe4,
	RxDescAddrHigh	= 0xe8,
306 307 308 309 310 311 312 313
	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)

F
Francois Romieu 已提交
314 315 316 317
	FuncEvent	= 0xf0,
	FuncEventMask	= 0xf4,
	FuncPresetState	= 0xf8,
	FuncForceEvent	= 0xfc,
L
Linus Torvalds 已提交
318 319
};

320 321 322 323 324 325 326 327 328 329 330 331 332 333
enum rtl8110_registers {
	TBICSR			= 0x64,
	TBI_ANAR		= 0x68,
	TBI_LPAR		= 0x6a,
};

enum rtl8168_8101_registers {
	CSIDR			= 0x64,
	CSIAR			= 0x68,
#define	CSIAR_FLAG			0x80000000
#define	CSIAR_WRITE_CMD			0x80000000
#define	CSIAR_BYTE_ENABLE		0x0f
#define	CSIAR_BYTE_ENABLE_SHIFT		12
#define	CSIAR_ADDR_MASK			0x0fff
F
françois romieu 已提交
334
	PMCH			= 0x6f,
335 336 337 338 339 340
	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
341
	DLLPR			= 0xd0,
H
Hayes Wang 已提交
342
#define	PFM_EN				(1 << 6)
343 344 345
	DBG_REG			= 0xd1,
#define	FIX_NAK_1			(1 << 4)
#define	FIX_NAK_2			(1 << 3)
346 347
	TWSI			= 0xd2,
	MCU			= 0xd3,
H
Hayes Wang 已提交
348
#define	NOW_IS_OOB			(1 << 7)
349 350
#define	EN_NDP				(1 << 3)
#define	EN_OOB_RESET			(1 << 2)
351 352 353 354 355 356 357
	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
358 359
};

360
enum rtl8168_registers {
H
Hayes Wang 已提交
361 362
	LED_FREQ		= 0x1a,
	EEE_LED			= 0x1b,
F
françois romieu 已提交
363 364 365 366 367 368 369
	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 已提交
370 371 372 373 374 375 376
#define ERIAR_EXGMAC			(0x00 << ERIAR_TYPE_SHIFT)
#define ERIAR_MSIX			(0x01 << ERIAR_TYPE_SHIFT)
#define ERIAR_ASF			(0x02 << ERIAR_TYPE_SHIFT)
#define ERIAR_MASK_SHIFT		12
#define ERIAR_MASK_0001			(0x1 << ERIAR_MASK_SHIFT)
#define ERIAR_MASK_0011			(0x3 << ERIAR_MASK_SHIFT)
#define ERIAR_MASK_1111			(0xf << ERIAR_MASK_SHIFT)
377 378 379 380 381 382 383 384 385 386 387
	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
hayeswang 已提交
388 389
	RDSAR1			= 0xd0,	/* 8168c only. Undocumented on 8168dp */
	MISC			= 0xf0,	/* 8168e only. */
F
Francois Romieu 已提交
390
#define TXPLA_RST			(1 << 29)
H
Hayes Wang 已提交
391
#define PWM_EN				(1 << 22)
392 393
};

F
Francois Romieu 已提交
394
enum rtl_register_content {
L
Linus Torvalds 已提交
395
	/* InterruptStatusBits */
F
Francois Romieu 已提交
396 397 398 399 400 401 402 403 404 405 406
	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 已提交
407 408

	/* RxStatusDesc */
409 410 411 412 413
	RxFOVF	= (1 << 23),
	RxRWT	= (1 << 22),
	RxRES	= (1 << 21),
	RxRUNT	= (1 << 20),
	RxCRC	= (1 << 19),
L
Linus Torvalds 已提交
414 415

	/* ChipCmdBits */
H
Hayes Wang 已提交
416
	StopReq		= 0x80,
F
Francois Romieu 已提交
417 418 419 420
	CmdReset	= 0x10,
	CmdRxEnb	= 0x08,
	CmdTxEnb	= 0x04,
	RxBufEmpty	= 0x01,
L
Linus Torvalds 已提交
421

422 423 424 425 426
	/* 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 已提交
427
	/* Cfg9346Bits */
F
Francois Romieu 已提交
428 429
	Cfg9346_Lock	= 0x00,
	Cfg9346_Unlock	= 0xc0,
L
Linus Torvalds 已提交
430 431

	/* rx_mode_bits */
F
Francois Romieu 已提交
432 433 434 435 436 437
	AcceptErr	= 0x20,
	AcceptRunt	= 0x10,
	AcceptBroadcast	= 0x08,
	AcceptMulticast	= 0x04,
	AcceptMyPhys	= 0x02,
	AcceptAllPhys	= 0x01,
L
Linus Torvalds 已提交
438 439 440 441 442

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

443
	/* Config1 register p.24 */
444 445
	LEDS1		= (1 << 7),
	LEDS0		= (1 << 6),
F
Francois Romieu 已提交
446
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
447 448 449 450
	Speed_down	= (1 << 4),
	MEMMAP		= (1 << 3),
	IOMAP		= (1 << 2),
	VPD		= (1 << 1),
451 452
	PMEnable	= (1 << 0),	/* Power Management Enable */

453 454 455 456
	/* Config2 register p. 25 */
	PCI_Clock_66MHz = 0x01,
	PCI_Clock_33MHz = 0x00,

F
Francois Romieu 已提交
457 458 459
	/* 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 */
460
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
F
Francois Romieu 已提交
461

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

L
Linus Torvalds 已提交
470 471 472 473 474 475 476 477 478
	/* TBICSR p.28 */
	TBIReset	= 0x80000000,
	TBILoopback	= 0x40000000,
	TBINwEnable	= 0x20000000,
	TBINwRestart	= 0x10000000,
	TBILinkOk	= 0x02000000,
	TBINwComplete	= 0x01000000,

	/* CPlusCmd p.31 */
479 480 481 482 483 484 485 486 487 488
	EnableBist	= (1 << 15),	// 8168 8101
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
	Normal_mode	= (1 << 13),	// unused
	Force_half_dup	= (1 << 12),	// 8168 8101
	Force_rxflow_en	= (1 << 11),	// 8168 8101
	Force_txflow_en	= (1 << 10),	// 8168 8101
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
	ASF		= (1 << 8),	// 8168 8101
	PktCntrDisable	= (1 << 7),	// 8168 8101
	Mac_dbgo_sel	= 0x001c,	// 8168
L
Linus Torvalds 已提交
489 490 491 492
	RxVlan		= (1 << 6),
	RxChkSum	= (1 << 5),
	PCIDAC		= (1 << 4),
	PCIMulRW	= (1 << 3),
493 494 495 496
	INTT_0		= 0x0000,	// 8168
	INTT_1		= 0x0001,	// 8168
	INTT_2		= 0x0002,	// 8168
	INTT_3		= 0x0003,	// 8168
L
Linus Torvalds 已提交
497 498

	/* rtl8169_PHYstatus */
F
Francois Romieu 已提交
499 500 501 502 503 504 505 506
	TBI_Enable	= 0x80,
	TxFlowCtrl	= 0x40,
	RxFlowCtrl	= 0x20,
	_1000bpsF	= 0x10,
	_100bps		= 0x08,
	_10bps		= 0x04,
	LinkStatus	= 0x02,
	FullDup		= 0x01,
L
Linus Torvalds 已提交
507 508

	/* _TBICSRBit */
F
Francois Romieu 已提交
509
	TBILinkOK	= 0x02000000,
510 511

	/* DumpCounterCommand */
F
Francois Romieu 已提交
512
	CounterDump	= 0x8,
L
Linus Torvalds 已提交
513 514
};

F
Francois Romieu 已提交
515 516
enum rtl_desc_bit {
	/* First doubleword. */
L
Linus Torvalds 已提交
517 518 519 520
	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 已提交
521 522 523 524 525 526 527
};

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

F
Francois Romieu 已提交
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
	/* 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 {
	/* Second doubleword. */
#define TD1_MSS_SHIFT			18	/* MSS position (11 bits) */
	TD1_IP_CS	= (1 << 29),		/* Calculate IP checksum */
	TD1_TCP_CS	= (1 << 30),		/* Calculate TCP/IP checksum */
	TD1_UDP_CS	= (1 << 31),		/* Calculate UDP/IP checksum */
};
L
Linus Torvalds 已提交
550

F
Francois Romieu 已提交
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
static const struct rtl_tx_desc_info {
	struct {
		u32 udp;
		u32 tcp;
	} checksum;
	u16 mss_shift;
	u16 opts_offset;
} tx_desc_info [] = {
	[RTL_TD_0] = {
		.checksum = {
			.udp	= TD0_IP_CS | TD0_UDP_CS,
			.tcp	= TD0_IP_CS | TD0_TCP_CS
		},
		.mss_shift	= TD0_MSS_SHIFT,
		.opts_offset	= 0
	},
	[RTL_TD_1] = {
		.checksum = {
			.udp	= TD1_IP_CS | TD1_UDP_CS,
			.tcp	= TD1_IP_CS | TD1_TCP_CS
		},
		.mss_shift	= TD1_MSS_SHIFT,
		.opts_offset	= 1
	}
};

enum rtl_rx_desc_bit {
L
Linus Torvalds 已提交
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
	/* Rx private */
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */

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

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

#define RsvdMask	0x3fffc000

struct TxDesc {
596 597 598
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
599 600 601
};

struct RxDesc {
602 603 604
	__le32 opts1;
	__le32 opts2;
	__le64 addr;
L
Linus Torvalds 已提交
605 606 607 608 609 610 611 612
};

struct ring_info {
	struct sk_buff	*skb;
	u32		len;
	u8		__pad[sizeof(void *) - sizeof(u32)];
};

613
enum features {
614 615 616
	RTL_FEATURE_WOL		= (1 << 0),
	RTL_FEATURE_MSI		= (1 << 1),
	RTL_FEATURE_GMII	= (1 << 2),
617 618
};

619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
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;
};

L
Linus Torvalds 已提交
635 636
struct rtl8169_private {
	void __iomem *mmio_addr;	/* memory map physical address */
F
Francois Romieu 已提交
637
	struct pci_dev *pci_dev;
D
David Howells 已提交
638
	struct net_device *dev;
639
	struct napi_struct napi;
F
Francois Romieu 已提交
640
	spinlock_t lock;
641
	u32 msg_enable;
F
Francois Romieu 已提交
642 643
	u16 txd_version;
	u16 mac_version;
L
Linus Torvalds 已提交
644 645 646 647 648 649 650 651
	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_rx;
	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;
E
Eric Dumazet 已提交
652
	void *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
L
Linus Torvalds 已提交
653 654 655
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
	struct timer_list timer;
	u16 cp_cmd;
656 657
	u16 intr_event;
	u16 napi_event;
L
Linus Torvalds 已提交
658
	u16 intr_mask;
659 660 661 662 663 664

	struct mdio_ops {
		void (*write)(void __iomem *, int, int);
		int (*read)(void __iomem *, int);
	} mdio_ops;

F
françois romieu 已提交
665 666 667 668 669
	struct pll_power_ops {
		void (*down)(struct rtl8169_private *);
		void (*up)(struct rtl8169_private *);
	} pll_power_ops;

670
	int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
671
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
672
	void (*phy_reset_enable)(struct rtl8169_private *tp);
673
	void (*hw_start)(struct net_device *);
674
	unsigned int (*phy_reset_pending)(struct rtl8169_private *tp);
L
Linus Torvalds 已提交
675
	unsigned int (*link_ok)(void __iomem *);
F
Francois Romieu 已提交
676
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
D
David Howells 已提交
677
	struct delayed_work task;
678
	unsigned features;
679 680

	struct mii_if_info mii;
681
	struct rtl8169_counters counters;
682
	u32 saved_wolopts;
683

684 685
	struct rtl_fw {
		const struct firmware *fw;
686 687 688 689 690 691 692 693 694

#define RTL_VER_SIZE		32

		char version[RTL_VER_SIZE];

		struct rtl_fw_phy_action {
			__le32 *code;
			size_t size;
		} phy_action;
695
	} *rtl_fw;
696
#define RTL_FIRMWARE_UNKNOWN	ERR_PTR(-EAGAIN);
L
Linus Torvalds 已提交
697 698
};

699
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
L
Linus Torvalds 已提交
700 701
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
module_param(use_dac, int, 0);
702
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
703 704
module_param_named(debug, debug.msg_enable, int, 0);
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
L
Linus Torvalds 已提交
705 706
MODULE_LICENSE("GPL");
MODULE_VERSION(RTL8169_VERSION);
707 708
MODULE_FIRMWARE(FIRMWARE_8168D_1);
MODULE_FIRMWARE(FIRMWARE_8168D_2);
H
hayeswang 已提交
709 710
MODULE_FIRMWARE(FIRMWARE_8168E_1);
MODULE_FIRMWARE(FIRMWARE_8168E_2);
711
MODULE_FIRMWARE(FIRMWARE_8105E_1);
L
Linus Torvalds 已提交
712 713

static int rtl8169_open(struct net_device *dev);
714 715
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
				      struct net_device *dev);
716
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
L
Linus Torvalds 已提交
717
static int rtl8169_init_ring(struct net_device *dev);
718
static void rtl_hw_start(struct net_device *dev);
L
Linus Torvalds 已提交
719
static int rtl8169_close(struct net_device *dev);
720
static void rtl_set_rx_mode(struct net_device *dev);
L
Linus Torvalds 已提交
721
static void rtl8169_tx_timeout(struct net_device *dev);
R
Richard Dawe 已提交
722
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
L
Linus Torvalds 已提交
723
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
724
				void __iomem *, u32 budget);
R
Richard Dawe 已提交
725
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
L
Linus Torvalds 已提交
726
static void rtl8169_down(struct net_device *dev);
727
static void rtl8169_rx_clear(struct rtl8169_private *tp);
728
static int rtl8169_poll(struct napi_struct *napi, int budget);
L
Linus Torvalds 已提交
729

F
françois romieu 已提交
730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757
static u32 ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
{
	void __iomem *ioaddr = tp->mmio_addr;
	int i;

	RTL_W32(OCPAR, ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
	for (i = 0; i < 20; i++) {
		udelay(100);
		if (RTL_R32(OCPAR) & OCPAR_FLAG)
			break;
	}
	return RTL_R32(OCPDR);
}

static void ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg, u32 data)
{
	void __iomem *ioaddr = tp->mmio_addr;
	int i;

	RTL_W32(OCPDR, data);
	RTL_W32(OCPAR, OCPAR_FLAG | ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
	for (i = 0; i < 20; i++) {
		udelay(100);
		if ((RTL_R32(OCPAR) & OCPAR_FLAG) == 0)
			break;
	}
}

758
static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
F
françois romieu 已提交
759
{
760
	void __iomem *ioaddr = tp->mmio_addr;
F
françois romieu 已提交
761 762 763 764 765 766 767
	int i;

	RTL_W8(ERIDR, cmd);
	RTL_W32(ERIAR, 0x800010e8);
	msleep(2);
	for (i = 0; i < 5; i++) {
		udelay(100);
F
Francois Romieu 已提交
768
		if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
F
françois romieu 已提交
769 770 771
			break;
	}

772
	ocp_write(tp, 0x1, 0x30, 0x00000001);
F
françois romieu 已提交
773 774 775 776 777 778
}

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

F
Francois Romieu 已提交
779 780 781 782 783
static u16 rtl8168_get_ocp_reg(struct rtl8169_private *tp)
{
	return (tp->mac_version == RTL_GIGA_MAC_VER_31) ? 0xb8 : 0x10;
}

F
françois romieu 已提交
784 785
static void rtl8168_driver_start(struct rtl8169_private *tp)
{
F
Francois Romieu 已提交
786
	u16 reg;
F
françois romieu 已提交
787 788 789 790
	int i;

	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);

F
Francois Romieu 已提交
791
	reg = rtl8168_get_ocp_reg(tp);
792

F
françois romieu 已提交
793 794
	for (i = 0; i < 10; i++) {
		msleep(10);
795
		if (ocp_read(tp, 0x0f, reg) & 0x00000800)
F
françois romieu 已提交
796 797 798 799 800 801
			break;
	}
}

static void rtl8168_driver_stop(struct rtl8169_private *tp)
{
F
Francois Romieu 已提交
802
	u16 reg;
F
françois romieu 已提交
803 804 805 806
	int i;

	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);

F
Francois Romieu 已提交
807
	reg = rtl8168_get_ocp_reg(tp);
808

F
françois romieu 已提交
809 810
	for (i = 0; i < 10; i++) {
		msleep(10);
811
		if ((ocp_read(tp, 0x0f, reg) & 0x00000800) == 0)
F
françois romieu 已提交
812 813 814 815
			break;
	}
}

816 817
static int r8168dp_check_dash(struct rtl8169_private *tp)
{
F
Francois Romieu 已提交
818
	u16 reg = rtl8168_get_ocp_reg(tp);
819

F
Francois Romieu 已提交
820
	return (ocp_read(tp, 0x0f, reg) & 0x00008000) ? 1 : 0;
821
}
F
françois romieu 已提交
822

823
static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
L
Linus Torvalds 已提交
824 825 826
{
	int i;

827
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
L
Linus Torvalds 已提交
828

829
	for (i = 20; i > 0; i--) {
F
Francois Romieu 已提交
830 831 832 833
		/*
		 * Check if the RTL8169 has completed writing to the specified
		 * MII register.
		 */
834
		if (!(RTL_R32(PHYAR) & 0x80000000))
L
Linus Torvalds 已提交
835
			break;
836
		udelay(25);
L
Linus Torvalds 已提交
837
	}
838
	/*
839 840
	 * According to hardware specs a 20us delay is required after write
	 * complete indication, but before sending next command.
841
	 */
842
	udelay(20);
L
Linus Torvalds 已提交
843 844
}

845
static int r8169_mdio_read(void __iomem *ioaddr, int reg_addr)
L
Linus Torvalds 已提交
846 847 848
{
	int i, value = -1;

849
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
L
Linus Torvalds 已提交
850

851
	for (i = 20; i > 0; i--) {
F
Francois Romieu 已提交
852 853 854 855
		/*
		 * Check if the RTL8169 has completed retrieving data from
		 * the specified MII register.
		 */
L
Linus Torvalds 已提交
856
		if (RTL_R32(PHYAR) & 0x80000000) {
857
			value = RTL_R32(PHYAR) & 0xffff;
L
Linus Torvalds 已提交
858 859
			break;
		}
860
		udelay(25);
L
Linus Torvalds 已提交
861
	}
862 863 864 865 866 867
	/*
	 * According to hardware specs a 20us delay is required after read
	 * complete indication, but before sending next command.
	 */
	udelay(20);

L
Linus Torvalds 已提交
868 869 870
	return value;
}

871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
static void r8168dp_1_mdio_access(void __iomem *ioaddr, int reg_addr, u32 data)
{
	int i;

	RTL_W32(OCPDR, data |
		((reg_addr & OCPDR_REG_MASK) << OCPDR_GPHY_REG_SHIFT));
	RTL_W32(OCPAR, OCPAR_GPHY_WRITE_CMD);
	RTL_W32(EPHY_RXER_NUM, 0);

	for (i = 0; i < 100; i++) {
		mdelay(1);
		if (!(RTL_R32(OCPAR) & OCPAR_FLAG))
			break;
	}
}

static void r8168dp_1_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
{
	r8168dp_1_mdio_access(ioaddr, reg_addr, OCPDR_WRITE_CMD |
		(value & OCPDR_DATA_MASK));
}

static int r8168dp_1_mdio_read(void __iomem *ioaddr, int reg_addr)
{
	int i;

	r8168dp_1_mdio_access(ioaddr, reg_addr, OCPDR_READ_CMD);

	mdelay(1);
	RTL_W32(OCPAR, OCPAR_GPHY_READ_CMD);
	RTL_W32(EPHY_RXER_NUM, 0);

	for (i = 0; i < 100; i++) {
		mdelay(1);
		if (RTL_R32(OCPAR) & OCPAR_FLAG)
			break;
	}

	return RTL_R32(OCPDR) & OCPDR_DATA_MASK;
}

F
françois romieu 已提交
912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
#define R8168DP_1_MDIO_ACCESS_BIT	0x00020000

static void r8168dp_2_mdio_start(void __iomem *ioaddr)
{
	RTL_W32(0xd0, RTL_R32(0xd0) & ~R8168DP_1_MDIO_ACCESS_BIT);
}

static void r8168dp_2_mdio_stop(void __iomem *ioaddr)
{
	RTL_W32(0xd0, RTL_R32(0xd0) | R8168DP_1_MDIO_ACCESS_BIT);
}

static void r8168dp_2_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
{
	r8168dp_2_mdio_start(ioaddr);

	r8169_mdio_write(ioaddr, reg_addr, value);

	r8168dp_2_mdio_stop(ioaddr);
}

static int r8168dp_2_mdio_read(void __iomem *ioaddr, int reg_addr)
{
	int value;

	r8168dp_2_mdio_start(ioaddr);

	value = r8169_mdio_read(ioaddr, reg_addr);

	r8168dp_2_mdio_stop(ioaddr);

	return value;
}

946
static void rtl_writephy(struct rtl8169_private *tp, int location, u32 val)
947
{
948
	tp->mdio_ops.write(tp->mmio_addr, location, val);
949 950
}

951 952
static int rtl_readphy(struct rtl8169_private *tp, int location)
{
953
	return tp->mdio_ops.read(tp->mmio_addr, location);
954 955 956 957 958 959 960 961
}

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

static void rtl_w1w0_phy(struct rtl8169_private *tp, int reg_addr, int p, int m)
962 963 964
{
	int val;

965 966
	val = rtl_readphy(tp, reg_addr);
	rtl_writephy(tp, reg_addr, (val | p) & ~m);
967 968
}

969 970 971 972 973
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
			   int val)
{
	struct rtl8169_private *tp = netdev_priv(dev);

974
	rtl_writephy(tp, location, val);
975 976 977 978 979 980
}

static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
{
	struct rtl8169_private *tp = netdev_priv(dev);

981
	return rtl_readphy(tp, location);
982 983
}

984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
{
	unsigned int i;

	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);

	for (i = 0; i < 100; i++) {
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
			break;
		udelay(10);
	}
}

static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
{
	u16 value = 0xffff;
	unsigned int i;

	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);

	for (i = 0; i < 100; i++) {
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
			break;
		}
		udelay(10);
	}

	return value;
}

static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
{
	unsigned int i;

	RTL_W32(CSIDR, value);
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);

	for (i = 0; i < 100; i++) {
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
			break;
		udelay(10);
	}
}

static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
{
	u32 value = ~0x00;
	unsigned int i;

	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);

	for (i = 0; i < 100; i++) {
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
			value = RTL_R32(CSIDR);
			break;
		}
		udelay(10);
	}

	return value;
}

H
Hayes Wang 已提交
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
static
void rtl_eri_write(void __iomem *ioaddr, int addr, u32 mask, u32 val, int type)
{
	unsigned int i;

	BUG_ON((addr & 3) || (mask == 0));
	RTL_W32(ERIDR, val);
	RTL_W32(ERIAR, ERIAR_WRITE_CMD | type | mask | addr);

	for (i = 0; i < 100; i++) {
		if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
			break;
		udelay(100);
	}
}

static u32 rtl_eri_read(void __iomem *ioaddr, int addr, int type)
{
	u32 value = ~0x00;
	unsigned int i;

	RTL_W32(ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr);

	for (i = 0; i < 100; i++) {
		if (RTL_R32(ERIAR) & ERIAR_FLAG) {
			value = RTL_R32(ERIDR);
			break;
		}
		udelay(100);
	}

	return value;
}

static void
rtl_w1w0_eri(void __iomem *ioaddr, int addr, u32 mask, u32 p, u32 m, int type)
{
	u32 val;

	val = rtl_eri_read(ioaddr, addr, type);
	rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type);
}

1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
{
	u8 value = 0xff;
	unsigned int i;

	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);

	for (i = 0; i < 300; i++) {
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
			break;
		}
		udelay(100);
	}

	return value;
}

L
Linus Torvalds 已提交
1111 1112 1113 1114 1115 1116 1117
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
{
	RTL_W16(IntrMask, 0x0000);

	RTL_W16(IntrStatus, 0xffff);
}

1118
static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1119
{
1120 1121
	void __iomem *ioaddr = tp->mmio_addr;

L
Linus Torvalds 已提交
1122 1123 1124
	return RTL_R32(TBICSR) & TBIReset;
}

1125
static unsigned int rtl8169_xmii_reset_pending(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1126
{
1127
	return rtl_readphy(tp, MII_BMCR) & BMCR_RESET;
L
Linus Torvalds 已提交
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
}

static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
{
	return RTL_R32(TBICSR) & TBILinkOk;
}

static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
{
	return RTL_R8(PHYstatus) & LinkStatus;
}

1140
static void rtl8169_tbi_reset_enable(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1141
{
1142 1143
	void __iomem *ioaddr = tp->mmio_addr;

L
Linus Torvalds 已提交
1144 1145 1146
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
}

1147
static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
1148 1149 1150
{
	unsigned int val;

1151 1152
	val = rtl_readphy(tp, MII_BMCR) | BMCR_RESET;
	rtl_writephy(tp, MII_BMCR, val & 0xffff);
L
Linus Torvalds 已提交
1153 1154
}

H
Hayes Wang 已提交
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
static void rtl_link_chg_patch(struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;
	struct net_device *dev = tp->dev;

	if (!netif_running(dev))
		return;

	if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
		if (RTL_R8(PHYstatus) & _1000bpsF) {
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
				      0x00000011, ERIAR_EXGMAC);
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
				      0x00000005, ERIAR_EXGMAC);
		} else if (RTL_R8(PHYstatus) & _100bps) {
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
				      0x0000001f, ERIAR_EXGMAC);
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
				      0x00000005, ERIAR_EXGMAC);
		} else {
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
				      0x0000001f, ERIAR_EXGMAC);
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
				      0x0000003f, ERIAR_EXGMAC);
		}
		/* Reset packet filter */
		rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x00, 0x01,
			     ERIAR_EXGMAC);
		rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00,
			     ERIAR_EXGMAC);
	}
}

1188
static void __rtl8169_check_link_status(struct net_device *dev,
F
Francois Romieu 已提交
1189 1190
					struct rtl8169_private *tp,
					void __iomem *ioaddr, bool pm)
L
Linus Torvalds 已提交
1191 1192 1193 1194 1195
{
	unsigned long flags;

	spin_lock_irqsave(&tp->lock, flags);
	if (tp->link_ok(ioaddr)) {
H
Hayes Wang 已提交
1196
		rtl_link_chg_patch(tp);
1197
		/* This is to cancel a scheduled suspend if there's one. */
1198 1199
		if (pm)
			pm_request_resume(&tp->pci_dev->dev);
L
Linus Torvalds 已提交
1200
		netif_carrier_on(dev);
1201 1202
		if (net_ratelimit())
			netif_info(tp, ifup, dev, "link up\n");
1203
	} else {
L
Linus Torvalds 已提交
1204
		netif_carrier_off(dev);
1205
		netif_info(tp, ifdown, dev, "link down\n");
1206 1207
		if (pm)
			pm_schedule_suspend(&tp->pci_dev->dev, 100);
1208
	}
L
Linus Torvalds 已提交
1209 1210 1211
	spin_unlock_irqrestore(&tp->lock, flags);
}

1212 1213 1214 1215 1216 1217 1218
static void rtl8169_check_link_status(struct net_device *dev,
				      struct rtl8169_private *tp,
				      void __iomem *ioaddr)
{
	__rtl8169_check_link_status(dev, tp, ioaddr, false);
}

1219 1220 1221
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)

static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
F
Francois Romieu 已提交
1222 1223 1224
{
	void __iomem *ioaddr = tp->mmio_addr;
	u8 options;
1225
	u32 wolopts = 0;
F
Francois Romieu 已提交
1226 1227 1228

	options = RTL_R8(Config1);
	if (!(options & PMEnable))
1229
		return 0;
F
Francois Romieu 已提交
1230 1231 1232

	options = RTL_R8(Config3);
	if (options & LinkUp)
1233
		wolopts |= WAKE_PHY;
F
Francois Romieu 已提交
1234
	if (options & MagicPacket)
1235
		wolopts |= WAKE_MAGIC;
F
Francois Romieu 已提交
1236 1237 1238

	options = RTL_R8(Config5);
	if (options & UWF)
1239
		wolopts |= WAKE_UCAST;
F
Francois Romieu 已提交
1240
	if (options & BWF)
1241
		wolopts |= WAKE_BCAST;
F
Francois Romieu 已提交
1242
	if (options & MWF)
1243
		wolopts |= WAKE_MCAST;
F
Francois Romieu 已提交
1244

1245
	return wolopts;
F
Francois Romieu 已提交
1246 1247
}

1248
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
F
Francois Romieu 已提交
1249 1250
{
	struct rtl8169_private *tp = netdev_priv(dev);
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261

	spin_lock_irq(&tp->lock);

	wol->supported = WAKE_ANY;
	wol->wolopts = __rtl8169_get_wol(tp);

	spin_unlock_irq(&tp->lock);
}

static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
{
F
Francois Romieu 已提交
1262
	void __iomem *ioaddr = tp->mmio_addr;
F
Francois Romieu 已提交
1263
	unsigned int i;
1264
	static const struct {
F
Francois Romieu 已提交
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281
		u32 opt;
		u16 reg;
		u8  mask;
	} cfg[] = {
		{ WAKE_ANY,   Config1, PMEnable },
		{ WAKE_PHY,   Config3, LinkUp },
		{ WAKE_MAGIC, Config3, MagicPacket },
		{ WAKE_UCAST, Config5, UWF },
		{ WAKE_BCAST, Config5, BWF },
		{ WAKE_MCAST, Config5, MWF },
		{ WAKE_ANY,   Config5, LanWake }
	};

	RTL_W8(Cfg9346, Cfg9346_Unlock);

	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
1282
		if (wolopts & cfg[i].opt)
F
Francois Romieu 已提交
1283 1284 1285 1286 1287
			options |= cfg[i].mask;
		RTL_W8(cfg[i].reg, options);
	}

	RTL_W8(Cfg9346, Cfg9346_Lock);
1288 1289 1290 1291 1292 1293 1294
}

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

	spin_lock_irq(&tp->lock);
F
Francois Romieu 已提交
1295

1296 1297 1298 1299
	if (wol->wolopts)
		tp->features |= RTL_FEATURE_WOL;
	else
		tp->features &= ~RTL_FEATURE_WOL;
1300
	__rtl8169_set_wol(tp, wol->wolopts);
F
Francois Romieu 已提交
1301 1302
	spin_unlock_irq(&tp->lock);

1303 1304
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);

F
Francois Romieu 已提交
1305 1306 1307
	return 0;
}

1308 1309
static const char *rtl_lookup_firmware_name(struct rtl8169_private *tp)
{
1310
	return rtl_chip_infos[tp->mac_version].fw_name;
1311 1312
}

L
Linus Torvalds 已提交
1313 1314 1315 1316
static void rtl8169_get_drvinfo(struct net_device *dev,
				struct ethtool_drvinfo *info)
{
	struct rtl8169_private *tp = netdev_priv(dev);
1317
	struct rtl_fw *rtl_fw = tp->rtl_fw;
L
Linus Torvalds 已提交
1318 1319 1320 1321

	strcpy(info->driver, MODULENAME);
	strcpy(info->version, RTL8169_VERSION);
	strcpy(info->bus_info, pci_name(tp->pci_dev));
1322 1323 1324
	BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
	strcpy(info->fw_version, IS_ERR_OR_NULL(rtl_fw) ? "N/A" :
	       rtl_fw->version);
L
Linus Torvalds 已提交
1325 1326 1327 1328 1329 1330 1331 1332
}

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

static int rtl8169_set_speed_tbi(struct net_device *dev,
1333
				 u8 autoneg, u16 speed, u8 duplex, u32 ignored)
L
Linus Torvalds 已提交
1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	int ret = 0;
	u32 reg;

	reg = RTL_R32(TBICSR);
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
	    (duplex == DUPLEX_FULL)) {
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
	} else if (autoneg == AUTONEG_ENABLE)
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
	else {
1347 1348
		netif_warn(tp, link, dev,
			   "incorrect speed setting refused in TBI mode\n");
L
Linus Torvalds 已提交
1349 1350 1351 1352 1353 1354 1355
		ret = -EOPNOTSUPP;
	}

	return ret;
}

static int rtl8169_set_speed_xmii(struct net_device *dev,
1356
				  u8 autoneg, u16 speed, u8 duplex, u32 adv)
L
Linus Torvalds 已提交
1357 1358
{
	struct rtl8169_private *tp = netdev_priv(dev);
1359
	int giga_ctrl, bmcr;
1360
	int rc = -EINVAL;
L
Linus Torvalds 已提交
1361

1362
	rtl_writephy(tp, 0x1f, 0x0000);
L
Linus Torvalds 已提交
1363 1364

	if (autoneg == AUTONEG_ENABLE) {
1365 1366
		int auto_nego;

1367
		auto_nego = rtl_readphy(tp, MII_ADVERTISE);
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
		auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
				ADVERTISE_100HALF | ADVERTISE_100FULL);

		if (adv & ADVERTISED_10baseT_Half)
			auto_nego |= ADVERTISE_10HALF;
		if (adv & ADVERTISED_10baseT_Full)
			auto_nego |= ADVERTISE_10FULL;
		if (adv & ADVERTISED_100baseT_Half)
			auto_nego |= ADVERTISE_100HALF;
		if (adv & ADVERTISED_100baseT_Full)
			auto_nego |= ADVERTISE_100FULL;

1380
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
L
Linus Torvalds 已提交
1381

1382
		giga_ctrl = rtl_readphy(tp, MII_CTRL1000);
1383
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
1384

1385
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
1386
		if (tp->mii.supports_gmii) {
1387 1388 1389 1390 1391 1392
			if (adv & ADVERTISED_1000baseT_Half)
				giga_ctrl |= ADVERTISE_1000HALF;
			if (adv & ADVERTISED_1000baseT_Full)
				giga_ctrl |= ADVERTISE_1000FULL;
		} else if (adv & (ADVERTISED_1000baseT_Half |
				  ADVERTISED_1000baseT_Full)) {
1393 1394
			netif_info(tp, link, dev,
				   "PHY does not support 1000Mbps\n");
1395
			goto out;
1396
		}
L
Linus Torvalds 已提交
1397

1398 1399
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;

1400 1401
		rtl_writephy(tp, MII_ADVERTISE, auto_nego);
		rtl_writephy(tp, MII_CTRL1000, giga_ctrl);
1402 1403 1404 1405 1406 1407 1408 1409
	} else {
		giga_ctrl = 0;

		if (speed == SPEED_10)
			bmcr = 0;
		else if (speed == SPEED_100)
			bmcr = BMCR_SPEED100;
		else
1410
			goto out;
1411 1412 1413

		if (duplex == DUPLEX_FULL)
			bmcr |= BMCR_FULLDPLX;
R
Roger So 已提交
1414 1415
	}

1416
	rtl_writephy(tp, MII_BMCR, bmcr);
1417

F
Francois Romieu 已提交
1418 1419
	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
1420
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
1421 1422
			rtl_writephy(tp, 0x17, 0x2138);
			rtl_writephy(tp, 0x0e, 0x0260);
1423
		} else {
1424 1425
			rtl_writephy(tp, 0x17, 0x2108);
			rtl_writephy(tp, 0x0e, 0x0000);
1426 1427 1428
		}
	}

1429 1430 1431
	rc = 0;
out:
	return rc;
L
Linus Torvalds 已提交
1432 1433 1434
}

static int rtl8169_set_speed(struct net_device *dev,
1435
			     u8 autoneg, u16 speed, u8 duplex, u32 advertising)
L
Linus Torvalds 已提交
1436 1437 1438 1439
{
	struct rtl8169_private *tp = netdev_priv(dev);
	int ret;

1440
	ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
1441 1442
	if (ret < 0)
		goto out;
L
Linus Torvalds 已提交
1443

1444 1445
	if (netif_running(dev) && (autoneg == AUTONEG_ENABLE) &&
	    (advertising & ADVERTISED_1000baseT_Full)) {
L
Linus Torvalds 已提交
1446
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
1447 1448
	}
out:
L
Linus Torvalds 已提交
1449 1450 1451 1452 1453 1454 1455 1456 1457
	return ret;
}

static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	unsigned long flags;
	int ret;

1458 1459
	del_timer_sync(&tp->timer);

L
Linus Torvalds 已提交
1460
	spin_lock_irqsave(&tp->lock, flags);
F
Francois Romieu 已提交
1461
	ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
1462
				cmd->duplex, cmd->advertising);
L
Linus Torvalds 已提交
1463
	spin_unlock_irqrestore(&tp->lock, flags);
1464

L
Linus Torvalds 已提交
1465 1466 1467
	return ret;
}

1468
static u32 rtl8169_fix_features(struct net_device *dev, u32 features)
L
Linus Torvalds 已提交
1469
{
F
Francois Romieu 已提交
1470
	if (dev->mtu > TD_MSS_MAX)
1471
		features &= ~NETIF_F_ALL_TSO;
L
Linus Torvalds 已提交
1472

1473
	return features;
L
Linus Torvalds 已提交
1474 1475
}

1476
static int rtl8169_set_features(struct net_device *dev, u32 features)
L
Linus Torvalds 已提交
1477 1478 1479 1480 1481 1482 1483
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	unsigned long flags;

	spin_lock_irqsave(&tp->lock, flags);

1484
	if (features & NETIF_F_RXCSUM)
L
Linus Torvalds 已提交
1485 1486 1487 1488
		tp->cp_cmd |= RxChkSum;
	else
		tp->cp_cmd &= ~RxChkSum;

1489 1490 1491 1492 1493
	if (dev->features & NETIF_F_HW_VLAN_RX)
		tp->cp_cmd |= RxVlan;
	else
		tp->cp_cmd &= ~RxVlan;

L
Linus Torvalds 已提交
1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
	RTL_W16(CPlusCmd, tp->cp_cmd);
	RTL_R16(CPlusCmd);

	spin_unlock_irqrestore(&tp->lock, flags);

	return 0;
}

static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
				      struct sk_buff *skb)
{
1505
	return (vlan_tx_tag_present(skb)) ?
L
Linus Torvalds 已提交
1506 1507 1508
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
}

1509
static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
L
Linus Torvalds 已提交
1510 1511 1512
{
	u32 opts2 = le32_to_cpu(desc->opts2);

1513 1514
	if (opts2 & RxVlanTag)
		__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
E
Eric Dumazet 已提交
1515

L
Linus Torvalds 已提交
1516 1517 1518
	desc->opts2 = 0;
}

1519
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
L
Linus Torvalds 已提交
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	u32 status;

	cmd->supported =
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
	cmd->port = PORT_FIBRE;
	cmd->transceiver = XCVR_INTERNAL;

	status = RTL_R32(TBICSR);
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
	cmd->autoneg = !!(status & TBINwEnable);

1534
	ethtool_cmd_speed_set(cmd, SPEED_1000);
L
Linus Torvalds 已提交
1535
	cmd->duplex = DUPLEX_FULL; /* Always set */
1536 1537

	return 0;
L
Linus Torvalds 已提交
1538 1539
}

1540
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
L
Linus Torvalds 已提交
1541 1542
{
	struct rtl8169_private *tp = netdev_priv(dev);
1543 1544

	return mii_ethtool_gset(&tp->mii, cmd);
L
Linus Torvalds 已提交
1545 1546 1547 1548 1549 1550
}

static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	unsigned long flags;
1551
	int rc;
L
Linus Torvalds 已提交
1552 1553 1554

	spin_lock_irqsave(&tp->lock, flags);

1555
	rc = tp->get_settings(dev, cmd);
L
Linus Torvalds 已提交
1556 1557

	spin_unlock_irqrestore(&tp->lock, flags);
1558
	return rc;
L
Linus Torvalds 已提交
1559 1560 1561 1562 1563
}

static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
			     void *p)
{
1564 1565
	struct rtl8169_private *tp = netdev_priv(dev);
	unsigned long flags;
L
Linus Torvalds 已提交
1566

1567 1568
	if (regs->len > R8169_REGS_SIZE)
		regs->len = R8169_REGS_SIZE;
L
Linus Torvalds 已提交
1569

1570 1571 1572
	spin_lock_irqsave(&tp->lock, flags);
	memcpy_fromio(p, tp->mmio_addr, regs->len);
	spin_unlock_irqrestore(&tp->lock, flags);
L
Linus Torvalds 已提交
1573 1574
}

1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588
static u32 rtl8169_get_msglevel(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	return tp->msg_enable;
}

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

	tp->msg_enable = value;
}

1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
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",
};

1605
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
1606
{
1607 1608 1609 1610 1611 1612
	switch (sset) {
	case ETH_SS_STATS:
		return ARRAY_SIZE(rtl8169_gstrings);
	default:
		return -EOPNOTSUPP;
	}
1613 1614
}

1615
static void rtl8169_update_counters(struct net_device *dev)
1616 1617 1618
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
F
Francois Romieu 已提交
1619
	struct device *d = &tp->pci_dev->dev;
1620 1621 1622
	struct rtl8169_counters *counters;
	dma_addr_t paddr;
	u32 cmd;
1623
	int wait = 1000;
1624

1625 1626 1627 1628 1629 1630
	/*
	 * Some chips are unable to dump tally counters when the receiver
	 * is disabled.
	 */
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
		return;
1631

1632
	counters = dma_alloc_coherent(d, sizeof(*counters), &paddr, GFP_KERNEL);
1633 1634 1635 1636
	if (!counters)
		return;

	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
1637
	cmd = (u64)paddr & DMA_BIT_MASK(32);
1638 1639 1640
	RTL_W32(CounterAddrLow, cmd);
	RTL_W32(CounterAddrLow, cmd | CounterDump);

1641 1642 1643
	while (wait--) {
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
			memcpy(&tp->counters, counters, sizeof(*counters));
1644
			break;
1645 1646
		}
		udelay(10);
1647 1648 1649 1650 1651
	}

	RTL_W32(CounterAddrLow, 0);
	RTL_W32(CounterAddrHigh, 0);

1652
	dma_free_coherent(d, sizeof(*counters), counters, paddr);
1653 1654
}

1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678
static void rtl8169_get_ethtool_stats(struct net_device *dev,
				      struct ethtool_stats *stats, u64 *data)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	ASSERT_RTNL();

	rtl8169_update_counters(dev);

	data[0] = le64_to_cpu(tp->counters.tx_packets);
	data[1] = le64_to_cpu(tp->counters.rx_packets);
	data[2] = le64_to_cpu(tp->counters.tx_errors);
	data[3] = le32_to_cpu(tp->counters.rx_errors);
	data[4] = le16_to_cpu(tp->counters.rx_missed);
	data[5] = le16_to_cpu(tp->counters.align_errors);
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
	data[12] = le16_to_cpu(tp->counters.tx_underun);
}

1679 1680 1681 1682 1683 1684 1685 1686 1687
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;
	}
}

1688
static const struct ethtool_ops rtl8169_ethtool_ops = {
L
Linus Torvalds 已提交
1689 1690 1691 1692 1693
	.get_drvinfo		= rtl8169_get_drvinfo,
	.get_regs_len		= rtl8169_get_regs_len,
	.get_link		= ethtool_op_get_link,
	.get_settings		= rtl8169_get_settings,
	.set_settings		= rtl8169_set_settings,
1694 1695
	.get_msglevel		= rtl8169_get_msglevel,
	.set_msglevel		= rtl8169_set_msglevel,
L
Linus Torvalds 已提交
1696
	.get_regs		= rtl8169_get_regs,
F
Francois Romieu 已提交
1697 1698
	.get_wol		= rtl8169_get_wol,
	.set_wol		= rtl8169_set_wol,
1699
	.get_strings		= rtl8169_get_strings,
1700
	.get_sset_count		= rtl8169_get_sset_count,
1701
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
L
Linus Torvalds 已提交
1702 1703
};

F
Francois Romieu 已提交
1704
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
1705
				    struct net_device *dev, u8 default_version)
L
Linus Torvalds 已提交
1706
{
1707
	void __iomem *ioaddr = tp->mmio_addr;
1708 1709 1710 1711 1712 1713
	/*
	 * The driver currently handles the 8168Bf and the 8168Be identically
	 * but they can be identified more specifically through the test below
	 * if needed:
	 *
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
F
Francois Romieu 已提交
1714 1715 1716 1717
	 *
	 * Same thing for the 8101Eb and the 8101Ec:
	 *
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
1718
	 */
1719
	static const struct rtl_mac_info {
L
Linus Torvalds 已提交
1720
		u32 mask;
F
Francois Romieu 已提交
1721
		u32 val;
L
Linus Torvalds 已提交
1722 1723
		int mac_version;
	} mac_info[] = {
H
hayeswang 已提交
1724
		/* 8168E family. */
H
Hayes Wang 已提交
1725
		{ 0x7c800000, 0x2c800000,	RTL_GIGA_MAC_VER_34 },
H
hayeswang 已提交
1726 1727 1728 1729
		{ 0x7cf00000, 0x2c200000,	RTL_GIGA_MAC_VER_33 },
		{ 0x7cf00000, 0x2c100000,	RTL_GIGA_MAC_VER_32 },
		{ 0x7c800000, 0x2c000000,	RTL_GIGA_MAC_VER_33 },

F
Francois Romieu 已提交
1730
		/* 8168D family. */
1731 1732 1733
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
F
Francois Romieu 已提交
1734

F
françois romieu 已提交
1735 1736 1737
		/* 8168DP family. */
		{ 0x7cf00000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
		{ 0x7cf00000, 0x28a00000,	RTL_GIGA_MAC_VER_28 },
1738
		{ 0x7cf00000, 0x28b00000,	RTL_GIGA_MAC_VER_31 },
F
françois romieu 已提交
1739

1740
		/* 8168C family. */
1741
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
F
Francois Romieu 已提交
1742
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
1743
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
1744
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
F
Francois Romieu 已提交
1745 1746
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
F
Francois Romieu 已提交
1747
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
1748
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
1749
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
F
Francois Romieu 已提交
1750 1751 1752 1753 1754 1755 1756 1757

		/* 8168B family. */
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },

		/* 8101 family. */
1758
		{ 0x7cf00000, 0x40b00000,	RTL_GIGA_MAC_VER_30 },
1759 1760 1761
		{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
		{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
		{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
1762 1763 1764 1765 1766 1767
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
F
Francois Romieu 已提交
1768
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
1769
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
F
Francois Romieu 已提交
1770
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
1771 1772
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
F
Francois Romieu 已提交
1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
		/* FIXME: where did these entries come from ? -- FR */
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },

		/* 8110 family. */
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },

1786 1787
		/* Catch-all */
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
1788 1789
	};
	const struct rtl_mac_info *p = mac_info;
L
Linus Torvalds 已提交
1790 1791
	u32 reg;

F
Francois Romieu 已提交
1792 1793
	reg = RTL_R32(TxConfig);
	while ((reg & p->mask) != p->val)
L
Linus Torvalds 已提交
1794 1795
		p++;
	tp->mac_version = p->mac_version;
1796 1797 1798 1799 1800 1801

	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
		netif_notice(tp, probe, dev,
			     "unknown MAC, using family default\n");
		tp->mac_version = default_version;
	}
L
Linus Torvalds 已提交
1802 1803 1804 1805
}

static void rtl8169_print_mac_version(struct rtl8169_private *tp)
{
1806
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
L
Linus Torvalds 已提交
1807 1808
}

F
Francois Romieu 已提交
1809 1810 1811 1812 1813
struct phy_reg {
	u16 reg;
	u16 val;
};

1814 1815
static void rtl_writephy_batch(struct rtl8169_private *tp,
			       const struct phy_reg *regs, int len)
F
Francois Romieu 已提交
1816 1817
{
	while (len-- > 0) {
1818
		rtl_writephy(tp, regs->reg, regs->val);
F
Francois Romieu 已提交
1819 1820 1821 1822
		regs++;
	}
}

1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
#define PHY_READ		0x00000000
#define PHY_DATA_OR		0x10000000
#define PHY_DATA_AND		0x20000000
#define PHY_BJMPN		0x30000000
#define PHY_READ_EFUSE		0x40000000
#define PHY_READ_MAC_BYTE	0x50000000
#define PHY_WRITE_MAC_BYTE	0x60000000
#define PHY_CLEAR_READCOUNT	0x70000000
#define PHY_WRITE		0x80000000
#define PHY_READCOUNT_EQ_SKIP	0x90000000
#define PHY_COMP_EQ_SKIPN	0xa0000000
#define PHY_COMP_NEQ_SKIPN	0xb0000000
#define PHY_WRITE_PREVIOUS	0xc0000000
#define PHY_SKIPN		0xd0000000
#define PHY_DELAY_MS		0xe0000000
#define PHY_WRITE_ERI_WORD	0xf0000000

H
Hayes Wang 已提交
1840 1841 1842 1843 1844 1845 1846 1847
struct fw_info {
	u32	magic;
	char	version[RTL_VER_SIZE];
	__le32	fw_start;
	__le32	fw_len;
	u8	chksum;
} __packed;

1848 1849 1850
#define FW_OPCODE_SIZE	sizeof(typeof(*((struct rtl_fw_phy_action *)0)->code))

static bool rtl_fw_format_ok(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
1851
{
1852
	const struct firmware *fw = rtl_fw->fw;
H
Hayes Wang 已提交
1853
	struct fw_info *fw_info = (struct fw_info *)fw->data;
1854 1855 1856 1857 1858 1859
	struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
	char *version = rtl_fw->version;
	bool rc = false;

	if (fw->size < FW_OPCODE_SIZE)
		goto out;
H
Hayes Wang 已提交
1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885

	if (!fw_info->magic) {
		size_t i, size, start;
		u8 checksum = 0;

		if (fw->size < sizeof(*fw_info))
			goto out;

		for (i = 0; i < fw->size; i++)
			checksum += fw->data[i];
		if (checksum != 0)
			goto out;

		start = le32_to_cpu(fw_info->fw_start);
		if (start > fw->size)
			goto out;

		size = le32_to_cpu(fw_info->fw_len);
		if (size > (fw->size - start) / FW_OPCODE_SIZE)
			goto out;

		memcpy(version, fw_info->version, RTL_VER_SIZE);

		pa->code = (__le32 *)(fw->data + start);
		pa->size = size;
	} else {
1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900
		if (fw->size % FW_OPCODE_SIZE)
			goto out;

		strlcpy(version, rtl_lookup_firmware_name(tp), RTL_VER_SIZE);

		pa->code = (__le32 *)fw->data;
		pa->size = fw->size / FW_OPCODE_SIZE;
	}
	version[RTL_VER_SIZE - 1] = 0;

	rc = true;
out:
	return rc;
}

1901 1902
static bool rtl_fw_data_ok(struct rtl8169_private *tp, struct net_device *dev,
			   struct rtl_fw_phy_action *pa)
1903
{
1904
	bool rc = false;
1905
	size_t index;
1906

1907 1908
	for (index = 0; index < pa->size; index++) {
		u32 action = le32_to_cpu(pa->code[index]);
1909
		u32 regno = (action & 0x0fff0000) >> 16;
1910

1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923
		switch(action & 0xf0000000) {
		case PHY_READ:
		case PHY_DATA_OR:
		case PHY_DATA_AND:
		case PHY_READ_EFUSE:
		case PHY_CLEAR_READCOUNT:
		case PHY_WRITE:
		case PHY_WRITE_PREVIOUS:
		case PHY_DELAY_MS:
			break;

		case PHY_BJMPN:
			if (regno > index) {
1924
				netif_err(tp, ifup, tp->dev,
F
Francois Romieu 已提交
1925
					  "Out of range of firmware\n");
1926
				goto out;
1927 1928 1929
			}
			break;
		case PHY_READCOUNT_EQ_SKIP:
1930
			if (index + 2 >= pa->size) {
1931
				netif_err(tp, ifup, tp->dev,
F
Francois Romieu 已提交
1932
					  "Out of range of firmware\n");
1933
				goto out;
1934 1935 1936 1937 1938
			}
			break;
		case PHY_COMP_EQ_SKIPN:
		case PHY_COMP_NEQ_SKIPN:
		case PHY_SKIPN:
1939
			if (index + 1 + regno >= pa->size) {
1940
				netif_err(tp, ifup, tp->dev,
F
Francois Romieu 已提交
1941
					  "Out of range of firmware\n");
1942
				goto out;
1943
			}
1944 1945
			break;

1946 1947 1948 1949
		case PHY_READ_MAC_BYTE:
		case PHY_WRITE_MAC_BYTE:
		case PHY_WRITE_ERI_WORD:
		default:
1950
			netif_err(tp, ifup, tp->dev,
1951
				  "Invalid action 0x%08x\n", action);
1952
			goto out;
1953 1954
		}
	}
1955 1956 1957 1958
	rc = true;
out:
	return rc;
}
1959

1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
static int rtl_check_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
{
	struct net_device *dev = tp->dev;
	int rc = -EINVAL;

	if (!rtl_fw_format_ok(tp, rtl_fw)) {
		netif_err(tp, ifup, dev, "invalid firwmare\n");
		goto out;
	}

	if (rtl_fw_data_ok(tp, dev, &rtl_fw->phy_action))
		rc = 0;
out:
	return rc;
}

static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
{
	struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
	u32 predata, count;
	size_t index;

	predata = count = 0;
1983

1984 1985
	for (index = 0; index < pa->size; ) {
		u32 action = le32_to_cpu(pa->code[index]);
1986
		u32 data = action & 0x0000ffff;
1987 1988 1989 1990
		u32 regno = (action & 0x0fff0000) >> 16;

		if (!action)
			break;
1991 1992

		switch(action & 0xf0000000) {
1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016
		case PHY_READ:
			predata = rtl_readphy(tp, regno);
			count++;
			index++;
			break;
		case PHY_DATA_OR:
			predata |= data;
			index++;
			break;
		case PHY_DATA_AND:
			predata &= data;
			index++;
			break;
		case PHY_BJMPN:
			index -= regno;
			break;
		case PHY_READ_EFUSE:
			predata = rtl8168d_efuse_read(tp->mmio_addr, regno);
			index++;
			break;
		case PHY_CLEAR_READCOUNT:
			count = 0;
			index++;
			break;
2017
		case PHY_WRITE:
2018 2019 2020 2021
			rtl_writephy(tp, regno, data);
			index++;
			break;
		case PHY_READCOUNT_EQ_SKIP:
F
Francois Romieu 已提交
2022
			index += (count == data) ? 2 : 1;
2023
			break;
2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048
		case PHY_COMP_EQ_SKIPN:
			if (predata == data)
				index += regno;
			index++;
			break;
		case PHY_COMP_NEQ_SKIPN:
			if (predata != data)
				index += regno;
			index++;
			break;
		case PHY_WRITE_PREVIOUS:
			rtl_writephy(tp, regno, predata);
			index++;
			break;
		case PHY_SKIPN:
			index += regno + 1;
			break;
		case PHY_DELAY_MS:
			mdelay(data);
			index++;
			break;

		case PHY_READ_MAC_BYTE:
		case PHY_WRITE_MAC_BYTE:
		case PHY_WRITE_ERI_WORD:
2049 2050 2051 2052 2053 2054
		default:
			BUG();
		}
	}
}

2055 2056
static void rtl_release_firmware(struct rtl8169_private *tp)
{
2057 2058 2059 2060 2061
	if (!IS_ERR_OR_NULL(tp->rtl_fw)) {
		release_firmware(tp->rtl_fw->fw);
		kfree(tp->rtl_fw);
	}
	tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
2062 2063
}

2064
static void rtl_apply_firmware(struct rtl8169_private *tp)
2065
{
2066
	struct rtl_fw *rtl_fw = tp->rtl_fw;
2067 2068

	/* TODO: release firmware once rtl_phy_write_fw signals failures. */
2069 2070
	if (!IS_ERR_OR_NULL(rtl_fw))
		rtl_phy_write_fw(tp, rtl_fw);
2071 2072 2073 2074 2075 2076 2077 2078
}

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

2081
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
2082
{
2083
	static const struct phy_reg phy_reg_init[] = {
F
françois romieu 已提交
2084 2085 2086 2087 2088
		{ 0x1f, 0x0001 },
		{ 0x06, 0x006e },
		{ 0x08, 0x0708 },
		{ 0x15, 0x4000 },
		{ 0x18, 0x65c7 },
L
Linus Torvalds 已提交
2089

F
françois romieu 已提交
2090 2091 2092 2093 2094 2095 2096
		{ 0x1f, 0x0001 },
		{ 0x03, 0x00a1 },
		{ 0x02, 0x0008 },
		{ 0x01, 0x0120 },
		{ 0x00, 0x1000 },
		{ 0x04, 0x0800 },
		{ 0x04, 0x0000 },
L
Linus Torvalds 已提交
2097

F
françois romieu 已提交
2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143
		{ 0x03, 0xff41 },
		{ 0x02, 0xdf60 },
		{ 0x01, 0x0140 },
		{ 0x00, 0x0077 },
		{ 0x04, 0x7800 },
		{ 0x04, 0x7000 },

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

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

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

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

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

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

2145
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
L
Linus Torvalds 已提交
2146 2147
}

2148
static void rtl8169sb_hw_phy_config(struct rtl8169_private *tp)
2149
{
2150
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2151 2152 2153 2154 2155
		{ 0x1f, 0x0002 },
		{ 0x01, 0x90d0 },
		{ 0x1f, 0x0000 }
	};

2156
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2157 2158
}

2159
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp)
2160 2161 2162 2163 2164 2165 2166 2167 2168 2169
{
	struct pci_dev *pdev = tp->pci_dev;
	u16 vendor_id, device_id;

	pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &vendor_id);
	pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &device_id);

	if ((vendor_id != PCI_VENDOR_ID_GIGABYTE) || (device_id != 0xe000))
		return;

2170 2171 2172
	rtl_writephy(tp, 0x1f, 0x0001);
	rtl_writephy(tp, 0x10, 0xf01b);
	rtl_writephy(tp, 0x1f, 0x0000);
2173 2174
}

2175
static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp)
2176
{
2177
	static const struct phy_reg phy_reg_init[] = {
2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216
		{ 0x1f, 0x0001 },
		{ 0x04, 0x0000 },
		{ 0x03, 0x00a1 },
		{ 0x02, 0x0008 },
		{ 0x01, 0x0120 },
		{ 0x00, 0x1000 },
		{ 0x04, 0x0800 },
		{ 0x04, 0x9000 },
		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf099 },
		{ 0x04, 0x9800 },
		{ 0x04, 0xa000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0xff95 },
		{ 0x00, 0xba00 },
		{ 0x04, 0xa800 },
		{ 0x04, 0xf000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x101a },
		{ 0x00, 0xa0ff },
		{ 0x04, 0xf800 },
		{ 0x04, 0x0000 },
		{ 0x1f, 0x0000 },

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

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

2217
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2218

2219
	rtl8169scd_hw_phy_config_quirk(tp);
2220 2221
}

2222
static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp)
2223
{
2224
	static const struct phy_reg phy_reg_init[] = {
2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271
		{ 0x1f, 0x0001 },
		{ 0x04, 0x0000 },
		{ 0x03, 0x00a1 },
		{ 0x02, 0x0008 },
		{ 0x01, 0x0120 },
		{ 0x00, 0x1000 },
		{ 0x04, 0x0800 },
		{ 0x04, 0x9000 },
		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf099 },
		{ 0x04, 0x9800 },
		{ 0x04, 0xa000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0xff95 },
		{ 0x00, 0xba00 },
		{ 0x04, 0xa800 },
		{ 0x04, 0xf000 },
		{ 0x03, 0xdf01 },
		{ 0x02, 0xdf20 },
		{ 0x01, 0x101a },
		{ 0x00, 0xa0ff },
		{ 0x04, 0xf800 },
		{ 0x04, 0x0000 },
		{ 0x1f, 0x0000 },

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

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

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

2272
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2273 2274
}

2275
static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp)
2276
{
2277
	static const struct phy_reg phy_reg_init[] = {
2278 2279 2280 2281
		{ 0x10, 0xf41b },
		{ 0x1f, 0x0000 }
	};

2282 2283
	rtl_writephy(tp, 0x1f, 0x0001);
	rtl_patchphy(tp, 0x16, 1 << 0);
2284

2285
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2286 2287
}

2288
static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp)
2289
{
2290
	static const struct phy_reg phy_reg_init[] = {
2291 2292 2293 2294 2295
		{ 0x1f, 0x0001 },
		{ 0x10, 0xf41b },
		{ 0x1f, 0x0000 }
	};

2296
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2297 2298
}

2299
static void rtl8168cp_1_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2300
{
2301
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2302 2303 2304 2305 2306 2307 2308
		{ 0x1f, 0x0000 },
		{ 0x1d, 0x0f00 },
		{ 0x1f, 0x0002 },
		{ 0x0c, 0x1ec8 },
		{ 0x1f, 0x0000 }
	};

2309
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
F
Francois Romieu 已提交
2310 2311
}

2312
static void rtl8168cp_2_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2313
{
2314
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2315 2316 2317 2318 2319
		{ 0x1f, 0x0001 },
		{ 0x1d, 0x3d98 },
		{ 0x1f, 0x0000 }
	};

2320 2321 2322
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
F
Francois Romieu 已提交
2323

2324
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
F
Francois Romieu 已提交
2325 2326
}

2327
static void rtl8168c_1_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2328
{
2329
	static const struct phy_reg phy_reg_init[] = {
2330 2331
		{ 0x1f, 0x0001 },
		{ 0x12, 0x2300 },
F
Francois Romieu 已提交
2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342
		{ 0x1f, 0x0002 },
		{ 0x00, 0x88d4 },
		{ 0x01, 0x82b1 },
		{ 0x03, 0x7002 },
		{ 0x08, 0x9e30 },
		{ 0x09, 0x01f0 },
		{ 0x0a, 0x5500 },
		{ 0x0c, 0x00c8 },
		{ 0x1f, 0x0003 },
		{ 0x12, 0xc096 },
		{ 0x16, 0x000a },
2343 2344 2345 2346
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0000 },
		{ 0x09, 0x2000 },
		{ 0x09, 0x0000 }
F
Francois Romieu 已提交
2347 2348
	};

2349
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2350

2351 2352 2353
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
	rtl_writephy(tp, 0x1f, 0x0000);
F
Francois Romieu 已提交
2354 2355
}

2356
static void rtl8168c_2_hw_phy_config(struct rtl8169_private *tp)
2357
{
2358
	static const struct phy_reg phy_reg_init[] = {
2359
		{ 0x1f, 0x0001 },
2360
		{ 0x12, 0x2300 },
2361 2362 2363 2364 2365 2366 2367
		{ 0x03, 0x802f },
		{ 0x02, 0x4f02 },
		{ 0x01, 0x0409 },
		{ 0x00, 0xf099 },
		{ 0x04, 0x9800 },
		{ 0x04, 0x9000 },
		{ 0x1d, 0x3d98 },
2368 2369
		{ 0x1f, 0x0002 },
		{ 0x0c, 0x7eb8 },
2370 2371 2372
		{ 0x06, 0x0761 },
		{ 0x1f, 0x0003 },
		{ 0x16, 0x0f0a },
2373 2374 2375
		{ 0x1f, 0x0000 }
	};

2376
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2377

2378 2379 2380 2381
	rtl_patchphy(tp, 0x16, 1 << 0);
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
	rtl_writephy(tp, 0x1f, 0x0000);
2382 2383
}

2384
static void rtl8168c_3_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2385
{
2386
	static const struct phy_reg phy_reg_init[] = {
F
Francois Romieu 已提交
2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397
		{ 0x1f, 0x0001 },
		{ 0x12, 0x2300 },
		{ 0x1d, 0x3d98 },
		{ 0x1f, 0x0002 },
		{ 0x0c, 0x7eb8 },
		{ 0x06, 0x5461 },
		{ 0x1f, 0x0003 },
		{ 0x16, 0x0f0a },
		{ 0x1f, 0x0000 }
	};

2398
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
F
Francois Romieu 已提交
2399

2400 2401 2402 2403
	rtl_patchphy(tp, 0x16, 1 << 0);
	rtl_patchphy(tp, 0x14, 1 << 5);
	rtl_patchphy(tp, 0x0d, 1 << 5);
	rtl_writephy(tp, 0x1f, 0x0000);
F
Francois Romieu 已提交
2404 2405
}

2406
static void rtl8168c_4_hw_phy_config(struct rtl8169_private *tp)
2407
{
2408
	rtl8168c_3_hw_phy_config(tp);
2409 2410
}

2411
static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
F
Francois Romieu 已提交
2412
{
2413
	static const struct phy_reg phy_reg_init_0[] = {
2414
		/* Channel Estimation */
F
Francois Romieu 已提交
2415
		{ 0x1f, 0x0001 },
2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426
		{ 0x06, 0x4064 },
		{ 0x07, 0x2863 },
		{ 0x08, 0x059c },
		{ 0x09, 0x26b4 },
		{ 0x0a, 0x6a19 },
		{ 0x0b, 0xdcc8 },
		{ 0x10, 0xf06d },
		{ 0x14, 0x7f68 },
		{ 0x18, 0x7fd9 },
		{ 0x1c, 0xf0ff },
		{ 0x1d, 0x3d9c },
F
Francois Romieu 已提交
2427
		{ 0x1f, 0x0003 },
2428 2429 2430
		{ 0x12, 0xf49f },
		{ 0x13, 0x070b },
		{ 0x1a, 0x05ad },
2431 2432 2433 2434
		{ 0x14, 0x94c0 },

		/*
		 * Tx Error Issue
F
Francois Romieu 已提交
2435
		 * Enhance line driver power
2436
		 */
F
Francois Romieu 已提交
2437
		{ 0x1f, 0x0002 },
2438 2439 2440
		{ 0x06, 0x5561 },
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8332 },
2441 2442 2443 2444 2445 2446 2447 2448
		{ 0x06, 0x5561 },

		/*
		 * Can not link to 1Gbps with bad cable
		 * Decrease SNR threshold form 21.07dB to 19.04dB
		 */
		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },
2449

F
Francois Romieu 已提交
2450
		{ 0x1f, 0x0000 },
2451
		{ 0x0d, 0xf880 }
2452
	};
2453
	void __iomem *ioaddr = tp->mmio_addr;
2454

2455
	rtl_writephy_batch(tp, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
2456

2457 2458 2459 2460
	/*
	 * Rx Error Issue
	 * Fine Tune Switching regulator parameter
	 */
2461 2462 2463
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_w1w0_phy(tp, 0x0b, 0x0010, 0x00ef);
	rtl_w1w0_phy(tp, 0x0c, 0xa200, 0x5d00);
2464 2465

	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
2466
		static const struct phy_reg phy_reg_init[] = {
2467 2468 2469 2470 2471 2472 2473 2474 2475
			{ 0x1f, 0x0002 },
			{ 0x05, 0x669a },
			{ 0x1f, 0x0005 },
			{ 0x05, 0x8330 },
			{ 0x06, 0x669a },
			{ 0x1f, 0x0002 }
		};
		int val;

2476
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2477

2478
		val = rtl_readphy(tp, 0x0d);
2479 2480

		if ((val & 0x00ff) != 0x006c) {
2481
			static const u32 set[] = {
2482 2483 2484 2485 2486
				0x0065, 0x0066, 0x0067, 0x0068,
				0x0069, 0x006a, 0x006b, 0x006c
			};
			int i;

2487
			rtl_writephy(tp, 0x1f, 0x0002);
2488 2489 2490

			val &= 0xff00;
			for (i = 0; i < ARRAY_SIZE(set); i++)
2491
				rtl_writephy(tp, 0x0d, val | set[i]);
2492 2493
		}
	} else {
2494
		static const struct phy_reg phy_reg_init[] = {
2495 2496 2497 2498 2499 2500 2501
			{ 0x1f, 0x0002 },
			{ 0x05, 0x6662 },
			{ 0x1f, 0x0005 },
			{ 0x05, 0x8330 },
			{ 0x06, 0x6662 }
		};

2502
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2503 2504
	}

2505
	/* RSET couple improve */
2506 2507 2508
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_patchphy(tp, 0x0d, 0x0300);
	rtl_patchphy(tp, 0x0f, 0x0010);
2509

2510
	/* Fine tune PLL performance */
2511 2512 2513
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_w1w0_phy(tp, 0x02, 0x0100, 0x0600);
	rtl_w1w0_phy(tp, 0x03, 0x0000, 0xe000);
2514

2515 2516
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x001b);
2517 2518

	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00);
2519

2520
	rtl_writephy(tp, 0x1f, 0x0000);
2521 2522
}

2523
static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
2524
{
2525
	static const struct phy_reg phy_reg_init_0[] = {
2526
		/* Channel Estimation */
2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544
		{ 0x1f, 0x0001 },
		{ 0x06, 0x4064 },
		{ 0x07, 0x2863 },
		{ 0x08, 0x059c },
		{ 0x09, 0x26b4 },
		{ 0x0a, 0x6a19 },
		{ 0x0b, 0xdcc8 },
		{ 0x10, 0xf06d },
		{ 0x14, 0x7f68 },
		{ 0x18, 0x7fd9 },
		{ 0x1c, 0xf0ff },
		{ 0x1d, 0x3d9c },
		{ 0x1f, 0x0003 },
		{ 0x12, 0xf49f },
		{ 0x13, 0x070b },
		{ 0x1a, 0x05ad },
		{ 0x14, 0x94c0 },

2545 2546
		/*
		 * Tx Error Issue
F
Francois Romieu 已提交
2547
		 * Enhance line driver power
2548
		 */
2549 2550 2551 2552
		{ 0x1f, 0x0002 },
		{ 0x06, 0x5561 },
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8332 },
2553 2554 2555 2556 2557 2558 2559 2560
		{ 0x06, 0x5561 },

		/*
		 * Can not link to 1Gbps with bad cable
		 * Decrease SNR threshold form 21.07dB to 19.04dB
		 */
		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },
2561 2562

		{ 0x1f, 0x0000 },
2563
		{ 0x0d, 0xf880 }
F
Francois Romieu 已提交
2564
	};
2565
	void __iomem *ioaddr = tp->mmio_addr;
F
Francois Romieu 已提交
2566

2567
	rtl_writephy_batch(tp, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
F
Francois Romieu 已提交
2568

2569
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
2570
		static const struct phy_reg phy_reg_init[] = {
2571 2572
			{ 0x1f, 0x0002 },
			{ 0x05, 0x669a },
F
Francois Romieu 已提交
2573
			{ 0x1f, 0x0005 },
2574 2575 2576 2577 2578 2579 2580
			{ 0x05, 0x8330 },
			{ 0x06, 0x669a },

			{ 0x1f, 0x0002 }
		};
		int val;

2581
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2582

2583
		val = rtl_readphy(tp, 0x0d);
2584
		if ((val & 0x00ff) != 0x006c) {
J
Joe Perches 已提交
2585
			static const u32 set[] = {
2586 2587 2588 2589 2590
				0x0065, 0x0066, 0x0067, 0x0068,
				0x0069, 0x006a, 0x006b, 0x006c
			};
			int i;

2591
			rtl_writephy(tp, 0x1f, 0x0002);
2592 2593 2594

			val &= 0xff00;
			for (i = 0; i < ARRAY_SIZE(set); i++)
2595
				rtl_writephy(tp, 0x0d, val | set[i]);
2596 2597
		}
	} else {
2598
		static const struct phy_reg phy_reg_init[] = {
2599 2600
			{ 0x1f, 0x0002 },
			{ 0x05, 0x2642 },
F
Francois Romieu 已提交
2601
			{ 0x1f, 0x0005 },
2602 2603
			{ 0x05, 0x8330 },
			{ 0x06, 0x2642 }
F
Francois Romieu 已提交
2604 2605
		};

2606
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
F
Francois Romieu 已提交
2607 2608
	}

2609
	/* Fine tune PLL performance */
2610 2611 2612
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_w1w0_phy(tp, 0x02, 0x0100, 0x0600);
	rtl_w1w0_phy(tp, 0x03, 0x0000, 0xe000);
2613

2614
	/* Switching regulator Slew rate */
2615 2616
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_patchphy(tp, 0x0f, 0x0017);
2617

2618 2619
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x001b);
2620 2621

	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300);
2622

2623
	rtl_writephy(tp, 0x1f, 0x0000);
2624 2625
}

2626
static void rtl8168d_3_hw_phy_config(struct rtl8169_private *tp)
2627
{
2628
	static const struct phy_reg phy_reg_init[] = {
2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
		{ 0x1f, 0x0002 },
		{ 0x10, 0x0008 },
		{ 0x0d, 0x006c },

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

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

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

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

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

2684
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
F
Francois Romieu 已提交
2685 2686
}

F
françois romieu 已提交
2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702
static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		{ 0x1f, 0x0001 },
		{ 0x17, 0x0cc0 },

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

	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
	rtl_patchphy(tp, 0x0d, 1 << 5);
}

H
Hayes Wang 已提交
2703
static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
H
hayeswang 已提交
2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
{
	static const struct phy_reg phy_reg_init[] = {
		/* Enable Delay cap */
		{ 0x1f, 0x0005 },
		{ 0x05, 0x8b80 },
		{ 0x06, 0xc896 },
		{ 0x1f, 0x0000 },

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

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

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

F
Francois Romieu 已提交
2733 2734
	rtl_apply_firmware(tp);

H
hayeswang 已提交
2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));

	/* DCO enable for 10M IDLE Power */
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x0023);
	rtl_w1w0_phy(tp, 0x17, 0x0006, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);

	/* For impedance matching */
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_w1w0_phy(tp, 0x08, 0x8000, 0x7f00);
F
Francois Romieu 已提交
2746
	rtl_writephy(tp, 0x1f, 0x0000);
H
hayeswang 已提交
2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775

	/* PHY auto speed down */
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x002d);
	rtl_w1w0_phy(tp, 0x18, 0x0050, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);

	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b86);
	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);

	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
	rtl_w1w0_phy(tp, 0x06, 0x0000, 0x2000);
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x0020);
	rtl_w1w0_phy(tp, 0x15, 0x0000, 0x1100);
	rtl_writephy(tp, 0x1f, 0x0006);
	rtl_writephy(tp, 0x00, 0x5a00);
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, 0x0d, 0x0007);
	rtl_writephy(tp, 0x0e, 0x003c);
	rtl_writephy(tp, 0x0d, 0x4007);
	rtl_writephy(tp, 0x0e, 0x0000);
	rtl_writephy(tp, 0x0d, 0x0000);
}

H
Hayes Wang 已提交
2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860
static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		/* Enable Delay cap */
		{ 0x1f, 0x0004 },
		{ 0x1f, 0x0007 },
		{ 0x1e, 0x00ac },
		{ 0x18, 0x0006 },
		{ 0x1f, 0x0002 },
		{ 0x1f, 0x0000 },
		{ 0x1f, 0x0000 },

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

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

	rtl_apply_firmware(tp);

	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));

	/* For 4-corner performance improve */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b80);
	rtl_w1w0_phy(tp, 0x17, 0x0006, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);

	/* PHY auto speed down */
	rtl_writephy(tp, 0x1f, 0x0004);
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x002d);
	rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);

	/* improve 10M EEE waveform */
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b86);
	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
	rtl_writephy(tp, 0x1f, 0x0000);

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

	/* EEE setting */
	rtl_w1w0_eri(tp->mmio_addr, 0x1b0, ERIAR_MASK_1111, 0x0000, 0x0003,
		     ERIAR_EXGMAC);
	rtl_writephy(tp, 0x1f, 0x0005);
	rtl_writephy(tp, 0x05, 0x8b85);
	rtl_w1w0_phy(tp, 0x06, 0x0000, 0x2000);
	rtl_writephy(tp, 0x1f, 0x0004);
	rtl_writephy(tp, 0x1f, 0x0007);
	rtl_writephy(tp, 0x1e, 0x0020);
	rtl_w1w0_phy(tp, 0x06, 0x0000, 0x0100);
	rtl_writephy(tp, 0x1f, 0x0002);
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, 0x0d, 0x0007);
	rtl_writephy(tp, 0x0e, 0x003c);
	rtl_writephy(tp, 0x0d, 0x4007);
	rtl_writephy(tp, 0x0e, 0x0000);
	rtl_writephy(tp, 0x0d, 0x0000);

	/* Green feature */
	rtl_writephy(tp, 0x1f, 0x0003);
	rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
	rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
	rtl_writephy(tp, 0x1f, 0x0000);
}

2861
static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
2862
{
2863
	static const struct phy_reg phy_reg_init[] = {
2864 2865 2866 2867 2868 2869
		{ 0x1f, 0x0003 },
		{ 0x08, 0x441d },
		{ 0x01, 0x9100 },
		{ 0x1f, 0x0000 }
	};

2870 2871 2872 2873
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_patchphy(tp, 0x11, 1 << 12);
	rtl_patchphy(tp, 0x19, 1 << 13);
	rtl_patchphy(tp, 0x10, 1 << 15);
2874

2875
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
2876 2877
}

2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898
static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
{
	static const struct phy_reg phy_reg_init[] = {
		{ 0x1f, 0x0005 },
		{ 0x1a, 0x0000 },
		{ 0x1f, 0x0000 },

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

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

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

2899
	rtl_apply_firmware(tp);
2900 2901 2902 2903

	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
}

2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914
static void rtl_hw_phy_config(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl8169_print_mac_version(tp);

	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_01:
		break;
	case RTL_GIGA_MAC_VER_02:
	case RTL_GIGA_MAC_VER_03:
2915
		rtl8169s_hw_phy_config(tp);
2916 2917
		break;
	case RTL_GIGA_MAC_VER_04:
2918
		rtl8169sb_hw_phy_config(tp);
2919
		break;
2920
	case RTL_GIGA_MAC_VER_05:
2921
		rtl8169scd_hw_phy_config(tp);
2922
		break;
2923
	case RTL_GIGA_MAC_VER_06:
2924
		rtl8169sce_hw_phy_config(tp);
2925
		break;
2926 2927 2928
	case RTL_GIGA_MAC_VER_07:
	case RTL_GIGA_MAC_VER_08:
	case RTL_GIGA_MAC_VER_09:
2929
		rtl8102e_hw_phy_config(tp);
2930
		break;
2931
	case RTL_GIGA_MAC_VER_11:
2932
		rtl8168bb_hw_phy_config(tp);
2933 2934
		break;
	case RTL_GIGA_MAC_VER_12:
2935
		rtl8168bef_hw_phy_config(tp);
2936 2937
		break;
	case RTL_GIGA_MAC_VER_17:
2938
		rtl8168bef_hw_phy_config(tp);
2939
		break;
F
Francois Romieu 已提交
2940
	case RTL_GIGA_MAC_VER_18:
2941
		rtl8168cp_1_hw_phy_config(tp);
F
Francois Romieu 已提交
2942 2943
		break;
	case RTL_GIGA_MAC_VER_19:
2944
		rtl8168c_1_hw_phy_config(tp);
F
Francois Romieu 已提交
2945
		break;
2946
	case RTL_GIGA_MAC_VER_20:
2947
		rtl8168c_2_hw_phy_config(tp);
2948
		break;
F
Francois Romieu 已提交
2949
	case RTL_GIGA_MAC_VER_21:
2950
		rtl8168c_3_hw_phy_config(tp);
F
Francois Romieu 已提交
2951
		break;
2952
	case RTL_GIGA_MAC_VER_22:
2953
		rtl8168c_4_hw_phy_config(tp);
2954
		break;
F
Francois Romieu 已提交
2955
	case RTL_GIGA_MAC_VER_23:
2956
	case RTL_GIGA_MAC_VER_24:
2957
		rtl8168cp_2_hw_phy_config(tp);
F
Francois Romieu 已提交
2958
		break;
F
Francois Romieu 已提交
2959
	case RTL_GIGA_MAC_VER_25:
2960
		rtl8168d_1_hw_phy_config(tp);
2961 2962
		break;
	case RTL_GIGA_MAC_VER_26:
2963
		rtl8168d_2_hw_phy_config(tp);
2964 2965
		break;
	case RTL_GIGA_MAC_VER_27:
2966
		rtl8168d_3_hw_phy_config(tp);
F
Francois Romieu 已提交
2967
		break;
F
françois romieu 已提交
2968 2969 2970
	case RTL_GIGA_MAC_VER_28:
		rtl8168d_4_hw_phy_config(tp);
		break;
2971 2972 2973 2974
	case RTL_GIGA_MAC_VER_29:
	case RTL_GIGA_MAC_VER_30:
		rtl8105e_hw_phy_config(tp);
		break;
F
Francois Romieu 已提交
2975 2976 2977
	case RTL_GIGA_MAC_VER_31:
		/* None. */
		break;
H
hayeswang 已提交
2978 2979
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
H
Hayes Wang 已提交
2980 2981 2982 2983
		rtl8168e_1_hw_phy_config(tp);
		break;
	case RTL_GIGA_MAC_VER_34:
		rtl8168e_2_hw_phy_config(tp);
H
hayeswang 已提交
2984
		break;
F
Francois Romieu 已提交
2985

2986 2987 2988 2989 2990
	default:
		break;
	}
}

L
Linus Torvalds 已提交
2991 2992 2993 2994 2995 2996 2997 2998
static void rtl8169_phy_timer(unsigned long __opaque)
{
	struct net_device *dev = (struct net_device *)__opaque;
	struct rtl8169_private *tp = netdev_priv(dev);
	struct timer_list *timer = &tp->timer;
	void __iomem *ioaddr = tp->mmio_addr;
	unsigned long timeout = RTL8169_PHY_TIMEOUT;

2999
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
L
Linus Torvalds 已提交
3000 3001 3002

	spin_lock_irq(&tp->lock);

3003
	if (tp->phy_reset_pending(tp)) {
3004
		/*
L
Linus Torvalds 已提交
3005 3006 3007 3008 3009 3010 3011 3012 3013 3014
		 * A busy loop could burn quite a few cycles on nowadays CPU.
		 * Let's delay the execution of the timer for a few ticks.
		 */
		timeout = HZ/10;
		goto out_mod_timer;
	}

	if (tp->link_ok(ioaddr))
		goto out_unlock;

3015
	netif_warn(tp, link, dev, "PHY reset until link up\n");
L
Linus Torvalds 已提交
3016

3017
	tp->phy_reset_enable(tp);
L
Linus Torvalds 已提交
3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036

out_mod_timer:
	mod_timer(timer, jiffies + timeout);
out_unlock:
	spin_unlock_irq(&tp->lock);
}

#ifdef CONFIG_NET_POLL_CONTROLLER
/*
 * Polling 'interrupt' - used by things like netconsole to send skbs
 * without having to re-enable interrupts. It's not called while
 * the interrupt routine is executing.
 */
static void rtl8169_netpoll(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;

	disable_irq(pdev->irq);
3037
	rtl8169_interrupt(pdev->irq, dev);
L
Linus Torvalds 已提交
3038 3039 3040 3041 3042 3043 3044 3045 3046
	enable_irq(pdev->irq);
}
#endif

static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
				  void __iomem *ioaddr)
{
	iounmap(ioaddr);
	pci_release_regions(pdev);
3047
	pci_clear_mwi(pdev);
L
Linus Torvalds 已提交
3048 3049 3050 3051
	pci_disable_device(pdev);
	free_netdev(dev);
}

3052 3053 3054
static void rtl8169_phy_reset(struct net_device *dev,
			      struct rtl8169_private *tp)
{
F
Francois Romieu 已提交
3055
	unsigned int i;
3056

3057
	tp->phy_reset_enable(tp);
3058
	for (i = 0; i < 100; i++) {
3059
		if (!tp->phy_reset_pending(tp))
3060 3061 3062
			return;
		msleep(1);
	}
3063
	netif_err(tp, link, dev, "PHY reset failed\n");
3064 3065
}

3066 3067 3068 3069
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;

3070
	rtl_hw_phy_config(dev);
3071

3072 3073 3074 3075
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
		RTL_W8(0x82, 0x01);
	}
3076

3077 3078 3079 3080
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);

	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
3081

3082
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
3083 3084 3085
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
		RTL_W8(0x82, 0x01);
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
3086
		rtl_writephy(tp, 0x0b, 0x0000); //w 0x0b 15 0 0
3087 3088
	}

3089 3090
	rtl8169_phy_reset(dev, tp);

3091
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
F
Francois Romieu 已提交
3092 3093 3094 3095 3096
			  ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
			  ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
			  (tp->mii.supports_gmii ?
			   ADVERTISED_1000baseT_Half |
			   ADVERTISED_1000baseT_Full : 0));
3097

3098 3099
	if (RTL_R8(PHYstatus) & TBI_Enable)
		netif_info(tp, link, dev, "TBI auto-negotiating\n");
3100 3101
}

3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
{
	void __iomem *ioaddr = tp->mmio_addr;
	u32 high;
	u32 low;

	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
	high = addr[4] | (addr[5] << 8);

	spin_lock_irq(&tp->lock);

	RTL_W8(Cfg9346, Cfg9346_Unlock);
3114

3115
	RTL_W32(MAC4, high);
3116 3117
	RTL_R32(MAC4);

3118
	RTL_W32(MAC0, low);
3119 3120
	RTL_R32(MAC0);

3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140
	RTL_W8(Cfg9346, Cfg9346_Lock);

	spin_unlock_irq(&tp->lock);
}

static int rtl_set_mac_address(struct net_device *dev, void *p)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct sockaddr *addr = p;

	if (!is_valid_ether_addr(addr->sa_data))
		return -EADDRNOTAVAIL;

	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);

	rtl_rar_set(tp, dev->dev_addr);

	return 0;
}

3141 3142 3143 3144 3145
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct mii_ioctl_data *data = if_mii(ifr);

F
Francois Romieu 已提交
3146 3147
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
}
3148

F
Francois Romieu 已提交
3149 3150
static int rtl_xmii_ioctl(struct rtl8169_private *tp,
			  struct mii_ioctl_data *data, int cmd)
F
Francois Romieu 已提交
3151
{
3152 3153 3154 3155 3156 3157
	switch (cmd) {
	case SIOCGMIIPHY:
		data->phy_id = 32; /* Internal PHY */
		return 0;

	case SIOCGMIIREG:
3158
		data->val_out = rtl_readphy(tp, data->reg_num & 0x1f);
3159 3160 3161
		return 0;

	case SIOCSMIIREG:
3162
		rtl_writephy(tp, data->reg_num & 0x1f, data->val_in);
3163 3164 3165 3166 3167
		return 0;
	}
	return -EOPNOTSUPP;
}

F
Francois Romieu 已提交
3168 3169 3170 3171 3172
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
{
	return -EOPNOTSUPP;
}

3173 3174 3175 3176 3177 3178
static const struct rtl_cfg_info {
	void (*hw_start)(struct net_device *);
	unsigned int region;
	unsigned int align;
	u16 intr_event;
	u16 napi_event;
3179
	unsigned features;
3180
	u8 default_ver;
3181 3182 3183 3184
} rtl_cfg_infos [] = {
	[RTL_CFG_0] = {
		.hw_start	= rtl_hw_start_8169,
		.region		= 1,
3185
		.align		= 0,
3186 3187
		.intr_event	= SYSErr | LinkChg | RxOverflow |
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
F
Francois Romieu 已提交
3188
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
3189 3190
		.features	= RTL_FEATURE_GMII,
		.default_ver	= RTL_GIGA_MAC_VER_01,
3191 3192 3193 3194 3195
	},
	[RTL_CFG_1] = {
		.hw_start	= rtl_hw_start_8168,
		.region		= 2,
		.align		= 8,
3196
		.intr_event	= SYSErr | LinkChg | RxOverflow |
3197
				  TxErr | TxOK | RxOK | RxErr,
F
Francois Romieu 已提交
3198
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
3199 3200
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
		.default_ver	= RTL_GIGA_MAC_VER_11,
3201 3202 3203 3204 3205 3206 3207
	},
	[RTL_CFG_2] = {
		.hw_start	= rtl_hw_start_8101,
		.region		= 2,
		.align		= 8,
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
F
Francois Romieu 已提交
3208
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
3209 3210
		.features	= RTL_FEATURE_MSI,
		.default_ver	= RTL_GIGA_MAC_VER_13,
3211 3212 3213
	}
};

F
Francois Romieu 已提交
3214 3215 3216 3217 3218 3219 3220 3221
/* Cfg9346_Unlock assumed. */
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
			    const struct rtl_cfg_info *cfg)
{
	unsigned msi = 0;
	u8 cfg2;

	cfg2 = RTL_R8(Config2) & ~MSIEnable;
3222
	if (cfg->features & RTL_FEATURE_MSI) {
F
Francois Romieu 已提交
3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241
		if (pci_enable_msi(pdev)) {
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
		} else {
			cfg2 |= MSIEnable;
			msi = RTL_FEATURE_MSI;
		}
	}
	RTL_W8(Config2, cfg2);
	return msi;
}

static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
{
	if (tp->features & RTL_FEATURE_MSI) {
		pci_disable_msi(pdev);
		tp->features &= ~RTL_FEATURE_MSI;
	}
}

F
Francois Romieu 已提交
3242 3243 3244 3245
static const struct net_device_ops rtl8169_netdev_ops = {
	.ndo_open		= rtl8169_open,
	.ndo_stop		= rtl8169_close,
	.ndo_get_stats		= rtl8169_get_stats,
3246
	.ndo_start_xmit		= rtl8169_start_xmit,
F
Francois Romieu 已提交
3247 3248 3249
	.ndo_tx_timeout		= rtl8169_tx_timeout,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_change_mtu		= rtl8169_change_mtu,
3250 3251
	.ndo_fix_features	= rtl8169_fix_features,
	.ndo_set_features	= rtl8169_set_features,
F
Francois Romieu 已提交
3252 3253 3254 3255 3256 3257 3258 3259 3260
	.ndo_set_mac_address	= rtl_set_mac_address,
	.ndo_do_ioctl		= rtl8169_ioctl,
	.ndo_set_multicast_list	= rtl_set_rx_mode,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= rtl8169_netpoll,
#endif

};

3261 3262 3263 3264 3265 3266 3267 3268 3269
static void __devinit rtl_init_mdio_ops(struct rtl8169_private *tp)
{
	struct mdio_ops *ops = &tp->mdio_ops;

	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
		ops->write	= r8168dp_1_mdio_write;
		ops->read	= r8168dp_1_mdio_read;
		break;
F
françois romieu 已提交
3270
	case RTL_GIGA_MAC_VER_28:
3271
	case RTL_GIGA_MAC_VER_31:
F
françois romieu 已提交
3272 3273 3274
		ops->write	= r8168dp_2_mdio_write;
		ops->read	= r8168dp_2_mdio_read;
		break;
3275 3276 3277 3278 3279 3280 3281
	default:
		ops->write	= r8169_mdio_write;
		ops->read	= r8169_mdio_read;
		break;
	}
}

F
françois romieu 已提交
3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312
static void r810x_phy_power_down(struct rtl8169_private *tp)
{
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
}

static void r810x_phy_power_up(struct rtl8169_private *tp)
{
	rtl_writephy(tp, 0x1f, 0x0000);
	rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE);
}

static void r810x_pll_power_down(struct rtl8169_private *tp)
{
	if (__rtl8169_get_wol(tp) & WAKE_ANY) {
		rtl_writephy(tp, 0x1f, 0x0000);
		rtl_writephy(tp, MII_BMCR, 0x0000);
		return;
	}

	r810x_phy_power_down(tp);
}

static void r810x_pll_power_up(struct rtl8169_private *tp)
{
	r810x_phy_power_up(tp);
}

static void r8168_phy_power_up(struct rtl8169_private *tp)
{
	rtl_writephy(tp, 0x1f, 0x0000);
H
hayeswang 已提交
3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_11:
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
	case RTL_GIGA_MAC_VER_18:
	case RTL_GIGA_MAC_VER_19:
	case RTL_GIGA_MAC_VER_20:
	case RTL_GIGA_MAC_VER_21:
	case RTL_GIGA_MAC_VER_22:
	case RTL_GIGA_MAC_VER_23:
	case RTL_GIGA_MAC_VER_24:
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		rtl_writephy(tp, 0x0e, 0x0000);
		break;
	default:
		break;
	}
F
françois romieu 已提交
3334 3335 3336 3337 3338 3339
	rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE);
}

static void r8168_phy_power_down(struct rtl8169_private *tp)
{
	rtl_writephy(tp, 0x1f, 0x0000);
H
hayeswang 已提交
3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
		rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
		break;

	case RTL_GIGA_MAC_VER_11:
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
	case RTL_GIGA_MAC_VER_18:
	case RTL_GIGA_MAC_VER_19:
	case RTL_GIGA_MAC_VER_20:
	case RTL_GIGA_MAC_VER_21:
	case RTL_GIGA_MAC_VER_22:
	case RTL_GIGA_MAC_VER_23:
	case RTL_GIGA_MAC_VER_24:
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		rtl_writephy(tp, 0x0e, 0x0200);
	default:
		rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
		break;
	}
F
françois romieu 已提交
3366 3367 3368 3369 3370 3371
}

static void r8168_pll_power_down(struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;

F
Francois Romieu 已提交
3372 3373 3374
	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
	     tp->mac_version == RTL_GIGA_MAC_VER_31) &&
3375
	    r8168dp_check_dash(tp)) {
F
françois romieu 已提交
3376
		return;
3377
	}
F
françois romieu 已提交
3378

F
Francois Romieu 已提交
3379 3380
	if ((tp->mac_version == RTL_GIGA_MAC_VER_23 ||
	     tp->mac_version == RTL_GIGA_MAC_VER_24) &&
F
françois romieu 已提交
3381 3382 3383 3384
	    (RTL_R16(CPlusCmd) & ASF)) {
		return;
	}

H
hayeswang 已提交
3385 3386 3387 3388
	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_33)
		rtl_ephy_write(ioaddr, 0x19, 0xff64);

F
françois romieu 已提交
3389 3390 3391 3392
	if (__rtl8169_get_wol(tp) & WAKE_ANY) {
		rtl_writephy(tp, 0x1f, 0x0000);
		rtl_writephy(tp, MII_BMCR, 0x0000);

3393 3394 3395 3396
		if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
		    tp->mac_version == RTL_GIGA_MAC_VER_33)
			RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast |
				AcceptMulticast | AcceptMyPhys);
F
françois romieu 已提交
3397 3398 3399 3400 3401 3402 3403 3404
		return;
	}

	r8168_phy_power_down(tp);

	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
3405 3406
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
3407
	case RTL_GIGA_MAC_VER_31:
H
hayeswang 已提交
3408 3409
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
F
françois romieu 已提交
3410 3411 3412 3413 3414 3415 3416 3417 3418
		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
		break;
	}
}

static void r8168_pll_power_up(struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;

F
Francois Romieu 已提交
3419 3420 3421
	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
	     tp->mac_version == RTL_GIGA_MAC_VER_31) &&
3422
	    r8168dp_check_dash(tp)) {
F
françois romieu 已提交
3423
		return;
3424
	}
F
françois romieu 已提交
3425 3426 3427 3428

	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
3429 3430
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
3431
	case RTL_GIGA_MAC_VER_31:
H
hayeswang 已提交
3432 3433
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
F
françois romieu 已提交
3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467
		RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
		break;
	}

	r8168_phy_power_up(tp);
}

static void rtl_pll_power_op(struct rtl8169_private *tp,
			     void (*op)(struct rtl8169_private *))
{
	if (op)
		op(tp);
}

static void rtl_pll_power_down(struct rtl8169_private *tp)
{
	rtl_pll_power_op(tp, tp->pll_power_ops.down);
}

static void rtl_pll_power_up(struct rtl8169_private *tp)
{
	rtl_pll_power_op(tp, tp->pll_power_ops.up);
}

static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
{
	struct pll_power_ops *ops = &tp->pll_power_ops;

	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_07:
	case RTL_GIGA_MAC_VER_08:
	case RTL_GIGA_MAC_VER_09:
	case RTL_GIGA_MAC_VER_10:
	case RTL_GIGA_MAC_VER_16:
3468 3469
	case RTL_GIGA_MAC_VER_29:
	case RTL_GIGA_MAC_VER_30:
F
françois romieu 已提交
3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486
		ops->down	= r810x_pll_power_down;
		ops->up		= r810x_pll_power_up;
		break;

	case RTL_GIGA_MAC_VER_11:
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
	case RTL_GIGA_MAC_VER_18:
	case RTL_GIGA_MAC_VER_19:
	case RTL_GIGA_MAC_VER_20:
	case RTL_GIGA_MAC_VER_21:
	case RTL_GIGA_MAC_VER_22:
	case RTL_GIGA_MAC_VER_23:
	case RTL_GIGA_MAC_VER_24:
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_27:
F
françois romieu 已提交
3487
	case RTL_GIGA_MAC_VER_28:
3488
	case RTL_GIGA_MAC_VER_31:
H
hayeswang 已提交
3489 3490
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
H
Hayes Wang 已提交
3491
	case RTL_GIGA_MAC_VER_34:
F
françois romieu 已提交
3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502
		ops->down	= r8168_pll_power_down;
		ops->up		= r8168_pll_power_up;
		break;

	default:
		ops->down	= NULL;
		ops->up		= NULL;
		break;
	}
}

3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538
static void rtl_init_rxcfg(struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;

	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_01:
	case RTL_GIGA_MAC_VER_02:
	case RTL_GIGA_MAC_VER_03:
	case RTL_GIGA_MAC_VER_04:
	case RTL_GIGA_MAC_VER_05:
	case RTL_GIGA_MAC_VER_06:
	case RTL_GIGA_MAC_VER_10:
	case RTL_GIGA_MAC_VER_11:
	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_13:
	case RTL_GIGA_MAC_VER_14:
	case RTL_GIGA_MAC_VER_15:
	case RTL_GIGA_MAC_VER_16:
	case RTL_GIGA_MAC_VER_17:
		RTL_W32(RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
		break;
	case RTL_GIGA_MAC_VER_18:
	case RTL_GIGA_MAC_VER_19:
	case RTL_GIGA_MAC_VER_20:
	case RTL_GIGA_MAC_VER_21:
	case RTL_GIGA_MAC_VER_22:
	case RTL_GIGA_MAC_VER_23:
	case RTL_GIGA_MAC_VER_24:
		RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
		break;
	default:
		RTL_W32(RxConfig, RX128_INT_EN | RX_DMA_BURST);
		break;
	}
}

3539 3540 3541 3542 3543
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
{
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
}

3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555
static void rtl_hw_reset(struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;
	int i;

	/* Soft reset the chip. */
	RTL_W8(ChipCmd, CmdReset);

	/* Check that the chip has finished the reset. */
	for (i = 0; i < 100; i++) {
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
			break;
3556
		udelay(100);
3557
	}
3558 3559

	rtl8169_init_ring_indexes(tp);
3560 3561
}

L
Linus Torvalds 已提交
3562
static int __devinit
3563
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
L
Linus Torvalds 已提交
3564
{
3565 3566
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
	const unsigned int region = cfg->region;
L
Linus Torvalds 已提交
3567
	struct rtl8169_private *tp;
3568
	struct mii_if_info *mii;
3569 3570
	struct net_device *dev;
	void __iomem *ioaddr;
F
Francois Romieu 已提交
3571
	int chipset, i;
F
Francois Romieu 已提交
3572
	int rc;
L
Linus Torvalds 已提交
3573

3574 3575 3576 3577
	if (netif_msg_drv(&debug)) {
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
		       MODULENAME, RTL8169_VERSION);
	}
L
Linus Torvalds 已提交
3578 3579

	dev = alloc_etherdev(sizeof (*tp));
3580
	if (!dev) {
3581
		if (netif_msg_drv(&debug))
3582
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
3583 3584
		rc = -ENOMEM;
		goto out;
L
Linus Torvalds 已提交
3585 3586 3587
	}

	SET_NETDEV_DEV(dev, &pdev->dev);
F
Francois Romieu 已提交
3588
	dev->netdev_ops = &rtl8169_netdev_ops;
L
Linus Torvalds 已提交
3589
	tp = netdev_priv(dev);
D
David Howells 已提交
3590
	tp->dev = dev;
3591
	tp->pci_dev = pdev;
3592
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
L
Linus Torvalds 已提交
3593

3594 3595 3596 3597 3598 3599 3600 3601
	mii = &tp->mii;
	mii->dev = dev;
	mii->mdio_read = rtl_mdio_read;
	mii->mdio_write = rtl_mdio_write;
	mii->phy_id_mask = 0x1f;
	mii->reg_num_mask = 0x1f;
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);

S
Stanislaw Gruszka 已提交
3602 3603 3604 3605 3606
	/* disable ASPM completely as that cause random device stop working
	 * problems as well as full system hangs for some PCIe devices users */
	pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
				     PCIE_LINK_STATE_CLKPM);

L
Linus Torvalds 已提交
3607 3608
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
	rc = pci_enable_device(pdev);
3609
	if (rc < 0) {
3610
		netif_err(tp, probe, dev, "enable failure\n");
3611
		goto err_out_free_dev_1;
L
Linus Torvalds 已提交
3612 3613
	}

3614 3615
	if (pci_set_mwi(pdev) < 0)
		netif_info(tp, probe, dev, "Mem-Wr-Inval unavailable\n");
L
Linus Torvalds 已提交
3616 3617

	/* make sure PCI base addr 1 is MMIO */
3618
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
3619 3620 3621
		netif_err(tp, probe, dev,
			  "region #%d not an MMIO resource, aborting\n",
			  region);
L
Linus Torvalds 已提交
3622
		rc = -ENODEV;
3623
		goto err_out_mwi_2;
L
Linus Torvalds 已提交
3624
	}
3625

L
Linus Torvalds 已提交
3626
	/* check for weird/broken PCI region reporting */
3627
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
3628 3629
		netif_err(tp, probe, dev,
			  "Invalid PCI region size(s), aborting\n");
L
Linus Torvalds 已提交
3630
		rc = -ENODEV;
3631
		goto err_out_mwi_2;
L
Linus Torvalds 已提交
3632 3633 3634
	}

	rc = pci_request_regions(pdev, MODULENAME);
3635
	if (rc < 0) {
3636
		netif_err(tp, probe, dev, "could not request regions\n");
3637
		goto err_out_mwi_2;
L
Linus Torvalds 已提交
3638 3639
	}

3640
	tp->cp_cmd = RxChkSum;
L
Linus Torvalds 已提交
3641 3642

	if ((sizeof(dma_addr_t) > 4) &&
3643
	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
L
Linus Torvalds 已提交
3644 3645 3646
		tp->cp_cmd |= PCIDAC;
		dev->features |= NETIF_F_HIGHDMA;
	} else {
3647
		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
L
Linus Torvalds 已提交
3648
		if (rc < 0) {
3649
			netif_err(tp, probe, dev, "DMA configuration failed\n");
3650
			goto err_out_free_res_3;
L
Linus Torvalds 已提交
3651 3652 3653 3654
		}
	}

	/* ioremap MMIO region */
3655
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
3656
	if (!ioaddr) {
3657
		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
L
Linus Torvalds 已提交
3658
		rc = -EIO;
3659
		goto err_out_free_res_3;
L
Linus Torvalds 已提交
3660
	}
3661
	tp->mmio_addr = ioaddr;
L
Linus Torvalds 已提交
3662

3663 3664
	if (!pci_is_pcie(pdev))
		netif_info(tp, probe, dev, "not PCI Express\n");
3665

3666 3667 3668 3669 3670
	/* Identify chip attached to board */
	rtl8169_get_mac_version(tp, dev, cfg->default_ver);

	rtl_init_rxcfg(tp);

3671
	RTL_W16(IntrMask, 0x0000);
L
Linus Torvalds 已提交
3672

3673
	rtl_hw_reset(tp);
L
Linus Torvalds 已提交
3674

3675 3676
	RTL_W16(IntrStatus, 0xffff);

3677 3678
	pci_set_master(pdev);

3679 3680 3681 3682 3683 3684 3685
	/*
	 * Pretend we are using VLANs; This bypasses a nasty bug where
	 * Interrupts stop flowing on high load on 8110SCd controllers.
	 */
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
		tp->cp_cmd |= RxVlan;

3686
	rtl_init_mdio_ops(tp);
F
françois romieu 已提交
3687
	rtl_init_pll_power_ops(tp);
3688

L
Linus Torvalds 已提交
3689 3690
	rtl8169_print_mac_version(tp);

3691 3692
	chipset = tp->mac_version;
	tp->txd_version = rtl_chip_infos[chipset].txd_version;
L
Linus Torvalds 已提交
3693

3694 3695 3696
	RTL_W8(Cfg9346, Cfg9346_Unlock);
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
B
Bruno Prémont 已提交
3697 3698 3699 3700
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
		tp->features |= RTL_FEATURE_WOL;
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
		tp->features |= RTL_FEATURE_WOL;
F
Francois Romieu 已提交
3701
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
3702 3703
	RTL_W8(Cfg9346, Cfg9346_Lock);

3704 3705
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
L
Linus Torvalds 已提交
3706 3707 3708 3709 3710
		tp->set_speed = rtl8169_set_speed_tbi;
		tp->get_settings = rtl8169_gset_tbi;
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
		tp->link_ok = rtl8169_tbi_link_ok;
F
Francois Romieu 已提交
3711
		tp->do_ioctl = rtl_tbi_ioctl;
L
Linus Torvalds 已提交
3712 3713 3714 3715 3716 3717
	} else {
		tp->set_speed = rtl8169_set_speed_xmii;
		tp->get_settings = rtl8169_gset_xmii;
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
		tp->link_ok = rtl8169_xmii_link_ok;
F
Francois Romieu 已提交
3718
		tp->do_ioctl = rtl_xmii_ioctl;
L
Linus Torvalds 已提交
3719 3720
	}

F
Francois Romieu 已提交
3721 3722
	spin_lock_init(&tp->lock);

3723
	/* Get MAC address */
L
Linus Torvalds 已提交
3724 3725
	for (i = 0; i < MAC_ADDR_LEN; i++)
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
3726
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
L
Linus Torvalds 已提交
3727 3728 3729 3730 3731 3732

	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
	dev->irq = pdev->irq;
	dev->base_addr = (unsigned long) ioaddr;

3733
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
L
Linus Torvalds 已提交
3734

3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747
	/* don't enable SG, IP_CSUM and TSO by default - it might not work
	 * properly for all devices */
	dev->features |= NETIF_F_RXCSUM |
		NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;

	dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
		NETIF_F_RXCSUM | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
	dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
		NETIF_F_HIGHDMA;

	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
		/* 8110SCd requires hardware Rx VLAN - disallow toggling */
		dev->hw_features &= ~NETIF_F_HW_VLAN_RX;
L
Linus Torvalds 已提交
3748 3749

	tp->intr_mask = 0xffff;
3750 3751 3752
	tp->hw_start = cfg->hw_start;
	tp->intr_event = cfg->intr_event;
	tp->napi_event = cfg->napi_event;
L
Linus Torvalds 已提交
3753

3754 3755 3756 3757
	init_timer(&tp->timer);
	tp->timer.data = (unsigned long) dev;
	tp->timer.function = rtl8169_phy_timer;

3758
	tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
3759

L
Linus Torvalds 已提交
3760
	rc = register_netdev(dev);
3761
	if (rc < 0)
3762
		goto err_out_msi_4;
L
Linus Torvalds 已提交
3763 3764 3765

	pci_set_drvdata(pdev, dev);

3766
	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
3767
		   rtl_chip_infos[chipset].name, dev->base_addr, dev->dev_addr,
3768
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
L
Linus Torvalds 已提交
3769

F
Francois Romieu 已提交
3770 3771 3772
	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
F
françois romieu 已提交
3773
		rtl8168_driver_start(tp);
F
françois romieu 已提交
3774
	}
F
françois romieu 已提交
3775

B
Bruno Prémont 已提交
3776
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
L
Linus Torvalds 已提交
3777

3778 3779
	if (pci_dev_run_wake(pdev))
		pm_runtime_put_noidle(&pdev->dev);
3780

3781 3782
	netif_carrier_off(dev);

3783 3784
out:
	return rc;
L
Linus Torvalds 已提交
3785

3786
err_out_msi_4:
F
Francois Romieu 已提交
3787
	rtl_disable_msi(pdev, tp);
3788
	iounmap(ioaddr);
3789
err_out_free_res_3:
3790
	pci_release_regions(pdev);
3791
err_out_mwi_2:
3792 3793 3794 3795 3796
	pci_clear_mwi(pdev);
	pci_disable_device(pdev);
err_out_free_dev_1:
	free_netdev(dev);
	goto out;
L
Linus Torvalds 已提交
3797 3798
}

F
Francois Romieu 已提交
3799
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
L
Linus Torvalds 已提交
3800 3801 3802 3803
{
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rtl8169_private *tp = netdev_priv(dev);

F
Francois Romieu 已提交
3804 3805 3806
	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
F
françois romieu 已提交
3807
		rtl8168_driver_stop(tp);
F
françois romieu 已提交
3808
	}
F
françois romieu 已提交
3809

3810
	cancel_delayed_work_sync(&tp->task);
3811

L
Linus Torvalds 已提交
3812
	unregister_netdev(dev);
3813

3814 3815
	rtl_release_firmware(tp);

3816 3817
	if (pci_dev_run_wake(pdev))
		pm_runtime_get_noresume(&pdev->dev);
3818

3819 3820 3821
	/* restore original MAC address */
	rtl_rar_set(tp, dev->perm_addr);

F
Francois Romieu 已提交
3822
	rtl_disable_msi(pdev, tp);
L
Linus Torvalds 已提交
3823 3824 3825 3826
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
	pci_set_drvdata(pdev, NULL);
}

3827
static void rtl_request_uncached_firmware(struct rtl8169_private *tp)
3828
{
3829 3830 3831
	struct rtl_fw *rtl_fw;
	const char *name;
	int rc = -ENOMEM;
3832

3833 3834 3835
	name = rtl_lookup_firmware_name(tp);
	if (!name)
		goto out_no_firmware;
3836

3837 3838 3839
	rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
	if (!rtl_fw)
		goto err_warn;
3840

3841 3842 3843 3844
	rc = request_firmware(&rtl_fw->fw, name, &tp->pci_dev->dev);
	if (rc < 0)
		goto err_free;

3845 3846 3847 3848
	rc = rtl_check_firmware(tp, rtl_fw);
	if (rc < 0)
		goto err_release_firmware;

3849 3850 3851 3852
	tp->rtl_fw = rtl_fw;
out:
	return;

3853 3854
err_release_firmware:
	release_firmware(rtl_fw->fw);
3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868
err_free:
	kfree(rtl_fw);
err_warn:
	netif_warn(tp, ifup, tp->dev, "unable to load firmware patch %s (%d)\n",
		   name, rc);
out_no_firmware:
	tp->rtl_fw = NULL;
	goto out;
}

static void rtl_request_firmware(struct rtl8169_private *tp)
{
	if (IS_ERR(tp->rtl_fw))
		rtl_request_uncached_firmware(tp);
3869 3870
}

L
Linus Torvalds 已提交
3871 3872 3873
static int rtl8169_open(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
3874
	void __iomem *ioaddr = tp->mmio_addr;
L
Linus Torvalds 已提交
3875
	struct pci_dev *pdev = tp->pci_dev;
3876
	int retval = -ENOMEM;
L
Linus Torvalds 已提交
3877

3878
	pm_runtime_get_sync(&pdev->dev);
L
Linus Torvalds 已提交
3879 3880 3881

	/*
	 * Rx and Tx desscriptors needs 256 bytes alignment.
3882
	 * dma_alloc_coherent provides more.
L
Linus Torvalds 已提交
3883
	 */
3884 3885
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
					     &tp->TxPhyAddr, GFP_KERNEL);
L
Linus Torvalds 已提交
3886
	if (!tp->TxDescArray)
3887
		goto err_pm_runtime_put;
L
Linus Torvalds 已提交
3888

3889 3890
	tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
					     &tp->RxPhyAddr, GFP_KERNEL);
L
Linus Torvalds 已提交
3891
	if (!tp->RxDescArray)
3892
		goto err_free_tx_0;
L
Linus Torvalds 已提交
3893 3894 3895

	retval = rtl8169_init_ring(dev);
	if (retval < 0)
3896
		goto err_free_rx_1;
L
Linus Torvalds 已提交
3897

D
David Howells 已提交
3898
	INIT_DELAYED_WORK(&tp->task, NULL);
L
Linus Torvalds 已提交
3899

3900 3901
	smp_mb();

3902 3903
	rtl_request_firmware(tp);

F
Francois Romieu 已提交
3904 3905
	retval = request_irq(dev->irq, rtl8169_interrupt,
			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
3906 3907
			     dev->name, dev);
	if (retval < 0)
3908
		goto err_release_fw_2;
3909

3910 3911
	napi_enable(&tp->napi);

3912 3913
	rtl8169_init_phy(dev, tp);

3914
	rtl8169_set_features(dev, dev->features);
3915

F
françois romieu 已提交
3916 3917
	rtl_pll_power_up(tp);

3918
	rtl_hw_start(dev);
L
Linus Torvalds 已提交
3919

3920 3921 3922
	tp->saved_wolopts = 0;
	pm_runtime_put_noidle(&pdev->dev);

3923
	rtl8169_check_link_status(dev, tp, ioaddr);
L
Linus Torvalds 已提交
3924 3925 3926
out:
	return retval;

3927 3928
err_release_fw_2:
	rtl_release_firmware(tp);
3929 3930
	rtl8169_rx_clear(tp);
err_free_rx_1:
3931 3932
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
			  tp->RxPhyAddr);
3933
	tp->RxDescArray = NULL;
3934
err_free_tx_0:
3935 3936
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
			  tp->TxPhyAddr);
3937 3938 3939
	tp->TxDescArray = NULL;
err_pm_runtime_put:
	pm_runtime_put_noidle(&pdev->dev);
L
Linus Torvalds 已提交
3940 3941 3942
	goto out;
}

3943 3944 3945 3946 3947 3948 3949 3950 3951 3952
static void rtl_rx_close(struct rtl8169_private *tp)
{
	void __iomem *ioaddr = tp->mmio_addr;
	u32 rxcfg = RTL_R32(RxConfig);

	rxcfg &= ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast |
		   AcceptMyPhys | AcceptAllPhys);
	RTL_W32(RxConfig, rxcfg);
}

F
françois romieu 已提交
3953
static void rtl8169_hw_reset(struct rtl8169_private *tp)
L
Linus Torvalds 已提交
3954
{
F
françois romieu 已提交
3955 3956
	void __iomem *ioaddr = tp->mmio_addr;

L
Linus Torvalds 已提交
3957 3958 3959
	/* Disable interrupts */
	rtl8169_irq_mask_and_ack(ioaddr);

3960 3961
	rtl_rx_close(tp);

3962
	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
3963 3964
	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
F
françois romieu 已提交
3965 3966
		while (RTL_R8(TxPoll) & NPQ)
			udelay(20);
H
Hayes Wang 已提交
3967 3968 3969
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
		while (!(RTL_R32(TxConfig) & TXCFG_EMPTY))
			udelay(100);
3970 3971 3972
	} else {
		RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
		udelay(100);
F
françois romieu 已提交
3973 3974
	}

3975
	rtl_hw_reset(tp);
L
Linus Torvalds 已提交
3976 3977
}

3978
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
3979 3980 3981 3982 3983 3984 3985 3986
{
	void __iomem *ioaddr = tp->mmio_addr;

	/* Set DMA burst size and Interframe Gap Time */
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
		(InterFrameGap << TxInterFrameGapShift));
}

3987
static void rtl_hw_start(struct net_device *dev)
L
Linus Torvalds 已提交
3988 3989 3990
{
	struct rtl8169_private *tp = netdev_priv(dev);

3991 3992 3993 3994 3995
	tp->hw_start(dev);

	netif_start_queue(dev);
}

3996 3997 3998 3999 4000 4001 4002 4003 4004
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
					 void __iomem *ioaddr)
{
	/*
	 * 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.
	 */
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
4005
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
4006
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
4007
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018
}

static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
{
	u16 cmd;

	cmd = RTL_R16(CPlusCmd);
	RTL_W16(CPlusCmd, cmd);
	return cmd;
}

4019
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
4020 4021
{
	/* Low hurts. Let's disable the filtering. */
4022
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
4023 4024
}

4025 4026
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
{
4027
	static const struct rtl_cfg2_info {
4028 4029 4030 4031 4032 4033 4034 4035
		u32 mac_version;
		u32 clk;
		u32 val;
	} cfg2_info [] = {
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
4036 4037
	};
	const struct rtl_cfg2_info *p = cfg2_info;
4038 4039 4040 4041
	unsigned int i;
	u32 clk;

	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
4042
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
4043 4044 4045 4046 4047 4048 4049
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
			RTL_W32(0x7c, p->val);
			break;
		}
	}
}

4050 4051 4052 4053 4054 4055
static void rtl_hw_start_8169(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	struct pci_dev *pdev = tp->pci_dev;

4056 4057 4058 4059 4060
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
	}

L
Linus Torvalds 已提交
4061
	RTL_W8(Cfg9346, Cfg9346_Unlock);
F
Francois Romieu 已提交
4062 4063 4064 4065
	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_04)
4066 4067
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);

4068 4069
	rtl_init_rxcfg(tp);

4070
	RTL_W8(EarlyTxThres, NoEarlyTx);
L
Linus Torvalds 已提交
4071

E
Eric Dumazet 已提交
4072
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
L
Linus Torvalds 已提交
4073

F
Francois Romieu 已提交
4074 4075 4076 4077
	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_04)
4078
		rtl_set_rx_tx_config_registers(tp);
L
Linus Torvalds 已提交
4079

4080
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
L
Linus Torvalds 已提交
4081

F
Francois Romieu 已提交
4082 4083
	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
4084
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
L
Linus Torvalds 已提交
4085
			"Bit-3 and bit-14 MUST be 1\n");
4086
		tp->cp_cmd |= (1 << 14);
L
Linus Torvalds 已提交
4087 4088
	}

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

4091 4092
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);

L
Linus Torvalds 已提交
4093 4094 4095 4096 4097 4098
	/*
	 * Undocumented corner. Supposedly:
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
	 */
	RTL_W16(IntrMitigate, 0x0000);

4099
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
4100

F
Francois Romieu 已提交
4101 4102 4103 4104
	if (tp->mac_version != RTL_GIGA_MAC_VER_01 &&
	    tp->mac_version != RTL_GIGA_MAC_VER_02 &&
	    tp->mac_version != RTL_GIGA_MAC_VER_03 &&
	    tp->mac_version != RTL_GIGA_MAC_VER_04) {
4105 4106 4107 4108
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
		rtl_set_rx_tx_config_registers(tp);
	}

L
Linus Torvalds 已提交
4109
	RTL_W8(Cfg9346, Cfg9346_Lock);
F
Francois Romieu 已提交
4110 4111 4112

	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
	RTL_R8(IntrMask);
L
Linus Torvalds 已提交
4113 4114 4115

	RTL_W32(RxMissed, 0);

4116
	rtl_set_rx_mode(dev);
L
Linus Torvalds 已提交
4117 4118 4119

	/* no early-rx interrupts */
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
4120 4121

	/* Enable all known interrupts by setting the interrupt mask. */
4122
	RTL_W16(IntrMask, tp->intr_event);
4123
}
L
Linus Torvalds 已提交
4124

4125
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
4126
{
4127
	int cap = pci_pcie_cap(pdev);
4128 4129 4130

	if (cap) {
		u16 ctl;
4131

4132 4133 4134 4135
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
	}
4136 4137
}

4138
static void rtl_csi_access_enable(void __iomem *ioaddr, u32 bits)
4139 4140 4141 4142
{
	u32 csi;

	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
4143 4144 4145
	rtl_csi_write(ioaddr, 0x070c, csi | bits);
}

F
françois romieu 已提交
4146 4147 4148 4149 4150
static void rtl_csi_access_enable_1(void __iomem *ioaddr)
{
	rtl_csi_access_enable(ioaddr, 0x17000000);
}

4151 4152 4153
static void rtl_csi_access_enable_2(void __iomem *ioaddr)
{
	rtl_csi_access_enable(ioaddr, 0x27000000);
4154 4155 4156 4157 4158 4159 4160 4161
}

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

4162
static void rtl_ephy_init(void __iomem *ioaddr, const struct ephy_info *e, int len)
4163 4164 4165 4166 4167 4168 4169 4170 4171 4172
{
	u16 w;

	while (len-- > 0) {
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
		rtl_ephy_write(ioaddr, e->offset, w);
		e++;
	}
}

4173 4174
static void rtl_disable_clock_request(struct pci_dev *pdev)
{
4175
	int cap = pci_pcie_cap(pdev);
4176 4177 4178 4179 4180 4181 4182 4183 4184 4185

	if (cap) {
		u16 ctl;

		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
	}
}

F
françois romieu 已提交
4186 4187
static void rtl_enable_clock_request(struct pci_dev *pdev)
{
4188
	int cap = pci_pcie_cap(pdev);
F
françois romieu 已提交
4189 4190 4191 4192 4193 4194 4195 4196 4197 4198

	if (cap) {
		u16 ctl;

		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
		ctl |= PCI_EXP_LNKCTL_CLKREQ_EN;
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
	}
}

4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209
#define R8168_CPCMD_QUIRK_MASK (\
	EnableBist | \
	Mac_dbgo_oe | \
	Force_half_dup | \
	Force_rxflow_en | \
	Force_txflow_en | \
	Cxpl_dbg_sel | \
	ASF | \
	PktCntrDisable | \
	Mac_dbgo_sel)

4210 4211
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
{
4212 4213 4214 4215
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);

	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);

4216 4217
	rtl_tx_performance_tweak(pdev,
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
4218 4219 4220 4221 4222
}

static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
{
	rtl_hw_start_8168bb(ioaddr, pdev);
4223

4224
	RTL_W8(MaxTxPacketSize, TxPacketMax);
4225 4226

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

static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
{
4231 4232 4233 4234
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);

	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);

4235
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
4236 4237 4238 4239

	rtl_disable_clock_request(pdev);

	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
4240 4241
}

F
Francois Romieu 已提交
4242
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
4243
{
4244
	static const struct ephy_info e_info_8168cp[] = {
4245 4246 4247 4248 4249 4250 4251
		{ 0x01, 0,	0x0001 },
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0042 },
		{ 0x06, 0x0080,	0x0000 },
		{ 0x07, 0,	0x2000 }
	};

4252
	rtl_csi_access_enable_2(ioaddr);
4253 4254 4255

	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));

4256 4257 4258
	__rtl_hw_start_8168cp(ioaddr, pdev);
}

F
Francois Romieu 已提交
4259 4260
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
{
4261
	rtl_csi_access_enable_2(ioaddr);
F
Francois Romieu 已提交
4262 4263 4264 4265 4266 4267 4268 4269

	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
}

4270 4271
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
{
4272
	rtl_csi_access_enable_2(ioaddr);
4273 4274 4275 4276 4277 4278

	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);

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

4279
	RTL_W8(MaxTxPacketSize, TxPacketMax);
4280 4281 4282 4283 4284 4285

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
}

4286 4287
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
{
4288
	static const struct ephy_info e_info_8168c_1[] = {
4289 4290 4291 4292 4293
		{ 0x02, 0x0800,	0x1000 },
		{ 0x03, 0,	0x0002 },
		{ 0x06, 0x0080,	0x0000 }
	};

4294
	rtl_csi_access_enable_2(ioaddr);
4295 4296 4297 4298 4299

	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);

	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));

4300 4301 4302 4303 4304
	__rtl_hw_start_8168cp(ioaddr, pdev);
}

static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
{
4305
	static const struct ephy_info e_info_8168c_2[] = {
4306 4307 4308 4309
		{ 0x01, 0,	0x0001 },
		{ 0x03, 0x0400,	0x0220 }
	};

4310
	rtl_csi_access_enable_2(ioaddr);
4311 4312 4313

	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));

4314 4315 4316
	__rtl_hw_start_8168cp(ioaddr, pdev);
}

F
Francois Romieu 已提交
4317 4318 4319 4320 4321
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
{
	rtl_hw_start_8168c_2(ioaddr, pdev);
}

4322 4323
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
{
4324
	rtl_csi_access_enable_2(ioaddr);
4325 4326 4327 4328

	__rtl_hw_start_8168cp(ioaddr, pdev);
}

F
Francois Romieu 已提交
4329 4330
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
{
4331
	rtl_csi_access_enable_2(ioaddr);
F
Francois Romieu 已提交
4332 4333 4334

	rtl_disable_clock_request(pdev);

4335
	RTL_W8(MaxTxPacketSize, TxPacketMax);
F
Francois Romieu 已提交
4336 4337 4338 4339 4340 4341

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
}

4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352
static void rtl_hw_start_8168dp(void __iomem *ioaddr, struct pci_dev *pdev)
{
	rtl_csi_access_enable_1(ioaddr);

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W8(MaxTxPacketSize, TxPacketMax);

	rtl_disable_clock_request(pdev);
}

F
françois romieu 已提交
4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378
static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev)
{
	static const struct ephy_info e_info_8168d_4[] = {
		{ 0x0b, ~0,	0x48 },
		{ 0x19, 0x20,	0x50 },
		{ 0x0c, ~0,	0x20 }
	};
	int i;

	rtl_csi_access_enable_1(ioaddr);

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W8(MaxTxPacketSize, TxPacketMax);

	for (i = 0; i < ARRAY_SIZE(e_info_8168d_4); i++) {
		const struct ephy_info *e = e_info_8168d_4 + i;
		u16 w;

		w = rtl_ephy_read(ioaddr, e->offset);
		rtl_ephy_write(ioaddr, 0x03, (w & e->mask) | e->bits);
	}

	rtl_enable_clock_request(pdev);
}

H
Hayes Wang 已提交
4379
static void rtl_hw_start_8168e_1(void __iomem *ioaddr, struct pci_dev *pdev)
H
hayeswang 已提交
4380
{
H
Hayes Wang 已提交
4381
	static const struct ephy_info e_info_8168e_1[] = {
H
hayeswang 已提交
4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398
		{ 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 }
	};

	rtl_csi_access_enable_2(ioaddr);

H
Hayes Wang 已提交
4399
	rtl_ephy_init(ioaddr, e_info_8168e_1, ARRAY_SIZE(e_info_8168e_1));
H
hayeswang 已提交
4400 4401 4402 4403 4404 4405 4406 4407

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W8(MaxTxPacketSize, TxPacketMax);

	rtl_disable_clock_request(pdev);

	/* Reset tx FIFO pointer */
F
Francois Romieu 已提交
4408 4409
	RTL_W32(MISC, RTL_R32(MISC) | TXPLA_RST);
	RTL_W32(MISC, RTL_R32(MISC) & ~TXPLA_RST);
H
hayeswang 已提交
4410

F
Francois Romieu 已提交
4411
	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
H
hayeswang 已提交
4412 4413
}

H
Hayes Wang 已提交
4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451
static void rtl_hw_start_8168e_2(void __iomem *ioaddr, struct pci_dev *pdev)
{
	static const struct ephy_info e_info_8168e_2[] = {
		{ 0x09, 0x0000,	0x0080 },
		{ 0x19, 0x0000,	0x0224 }
	};

	rtl_csi_access_enable_1(ioaddr);

	rtl_ephy_init(ioaddr, e_info_8168e_2, ARRAY_SIZE(e_info_8168e_2));

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	rtl_eri_write(ioaddr, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
	rtl_eri_write(ioaddr, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
	rtl_eri_write(ioaddr, 0xc8, ERIAR_MASK_1111, 0x00100002, ERIAR_EXGMAC);
	rtl_eri_write(ioaddr, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
	rtl_eri_write(ioaddr, 0xcc, ERIAR_MASK_1111, 0x00000050, ERIAR_EXGMAC);
	rtl_eri_write(ioaddr, 0xd0, ERIAR_MASK_1111, 0x07ff0060, ERIAR_EXGMAC);
	rtl_w1w0_eri(ioaddr, 0x1b0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
	rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00,
		     ERIAR_EXGMAC);

	RTL_W8(MaxTxPacketSize, 0x27);

	rtl_disable_clock_request(pdev);

	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);

	/* Adjust EEE LED frequency */
	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);

	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
}

4452 4453
static void rtl_hw_start_8168(struct net_device *dev)
{
4454 4455
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
4456
	struct pci_dev *pdev = tp->pci_dev;
4457 4458 4459

	RTL_W8(Cfg9346, Cfg9346_Unlock);

4460
	RTL_W8(MaxTxPacketSize, TxPacketMax);
4461

E
Eric Dumazet 已提交
4462
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
4463

4464
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
4465 4466 4467

	RTL_W16(CPlusCmd, tp->cp_cmd);

4468
	RTL_W16(IntrMitigate, 0x5151);
4469

4470
	/* Work around for RxFIFO overflow. */
4471 4472
	if (tp->mac_version == RTL_GIGA_MAC_VER_11 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_22) {
4473 4474 4475 4476 4477
		tp->intr_event |= RxFIFOOver | PCSTimeout;
		tp->intr_event &= ~RxOverflow;
	}

	rtl_set_rx_tx_desc_registers(tp, ioaddr);
4478

4479 4480 4481 4482
	rtl_set_rx_mode(dev);

	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
		(InterFrameGap << TxInterFrameGapShift));
4483 4484 4485

	RTL_R8(IntrMask);

4486 4487 4488
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_11:
		rtl_hw_start_8168bb(ioaddr, pdev);
4489
		break;
4490 4491 4492 4493

	case RTL_GIGA_MAC_VER_12:
	case RTL_GIGA_MAC_VER_17:
		rtl_hw_start_8168bef(ioaddr, pdev);
4494
		break;
4495 4496

	case RTL_GIGA_MAC_VER_18:
F
Francois Romieu 已提交
4497
		rtl_hw_start_8168cp_1(ioaddr, pdev);
4498
		break;
4499 4500 4501

	case RTL_GIGA_MAC_VER_19:
		rtl_hw_start_8168c_1(ioaddr, pdev);
4502
		break;
4503 4504 4505

	case RTL_GIGA_MAC_VER_20:
		rtl_hw_start_8168c_2(ioaddr, pdev);
4506
		break;
4507

F
Francois Romieu 已提交
4508 4509
	case RTL_GIGA_MAC_VER_21:
		rtl_hw_start_8168c_3(ioaddr, pdev);
4510
		break;
F
Francois Romieu 已提交
4511

4512 4513
	case RTL_GIGA_MAC_VER_22:
		rtl_hw_start_8168c_4(ioaddr, pdev);
4514
		break;
4515

F
Francois Romieu 已提交
4516 4517
	case RTL_GIGA_MAC_VER_23:
		rtl_hw_start_8168cp_2(ioaddr, pdev);
4518
		break;
F
Francois Romieu 已提交
4519

4520 4521
	case RTL_GIGA_MAC_VER_24:
		rtl_hw_start_8168cp_3(ioaddr, pdev);
4522
		break;
4523

F
Francois Romieu 已提交
4524
	case RTL_GIGA_MAC_VER_25:
4525 4526
	case RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_27:
F
Francois Romieu 已提交
4527
		rtl_hw_start_8168d(ioaddr, pdev);
4528
		break;
F
Francois Romieu 已提交
4529

F
françois romieu 已提交
4530 4531
	case RTL_GIGA_MAC_VER_28:
		rtl_hw_start_8168d_4(ioaddr, pdev);
4532
		break;
F
Francois Romieu 已提交
4533

4534 4535 4536 4537
	case RTL_GIGA_MAC_VER_31:
		rtl_hw_start_8168dp(ioaddr, pdev);
		break;

H
hayeswang 已提交
4538 4539
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
H
Hayes Wang 已提交
4540 4541 4542 4543
		rtl_hw_start_8168e_1(ioaddr, pdev);
		break;
	case RTL_GIGA_MAC_VER_34:
		rtl_hw_start_8168e_2(ioaddr, pdev);
H
hayeswang 已提交
4544
		break;
F
françois romieu 已提交
4545

4546 4547 4548
	default:
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
			dev->name, tp->mac_version);
4549
		break;
4550
	}
4551

4552 4553
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);

4554 4555
	RTL_W8(Cfg9346, Cfg9346_Lock);

4556
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
4557

4558
	RTL_W16(IntrMask, tp->intr_event);
4559
}
L
Linus Torvalds 已提交
4560

4561 4562 4563 4564
#define R810X_CPCMD_QUIRK_MASK (\
	EnableBist | \
	Mac_dbgo_oe | \
	Force_half_dup | \
F
françois romieu 已提交
4565
	Force_rxflow_en | \
4566 4567 4568 4569
	Force_txflow_en | \
	Cxpl_dbg_sel | \
	ASF | \
	PktCntrDisable | \
4570
	Mac_dbgo_sel)
4571 4572 4573

static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
{
4574
	static const struct ephy_info e_info_8102e_1[] = {
4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585
		{ 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;

4586
	rtl_csi_access_enable_2(ioaddr);
4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604

	RTL_W8(DBG_REG, FIX_NAK_1);

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W8(Config1,
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);

	cfg1 = RTL_R8(Config1);
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
		RTL_W8(Config1, cfg1 & ~LEDS0);

	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
}

static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
{
4605
	rtl_csi_access_enable_2(ioaddr);
4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619

	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);

	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
}

static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
{
	rtl_hw_start_8102e_2(ioaddr, pdev);

	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
}

4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632
static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
{
	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 已提交
4633
	/* Force LAN exit from ASPM if Rx/Tx are not idle */
4634 4635
	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);

F
Francois Romieu 已提交
4636
	/* Disable Early Tally Counter */
4637 4638 4639
	RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);

	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
H
Hayes Wang 已提交
4640
	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
4641 4642 4643 4644 4645 4646 4647 4648 4649 4650

	rtl_ephy_init(ioaddr, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
}

static void rtl_hw_start_8105e_2(void __iomem *ioaddr, struct pci_dev *pdev)
{
	rtl_hw_start_8105e_1(ioaddr, pdev);
	rtl_ephy_write(ioaddr, 0x1e, rtl_ephy_read(ioaddr, 0x1e) | 0x8000);
}

4651 4652
static void rtl_hw_start_8101(struct net_device *dev)
{
4653 4654 4655 4656
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	struct pci_dev *pdev = tp->pci_dev;

F
Francois Romieu 已提交
4657 4658
	if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
	    tp->mac_version == RTL_GIGA_MAC_VER_16) {
4659
		int cap = pci_pcie_cap(pdev);
4660 4661 4662 4663 4664

		if (cap) {
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
		}
4665 4666
	}

4667 4668
	RTL_W8(Cfg9346, Cfg9346_Unlock);

4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_07:
		rtl_hw_start_8102e_1(ioaddr, pdev);
		break;

	case RTL_GIGA_MAC_VER_08:
		rtl_hw_start_8102e_3(ioaddr, pdev);
		break;

	case RTL_GIGA_MAC_VER_09:
		rtl_hw_start_8102e_2(ioaddr, pdev);
		break;
4681 4682 4683 4684 4685 4686 4687

	case RTL_GIGA_MAC_VER_29:
		rtl_hw_start_8105e_1(ioaddr, pdev);
		break;
	case RTL_GIGA_MAC_VER_30:
		rtl_hw_start_8105e_2(ioaddr, pdev);
		break;
4688 4689
	}

4690
	RTL_W8(Cfg9346, Cfg9346_Lock);
4691

4692
	RTL_W8(MaxTxPacketSize, TxPacketMax);
4693

E
Eric Dumazet 已提交
4694
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
4695

4696
	tp->cp_cmd &= ~R810X_CPCMD_QUIRK_MASK;
4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710
	RTL_W16(CPlusCmd, tp->cp_cmd);

	RTL_W16(IntrMitigate, 0x0000);

	rtl_set_rx_tx_desc_registers(tp, ioaddr);

	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
	rtl_set_rx_tx_config_registers(tp);

	RTL_R8(IntrMask);

	rtl_set_rx_mode(dev);

	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
4711

4712
	RTL_W16(IntrMask, tp->intr_event);
L
Linus Torvalds 已提交
4713 4714 4715 4716 4717 4718 4719 4720
}

static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
{
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
		return -EINVAL;

	dev->mtu = new_mtu;
4721 4722
	netdev_update_features(dev);

S
Stanislaw Gruszka 已提交
4723
	return 0;
L
Linus Torvalds 已提交
4724 4725 4726 4727
}

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

E
Eric Dumazet 已提交
4732 4733
static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
				     void **data_buff, struct RxDesc *desc)
L
Linus Torvalds 已提交
4734
{
4735
	dma_unmap_single(&tp->pci_dev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
4736
			 DMA_FROM_DEVICE);
4737

E
Eric Dumazet 已提交
4738 4739
	kfree(*data_buff);
	*data_buff = NULL;
L
Linus Torvalds 已提交
4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757
	rtl8169_make_unusable_by_asic(desc);
}

static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
{
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;

	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
}

static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
				       u32 rx_buf_sz)
{
	desc->addr = cpu_to_le64(mapping);
	wmb();
	rtl8169_mark_to_asic(desc, rx_buf_sz);
}

E
Eric Dumazet 已提交
4758 4759 4760 4761 4762
static inline void *rtl8169_align(void *data)
{
	return (void *)ALIGN((long)data, 16);
}

S
Stanislaw Gruszka 已提交
4763 4764
static struct sk_buff *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
					     struct RxDesc *desc)
L
Linus Torvalds 已提交
4765
{
E
Eric Dumazet 已提交
4766
	void *data;
L
Linus Torvalds 已提交
4767
	dma_addr_t mapping;
4768
	struct device *d = &tp->pci_dev->dev;
S
Stanislaw Gruszka 已提交
4769
	struct net_device *dev = tp->dev;
E
Eric Dumazet 已提交
4770
	int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
L
Linus Torvalds 已提交
4771

E
Eric Dumazet 已提交
4772 4773 4774
	data = kmalloc_node(rx_buf_sz, GFP_KERNEL, node);
	if (!data)
		return NULL;
4775

E
Eric Dumazet 已提交
4776 4777 4778 4779 4780 4781
	if (rtl8169_align(data) != data) {
		kfree(data);
		data = kmalloc_node(rx_buf_sz + 15, GFP_KERNEL, node);
		if (!data)
			return NULL;
	}
4782

4783
	mapping = dma_map_single(d, rtl8169_align(data), rx_buf_sz,
4784
				 DMA_FROM_DEVICE);
4785 4786 4787
	if (unlikely(dma_mapping_error(d, mapping))) {
		if (net_ratelimit())
			netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
4788
		goto err_out;
4789
	}
L
Linus Torvalds 已提交
4790 4791

	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
E
Eric Dumazet 已提交
4792
	return data;
4793 4794 4795 4796

err_out:
	kfree(data);
	return NULL;
L
Linus Torvalds 已提交
4797 4798 4799 4800
}

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

	for (i = 0; i < NUM_RX_DESC; i++) {
E
Eric Dumazet 已提交
4804 4805
		if (tp->Rx_databuff[i]) {
			rtl8169_free_rx_databuff(tp, tp->Rx_databuff + i,
L
Linus Torvalds 已提交
4806 4807 4808 4809 4810
					    tp->RxDescArray + i);
		}
	}
}

S
Stanislaw Gruszka 已提交
4811
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
L
Linus Torvalds 已提交
4812
{
S
Stanislaw Gruszka 已提交
4813 4814
	desc->opts1 |= cpu_to_le32(RingEnd);
}
4815

S
Stanislaw Gruszka 已提交
4816 4817 4818
static int rtl8169_rx_fill(struct rtl8169_private *tp)
{
	unsigned int i;
L
Linus Torvalds 已提交
4819

S
Stanislaw Gruszka 已提交
4820 4821
	for (i = 0; i < NUM_RX_DESC; i++) {
		void *data;
4822

E
Eric Dumazet 已提交
4823
		if (tp->Rx_databuff[i])
L
Linus Torvalds 已提交
4824
			continue;
4825

S
Stanislaw Gruszka 已提交
4826
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
E
Eric Dumazet 已提交
4827 4828
		if (!data) {
			rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
S
Stanislaw Gruszka 已提交
4829
			goto err_out;
E
Eric Dumazet 已提交
4830 4831
		}
		tp->Rx_databuff[i] = data;
L
Linus Torvalds 已提交
4832 4833
	}

S
Stanislaw Gruszka 已提交
4834 4835 4836 4837 4838 4839
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
	return 0;

err_out:
	rtl8169_rx_clear(tp);
	return -ENOMEM;
L
Linus Torvalds 已提交
4840 4841 4842 4843 4844 4845 4846 4847 4848
}

static int rtl8169_init_ring(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl8169_init_ring_indexes(tp);

	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
E
Eric Dumazet 已提交
4849
	memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *));
L
Linus Torvalds 已提交
4850

S
Stanislaw Gruszka 已提交
4851
	return rtl8169_rx_fill(tp);
L
Linus Torvalds 已提交
4852 4853
}

4854
static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
L
Linus Torvalds 已提交
4855 4856 4857 4858
				 struct TxDesc *desc)
{
	unsigned int len = tx_skb->len;

4859 4860
	dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);

L
Linus Torvalds 已提交
4861 4862 4863 4864 4865 4866
	desc->opts1 = 0x00;
	desc->opts2 = 0x00;
	desc->addr = 0x00;
	tx_skb->len = 0;
}

4867 4868
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
				   unsigned int n)
L
Linus Torvalds 已提交
4869 4870 4871
{
	unsigned int i;

4872 4873
	for (i = 0; i < n; i++) {
		unsigned int entry = (start + i) % NUM_TX_DESC;
L
Linus Torvalds 已提交
4874 4875 4876 4877 4878 4879
		struct ring_info *tx_skb = tp->tx_skb + entry;
		unsigned int len = tx_skb->len;

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

4880
			rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
L
Linus Torvalds 已提交
4881 4882
					     tp->TxDescArray + entry);
			if (skb) {
4883
				tp->dev->stats.tx_dropped++;
L
Linus Torvalds 已提交
4884 4885 4886 4887 4888
				dev_kfree_skb(skb);
				tx_skb->skb = NULL;
			}
		}
	}
4889 4890 4891 4892 4893
}

static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
L
Linus Torvalds 已提交
4894 4895 4896
	tp->cur_tx = tp->dirty_tx = 0;
}

D
David Howells 已提交
4897
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
L
Linus Torvalds 已提交
4898 4899 4900
{
	struct rtl8169_private *tp = netdev_priv(dev);

D
David Howells 已提交
4901
	PREPARE_DELAYED_WORK(&tp->task, task);
L
Linus Torvalds 已提交
4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912
	schedule_delayed_work(&tp->task, 4);
}

static void rtl8169_wait_for_quiescence(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;

	synchronize_irq(dev->irq);

	/* Wait for any pending NAPI task to complete */
4913
	napi_disable(&tp->napi);
L
Linus Torvalds 已提交
4914 4915 4916

	rtl8169_irq_mask_and_ack(ioaddr);

4917 4918
	tp->intr_mask = 0xffff;
	RTL_W16(IntrMask, tp->intr_event);
4919
	napi_enable(&tp->napi);
L
Linus Torvalds 已提交
4920 4921
}

D
David Howells 已提交
4922
static void rtl8169_reinit_task(struct work_struct *work)
L
Linus Torvalds 已提交
4923
{
D
David Howells 已提交
4924 4925 4926
	struct rtl8169_private *tp =
		container_of(work, struct rtl8169_private, task.work);
	struct net_device *dev = tp->dev;
L
Linus Torvalds 已提交
4927 4928
	int ret;

4929 4930 4931 4932 4933 4934 4935
	rtnl_lock();

	if (!netif_running(dev))
		goto out_unlock;

	rtl8169_wait_for_quiescence(dev);
	rtl8169_close(dev);
L
Linus Torvalds 已提交
4936 4937 4938

	ret = rtl8169_open(dev);
	if (unlikely(ret < 0)) {
4939 4940 4941 4942
		if (net_ratelimit())
			netif_err(tp, drv, dev,
				  "reinit failure (status = %d). Rescheduling\n",
				  ret);
L
Linus Torvalds 已提交
4943 4944
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
	}
4945 4946 4947

out_unlock:
	rtnl_unlock();
L
Linus Torvalds 已提交
4948 4949
}

D
David Howells 已提交
4950
static void rtl8169_reset_task(struct work_struct *work)
L
Linus Torvalds 已提交
4951
{
D
David Howells 已提交
4952 4953 4954
	struct rtl8169_private *tp =
		container_of(work, struct rtl8169_private, task.work);
	struct net_device *dev = tp->dev;
4955
	int i;
L
Linus Torvalds 已提交
4956

4957 4958
	rtnl_lock();

L
Linus Torvalds 已提交
4959
	if (!netif_running(dev))
4960
		goto out_unlock;
L
Linus Torvalds 已提交
4961 4962 4963

	rtl8169_wait_for_quiescence(dev);

4964 4965 4966
	for (i = 0; i < NUM_RX_DESC; i++)
		rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz);

L
Linus Torvalds 已提交
4967 4968
	rtl8169_tx_clear(tp);

4969
	rtl8169_hw_reset(tp);
4970 4971 4972
	rtl_hw_start(dev);
	netif_wake_queue(dev);
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
4973 4974 4975

out_unlock:
	rtnl_unlock();
L
Linus Torvalds 已提交
4976 4977 4978 4979 4980 4981
}

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

F
françois romieu 已提交
4982
	rtl8169_hw_reset(tp);
L
Linus Torvalds 已提交
4983 4984 4985 4986 4987 4988

	/* Let's wait a bit while any (async) irq lands on */
	rtl8169_schedule_work(dev, rtl8169_reset_task);
}

static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
F
Francois Romieu 已提交
4989
			      u32 *opts)
L
Linus Torvalds 已提交
4990 4991 4992
{
	struct skb_shared_info *info = skb_shinfo(skb);
	unsigned int cur_frag, entry;
4993
	struct TxDesc * uninitialized_var(txd);
4994
	struct device *d = &tp->pci_dev->dev;
L
Linus Torvalds 已提交
4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007

	entry = tp->cur_tx;
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
		skb_frag_t *frag = info->frags + cur_frag;
		dma_addr_t mapping;
		u32 status, len;
		void *addr;

		entry = (entry + 1) % NUM_TX_DESC;

		txd = tp->TxDescArray + entry;
		len = frag->size;
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
5008
		mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
5009 5010 5011 5012
		if (unlikely(dma_mapping_error(d, mapping))) {
			if (net_ratelimit())
				netif_err(tp, drv, tp->dev,
					  "Failed to map TX fragments DMA!\n");
5013
			goto err_out;
5014
		}
L
Linus Torvalds 已提交
5015

F
Francois Romieu 已提交
5016
		/* Anti gcc 2.95.3 bugware (sic) */
F
Francois Romieu 已提交
5017 5018
		status = opts[0] | len |
			(RingEnd * !((entry + 1) % NUM_TX_DESC));
L
Linus Torvalds 已提交
5019 5020

		txd->opts1 = cpu_to_le32(status);
F
Francois Romieu 已提交
5021
		txd->opts2 = cpu_to_le32(opts[1]);
L
Linus Torvalds 已提交
5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032
		txd->addr = cpu_to_le64(mapping);

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

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

	return cur_frag;
5033 5034 5035 5036

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

F
Francois Romieu 已提交
5039 5040
static inline void rtl8169_tso_csum(struct rtl8169_private *tp,
				    struct sk_buff *skb, u32 *opts)
L
Linus Torvalds 已提交
5041
{
F
Francois Romieu 已提交
5042
	const struct rtl_tx_desc_info *info = tx_desc_info + tp->txd_version;
5043
	u32 mss = skb_shinfo(skb)->gso_size;
F
Francois Romieu 已提交
5044
	int offset = info->opts_offset;
5045

F
Francois Romieu 已提交
5046 5047 5048 5049
	if (mss) {
		opts[0] |= TD_LSO;
		opts[offset] |= min(mss, TD_MSS_MAX) << info->mss_shift;
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
5050
		const struct iphdr *ip = ip_hdr(skb);
L
Linus Torvalds 已提交
5051 5052

		if (ip->protocol == IPPROTO_TCP)
F
Francois Romieu 已提交
5053
			opts[offset] |= info->checksum.tcp;
L
Linus Torvalds 已提交
5054
		else if (ip->protocol == IPPROTO_UDP)
F
Francois Romieu 已提交
5055 5056 5057
			opts[offset] |= info->checksum.udp;
		else
			WARN_ON_ONCE(1);
L
Linus Torvalds 已提交
5058 5059 5060
	}
}

5061 5062
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
				      struct net_device *dev)
L
Linus Torvalds 已提交
5063 5064
{
	struct rtl8169_private *tp = netdev_priv(dev);
5065
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
L
Linus Torvalds 已提交
5066 5067
	struct TxDesc *txd = tp->TxDescArray + entry;
	void __iomem *ioaddr = tp->mmio_addr;
5068
	struct device *d = &tp->pci_dev->dev;
L
Linus Torvalds 已提交
5069 5070
	dma_addr_t mapping;
	u32 status, len;
F
Francois Romieu 已提交
5071
	u32 opts[2];
5072
	int frags;
5073

L
Linus Torvalds 已提交
5074
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
5075
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
5076
		goto err_stop_0;
L
Linus Torvalds 已提交
5077 5078 5079
	}

	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
5080 5081 5082
		goto err_stop_0;

	len = skb_headlen(skb);
5083
	mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
5084 5085 5086
	if (unlikely(dma_mapping_error(d, mapping))) {
		if (net_ratelimit())
			netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
5087
		goto err_dma_0;
5088
	}
5089 5090 5091

	tp->tx_skb[entry].len = len;
	txd->addr = cpu_to_le64(mapping);
L
Linus Torvalds 已提交
5092

F
Francois Romieu 已提交
5093 5094
	opts[1] = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
	opts[0] = DescOwn;
L
Linus Torvalds 已提交
5095

F
Francois Romieu 已提交
5096 5097 5098
	rtl8169_tso_csum(tp, skb, opts);

	frags = rtl8169_xmit_frags(tp, skb, opts);
5099 5100 5101
	if (frags < 0)
		goto err_dma_1;
	else if (frags)
F
Francois Romieu 已提交
5102
		opts[0] |= FirstFrag;
5103
	else {
F
Francois Romieu 已提交
5104
		opts[0] |= FirstFrag | LastFrag;
L
Linus Torvalds 已提交
5105 5106 5107
		tp->tx_skb[entry].skb = skb;
	}

F
Francois Romieu 已提交
5108 5109
	txd->opts2 = cpu_to_le32(opts[1]);

L
Linus Torvalds 已提交
5110 5111
	wmb();

F
Francois Romieu 已提交
5112
	/* Anti gcc 2.95.3 bugware (sic) */
F
Francois Romieu 已提交
5113
	status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
L
Linus Torvalds 已提交
5114 5115 5116 5117
	txd->opts1 = cpu_to_le32(status);

	tp->cur_tx += frags + 1;

5118
	wmb();
L
Linus Torvalds 已提交
5119

F
Francois Romieu 已提交
5120
	RTL_W8(TxPoll, NPQ);
L
Linus Torvalds 已提交
5121 5122 5123 5124 5125 5126 5127 5128

	if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
		netif_stop_queue(dev);
		smp_rmb();
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
			netif_wake_queue(dev);
	}

5129
	return NETDEV_TX_OK;
L
Linus Torvalds 已提交
5130

5131
err_dma_1:
5132
	rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
5133 5134 5135 5136 5137 5138
err_dma_0:
	dev_kfree_skb(skb);
	dev->stats.tx_dropped++;
	return NETDEV_TX_OK;

err_stop_0:
L
Linus Torvalds 已提交
5139
	netif_stop_queue(dev);
5140
	dev->stats.tx_dropped++;
5141
	return NETDEV_TX_BUSY;
L
Linus Torvalds 已提交
5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152
}

static void rtl8169_pcierr_interrupt(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;
	u16 pci_status, pci_cmd;

	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);

5153 5154
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
		  pci_cmd, pci_status);
L
Linus Torvalds 已提交
5155 5156 5157 5158

	/*
	 * The recovery sequence below admits a very elaborated explanation:
	 * - it seems to work;
5159 5160
	 * - I did not see what else could be done;
	 * - it makes iop3xx happy.
L
Linus Torvalds 已提交
5161 5162 5163
	 *
	 * Feel free to adjust to your needs.
	 */
5164
	if (pdev->broken_parity_status)
5165 5166 5167 5168 5169
		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 已提交
5170 5171 5172 5173 5174 5175 5176 5177

	pci_write_config_word(pdev, PCI_STATUS,
		pci_status & (PCI_STATUS_DETECTED_PARITY |
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));

	/* The infamous DAC f*ckup only happens at boot time */
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
F
françois romieu 已提交
5178 5179
		void __iomem *ioaddr = tp->mmio_addr;

5180
		netif_info(tp, intr, dev, "disabling PCI DAC\n");
L
Linus Torvalds 已提交
5181 5182 5183 5184 5185
		tp->cp_cmd &= ~PCIDAC;
		RTL_W16(CPlusCmd, tp->cp_cmd);
		dev->features &= ~NETIF_F_HIGHDMA;
	}

F
françois romieu 已提交
5186
	rtl8169_hw_reset(tp);
5187 5188

	rtl8169_schedule_work(dev, rtl8169_reinit_task);
L
Linus Torvalds 已提交
5189 5190
}

F
Francois Romieu 已提交
5191 5192 5193
static void rtl8169_tx_interrupt(struct net_device *dev,
				 struct rtl8169_private *tp,
				 void __iomem *ioaddr)
L
Linus Torvalds 已提交
5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210
{
	unsigned int dirty_tx, tx_left;

	dirty_tx = tp->dirty_tx;
	smp_rmb();
	tx_left = tp->cur_tx - dirty_tx;

	while (tx_left > 0) {
		unsigned int entry = dirty_tx % NUM_TX_DESC;
		struct ring_info *tx_skb = tp->tx_skb + entry;
		u32 status;

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

5211 5212
		rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
				     tp->TxDescArray + entry);
L
Linus Torvalds 已提交
5213
		if (status & LastFrag) {
5214 5215
			dev->stats.tx_packets++;
			dev->stats.tx_bytes += tx_skb->skb->len;
5216
			dev_kfree_skb(tx_skb->skb);
L
Linus Torvalds 已提交
5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229
			tx_skb->skb = NULL;
		}
		dirty_tx++;
		tx_left--;
	}

	if (tp->dirty_tx != dirty_tx) {
		tp->dirty_tx = dirty_tx;
		smp_wmb();
		if (netif_queue_stopped(dev) &&
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
			netif_wake_queue(dev);
		}
5230 5231 5232 5233 5234 5235 5236 5237 5238
		/*
		 * 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
		 */
		smp_rmb();
		if (tp->cur_tx != dirty_tx)
			RTL_W8(TxPoll, NPQ);
L
Linus Torvalds 已提交
5239 5240 5241
	}
}

5242 5243 5244 5245 5246
static inline int rtl8169_fragmented_frame(u32 status)
{
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
}

E
Eric Dumazet 已提交
5247
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
L
Linus Torvalds 已提交
5248 5249 5250 5251
{
	u32 status = opts1 & RxProtoMask;

	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
S
Shan Wei 已提交
5252
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
L
Linus Torvalds 已提交
5253 5254
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	else
5255
		skb_checksum_none_assert(skb);
L
Linus Torvalds 已提交
5256 5257
}

E
Eric Dumazet 已提交
5258 5259 5260 5261
static struct sk_buff *rtl8169_try_rx_copy(void *data,
					   struct rtl8169_private *tp,
					   int pkt_size,
					   dma_addr_t addr)
L
Linus Torvalds 已提交
5262
{
S
Stephen Hemminger 已提交
5263
	struct sk_buff *skb;
5264
	struct device *d = &tp->pci_dev->dev;
S
Stephen Hemminger 已提交
5265

E
Eric Dumazet 已提交
5266
	data = rtl8169_align(data);
5267
	dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
E
Eric Dumazet 已提交
5268 5269 5270 5271
	prefetch(data);
	skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
	if (skb)
		memcpy(skb->data, data, pkt_size);
5272 5273
	dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);

E
Eric Dumazet 已提交
5274
	return skb;
L
Linus Torvalds 已提交
5275 5276
}

F
Francois Romieu 已提交
5277 5278
static int rtl8169_rx_interrupt(struct net_device *dev,
				struct rtl8169_private *tp,
5279
				void __iomem *ioaddr, u32 budget)
L
Linus Torvalds 已提交
5280 5281
{
	unsigned int cur_rx, rx_left;
E
Eric Dumazet 已提交
5282
	unsigned int count;
L
Linus Torvalds 已提交
5283 5284 5285

	cur_rx = tp->cur_rx;
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
F
Francois Romieu 已提交
5286
	rx_left = min(rx_left, budget);
L
Linus Torvalds 已提交
5287

R
Richard Dawe 已提交
5288
	for (; rx_left > 0; rx_left--, cur_rx++) {
L
Linus Torvalds 已提交
5289
		unsigned int entry = cur_rx % NUM_RX_DESC;
5290
		struct RxDesc *desc = tp->RxDescArray + entry;
L
Linus Torvalds 已提交
5291 5292 5293
		u32 status;

		rmb();
5294
		status = le32_to_cpu(desc->opts1);
L
Linus Torvalds 已提交
5295 5296 5297

		if (status & DescOwn)
			break;
R
Richard Dawe 已提交
5298
		if (unlikely(status & RxRES)) {
5299 5300
			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
				   status);
5301
			dev->stats.rx_errors++;
L
Linus Torvalds 已提交
5302
			if (status & (RxRWT | RxRUNT))
5303
				dev->stats.rx_length_errors++;
L
Linus Torvalds 已提交
5304
			if (status & RxCRC)
5305
				dev->stats.rx_crc_errors++;
5306 5307
			if (status & RxFOVF) {
				rtl8169_schedule_work(dev, rtl8169_reset_task);
5308
				dev->stats.rx_fifo_errors++;
5309
			}
E
Eric Dumazet 已提交
5310
			rtl8169_mark_to_asic(desc, rx_buf_sz);
L
Linus Torvalds 已提交
5311
		} else {
E
Eric Dumazet 已提交
5312
			struct sk_buff *skb;
S
Stephen Hemminger 已提交
5313
			dma_addr_t addr = le64_to_cpu(desc->addr);
L
Linus Torvalds 已提交
5314 5315
			int pkt_size = (status & 0x00001FFF) - 4;

5316 5317 5318 5319 5320 5321
			/*
			 * 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))) {
5322 5323
				dev->stats.rx_dropped++;
				dev->stats.rx_length_errors++;
E
Eric Dumazet 已提交
5324
				rtl8169_mark_to_asic(desc, rx_buf_sz);
R
Richard Dawe 已提交
5325
				continue;
5326 5327
			}

E
Eric Dumazet 已提交
5328 5329 5330 5331 5332 5333
			skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
						  tp, pkt_size, addr);
			rtl8169_mark_to_asic(desc, rx_buf_sz);
			if (!skb) {
				dev->stats.rx_dropped++;
				continue;
L
Linus Torvalds 已提交
5334 5335
			}

E
Eric Dumazet 已提交
5336
			rtl8169_rx_csum(skb, status);
L
Linus Torvalds 已提交
5337 5338 5339
			skb_put(skb, pkt_size);
			skb->protocol = eth_type_trans(skb, dev);

5340 5341
			rtl8169_rx_vlan_tag(desc, skb);

5342
			napi_gro_receive(&tp->napi, skb);
L
Linus Torvalds 已提交
5343

5344 5345
			dev->stats.rx_bytes += pkt_size;
			dev->stats.rx_packets++;
L
Linus Torvalds 已提交
5346
		}
5347 5348

		/* Work around for AMD plateform. */
A
Al Viro 已提交
5349
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
5350 5351 5352 5353
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
			desc->opts2 = 0;
			cur_rx++;
		}
L
Linus Torvalds 已提交
5354 5355 5356 5357 5358
	}

	count = cur_rx - tp->cur_rx;
	tp->cur_rx = cur_rx;

E
Eric Dumazet 已提交
5359
	tp->dirty_rx += count;
L
Linus Torvalds 已提交
5360 5361 5362 5363

	return count;
}

F
Francois Romieu 已提交
5364
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
L
Linus Torvalds 已提交
5365
{
F
Francois Romieu 已提交
5366
	struct net_device *dev = dev_instance;
L
Linus Torvalds 已提交
5367 5368 5369
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	int handled = 0;
F
Francois Romieu 已提交
5370
	int status;
L
Linus Torvalds 已提交
5371

5372 5373 5374
	/* loop handling interrupts until we have no new ones or
	 * we hit a invalid/hotplug case.
	 */
F
Francois Romieu 已提交
5375
	status = RTL_R16(IntrStatus);
5376 5377
	while (status && status != 0xffff) {
		handled = 1;
L
Linus Torvalds 已提交
5378

5379 5380 5381 5382
		/* Handle all of the error cases first. These will reset
		 * the chip, so just exit the loop.
		 */
		if (unlikely(!netif_running(dev))) {
5383
			rtl8169_hw_reset(tp);
5384 5385
			break;
		}
L
Linus Torvalds 已提交
5386

5387 5388 5389 5390 5391 5392 5393 5394 5395
		if (unlikely(status & RxFIFOOver)) {
			switch (tp->mac_version) {
			/* Work around for rx fifo overflow */
			case RTL_GIGA_MAC_VER_11:
			case RTL_GIGA_MAC_VER_22:
			case RTL_GIGA_MAC_VER_26:
				netif_stop_queue(dev);
				rtl8169_tx_timeout(dev);
				goto done;
5396 5397 5398 5399 5400 5401 5402 5403 5404
			/* Testers needed. */
			case RTL_GIGA_MAC_VER_17:
			case RTL_GIGA_MAC_VER_19:
			case RTL_GIGA_MAC_VER_20:
			case RTL_GIGA_MAC_VER_21:
			case RTL_GIGA_MAC_VER_23:
			case RTL_GIGA_MAC_VER_24:
			case RTL_GIGA_MAC_VER_27:
			case RTL_GIGA_MAC_VER_28:
5405
			case RTL_GIGA_MAC_VER_31:
5406 5407 5408 5409 5410 5411 5412 5413 5414
			/* Experimental science. Pktgen proof. */
			case RTL_GIGA_MAC_VER_12:
			case RTL_GIGA_MAC_VER_25:
				if (status == RxFIFOOver)
					goto done;
				break;
			default:
				break;
			}
5415
		}
L
Linus Torvalds 已提交
5416

5417 5418 5419 5420
		if (unlikely(status & SYSErr)) {
			rtl8169_pcierr_interrupt(dev);
			break;
		}
L
Linus Torvalds 已提交
5421

5422
		if (status & LinkChg)
5423
			__rtl8169_check_link_status(dev, tp, ioaddr, true);
5424

5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435
		/* We need to see the lastest version of tp->intr_mask to
		 * avoid ignoring an MSI interrupt and having to wait for
		 * another event which may never come.
		 */
		smp_rmb();
		if (status & tp->intr_mask & tp->napi_event) {
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
			tp->intr_mask = ~tp->napi_event;

			if (likely(napi_schedule_prep(&tp->napi)))
				__napi_schedule(&tp->napi);
5436 5437 5438
			else
				netif_info(tp, intr, dev,
					   "interrupt %04x in poll\n", status);
5439
		}
L
Linus Torvalds 已提交
5440

5441 5442 5443 5444 5445 5446 5447 5448
		/* We only get a new MSI interrupt when all active irq
		 * sources on the chip have been acknowledged. So, ack
		 * everything we've seen and check if new sources have become
		 * active to avoid blocking all interrupts from the chip.
		 */
		RTL_W16(IntrStatus,
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
		status = RTL_R16(IntrStatus);
F
Francois Romieu 已提交
5449
	}
5450
done:
L
Linus Torvalds 已提交
5451 5452 5453
	return IRQ_RETVAL(handled);
}

5454
static int rtl8169_poll(struct napi_struct *napi, int budget)
L
Linus Torvalds 已提交
5455
{
5456 5457
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
	struct net_device *dev = tp->dev;
L
Linus Torvalds 已提交
5458
	void __iomem *ioaddr = tp->mmio_addr;
5459
	int work_done;
L
Linus Torvalds 已提交
5460

5461
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
L
Linus Torvalds 已提交
5462 5463
	rtl8169_tx_interrupt(dev, tp, ioaddr);

5464
	if (work_done < budget) {
5465
		napi_complete(napi);
5466 5467 5468 5469 5470 5471 5472

		/* We need for force the visibility of tp->intr_mask
		 * for other CPUs, as we can loose an MSI interrupt
		 * and potentially wait for a retransmit timeout if we don't.
		 * The posted write to IntrMask is safe, as it will
		 * eventually make it to the chip and we won't loose anything
		 * until it does.
L
Linus Torvalds 已提交
5473
		 */
5474
		tp->intr_mask = 0xffff;
5475
		wmb();
5476
		RTL_W16(IntrMask, tp->intr_event);
L
Linus Torvalds 已提交
5477 5478
	}

5479
	return work_done;
L
Linus Torvalds 已提交
5480 5481
}

5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
{
	struct rtl8169_private *tp = netdev_priv(dev);

	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
		return;

	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
	RTL_W32(RxMissed, 0);
}

L
Linus Torvalds 已提交
5493 5494 5495 5496 5497
static void rtl8169_down(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;

5498
	del_timer_sync(&tp->timer);
L
Linus Torvalds 已提交
5499 5500 5501

	netif_stop_queue(dev);

5502 5503
	napi_disable(&tp->napi);

L
Linus Torvalds 已提交
5504 5505
	spin_lock_irq(&tp->lock);

5506
	rtl8169_hw_reset(tp);
S
Stanislaw Gruszka 已提交
5507 5508 5509 5510 5511
	/*
	 * At this point device interrupts can not be enabled in any function,
	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
	 * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
	 */
5512
	rtl8169_rx_missed(dev, ioaddr);
L
Linus Torvalds 已提交
5513 5514 5515 5516 5517 5518

	spin_unlock_irq(&tp->lock);

	synchronize_irq(dev->irq);

	/* Give a racing hard_start_xmit a few cycles to complete. */
5519
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
L
Linus Torvalds 已提交
5520 5521 5522 5523

	rtl8169_tx_clear(tp);

	rtl8169_rx_clear(tp);
F
françois romieu 已提交
5524 5525

	rtl_pll_power_down(tp);
L
Linus Torvalds 已提交
5526 5527 5528 5529 5530 5531 5532
}

static int rtl8169_close(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	struct pci_dev *pdev = tp->pci_dev;

5533 5534
	pm_runtime_get_sync(&pdev->dev);

F
Francois Romieu 已提交
5535
	/* Update counters before going down */
5536 5537
	rtl8169_update_counters(dev);

L
Linus Torvalds 已提交
5538 5539 5540 5541
	rtl8169_down(dev);

	free_irq(dev->irq, dev);

5542 5543 5544 5545
	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 已提交
5546 5547 5548
	tp->TxDescArray = NULL;
	tp->RxDescArray = NULL;

5549 5550
	pm_runtime_put_sync(&pdev->dev);

L
Linus Torvalds 已提交
5551 5552 5553
	return 0;
}

5554
static void rtl_set_rx_mode(struct net_device *dev)
L
Linus Torvalds 已提交
5555 5556 5557 5558 5559
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	unsigned long flags;
	u32 mc_filter[2];	/* Multicast hash filter */
F
Francois Romieu 已提交
5560
	int rx_mode;
L
Linus Torvalds 已提交
5561 5562 5563 5564
	u32 tmp = 0;

	if (dev->flags & IFF_PROMISC) {
		/* Unconditionally log net taps. */
5565
		netif_notice(tp, link, dev, "Promiscuous mode enabled\n");
L
Linus Torvalds 已提交
5566 5567 5568 5569
		rx_mode =
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
		    AcceptAllPhys;
		mc_filter[1] = mc_filter[0] = 0xffffffff;
5570
	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
5571
		   (dev->flags & IFF_ALLMULTI)) {
L
Linus Torvalds 已提交
5572 5573 5574 5575
		/* Too many to filter perfectly -- accept all multicasts. */
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
		mc_filter[1] = mc_filter[0] = 0xffffffff;
	} else {
5576
		struct netdev_hw_addr *ha;
F
Francois Romieu 已提交
5577

L
Linus Torvalds 已提交
5578 5579
		rx_mode = AcceptBroadcast | AcceptMyPhys;
		mc_filter[1] = mc_filter[0] = 0;
5580 5581
		netdev_for_each_mc_addr(ha, dev) {
			int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
L
Linus Torvalds 已提交
5582 5583 5584 5585 5586 5587 5588
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
			rx_mode |= AcceptMulticast;
		}
	}

	spin_lock_irqsave(&tp->lock, flags);

5589
	tmp = RTL_R32(RxConfig) | rx_mode;
L
Linus Torvalds 已提交
5590

5591
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
5592 5593 5594 5595
		u32 data = mc_filter[0];

		mc_filter[0] = swab32(mc_filter[1]);
		mc_filter[1] = swab32(data);
5596 5597
	}

L
Linus Torvalds 已提交
5598
	RTL_W32(MAR0 + 4, mc_filter[1]);
5599
	RTL_W32(MAR0 + 0, mc_filter[0]);
L
Linus Torvalds 已提交
5600

5601 5602
	RTL_W32(RxConfig, tmp);

L
Linus Torvalds 已提交
5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619
	spin_unlock_irqrestore(&tp->lock, flags);
}

/**
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
 *  @dev: The Ethernet Device to get statistics for
 *
 *  Get TX/RX statistics for rtl8169
 */
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
{
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
	unsigned long flags;

	if (netif_running(dev)) {
		spin_lock_irqsave(&tp->lock, flags);
5620
		rtl8169_rx_missed(dev, ioaddr);
L
Linus Torvalds 已提交
5621 5622
		spin_unlock_irqrestore(&tp->lock, flags);
	}
5623

5624
	return &dev->stats;
L
Linus Torvalds 已提交
5625 5626
}

5627
static void rtl8169_net_suspend(struct net_device *dev)
5628
{
F
françois romieu 已提交
5629 5630
	struct rtl8169_private *tp = netdev_priv(dev);

5631
	if (!netif_running(dev))
5632
		return;
5633

F
françois romieu 已提交
5634 5635
	rtl_pll_power_down(tp);

5636 5637
	netif_device_detach(dev);
	netif_stop_queue(dev);
5638 5639 5640 5641 5642 5643 5644 5645
}

#ifdef CONFIG_PM

static int rtl8169_suspend(struct device *device)
{
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *dev = pci_get_drvdata(pdev);
5646

5647
	rtl8169_net_suspend(dev);
5648

5649 5650 5651
	return 0;
}

5652 5653
static void __rtl8169_resume(struct net_device *dev)
{
F
françois romieu 已提交
5654 5655
	struct rtl8169_private *tp = netdev_priv(dev);

5656
	netif_device_attach(dev);
F
françois romieu 已提交
5657 5658 5659

	rtl_pll_power_up(tp);

5660 5661 5662
	rtl8169_schedule_work(dev, rtl8169_reset_task);
}

5663
static int rtl8169_resume(struct device *device)
5664
{
5665
	struct pci_dev *pdev = to_pci_dev(device);
5666
	struct net_device *dev = pci_get_drvdata(pdev);
S
Stanislaw Gruszka 已提交
5667 5668 5669
	struct rtl8169_private *tp = netdev_priv(dev);

	rtl8169_init_phy(dev, tp);
5670

5671 5672
	if (netif_running(dev))
		__rtl8169_resume(dev);
5673

5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709
	return 0;
}

static int rtl8169_runtime_suspend(struct device *device)
{
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rtl8169_private *tp = netdev_priv(dev);

	if (!tp->TxDescArray)
		return 0;

	spin_lock_irq(&tp->lock);
	tp->saved_wolopts = __rtl8169_get_wol(tp);
	__rtl8169_set_wol(tp, WAKE_ANY);
	spin_unlock_irq(&tp->lock);

	rtl8169_net_suspend(dev);

	return 0;
}

static int rtl8169_runtime_resume(struct device *device)
{
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rtl8169_private *tp = netdev_priv(dev);

	if (!tp->TxDescArray)
		return 0;

	spin_lock_irq(&tp->lock);
	__rtl8169_set_wol(tp, tp->saved_wolopts);
	tp->saved_wolopts = 0;
	spin_unlock_irq(&tp->lock);

S
Stanislaw Gruszka 已提交
5710 5711
	rtl8169_init_phy(dev, tp);

5712
	__rtl8169_resume(dev);
5713 5714 5715 5716

	return 0;
}

5717 5718 5719 5720 5721 5722
static int rtl8169_runtime_idle(struct device *device)
{
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rtl8169_private *tp = netdev_priv(dev);

5723
	return tp->TxDescArray ? -EBUSY : 0;
5724 5725
}

5726
static const struct dev_pm_ops rtl8169_pm_ops = {
F
Francois Romieu 已提交
5727 5728 5729 5730 5731 5732 5733 5734 5735
	.suspend		= rtl8169_suspend,
	.resume			= rtl8169_resume,
	.freeze			= rtl8169_suspend,
	.thaw			= rtl8169_resume,
	.poweroff		= rtl8169_suspend,
	.restore		= rtl8169_resume,
	.runtime_suspend	= rtl8169_runtime_suspend,
	.runtime_resume		= rtl8169_runtime_resume,
	.runtime_idle		= rtl8169_runtime_idle,
5736 5737 5738 5739 5740 5741 5742 5743 5744 5745
};

#define RTL8169_PM_OPS	(&rtl8169_pm_ops)

#else /* !CONFIG_PM */

#define RTL8169_PM_OPS	NULL

#endif /* !CONFIG_PM */

F
Francois Romieu 已提交
5746 5747
static void rtl_shutdown(struct pci_dev *pdev)
{
5748
	struct net_device *dev = pci_get_drvdata(pdev);
5749 5750
	struct rtl8169_private *tp = netdev_priv(dev);
	void __iomem *ioaddr = tp->mmio_addr;
5751 5752

	rtl8169_net_suspend(dev);
F
Francois Romieu 已提交
5753

F
Francois Romieu 已提交
5754
	/* Restore original MAC address */
5755 5756
	rtl_rar_set(tp, dev->perm_addr);

5757 5758
	spin_lock_irq(&tp->lock);

5759
	rtl8169_hw_reset(tp);
5760 5761 5762

	spin_unlock_irq(&tp->lock);

5763
	if (system_state == SYSTEM_POWER_OFF) {
5764 5765 5766 5767 5768
		/* WoL fails with 8168b when the receiver is disabled. */
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11 ||
		     tp->mac_version == RTL_GIGA_MAC_VER_12 ||
		     tp->mac_version == RTL_GIGA_MAC_VER_17) &&
		    (tp->features & RTL_FEATURE_WOL)) {
5769 5770 5771 5772 5773 5774 5775
			pci_clear_master(pdev);

			RTL_W8(ChipCmd, CmdRxEnb);
			/* PCI commit */
			RTL_R8(ChipCmd);
		}

5776 5777 5778 5779
		pci_wake_from_d3(pdev, true);
		pci_set_power_state(pdev, PCI_D3hot);
	}
}
5780

L
Linus Torvalds 已提交
5781 5782 5783 5784 5785
static struct pci_driver rtl8169_pci_driver = {
	.name		= MODULENAME,
	.id_table	= rtl8169_pci_tbl,
	.probe		= rtl8169_init_one,
	.remove		= __devexit_p(rtl8169_remove_one),
F
Francois Romieu 已提交
5786
	.shutdown	= rtl_shutdown,
5787
	.driver.pm	= RTL8169_PM_OPS,
L
Linus Torvalds 已提交
5788 5789
};

F
Francois Romieu 已提交
5790
static int __init rtl8169_init_module(void)
L
Linus Torvalds 已提交
5791
{
5792
	return pci_register_driver(&rtl8169_pci_driver);
L
Linus Torvalds 已提交
5793 5794
}

F
Francois Romieu 已提交
5795
static void __exit rtl8169_cleanup_module(void)
L
Linus Torvalds 已提交
5796 5797 5798 5799 5800 5801
{
	pci_unregister_driver(&rtl8169_pci_driver);
}

module_init(rtl8169_init_module);
module_exit(rtl8169_cleanup_module);