2 * PCBIT-D low-layer interface
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
18 * Based on documentation provided by Inesc:
19 * - "Interface com bus do PC para o PCBIT e PCBIT-D", Inesc, Jan 93
23 * TODO: better handling of errors
24 * re-write/remove debug printks
27 #include <linux/sched.h>
28 #include <linux/string.h>
29 #include <linux/kernel.h>
30 #include <linux/types.h>
31 #include <linux/slab.h>
32 #include <linux/interrupt.h>
33 #include <linux/workqueue.h>
35 #include <linux/skbuff.h>
37 #include <linux/isdnif.h>
39 #include <asm/system.h>
58 * Layer 3 packet demultiplexer
62 extern void pcbit_l3_receive(struct pcbit_dev
*dev
, ulong msg
,
64 ushort hdr_len
, ushort refnum
);
70 void pcbit_deliver(void *data
);
71 static void pcbit_transmit(struct pcbit_dev
*dev
);
73 static void pcbit_recv_ack(struct pcbit_dev
*dev
, unsigned char ack
);
75 static void pcbit_l2_error(struct pcbit_dev
*dev
);
76 static void pcbit_l2_active_conf(struct pcbit_dev
*dev
, u_char info
);
77 static void pcbit_l2_err_recover(unsigned long data
);
79 static void pcbit_firmware_bug(struct pcbit_dev
*dev
);
81 static __inline__
void
82 pcbit_sched_delivery(struct pcbit_dev
*dev
)
84 schedule_work(&dev
->qdelivery
);
93 pcbit_l2_write(struct pcbit_dev
*dev
, ulong msg
, ushort refnum
,
94 struct sk_buff
*skb
, unsigned short hdr_len
)
96 struct frame_buf
*frame
,
100 if (dev
->l2_state
!= L2_RUNNING
&& dev
->l2_state
!= L2_LOADING
) {
104 if ((frame
= (struct frame_buf
*) kmalloc(sizeof(struct frame_buf
),
105 GFP_ATOMIC
)) == NULL
) {
106 printk(KERN_WARNING
"pcbit_2_write: kmalloc failed\n");
111 frame
->refnum
= refnum
;
113 frame
->hdr_len
= hdr_len
;
116 frame
->dt_len
= skb
->len
- hdr_len
;
124 spin_lock_irqsave(&dev
->lock
, flags
);
126 if (dev
->write_queue
== NULL
) {
127 dev
->write_queue
= frame
;
128 spin_unlock_irqrestore(&dev
->lock
, flags
);
131 for (ptr
= dev
->write_queue
; ptr
->next
; ptr
= ptr
->next
);
134 spin_unlock_irqrestore(&dev
->lock
, flags
);
139 static __inline__
void
140 pcbit_tx_update(struct pcbit_dev
*dev
, ushort len
)
144 dev
->send_seq
= (dev
->send_seq
+ 1) % 8;
146 dev
->fsize
[dev
->send_seq
] = len
;
148 info
|= dev
->rcv_seq
<< 3;
149 info
|= dev
->send_seq
;
151 writeb(info
, dev
->sh_mem
+ BANK4
);
156 * called by interrupt service routine or by write_2
160 pcbit_transmit(struct pcbit_dev
*dev
)
162 struct frame_buf
*frame
= NULL
;
163 unsigned char unacked
;
164 int flen
; /* fragment frame length including all headers */
171 if (dev
->l2_state
!= L2_RUNNING
&& dev
->l2_state
!= L2_LOADING
)
174 unacked
= (dev
->send_seq
+ (8 - dev
->unack_seq
)) & 0x07;
176 spin_lock_irqsave(&dev
->lock
, flags
);
178 if (dev
->free
> 16 && dev
->write_queue
&& unacked
< 7) {
183 spin_unlock_irqrestore(&dev
->lock
, flags
);
188 frame
= dev
->write_queue
;
191 spin_unlock_irqrestore(&dev
->lock
, flags
);
193 if (frame
->copied
== 0) {
200 flen
= FRAME_HDR_LEN
+ PREHDR_LEN
+ frame
->skb
->len
;
202 flen
= FRAME_HDR_LEN
+ PREHDR_LEN
;
210 * Board level 2 header
213 pcbit_writew(dev
, flen
- FRAME_HDR_LEN
);
215 pcbit_writeb(dev
, GET_MSG_CPU(msg
));
217 pcbit_writeb(dev
, GET_MSG_PROC(msg
));
220 pcbit_writew(dev
, frame
->hdr_len
+ PREHDR_LEN
);
223 pcbit_writew(dev
, frame
->dt_len
);
227 * Board level 3 fixed-header
231 pcbit_writew(dev
, frame
->hdr_len
+ PREHDR_LEN
);
234 pcbit_writew(dev
, 0);
237 pcbit_writeb(dev
, GET_MSG_CMD(msg
));
238 pcbit_writeb(dev
, GET_MSG_SCMD(msg
));
241 pcbit_writew(dev
, frame
->refnum
);
243 count
= FRAME_HDR_LEN
+ PREHDR_LEN
;
247 flen
= 2 + (frame
->skb
->len
- frame
->copied
);
253 tt
= ((ushort
) (flen
- 2)) | 0x8000U
; /* Type 1 */
254 pcbit_writew(dev
, tt
);
260 cp_len
= frame
->skb
->len
- frame
->copied
;
261 if (cp_len
> flen
- count
)
262 cp_len
= flen
- count
;
264 memcpy_topcbit(dev
, frame
->skb
->data
+ frame
->copied
,
266 frame
->copied
+= cp_len
;
270 pcbit_tx_update(dev
, flen
);
272 spin_lock_irqsave(&dev
->lock
, flags
);
274 if (frame
->skb
== NULL
|| frame
->copied
== frame
->skb
->len
) {
276 dev
->write_queue
= frame
->next
;
278 if (frame
->skb
!= NULL
) {
280 dev_kfree_skb(frame
->skb
);
285 spin_unlock_irqrestore(&dev
->lock
, flags
);
287 spin_unlock_irqrestore(&dev
->lock
, flags
);
289 printk(KERN_DEBUG
"unacked %d free %d write_queue %s\n",
290 unacked
, dev
->free
, dev
->write_queue
? "not empty" :
298 * deliver a queued frame to the upper layer
302 pcbit_deliver(void *data
)
304 struct frame_buf
*frame
;
305 unsigned long flags
, msg
;
306 struct pcbit_dev
*dev
= (struct pcbit_dev
*) data
;
308 spin_lock_irqsave(&dev
->lock
, flags
);
310 while ((frame
= dev
->read_queue
)) {
311 dev
->read_queue
= frame
->next
;
312 spin_unlock_irqrestore(&dev
->lock
, flags
);
315 SET_MSG_PROC(msg
, 0);
316 SET_MSG_CMD(msg
, frame
->skb
->data
[2]);
317 SET_MSG_SCMD(msg
, frame
->skb
->data
[3]);
319 frame
->refnum
= *((ushort
*) frame
->skb
->data
+ 4);
320 frame
->msg
= *((ulong
*) & msg
);
322 skb_pull(frame
->skb
, 6);
324 pcbit_l3_receive(dev
, frame
->msg
, frame
->skb
, frame
->hdr_len
,
329 spin_lock_irqsave(&dev
->lock
, flags
);
332 spin_unlock_irqrestore(&dev
->lock
, flags
);
336 * Reads BANK 2 & Reassembles
340 pcbit_receive(struct pcbit_dev
*dev
)
345 struct frame_buf
*frame
= NULL
;
349 if (dev
->l2_state
!= L2_RUNNING
&& dev
->l2_state
!= L2_LOADING
)
352 tt
= pcbit_readw(dev
);
354 if ((tt
& 0x7fffU
) > 511) {
355 printk(KERN_INFO
"pcbit: invalid frame length -> TT=%04x\n",
360 if (!(tt
& 0x8000U
)) { /* Type 0 */
363 if (dev
->read_frame
) {
364 printk(KERN_DEBUG
"pcbit_receive: Type 0 frame and read_frame != NULL\n");
365 /* discard previous queued frame */
366 if (dev
->read_frame
->skb
)
367 kfree_skb(dev
->read_frame
->skb
);
368 kfree(dev
->read_frame
);
369 dev
->read_frame
= NULL
;
371 frame
= kmalloc(sizeof(struct frame_buf
), GFP_ATOMIC
);
374 printk(KERN_WARNING
"kmalloc failed\n");
377 memset(frame
, 0, sizeof(struct frame_buf
));
379 cpu
= pcbit_readb(dev
);
380 proc
= pcbit_readb(dev
);
383 if (cpu
!= 0x06 && cpu
!= 0x02) {
384 printk(KERN_DEBUG
"pcbit: invalid cpu value\n");
390 * we discard cpu & proc on receiving
391 * but we read it to update the pointer
394 frame
->hdr_len
= pcbit_readw(dev
);
395 frame
->dt_len
= pcbit_readw(dev
);
399 * I don't know if they are an error or not...
400 * But they are very frequent
404 if (frame
->hdr_len
== 0) {
407 printk(KERN_DEBUG
"0 sized frame\n");
409 pcbit_firmware_bug(dev
);
412 /* sanity check the length values */
413 if (frame
->hdr_len
> 1024 || frame
->dt_len
> 2048) {
415 printk(KERN_DEBUG
"length problem: ");
416 printk(KERN_DEBUG
"TH=%04x TD=%04x\n",
424 /* minimum frame read */
426 frame
->skb
= dev_alloc_skb(frame
->hdr_len
+ frame
->dt_len
+
427 ((frame
->hdr_len
+ 15) & ~15));
430 printk(KERN_DEBUG
"pcbit_receive: out of memory\n");
434 /* 16 byte alignment for IP */
436 skb_reserve(frame
->skb
, (frame
->hdr_len
+ 15) & ~15);
443 if (!(frame
= dev
->read_frame
)) {
444 printk("Type 1 frame and no frame queued\n");
445 /* usually after an error: toss frame */
447 if (dev
->readptr
> dev
->sh_mem
+ BANK2
+ BANKLEN
)
448 dev
->readptr
-= BANKLEN
;
454 memcpy_frompcbit(dev
, skb_put(frame
->skb
, tt
), tt
);
457 spin_lock_irqsave(&dev
->lock
, flags
);
458 if (frame
->copied
== frame
->hdr_len
+ frame
->dt_len
) {
461 dev
->read_frame
= NULL
;
463 if (dev
->read_queue
) {
464 struct frame_buf
*ptr
;
465 for (ptr
= dev
->read_queue
; ptr
->next
; ptr
= ptr
->next
);
468 dev
->read_queue
= frame
;
471 dev
->read_frame
= frame
;
473 spin_unlock_irqrestore(&dev
->lock
, flags
);
477 * The board sends 0 sized frames
478 * They are TDATA_CONFs that get messed up somehow
479 * gotta send a fake acknowledgment to the upper layer somehow
482 static __inline__
void
483 pcbit_fake_conf(struct pcbit_dev
*dev
, struct pcbit_chan
*chan
)
490 ictl
.driver
= dev
->id
;
491 ictl
.command
= ISDN_STAT_BSENT
;
493 dev
->dev_if
->statcallb(&ictl
);
498 pcbit_firmware_bug(struct pcbit_dev
*dev
)
500 struct pcbit_chan
*chan
;
504 if (chan
->fsm_state
== ST_ACTIVE
) {
505 pcbit_fake_conf(dev
, chan
);
509 if (chan
->fsm_state
== ST_ACTIVE
) {
510 pcbit_fake_conf(dev
, chan
);
515 pcbit_irq_handler(int interrupt
, void *devptr
, struct pt_regs
*regs
)
517 struct pcbit_dev
*dev
;
522 dev
= (struct pcbit_dev
*) devptr
;
525 printk(KERN_WARNING
"pcbit_irq_handler: wrong device\n");
528 if (dev
->interrupt
) {
529 printk(KERN_DEBUG
"pcbit: reentering interrupt hander\n");
534 info
= readb(dev
->sh_mem
+ BANK3
);
536 if (dev
->l2_state
== L2_STARTING
|| dev
->l2_state
== L2_ERROR
) {
537 pcbit_l2_active_conf(dev
, info
);
541 if (info
& 0x40U
) { /* E bit set */
543 printk(KERN_DEBUG
"pcbit_irq_handler: E bit on\n");
549 if (dev
->l2_state
!= L2_RUNNING
&& dev
->l2_state
!= L2_LOADING
) {
553 ack_seq
= (info
>> 3) & 0x07U
;
554 read_seq
= (info
& 0x07U
);
558 if (read_seq
!= dev
->rcv_seq
) {
559 while (read_seq
!= dev
->rcv_seq
) {
561 dev
->rcv_seq
= (dev
->rcv_seq
+ 1) % 8;
563 pcbit_sched_delivery(dev
);
565 if (ack_seq
!= dev
->unack_seq
) {
566 pcbit_recv_ack(dev
, ack_seq
);
568 info
= dev
->rcv_seq
<< 3;
569 info
|= dev
->send_seq
;
571 writeb(info
, dev
->sh_mem
+ BANK4
);
577 pcbit_l2_active_conf(struct pcbit_dev
*dev
, u_char info
)
581 state
= dev
->l2_state
;
584 printk(KERN_DEBUG
"layer2_active_confirm\n");
589 dev
->rcv_seq
= info
& 0x07U
;
590 dev
->l2_state
= L2_RUNNING
;
592 dev
->l2_state
= L2_DOWN
;
594 if (state
== L2_STARTING
)
595 wake_up_interruptible(&dev
->set_running_wq
);
597 if (state
== L2_ERROR
&& dev
->l2_state
== L2_RUNNING
) {
603 pcbit_l2_err_recover(unsigned long data
)
606 struct pcbit_dev
*dev
;
607 struct frame_buf
*frame
;
609 dev
= (struct pcbit_dev
*) data
;
611 del_timer(&dev
->error_recover_timer
);
612 if (dev
->w_busy
|| dev
->r_busy
) {
613 init_timer(&dev
->error_recover_timer
);
614 dev
->error_recover_timer
.expires
= jiffies
+ ERRTIME
;
615 add_timer(&dev
->error_recover_timer
);
618 dev
->w_busy
= dev
->r_busy
= 1;
620 if (dev
->read_frame
) {
621 if (dev
->read_frame
->skb
)
622 kfree_skb(dev
->read_frame
->skb
);
623 kfree(dev
->read_frame
);
624 dev
->read_frame
= NULL
;
626 if (dev
->write_queue
) {
627 frame
= dev
->write_queue
;
629 dev
->write_queue
= dev
->write_queue
->next
;
632 dev_kfree_skb(frame
->skb
);
639 dev
->rcv_seq
= dev
->send_seq
= dev
->unack_seq
= 0;
641 dev
->l2_state
= L2_ERROR
;
643 /* this is an hack... */
644 pcbit_firmware_bug(dev
);
646 dev
->writeptr
= dev
->sh_mem
;
647 dev
->readptr
= dev
->sh_mem
+ BANK2
;
649 writeb((0x80U
| ((dev
->rcv_seq
& 0x07) << 3) | (dev
->send_seq
& 0x07)),
650 dev
->sh_mem
+ BANK4
);
651 dev
->w_busy
= dev
->r_busy
= 0;
656 pcbit_l2_error(struct pcbit_dev
*dev
)
658 if (dev
->l2_state
== L2_RUNNING
) {
660 printk(KERN_INFO
"pcbit: layer 2 error\n");
666 dev
->l2_state
= L2_DOWN
;
668 init_timer(&dev
->error_recover_timer
);
669 dev
->error_recover_timer
.function
= &pcbit_l2_err_recover
;
670 dev
->error_recover_timer
.data
= (ulong
) dev
;
671 dev
->error_recover_timer
.expires
= jiffies
+ ERRTIME
;
672 add_timer(&dev
->error_recover_timer
);
678 * if board acks frames
680 * call pcbit_transmit to write possible queued frames
684 pcbit_recv_ack(struct pcbit_dev
*dev
, unsigned char ack
)
690 unacked
= (dev
->send_seq
+ (8 - dev
->unack_seq
)) & 0x07;
692 /* dev->unack_seq < ack <= dev->send_seq; */
696 if (dev
->send_seq
> dev
->unack_seq
) {
697 if (ack
<= dev
->unack_seq
|| ack
> dev
->send_seq
) {
699 "layer 2 ack unacceptable - dev %d",
703 } else if (ack
> dev
->send_seq
&& ack
<= dev
->unack_seq
) {
705 "layer 2 ack unacceptable - dev %d",
710 /* ack is acceptable */
716 dev
->unack_seq
= i
= (i
+ 1) % 8;
717 dev
->free
+= dev
->fsize
[i
];
721 while (count
< 7 && dev
->write_queue
) {
722 u8 lsend_seq
= dev
->send_seq
;
726 if (dev
->send_seq
== lsend_seq
)
731 printk(KERN_DEBUG
"recv_ack: unacked = 0\n");