1 /* $Id: avmcard.h,v 1.1.4.1.2.1 2001/12/21 15:00:17 kai Exp $
3 * Copyright 1999 by Carsten Paeth <calle@calle.de>
5 * This software may be used and distributed according to the terms
6 * of the GNU General Public License, incorporated herein by reference.
13 #include <linux/spinlock.h>
14 #include <linux/list.h>
15 #include <linux/interrupt.h>
17 #define AVMB1_PORTLEN 0x1f
18 #define AVM_MAXVERSION 8
19 #define AVM_NCCI_PER_CHANNEL 4
26 #define VER_CARDTYPE 1
46 typedef struct avmcard_dmabuf
{
52 typedef struct avmcard_dmainfo
{
54 avmcard_dmabuf recvbuf
;
56 avmcard_dmabuf sendbuf
;
57 struct sk_buff_head send_queue
;
59 struct pci_dev
*pcidev
;
62 typedef struct avmctrl_info
{
66 char versionbuf
[1024];
67 char *version
[AVM_MAXVERSION
];
69 char infobuf
[128]; /* for function procinfo */
72 struct capi_ctr capi_ctrl
;
74 struct list_head ncci_head
;
77 typedef struct avmcard
{
83 unsigned long membase
;
84 enum avmcardtype cardtype
;
85 unsigned char revision
;
87 int cardnr
; /* for t1isa */
89 char msgbuf
[128]; /* capimsg msg part */
90 char databuf
[2048]; /* capimsg data part */
96 struct avmctrl_info
*ctrlinfo
;
100 struct list_head list
;
103 extern int b1_irq_table
[16];
106 * LLI Messages to the ISDN-ControllerISDN Controller
109 #define SEND_POLL 0x72 /*
110 * after load <- RECEIVE_POLL
112 #define SEND_INIT 0x11 /*
113 * first message <- RECEIVE_INIT
114 * int32 NumApplications int32
115 * NumNCCIs int32 BoardNumber
117 #define SEND_REGISTER 0x12 /*
118 * register an application int32
119 * ApplIDId int32 NumMessages
120 * int32 NumB3Connections int32
121 * NumB3Blocks int32 B3Size
123 * AnzB3Connection != 0 &&
124 * AnzB3Blocks >= 1 && B3Size >= 1
126 #define SEND_RELEASE 0x14 /*
127 * deregister an application int32
130 #define SEND_MESSAGE 0x15 /*
131 * send capi-message int32 length
134 #define SEND_DATA_B3_REQ 0x13 /*
135 * send capi-data-message int32
136 * MsgLength capi-data ... int32
140 #define SEND_CONFIG 0x21 /*
143 #define SEND_POLLACK 0x73 /* T1 Watchdog */
146 * LLI Messages from the ISDN-ControllerISDN Controller
149 #define RECEIVE_POLL 0x32 /*
152 #define RECEIVE_INIT 0x27 /*
153 * <- after SEND_INIT int32 length
154 * byte total length b1struct board
155 * driver revision b1struct card
156 * type b1struct reserved b1struct
157 * serial number b1struct driver
158 * capability b1struct d-channel
159 * protocol b1struct CAPI-2.0
160 * profile b1struct capi version
162 #define RECEIVE_MESSAGE 0x21 /*
163 * <- after SEND_MESSAGE int32
164 * AppllID int32 Length capi-data
167 #define RECEIVE_DATA_B3_IND 0x22 /*
168 * received data int32 AppllID
169 * int32 Length capi-data ...
170 * int32 B3Length data ...
172 #define RECEIVE_START 0x23 /*
175 #define RECEIVE_STOP 0x24 /*
178 #define RECEIVE_NEW_NCCI 0x25 /*
179 * int32 AppllID int32 NCCI int32
182 #define RECEIVE_FREE_NCCI 0x26 /*
183 * int32 AppllID int32 NCCI
185 #define RECEIVE_RELEASE 0x26 /*
186 * int32 AppllID int32 0xffffffff
188 #define RECEIVE_TASK_READY 0x31 /*
190 * int32 Length Taskname ...
192 #define RECEIVE_DEBUGMSG 0x71 /*
193 * int32 Length message
196 #define RECEIVE_POLLDWORD 0x75 /* t1pci in dword mode */
198 #define WRITE_REGISTER 0x00
199 #define READ_REGISTER 0x01
206 #define B1_WRITE 0x01
207 #define B1_INSTAT 0x02
208 #define B1_OUTSTAT 0x03
209 #define B1_ANALYSE 0x04
210 #define B1_REVISION 0x05
211 #define B1_RESET 0x10
214 #define B1_STAT0(cardtype) ((cardtype) == avm_m1 ? 0x81200000l : 0x80A00000l)
215 #define B1_STAT1(cardtype) (0x80E00000l)
217 /* ---------------------------------------------------------------- */
219 static inline unsigned char b1outp(unsigned int base
,
220 unsigned short offset
,
223 outb(value
, base
+ offset
);
224 return inb(base
+ B1_ANALYSE
);
228 static inline int b1_rx_full(unsigned int base
)
230 return inb(base
+ B1_INSTAT
) & 0x1;
233 static inline unsigned char b1_get_byte(unsigned int base
)
235 unsigned long stop
= jiffies
+ 1 * HZ
; /* maximum wait time 1 sec */
236 while (!b1_rx_full(base
) && time_before(jiffies
, stop
));
237 if (b1_rx_full(base
))
238 return inb(base
+ B1_READ
);
239 printk(KERN_CRIT
"b1lli(0x%x): rx not full after 1 second\n", base
);
243 static inline unsigned int b1_get_word(unsigned int base
)
245 unsigned int val
= 0;
246 val
|= b1_get_byte(base
);
247 val
|= (b1_get_byte(base
) << 8);
248 val
|= (b1_get_byte(base
) << 16);
249 val
|= (b1_get_byte(base
) << 24);
253 static inline int b1_tx_empty(unsigned int base
)
255 return inb(base
+ B1_OUTSTAT
) & 0x1;
258 static inline void b1_put_byte(unsigned int base
, unsigned char val
)
260 while (!b1_tx_empty(base
));
261 b1outp(base
, B1_WRITE
, val
);
264 static inline int b1_save_put_byte(unsigned int base
, unsigned char val
)
266 unsigned long stop
= jiffies
+ 2 * HZ
;
267 while (!b1_tx_empty(base
) && time_before(jiffies
, stop
));
268 if (!b1_tx_empty(base
)) return -1;
269 b1outp(base
, B1_WRITE
, val
);
273 static inline void b1_put_word(unsigned int base
, unsigned int val
)
275 b1_put_byte(base
, val
& 0xff);
276 b1_put_byte(base
, (val
>> 8) & 0xff);
277 b1_put_byte(base
, (val
>> 16) & 0xff);
278 b1_put_byte(base
, (val
>> 24) & 0xff);
281 static inline unsigned int b1_get_slice(unsigned int base
,
286 len
= i
= b1_get_word(base
);
287 while (i
-- > 0) *dp
++ = b1_get_byte(base
);
291 static inline void b1_put_slice(unsigned int base
,
292 unsigned char *dp
, unsigned int len
)
295 b1_put_word(base
, i
);
297 b1_put_byte(base
, *dp
++);
300 static void b1_wr_reg(unsigned int base
,
304 b1_put_byte(base
, WRITE_REGISTER
);
305 b1_put_word(base
, reg
);
306 b1_put_word(base
, value
);
309 static inline unsigned int b1_rd_reg(unsigned int base
,
312 b1_put_byte(base
, READ_REGISTER
);
313 b1_put_word(base
, reg
);
314 return b1_get_word(base
);
318 static inline void b1_reset(unsigned int base
)
320 b1outp(base
, B1_RESET
, 0);
321 mdelay(55 * 2); /* 2 TIC's */
323 b1outp(base
, B1_RESET
, 1);
324 mdelay(55 * 2); /* 2 TIC's */
326 b1outp(base
, B1_RESET
, 0);
327 mdelay(55 * 2); /* 2 TIC's */
330 static inline unsigned char b1_disable_irq(unsigned int base
)
332 return b1outp(base
, B1_INSTAT
, 0x00);
335 /* ---------------------------------------------------------------- */
337 static inline void b1_set_test_bit(unsigned int base
,
338 enum avmcardtype cardtype
,
341 b1_wr_reg(base
, B1_STAT0(cardtype
), onoff
? 0x21 : 0x20);
344 static inline int b1_get_test_bit(unsigned int base
,
345 enum avmcardtype cardtype
)
347 return (b1_rd_reg(base
, B1_STAT0(cardtype
)) & 0x01) != 0;
350 /* ---------------------------------------------------------------- */
352 #define T1_FASTLINK 0x00
353 #define T1_SLOWLINK 0x08
355 #define T1_READ B1_READ
356 #define T1_WRITE B1_WRITE
357 #define T1_INSTAT B1_INSTAT
358 #define T1_OUTSTAT B1_OUTSTAT
359 #define T1_IRQENABLE 0x05
360 #define T1_FIFOSTAT 0x06
361 #define T1_RESETLINK 0x10
362 #define T1_ANALYSE 0x11
363 #define T1_IRQMASTER 0x12
364 #define T1_IDENT 0x17
365 #define T1_RESETBOARD 0x1f
367 #define T1F_IREADY 0x01
368 #define T1F_IHALF 0x02
369 #define T1F_IFULL 0x04
370 #define T1F_IEMPTY 0x08
371 #define T1F_IFLAGS 0xF0
373 #define T1F_OREADY 0x10
374 #define T1F_OHALF 0x20
375 #define T1F_OEMPTY 0x40
376 #define T1F_OFULL 0x80
377 #define T1F_OFLAGS 0xF0
379 /* there are HEMA cards with 1k and 4k FIFO out */
380 #define FIFO_OUTBSIZE 256
381 #define FIFO_INPBSIZE 512
383 #define HEMA_VERSION_ID 0
384 #define HEMA_PAL_ID 0
386 static inline void t1outp(unsigned int base
,
387 unsigned short offset
,
390 outb(value
, base
+ offset
);
393 static inline unsigned char t1inp(unsigned int base
,
394 unsigned short offset
)
396 return inb(base
+ offset
);
399 static inline int t1_isfastlink(unsigned int base
)
401 return (inb(base
+ T1_IDENT
) & ~0x82) == 1;
404 static inline unsigned char t1_fifostatus(unsigned int base
)
406 return inb(base
+ T1_FIFOSTAT
);
409 static inline unsigned int t1_get_slice(unsigned int base
,
413 #ifdef FASTLINK_DEBUG
414 unsigned wcnt
= 0, bcnt
= 0;
417 len
= i
= b1_get_word(base
);
418 if (t1_isfastlink(base
)) {
421 status
= t1_fifostatus(base
) & (T1F_IREADY
| T1F_IHALF
);
422 if (i
>= FIFO_INPBSIZE
) status
|= T1F_IFULL
;
425 case T1F_IREADY
| T1F_IHALF
| T1F_IFULL
:
426 insb(base
+ B1_READ
, dp
, FIFO_INPBSIZE
);
429 #ifdef FASTLINK_DEBUG
430 wcnt
+= FIFO_INPBSIZE
;
433 case T1F_IREADY
| T1F_IHALF
:
434 insb(base
+ B1_READ
, dp
, i
);
435 #ifdef FASTLINK_DEBUG
442 *dp
++ = b1_get_byte(base
);
444 #ifdef FASTLINK_DEBUG
450 #ifdef FASTLINK_DEBUG
452 printk(KERN_DEBUG
"b1lli(0x%x): get_slice l=%d w=%d b=%d\n",
453 base
, len
, wcnt
, bcnt
);
457 *dp
++ = b1_get_byte(base
);
462 static inline void t1_put_slice(unsigned int base
,
463 unsigned char *dp
, unsigned int len
)
466 b1_put_word(base
, i
);
467 if (t1_isfastlink(base
)) {
470 status
= t1_fifostatus(base
) & (T1F_OREADY
| T1F_OHALF
);
471 if (i
>= FIFO_OUTBSIZE
) status
|= T1F_OEMPTY
;
473 case T1F_OREADY
| T1F_OHALF
| T1F_OEMPTY
:
474 outsb(base
+ B1_WRITE
, dp
, FIFO_OUTBSIZE
);
478 case T1F_OREADY
| T1F_OHALF
:
479 outsb(base
+ B1_WRITE
, dp
, i
);
484 b1_put_byte(base
, *dp
++);
491 b1_put_byte(base
, *dp
++);
495 static inline void t1_disable_irq(unsigned int base
)
497 t1outp(base
, T1_IRQMASTER
, 0x00);
500 static inline void t1_reset(unsigned int base
)
502 /* reset T1 Controller */
504 /* disable irq on HEMA */
505 t1outp(base
, B1_INSTAT
, 0x00);
506 t1outp(base
, B1_OUTSTAT
, 0x00);
507 t1outp(base
, T1_IRQMASTER
, 0x00);
508 /* reset HEMA board configuration */
509 t1outp(base
, T1_RESETBOARD
, 0xf);
512 static inline void b1_setinterrupt(unsigned int base
, unsigned irq
,
513 enum avmcardtype cardtype
)
517 t1outp(base
, B1_INSTAT
, 0x00);
518 t1outp(base
, B1_INSTAT
, 0x02);
519 t1outp(base
, T1_IRQMASTER
, 0x08);
522 b1outp(base
, B1_INSTAT
, 0x00);
523 b1outp(base
, B1_RESET
, b1_irq_table
[irq
]);
524 b1outp(base
, B1_INSTAT
, 0x02);
530 b1outp(base
, B1_INSTAT
, 0x00);
531 b1outp(base
, B1_RESET
, 0xf0);
532 b1outp(base
, B1_INSTAT
, 0x02);
536 b1outp(base
, B1_RESET
, 0xf0);
542 avmcard
*b1_alloc_card(int nr_controllers
);
543 void b1_free_card(avmcard
*card
);
544 int b1_detect(unsigned int base
, enum avmcardtype cardtype
);
545 void b1_getrevision(avmcard
*card
);
546 int b1_load_t4file(avmcard
*card
, capiloaddatapart
*t4file
);
547 int b1_load_config(avmcard
*card
, capiloaddatapart
*config
);
548 int b1_loaded(avmcard
*card
);
550 int b1_load_firmware(struct capi_ctr
*ctrl
, capiloaddata
*data
);
551 void b1_reset_ctr(struct capi_ctr
*ctrl
);
552 void b1_register_appl(struct capi_ctr
*ctrl
, u16 appl
,
553 capi_register_params
*rp
);
554 void b1_release_appl(struct capi_ctr
*ctrl
, u16 appl
);
555 u16
b1_send_message(struct capi_ctr
*ctrl
, struct sk_buff
*skb
);
556 void b1_parse_version(avmctrl_info
*card
);
557 irqreturn_t
b1_interrupt(int interrupt
, void *devptr
);
559 extern const struct file_operations b1ctl_proc_fops
;
561 avmcard_dmainfo
*avmcard_dma_alloc(char *name
, struct pci_dev
*,
562 long rsize
, long ssize
);
563 void avmcard_dma_free(avmcard_dmainfo
*);
566 int b1pciv4_detect(avmcard
*card
);
567 int t1pci_detect(avmcard
*card
);
568 void b1dma_reset(avmcard
*card
);
569 irqreturn_t
b1dma_interrupt(int interrupt
, void *devptr
);
571 int b1dma_load_firmware(struct capi_ctr
*ctrl
, capiloaddata
*data
);
572 void b1dma_reset_ctr(struct capi_ctr
*ctrl
);
573 void b1dma_remove_ctr(struct capi_ctr
*ctrl
);
574 void b1dma_register_appl(struct capi_ctr
*ctrl
,
576 capi_register_params
*rp
);
577 void b1dma_release_appl(struct capi_ctr
*ctrl
, u16 appl
);
578 u16
b1dma_send_message(struct capi_ctr
*ctrl
, struct sk_buff
*skb
);
579 extern const struct file_operations b1dmactl_proc_fops
;
581 #endif /* _AVMCARD_H_ */