2 * Copyright (c) 2008 Marty Connor <mdc@etherboot.org>
3 * Copyright (c) 2008 Entity Cyber, Inc.
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.
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.
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.
19 * This driver is based on rtl8169 data sheets and work by:
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.
27 FILE_LICENCE ( GPL2_OR_LATER
);
32 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
34 /** FIXME: include/linux/pci_regs.h has these PCI regs, maybe
35 we need such a file in gPXE?
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 */
43 /** FIXME: update mii.h in src/include/mii.h from Linux sources
44 so we don't have to include these definitiions.
46 /* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */
49 #define SPEED_1000 1000
50 #define SPEED_2500 2500
51 #define SPEED_10000 10000
53 /* Duplex, half or full. */
54 #define DUPLEX_HALF 0x00
55 #define DUPLEX_FULL 0x01
57 #define AUTONEG_DISABLE 0x00
58 #define AUTONEG_ENABLE 0x01
60 /* MAC address length */
61 #define MAC_ADDR_LEN 6
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 */
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))
80 #define TX_RING_ALIGN 256
81 #define RX_RING_ALIGN 256
83 #define RTL8169_TX_TIMEOUT (6*HZ)
84 #define RTL8169_PHY_TIMEOUT (10*HZ)
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
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)))
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
126 #define _R(NAME,MAC,MASK) \
127 { .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
129 static const struct {
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
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
},
182 PCI_ANY_ID
, 0x2410, 0, 0, RTL_CFG_2
},
188 MAC0
= 0, /* Ethernet hardware address. */
190 MAR0
= 8, /* Multicast filter. */
191 CounterAddrLow
= 0x10,
192 CounterAddrHigh
= 0x14,
193 TxDescStartAddrLow
= 0x20,
194 TxDescStartAddrHigh
= 0x24,
195 TxHDescStartAddrLow
= 0x28,
196 TxHDescStartAddrHigh
= 0x2c,
219 RxDescAddrLow
= 0xe4,
220 RxDescAddrHigh
= 0xe8,
223 FuncEventMask
= 0xf4,
224 FuncPresetState
= 0xf8,
225 FuncForceEvent
= 0xfc,
228 enum rtl8110_registers
{
234 enum rtl8168_8101_registers
{
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
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
250 #define FIX_NAK_1 (1 << 4)
251 #define FIX_NAK_2 (1 << 3)
254 enum rtl_register_content
{
255 /* InterruptStatusBits */
259 TxDescUnavail
= 0x0080,
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 */
288 Cfg9346_Unlock
= 0xc0,
293 AcceptBroadcast
= 0x08,
294 AcceptMulticast
= 0x04,
296 AcceptAllPhys
= 0x01,
303 TxInterFrameGapShift
= 24,
304 TxDMAShift
= 8, /* DMA burst value (0-7) is shift this many bits */
306 /* Config1 register p.24 */
309 MSIEnable
= (1 << 5), /* Enable Message Signaled Interrupt */
310 Speed_down
= (1 << 4),
314 PMEnable
= (1 << 0), /* Power Management Enable */
316 /* Config2 register p. 25 */
317 PCI_Clock_66MHz
= 0x01,
318 PCI_Clock_33MHz
= 0x00,
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 */
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# */
333 TBIReset
= 0x80000000,
334 TBILoopback
= 0x40000000,
335 TBINwEnable
= 0x20000000,
336 TBINwRestart
= 0x10000000,
337 TBILinkOk
= 0x02000000,
338 TBINwComplete
= 0x01000000,
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
355 INTT_0
= 0x0000, // 8168
356 INTT_1
= 0x0001, // 8168
357 INTT_2
= 0x0002, // 8168
358 INTT_3
= 0x0003, // 8168
360 /* rtl8169_PHYstatus */
371 TBILinkOK
= 0x02000000,
373 /* DumpCounterCommand */
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 */
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 */
393 PID1
= (1 << 18), /* Protocol ID bit 1/2 */
394 PID0
= (1 << 17), /* Protocol ID bit 2/2 */
396 #define RxProtoUDP (PID1)
397 #define RxProtoTCP (PID0)
398 #define RxProtoIP (PID1 | PID0)
399 #define RxProtoMask RxProtoIP
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 */
407 #define RsvdMask 0x3fffc000
410 volatile uint32_t opts1
;
411 volatile uint32_t opts2
;
412 volatile uint32_t addr_lo
;
413 volatile uint32_t addr_hi
;
417 volatile uint32_t opts1
;
418 volatile uint32_t opts2
;
419 volatile uint32_t addr_lo
;
420 volatile uint32_t addr_hi
;
424 RTL_FEATURE_WOL
= (1 << 0),
425 RTL_FEATURE_MSI
= (1 << 1),
426 RTL_FEATURE_GMII
= (1 << 2),
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
*);
433 struct rtl8169_private
{
435 struct pci_device
*pci_dev
;
436 struct net_device
*netdev
;
446 struct io_buffer
*tx_iobuf
[NUM_TX_DESC
];
447 struct io_buffer
*rx_iobuf
[NUM_RX_DESC
];
449 struct TxDesc
*tx_base
;
450 struct RxDesc
*rx_base
;
457 uint32_t tx_fill_ctr
;
461 int phy_auto_nego_reg
;
462 int phy_1000_ctrl_reg
;
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
);
476 static const unsigned int rtl8169_rx_config
=
477 (RX_FIFO_THRESH
<< RxCfgFIFOShift
) | (RX_DMA_BURST
<< RxCfgDMAShift
);
479 #endif /* _R8169_H_ */