source: bootcd/isolinux/syslinux-6.03/gpxe/src/drivers/net/r8169.h @ e16e8f2

Last change on this file since e16e8f2 was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 14.0 KB
Line 
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
27FILE_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
98enum 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
129static 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
162enum 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 **/
170static 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
187enum 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
228enum rtl8110_registers {
229        TBICSR                  = 0x64,
230        TBI_ANAR                = 0x68,
231        TBI_LPAR                = 0x6a,
232};
233
234enum 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
254enum 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
377enum 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
409struct 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
416struct 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
423enum features {
424        RTL_FEATURE_WOL         = (1 << 0),
425        RTL_FEATURE_MSI         = (1 << 1),
426        RTL_FEATURE_GMII        = (1 << 2),
427};
428
429static void rtl_hw_start_8169(struct net_device *);
430static void rtl_hw_start_8168(struct net_device *);
431static void rtl_hw_start_8101(struct net_device *);
432
433struct 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
476static 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 */
Note: See TracBrowser for help on using the repository browser.