aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ibmlana.h
blob: aa3ddbdee4bbc76391d8f6be203d5f576ddf5d1a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#ifndef _IBM_LANA_INCLUDE_
#define _IBM_LANA_INCLUDE_

#ifdef _IBM_LANA_DRIVER_

/* maximum packet size */

#define PKTSIZE 1524

/* number of transmit buffers */

#define TXBUFCNT 4

/* Adapter ID's */
#define IBM_LANA_ID 0xffe0

/* media enumeration - defined in a way that it fits onto the LAN/A's
   POS registers... */

typedef enum {
	Media_10BaseT, Media_10Base5,
	Media_Unknown, Media_10Base2, Media_Count
} ibmlana_medium;

/* private structure */

typedef struct {
	unsigned int slot;		/* MCA-Slot-#                       */
	int realirq;			/* memorizes actual IRQ, even when
					   currently not allocated          */
	ibmlana_medium medium;		/* physical cannector               */
	u32 	tdastart, txbufstart,	/* addresses                        */
		rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt;
	int 	nextrxdescr,		/* next rx descriptor to be used    */
		lastrxdescr,		/* last free rx descriptor          */
		nexttxdescr,		/* last tx descriptor to be used    */
		currtxdescr,		/* tx descriptor currently tx'ed    */
		txused[TXBUFCNT];	/* busy flags                       */
	void __iomem *base;
	spinlock_t lock;
} ibmlana_priv;

/* this card uses quite a lot of I/O ports...luckily the MCA bus decodes
   a full 64K I/O range... */

#define IBM_LANA_IORANGE 0xa0

/* Command Register: */

#define SONIC_CMDREG     0x00
#define CMDREG_HTX       0x0001	/* halt transmission                */
#define CMDREG_TXP       0x0002	/* start transmission               */
#define CMDREG_RXDIS     0x0004	/* disable receiver                 */
#define CMDREG_RXEN      0x0008	/* enable receiver                  */
#define CMDREG_STP       0x0010	/* stop timer                       */
#define CMDREG_ST        0x0020	/* start timer                      */
#define CMDREG_RST       0x0080	/* software reset                   */
#define CMDREG_RRRA      0x0100	/* force SONIC to read first RRA    */
#define CMDREG_LCAM      0x0200	/* force SONIC to read CAM descrs   */

/* Data Configuration Register */

#define SONIC_DCREG      0x02
#define DCREG_EXBUS      0x8000	/* Extended Bus Mode                */
#define DCREG_LBR        0x2000	/* Latched Bus Retry                */
#define DCREG_PO1        0x1000	/* Programmable Outputs             */
#define DCREG_PO0        0x0800
#define DCREG_SBUS       0x0400	/* Synchronous Bus Mode             */
#define DCREG_USR1       0x0200	/* User Definable Pins              */
#define DCREG_USR0       0x0100
#define DCREG_WC0        0x0000	/* 0..3 Wait States                 */
#define DCREG_WC1        0x0040
#define DCREG_WC2        0x0080
#define DCREG_WC3        0x00c0
#define DCREG_DW16       0x0000	/* 16 bit Bus Mode                  */
#define DCREG_DW32       0x0020	/* 32 bit Bus Mode                  */
#define DCREG_BMS        0x0010	/* Block Mode Select                */
#define DCREG_RFT4       0x0000	/* 4/8/16/24 bytes RX  Threshold    */
#define DCREG_RFT8       0x0004
#define DCREG_RFT16      0x0008
#define DCREG_RFT24      0x000c
#define DCREG_TFT8       0x0000	/* 8/16/24/28 bytes TX Threshold    */
#define DCREG_TFT16      0x0001
#define DCREG_TFT24      0x0002
#define DCREG_TFT28      0x0003

/* Receive Control Register */

#define SONIC_RCREG      0x04
#define RCREG_ERR        0x8000	/* accept damaged and collided pkts */
#define RCREG_RNT        0x4000	/* accept packets that are < 64     */
#define RCREG_BRD        0x2000	/* accept broadcasts                */
#define RCREG_PRO        0x1000	/* promiscous mode                  */
#define RCREG_AMC        0x0800	/* accept all multicasts            */
#define RCREG_LB_NONE    0x0000	/* no loopback                      */
#define RCREG_LB_MAC     0x0200	/* MAC loopback                     */
#define RCREG_LB_ENDEC   0x0400	/* ENDEC loopback                   */
#define RCREG_LB_XVR     0x0600	/* Transceiver loopback             */
#define RCREG_MC         0x0100	/* Multicast received               */
#define RCREG_BC         0x0080	/* Broadcast received               */
#define RCREG_LPKT       0x0040	/* last packet in RBA               */
#define RCREG_CRS        0x0020	/* carrier sense present            */
#define RCREG_COL        0x0010	/* recv'd packet with collision     */
#define RCREG_CRCR       0x0008	/* recv'd packet with CRC error     */
#define RCREG_FAER       0x0004	/* recv'd packet with inv. framing  */
#define RCREG_LBK        0x0002	/* recv'd loopback packet           */
#define RCREG_PRX        0x0001	/* recv'd packet is OK              */

/* Transmit Control Register */

#define SONIC_TCREG      0x06
#define TCREG_PINT       0x8000	/* generate interrupt after TDA read */
#define TCREG_POWC       0x4000	/* timer start out of window detect */
#define TCREG_CRCI       0x2000	/* inhibit CRC generation           */
#define TCREG_EXDIS      0x1000	/* disable excessive deferral timer */
#define TCREG_EXD        0x0400	/* excessive deferral occurred       */
#define TCREG_DEF        0x0200	/* single deferral occurred          */
#define TCREG_NCRS       0x0100	/* no carrier detected              */
#define TCREG_CRSL       0x0080	/* carrier lost                     */
#define TCREG_EXC        0x0040	/* excessive collisions occurred     */
#define TCREG_OWC        0x0020	/* out of window collision occurred  */
#define TCREG_PMB        0x0008	/* packet monitored bad             */
#define TCREG_FU         0x0004	/* FIFO underrun                    */
#define TCREG_BCM        0x0002	/* byte count mismatch of fragments */
#define TCREG_PTX        0x0001	/* packet transmitted OK            */

/* Interrupt Mask Register */

#define SONIC_IMREG      0x08
#define IMREG_BREN       0x4000	/* interrupt when bus retry occurred */
#define IMREG_HBLEN      0x2000	/* interrupt when heartbeat lost    */
#define IMREG_LCDEN      0x1000	/* interrupt when CAM loaded        */
#define IMREG_PINTEN     0x0800	/* interrupt when PINT in TDA set   */
#define IMREG_PRXEN      0x0400	/* interrupt when packet received   */
#define IMREG_PTXEN      0x0200	/* interrupt when packet was sent   */
#define IMREG_TXEREN     0x0100	/* interrupt when send failed       */
#define IMREG_TCEN       0x0080	/* interrupt when timer completed   */
#define IMREG_RDEEN      0x0040	/* interrupt when RDA exhausted     */
#define IMREG_RBEEN      0x0020	/* interrupt when RBA exhausted     */
#define IMREG_RBAEEN     0x0010	/* interrupt when RBA too short     */
#define IMREG_CRCEN      0x0008	/* interrupt when CRC counter rolls */
#define IMREG_FAEEN      0x0004	/* interrupt when FAE counter rolls */
#define IMREG_MPEN       0x0002	/* interrupt when MP counter rolls  */
#define IMREG_RFOEN      0x0001	/* interrupt when Rx FIFO overflows */

/* Interrupt Status Register */

#define SONIC_ISREG      0x0a
#define ISREG_BR         0x4000	/* bus retry occurred                */
#define ISREG_HBL        0x2000	/* heartbeat lost                   */
#define ISREG_LCD        0x1000	/* CAM loaded                       */
#define ISREG_PINT       0x0800	/* PINT in TDA set                  */
#define ISREG_PKTRX      0x0400	/* packet received                  */
#define ISREG_TXDN       0x0200	/* packet was sent                  */
#define ISREG_TXER       0x0100	/* send failed                      */
#define ISREG_TC         0x0080	/* timer completed                  */
#define ISREG_RDE        0x0040	/* RDA exhausted                    */
#define ISREG_RBE        0x0020	/* RBA exhausted                    */
#define ISREG_RBAE       0x0010	/* RBA too short for received frame */
#define ISREG_CRC        0x0008	/* CRC counter rolls over           */
#define ISREG_FAE        0x0004	/* FAE counter rolls over           */
#define ISREG_MP         0x0002	/* MP counter rolls  over           */
#define ISREG_RFO        0x0001	/* Rx FIFO overflows                */

#define SONIC_UTDA       0x0c	/* current transmit descr address   */
#define SONIC_CTDA       0x0e

#define SONIC_URDA       0x1a	/* current receive descr address    */
#define SONIC_CRDA       0x1c

#define SONIC_CRBA0      0x1e	/* current receive buffer address   */
#define SONIC_CRBA1      0x20

#define SONIC_RBWC0      0x22	/* word count in receive buffer     */
#define SONIC_RBWC1      0x24

#define SONIC_EOBC       0x26	/* minimum space to be free in RBA  */

#define SONIC_URRA       0x28	/* upper address of CDA & Recv Area */

#define SONIC_RSA        0x2a	/* start of receive resource area   */

#define SONIC_REA        0x2c	/* end of receive resource area     */

#define SONIC_RRP        0x2e	/* resource read pointer            */

#define SONIC_RWP        0x30	/* resource write pointer           */

#define SONIC_CAMEPTR    0x42	/* CAM entry pointer                */

#define SONIC_CAMADDR2   0x44	/* CAM address ports                */
#define SONIC_CAMADDR1   0x46
#define SONIC_CAMADDR0   0x48

#define SONIC_CAMPTR     0x4c	/* lower address of CDA             */

#define SONIC_CAMCNT     0x4e	/* # of CAM descriptors to load     */

/* Data Configuration Register 2    */

#define SONIC_DCREG2     0x7e
#define DCREG2_EXPO3     0x8000	/* extended programmable outputs    */
#define DCREG2_EXPO2     0x4000
#define DCREG2_EXPO1     0x2000
#define DCREG2_EXPO0     0x1000
#define DCREG2_HD        0x0800	/* heartbeat disable                */
#define DCREG2_JD        0x0200	/* jabber timer disable             */
#define DCREG2_AUTO      0x0100	/* enable AUI/TP auto selection     */
#define DCREG2_XWRAP     0x0040	/* TP transceiver loopback          */
#define DCREG2_PH        0x0010	/* HOLD request timing              */
#define DCREG2_PCM       0x0004	/* packet compress when matched     */
#define DCREG2_PCNM      0x0002	/* packet compress when not matched */
#define DCREG2_RJCM      0x0001	/* inverse packet match via CAM     */

/* Board Control Register: Enable RAM, Interrupts... */

#define BCMREG           0x80
#define BCMREG_RAMEN     0x80	/* switch over to RAM               */
#define BCMREG_IPEND     0x40	/* interrupt pending ?              */
#define BCMREG_RESET     0x08	/* reset board                      */
#define BCMREG_16BIT     0x04	/* adapter in 16-bit slot           */
#define BCMREG_RAMWIN    0x02	/* enable RAM window                */
#define BCMREG_IEN       0x01	/* interrupt enable                 */

/* MAC Address PROM */

#define MACADDRPROM      0x92

/* structure of a CAM entry */

typedef struct {
	u32 index;		/* pointer into CAM area            */
	u32 addr0;		/* address part (bits 0..15 used)   */
	u32 addr1;
	u32 addr2;
} camentry_t;

/* structure of a receive resource */

typedef struct {
	u32 startlo;		/* start address (bits 0..15 used)  */
	u32 starthi;
	u32 cntlo;		/* size in 16-bit quantities        */
	u32 cnthi;
} rra_t;

/* structure of a receive descriptor */

typedef struct {
	u32 status;		/* packet status                    */
	u32 length;		/* length in bytes                  */
	u32 startlo;		/* start address                    */
	u32 starthi;
	u32 seqno;		/* frame sequence                   */
	u32 link;		/* pointer to next descriptor       */
	/* bit 0 = EOL                      */
	u32 inuse;		/* !=0 --> free for SONIC to write  */
} rda_t;

/* structure of a transmit descriptor */

typedef struct {
	u32 status;		/* transmit status                  */
	u32 config;		/* value for TCR                    */
	u32 length;		/* total length                     */
	u32 fragcount;		/* number of fragments              */
	u32 startlo;		/* start address of fragment        */
	u32 starthi;
	u32 fraglength;		/* length of this fragment          */
	/* more address/length triplets may */
	/* follow here                      */
	u32 link;		/* pointer to next descriptor       */
	/* bit 0 = EOL                      */
} tda_t;

#endif				/* _IBM_LANA_DRIVER_ */

#endif	/* _IBM_LANA_INCLUDE_ */