Browse Source

[r8169] New rtl8169 family driver

This is a completely rewritten version of the rtl8169 family driver
using the gPXE driver API.
tags/v0.9.6
Marty Connor 15 years ago
parent
commit
85f82f09e9
2 changed files with 2609 additions and 1084 deletions
  1. 2043
    1084
      src/drivers/net/r8169.c
  2. 566
    0
      src/drivers/net/r8169.h

+ 2043
- 1084
src/drivers/net/r8169.c
File diff suppressed because it is too large
View File


+ 566
- 0
src/drivers/net/r8169.h View File

@@ -0,0 +1,566 @@
1
+/*
2
+ * Copyright (c) 2008 Marty Connor <mdc@etherboot.org>
3
+ * Copyright (c) 2008 Entity Cyber, Inc.
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License as
7
+ * published by the Free Software Foundation; either version 2 of the
8
+ * License, or any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful, but
11
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
+ * General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
+ *
19
+ * This driver is based on rtl8169 data sheets and work by:
20
+ *
21
+ * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
22
+ * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
23
+ * Copyright (c) a lot of people too. Please respect their work.
24
+ *
25
+ */
26
+
27
+#ifndef _R8169_H_
28
+#define _R8169_H_
29
+
30
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
31
+
32
+/** FIXME: include/linux/pci_regs.h has these PCI regs, maybe
33
+	   we need such a file in gPXE?
34
+**/
35
+#define  PCI_EXP_DEVCTL	        8	/* Device Control */
36
+#define  PCI_EXP_DEVCTL_READRQ	0x7000	/* Max_Read_Request_Size */
37
+#define  PCI_EXP_LNKCTL		16	/* Link Control */
38
+#define  PCI_EXP_LNKCTL_CLKREQ_EN 0x100	/* Enable clkreq */
39
+#define  PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800  /* Enable No Snoop */
40
+
41
+/** FIXME: update mii.h in src/include/mii.h from Linux sources
42
+	   so we don't have to include these definitiions.
43
+**/
44
+/* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */
45
+#define SPEED_10		10
46
+#define SPEED_100		100
47
+#define SPEED_1000		1000
48
+#define SPEED_2500		2500
49
+#define SPEED_10000		10000
50
+
51
+/* Duplex, half or full. */
52
+#define DUPLEX_HALF		0x00
53
+#define DUPLEX_FULL		0x01
54
+
55
+/* Generic MII registers. */
56
+
57
+#define MII_BMCR            0x00        /* Basic mode control register */
58
+#define MII_BMSR            0x01        /* Basic mode status register  */
59
+#define MII_PHYSID1         0x02        /* PHYS ID 1                   */
60
+#define MII_PHYSID2         0x03        /* PHYS ID 2                   */
61
+#define MII_ADVERTISE       0x04        /* Advertisement control reg   */
62
+#define MII_LPA             0x05        /* Link partner ability reg    */
63
+#define MII_EXPANSION       0x06        /* Expansion register          */
64
+#define MII_CTRL1000        0x09        /* 1000BASE-T control          */
65
+#define MII_STAT1000        0x0a        /* 1000BASE-T status           */
66
+#define MII_ESTATUS	    0x0f	/* Extended Status */
67
+#define MII_DCOUNTER        0x12        /* Disconnect counter          */
68
+#define MII_FCSCOUNTER      0x13        /* False carrier counter       */
69
+#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
70
+#define MII_RERRCOUNTER     0x15        /* Receive error counter       */
71
+#define MII_SREVISION       0x16        /* Silicon revision            */
72
+#define MII_RESV1           0x17        /* Reserved...                 */
73
+#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */
74
+#define MII_PHYADDR         0x19        /* PHY address                 */
75
+#define MII_RESV2           0x1a        /* Reserved...                 */
76
+#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
77
+#define MII_NCONFIG         0x1c        /* Network interface config    */
78
+
79
+/* Basic mode control register. */
80
+#define BMCR_RESV               0x003f  /* Unused...                   */
81
+#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
82
+#define BMCR_CTST               0x0080  /* Collision test              */
83
+#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */
84
+#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */
85
+#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */
86
+#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */
87
+#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */
88
+#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */
89
+#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */
90
+#define BMCR_RESET              0x8000  /* Reset the DP83840           */
91
+
92
+/* Basic mode status register. */
93
+#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */
94
+#define BMSR_JCD                0x0002  /* Jabber detected             */
95
+#define BMSR_LSTATUS            0x0004  /* Link status                 */
96
+#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
97
+#define BMSR_RFAULT             0x0010  /* Remote fault detected       */
98
+#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
99
+#define BMSR_RESV               0x00c0  /* Unused...                   */
100
+#define BMSR_ESTATEN		0x0100	/* Extended Status in R15 */
101
+#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX */
102
+#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX */
103
+#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
104
+#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
105
+#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
106
+#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */
107
+#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */
108
+
109
+#define AUTONEG_DISABLE		0x00
110
+#define AUTONEG_ENABLE		0x01
111
+
112
+#define MII_ADVERTISE           0x04        /* Advertisement control reg   */
113
+#define ADVERTISE_SLCT          0x001f  /* Selector bits               */
114
+#define ADVERTISE_CSMA          0x0001  /* Only selector supported     */
115
+#define ADVERTISE_10HALF        0x0020  /* Try for 10mbps half-duplex  */
116
+#define ADVERTISE_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */
117
+#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
118
+#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */
119
+#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
120
+#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
121
+#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
122
+#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
123
+#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
124
+#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
125
+#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
126
+#define ADVERTISE_RESV          0x1000  /* Unused...                   */
127
+#define ADVERTISE_RFAULT        0x2000  /* Say we can detect faults    */
128
+#define ADVERTISE_LPACK         0x4000  /* Ack link partners response  */
129
+#define ADVERTISE_NPAGE         0x8000  /* Next page bit               */
130
+#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \
131
+			ADVERTISE_CSMA)
132
+#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \
133
+		       ADVERTISE_100HALF | ADVERTISE_100FULL)
134
+
135
+/* 1000BASE-T Control register */
136
+#define ADVERTISE_1000FULL      0x0200  /* Advertise 1000BASE-T full duplex */
137
+#define ADVERTISE_1000HALF      0x0100  /* Advertise 1000BASE-T half duplex */
138
+
139
+/* MAC address length */
140
+#define MAC_ADDR_LEN	6
141
+
142
+#define MAX_READ_REQUEST_SHIFT	12
143
+#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
144
+#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
145
+#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
146
+#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
147
+#define RxPacketMaxSize	0x3FE8	/* 16K - 1 - ETH_HLEN - VLAN - CRC... */
148
+#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
149
+#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
150
+
151
+#define R8169_REGS_SIZE		256
152
+#define R8169_NAPI_WEIGHT	64
153
+#define NUM_TX_DESC	8	/* Number of Tx descriptor registers */
154
+#define NUM_RX_DESC	8	/* Number of Rx descriptor registers */
155
+#define RX_BUF_SIZE	1536	/* Rx Buffer size */
156
+#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
157
+#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
158
+
159
+#define TX_RING_ALIGN		256
160
+#define RX_RING_ALIGN		256
161
+
162
+#define RTL8169_TX_TIMEOUT	(6*HZ)
163
+#define RTL8169_PHY_TIMEOUT	(10*HZ)
164
+
165
+#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
166
+#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
167
+#define RTL_EEPROM_SIG_ADDR	0x0000
168
+
169
+/* write/read MMIO register */
170
+#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
171
+#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
172
+#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
173
+#define RTL_R8(reg)		readb (ioaddr + (reg))
174
+#define RTL_R16(reg)		readw (ioaddr + (reg))
175
+#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
176
+
177
+enum mac_version {
178
+	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
179
+	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
180
+	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
181
+	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
182
+	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
183
+	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
184
+	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
185
+	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
186
+	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
187
+	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
188
+	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
189
+	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
190
+	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
191
+	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
192
+	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
193
+	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
194
+	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
195
+	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
196
+	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
197
+	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
198
+	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
199
+	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
200
+	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
201
+	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
202
+	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
203
+};
204
+
205
+#define _R(NAME,MAC,MASK) \
206
+	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
207
+
208
+static const struct {
209
+	const char *name;
210
+	u8 mac_version;
211
+	u32 RxConfigMask;	/* Clears the bits supported by this chip */
212
+} rtl_chip_info[] = {
213
+	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
214
+	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
215
+	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
216
+	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
217
+	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
218
+	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
219
+	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
220
+	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
221
+	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
222
+	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
223
+	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
224
+	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
225
+	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
226
+	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
227
+	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
228
+	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
229
+	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
230
+	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
231
+	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
232
+	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
233
+	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
234
+	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
235
+	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
236
+	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
237
+	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880)  // PCI-E
238
+};
239
+#undef _R
240
+
241
+enum cfg_version {
242
+	RTL_CFG_0 = 0x00,
243
+	RTL_CFG_1,
244
+	RTL_CFG_2
245
+};
246
+
247
+#if 0
248
+/** Device Table from Linux Driver **/
249
+static struct pci_device_id rtl8169_pci_tbl[] = {
250
+	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
251
+	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
252
+	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
253
+	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
254
+	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
255
+	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
256
+	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
257
+	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
258
+	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
259
+		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
260
+	{ 0x0001,				0x8168,
261
+		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
262
+	{0,},
263
+};
264
+#endif
265
+
266
+enum rtl_registers {
267
+	MAC0		= 0,	/* Ethernet hardware address. */
268
+	MAC4		= 4,
269
+	MAR0		= 8,	/* Multicast filter. */
270
+	CounterAddrLow		= 0x10,
271
+	CounterAddrHigh		= 0x14,
272
+	TxDescStartAddrLow	= 0x20,
273
+	TxDescStartAddrHigh	= 0x24,
274
+	TxHDescStartAddrLow	= 0x28,
275
+	TxHDescStartAddrHigh	= 0x2c,
276
+	FLASH		= 0x30,
277
+	ERSR		= 0x36,
278
+	ChipCmd		= 0x37,
279
+	TxPoll		= 0x38,
280
+	IntrMask	= 0x3c,
281
+	IntrStatus	= 0x3e,
282
+	TxConfig	= 0x40,
283
+	RxConfig	= 0x44,
284
+	RxMissed	= 0x4c,
285
+	Cfg9346		= 0x50,
286
+	Config0		= 0x51,
287
+	Config1		= 0x52,
288
+	Config2		= 0x53,
289
+	Config3		= 0x54,
290
+	Config4		= 0x55,
291
+	Config5		= 0x56,
292
+	MultiIntr	= 0x5c,
293
+	PHYAR		= 0x60,
294
+	PHYstatus	= 0x6c,
295
+	RxMaxSize	= 0xda,
296
+	CPlusCmd	= 0xe0,
297
+	IntrMitigate	= 0xe2,
298
+	RxDescAddrLow	= 0xe4,
299
+	RxDescAddrHigh	= 0xe8,
300
+	EarlyTxThres	= 0xec,
301
+	FuncEvent	= 0xf0,
302
+	FuncEventMask	= 0xf4,
303
+	FuncPresetState	= 0xf8,
304
+	FuncForceEvent	= 0xfc,
305
+};
306
+
307
+enum rtl8110_registers {
308
+	TBICSR			= 0x64,
309
+	TBI_ANAR		= 0x68,
310
+	TBI_LPAR		= 0x6a,
311
+};
312
+
313
+enum rtl8168_8101_registers {
314
+	CSIDR			= 0x64,
315
+	CSIAR			= 0x68,
316
+#define	CSIAR_FLAG			0x80000000
317
+#define	CSIAR_WRITE_CMD			0x80000000
318
+#define	CSIAR_BYTE_ENABLE		0x0f
319
+#define	CSIAR_BYTE_ENABLE_SHIFT		12
320
+#define	CSIAR_ADDR_MASK			0x0fff
321
+
322
+	EPHYAR			= 0x80,
323
+#define	EPHYAR_FLAG			0x80000000
324
+#define	EPHYAR_WRITE_CMD		0x80000000
325
+#define	EPHYAR_REG_MASK			0x1f
326
+#define	EPHYAR_REG_SHIFT		16
327
+#define	EPHYAR_DATA_MASK		0xffff
328
+	DBG_REG			= 0xd1,
329
+#define	FIX_NAK_1			(1 << 4)
330
+#define	FIX_NAK_2			(1 << 3)
331
+};
332
+
333
+enum rtl_register_content {
334
+	/* InterruptStatusBits */
335
+	SYSErr		= 0x8000,
336
+	PCSTimeout	= 0x4000,
337
+	SWInt		= 0x0100,
338
+	TxDescUnavail	= 0x0080,
339
+	RxFIFOOver	= 0x0040,
340
+	LinkChg		= 0x0020,
341
+	RxOverflow	= 0x0010,
342
+	TxErr		= 0x0008,
343
+	TxOK		= 0x0004,
344
+	RxErr		= 0x0002,
345
+	RxOK		= 0x0001,
346
+
347
+	/* RxStatusDesc */
348
+	RxFOVF	= (1 << 23),
349
+	RxRWT	= (1 << 22),
350
+	RxRES	= (1 << 21),
351
+	RxRUNT	= (1 << 20),
352
+	RxCRC	= (1 << 19),
353
+
354
+	/* ChipCmdBits */
355
+	CmdReset	= 0x10,
356
+	CmdRxEnb	= 0x08,
357
+	CmdTxEnb	= 0x04,
358
+	RxBufEmpty	= 0x01,
359
+
360
+	/* TXPoll register p.5 */
361
+	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
362
+	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
363
+	FSWInt		= 0x01,		/* Forced software interrupt */
364
+
365
+	/* Cfg9346Bits */
366
+	Cfg9346_Lock	= 0x00,
367
+	Cfg9346_Unlock	= 0xc0,
368
+
369
+	/* rx_mode_bits */
370
+	AcceptErr	= 0x20,
371
+	AcceptRunt	= 0x10,
372
+	AcceptBroadcast	= 0x08,
373
+	AcceptMulticast	= 0x04,
374
+	AcceptMyPhys	= 0x02,
375
+	AcceptAllPhys	= 0x01,
376
+
377
+	/* RxConfigBits */
378
+	RxCfgFIFOShift	= 13,
379
+	RxCfgDMAShift	=  8,
380
+
381
+	/* TxConfigBits */
382
+	TxInterFrameGapShift = 24,
383
+	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
384
+
385
+	/* Config1 register p.24 */
386
+	LEDS1		= (1 << 7),
387
+	LEDS0		= (1 << 6),
388
+	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
389
+	Speed_down	= (1 << 4),
390
+	MEMMAP		= (1 << 3),
391
+	IOMAP		= (1 << 2),
392
+	VPD		= (1 << 1),
393
+	PMEnable	= (1 << 0),	/* Power Management Enable */
394
+
395
+	/* Config2 register p. 25 */
396
+	PCI_Clock_66MHz = 0x01,
397
+	PCI_Clock_33MHz = 0x00,
398
+
399
+	/* Config3 register p.25 */
400
+	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
401
+	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
402
+	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
403
+
404
+	/* Config5 register p.27 */
405
+	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
406
+	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
407
+	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
408
+	LanWake		= (1 << 1),	/* LanWake enable/disable */
409
+	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
410
+
411
+	/* TBICSR p.28 */
412
+	TBIReset	= 0x80000000,
413
+	TBILoopback	= 0x40000000,
414
+	TBINwEnable	= 0x20000000,
415
+	TBINwRestart	= 0x10000000,
416
+	TBILinkOk	= 0x02000000,
417
+	TBINwComplete	= 0x01000000,
418
+
419
+	/* CPlusCmd p.31 */
420
+	EnableBist	= (1 << 15),	// 8168 8101
421
+	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
422
+	Normal_mode	= (1 << 13),	// unused
423
+	Force_half_dup	= (1 << 12),	// 8168 8101
424
+	Force_rxflow_en	= (1 << 11),	// 8168 8101
425
+	Force_txflow_en	= (1 << 10),	// 8168 8101
426
+	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
427
+	ASF		= (1 << 8),	// 8168 8101
428
+	PktCntrDisable	= (1 << 7),	// 8168 8101
429
+	Mac_dbgo_sel	= 0x001c,	// 8168
430
+	RxVlan		= (1 << 6),
431
+	RxChkSum	= (1 << 5),
432
+	PCIDAC		= (1 << 4),
433
+	PCIMulRW	= (1 << 3),
434
+	INTT_0		= 0x0000,	// 8168
435
+	INTT_1		= 0x0001,	// 8168
436
+	INTT_2		= 0x0002,	// 8168
437
+	INTT_3		= 0x0003,	// 8168
438
+
439
+	/* rtl8169_PHYstatus */
440
+	TBI_Enable	= 0x80,
441
+	TxFlowCtrl	= 0x40,
442
+	RxFlowCtrl	= 0x20,
443
+	_1000bpsF	= 0x10,
444
+	_100bps		= 0x08,
445
+	_10bps		= 0x04,
446
+	LinkStatus	= 0x02,
447
+	FullDup		= 0x01,
448
+
449
+	/* _TBICSRBit */
450
+	TBILinkOK	= 0x02000000,
451
+
452
+	/* DumpCounterCommand */
453
+	CounterDump	= 0x8,
454
+};
455
+
456
+enum desc_status_bit {
457
+	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
458
+	RingEnd		= (1 << 30), /* End of descriptor ring */
459
+	FirstFrag	= (1 << 29), /* First segment of a packet */
460
+	LastFrag	= (1 << 28), /* Final segment of a packet */
461
+
462
+	/* Tx private */
463
+	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
464
+	MSSShift	= 16,        /* MSS value position */
465
+	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
466
+	IPCS		= (1 << 18), /* Calculate IP checksum */
467
+	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
468
+	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
469
+	TxVlanTag	= (1 << 17), /* Add VLAN tag */
470
+
471
+	/* Rx private */
472
+	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
473
+	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
474
+
475
+#define RxProtoUDP	(PID1)
476
+#define RxProtoTCP	(PID0)
477
+#define RxProtoIP	(PID1 | PID0)
478
+#define RxProtoMask	RxProtoIP
479
+
480
+	IPFail		= (1 << 16), /* IP checksum failed */
481
+	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
482
+	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
483
+	RxVlanTag	= (1 << 16), /* VLAN tag available */
484
+};
485
+
486
+#define RsvdMask	0x3fffc000
487
+
488
+struct TxDesc {
489
+	volatile uint32_t opts1;
490
+	volatile uint32_t opts2;
491
+	volatile uint32_t addr_lo;
492
+	volatile uint32_t addr_hi;
493
+};
494
+
495
+struct RxDesc {
496
+	volatile uint32_t opts1;
497
+	volatile uint32_t opts2;
498
+	volatile uint32_t addr_lo;
499
+	volatile uint32_t addr_hi;
500
+};
501
+
502
+enum features {
503
+	RTL_FEATURE_WOL		= (1 << 0),
504
+	RTL_FEATURE_MSI		= (1 << 1),
505
+	RTL_FEATURE_GMII	= (1 << 2),
506
+};
507
+
508
+static void rtl_hw_start_8169(struct net_device *);
509
+static void rtl_hw_start_8168(struct net_device *);
510
+static void rtl_hw_start_8101(struct net_device *);
511
+
512
+struct rtl8169_private {
513
+
514
+	struct pci_device *pci_dev;
515
+	struct net_device *netdev;
516
+	uint8_t *hw_addr;
517
+	void *mmio_addr;
518
+	uint32_t irqno;
519
+
520
+	int chipset;
521
+	int mac_version;
522
+	int cfg_index;
523
+	u16 intr_event;
524
+
525
+	struct io_buffer *tx_iobuf[NUM_TX_DESC];
526
+	struct io_buffer *rx_iobuf[NUM_RX_DESC];
527
+
528
+	struct TxDesc *tx_base;
529
+	struct RxDesc *rx_base;
530
+
531
+	uint32_t tx_curr;
532
+	uint32_t rx_curr;
533
+
534
+	uint32_t tx_tail;
535
+
536
+	uint32_t tx_fill_ctr;
537
+
538
+	u16 cp_cmd;
539
+
540
+	int phy_auto_nego_reg;
541
+	int phy_1000_ctrl_reg;
542
+
543
+	int ( *set_speed ) (struct net_device *, u8 autoneg, u16 speed, u8 duplex );
544
+	void ( *phy_reset_enable ) ( void *ioaddr );
545
+	void ( *hw_start ) ( struct net_device * );
546
+	unsigned int ( *phy_reset_pending ) ( void *ioaddr );
547
+	unsigned int ( *link_ok ) ( void *ioaddr );
548
+
549
+	int pcie_cap;
550
+
551
+	unsigned features;
552
+
553
+};
554
+
555
+static const unsigned int rtl8169_rx_config =
556
+	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
557
+
558
+#endif /* _R8169_H_ */
559
+
560
+/*
561
+ * Local variables:
562
+ *  c-basic-offset: 8
563
+ *  c-indent-level: 8
564
+ *  tab-width: 8
565
+ * End:
566
+ */

Loading…
Cancel
Save