Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (c) 2008 Marty Connor <mdc (at) 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 (at) realtek.com.tw>
     22  * Copyright (c) 2003 - 2007 Francois Romieu <romieu (at) fr.zoreil.com>
     23  * Copyright (c) a lot of people too. Please respect their work.
     24  *
     25  */
     26 
     27 FILE_LICENCE ( GPL2_OR_LATER );
     28 
     29 #ifndef _R8169_H_
     30 #define _R8169_H_
     31 
     32 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
     33 
     34 /** FIXME: include/linux/pci_regs.h has these PCI regs, maybe
     35 	   we need such a file in gPXE?
     36 **/
     37 #define  PCI_EXP_DEVCTL	        8	/* Device Control */
     38 #define  PCI_EXP_DEVCTL_READRQ	0x7000	/* Max_Read_Request_Size */
     39 #define  PCI_EXP_LNKCTL		16	/* Link Control */
     40 #define  PCI_EXP_LNKCTL_CLKREQ_EN 0x100	/* Enable clkreq */
     41 #define  PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800  /* Enable No Snoop */
     42 
     43 /** FIXME: update mii.h in src/include/mii.h from Linux sources
     44 	   so we don't have to include these definitiions.
     45 **/
     46 /* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */
     47 #define SPEED_10		10
     48 #define SPEED_100		100
     49 #define SPEED_1000		1000
     50 #define SPEED_2500		2500
     51 #define SPEED_10000		10000
     52 
     53 /* Duplex, half or full. */
     54 #define DUPLEX_HALF		0x00
     55 #define DUPLEX_FULL		0x01
     56 
     57 #define AUTONEG_DISABLE		0x00
     58 #define AUTONEG_ENABLE		0x01
     59 
     60 /* MAC address length */
     61 #define MAC_ADDR_LEN	6
     62 
     63 #define MAX_READ_REQUEST_SHIFT	12
     64 #define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
     65 #define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
     66 #define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
     67 #define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
     68 #define RxPacketMaxSize	0x3FE8	/* 16K - 1 - ETH_HLEN - VLAN - CRC... */
     69 #define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
     70 #define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
     71 
     72 #define R8169_REGS_SIZE		256
     73 #define R8169_NAPI_WEIGHT	64
     74 #define NUM_TX_DESC	8	/* Number of Tx descriptor registers */
     75 #define NUM_RX_DESC	8	/* Number of Rx descriptor registers */
     76 #define RX_BUF_SIZE	1536	/* Rx Buffer size */
     77 #define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
     78 #define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
     79 
     80 #define TX_RING_ALIGN		256
     81 #define RX_RING_ALIGN		256
     82 
     83 #define RTL8169_TX_TIMEOUT	(6*HZ)
     84 #define RTL8169_PHY_TIMEOUT	(10*HZ)
     85 
     86 #define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
     87 #define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
     88 #define RTL_EEPROM_SIG_ADDR	0x0000
     89 
     90 /* write/read MMIO register */
     91 #define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
     92 #define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
     93 #define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
     94 #define RTL_R8(reg)		readb (ioaddr + (reg))
     95 #define RTL_R16(reg)		readw (ioaddr + (reg))
     96 #define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
     97 
     98 enum mac_version {
     99 	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
    100 	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
    101 	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
    102 	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
    103 	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
    104 	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
    105 	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
    106 	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
    107 	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
    108 	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
    109 	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
    110 	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
    111 	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
    112 	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
    113 	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
    114 	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
    115 	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
    116 	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
    117 	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
    118 	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
    119 	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
    120 	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
    121 	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
    122 	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
    123 	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
    124 };
    125 
    126 #define _R(NAME,MAC,MASK) \
    127 	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
    128 
    129 static const struct {
    130 	const char *name;
    131 	u8 mac_version;
    132 	u32 RxConfigMask;	/* Clears the bits supported by this chip */
    133 } rtl_chip_info[] = {
    134 	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
    135 	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
    136 	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
    137 	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
    138 	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
    139 	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
    140 	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
    141 	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
    142 	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
    143 	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
    144 	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
    145 	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
    146 	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
    147 	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
    148 	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
    149 	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
    150 	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
    151 	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
    152 	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
    153 	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
    154 	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
    155 	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
    156 	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
    157 	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
    158 	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880)  // PCI-E
    159 };
    160 #undef _R
    161 
    162 enum cfg_version {
    163 	RTL_CFG_0 = 0x00,
    164 	RTL_CFG_1,
    165 	RTL_CFG_2
    166 };
    167 
    168 #if 0
    169 /** Device Table from Linux Driver **/
    170 static struct pci_device_id rtl8169_pci_tbl[] = {
    171 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
    172 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
    173 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
    174 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
    175 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
    176 	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
    177 	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
    178 	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
    179 	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
    180 		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
    181 	{ 0x0001,				0x8168,
    182 		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
    183 	{0,},
    184 };
    185 #endif
    186 
    187 enum rtl_registers {
    188 	MAC0		= 0,	/* Ethernet hardware address. */
    189 	MAC4		= 4,
    190 	MAR0		= 8,	/* Multicast filter. */
    191 	CounterAddrLow		= 0x10,
    192 	CounterAddrHigh		= 0x14,
    193 	TxDescStartAddrLow	= 0x20,
    194 	TxDescStartAddrHigh	= 0x24,
    195 	TxHDescStartAddrLow	= 0x28,
    196 	TxHDescStartAddrHigh	= 0x2c,
    197 	FLASH		= 0x30,
    198 	ERSR		= 0x36,
    199 	ChipCmd		= 0x37,
    200 	TxPoll		= 0x38,
    201 	IntrMask	= 0x3c,
    202 	IntrStatus	= 0x3e,
    203 	TxConfig	= 0x40,
    204 	RxConfig	= 0x44,
    205 	RxMissed	= 0x4c,
    206 	Cfg9346		= 0x50,
    207 	Config0		= 0x51,
    208 	Config1		= 0x52,
    209 	Config2		= 0x53,
    210 	Config3		= 0x54,
    211 	Config4		= 0x55,
    212 	Config5		= 0x56,
    213 	MultiIntr	= 0x5c,
    214 	PHYAR		= 0x60,
    215 	PHYstatus	= 0x6c,
    216 	RxMaxSize	= 0xda,
    217 	CPlusCmd	= 0xe0,
    218 	IntrMitigate	= 0xe2,
    219 	RxDescAddrLow	= 0xe4,
    220 	RxDescAddrHigh	= 0xe8,
    221 	EarlyTxThres	= 0xec,
    222 	FuncEvent	= 0xf0,
    223 	FuncEventMask	= 0xf4,
    224 	FuncPresetState	= 0xf8,
    225 	FuncForceEvent	= 0xfc,
    226 };
    227 
    228 enum rtl8110_registers {
    229 	TBICSR			= 0x64,
    230 	TBI_ANAR		= 0x68,
    231 	TBI_LPAR		= 0x6a,
    232 };
    233 
    234 enum rtl8168_8101_registers {
    235 	CSIDR			= 0x64,
    236 	CSIAR			= 0x68,
    237 #define	CSIAR_FLAG			0x80000000
    238 #define	CSIAR_WRITE_CMD			0x80000000
    239 #define	CSIAR_BYTE_ENABLE		0x0f
    240 #define	CSIAR_BYTE_ENABLE_SHIFT		12
    241 #define	CSIAR_ADDR_MASK			0x0fff
    242 
    243 	EPHYAR			= 0x80,
    244 #define	EPHYAR_FLAG			0x80000000
    245 #define	EPHYAR_WRITE_CMD		0x80000000
    246 #define	EPHYAR_REG_MASK			0x1f
    247 #define	EPHYAR_REG_SHIFT		16
    248 #define	EPHYAR_DATA_MASK		0xffff
    249 	DBG_REG			= 0xd1,
    250 #define	FIX_NAK_1			(1 << 4)
    251 #define	FIX_NAK_2			(1 << 3)
    252 };
    253 
    254 enum rtl_register_content {
    255 	/* InterruptStatusBits */
    256 	SYSErr		= 0x8000,
    257 	PCSTimeout	= 0x4000,
    258 	SWInt		= 0x0100,
    259 	TxDescUnavail	= 0x0080,
    260 	RxFIFOOver	= 0x0040,
    261 	LinkChg		= 0x0020,
    262 	RxOverflow	= 0x0010,
    263 	TxErr		= 0x0008,
    264 	TxOK		= 0x0004,
    265 	RxErr		= 0x0002,
    266 	RxOK		= 0x0001,
    267 
    268 	/* RxStatusDesc */
    269 	RxFOVF	= (1 << 23),
    270 	RxRWT	= (1 << 22),
    271 	RxRES	= (1 << 21),
    272 	RxRUNT	= (1 << 20),
    273 	RxCRC	= (1 << 19),
    274 
    275 	/* ChipCmdBits */
    276 	CmdReset	= 0x10,
    277 	CmdRxEnb	= 0x08,
    278 	CmdTxEnb	= 0x04,
    279 	RxBufEmpty	= 0x01,
    280 
    281 	/* TXPoll register p.5 */
    282 	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
    283 	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
    284 	FSWInt		= 0x01,		/* Forced software interrupt */
    285 
    286 	/* Cfg9346Bits */
    287 	Cfg9346_Lock	= 0x00,
    288 	Cfg9346_Unlock	= 0xc0,
    289 
    290 	/* rx_mode_bits */
    291 	AcceptErr	= 0x20,
    292 	AcceptRunt	= 0x10,
    293 	AcceptBroadcast	= 0x08,
    294 	AcceptMulticast	= 0x04,
    295 	AcceptMyPhys	= 0x02,
    296 	AcceptAllPhys	= 0x01,
    297 
    298 	/* RxConfigBits */
    299 	RxCfgFIFOShift	= 13,
    300 	RxCfgDMAShift	=  8,
    301 
    302 	/* TxConfigBits */
    303 	TxInterFrameGapShift = 24,
    304 	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
    305 
    306 	/* Config1 register p.24 */
    307 	LEDS1		= (1 << 7),
    308 	LEDS0		= (1 << 6),
    309 	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
    310 	Speed_down	= (1 << 4),
    311 	MEMMAP		= (1 << 3),
    312 	IOMAP		= (1 << 2),
    313 	VPD		= (1 << 1),
    314 	PMEnable	= (1 << 0),	/* Power Management Enable */
    315 
    316 	/* Config2 register p. 25 */
    317 	PCI_Clock_66MHz = 0x01,
    318 	PCI_Clock_33MHz = 0x00,
    319 
    320 	/* Config3 register p.25 */
    321 	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
    322 	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
    323 	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
    324 
    325 	/* Config5 register p.27 */
    326 	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
    327 	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
    328 	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
    329 	LanWake		= (1 << 1),	/* LanWake enable/disable */
    330 	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
    331 
    332 	/* TBICSR p.28 */
    333 	TBIReset	= 0x80000000,
    334 	TBILoopback	= 0x40000000,
    335 	TBINwEnable	= 0x20000000,
    336 	TBINwRestart	= 0x10000000,
    337 	TBILinkOk	= 0x02000000,
    338 	TBINwComplete	= 0x01000000,
    339 
    340 	/* CPlusCmd p.31 */
    341 	EnableBist	= (1 << 15),	// 8168 8101
    342 	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
    343 	Normal_mode	= (1 << 13),	// unused
    344 	Force_half_dup	= (1 << 12),	// 8168 8101
    345 	Force_rxflow_en	= (1 << 11),	// 8168 8101
    346 	Force_txflow_en	= (1 << 10),	// 8168 8101
    347 	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
    348 	ASF		= (1 << 8),	// 8168 8101
    349 	PktCntrDisable	= (1 << 7),	// 8168 8101
    350 	Mac_dbgo_sel	= 0x001c,	// 8168
    351 	RxVlan		= (1 << 6),
    352 	RxChkSum	= (1 << 5),
    353 	PCIDAC		= (1 << 4),
    354 	PCIMulRW	= (1 << 3),
    355 	INTT_0		= 0x0000,	// 8168
    356 	INTT_1		= 0x0001,	// 8168
    357 	INTT_2		= 0x0002,	// 8168
    358 	INTT_3		= 0x0003,	// 8168
    359 
    360 	/* rtl8169_PHYstatus */
    361 	TBI_Enable	= 0x80,
    362 	TxFlowCtrl	= 0x40,
    363 	RxFlowCtrl	= 0x20,
    364 	_1000bpsF	= 0x10,
    365 	_100bps		= 0x08,
    366 	_10bps		= 0x04,
    367 	LinkStatus	= 0x02,
    368 	FullDup		= 0x01,
    369 
    370 	/* _TBICSRBit */
    371 	TBILinkOK	= 0x02000000,
    372 
    373 	/* DumpCounterCommand */
    374 	CounterDump	= 0x8,
    375 };
    376 
    377 enum desc_status_bit {
    378 	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
    379 	RingEnd		= (1 << 30), /* End of descriptor ring */
    380 	FirstFrag	= (1 << 29), /* First segment of a packet */
    381 	LastFrag	= (1 << 28), /* Final segment of a packet */
    382 
    383 	/* Tx private */
    384 	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
    385 	MSSShift	= 16,        /* MSS value position */
    386 	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
    387 	IPCS		= (1 << 18), /* Calculate IP checksum */
    388 	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
    389 	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
    390 	TxVlanTag	= (1 << 17), /* Add VLAN tag */
    391 
    392 	/* Rx private */
    393 	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
    394 	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
    395 
    396 #define RxProtoUDP	(PID1)
    397 #define RxProtoTCP	(PID0)
    398 #define RxProtoIP	(PID1 | PID0)
    399 #define RxProtoMask	RxProtoIP
    400 
    401 	IPFail		= (1 << 16), /* IP checksum failed */
    402 	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
    403 	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
    404 	RxVlanTag	= (1 << 16), /* VLAN tag available */
    405 };
    406 
    407 #define RsvdMask	0x3fffc000
    408 
    409 struct TxDesc {
    410 	volatile uint32_t opts1;
    411 	volatile uint32_t opts2;
    412 	volatile uint32_t addr_lo;
    413 	volatile uint32_t addr_hi;
    414 };
    415 
    416 struct RxDesc {
    417 	volatile uint32_t opts1;
    418 	volatile uint32_t opts2;
    419 	volatile uint32_t addr_lo;
    420 	volatile uint32_t addr_hi;
    421 };
    422 
    423 enum features {
    424 	RTL_FEATURE_WOL		= (1 << 0),
    425 	RTL_FEATURE_MSI		= (1 << 1),
    426 	RTL_FEATURE_GMII	= (1 << 2),
    427 };
    428 
    429 static void rtl_hw_start_8169(struct net_device *);
    430 static void rtl_hw_start_8168(struct net_device *);
    431 static void rtl_hw_start_8101(struct net_device *);
    432 
    433 struct rtl8169_private {
    434 
    435 	struct pci_device *pci_dev;
    436 	struct net_device *netdev;
    437 	uint8_t *hw_addr;
    438 	void *mmio_addr;
    439 	uint32_t irqno;
    440 
    441 	int chipset;
    442 	int mac_version;
    443 	int cfg_index;
    444 	u16 intr_event;
    445 
    446 	struct io_buffer *tx_iobuf[NUM_TX_DESC];
    447 	struct io_buffer *rx_iobuf[NUM_RX_DESC];
    448 
    449 	struct TxDesc *tx_base;
    450 	struct RxDesc *rx_base;
    451 
    452 	uint32_t tx_curr;
    453 	uint32_t rx_curr;
    454 
    455 	uint32_t tx_tail;
    456 
    457 	uint32_t tx_fill_ctr;
    458 
    459 	u16 cp_cmd;
    460 
    461 	int phy_auto_nego_reg;
    462 	int phy_1000_ctrl_reg;
    463 
    464 	int ( *set_speed ) (struct net_device *, u8 autoneg, u16 speed, u8 duplex );
    465 	void ( *phy_reset_enable ) ( void *ioaddr );
    466 	void ( *hw_start ) ( struct net_device * );
    467 	unsigned int ( *phy_reset_pending ) ( void *ioaddr );
    468 	unsigned int ( *link_ok ) ( void *ioaddr );
    469 
    470 	int pcie_cap;
    471 
    472 	unsigned features;
    473 
    474 };
    475 
    476 static const unsigned int rtl8169_rx_config =
    477 	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
    478 
    479 #endif /* _R8169_H_ */
    480 
    481 /*
    482  * Local variables:
    483  *  c-basic-offset: 8
    484  *  c-indent-level: 8
    485  *  tab-width: 8
    486  * End:
    487  */
    488