iPXE
sis190.h
Go to the documentation of this file.
1#ifndef __SIS190_H__
2#define __SIS190_H__
3
4FILE_LICENCE ( GPL_ANY );
5
6#include <stdint.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <stddef.h>
10#include <string.h>
11#include <unistd.h>
12#include <assert.h>
13#include <byteswap.h>
14#include <errno.h>
15#include <mii.h>
16#include <ipxe/ethernet.h>
17#include <ipxe/if_ether.h>
18#include <ipxe/io.h>
19#include <ipxe/iobuf.h>
20#include <ipxe/malloc.h>
21#include <ipxe/netdevice.h>
22#include <ipxe/pci.h>
23#include <ipxe/timer.h>
24
25#define PCI_VENDOR_ID_SI 0x1039
26
27#define PHY_MAX_ADDR 32
28#define PHY_ID_ANY 0x1f
29#define MII_REG_ANY 0x1f
30
31#define DRV_VERSION "1.3"
32#define DRV_NAME "sis190"
33#define SIS190_DRIVER_NAME DRV_NAME " Gigabit Ethernet driver " DRV_VERSION
34#define PFX DRV_NAME ": "
35
36#define sis190_rx_quota(count, quota) count
37
38#define NUM_TX_DESC 8 /* [8..1024] */
39#define NUM_RX_DESC 8 /* [8..8192] */
40#define TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc))
41#define RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc))
42#define RX_BUF_SIZE 1536
43#define RX_BUF_MASK 0xfff8
44
45#define RING_ALIGNMENT 256
46
47#define SIS190_REGS_SIZE 0x80
48
49/* Enhanced PHY access register bit definitions */
50#define EhnMIIread 0x0000
51#define EhnMIIwrite 0x0020
52#define EhnMIIdataShift 16
53#define EhnMIIpmdShift 6 /* 7016 only */
54#define EhnMIIregShift 11
55#define EhnMIIreq 0x0010
56#define EhnMIInotDone 0x0010
57
58/* Write/read MMIO register */
59#define SIS_W8(reg, val) writeb ((val), ioaddr + (reg))
60#define SIS_W16(reg, val) writew ((val), ioaddr + (reg))
61#define SIS_W32(reg, val) writel ((val), ioaddr + (reg))
62#define SIS_R8(reg) readb (ioaddr + (reg))
63#define SIS_R16(reg) readw (ioaddr + (reg))
64#define SIS_R32(reg) readl (ioaddr + (reg))
65
66#define SIS_PCI_COMMIT() SIS_R32(IntrControl)
67
69 TxControl = 0x00,
71 rsv0 = 0x08, // reserved
72 TxSts = 0x0c, // unused (Control/Status)
73 RxControl = 0x10,
75 rsv1 = 0x18, // reserved
76 RxSts = 0x1c, // unused
77 IntrStatus = 0x20,
78 IntrMask = 0x24,
80 IntrTimer = 0x2c, // unused (Interrupt Timer)
81 PMControl = 0x30, // unused (Power Mgmt Control/Status)
82 rsv2 = 0x34, // reserved
83 ROMControl = 0x38,
87 GIoCR = 0x48, // unused (GMAC IO Compensation)
88 GIoCtrl = 0x4c, // unused (GMAC IO Control)
90 TxLimit = 0x54, // unused (Tx MAC Timer/TryLimit)
91 RGDelay = 0x58, // unused (RGMII Tx Internal Delay)
92 rsv3 = 0x5c, // reserved
94 RxMacAddr = 0x62,
96 // Undocumented = 0x6c,
97 RxWolCtrl = 0x70,
98 RxWolData = 0x74, // unused (Rx WOL Data Access)
99 RxMPSControl = 0x78, // unused (Rx MPS Control)
100 rsv4 = 0x7c, // reserved
101};
102
104 /* IntrStatus */
105 SoftInt = 0x40000000, // unused
106 Timeup = 0x20000000, // unused
107 PauseFrame = 0x00080000, // unused
108 MagicPacket = 0x00040000, // unused
109 WakeupFrame = 0x00020000, // unused
110 LinkChange = 0x00010000,
111 RxQEmpty = 0x00000080,
112 RxQInt = 0x00000040,
113 TxQ1Empty = 0x00000020, // unused
114 TxQ1Int = 0x00000010,
115 TxQ0Empty = 0x00000008, // unused
116 TxQ0Int = 0x00000004,
117 RxHalt = 0x00000002,
118 TxHalt = 0x00000001,
119
120 /* {Rx/Tx}CmdBits */
121 CmdReset = 0x10,
122 CmdRxEnb = 0x08, // unused
123 CmdTxEnb = 0x01,
124 RxBufEmpty = 0x01, // unused
125
126 /* Cfg9346Bits */
127 Cfg9346_Lock = 0x00, // unused
128 Cfg9346_Unlock = 0xc0, // unused
129
130 /* RxMacControl */
131 AcceptErr = 0x20, // unused
132 AcceptRunt = 0x10, // unused
135 AcceptMyPhys = 0x0200,
137
138 /* RxConfigBits */
140 RxCfgDMAShift = 8, // 0x1a in RxControl ?
141
142 /* TxConfigBits */
144 TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */
145
146 LinkStatus = 0x02, // unused
147 FullDup = 0x01, // unused
148
149 /* TBICSRBit */
150 TBILinkOK = 0x02000000, // unused
151};
152
153struct TxDesc {
154 volatile u32 PSize;
155 volatile u32 status;
156 volatile u32 addr;
157 volatile u32 size;
158};
159
160struct RxDesc {
161 volatile u32 PSize;
162 volatile u32 status;
163 volatile u32 addr;
164 volatile u32 size;
165};
166
168 /* _Desc.status */
169 OWNbit = 0x80000000, // RXOWN/TXOWN
170 INTbit = 0x40000000, // RXINT/TXINT
171 CRCbit = 0x00020000, // CRCOFF/CRCEN
172 PADbit = 0x00010000, // PREADD/PADEN
173 /* _Desc.size */
174 RingEnd = 0x80000000,
175 /* TxDesc.status */
176 LSEN = 0x08000000, // TSO ? -- FR
177 IPCS = 0x04000000,
178 TCPCS = 0x02000000,
179 UDPCS = 0x01000000,
180 BSTEN = 0x00800000,
181 EXTEN = 0x00400000,
182 DEFEN = 0x00200000,
183 BKFEN = 0x00100000,
184 CRSEN = 0x00080000,
185 COLEN = 0x00040000,
186 THOL3 = 0x30000000,
187 THOL2 = 0x20000000,
188 THOL1 = 0x10000000,
189 THOL0 = 0x00000000,
190
191 WND = 0x00080000,
192 TABRT = 0x00040000,
193 FIFO = 0x00020000,
194 LINK = 0x00010000,
195 ColCountMask = 0x0000ffff,
196 /* RxDesc.status */
197 IPON = 0x20000000,
198 TCPON = 0x10000000,
199 UDPON = 0x08000000,
200 Wakup = 0x00400000,
201 Magic = 0x00200000,
202 Pause = 0x00100000,
203 DEFbit = 0x00200000,
204 BCAST = 0x000c0000,
205 MCAST = 0x00080000,
206 UCAST = 0x00040000,
207 /* RxDesc.PSize */
208 TAGON = 0x80000000,
209 RxDescCountMask = 0x7f000000, // multi-desc pkt when > 1 ? -- FR
210 ABORT = 0x00800000,
211 SHORT = 0x00400000,
212 LIMIT = 0x00200000,
213 MIIER = 0x00100000,
214 OVRUN = 0x00080000,
215 NIBON = 0x00040000,
216 COLON = 0x00020000,
217 CRCOK = 0x00010000,
218 RxSizeMask = 0x0000ffff
219 /*
220 * The asic could apparently do vlan, TSO, jumbo (sis191 only) and
221 * provide two (unused with Linux) Tx queues. No publicly
222 * available documentation alas.
223 */
224};
225
227 EECS = 0x00000001, // unused
228 EECLK = 0x00000002, // unused
229 EEDO = 0x00000008, // unused
230 EEDI = 0x00000004, // unused
231 EEREQ = 0x00000080,
232 EEROP = 0x00000200,
233 EEWOP = 0x00000100 // unused
234};
235
236/* EEPROM Addresses */
239 EEPROMCLK = 0x01, // unused
242};
243
249
268
276
278 UNKNOWN = 0x00,
279 HOME = 0x01,
280 LAN = 0x02,
281 MIX = 0x03
282};
283
284static struct mii_chip_info {
285 const char *name;
286 u16 id[2];
287 unsigned int type;
289} mii_chip_table[] = {
290 { "Atheros PHY", { 0x004d, 0xd010 }, LAN, 0 },
291 { "Atheros PHY AR8012", { 0x004d, 0xd020 }, LAN, 0 },
292 { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 },
293 { "Broadcom PHY AC131", { 0x0143, 0xbc70 }, LAN, 0 },
294 { "Agere PHY ET1101B", { 0x0282, 0xf010 }, LAN, 0 },
295 { "Marvell PHY 88E1111", { 0x0141, 0x0cc0 }, LAN, F_PHY_88E1111 },
296 { "Realtek PHY RTL8201", { 0x0000, 0x8200 }, LAN, 0 },
297 { NULL, { 0x00, 0x00 }, 0, 0 }
299
300static void sis190_phy_task(struct sis190_private *tp);
301static void sis190_free(struct net_device *dev);
302static inline void sis190_init_rxfilter(struct net_device *dev);
303
304#endif
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
Assertions.
#define EEDI
Definition eepro.c:266
#define EECS
Definition eepro.c:265
#define EEDO
Definition eepro.c:267
Error codes.
Ethernet protocol.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define u8
Definition igbvf_osdep.h:40
iPXE I/O API
iPXE timers
String functions.
I/O buffers.
Dynamic memory allocation.
Media Independent Interface constants.
Network device management.
PCI bus.
_DescStatusBit
Definition sis190.h:167
@ Wakup
Definition sis190.h:200
@ RingEnd
Definition sis190.h:174
@ TCPCS
Definition sis190.h:178
@ IPON
Definition sis190.h:197
@ CRSEN
Definition sis190.h:184
@ OWNbit
Definition sis190.h:169
@ THOL0
Definition sis190.h:189
@ COLON
Definition sis190.h:216
@ EXTEN
Definition sis190.h:181
@ LSEN
Definition sis190.h:176
@ UDPCS
Definition sis190.h:179
@ COLEN
Definition sis190.h:185
@ ColCountMask
Definition sis190.h:195
@ DEFEN
Definition sis190.h:182
@ TABRT
Definition sis190.h:192
@ BCAST
Definition sis190.h:204
@ FIFO
Definition sis190.h:193
@ ABORT
Definition sis190.h:210
@ TAGON
Definition sis190.h:208
@ SHORT
Definition sis190.h:211
@ THOL1
Definition sis190.h:188
@ DEFbit
Definition sis190.h:203
@ NIBON
Definition sis190.h:215
@ THOL2
Definition sis190.h:187
@ UCAST
Definition sis190.h:206
@ Magic
Definition sis190.h:201
@ RxDescCountMask
Definition sis190.h:209
@ LIMIT
Definition sis190.h:212
@ IPCS
Definition sis190.h:177
@ CRCOK
Definition sis190.h:217
@ BSTEN
Definition sis190.h:180
@ UDPON
Definition sis190.h:199
@ OVRUN
Definition sis190.h:214
@ BKFEN
Definition sis190.h:183
@ MCAST
Definition sis190.h:205
@ INTbit
Definition sis190.h:170
@ Pause
Definition sis190.h:202
@ CRCbit
Definition sis190.h:171
@ WND
Definition sis190.h:191
@ THOL3
Definition sis190.h:186
@ MIIER
Definition sis190.h:213
@ LINK
Definition sis190.h:194
@ PADbit
Definition sis190.h:172
@ TCPON
Definition sis190.h:198
@ RxSizeMask
Definition sis190.h:218
static struct mii_chip_info mii_chip_table[]
static void sis190_free(struct net_device *dev)
sis190_eeprom_address
Definition sis190.h:237
@ EEPROMCLK
Definition sis190.h:239
@ EEPROMInfo
Definition sis190.h:240
@ EEPROMMACAddr
Definition sis190.h:241
@ EEPROMSignature
Definition sis190.h:238
sis190_feature
Definition sis190.h:244
@ F_HAS_RGMII
Definition sis190.h:245
@ F_PHY_BCM5461
Definition sis190.h:247
@ F_PHY_88E1111
Definition sis190.h:246
static void sis190_init_rxfilter(struct net_device *dev)
#define NUM_RX_DESC
Definition sis190.h:39
sis190_registers
Definition sis190.h:68
@ RxMacControl
Definition sis190.h:93
@ rsv3
Definition sis190.h:92
@ IntrMask
Definition sis190.h:78
@ IntrTimer
Definition sis190.h:80
@ rsv0
Definition sis190.h:71
@ RxSts
Definition sis190.h:76
@ IntrStatus
Definition sis190.h:77
@ RxDescStartAddr
Definition sis190.h:74
@ rsv2
Definition sis190.h:82
@ RxWolCtrl
Definition sis190.h:97
@ RxWolData
Definition sis190.h:98
@ IntrControl
Definition sis190.h:79
@ ROMInterface
Definition sis190.h:84
@ RGDelay
Definition sis190.h:91
@ RxControl
Definition sis190.h:73
@ GIoCtrl
Definition sis190.h:88
@ TxSts
Definition sis190.h:72
@ GIoCR
Definition sis190.h:87
@ PMControl
Definition sis190.h:81
@ RxMPSControl
Definition sis190.h:99
@ RxMacAddr
Definition sis190.h:94
@ StationControl
Definition sis190.h:85
@ TxControl
Definition sis190.h:69
@ RxHashTable
Definition sis190.h:95
@ TxLimit
Definition sis190.h:90
@ ROMControl
Definition sis190.h:83
@ TxMacControl
Definition sis190.h:89
@ rsv4
Definition sis190.h:100
@ GMIIControl
Definition sis190.h:86
@ rsv1
Definition sis190.h:75
@ TxDescStartAddr
Definition sis190.h:70
#define NUM_TX_DESC
Definition sis190.h:38
sis190_phy_type
Definition sis190.h:277
@ UNKNOWN
Definition sis190.h:278
@ MIX
Definition sis190.h:281
@ HOME
Definition sis190.h:279
@ LAN
Definition sis190.h:280
sis190_register_content
Definition sis190.h:103
@ PauseFrame
Definition sis190.h:107
@ Timeup
Definition sis190.h:106
@ RxHalt
Definition sis190.h:117
@ CmdRxEnb
Definition sis190.h:122
@ TxHalt
Definition sis190.h:118
@ RxCfgFIFOShift
Definition sis190.h:139
@ RxBufEmpty
Definition sis190.h:124
@ CmdReset
Definition sis190.h:121
@ RxQInt
Definition sis190.h:112
@ TxQ1Int
Definition sis190.h:114
@ TxQ0Int
Definition sis190.h:116
@ CmdTxEnb
Definition sis190.h:123
@ TxQ1Empty
Definition sis190.h:113
@ AcceptMulticast
Definition sis190.h:134
@ RxQEmpty
Definition sis190.h:111
@ TBILinkOK
Definition sis190.h:150
@ SoftInt
Definition sis190.h:105
@ Cfg9346_Lock
Definition sis190.h:127
@ AcceptRunt
Definition sis190.h:132
@ Cfg9346_Unlock
Definition sis190.h:128
@ FullDup
Definition sis190.h:147
@ TxQ0Empty
Definition sis190.h:115
@ WakeupFrame
Definition sis190.h:109
@ LinkStatus
Definition sis190.h:146
@ AcceptAllPhys
Definition sis190.h:136
@ LinkChange
Definition sis190.h:110
@ AcceptMyPhys
Definition sis190.h:135
@ RxCfgDMAShift
Definition sis190.h:140
@ MagicPacket
Definition sis190.h:108
@ TxDMAShift
Definition sis190.h:144
@ AcceptErr
Definition sis190.h:131
@ AcceptBroadcast
Definition sis190.h:133
@ TxInterFrameGapShift
Definition sis190.h:143
static void sis190_phy_task(struct sis190_private *tp)
sis190_eeprom_access_register_bits
Definition sis190.h:226
@ EECLK
Definition sis190.h:228
@ EEREQ
Definition sis190.h:231
@ EEROP
Definition sis190.h:232
@ EEWOP
Definition sis190.h:233
volatile u32 status
Definition sis190.h:162
volatile u32 addr
Definition sis190.h:163
volatile u32 PSize
Definition sis190.h:161
volatile u32 size
Definition sis190.h:164
volatile u32 size
Definition sis190.h:157
volatile u32 PSize
Definition sis190.h:154
volatile u32 status
Definition sis190.h:155
volatile u32 addr
Definition sis190.h:156
A persistent I/O buffer.
Definition iobuf.h:38
A doubly-linked list entry (or list head)
Definition list.h:19
const char * name
Definition sis190.h:285
unsigned int type
Definition sis190.h:287
A network device.
Definition netdevice.h:353
u16 status
Definition sis190.h:273
int phy_id
Definition sis190.h:271
struct list_head list
Definition sis190.h:270
struct RxDesc * RxDescRing
Definition sis190.h:260
struct TxDesc * TxDescRing
Definition sis190.h:261
struct pci_device * pci_device
Definition sis190.h:252
void * mmio_addr
Definition sis190.h:251
struct mii_if_info mii_if
Definition sis190.h:264
struct io_buffer * Rx_iobuf[NUM_RX_DESC]
Definition sis190.h:262
struct net_device * dev
Definition sis190.h:253
struct io_buffer * Tx_iobuf[NUM_TX_DESC]
Definition sis190.h:263
struct list_head first_phy
Definition sis190.h:265
static struct tulip_private * tp
Definition tulip.c:442
#define u16
Definition vga.h:20
#define u32
Definition vga.h:21