1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _RRUNNER_H_
3*4882a593Smuzhiyun #define _RRUNNER_H_
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/interrupt.h>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #if ((BITS_PER_LONG != 32) && (BITS_PER_LONG != 64))
8*4882a593Smuzhiyun #error "BITS_PER_LONG not defined or not valid"
9*4882a593Smuzhiyun #endif
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun struct rr_regs {
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun u32 pad0[16];
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun u32 HostCtrl;
17*4882a593Smuzhiyun u32 LocalCtrl;
18*4882a593Smuzhiyun u32 Pc;
19*4882a593Smuzhiyun u32 BrkPt;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /* Timer increments every 0.97 micro-seconds (unsigned int) */
22*4882a593Smuzhiyun u32 Timer_Hi;
23*4882a593Smuzhiyun u32 Timer;
24*4882a593Smuzhiyun u32 TimerRef;
25*4882a593Smuzhiyun u32 PciState;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun u32 Event;
28*4882a593Smuzhiyun u32 MbEvent;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun u32 WinBase;
31*4882a593Smuzhiyun u32 WinData;
32*4882a593Smuzhiyun u32 RX_state;
33*4882a593Smuzhiyun u32 TX_state;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun u32 Overhead;
36*4882a593Smuzhiyun u32 ExtIo;
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun u32 DmaWriteHostHi;
39*4882a593Smuzhiyun u32 DmaWriteHostLo;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun u32 pad1[2];
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun u32 DmaReadHostHi;
44*4882a593Smuzhiyun u32 DmaReadHostLo;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun u32 pad2;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun u32 DmaReadLen;
49*4882a593Smuzhiyun u32 DmaWriteState;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun u32 DmaWriteLcl;
52*4882a593Smuzhiyun u32 DmaWriteIPchecksum;
53*4882a593Smuzhiyun u32 DmaWriteLen;
54*4882a593Smuzhiyun u32 DmaReadState;
55*4882a593Smuzhiyun u32 DmaReadLcl;
56*4882a593Smuzhiyun u32 DmaReadIPchecksum;
57*4882a593Smuzhiyun u32 pad3;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun u32 RxBase;
60*4882a593Smuzhiyun u32 RxPrd;
61*4882a593Smuzhiyun u32 RxCon;
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun u32 pad4;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun u32 TxBase;
66*4882a593Smuzhiyun u32 TxPrd;
67*4882a593Smuzhiyun u32 TxCon;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun u32 pad5;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun u32 RxIndPro;
72*4882a593Smuzhiyun u32 RxIndCon;
73*4882a593Smuzhiyun u32 RxIndRef;
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun u32 pad6;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun u32 TxIndPro;
78*4882a593Smuzhiyun u32 TxIndCon;
79*4882a593Smuzhiyun u32 TxIndRef;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun u32 pad7[17];
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun u32 DrCmndPro;
84*4882a593Smuzhiyun u32 DrCmndCon;
85*4882a593Smuzhiyun u32 DrCmndRef;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun u32 pad8;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun u32 DwCmndPro;
90*4882a593Smuzhiyun u32 DwCmndCon;
91*4882a593Smuzhiyun u32 DwCmndRef;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun u32 AssistState;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun u32 DrDataPro;
96*4882a593Smuzhiyun u32 DrDataCon;
97*4882a593Smuzhiyun u32 DrDataRef;
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun u32 pad9;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun u32 DwDataPro;
102*4882a593Smuzhiyun u32 DwDataCon;
103*4882a593Smuzhiyun u32 DwDataRef;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun u32 pad10[33];
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun u32 EvtCon;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun u32 pad11[5];
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun u32 TxPi;
112*4882a593Smuzhiyun u32 IpRxPi;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun u32 pad11a[8];
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun u32 CmdRing[16];
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun /* The ULA is in two registers the high order two bytes of the first
119*4882a593Smuzhiyun * word contain the RunCode features.
120*4882a593Smuzhiyun * ula0 res res byte0 byte1
121*4882a593Smuzhiyun * ula1 byte2 byte3 byte4 byte5
122*4882a593Smuzhiyun */
123*4882a593Smuzhiyun u32 Ula0;
124*4882a593Smuzhiyun u32 Ula1;
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun u32 RxRingHi;
127*4882a593Smuzhiyun u32 RxRingLo;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun u32 InfoPtrHi;
130*4882a593Smuzhiyun u32 InfoPtrLo;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun u32 Mode;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun u32 ConRetry;
135*4882a593Smuzhiyun u32 ConRetryTmr;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun u32 ConTmout;
138*4882a593Smuzhiyun u32 CtatTmr;
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun u32 MaxRxRng;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun u32 IntrTmr;
143*4882a593Smuzhiyun u32 TxDataMvTimeout;
144*4882a593Smuzhiyun u32 RxDataMvTimeout;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun u32 EvtPrd;
147*4882a593Smuzhiyun u32 TraceIdx;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun u32 Fail1;
150*4882a593Smuzhiyun u32 Fail2;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun u32 DrvPrm;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun u32 FilterLA;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun u32 FwRev;
157*4882a593Smuzhiyun u32 FwRes1;
158*4882a593Smuzhiyun u32 FwRes2;
159*4882a593Smuzhiyun u32 FwRes3;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun u32 WriteDmaThresh;
162*4882a593Smuzhiyun u32 ReadDmaThresh;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun u32 pad12[325];
165*4882a593Smuzhiyun u32 Window[512];
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun /*
169*4882a593Smuzhiyun * Host control register bits.
170*4882a593Smuzhiyun */
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun #define RR_INT 0x01
173*4882a593Smuzhiyun #define RR_CLEAR_INT 0x02
174*4882a593Smuzhiyun #define NO_SWAP 0x04000004
175*4882a593Smuzhiyun #define NO_SWAP1 0x00000004
176*4882a593Smuzhiyun #define PCI_RESET_NIC 0x08
177*4882a593Smuzhiyun #define HALT_NIC 0x10
178*4882a593Smuzhiyun #define SSTEP_NIC 0x20
179*4882a593Smuzhiyun #define MEM_READ_MULTI 0x40
180*4882a593Smuzhiyun #define NIC_HALTED 0x100
181*4882a593Smuzhiyun #define HALT_INST 0x200
182*4882a593Smuzhiyun #define PARITY_ERR 0x400
183*4882a593Smuzhiyun #define INVALID_INST_B 0x800
184*4882a593Smuzhiyun #define RR_REV_2 0x20000000
185*4882a593Smuzhiyun #define RR_REV_MASK 0xf0000000
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /*
188*4882a593Smuzhiyun * Local control register bits.
189*4882a593Smuzhiyun */
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun #define INTA_STATE 0x01
192*4882a593Smuzhiyun #define CLEAR_INTA 0x02
193*4882a593Smuzhiyun #define FAST_EEPROM_ACCESS 0x08
194*4882a593Smuzhiyun #define ENABLE_EXTRA_SRAM 0x100
195*4882a593Smuzhiyun #define ENABLE_EXTRA_DESC 0x200
196*4882a593Smuzhiyun #define ENABLE_PARITY 0x400
197*4882a593Smuzhiyun #define FORCE_DMA_PARITY_ERROR 0x800
198*4882a593Smuzhiyun #define ENABLE_EEPROM_WRITE 0x1000
199*4882a593Smuzhiyun #define ENABLE_DATA_CACHE 0x2000
200*4882a593Smuzhiyun #define SRAM_LO_PARITY_ERR 0x4000
201*4882a593Smuzhiyun #define SRAM_HI_PARITY_ERR 0x8000
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun /*
204*4882a593Smuzhiyun * PCI state bits.
205*4882a593Smuzhiyun */
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun #define FORCE_PCI_RESET 0x01
208*4882a593Smuzhiyun #define PROVIDE_LENGTH 0x02
209*4882a593Smuzhiyun #define MASK_DMA_READ_MAX 0x1C
210*4882a593Smuzhiyun #define RBURST_DISABLE 0x00
211*4882a593Smuzhiyun #define RBURST_4 0x04
212*4882a593Smuzhiyun #define RBURST_16 0x08
213*4882a593Smuzhiyun #define RBURST_32 0x0C
214*4882a593Smuzhiyun #define RBURST_64 0x10
215*4882a593Smuzhiyun #define RBURST_128 0x14
216*4882a593Smuzhiyun #define RBURST_256 0x18
217*4882a593Smuzhiyun #define RBURST_1024 0x1C
218*4882a593Smuzhiyun #define MASK_DMA_WRITE_MAX 0xE0
219*4882a593Smuzhiyun #define WBURST_DISABLE 0x00
220*4882a593Smuzhiyun #define WBURST_4 0x20
221*4882a593Smuzhiyun #define WBURST_16 0x40
222*4882a593Smuzhiyun #define WBURST_32 0x60
223*4882a593Smuzhiyun #define WBURST_64 0x80
224*4882a593Smuzhiyun #define WBURST_128 0xa0
225*4882a593Smuzhiyun #define WBURST_256 0xc0
226*4882a593Smuzhiyun #define WBURST_1024 0xe0
227*4882a593Smuzhiyun #define MASK_MIN_DMA 0xFF00
228*4882a593Smuzhiyun #define FIFO_RETRY_ENABLE 0x10000
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /*
231*4882a593Smuzhiyun * Event register
232*4882a593Smuzhiyun */
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun #define DMA_WRITE_DONE 0x10000
235*4882a593Smuzhiyun #define DMA_READ_DONE 0x20000
236*4882a593Smuzhiyun #define DMA_WRITE_ERR 0x40000
237*4882a593Smuzhiyun #define DMA_READ_ERR 0x80000
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun /*
240*4882a593Smuzhiyun * Receive state
241*4882a593Smuzhiyun *
242*4882a593Smuzhiyun * RoadRunner HIPPI Receive State Register controls and monitors the
243*4882a593Smuzhiyun * HIPPI receive interface in the NIC. Look at err bits when a HIPPI
244*4882a593Smuzhiyun * receive Error Event occurs.
245*4882a593Smuzhiyun */
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun #define ENABLE_NEW_CON 0x01
248*4882a593Smuzhiyun #define RESET_RECV 0x02
249*4882a593Smuzhiyun #define RECV_ALL 0x00
250*4882a593Smuzhiyun #define RECV_1K 0x20
251*4882a593Smuzhiyun #define RECV_2K 0x40
252*4882a593Smuzhiyun #define RECV_4K 0x60
253*4882a593Smuzhiyun #define RECV_8K 0x80
254*4882a593Smuzhiyun #define RECV_16K 0xa0
255*4882a593Smuzhiyun #define RECV_32K 0xc0
256*4882a593Smuzhiyun #define RECV_64K 0xe0
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun /*
259*4882a593Smuzhiyun * Transmit status.
260*4882a593Smuzhiyun */
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun #define ENA_XMIT 0x01
263*4882a593Smuzhiyun #define PERM_CON 0x02
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun /*
266*4882a593Smuzhiyun * DMA write state
267*4882a593Smuzhiyun */
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun #define RESET_DMA 0x01
270*4882a593Smuzhiyun #define NO_SWAP_DMA 0x02
271*4882a593Smuzhiyun #define DMA_ACTIVE 0x04
272*4882a593Smuzhiyun #define THRESH_MASK 0x1F
273*4882a593Smuzhiyun #define DMA_ERROR_MASK 0xff000000
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun /*
276*4882a593Smuzhiyun * Gooddies stored in the ULA registers.
277*4882a593Smuzhiyun */
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun #define TRACE_ON_WHAT_BIT 0x00020000 /* Traces on */
280*4882a593Smuzhiyun #define ONEM_BUF_WHAT_BIT 0x00040000 /* 1Meg vs 256K */
281*4882a593Smuzhiyun #define CHAR_API_WHAT_BIT 0x00080000 /* Char API vs network only */
282*4882a593Smuzhiyun #define CMD_EVT_WHAT_BIT 0x00200000 /* Command event */
283*4882a593Smuzhiyun #define LONG_TX_WHAT_BIT 0x00400000
284*4882a593Smuzhiyun #define LONG_RX_WHAT_BIT 0x00800000
285*4882a593Smuzhiyun #define WHAT_BIT_MASK 0xFFFD0000 /* Feature bit mask */
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun /*
288*4882a593Smuzhiyun * Mode status
289*4882a593Smuzhiyun */
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun #define EVENT_OVFL 0x80000000
292*4882a593Smuzhiyun #define FATAL_ERR 0x40000000
293*4882a593Smuzhiyun #define LOOP_BACK 0x01
294*4882a593Smuzhiyun #define MODE_PH 0x02
295*4882a593Smuzhiyun #define MODE_FP 0x00
296*4882a593Smuzhiyun #define PTR64BIT 0x04
297*4882a593Smuzhiyun #define PTR32BIT 0x00
298*4882a593Smuzhiyun #define PTR_WD_SWAP 0x08
299*4882a593Smuzhiyun #define PTR_WD_NOSWAP 0x00
300*4882a593Smuzhiyun #define POST_WARN_EVENT 0x10
301*4882a593Smuzhiyun #define ERR_TERM 0x20
302*4882a593Smuzhiyun #define DIRECT_CONN 0x40
303*4882a593Smuzhiyun #define NO_NIC_WATCHDOG 0x80
304*4882a593Smuzhiyun #define SWAP_DATA 0x100
305*4882a593Smuzhiyun #define SWAP_CONTROL 0x200
306*4882a593Smuzhiyun #define NIC_HALT_ON_ERR 0x400
307*4882a593Smuzhiyun #define NIC_NO_RESTART 0x800
308*4882a593Smuzhiyun #define HALF_DUP_TX 0x1000
309*4882a593Smuzhiyun #define HALF_DUP_RX 0x2000
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /*
313*4882a593Smuzhiyun * Error codes
314*4882a593Smuzhiyun */
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun /* Host Error Codes - values of fail1 */
317*4882a593Smuzhiyun #define ERR_UNKNOWN_MBOX 0x1001
318*4882a593Smuzhiyun #define ERR_UNKNOWN_CMD 0x1002
319*4882a593Smuzhiyun #define ERR_MAX_RING 0x1003
320*4882a593Smuzhiyun #define ERR_RING_CLOSED 0x1004
321*4882a593Smuzhiyun #define ERR_RING_OPEN 0x1005
322*4882a593Smuzhiyun /* Firmware internal errors */
323*4882a593Smuzhiyun #define ERR_EVENT_RING_FULL 0x01
324*4882a593Smuzhiyun #define ERR_DW_PEND_CMND_FULL 0x02
325*4882a593Smuzhiyun #define ERR_DR_PEND_CMND_FULL 0x03
326*4882a593Smuzhiyun #define ERR_DW_PEND_DATA_FULL 0x04
327*4882a593Smuzhiyun #define ERR_DR_PEND_DATA_FULL 0x05
328*4882a593Smuzhiyun #define ERR_ILLEGAL_JUMP 0x06
329*4882a593Smuzhiyun #define ERR_UNIMPLEMENTED 0x07
330*4882a593Smuzhiyun #define ERR_TX_INFO_FULL 0x08
331*4882a593Smuzhiyun #define ERR_RX_INFO_FULL 0x09
332*4882a593Smuzhiyun #define ERR_ILLEGAL_MODE 0x0A
333*4882a593Smuzhiyun #define ERR_MAIN_TIMEOUT 0x0B
334*4882a593Smuzhiyun #define ERR_EVENT_BITS 0x0C
335*4882a593Smuzhiyun #define ERR_UNPEND_FULL 0x0D
336*4882a593Smuzhiyun #define ERR_TIMER_QUEUE_FULL 0x0E
337*4882a593Smuzhiyun #define ERR_TIMER_QUEUE_EMPTY 0x0F
338*4882a593Smuzhiyun #define ERR_TIMER_NO_FREE 0x10
339*4882a593Smuzhiyun #define ERR_INTR_START 0x11
340*4882a593Smuzhiyun #define ERR_BAD_STARTUP 0x12
341*4882a593Smuzhiyun #define ERR_NO_PKT_END 0x13
342*4882a593Smuzhiyun #define ERR_HALTED_ON_ERR 0x14
343*4882a593Smuzhiyun /* Hardware NIC Errors */
344*4882a593Smuzhiyun #define ERR_WRITE_DMA 0x0101
345*4882a593Smuzhiyun #define ERR_READ_DMA 0x0102
346*4882a593Smuzhiyun #define ERR_EXT_SERIAL 0x0103
347*4882a593Smuzhiyun #define ERR_TX_INT_PARITY 0x0104
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /*
351*4882a593Smuzhiyun * Event definitions
352*4882a593Smuzhiyun */
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun #define EVT_RING_ENTRIES 64
355*4882a593Smuzhiyun #define EVT_RING_SIZE (EVT_RING_ENTRIES * sizeof(struct event))
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun struct event {
358*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
359*4882a593Smuzhiyun u16 index;
360*4882a593Smuzhiyun u8 ring;
361*4882a593Smuzhiyun u8 code;
362*4882a593Smuzhiyun #else
363*4882a593Smuzhiyun u8 code;
364*4882a593Smuzhiyun u8 ring;
365*4882a593Smuzhiyun u16 index;
366*4882a593Smuzhiyun #endif
367*4882a593Smuzhiyun u32 timestamp;
368*4882a593Smuzhiyun };
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun /*
371*4882a593Smuzhiyun * General Events
372*4882a593Smuzhiyun */
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun #define E_NIC_UP 0x01
375*4882a593Smuzhiyun #define E_WATCHDOG 0x02
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun #define E_STAT_UPD 0x04
378*4882a593Smuzhiyun #define E_INVAL_CMD 0x05
379*4882a593Smuzhiyun #define E_SET_CMD_CONS 0x06
380*4882a593Smuzhiyun #define E_LINK_ON 0x07
381*4882a593Smuzhiyun #define E_LINK_OFF 0x08
382*4882a593Smuzhiyun #define E_INTERN_ERR 0x09
383*4882a593Smuzhiyun #define E_HOST_ERR 0x0A
384*4882a593Smuzhiyun #define E_STATS_UPDATE 0x0B
385*4882a593Smuzhiyun #define E_REJECTING 0x0C
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun /*
388*4882a593Smuzhiyun * Send Events
389*4882a593Smuzhiyun */
390*4882a593Smuzhiyun #define E_CON_REJ 0x13
391*4882a593Smuzhiyun #define E_CON_TMOUT 0x14
392*4882a593Smuzhiyun #define E_CON_NC_TMOUT 0x15 /* I , Connection No Campon Timeout */
393*4882a593Smuzhiyun #define E_DISC_ERR 0x16
394*4882a593Smuzhiyun #define E_INT_PRTY 0x17
395*4882a593Smuzhiyun #define E_TX_IDLE 0x18
396*4882a593Smuzhiyun #define E_TX_LINK_DROP 0x19
397*4882a593Smuzhiyun #define E_TX_INV_RNG 0x1A
398*4882a593Smuzhiyun #define E_TX_INV_BUF 0x1B
399*4882a593Smuzhiyun #define E_TX_INV_DSC 0x1C
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun /*
402*4882a593Smuzhiyun * Destination Events
403*4882a593Smuzhiyun */
404*4882a593Smuzhiyun /*
405*4882a593Smuzhiyun * General Receive events
406*4882a593Smuzhiyun */
407*4882a593Smuzhiyun #define E_VAL_RNG 0x20
408*4882a593Smuzhiyun #define E_RX_RNG_ENER 0x21
409*4882a593Smuzhiyun #define E_INV_RNG 0x22
410*4882a593Smuzhiyun #define E_RX_RNG_SPC 0x23
411*4882a593Smuzhiyun #define E_RX_RNG_OUT 0x24
412*4882a593Smuzhiyun #define E_PKT_DISCARD 0x25
413*4882a593Smuzhiyun #define E_INFO_EVT 0x27
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun /*
416*4882a593Smuzhiyun * Data corrupted events
417*4882a593Smuzhiyun */
418*4882a593Smuzhiyun #define E_RX_PAR_ERR 0x2B
419*4882a593Smuzhiyun #define E_RX_LLRC_ERR 0x2C
420*4882a593Smuzhiyun #define E_IP_CKSM_ERR 0x2D
421*4882a593Smuzhiyun #define E_DTA_CKSM_ERR 0x2E
422*4882a593Smuzhiyun #define E_SHT_BST 0x2F
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun /*
425*4882a593Smuzhiyun * Data lost events
426*4882a593Smuzhiyun */
427*4882a593Smuzhiyun #define E_LST_LNK_ERR 0x30
428*4882a593Smuzhiyun #define E_FLG_SYN_ERR 0x31
429*4882a593Smuzhiyun #define E_FRM_ERR 0x32
430*4882a593Smuzhiyun #define E_RX_IDLE 0x33
431*4882a593Smuzhiyun #define E_PKT_LN_ERR 0x34
432*4882a593Smuzhiyun #define E_STATE_ERR 0x35
433*4882a593Smuzhiyun #define E_UNEXP_DATA 0x3C
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun /*
436*4882a593Smuzhiyun * Fatal events
437*4882a593Smuzhiyun */
438*4882a593Smuzhiyun #define E_RX_INV_BUF 0x36
439*4882a593Smuzhiyun #define E_RX_INV_DSC 0x37
440*4882a593Smuzhiyun #define E_RNG_BLK 0x38
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun /*
443*4882a593Smuzhiyun * Warning events
444*4882a593Smuzhiyun */
445*4882a593Smuzhiyun #define E_RX_TO 0x39
446*4882a593Smuzhiyun #define E_BFR_SPC 0x3A
447*4882a593Smuzhiyun #define E_INV_ULP 0x3B
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun #define E_NOT_IMPLEMENTED 0x40
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /*
453*4882a593Smuzhiyun * Commands
454*4882a593Smuzhiyun */
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun #define CMD_RING_ENTRIES 16
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun struct cmd {
459*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
460*4882a593Smuzhiyun u16 index;
461*4882a593Smuzhiyun u8 ring;
462*4882a593Smuzhiyun u8 code;
463*4882a593Smuzhiyun #else
464*4882a593Smuzhiyun u8 code;
465*4882a593Smuzhiyun u8 ring;
466*4882a593Smuzhiyun u16 index;
467*4882a593Smuzhiyun #endif
468*4882a593Smuzhiyun };
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun #define C_START_FW 0x01
471*4882a593Smuzhiyun #define C_UPD_STAT 0x02
472*4882a593Smuzhiyun #define C_WATCHDOG 0x05
473*4882a593Smuzhiyun #define C_DEL_RNG 0x09
474*4882a593Smuzhiyun #define C_NEW_RNG 0x0A
475*4882a593Smuzhiyun #define C_CONN 0x0D
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun /*
479*4882a593Smuzhiyun * Mode bits
480*4882a593Smuzhiyun */
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun #define PACKET_BAD 0x01 /* Packet had link-layer error */
483*4882a593Smuzhiyun #define INTERRUPT 0x02
484*4882a593Smuzhiyun #define TX_IP_CKSUM 0x04
485*4882a593Smuzhiyun #define PACKET_END 0x08
486*4882a593Smuzhiyun #define PACKET_START 0x10
487*4882a593Smuzhiyun #define SAME_IFIELD 0x80
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun typedef struct {
491*4882a593Smuzhiyun #if (BITS_PER_LONG == 64)
492*4882a593Smuzhiyun u64 addrlo;
493*4882a593Smuzhiyun #else
494*4882a593Smuzhiyun u32 addrhi;
495*4882a593Smuzhiyun u32 addrlo;
496*4882a593Smuzhiyun #endif
497*4882a593Smuzhiyun } rraddr;
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun
set_rraddr(rraddr * ra,dma_addr_t addr)500*4882a593Smuzhiyun static inline void set_rraddr(rraddr *ra, dma_addr_t addr)
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun unsigned long baddr = addr;
503*4882a593Smuzhiyun #if (BITS_PER_LONG == 64)
504*4882a593Smuzhiyun ra->addrlo = baddr;
505*4882a593Smuzhiyun #else
506*4882a593Smuzhiyun /* Don't bother setting zero every time */
507*4882a593Smuzhiyun ra->addrlo = baddr;
508*4882a593Smuzhiyun #endif
509*4882a593Smuzhiyun mb();
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun
set_rxaddr(struct rr_regs __iomem * regs,volatile dma_addr_t addr)513*4882a593Smuzhiyun static inline void set_rxaddr(struct rr_regs __iomem *regs, volatile dma_addr_t addr)
514*4882a593Smuzhiyun {
515*4882a593Smuzhiyun unsigned long baddr = addr;
516*4882a593Smuzhiyun #if (BITS_PER_LONG == 64) && defined(__LITTLE_ENDIAN)
517*4882a593Smuzhiyun writel(baddr & 0xffffffff, ®s->RxRingHi);
518*4882a593Smuzhiyun writel(baddr >> 32, ®s->RxRingLo);
519*4882a593Smuzhiyun #elif (BITS_PER_LONG == 64)
520*4882a593Smuzhiyun writel(baddr >> 32, ®s->RxRingHi);
521*4882a593Smuzhiyun writel(baddr & 0xffffffff, ®s->RxRingLo);
522*4882a593Smuzhiyun #else
523*4882a593Smuzhiyun writel(0, ®s->RxRingHi);
524*4882a593Smuzhiyun writel(baddr, ®s->RxRingLo);
525*4882a593Smuzhiyun #endif
526*4882a593Smuzhiyun mb();
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun
set_infoaddr(struct rr_regs __iomem * regs,volatile dma_addr_t addr)530*4882a593Smuzhiyun static inline void set_infoaddr(struct rr_regs __iomem *regs, volatile dma_addr_t addr)
531*4882a593Smuzhiyun {
532*4882a593Smuzhiyun unsigned long baddr = addr;
533*4882a593Smuzhiyun #if (BITS_PER_LONG == 64) && defined(__LITTLE_ENDIAN)
534*4882a593Smuzhiyun writel(baddr & 0xffffffff, ®s->InfoPtrHi);
535*4882a593Smuzhiyun writel(baddr >> 32, ®s->InfoPtrLo);
536*4882a593Smuzhiyun #elif (BITS_PER_LONG == 64)
537*4882a593Smuzhiyun writel(baddr >> 32, ®s->InfoPtrHi);
538*4882a593Smuzhiyun writel(baddr & 0xffffffff, ®s->InfoPtrLo);
539*4882a593Smuzhiyun #else
540*4882a593Smuzhiyun writel(0, ®s->InfoPtrHi);
541*4882a593Smuzhiyun writel(baddr, ®s->InfoPtrLo);
542*4882a593Smuzhiyun #endif
543*4882a593Smuzhiyun mb();
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun /*
548*4882a593Smuzhiyun * TX ring
549*4882a593Smuzhiyun */
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun #ifdef CONFIG_ROADRUNNER_LARGE_RINGS
552*4882a593Smuzhiyun #define TX_RING_ENTRIES 32
553*4882a593Smuzhiyun #else
554*4882a593Smuzhiyun #define TX_RING_ENTRIES 16
555*4882a593Smuzhiyun #endif
556*4882a593Smuzhiyun #define TX_TOTAL_SIZE (TX_RING_ENTRIES * sizeof(struct tx_desc))
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun struct tx_desc{
559*4882a593Smuzhiyun rraddr addr;
560*4882a593Smuzhiyun u32 res;
561*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
562*4882a593Smuzhiyun u16 size;
563*4882a593Smuzhiyun u8 pad;
564*4882a593Smuzhiyun u8 mode;
565*4882a593Smuzhiyun #else
566*4882a593Smuzhiyun u8 mode;
567*4882a593Smuzhiyun u8 pad;
568*4882a593Smuzhiyun u16 size;
569*4882a593Smuzhiyun #endif
570*4882a593Smuzhiyun };
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun #ifdef CONFIG_ROADRUNNER_LARGE_RINGS
574*4882a593Smuzhiyun #define RX_RING_ENTRIES 32
575*4882a593Smuzhiyun #else
576*4882a593Smuzhiyun #define RX_RING_ENTRIES 16
577*4882a593Smuzhiyun #endif
578*4882a593Smuzhiyun #define RX_TOTAL_SIZE (RX_RING_ENTRIES * sizeof(struct rx_desc))
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun struct rx_desc{
581*4882a593Smuzhiyun rraddr addr;
582*4882a593Smuzhiyun u32 res;
583*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
584*4882a593Smuzhiyun u16 size;
585*4882a593Smuzhiyun u8 pad;
586*4882a593Smuzhiyun u8 mode;
587*4882a593Smuzhiyun #else
588*4882a593Smuzhiyun u8 mode;
589*4882a593Smuzhiyun u8 pad;
590*4882a593Smuzhiyun u16 size;
591*4882a593Smuzhiyun #endif
592*4882a593Smuzhiyun };
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun /*
596*4882a593Smuzhiyun * ioctl's
597*4882a593Smuzhiyun */
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun #define SIOCRRPFW SIOCDEVPRIVATE /* put firmware */
600*4882a593Smuzhiyun #define SIOCRRGFW SIOCDEVPRIVATE+1 /* get firmware */
601*4882a593Smuzhiyun #define SIOCRRID SIOCDEVPRIVATE+2 /* identify */
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun struct seg_hdr {
605*4882a593Smuzhiyun u32 seg_start;
606*4882a593Smuzhiyun u32 seg_len;
607*4882a593Smuzhiyun u32 seg_eestart;
608*4882a593Smuzhiyun };
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun #define EEPROM_BASE 0x80000000
612*4882a593Smuzhiyun #define EEPROM_WORDS 8192
613*4882a593Smuzhiyun #define EEPROM_BYTES (EEPROM_WORDS * sizeof(u32))
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun struct eeprom_boot {
616*4882a593Smuzhiyun u32 key1;
617*4882a593Smuzhiyun u32 key2;
618*4882a593Smuzhiyun u32 sram_size;
619*4882a593Smuzhiyun struct seg_hdr loader;
620*4882a593Smuzhiyun u32 init_chksum;
621*4882a593Smuzhiyun u32 reserved1;
622*4882a593Smuzhiyun };
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun struct eeprom_manf {
625*4882a593Smuzhiyun u32 HeaderFmt;
626*4882a593Smuzhiyun u32 Firmware;
627*4882a593Smuzhiyun u32 BoardRevision;
628*4882a593Smuzhiyun u32 RoadrunnerRev;
629*4882a593Smuzhiyun char OpticsPart[8];
630*4882a593Smuzhiyun u32 OpticsRev;
631*4882a593Smuzhiyun u32 pad1;
632*4882a593Smuzhiyun char SramPart[8];
633*4882a593Smuzhiyun u32 SramRev;
634*4882a593Smuzhiyun u32 pad2;
635*4882a593Smuzhiyun char EepromPart[8];
636*4882a593Smuzhiyun u32 EepromRev;
637*4882a593Smuzhiyun u32 EepromSize;
638*4882a593Smuzhiyun char PalPart[8];
639*4882a593Smuzhiyun u32 PalRev;
640*4882a593Smuzhiyun u32 pad3;
641*4882a593Smuzhiyun char PalCodeFile[12];
642*4882a593Smuzhiyun u32 PalCodeRev;
643*4882a593Smuzhiyun char BoardULA[8];
644*4882a593Smuzhiyun char SerialNo[8];
645*4882a593Smuzhiyun char MfgDate[8];
646*4882a593Smuzhiyun char MfgTime[8];
647*4882a593Smuzhiyun char ModifyDate[8];
648*4882a593Smuzhiyun u32 ModCount;
649*4882a593Smuzhiyun u32 pad4[13];
650*4882a593Smuzhiyun };
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun struct eeprom_phase_info {
654*4882a593Smuzhiyun char phase1File[12];
655*4882a593Smuzhiyun u32 phase1Rev;
656*4882a593Smuzhiyun char phase1Date[8];
657*4882a593Smuzhiyun char phase2File[12];
658*4882a593Smuzhiyun u32 phase2Rev;
659*4882a593Smuzhiyun char phase2Date[8];
660*4882a593Smuzhiyun u32 reserved7[4];
661*4882a593Smuzhiyun };
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun struct eeprom_rncd_info {
664*4882a593Smuzhiyun u32 FwStart;
665*4882a593Smuzhiyun u32 FwRev;
666*4882a593Smuzhiyun char FwDate[8];
667*4882a593Smuzhiyun u32 AddrRunCodeSegs;
668*4882a593Smuzhiyun u32 FileNames;
669*4882a593Smuzhiyun char File[13][8];
670*4882a593Smuzhiyun };
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun /* Phase 1 region (starts are word offset 0x80) */
674*4882a593Smuzhiyun struct phase1_hdr{
675*4882a593Smuzhiyun u32 jump;
676*4882a593Smuzhiyun u32 noop;
677*4882a593Smuzhiyun struct seg_hdr phase2Seg;
678*4882a593Smuzhiyun };
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun struct eeprom {
681*4882a593Smuzhiyun struct eeprom_boot boot;
682*4882a593Smuzhiyun u32 pad1[8];
683*4882a593Smuzhiyun struct eeprom_manf manf;
684*4882a593Smuzhiyun struct eeprom_phase_info phase_info;
685*4882a593Smuzhiyun struct eeprom_rncd_info rncd_info;
686*4882a593Smuzhiyun u32 pad2[15];
687*4882a593Smuzhiyun u32 hdr_checksum;
688*4882a593Smuzhiyun struct phase1_hdr phase1;
689*4882a593Smuzhiyun };
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun struct rr_stats {
693*4882a593Smuzhiyun u32 NicTimeStamp;
694*4882a593Smuzhiyun u32 RngCreated;
695*4882a593Smuzhiyun u32 RngDeleted;
696*4882a593Smuzhiyun u32 IntrGen;
697*4882a593Smuzhiyun u32 NEvtOvfl;
698*4882a593Smuzhiyun u32 InvCmd;
699*4882a593Smuzhiyun u32 DmaReadErrs;
700*4882a593Smuzhiyun u32 DmaWriteErrs;
701*4882a593Smuzhiyun u32 StatUpdtT;
702*4882a593Smuzhiyun u32 StatUpdtC;
703*4882a593Smuzhiyun u32 WatchDog;
704*4882a593Smuzhiyun u32 Trace;
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun /* Serial HIPPI */
707*4882a593Smuzhiyun u32 LnkRdyEst;
708*4882a593Smuzhiyun u32 GLinkErr;
709*4882a593Smuzhiyun u32 AltFlgErr;
710*4882a593Smuzhiyun u32 OvhdBit8Sync;
711*4882a593Smuzhiyun u32 RmtSerPrtyErr;
712*4882a593Smuzhiyun u32 RmtParPrtyErr;
713*4882a593Smuzhiyun u32 RmtLoopBk;
714*4882a593Smuzhiyun u32 pad1;
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun /* HIPPI tx */
717*4882a593Smuzhiyun u32 ConEst;
718*4882a593Smuzhiyun u32 ConRejS;
719*4882a593Smuzhiyun u32 ConRetry;
720*4882a593Smuzhiyun u32 ConTmOut;
721*4882a593Smuzhiyun u32 SndConDiscon;
722*4882a593Smuzhiyun u32 SndParErr;
723*4882a593Smuzhiyun u32 PktSnt;
724*4882a593Smuzhiyun u32 pad2[2];
725*4882a593Smuzhiyun u32 ShFBstSnt;
726*4882a593Smuzhiyun u64 BytSent;
727*4882a593Smuzhiyun u32 TxTimeout;
728*4882a593Smuzhiyun u32 pad3[3];
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun /* HIPPI rx */
731*4882a593Smuzhiyun u32 ConAcc;
732*4882a593Smuzhiyun u32 ConRejdiPrty;
733*4882a593Smuzhiyun u32 ConRejd64b;
734*4882a593Smuzhiyun u32 ConRejdBuf;
735*4882a593Smuzhiyun u32 RxConDiscon;
736*4882a593Smuzhiyun u32 RxConNoData;
737*4882a593Smuzhiyun u32 PktRx;
738*4882a593Smuzhiyun u32 pad4[2];
739*4882a593Smuzhiyun u32 ShFBstRx;
740*4882a593Smuzhiyun u64 BytRx;
741*4882a593Smuzhiyun u32 RxParErr;
742*4882a593Smuzhiyun u32 RxLLRCerr;
743*4882a593Smuzhiyun u32 RxBstSZerr;
744*4882a593Smuzhiyun u32 RxStateErr;
745*4882a593Smuzhiyun u32 RxRdyErr;
746*4882a593Smuzhiyun u32 RxInvULP;
747*4882a593Smuzhiyun u32 RxSpcBuf;
748*4882a593Smuzhiyun u32 RxSpcDesc;
749*4882a593Smuzhiyun u32 RxRngSpc;
750*4882a593Smuzhiyun u32 RxRngFull;
751*4882a593Smuzhiyun u32 RxPktLenErr;
752*4882a593Smuzhiyun u32 RxCksmErr;
753*4882a593Smuzhiyun u32 RxPktDrp;
754*4882a593Smuzhiyun u32 RngLowSpc;
755*4882a593Smuzhiyun u32 RngDataClose;
756*4882a593Smuzhiyun u32 RxTimeout;
757*4882a593Smuzhiyun u32 RxIdle;
758*4882a593Smuzhiyun };
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun /*
762*4882a593Smuzhiyun * This struct is shared with the NIC firmware.
763*4882a593Smuzhiyun */
764*4882a593Smuzhiyun struct ring_ctrl {
765*4882a593Smuzhiyun rraddr rngptr;
766*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
767*4882a593Smuzhiyun u16 entries;
768*4882a593Smuzhiyun u8 pad;
769*4882a593Smuzhiyun u8 entry_size;
770*4882a593Smuzhiyun u16 pi;
771*4882a593Smuzhiyun u16 mode;
772*4882a593Smuzhiyun #else
773*4882a593Smuzhiyun u8 entry_size;
774*4882a593Smuzhiyun u8 pad;
775*4882a593Smuzhiyun u16 entries;
776*4882a593Smuzhiyun u16 mode;
777*4882a593Smuzhiyun u16 pi;
778*4882a593Smuzhiyun #endif
779*4882a593Smuzhiyun };
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun struct rr_info {
782*4882a593Smuzhiyun union {
783*4882a593Smuzhiyun struct rr_stats stats;
784*4882a593Smuzhiyun u32 stati[128];
785*4882a593Smuzhiyun } s;
786*4882a593Smuzhiyun struct ring_ctrl evt_ctrl;
787*4882a593Smuzhiyun struct ring_ctrl cmd_ctrl;
788*4882a593Smuzhiyun struct ring_ctrl tx_ctrl;
789*4882a593Smuzhiyun u8 pad[464];
790*4882a593Smuzhiyun u8 trace[3072];
791*4882a593Smuzhiyun };
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun /*
794*4882a593Smuzhiyun * The linux structure for the RoadRunner.
795*4882a593Smuzhiyun *
796*4882a593Smuzhiyun * RX/TX descriptors are put first to make sure they are properly
797*4882a593Smuzhiyun * aligned and do not cross cache-line boundaries.
798*4882a593Smuzhiyun */
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun struct rr_private
801*4882a593Smuzhiyun {
802*4882a593Smuzhiyun struct rx_desc *rx_ring;
803*4882a593Smuzhiyun struct tx_desc *tx_ring;
804*4882a593Smuzhiyun struct event *evt_ring;
805*4882a593Smuzhiyun dma_addr_t tx_ring_dma;
806*4882a593Smuzhiyun dma_addr_t rx_ring_dma;
807*4882a593Smuzhiyun dma_addr_t evt_ring_dma;
808*4882a593Smuzhiyun /* Alignment ok ? */
809*4882a593Smuzhiyun struct sk_buff *rx_skbuff[RX_RING_ENTRIES];
810*4882a593Smuzhiyun struct sk_buff *tx_skbuff[TX_RING_ENTRIES];
811*4882a593Smuzhiyun struct rr_regs __iomem *regs; /* Register base */
812*4882a593Smuzhiyun struct ring_ctrl *rx_ctrl; /* Receive ring control */
813*4882a593Smuzhiyun struct rr_info *info; /* Shared info page */
814*4882a593Smuzhiyun dma_addr_t rx_ctrl_dma;
815*4882a593Smuzhiyun dma_addr_t info_dma;
816*4882a593Smuzhiyun spinlock_t lock;
817*4882a593Smuzhiyun struct timer_list timer;
818*4882a593Smuzhiyun u32 cur_rx, cur_cmd, cur_evt;
819*4882a593Smuzhiyun u32 dirty_rx, dirty_tx;
820*4882a593Smuzhiyun u32 tx_full;
821*4882a593Smuzhiyun u32 fw_rev;
822*4882a593Smuzhiyun volatile short fw_running;
823*4882a593Smuzhiyun struct pci_dev *pci_dev;
824*4882a593Smuzhiyun };
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun /*
828*4882a593Smuzhiyun * Prototypes
829*4882a593Smuzhiyun */
830*4882a593Smuzhiyun static int rr_init(struct net_device *dev);
831*4882a593Smuzhiyun static int rr_init1(struct net_device *dev);
832*4882a593Smuzhiyun static irqreturn_t rr_interrupt(int irq, void *dev_id);
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun static int rr_open(struct net_device *dev);
835*4882a593Smuzhiyun static netdev_tx_t rr_start_xmit(struct sk_buff *skb,
836*4882a593Smuzhiyun struct net_device *dev);
837*4882a593Smuzhiyun static int rr_close(struct net_device *dev);
838*4882a593Smuzhiyun static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
839*4882a593Smuzhiyun static unsigned int rr_read_eeprom(struct rr_private *rrpriv,
840*4882a593Smuzhiyun unsigned long offset,
841*4882a593Smuzhiyun unsigned char *buf,
842*4882a593Smuzhiyun unsigned long length);
843*4882a593Smuzhiyun static u32 rr_read_eeprom_word(struct rr_private *rrpriv, size_t offset);
844*4882a593Smuzhiyun static int rr_load_firmware(struct net_device *dev);
845*4882a593Smuzhiyun static inline void rr_raz_tx(struct rr_private *, struct net_device *);
846*4882a593Smuzhiyun static inline void rr_raz_rx(struct rr_private *, struct net_device *);
847*4882a593Smuzhiyun #endif /* _RRUNNER_H_ */
848