|
|
1.1 root 1: /*
2: * Copyright (c) 2008 Marty Connor <[email protected]>
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 <[email protected]>
22: * Copyright (c) 2003 - 2007 Francois Romieu <[email protected]>
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 iPXE?
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: u16 intr_event;
444:
445: struct io_buffer *tx_iobuf[NUM_TX_DESC];
446: struct io_buffer *rx_iobuf[NUM_RX_DESC];
447:
448: struct TxDesc *tx_base;
449: struct RxDesc *rx_base;
450:
451: uint32_t tx_curr;
452: uint32_t rx_curr;
453:
454: uint32_t tx_tail;
455:
456: uint32_t tx_fill_ctr;
457:
458: u16 cp_cmd;
459:
460: int phy_auto_nego_reg;
461: int phy_1000_ctrl_reg;
462:
463: int ( *set_speed ) (struct net_device *, u8 autoneg, u16 speed, u8 duplex );
464: void ( *phy_reset_enable ) ( void *ioaddr );
465: void ( *hw_start ) ( struct net_device * );
466: unsigned int ( *phy_reset_pending ) ( void *ioaddr );
467: unsigned int ( *link_ok ) ( void *ioaddr );
468:
469: int pcie_cap;
470:
471: unsigned features;
472:
473: };
474:
475: static const unsigned int rtl8169_rx_config =
476: (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
477:
478: #endif /* _R8169_H_ */
479:
480: /*
481: * Local variables:
482: * c-basic-offset: 8
483: * c-indent-level: 8
484: * tab-width: 8
485: * End:
486: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.