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