2 * PCBIT-D low-layer interface definitions
4 * Copyright (C) 1996 Universidade de Lisboa
6 * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
8 * This software may be used and distributed according to the terms of
9 * the GNU General Public License, incorporated herein by reference.
13 * 19991203 - Fernando Carvalho - takion@superbofh.org
14 * Hacked to compile with egcs and run with current version of isdn modules
20 #include <linux/interrupt.h>
22 #include <asm/byteorder.h>
24 #define BANK1 0x0000U /* PC -> Board */
25 #define BANK2 0x01ffU /* Board -> PC */
26 #define BANK3 0x03feU /* Att Board */
27 #define BANK4 0x03ffU /* Att PC */
29 #define BANKLEN 0x01FFU
31 #define LOAD_ZONE_START 0x03f8U
32 #define LOAD_ZONE_END 0x03fdU
34 #define LOAD_RETRY 18000000
38 /* TAM - XX - C - S - NUM */
40 /* TT - M - I - TH - TD */
41 #define FRAME_HDR_LEN 8
43 #define MSG_CONN_REQ 0x08000100
44 #define MSG_CONN_CONF 0x00000101
45 #define MSG_CONN_IND 0x00000102
46 #define MSG_CONN_RESP 0x08000103
48 #define MSG_CONN_ACTV_REQ 0x08000300
49 #define MSG_CONN_ACTV_CONF 0x00000301
50 #define MSG_CONN_ACTV_IND 0x00000302
51 #define MSG_CONN_ACTV_RESP 0x08000303
53 #define MSG_DISC_REQ 0x08000400
54 #define MSG_DISC_CONF 0x00000401
55 #define MSG_DISC_IND 0x00000402
56 #define MSG_DISC_RESP 0x08000403
58 #define MSG_TDATA_REQ 0x0908E200
59 #define MSG_TDATA_CONF 0x0000E201
60 #define MSG_TDATA_IND 0x0000E202
61 #define MSG_TDATA_RESP 0x0908E203
63 #define MSG_SELP_REQ 0x09004000
64 #define MSG_SELP_CONF 0x00004001
66 #define MSG_ACT_TRANSP_REQ 0x0908E000
67 #define MSG_ACT_TRANSP_CONF 0x0000E001
69 #define MSG_STPROT_REQ 0x09004100
70 #define MSG_STPROT_CONF 0x00004101
72 #define MSG_PING188_REQ 0x09030500
73 #define MSG_PING188_CONF 0x000005bc
75 #define MSG_WATCH188 0x09030400
77 #define MSG_API_ON 0x08020102
78 #define MSG_POOL_PCBIT 0x08020400
79 #define MSG_POOL_PCBIT_CONF 0x00000401
81 #define MSG_INFO_IND 0x00002602
82 #define MSG_INFO_RESP 0x08002603
84 #define MSG_DEBUG_188 0x0000ff00
92 #ifdef __LITTLE_ENDIAN
93 #define SET_MSG_SCMD(msg, ch) (msg = (msg & 0xffffff00) | (((ch) & 0xff)))
94 #define SET_MSG_CMD(msg, ch) (msg = (msg & 0xffff00ff) | (((ch) & 0xff) << 8))
95 #define SET_MSG_PROC(msg, ch) (msg = (msg & 0xff00ffff) | (((ch) & 0xff) << 16))
96 #define SET_MSG_CPU(msg, ch) (msg = (msg & 0x00ffffff) | (((ch) & 0xff) << 24))
98 #define GET_MSG_SCMD(msg) ((msg) & 0xFF)
99 #define GET_MSG_CMD(msg) ((msg) >> 8 & 0xFF)
100 #define GET_MSG_PROC(msg) ((msg) >> 16 & 0xFF)
101 #define GET_MSG_CPU(msg) ((msg) >> 24)
104 #error "Non-Intel CPU"
109 #define SCHED_READ 0x01
110 #define SCHED_WRITE 0x02
112 #define SET_RUN_TIMEOUT 2*HZ /* 2 seconds */
118 unsigned int hdr_len
;
121 struct frame_buf
* next
;
124 extern int pcbit_l2_write(struct pcbit_dev
* dev
, ulong msg
, ushort refnum
,
125 struct sk_buff
*skb
, unsigned short hdr_len
);
127 extern irqreturn_t
pcbit_irq_handler(int interrupt
, void *, struct pt_regs
*regs
);
129 extern struct pcbit_dev
* dev_pcbit
[MAX_PCBIT_CARDS
];
132 static __inline__
void log_state(struct pcbit_dev
*dev
) {
133 printk(KERN_DEBUG
"writeptr = %ld\n",
134 (ulong
) (dev
->writeptr
- dev
->sh_mem
));
135 printk(KERN_DEBUG
"readptr = %ld\n",
136 (ulong
) (dev
->readptr
- (dev
->sh_mem
+ BANK2
)));
137 printk(KERN_DEBUG
"{rcv_seq=%01x, send_seq=%01x, unack_seq=%01x}\n",
138 dev
->rcv_seq
, dev
->send_seq
, dev
->unack_seq
);
142 static __inline__
struct pcbit_dev
* chan2dev(struct pcbit_chan
* chan
)
144 struct pcbit_dev
* dev
;
148 for (i
=0; i
<MAX_PCBIT_CARDS
; i
++)
149 if ((dev
=dev_pcbit
[i
]))
150 if (dev
->b1
== chan
|| dev
->b2
== chan
)
156 static __inline__
struct pcbit_dev
* finddev(int id
)
158 struct pcbit_dev
* dev
;
161 for (i
=0; i
<MAX_PCBIT_CARDS
; i
++)
162 if ((dev
=dev_pcbit
[i
]))
170 * Support routines for reading and writing in the board
173 static __inline__
void pcbit_writeb(struct pcbit_dev
*dev
, unsigned char dt
)
175 writeb(dt
, dev
->writeptr
++);
176 if (dev
->writeptr
== dev
->sh_mem
+ BANKLEN
)
177 dev
->writeptr
= dev
->sh_mem
;
180 static __inline__
void pcbit_writew(struct pcbit_dev
*dev
, unsigned short dt
)
184 dist
= BANKLEN
- (dev
->writeptr
- dev
->sh_mem
);
187 writew(dt
, dev
->writeptr
);
188 dev
->writeptr
= dev
->sh_mem
;
191 writeb((u_char
) (dt
& 0x00ffU
), dev
->writeptr
);
192 dev
->writeptr
= dev
->sh_mem
;
193 writeb((u_char
) (dt
>> 8), dev
->writeptr
++);
196 writew(dt
, dev
->writeptr
);
202 static __inline__
void memcpy_topcbit(struct pcbit_dev
* dev
, u_char
* data
,
207 diff
= len
- (BANKLEN
- (dev
->writeptr
- dev
->sh_mem
) );
211 memcpy_toio(dev
->writeptr
, data
, len
- diff
);
212 memcpy_toio(dev
->sh_mem
, data
+ (len
- diff
), diff
);
213 dev
->writeptr
= dev
->sh_mem
+ diff
;
217 memcpy_toio(dev
->writeptr
, data
, len
);
219 dev
->writeptr
+= len
;
221 dev
->writeptr
= dev
->sh_mem
;
225 static __inline__
unsigned char pcbit_readb(struct pcbit_dev
*dev
)
229 val
= readb(dev
->readptr
++);
230 if (dev
->readptr
== dev
->sh_mem
+ BANK2
+ BANKLEN
)
231 dev
->readptr
= dev
->sh_mem
+ BANK2
;
236 static __inline__
unsigned short pcbit_readw(struct pcbit_dev
*dev
)
241 dist
= BANKLEN
- ( dev
->readptr
- (dev
->sh_mem
+ BANK2
) );
244 val
= readw(dev
->readptr
);
245 dev
->readptr
= dev
->sh_mem
+ BANK2
;
248 val
= readb(dev
->readptr
);
249 dev
->readptr
= dev
->sh_mem
+ BANK2
;
250 val
= (readb(dev
->readptr
++) << 8) | val
;
253 val
= readw(dev
->readptr
);
260 static __inline__
void memcpy_frompcbit(struct pcbit_dev
* dev
, u_char
* data
, int len
)
264 diff
= len
- (BANKLEN
- (dev
->readptr
- (dev
->sh_mem
+ BANK2
) ) );
267 memcpy_fromio(data
, dev
->readptr
, len
- diff
);
268 memcpy_fromio(data
+ (len
- diff
), dev
->sh_mem
+ BANK2
, diff
);
269 dev
->readptr
= dev
->sh_mem
+ BANK2
+ diff
;
273 memcpy_fromio(data
, dev
->readptr
, len
);
276 dev
->readptr
= dev
->sh_mem
+ BANK2
;