Merge branch 'master' into gfs2
[pandora-kernel.git] / drivers / net / wan / pc300.h
1 /*
2  * pc300.h      Cyclades-PC300(tm) Kernel API Definitions.
3  *
4  * Author:      Ivan Passos <ivan@cyclades.com>
5  *
6  * Copyright:   (c) 1999-2002 Cyclades Corp.
7  *
8  *      This program is free software; you can redistribute it and/or
9  *      modify it under the terms of the GNU General Public License
10  *      as published by the Free Software Foundation; either version
11  *      2 of the License, or (at your option) any later version.
12  *
13  * $Log: pc300.h,v $
14  * Revision 3.12  2002/03/07 14:17:09  henrique
15  * License data fixed
16  *
17  * Revision 3.11  2002/01/28 21:09:39  daniela
18  * Included ';' after pc300hw.bus.
19  *
20  * Revision 3.10  2002/01/17 17:58:52  ivan
21  * Support for PC300-TE/M (PMC).
22  *
23  * Revision 3.9  2001/09/28 13:30:53  daniela
24  * Renamed dma_start routine to rx_dma_start.
25  *
26  * Revision 3.8  2001/09/24 13:03:45  daniela
27  * Fixed BOF interrupt treatment. Created dma_start routine.
28  *
29  * Revision 3.7  2001/08/10 17:19:58  daniela
30  * Fixed IOCTLs defines.
31  *
32  * Revision 3.6  2001/07/18 19:24:42  daniela
33  * Included kernel version.
34  *
35  * Revision 3.5  2001/07/05 18:38:08  daniela
36  * DMA transmission bug fix.
37  *
38  * Revision 3.4  2001/06/26 17:10:40  daniela
39  * New configuration parameters (line code, CRC calculation and clock).
40  *
41  * Revision 3.3  2001/06/22 13:13:02  regina
42  * MLPPP implementation
43  *
44  * Revision 3.2  2001/06/18 17:56:09  daniela
45  * Increased DEF_MTU and TX_QUEUE_LEN.
46  *
47  * Revision 3.1  2001/06/15 12:41:10  regina
48  * upping major version number
49  *
50  * Revision 1.1.1.1  2001/06/13 20:25:06  daniela
51  * PC300 initial CVS version (3.4.0-pre1)
52  *
53  * Revision 2.3 2001/03/05 daniela
54  * Created struct pc300conf, to provide the hardware information to pc300util.
55  * Inclusion of 'alloc_ramsize' field on structure 'pc300hw'.
56  * 
57  * Revision 2.2 2000/12/22 daniela
58  * Structures and defines to support pc300util: statistics, status, 
59  * loopback tests, trace.
60  * 
61  * Revision 2.1 2000/09/28 ivan
62  * Inclusion of 'iophys' and 'iosize' fields on structure 'pc300hw', to 
63  * allow release of I/O region at module unload.
64  * Changed location of include files.
65  *
66  * Revision 2.0 2000/03/27 ivan
67  * Added support for the PC300/TE cards.
68  *
69  * Revision 1.1 2000/01/31 ivan
70  * Replaced 'pc300[drv|sca].h' former PC300 driver include files.
71  *
72  * Revision 1.0 1999/12/16 ivan
73  * First official release.
74  * Inclusion of 'nchan' field on structure 'pc300hw', to allow variable 
75  * number of ports per card.
76  * Inclusion of 'if_ptr' field on structure 'pc300dev'.
77  *
78  * Revision 0.6 1999/11/17 ivan
79  * Changed X.25-specific function names to comply with adopted convention.
80  *
81  * Revision 0.5 1999/11/16 Daniela Squassoni
82  * X.25 support.
83  *
84  * Revision 0.4 1999/11/15 ivan
85  * Inclusion of 'clock' field on structure 'pc300hw'.
86  *
87  * Revision 0.3 1999/11/10 ivan
88  * IOCTL name changing.
89  * Inclusion of driver function prototypes.
90  *
91  * Revision 0.2 1999/11/03 ivan
92  * Inclusion of 'tx_skb' and union 'ifu' on structure 'pc300dev'.
93  *
94  * Revision 0.1 1999/01/15 ivan
95  * Initial version.
96  *
97  */
98
99 #ifndef _PC300_H
100 #define _PC300_H
101
102 #include <linux/hdlc.h>
103 #include <net/syncppp.h>
104 #include "hd64572.h"
105 #include "pc300-falc-lh.h"
106
107 #ifndef CY_TYPES
108 #define CY_TYPES
109 typedef __u64   ucdouble;       /* 64 bits, unsigned */
110 typedef __u32   uclong;         /* 32 bits, unsigned */
111 typedef __u16   ucshort;        /* 16 bits, unsigned */
112 typedef __u8    ucchar;         /* 8 bits, unsigned */
113 #endif /* CY_TYPES */
114
115 #define PC300_PROTO_MLPPP 1             
116
117 #define PC300_KERNEL    "2.4.x" /* Kernel supported by this driver */
118
119 #define PC300_DEVNAME   "hdlc"  /* Dev. name base (for hdlc0, hdlc1, etc.) */
120 #define PC300_MAXINDEX  100     /* Max dev. name index (the '0' in hdlc0) */
121
122 #define PC300_MAXCARDS  4       /* Max number of cards per system */
123 #define PC300_MAXCHAN   2       /* Number of channels per card */
124
125 #define PC300_PLX_WIN   0x80    /* PLX control window size (128b) */
126 #define PC300_RAMSIZE   0x40000 /* RAM window size (256Kb) */
127 #define PC300_SCASIZE   0x400   /* SCA window size (1Kb) */
128 #define PC300_FALCSIZE  0x400   /* FALC window size (1Kb) */
129
130 #define PC300_OSC_CLOCK 24576000
131 #define PC300_PCI_CLOCK 33000000
132
133 #define BD_DEF_LEN      0x0800  /* DMA buffer length (2KB) */
134 #define DMA_TX_MEMSZ    0x8000  /* Total DMA Tx memory size (32KB/ch) */
135 #define DMA_RX_MEMSZ    0x10000 /* Total DMA Rx memory size (64KB/ch) */
136
137 #define N_DMA_TX_BUF    (DMA_TX_MEMSZ / BD_DEF_LEN)     /* DMA Tx buffers */
138 #define N_DMA_RX_BUF    (DMA_RX_MEMSZ / BD_DEF_LEN)     /* DMA Rx buffers */
139
140 /* DMA Buffer Offsets */
141 #define DMA_TX_BASE     ((N_DMA_TX_BUF + N_DMA_RX_BUF) *        \
142                          PC300_MAXCHAN * sizeof(pcsca_bd_t))
143 #define DMA_RX_BASE     (DMA_TX_BASE + PC300_MAXCHAN*DMA_TX_MEMSZ)
144
145 /* DMA Descriptor Offsets */
146 #define DMA_TX_BD_BASE  0x0000
147 #define DMA_RX_BD_BASE  (DMA_TX_BD_BASE + ((PC300_MAXCHAN*DMA_TX_MEMSZ / \
148                                 BD_DEF_LEN) * sizeof(pcsca_bd_t)))
149
150 /* DMA Descriptor Macros */
151 #define TX_BD_ADDR(chan, n)     (DMA_TX_BD_BASE + \
152                                  ((N_DMA_TX_BUF*chan) + n) * sizeof(pcsca_bd_t))
153 #define RX_BD_ADDR(chan, n)     (DMA_RX_BD_BASE + \
154                                  ((N_DMA_RX_BUF*chan) + n) * sizeof(pcsca_bd_t))
155
156 /* Macro to access the FALC registers (TE only) */
157 #define F_REG(reg, chan)        (0x200*(chan) + ((reg)<<2))
158
159 /***************************************
160  * Memory access functions/macros      *
161  * (required to support Alpha systems) *
162  ***************************************/
163 #ifdef __KERNEL__
164 #define cpc_writeb(port,val)    {writeb((ucchar)(val),(port)); mb();}
165 #define cpc_writew(port,val)    {writew((ushort)(val),(port)); mb();}
166 #define cpc_writel(port,val)    {writel((uclong)(val),(port)); mb();}
167
168 #define cpc_readb(port)         readb(port)
169 #define cpc_readw(port)         readw(port)
170 #define cpc_readl(port)         readl(port)
171
172 #else /* __KERNEL__ */
173 #define cpc_writeb(port,val)    (*(volatile ucchar *)(port) = (ucchar)(val))
174 #define cpc_writew(port,val)    (*(volatile ucshort *)(port) = (ucshort)(val))
175 #define cpc_writel(port,val)    (*(volatile uclong *)(port) = (uclong)(val))
176
177 #define cpc_readb(port)         (*(volatile ucchar *)(port))
178 #define cpc_readw(port)         (*(volatile ucshort *)(port))
179 #define cpc_readl(port)         (*(volatile uclong *)(port))
180
181 #endif /* __KERNEL__ */
182
183 /****** Data Structures *****************************************************/
184
185 /*
186  *      RUNTIME_9050 - PLX PCI9050-1 local configuration and shared runtime
187  *      registers. This structure can be used to access the 9050 registers
188  *      (memory mapped).
189  */
190 struct RUNTIME_9050 {
191         uclong  loc_addr_range[4];      /* 00-0Ch : Local Address Ranges */
192         uclong  loc_rom_range;          /* 10h : Local ROM Range */
193         uclong  loc_addr_base[4];       /* 14-20h : Local Address Base Addrs */
194         uclong  loc_rom_base;           /* 24h : Local ROM Base */
195         uclong  loc_bus_descr[4];       /* 28-34h : Local Bus Descriptors */
196         uclong  rom_bus_descr;          /* 38h : ROM Bus Descriptor */
197         uclong  cs_base[4];             /* 3C-48h : Chip Select Base Addrs */
198         uclong  intr_ctrl_stat;         /* 4Ch : Interrupt Control/Status */
199         uclong  init_ctrl;              /* 50h : EEPROM ctrl, Init Ctrl, etc */
200 };
201
202 #define PLX_9050_LINT1_ENABLE   0x01
203 #define PLX_9050_LINT1_POL      0x02
204 #define PLX_9050_LINT1_STATUS   0x04
205 #define PLX_9050_LINT2_ENABLE   0x08
206 #define PLX_9050_LINT2_POL      0x10
207 #define PLX_9050_LINT2_STATUS   0x20
208 #define PLX_9050_INTR_ENABLE    0x40
209 #define PLX_9050_SW_INTR        0x80
210
211 /* Masks to access the init_ctrl PLX register */
212 #define PC300_CLKSEL_MASK               (0x00000004UL)
213 #define PC300_CHMEDIA_MASK(chan)        (0x00000020UL<<(chan*3))
214 #define PC300_CTYPE_MASK                (0x00000800UL)
215
216 /* CPLD Registers (base addr = falcbase, TE only) */
217 /* CPLD v. 0 */
218 #define CPLD_REG1       0x140   /* Chip resets, DCD/CTS status */
219 #define CPLD_REG2       0x144   /* Clock enable , LED control */
220 /* CPLD v. 2 or higher */
221 #define CPLD_V2_REG1    0x100   /* Chip resets, DCD/CTS status */
222 #define CPLD_V2_REG2    0x104   /* Clock enable , LED control */
223 #define CPLD_ID_REG     0x108   /* CPLD version */
224
225 /* CPLD Register bit description: for the FALC bits, they should always be 
226    set based on the channel (use (bit<<(2*ch)) to access the correct bit for 
227    that channel) */
228 #define CPLD_REG1_FALC_RESET    0x01
229 #define CPLD_REG1_SCA_RESET     0x02
230 #define CPLD_REG1_GLOBAL_CLK    0x08
231 #define CPLD_REG1_FALC_DCD      0x10
232 #define CPLD_REG1_FALC_CTS      0x20
233
234 #define CPLD_REG2_FALC_TX_CLK   0x01
235 #define CPLD_REG2_FALC_RX_CLK   0x02
236 #define CPLD_REG2_FALC_LED1     0x10
237 #define CPLD_REG2_FALC_LED2     0x20
238
239 /* Structure with FALC-related fields (TE only) */
240 #define PC300_FALC_MAXLOOP      0x0000ffff      /* for falc_issue_cmd() */
241
242 typedef struct falc {
243         ucchar sync;            /* If true FALC is synchronized */
244         ucchar active;          /* if TRUE then already active */
245         ucchar loop_active;     /* if TRUE a line loopback UP was received */
246         ucchar loop_gen;        /* if TRUE a line loopback UP was issued */
247
248         ucchar num_channels;
249         ucchar offset;          /* 1 for T1, 0 for E1 */
250         ucchar full_bandwidth;
251
252         ucchar xmb_cause;
253         ucchar multiframe_mode;
254
255         /* Statistics */
256         ucshort pden;   /* Pulse Density violation count */
257         ucshort los;    /* Loss of Signal count */
258         ucshort losr;   /* Loss of Signal recovery count */
259         ucshort lfa;    /* Loss of frame alignment count */
260         ucshort farec;  /* Frame Alignment Recovery count */
261         ucshort lmfa;   /* Loss of multiframe alignment count */
262         ucshort ais;    /* Remote Alarm indication Signal count */
263         ucshort sec;    /* One-second timer */
264         ucshort es;     /* Errored second */
265         ucshort rai;    /* remote alarm received */
266         ucshort bec;
267         ucshort fec;
268         ucshort cvc;
269         ucshort cec;
270         ucshort ebc;
271
272         /* Status */
273         ucchar red_alarm;
274         ucchar blue_alarm;
275         ucchar loss_fa;
276         ucchar yellow_alarm;
277         ucchar loss_mfa;
278         ucchar prbs;
279 } falc_t;
280
281 typedef struct falc_status {
282         ucchar sync;  /* If true FALC is synchronized */
283         ucchar red_alarm;
284         ucchar blue_alarm;
285         ucchar loss_fa;
286         ucchar yellow_alarm;
287         ucchar loss_mfa;
288         ucchar prbs;
289 } falc_status_t;
290
291 typedef struct rsv_x21_status {
292         ucchar dcd;
293         ucchar dsr;
294         ucchar cts;
295         ucchar rts;
296         ucchar dtr;
297 } rsv_x21_status_t;
298
299 typedef struct pc300stats {
300         int hw_type;
301         uclong line_on;
302         uclong line_off;
303         struct net_device_stats gen_stats;
304         falc_t te_stats;
305 } pc300stats_t;
306
307 typedef struct pc300status {
308         int hw_type;
309         rsv_x21_status_t gen_status;
310         falc_status_t te_status;
311 } pc300status_t;
312
313 typedef struct pc300loopback {
314         char loop_type;
315         char loop_on;
316 } pc300loopback_t;
317
318 typedef struct pc300patterntst {
319         char patrntst_on;       /* 0 - off; 1 - on; 2 - read num_errors */
320         ucshort num_errors;
321 } pc300patterntst_t;
322
323 typedef struct pc300dev {
324         void *if_ptr;           /* General purpose pointer */
325         struct pc300ch *chan;
326         ucchar trace_on;
327         uclong line_on;         /* DCD(X.21, RSV) / sync(TE) change counters */
328         uclong line_off;
329 #ifdef __KERNEL__
330         char name[16];
331         struct net_device *dev;
332
333         void *private;
334         struct sk_buff *tx_skb;
335         union { /* This union has all the protocol-specific structures */
336                 struct ppp_device pppdev;
337         }ifu;
338 #ifdef CONFIG_PC300_MLPPP
339         void *cpc_tty;  /* information to PC300 TTY driver */
340 #endif
341 #endif /* __KERNEL__ */
342 }pc300dev_t;
343
344 typedef struct pc300hw {
345         int type;               /* RSV, X21, etc. */
346         int bus;                /* Bus (PCI, PMC, etc.) */
347         int nchan;              /* number of channels */
348         int irq;                /* interrupt request level */
349         uclong clock;           /* Board clock */
350         ucchar cpld_id;         /* CPLD ID (TE only) */
351         ucshort cpld_reg1;      /* CPLD reg 1 (TE only) */
352         ucshort cpld_reg2;      /* CPLD reg 2 (TE only) */
353         ucshort gpioc_reg;      /* PLX GPIOC reg */
354         ucshort intctl_reg;     /* PLX Int Ctrl/Status reg */
355         uclong iophys;          /* PLX registers I/O base */
356         uclong iosize;          /* PLX registers I/O size */
357         uclong plxphys;         /* PLX registers MMIO base (physical) */
358         void __iomem * plxbase; /* PLX registers MMIO base (virtual) */
359         uclong plxsize;         /* PLX registers MMIO size */
360         uclong scaphys;         /* SCA registers MMIO base (physical) */
361         void __iomem * scabase; /* SCA registers MMIO base (virtual) */
362         uclong scasize;         /* SCA registers MMIO size */
363         uclong ramphys;         /* On-board RAM MMIO base (physical) */
364         void __iomem * rambase; /* On-board RAM MMIO base (virtual) */
365         uclong alloc_ramsize;   /* RAM MMIO size allocated by the PCI bridge */
366         uclong ramsize;         /* On-board RAM MMIO size */
367         uclong falcphys;        /* FALC registers MMIO base (physical) */
368         void __iomem * falcbase;/* FALC registers MMIO base (virtual) */
369         uclong falcsize;        /* FALC registers MMIO size */
370 } pc300hw_t;
371
372 typedef struct pc300chconf {
373         sync_serial_settings    phys_settings;  /* Clock type/rate (in bps), 
374                                                    loopback mode */
375         raw_hdlc_proto          proto_settings; /* Encoding, parity (CRC) */
376         uclong media;           /* HW media (RS232, V.35, etc.) */
377         uclong proto;           /* Protocol (PPP, X.25, etc.) */
378         ucchar monitor;         /* Monitor mode (0 = off, !0 = on) */
379
380         /* TE-specific parameters */
381         ucchar lcode;           /* Line Code (AMI, B8ZS, etc.) */
382         ucchar fr_mode;         /* Frame Mode (ESF, D4, etc.) */
383         ucchar lbo;             /* Line Build Out */
384         ucchar rx_sens;         /* Rx Sensitivity (long- or short-haul) */
385         uclong tslot_bitmap;    /* bit[i]=1  =>  timeslot _i_ is active */
386 } pc300chconf_t;
387
388 typedef struct pc300ch {
389         struct pc300 *card;
390         int channel;
391         pc300dev_t d;
392         pc300chconf_t conf;
393         ucchar tx_first_bd;     /* First TX DMA block descr. w/ data */
394         ucchar tx_next_bd;      /* Next free TX DMA block descriptor */
395         ucchar rx_first_bd;     /* First free RX DMA block descriptor */
396         ucchar rx_last_bd;      /* Last free RX DMA block descriptor */
397         ucchar nfree_tx_bd;     /* Number of free TX DMA block descriptors */
398         falc_t falc;            /* FALC structure (TE only) */
399 } pc300ch_t;
400
401 typedef struct pc300 {
402         pc300hw_t hw;                   /* hardware config. */
403         pc300ch_t chan[PC300_MAXCHAN];
404 #ifdef __KERNEL__
405         spinlock_t card_lock;
406 #endif /* __KERNEL__ */
407 } pc300_t;
408
409 typedef struct pc300conf {
410         pc300hw_t hw;
411         pc300chconf_t conf;
412 } pc300conf_t;
413
414 /* DEV ioctl() commands */
415 #define N_SPPP_IOCTLS   2
416
417 enum pc300_ioctl_cmds {
418         SIOCCPCRESERVED = (SIOCDEVPRIVATE + N_SPPP_IOCTLS),
419         SIOCGPC300CONF,
420         SIOCSPC300CONF,
421         SIOCGPC300STATUS,
422         SIOCGPC300FALCSTATUS,
423         SIOCGPC300UTILSTATS,
424         SIOCGPC300UTILSTATUS,
425         SIOCSPC300TRACE,
426         SIOCSPC300LOOPBACK,
427         SIOCSPC300PATTERNTEST,
428 };
429
430 /* Loopback types - PC300/TE boards */
431 enum pc300_loopback_cmds {
432         PC300LOCLOOP = 1,
433         PC300REMLOOP,
434         PC300PAYLOADLOOP,
435         PC300GENLOOPUP,
436         PC300GENLOOPDOWN,
437 };
438
439 /* Control Constant Definitions */
440 #define PC300_RSV       0x01
441 #define PC300_X21       0x02
442 #define PC300_TE        0x03
443
444 #define PC300_PCI       0x00
445 #define PC300_PMC       0x01
446
447 #define PC300_LC_AMI    0x01
448 #define PC300_LC_B8ZS   0x02
449 #define PC300_LC_NRZ    0x03
450 #define PC300_LC_HDB3   0x04
451
452 /* Framing (T1) */
453 #define PC300_FR_ESF            0x01
454 #define PC300_FR_D4             0x02
455 #define PC300_FR_ESF_JAPAN      0x03
456
457 /* Framing (E1) */
458 #define PC300_FR_MF_CRC4        0x04
459 #define PC300_FR_MF_NON_CRC4    0x05
460 #define PC300_FR_UNFRAMED       0x06
461
462 #define PC300_LBO_0_DB          0x00
463 #define PC300_LBO_7_5_DB        0x01
464 #define PC300_LBO_15_DB         0x02
465 #define PC300_LBO_22_5_DB       0x03
466
467 #define PC300_RX_SENS_SH        0x01
468 #define PC300_RX_SENS_LH        0x02
469
470 #define PC300_TX_TIMEOUT        (2*HZ)
471 #define PC300_TX_QUEUE_LEN      100
472 #define PC300_DEF_MTU           1600
473
474 #ifdef __KERNEL__
475 /* Function Prototypes */
476 void tx_dma_start(pc300_t *, int);
477 int cpc_open(struct net_device *dev);
478 int cpc_set_media(hdlc_device *, int);
479 #endif /* __KERNEL__ */
480
481 #endif  /* _PC300_H */
482