1 /* $Id: isar.c,v 1.2 1998/11/15 23:54:53 keil Exp $
3 * isar.c ISAR (Siemens PSB 7110) specific routines
5 * Author Karsten Keil (keil@isdn4linux.de)
9 * Revision 1.2 1998/11/15 23:54:53 keil
12 * Revision 1.1 1998/08/13 23:33:47 keil
13 * First version, only init
18 #define __NO_VERSION__
22 #include <linux/interrupt.h>
24 #define DBG_LOADFIRM 0
25 #define DUMP_MBOXFRAME 2
27 #define MIN(a,b) ((a<b)?a:b)
29 void isar_setup(struct IsdnCardState
*cs
);
32 waitforHIA(struct IsdnCardState
*cs
, int timeout
)
35 while ((cs
->BC_Read_Reg(cs
, 0, ISAR_HIA
) & 1) && timeout
) {
40 printk(KERN_WARNING
"HiSax: ISAR waitforHIA timeout\n");
46 sendmsg(struct IsdnCardState
*cs
, u_char his
, u_char creg
, u_char len
,
52 if (!waitforHIA(cs
, 4000))
55 if (cs
->debug
& L1_DEB_HSCX
)
56 debugl1(cs
, "sendmsg(%02x,%02x,%d)", his
, creg
, len
);
60 cs
->BC_Write_Reg(cs
, 0, ISAR_CTRL_H
, creg
);
61 cs
->BC_Write_Reg(cs
, 0, ISAR_CTRL_L
, len
);
62 cs
->BC_Write_Reg(cs
, 0, ISAR_WADR
, 0);
64 cs
->BC_Write_Reg(cs
, 1, ISAR_MBOX
, msg
[0]);
66 cs
->BC_Write_Reg(cs
, 2, ISAR_MBOX
, msg
[i
]);
68 if (cs
->debug
& L1_DEB_HSCX_FIFO
) {
74 t
+= sprintf(t
, "sendmbox cnt %d", len
);
75 QuickHex(t
, &msg
[len
-i
], (i
>64) ? 64:i
);
82 cs
->BC_Write_Reg(cs
, 1, ISAR_HIS
, his
);
84 waitforHIA(cs
, 10000);
88 /* Call only with IRQ disabled !!! */
90 rcv_mbox(struct IsdnCardState
*cs
, struct isar_reg
*ireg
, u_char
*msg
)
94 cs
->BC_Write_Reg(cs
, 1, ISAR_RADR
, 0);
95 if (msg
&& ireg
->clsb
) {
96 msg
[0] = cs
->BC_Read_Reg(cs
, 1, ISAR_MBOX
);
97 for (i
=1; i
< ireg
->clsb
; i
++)
98 msg
[i
] = cs
->BC_Read_Reg(cs
, 2, ISAR_MBOX
);
100 if (cs
->debug
& L1_DEB_HSCX_FIFO
) {
106 t
+= sprintf(t
, "rcv_mbox cnt %d", ireg
->clsb
);
107 QuickHex(t
, &msg
[ireg
->clsb
-i
], (i
>64) ? 64:i
);
114 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
117 /* Call only with IRQ disabled !!! */
119 get_irq_infos(struct IsdnCardState
*cs
, struct isar_reg
*ireg
)
121 ireg
->iis
= cs
->BC_Read_Reg(cs
, 1, ISAR_IIS
);
122 ireg
->cmsb
= cs
->BC_Read_Reg(cs
, 1, ISAR_CTRL_H
);
123 ireg
->clsb
= cs
->BC_Read_Reg(cs
, 1, ISAR_CTRL_L
);
125 if (cs
->debug
& L1_DEB_HSCX
)
126 debugl1(cs
, "rcv_mbox(%02x,%02x,%d)", ireg
->iis
, ireg
->cmsb
,
132 waitrecmsg(struct IsdnCardState
*cs
, u_char
*len
,
133 u_char
*msg
, int maxdelay
)
137 struct isar_reg
*ir
= cs
->bcs
[0].hw
.isar
.reg
;
140 while((!(cs
->BC_Read_Reg(cs
, 0, ISAR_IRQBIT
) & ISAR_IRQSTA
)) &&
141 (timeout
++ < maxdelay
))
143 if (timeout
>= maxdelay
) {
144 printk(KERN_WARNING
"isar recmsg IRQSTA timeout\n");
149 get_irq_infos(cs
, ir
);
150 rcv_mbox(cs
, ir
, msg
);
152 restore_flags(flags
);
157 ISARVersion(struct IsdnCardState
*cs
, char *s
)
160 u_char msg
[] = ISAR_MSG_HWVER
;
165 cs
->cardmsg(cs
, CARD_RESET
, NULL
);
166 /* disable ISAR IRQ */
167 cs
->BC_Write_Reg(cs
, 0, ISAR_IRQBIT
, 0);
169 cs
->debug
&= ~(L1_DEB_HSCX
| L1_DEB_HSCX_FIFO
);
170 if (!sendmsg(cs
, ISAR_HIS_VNR
, 0, 3, msg
))
172 if (!waitrecmsg(cs
, &len
, tmp
, 100000))
175 if (cs
->bcs
[0].hw
.isar
.reg
->iis
== ISAR_IIS_VNR
) {
178 printk(KERN_INFO
"%s ISAR version %d\n", s
, ver
);
187 isar_load_firmware(struct IsdnCardState
*cs
, u_char
*buf
)
189 int ret
, size
, cnt
, debug
;
190 u_char len
, nom
, noc
;
191 u_short sadr
, left
, *sp
;
193 u_char
*msg
, *tmpmsg
, *mp
, tmp
[64];
195 struct isar_reg
*ireg
= cs
->bcs
[0].hw
.isar
.reg
;
197 struct {u_short sadr
;
202 #define BLK_HEAD_SIZE 6
203 if (1 != (ret
= ISARVersion(cs
, "Testing"))) {
204 printk(KERN_ERR
"isar_load_firmware wrong isar version %d\n", ret
);
209 cs
->debug
&= ~(L1_DEB_HSCX
| L1_DEB_HSCX_FIFO
);
211 printk(KERN_DEBUG
"isar_load_firmware buf %#lx\n", (u_long
)buf
);
212 if ((ret
= verify_area(VERIFY_READ
, (void *) p
, sizeof(int)))) {
213 printk(KERN_ERR
"isar_load_firmware verify_area ret %d\n", ret
);
216 if ((ret
= copy_from_user(&size
, p
, sizeof(int)))) {
217 printk(KERN_ERR
"isar_load_firmware copy_from_user ret %d\n", ret
);
221 printk(KERN_DEBUG
"isar_load_firmware size: %d\n", size
);
222 if ((ret
= verify_area(VERIFY_READ
, (void *) p
, size
))) {
223 printk(KERN_ERR
"isar_load_firmware verify_area ret %d\n", ret
);
227 /* disable ISAR IRQ */
228 cs
->BC_Write_Reg(cs
, 0, ISAR_IRQBIT
, 0);
229 if (!(msg
= kmalloc(256, GFP_KERNEL
))) {
230 printk(KERN_ERR
"isar_load_firmware no buffer\n");
233 if (!(tmpmsg
= kmalloc(256, GFP_KERNEL
))) {
234 printk(KERN_ERR
"isar_load_firmware no tmp buffer\n");
239 if ((ret
= copy_from_user(&blk_head
, p
, BLK_HEAD_SIZE
))) {
240 printk(KERN_ERR
"isar_load_firmware copy_from_user ret %d\n", ret
);
243 cnt
+= BLK_HEAD_SIZE
;
245 printk(KERN_DEBUG
"isar firmware block (%#x,%5d,%#x)\n",
246 blk_head
.sadr
, blk_head
.len
, blk_head
.d_key
& 0xff);
247 sadr
= blk_head
.sadr
;
249 if (!sendmsg(cs
, ISAR_HIS_DKEY
, blk_head
.d_key
& 0xff, 0, NULL
)) {
250 printk(KERN_ERR
"isar sendmsg dkey failed\n");
251 ret
= 1;goto reterror
;
253 if (!waitrecmsg(cs
, &len
, tmp
, 100000)) {
254 printk(KERN_ERR
"isar waitrecmsg dkey failed\n");
255 ret
= 1;goto reterror
;
257 if ((ireg
->iis
!= ISAR_IIS_DKEY
) || ireg
->cmsb
|| len
) {
258 printk(KERN_ERR
"isar wrong dkey response (%x,%x,%x)\n",
259 ireg
->iis
, ireg
->cmsb
, len
);
260 ret
= 1;goto reterror
;
263 noc
= MIN(126, left
);
270 if ((ret
= copy_from_user(tmpmsg
, p
, nom
))) {
271 printk(KERN_ERR
"isar_load_firmware copy_from_user ret %d\n", ret
);
277 sp
= (u_short
*)tmpmsg
;
279 printk(KERN_DEBUG
"isar: load %3d words at %04x\n",
289 if (!sendmsg(cs
, ISAR_HIS_FIRM
, 0, nom
, msg
)) {
290 printk(KERN_ERR
"isar sendmsg prog failed\n");
291 ret
= 1;goto reterror
;
293 if (!waitrecmsg(cs
, &len
, tmp
, 100000)) {
294 printk(KERN_ERR
"isar waitrecmsg prog failed\n");
295 ret
= 1;goto reterror
;
297 if ((ireg
->iis
!= ISAR_IIS_FIRM
) || ireg
->cmsb
|| len
) {
298 printk(KERN_ERR
"isar wrong prog response (%x,%x,%x)\n",
299 ireg
->iis
, ireg
->cmsb
, len
);
300 ret
= 1;goto reterror
;
303 printk(KERN_DEBUG
"isar firmware block %5d words loaded\n",
309 if (!sendmsg(cs
, ISAR_HIS_STDSP
, 0, 2, msg
)) {
310 printk(KERN_ERR
"isar sendmsg start dsp failed\n");
311 ret
= 1;goto reterror
;
313 if (!waitrecmsg(cs
, &len
, tmp
, 100000)) {
314 printk(KERN_ERR
"isar waitrecmsg start dsp failed\n");
315 ret
= 1;goto reterror
;
317 if ((ireg
->iis
!= ISAR_IIS_STDSP
) || ireg
->cmsb
|| len
) {
318 printk(KERN_ERR
"isar wrong start dsp response (%x,%x,%x)\n",
319 ireg
->iis
, ireg
->cmsb
, len
);
320 ret
= 1;goto reterror
;
322 printk(KERN_DEBUG
"isar start dsp success\n");
323 /* NORMAL mode entered */
324 /* Enable IRQs of ISAR */
325 cs
->BC_Write_Reg(cs
, 0, ISAR_IRQBIT
, ISAR_IRQSTA
);
328 cnt
= 1000; /* max 1s */
329 while ((!ireg
->bstat
) && cnt
) {
334 printk(KERN_ERR
"isar no general status event received\n");
335 ret
= 1;goto reterrflg
;
337 printk(KERN_DEBUG
"isar general status event %x\n",
341 if (!sendmsg(cs
, ISAR_HIS_DIAG
, ISAR_CTRL_STST
, 0, NULL
)) {
342 printk(KERN_ERR
"isar sendmsg self tst failed\n");
343 ret
= 1;goto reterrflg
;
345 cnt
= 1000; /* max 10 ms */
346 while ((ireg
->iis
!= ISAR_IIS_DIAG
) && cnt
) {
351 printk(KERN_ERR
"isar no self tst response\n");
352 ret
= 1;goto reterrflg
;
353 } else if ((ireg
->cmsb
== ISAR_CTRL_STST
) && (ireg
->clsb
== 1)
354 && (ireg
->par
[0] == 0)) {
355 printk(KERN_DEBUG
"isar selftest OK\n");
357 printk(KERN_DEBUG
"isar selftest not OK %x/%x/%x\n",
358 ireg
->cmsb
, ireg
->clsb
, ireg
->par
[0]);
359 ret
= 1;goto reterror
;
362 if (!sendmsg(cs
, ISAR_HIS_DIAG
, ISAR_CTRL_SWVER
, 0, NULL
)) {
363 printk(KERN_ERR
"isar RQST SVN failed\n");
364 ret
= 1;goto reterror
;
366 cnt
= 10000; /* max 100 ms */
367 while ((ireg
->iis
!= ISAR_IIS_DIAG
) && cnt
) {
372 printk(KERN_ERR
"isar no SVN response\n");
373 ret
= 1;goto reterrflg
;
375 if ((ireg
->cmsb
== ISAR_CTRL_SWVER
) && (ireg
->clsb
== 1))
376 printk(KERN_DEBUG
"isar software version %#x\n",
379 printk(KERN_ERR
"isar wrong swver response (%x,%x) cnt(%d)\n",
380 ireg
->cmsb
, ireg
->clsb
, cnt
);
381 ret
= 1;goto reterrflg
;
388 restore_flags(flags
);
392 /* disable ISAR IRQ */
393 cs
->BC_Write_Reg(cs
, 0, ISAR_IRQBIT
, 0);
400 isar_sched_event(struct BCState
*bcs
, int event
)
402 bcs
->event
|= 1 << event
;
403 queue_task(&bcs
->tqueue
, &tq_immediate
);
404 mark_bh(IMMEDIATE_BH
);
408 isar_rcv_frame(struct IsdnCardState
*cs
, struct BCState
*bcs
)
412 struct isar_reg
*ireg
= bcs
->hw
.isar
.reg
;
415 debugl1(cs
, "isar zero len frame");
416 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
421 debugl1(cs
, "isar mode 0 spurious IIS_RDATA %x/%x/%x",
422 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
423 printk(KERN_WARNING
"isar mode 0 spurious IIS_RDATA %x/%x/%x\n",
424 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
425 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
428 if ((skb
= dev_alloc_skb(ireg
->clsb
))) {
429 rcv_mbox(cs
, ireg
, (u_char
*)skb_put(skb
, ireg
->clsb
));
430 skb_queue_tail(&bcs
->rqueue
, skb
);
431 isar_sched_event(bcs
, B_RCVBUFREADY
);
433 printk(KERN_WARNING
"HiSax: skb out of memory\n");
434 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
438 if ((bcs
->hw
.isar
.rcvidx
+ ireg
->clsb
) > HSCX_BUFMAX
) {
439 if (cs
->debug
& L1_DEB_WARN
)
440 debugl1(cs
, "isar_rcv_frame: incoming packet too large");
441 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
442 bcs
->hw
.isar
.rcvidx
= 0;
443 } else if (ireg
->cmsb
& HDLC_ERROR
) {
444 if (cs
->debug
& L1_DEB_WARN
)
445 debugl1(cs
, "isar frame error %x len %d",
446 ireg
->cmsb
, ireg
->clsb
);
447 bcs
->hw
.isar
.rcvidx
= 0;
448 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
450 if (ireg
->cmsb
& HDLC_FSD
)
451 bcs
->hw
.isar
.rcvidx
= 0;
452 ptr
= bcs
->hw
.isar
.rcvbuf
+ bcs
->hw
.isar
.rcvidx
;
453 bcs
->hw
.isar
.rcvidx
+= ireg
->clsb
;
454 rcv_mbox(cs
, ireg
, ptr
);
455 if (ireg
->cmsb
& HDLC_FED
) {
456 if (bcs
->hw
.isar
.rcvidx
< 3) { /* last 2 bytes are the FCS */
457 printk(KERN_WARNING
"ISAR: HDLC frame too short(%d)\n",
458 bcs
->hw
.isar
.rcvidx
);
459 } else if (!(skb
= dev_alloc_skb(bcs
->hw
.isar
.rcvidx
-2)))
460 printk(KERN_WARNING
"ISAR: receive out of memory\n");
462 memcpy(skb_put(skb
, bcs
->hw
.isar
.rcvidx
-2),
463 bcs
->hw
.isar
.rcvbuf
, bcs
->hw
.isar
.rcvidx
-2);
464 skb_queue_tail(&bcs
->rqueue
, skb
);
465 isar_sched_event(bcs
, B_RCVBUFREADY
);
471 printk(KERN_ERR
"isar_rcv_frame mode (%x)error\n", bcs
->mode
);
472 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
478 isar_fill_fifo(struct BCState
*bcs
)
480 struct IsdnCardState
*cs
= bcs
->cs
;
486 if ((cs
->debug
& L1_DEB_HSCX
) && !(cs
->debug
& L1_DEB_HSCX_FIFO
))
487 debugl1(cs
, "isar_fill_fifo");
490 if (bcs
->tx_skb
->len
<= 0)
492 if (!(bcs
->hw
.isar
.reg
->bstat
&
493 (bcs
->hw
.isar
.dpath
== 1 ? BSTAT_RDM1
: BSTAT_RDM2
)))
495 if (bcs
->tx_skb
->len
> bcs
->hw
.isar
.mml
) {
497 count
= bcs
->hw
.isar
.mml
;
499 count
= bcs
->tx_skb
->len
;
502 if (!bcs
->hw
.isar
.txcnt
)
506 ptr
= bcs
->tx_skb
->data
;
507 skb_pull(bcs
->tx_skb
, count
);
508 bcs
->tx_cnt
-= count
;
509 bcs
->hw
.isar
.txcnt
+= count
;
512 printk(KERN_ERR
"isar_fill_fifo wrong mode 0\n");
515 if (!sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) | ISAR_HIS_SDATA
,
518 debugl1(cs
, "isar bin data send dp%d failed",
523 if (!sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) | ISAR_HIS_SDATA
,
526 debugl1(cs
, "isar hdlc data send dp%d failed",
531 printk(KERN_ERR
"isar_fill_fifo mode (%x)error\n", bcs
->mode
);
534 restore_flags(flags
);
538 struct BCState
*sel_bcs_isar(struct IsdnCardState
*cs
, u_char dpath
)
540 if ((!dpath
) || (dpath
== 3))
542 if (cs
->bcs
[0].hw
.isar
.dpath
== dpath
)
544 if (cs
->bcs
[1].hw
.isar
.dpath
== dpath
)
550 send_frames(struct BCState
*bcs
)
553 if (bcs
->tx_skb
->len
) {
557 if (bcs
->st
->lli
.l1writewakeup
&&
558 (PACKET_NOACK
!= bcs
->tx_skb
->pkt_type
))
559 bcs
->st
->lli
.l1writewakeup(bcs
->st
, bcs
->hw
.isar
.txcnt
);
560 dev_kfree_skb(bcs
->tx_skb
);
561 bcs
->hw
.isar
.txcnt
= 0;
565 if ((bcs
->tx_skb
= skb_dequeue(&bcs
->squeue
))) {
566 bcs
->hw
.isar
.txcnt
= 0;
567 test_and_set_bit(BC_FLG_BUSY
, &bcs
->Flag
);
570 test_and_clear_bit(BC_FLG_BUSY
, &bcs
->Flag
);
571 isar_sched_event(bcs
, B_XMTBUFREADY
);
576 check_send(struct IsdnCardState
*cs
, u_char rdm
)
580 if (rdm
& BSTAT_RDM1
) {
581 if ((bcs
= sel_bcs_isar(cs
, 1))) {
587 if (rdm
& BSTAT_RDM2
) {
588 if ((bcs
= sel_bcs_isar(cs
, 2))) {
597 static char debbuf
[64];
600 isar_int_main(struct IsdnCardState
*cs
)
603 struct isar_reg
*ireg
= cs
->bcs
[0].hw
.isar
.reg
;
608 get_irq_infos(cs
, ireg
);
609 switch (ireg
->iis
& ISAR_IIS_MSCMSD
) {
611 if ((bcs
= sel_bcs_isar(cs
, ireg
->iis
>> 6))) {
612 isar_rcv_frame(cs
, bcs
);
614 debugl1(cs
, "isar spurious IIS_RDATA %x/%x/%x",
615 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
616 printk(KERN_WARNING
"isar spurious IIS_RDATA %x/%x/%x\n",
617 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
618 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
622 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
623 ireg
->bstat
|= ireg
->cmsb
;
624 check_send(cs
, ireg
->cmsb
);
627 cs
->BC_Write_Reg(cs
, 1, ISAR_IIA
, 0);
628 if (cs
->debug
& L1_DEB_WARN
)
629 debugl1(cs
, "Buffer STEV dpath%d msb(%x)",
630 ireg
->iis
>>6, ireg
->cmsb
);
633 case ISAR_IIS_PSTRSP
:
635 case ISAR_IIS_BSTRSP
:
636 case ISAR_IIS_IOM2RSP
:
637 rcv_mbox(cs
, ireg
, (u_char
*)ireg
->par
);
638 if ((cs
->debug
& (L1_DEB_HSCX
| L1_DEB_HSCX_FIFO
))
642 tp
+= sprintf(debbuf
, "msg iis(%x) msb(%x)",
643 ireg
->iis
, ireg
->cmsb
);
644 QuickHex(tp
, (u_char
*)ireg
->par
, ireg
->clsb
);
649 rcv_mbox(cs
, ireg
, debbuf
);
650 if (cs
->debug
& L1_DEB_WARN
)
651 debugl1(cs
, "unhandled msg iis(%x) ctrl(%x/%x)",
652 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
655 restore_flags(flags
);
659 setup_pump(struct BCState
*bcs
) {
660 struct IsdnCardState
*cs
= bcs
->cs
;
661 u_char dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
667 if (!sendmsg(cs
, dps
| ISAR_HIS_PUMPCFG
, PMOD_BYPASS
, 0, NULL
)) {
669 debugl1(cs
, "isar pump bypass cfg dp%d failed",
674 if (!sendmsg(cs
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
)) {
676 debugl1(cs
, "isar pump status req dp%d failed",
682 setup_sart(struct BCState
*bcs
) {
683 struct IsdnCardState
*cs
= bcs
->cs
;
684 u_char dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
688 if (!sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, SMODE_DISABLE
, 0, NULL
)) {
690 debugl1(cs
, "isar sart disable dp%d failed",
695 if (!sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, SMODE_BINARY
, 2, "\0\0")) {
697 debugl1(cs
, "isar sart binary dp%d failed",
702 if (!sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, SMODE_HDLC
, 1, "\0")) {
704 debugl1(cs
, "isar sart binary dp%d failed",
709 if (!sendmsg(cs
, dps
| ISAR_HIS_BSTREQ
, 0, 0, NULL
)) {
711 debugl1(cs
, "isar buf stat req dp%d failed",
717 setup_iom2(struct BCState
*bcs
) {
718 struct IsdnCardState
*cs
= bcs
->cs
;
719 u_char dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
720 u_char cmsb
= 0, msg
[5] = {0x10,0,0,0,0};
725 msg
[1] = msg
[3] = bcs
->hw
.isar
.dpath
+ 2;
734 if (!sendmsg(cs
, dps
| ISAR_HIS_IOM2CFG
, cmsb
, 5, msg
)) {
736 debugl1(cs
, "isar iom2 dp%d failed", bcs
->hw
.isar
.dpath
);
738 if (!sendmsg(cs
, dps
| ISAR_HIS_IOM2REQ
, 0, 0, NULL
)) {
740 debugl1(cs
, "isar IOM2 cfg req dp%d failed",
746 modeisar(struct BCState
*bcs
, int mode
, int bc
)
748 struct IsdnCardState
*cs
= bcs
->cs
;
750 /* Here we are selecting the best datapath for requested mode */
751 if(bcs
->mode
== L1_MODE_NULL
) { /* New Setup */
754 case L1_MODE_NULL
: /* init */
758 /* best is datapath 2 */
759 if (!test_and_set_bit(ISAR_DP2_USE
,
760 &bcs
->hw
.isar
.reg
->Flags
))
761 bcs
->hw
.isar
.dpath
= 2;
762 else if (!test_and_set_bit(ISAR_DP1_USE
,
763 &bcs
->hw
.isar
.reg
->Flags
))
764 bcs
->hw
.isar
.dpath
= 1;
766 printk(KERN_ERR
"isar modeisar both pathes in use\n");
772 if (cs
->debug
& L1_DEB_HSCX
)
773 debugl1(cs
, "isar dp%d mode %d->%d ichan %d",
774 bcs
->hw
.isar
.dpath
, bcs
->mode
, mode
, bc
);
779 if (bcs
->mode
== L1_MODE_NULL
) {
780 /* Clear resources */
781 if (bcs
->hw
.isar
.dpath
== 1)
782 test_and_clear_bit(ISAR_DP1_USE
, &bcs
->hw
.isar
.reg
->Flags
);
783 else if (bcs
->hw
.isar
.dpath
== 2)
784 test_and_clear_bit(ISAR_DP2_USE
, &bcs
->hw
.isar
.reg
->Flags
);
785 bcs
->hw
.isar
.dpath
= 0;
791 isar_setup(struct IsdnCardState
*cs
)
798 for (i
=0; i
<2; i
++) {
800 if (!sendmsg(cs
, (i
? ISAR_HIS_DPS2
: ISAR_HIS_DPS1
) |
801 ISAR_HIS_P12CFG
, 4, 1, &msg
)) {
803 debugl1(cs
, "isar P%dCFG failed", i
+1);
805 cs
->bcs
[i
].hw
.isar
.mml
= msg
;
807 cs
->bcs
[i
].hw
.isar
.dpath
= i
+ 1;
808 modeisar(&cs
->bcs
[i
], 0, 0);
813 isar_l2l1(struct PStack
*st
, int pr
, void *arg
)
815 struct sk_buff
*skb
= arg
;
819 case (PH_DATA
| REQUEST
):
822 if (st
->l1
.bcs
->tx_skb
) {
823 skb_queue_tail(&st
->l1
.bcs
->squeue
, skb
);
824 restore_flags(flags
);
826 st
->l1
.bcs
->tx_skb
= skb
;
827 test_and_set_bit(BC_FLG_BUSY
, &st
->l1
.bcs
->Flag
);
828 if (st
->l1
.bcs
->cs
->debug
& L1_DEB_HSCX
)
829 debugl1(st
->l1
.bcs
->cs
, "DRQ set BC_FLG_BUSY");
830 st
->l1
.bcs
->hw
.isar
.txcnt
= 0;
831 restore_flags(flags
);
832 st
->l1
.bcs
->cs
->BC_Send_Data(st
->l1
.bcs
);
835 case (PH_PULL
| INDICATION
):
836 if (st
->l1
.bcs
->tx_skb
) {
837 printk(KERN_WARNING
"isar_l2l1: this shouldn't happen\n");
840 test_and_set_bit(BC_FLG_BUSY
, &st
->l1
.bcs
->Flag
);
841 if (st
->l1
.bcs
->cs
->debug
& L1_DEB_HSCX
)
842 debugl1(st
->l1
.bcs
->cs
, "PUI set BC_FLG_BUSY");
843 st
->l1
.bcs
->tx_skb
= skb
;
844 st
->l1
.bcs
->hw
.isar
.txcnt
= 0;
845 st
->l1
.bcs
->cs
->BC_Send_Data(st
->l1
.bcs
);
847 case (PH_PULL
| REQUEST
):
848 if (!st
->l1
.bcs
->tx_skb
) {
849 test_and_clear_bit(FLG_L1_PULL_REQ
, &st
->l1
.Flags
);
850 st
->l1
.l1l2(st
, PH_PULL
| CONFIRM
, NULL
);
852 test_and_set_bit(FLG_L1_PULL_REQ
, &st
->l1
.Flags
);
854 case (PH_ACTIVATE
| REQUEST
):
855 test_and_set_bit(BC_FLG_ACTIV
, &st
->l1
.bcs
->Flag
);
856 modeisar(st
->l1
.bcs
, st
->l1
.mode
, st
->l1
.bc
);
857 l1_msg_b(st
, pr
, arg
);
859 case (PH_DEACTIVATE
| REQUEST
):
860 l1_msg_b(st
, pr
, arg
);
862 case (PH_DEACTIVATE
| CONFIRM
):
863 test_and_clear_bit(BC_FLG_ACTIV
, &st
->l1
.bcs
->Flag
);
864 test_and_clear_bit(BC_FLG_BUSY
, &st
->l1
.bcs
->Flag
);
865 if (st
->l1
.bcs
->cs
->debug
& L1_DEB_HSCX
)
866 debugl1(st
->l1
.bcs
->cs
, "PDAC clear BC_FLG_BUSY");
867 modeisar(st
->l1
.bcs
, 0, st
->l1
.bc
);
868 st
->l1
.l1l2(st
, PH_DEACTIVATE
| CONFIRM
, NULL
);
874 close_isarstate(struct BCState
*bcs
)
876 modeisar(bcs
, 0, bcs
->channel
);
877 if (test_and_clear_bit(BC_FLG_INIT
, &bcs
->Flag
)) {
878 if (bcs
->hw
.isar
.rcvbuf
) {
879 kfree(bcs
->hw
.isar
.rcvbuf
);
880 bcs
->hw
.isar
.rcvbuf
= NULL
;
882 discard_queue(&bcs
->rqueue
);
883 discard_queue(&bcs
->squeue
);
885 dev_kfree_skb(bcs
->tx_skb
);
887 test_and_clear_bit(BC_FLG_BUSY
, &bcs
->Flag
);
888 if (bcs
->cs
->debug
& L1_DEB_HSCX
)
889 debugl1(bcs
->cs
, "closeisar clear BC_FLG_BUSY");
895 open_isarstate(struct IsdnCardState
*cs
, struct BCState
*bcs
)
897 if (!test_and_set_bit(BC_FLG_INIT
, &bcs
->Flag
)) {
898 if (!(bcs
->hw
.isar
.rcvbuf
= kmalloc(HSCX_BUFMAX
, GFP_ATOMIC
))) {
900 "HiSax: No memory for isar.rcvbuf\n");
903 skb_queue_head_init(&bcs
->rqueue
);
904 skb_queue_head_init(&bcs
->squeue
);
907 test_and_clear_bit(BC_FLG_BUSY
, &bcs
->Flag
);
908 if (cs
->debug
& L1_DEB_HSCX
)
909 debugl1(cs
, "openisar clear BC_FLG_BUSY");
911 bcs
->hw
.isar
.rcvidx
= 0;
917 setstack_isar(struct PStack
*st
, struct BCState
*bcs
)
919 bcs
->channel
= st
->l1
.bc
;
920 if (open_isarstate(st
->l1
.hardware
, bcs
))
923 st
->l2
.l2l1
= isar_l2l1
;
924 setstack_manager(st
);
931 initisar(struct IsdnCardState
*cs
))
933 cs
->bcs
[0].BC_SetStack
= setstack_isar
;
934 cs
->bcs
[1].BC_SetStack
= setstack_isar
;
935 cs
->bcs
[0].BC_Close
= close_isarstate
;
936 cs
->bcs
[1].BC_Close
= close_isarstate
;