diff options
Diffstat (limited to 'drivers/isdn/icn/icn.c')
-rw-r--r-- | drivers/isdn/icn/icn.c | 806 |
1 files changed, 403 insertions, 403 deletions
diff --git a/drivers/isdn/icn/icn.c b/drivers/isdn/icn/icn.c index 1f355bb85e54..e74df7c4658f 100644 --- a/drivers/isdn/icn/icn.c +++ b/drivers/isdn/icn/icn.c | |||
@@ -54,7 +54,7 @@ static int icn_addcard(int, char *, char *); | |||
54 | * channel = channel number | 54 | * channel = channel number |
55 | */ | 55 | */ |
56 | static void | 56 | static void |
57 | icn_free_queue(icn_card * card, int channel) | 57 | icn_free_queue(icn_card *card, int channel) |
58 | { | 58 | { |
59 | struct sk_buff_head *queue = &card->spqueue[channel]; | 59 | struct sk_buff_head *queue = &card->spqueue[channel]; |
60 | struct sk_buff *skb; | 60 | struct sk_buff *skb; |
@@ -93,7 +93,7 @@ icn_shiftout(unsigned short port, | |||
93 | * disable a cards shared memory | 93 | * disable a cards shared memory |
94 | */ | 94 | */ |
95 | static inline void | 95 | static inline void |
96 | icn_disable_ram(icn_card * card) | 96 | icn_disable_ram(icn_card *card) |
97 | { | 97 | { |
98 | OUTB_P(0, ICN_MAPRAM); | 98 | OUTB_P(0, ICN_MAPRAM); |
99 | } | 99 | } |
@@ -102,7 +102,7 @@ icn_disable_ram(icn_card * card) | |||
102 | * enable a cards shared memory | 102 | * enable a cards shared memory |
103 | */ | 103 | */ |
104 | static inline void | 104 | static inline void |
105 | icn_enable_ram(icn_card * card) | 105 | icn_enable_ram(icn_card *card) |
106 | { | 106 | { |
107 | OUTB_P(0xff, ICN_MAPRAM); | 107 | OUTB_P(0xff, ICN_MAPRAM); |
108 | } | 108 | } |
@@ -113,7 +113,7 @@ icn_enable_ram(icn_card * card) | |||
113 | * must called with holding the devlock | 113 | * must called with holding the devlock |
114 | */ | 114 | */ |
115 | static inline void | 115 | static inline void |
116 | icn_map_channel(icn_card * card, int channel) | 116 | icn_map_channel(icn_card *card, int channel) |
117 | { | 117 | { |
118 | #ifdef MAP_DEBUG | 118 | #ifdef MAP_DEBUG |
119 | printk(KERN_DEBUG "icn_map_channel %d %d\n", dev.channel, channel); | 119 | printk(KERN_DEBUG "icn_map_channel %d %d\n", dev.channel, channel); |
@@ -139,7 +139,7 @@ icn_map_channel(icn_card * card, int channel) | |||
139 | * must called with holding the devlock | 139 | * must called with holding the devlock |
140 | */ | 140 | */ |
141 | static inline int | 141 | static inline int |
142 | icn_lock_channel(icn_card * card, int channel) | 142 | icn_lock_channel(icn_card *card, int channel) |
143 | { | 143 | { |
144 | register int retval; | 144 | register int retval; |
145 | 145 | ||
@@ -194,7 +194,7 @@ icn_release_channel(void) | |||
194 | * Return 1 on success, 0 on failure. | 194 | * Return 1 on success, 0 on failure. |
195 | */ | 195 | */ |
196 | static inline int | 196 | static inline int |
197 | icn_trymaplock_channel(icn_card * card, int channel) | 197 | icn_trymaplock_channel(icn_card *card, int channel) |
198 | { | 198 | { |
199 | ulong flags; | 199 | ulong flags; |
200 | 200 | ||
@@ -225,7 +225,7 @@ icn_trymaplock_channel(icn_card * card, int channel) | |||
225 | * then map same or other channel without locking. | 225 | * then map same or other channel without locking. |
226 | */ | 226 | */ |
227 | static inline void | 227 | static inline void |
228 | icn_maprelease_channel(icn_card * card, int channel) | 228 | icn_maprelease_channel(icn_card *card, int channel) |
229 | { | 229 | { |
230 | ulong flags; | 230 | ulong flags; |
231 | 231 | ||
@@ -246,7 +246,7 @@ icn_maprelease_channel(icn_card * card, int channel) | |||
246 | */ | 246 | */ |
247 | 247 | ||
248 | static void | 248 | static void |
249 | icn_pollbchan_receive(int channel, icn_card * card) | 249 | icn_pollbchan_receive(int channel, icn_card *card) |
250 | { | 250 | { |
251 | int mch = channel + ((card->secondhalf) ? 2 : 0); | 251 | int mch = channel + ((card->secondhalf) ? 2 : 0); |
252 | int eflag; | 252 | int eflag; |
@@ -297,7 +297,7 @@ icn_pollbchan_receive(int channel, icn_card * card) | |||
297 | */ | 297 | */ |
298 | 298 | ||
299 | static void | 299 | static void |
300 | icn_pollbchan_send(int channel, icn_card * card) | 300 | icn_pollbchan_send(int channel, icn_card *card) |
301 | { | 301 | { |
302 | int mch = channel + ((card->secondhalf) ? 2 : 0); | 302 | int mch = channel + ((card->secondhalf) ? 2 : 0); |
303 | int cnt; | 303 | int cnt; |
@@ -309,7 +309,7 @@ icn_pollbchan_send(int channel, icn_card * card) | |||
309 | !skb_queue_empty(&card->spqueue[channel]))) | 309 | !skb_queue_empty(&card->spqueue[channel]))) |
310 | return; | 310 | return; |
311 | if (icn_trymaplock_channel(card, mch)) { | 311 | if (icn_trymaplock_channel(card, mch)) { |
312 | while (sbfree && | 312 | while (sbfree && |
313 | (card->sndcount[channel] || | 313 | (card->sndcount[channel] || |
314 | !skb_queue_empty(&card->spqueue[channel]) || | 314 | !skb_queue_empty(&card->spqueue[channel]) || |
315 | card->xskb[channel])) { | 315 | card->xskb[channel])) { |
@@ -327,7 +327,7 @@ icn_pollbchan_send(int channel, icn_card * card) | |||
327 | /* Pop ACK-flag off skb. | 327 | /* Pop ACK-flag off skb. |
328 | * Store length to xlen. | 328 | * Store length to xlen. |
329 | */ | 329 | */ |
330 | if (*(skb_pull(skb,1))) | 330 | if (*(skb_pull(skb, 1))) |
331 | card->xlen[channel] = skb->len; | 331 | card->xlen[channel] = skb->len; |
332 | else | 332 | else |
333 | card->xlen[channel] = 0; | 333 | card->xlen[channel] = 0; |
@@ -396,7 +396,7 @@ icn_pollbchan(unsigned long data) | |||
396 | if (card->flags & (ICN_FLAGS_B1ACTIVE | ICN_FLAGS_B2ACTIVE)) { | 396 | if (card->flags & (ICN_FLAGS_B1ACTIVE | ICN_FLAGS_B2ACTIVE)) { |
397 | /* schedule b-channel polling again */ | 397 | /* schedule b-channel polling again */ |
398 | spin_lock_irqsave(&card->lock, flags); | 398 | spin_lock_irqsave(&card->lock, flags); |
399 | mod_timer(&card->rb_timer, jiffies+ICN_TIMER_BCREAD); | 399 | mod_timer(&card->rb_timer, jiffies + ICN_TIMER_BCREAD); |
400 | card->flags |= ICN_FLAGS_RBTIMER; | 400 | card->flags |= ICN_FLAGS_RBTIMER; |
401 | spin_unlock_irqrestore(&card->lock, flags); | 401 | spin_unlock_irqrestore(&card->lock, flags); |
402 | } else | 402 | } else |
@@ -428,7 +428,7 @@ static icn_stat icn_stat_table[] = | |||
428 | {"E_L1: ACT FAIL", ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */ | 428 | {"E_L1: ACT FAIL", ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */ |
429 | {"E_L2: DATA LIN", ISDN_STAT_BHUP, 8}, /* Layer-2 data link lost */ | 429 | {"E_L2: DATA LIN", ISDN_STAT_BHUP, 8}, /* Layer-2 data link lost */ |
430 | {"E_L1: ACTIVATION FAILED", | 430 | {"E_L1: ACTIVATION FAILED", |
431 | ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */ | 431 | ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */ |
432 | {NULL, 0, -1} | 432 | {NULL, 0, -1} |
433 | }; | 433 | }; |
434 | /* *INDENT-ON* */ | 434 | /* *INDENT-ON* */ |
@@ -445,7 +445,7 @@ static icn_stat icn_stat_table[] = | |||
445 | */ | 445 | */ |
446 | 446 | ||
447 | static void | 447 | static void |
448 | icn_parse_status(u_char * status, int channel, icn_card * card) | 448 | icn_parse_status(u_char *status, int channel, icn_card *card) |
449 | { | 449 | { |
450 | icn_stat *s = icn_stat_table; | 450 | icn_stat *s = icn_stat_table; |
451 | int action = -1; | 451 | int action = -1; |
@@ -465,128 +465,128 @@ icn_parse_status(u_char * status, int channel, icn_card * card) | |||
465 | cmd.driver = card->myid; | 465 | cmd.driver = card->myid; |
466 | cmd.arg = channel; | 466 | cmd.arg = channel; |
467 | switch (action) { | 467 | switch (action) { |
468 | case 11: | 468 | case 11: |
469 | spin_lock_irqsave(&card->lock, flags); | 469 | spin_lock_irqsave(&card->lock, flags); |
470 | icn_free_queue(card,channel); | 470 | icn_free_queue(card, channel); |
471 | card->rcvidx[channel] = 0; | 471 | card->rcvidx[channel] = 0; |
472 | 472 | ||
473 | if (card->flags & | 473 | if (card->flags & |
474 | ((channel)?ICN_FLAGS_B2ACTIVE:ICN_FLAGS_B1ACTIVE)) { | 474 | ((channel) ? ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE)) { |
475 | 475 | ||
476 | isdn_ctrl ncmd; | 476 | isdn_ctrl ncmd; |
477 | 477 | ||
478 | card->flags &= ~((channel)? | ||
479 | ICN_FLAGS_B2ACTIVE:ICN_FLAGS_B1ACTIVE); | ||
480 | |||
481 | memset(&ncmd, 0, sizeof(ncmd)); | ||
482 | |||
483 | ncmd.driver = card->myid; | ||
484 | ncmd.arg = channel; | ||
485 | ncmd.command = ISDN_STAT_BHUP; | ||
486 | spin_unlock_irqrestore(&card->lock, flags); | ||
487 | card->interface.statcallb(&cmd); | ||
488 | } else | ||
489 | spin_unlock_irqrestore(&card->lock, flags); | ||
490 | break; | ||
491 | case 1: | ||
492 | spin_lock_irqsave(&card->lock, flags); | ||
493 | icn_free_queue(card,channel); | ||
494 | card->flags |= (channel) ? | ||
495 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE; | ||
496 | spin_unlock_irqrestore(&card->lock, flags); | ||
497 | break; | ||
498 | case 2: | ||
499 | spin_lock_irqsave(&card->lock, flags); | ||
500 | card->flags &= ~((channel) ? | 478 | card->flags &= ~((channel) ? |
501 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE); | 479 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE); |
502 | icn_free_queue(card, channel); | 480 | |
503 | card->rcvidx[channel] = 0; | 481 | memset(&ncmd, 0, sizeof(ncmd)); |
504 | spin_unlock_irqrestore(&card->lock, flags); | 482 | |
505 | break; | 483 | ncmd.driver = card->myid; |
506 | case 3: | 484 | ncmd.arg = channel; |
507 | { | 485 | ncmd.command = ISDN_STAT_BHUP; |
508 | char *t = status + 6; | ||
509 | char *s = strchr(t, ','); | ||
510 | |||
511 | *s++ = '\0'; | ||
512 | strlcpy(cmd.parm.setup.phone, t, | ||
513 | sizeof(cmd.parm.setup.phone)); | ||
514 | s = strchr(t = s, ','); | ||
515 | *s++ = '\0'; | ||
516 | if (!strlen(t)) | ||
517 | cmd.parm.setup.si1 = 0; | ||
518 | else | ||
519 | cmd.parm.setup.si1 = | ||
520 | simple_strtoul(t, NULL, 10); | ||
521 | s = strchr(t = s, ','); | ||
522 | *s++ = '\0'; | ||
523 | if (!strlen(t)) | ||
524 | cmd.parm.setup.si2 = 0; | ||
525 | else | ||
526 | cmd.parm.setup.si2 = | ||
527 | simple_strtoul(t, NULL, 10); | ||
528 | strlcpy(cmd.parm.setup.eazmsn, s, | ||
529 | sizeof(cmd.parm.setup.eazmsn)); | ||
530 | } | ||
531 | cmd.parm.setup.plan = 0; | ||
532 | cmd.parm.setup.screen = 0; | ||
533 | break; | ||
534 | case 4: | ||
535 | sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid); | ||
536 | sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1); | ||
537 | cmd.parm.setup.si1 = 7; | ||
538 | cmd.parm.setup.si2 = 0; | ||
539 | cmd.parm.setup.plan = 0; | ||
540 | cmd.parm.setup.screen = 0; | ||
541 | break; | ||
542 | case 5: | ||
543 | strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num)); | ||
544 | break; | ||
545 | case 6: | ||
546 | snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d", | ||
547 | (int) simple_strtoul(status + 7, NULL, 16)); | ||
548 | break; | ||
549 | case 7: | ||
550 | status += 3; | ||
551 | if (strlen(status) == 4) | ||
552 | snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c", | ||
553 | status + 2, *status, *(status + 1)); | ||
554 | else | ||
555 | strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num)); | ||
556 | break; | ||
557 | case 8: | ||
558 | spin_lock_irqsave(&card->lock, flags); | ||
559 | card->flags &= ~ICN_FLAGS_B1ACTIVE; | ||
560 | icn_free_queue(card, 0); | ||
561 | card->rcvidx[0] = 0; | ||
562 | spin_unlock_irqrestore(&card->lock, flags); | 486 | spin_unlock_irqrestore(&card->lock, flags); |
563 | cmd.arg = 0; | ||
564 | cmd.driver = card->myid; | ||
565 | card->interface.statcallb(&cmd); | ||
566 | cmd.command = ISDN_STAT_DHUP; | ||
567 | cmd.arg = 0; | ||
568 | cmd.driver = card->myid; | ||
569 | card->interface.statcallb(&cmd); | 487 | card->interface.statcallb(&cmd); |
570 | cmd.command = ISDN_STAT_BHUP; | 488 | } else |
571 | spin_lock_irqsave(&card->lock, flags); | ||
572 | card->flags &= ~ICN_FLAGS_B2ACTIVE; | ||
573 | icn_free_queue(card, 1); | ||
574 | card->rcvidx[1] = 0; | ||
575 | spin_unlock_irqrestore(&card->lock, flags); | 489 | spin_unlock_irqrestore(&card->lock, flags); |
576 | cmd.arg = 1; | 490 | break; |
577 | cmd.driver = card->myid; | 491 | case 1: |
578 | card->interface.statcallb(&cmd); | 492 | spin_lock_irqsave(&card->lock, flags); |
579 | cmd.command = ISDN_STAT_DHUP; | 493 | icn_free_queue(card, channel); |
580 | cmd.arg = 1; | 494 | card->flags |= (channel) ? |
581 | cmd.driver = card->myid; | 495 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE; |
582 | break; | 496 | spin_unlock_irqrestore(&card->lock, flags); |
497 | break; | ||
498 | case 2: | ||
499 | spin_lock_irqsave(&card->lock, flags); | ||
500 | card->flags &= ~((channel) ? | ||
501 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE); | ||
502 | icn_free_queue(card, channel); | ||
503 | card->rcvidx[channel] = 0; | ||
504 | spin_unlock_irqrestore(&card->lock, flags); | ||
505 | break; | ||
506 | case 3: | ||
507 | { | ||
508 | char *t = status + 6; | ||
509 | char *s = strchr(t, ','); | ||
510 | |||
511 | *s++ = '\0'; | ||
512 | strlcpy(cmd.parm.setup.phone, t, | ||
513 | sizeof(cmd.parm.setup.phone)); | ||
514 | s = strchr(t = s, ','); | ||
515 | *s++ = '\0'; | ||
516 | if (!strlen(t)) | ||
517 | cmd.parm.setup.si1 = 0; | ||
518 | else | ||
519 | cmd.parm.setup.si1 = | ||
520 | simple_strtoul(t, NULL, 10); | ||
521 | s = strchr(t = s, ','); | ||
522 | *s++ = '\0'; | ||
523 | if (!strlen(t)) | ||
524 | cmd.parm.setup.si2 = 0; | ||
525 | else | ||
526 | cmd.parm.setup.si2 = | ||
527 | simple_strtoul(t, NULL, 10); | ||
528 | strlcpy(cmd.parm.setup.eazmsn, s, | ||
529 | sizeof(cmd.parm.setup.eazmsn)); | ||
530 | } | ||
531 | cmd.parm.setup.plan = 0; | ||
532 | cmd.parm.setup.screen = 0; | ||
533 | break; | ||
534 | case 4: | ||
535 | sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid); | ||
536 | sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1); | ||
537 | cmd.parm.setup.si1 = 7; | ||
538 | cmd.parm.setup.si2 = 0; | ||
539 | cmd.parm.setup.plan = 0; | ||
540 | cmd.parm.setup.screen = 0; | ||
541 | break; | ||
542 | case 5: | ||
543 | strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num)); | ||
544 | break; | ||
545 | case 6: | ||
546 | snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d", | ||
547 | (int) simple_strtoul(status + 7, NULL, 16)); | ||
548 | break; | ||
549 | case 7: | ||
550 | status += 3; | ||
551 | if (strlen(status) == 4) | ||
552 | snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c", | ||
553 | status + 2, *status, *(status + 1)); | ||
554 | else | ||
555 | strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num)); | ||
556 | break; | ||
557 | case 8: | ||
558 | spin_lock_irqsave(&card->lock, flags); | ||
559 | card->flags &= ~ICN_FLAGS_B1ACTIVE; | ||
560 | icn_free_queue(card, 0); | ||
561 | card->rcvidx[0] = 0; | ||
562 | spin_unlock_irqrestore(&card->lock, flags); | ||
563 | cmd.arg = 0; | ||
564 | cmd.driver = card->myid; | ||
565 | card->interface.statcallb(&cmd); | ||
566 | cmd.command = ISDN_STAT_DHUP; | ||
567 | cmd.arg = 0; | ||
568 | cmd.driver = card->myid; | ||
569 | card->interface.statcallb(&cmd); | ||
570 | cmd.command = ISDN_STAT_BHUP; | ||
571 | spin_lock_irqsave(&card->lock, flags); | ||
572 | card->flags &= ~ICN_FLAGS_B2ACTIVE; | ||
573 | icn_free_queue(card, 1); | ||
574 | card->rcvidx[1] = 0; | ||
575 | spin_unlock_irqrestore(&card->lock, flags); | ||
576 | cmd.arg = 1; | ||
577 | cmd.driver = card->myid; | ||
578 | card->interface.statcallb(&cmd); | ||
579 | cmd.command = ISDN_STAT_DHUP; | ||
580 | cmd.arg = 1; | ||
581 | cmd.driver = card->myid; | ||
582 | break; | ||
583 | } | 583 | } |
584 | card->interface.statcallb(&cmd); | 584 | card->interface.statcallb(&cmd); |
585 | return; | 585 | return; |
586 | } | 586 | } |
587 | 587 | ||
588 | static void | 588 | static void |
589 | icn_putmsg(icn_card * card, unsigned char c) | 589 | icn_putmsg(icn_card *card, unsigned char c) |
590 | { | 590 | { |
591 | ulong flags; | 591 | ulong flags; |
592 | 592 | ||
@@ -688,7 +688,7 @@ icn_polldchan(unsigned long data) | |||
688 | add_timer(&card->rb_timer); | 688 | add_timer(&card->rb_timer); |
689 | } | 689 | } |
690 | /* schedule again */ | 690 | /* schedule again */ |
691 | mod_timer(&card->st_timer, jiffies+ICN_TIMER_DCREAD); | 691 | mod_timer(&card->st_timer, jiffies + ICN_TIMER_DCREAD); |
692 | spin_unlock_irqrestore(&card->lock, flags); | 692 | spin_unlock_irqrestore(&card->lock, flags); |
693 | } | 693 | } |
694 | 694 | ||
@@ -702,7 +702,7 @@ icn_polldchan(unsigned long data) | |||
702 | */ | 702 | */ |
703 | 703 | ||
704 | static int | 704 | static int |
705 | icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card * card) | 705 | icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card *card) |
706 | { | 706 | { |
707 | int len = skb->len; | 707 | int len = skb->len; |
708 | unsigned long flags; | 708 | unsigned long flags; |
@@ -718,13 +718,13 @@ icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card * card) | |||
718 | return 0; | 718 | return 0; |
719 | if (card->sndcount[channel] > ICN_MAX_SQUEUE) | 719 | if (card->sndcount[channel] > ICN_MAX_SQUEUE) |
720 | return 0; | 720 | return 0; |
721 | #warning TODO test headroom or use skb->nb to flag ACK | 721 | #warning TODO test headroom or use skb->nb to flag ACK |
722 | nskb = skb_clone(skb, GFP_ATOMIC); | 722 | nskb = skb_clone(skb, GFP_ATOMIC); |
723 | if (nskb) { | 723 | if (nskb) { |
724 | /* Push ACK flag as one | 724 | /* Push ACK flag as one |
725 | * byte in front of data. | 725 | * byte in front of data. |
726 | */ | 726 | */ |
727 | *(skb_push(nskb, 1)) = ack?1:0; | 727 | *(skb_push(nskb, 1)) = ack ? 1 : 0; |
728 | skb_queue_tail(&card->spqueue[channel], nskb); | 728 | skb_queue_tail(&card->spqueue[channel], nskb); |
729 | dev_kfree_skb(skb); | 729 | dev_kfree_skb(skb); |
730 | } else | 730 | } else |
@@ -785,20 +785,20 @@ icn_check_loader(int cardnumber) | |||
785 | */ | 785 | */ |
786 | 786 | ||
787 | #ifdef BOOT_DEBUG | 787 | #ifdef BOOT_DEBUG |
788 | #define SLEEP(sec) { \ | 788 | #define SLEEP(sec) { \ |
789 | int slsec = sec; \ | 789 | int slsec = sec; \ |
790 | printk(KERN_DEBUG "SLEEP(%d)\n",slsec); \ | 790 | printk(KERN_DEBUG "SLEEP(%d)\n", slsec); \ |
791 | while (slsec) { \ | 791 | while (slsec) { \ |
792 | msleep_interruptible(1000); \ | 792 | msleep_interruptible(1000); \ |
793 | slsec--; \ | 793 | slsec--; \ |
794 | } \ | 794 | } \ |
795 | } | 795 | } |
796 | #else | 796 | #else |
797 | #define SLEEP(sec) | 797 | #define SLEEP(sec) |
798 | #endif | 798 | #endif |
799 | 799 | ||
800 | static int | 800 | static int |
801 | icn_loadboot(u_char __user * buffer, icn_card * card) | 801 | icn_loadboot(u_char __user *buffer, icn_card *card) |
802 | { | 802 | { |
803 | int ret; | 803 | int ret; |
804 | u_char *codebuf; | 804 | u_char *codebuf; |
@@ -896,14 +896,14 @@ icn_loadboot(u_char __user * buffer, icn_card * card) | |||
896 | SLEEP(1); | 896 | SLEEP(1); |
897 | ret = (icn_check_loader(1)); | 897 | ret = (icn_check_loader(1)); |
898 | 898 | ||
899 | out_kfree: | 899 | out_kfree: |
900 | kfree(codebuf); | 900 | kfree(codebuf); |
901 | out: | 901 | out: |
902 | return ret; | 902 | return ret; |
903 | } | 903 | } |
904 | 904 | ||
905 | static int | 905 | static int |
906 | icn_loadproto(u_char __user * buffer, icn_card * card) | 906 | icn_loadproto(u_char __user *buffer, icn_card *card) |
907 | { | 907 | { |
908 | register u_char __user *p = buffer; | 908 | register u_char __user *p = buffer; |
909 | u_char codebuf[256]; | 909 | u_char codebuf[256]; |
@@ -1004,7 +1004,7 @@ icn_loadproto(u_char __user * buffer, icn_card * card) | |||
1004 | 1004 | ||
1005 | /* Read the Status-replies from the Interface */ | 1005 | /* Read the Status-replies from the Interface */ |
1006 | static int | 1006 | static int |
1007 | icn_readstatus(u_char __user *buf, int len, icn_card * card) | 1007 | icn_readstatus(u_char __user *buf, int len, icn_card *card) |
1008 | { | 1008 | { |
1009 | int count; | 1009 | int count; |
1010 | u_char __user *p; | 1010 | u_char __user *p; |
@@ -1022,7 +1022,7 @@ icn_readstatus(u_char __user *buf, int len, icn_card * card) | |||
1022 | 1022 | ||
1023 | /* Put command-strings into the command-queue of the Interface */ | 1023 | /* Put command-strings into the command-queue of the Interface */ |
1024 | static int | 1024 | static int |
1025 | icn_writecmd(const u_char * buf, int len, int user, icn_card * card) | 1025 | icn_writecmd(const u_char *buf, int len, int user, icn_card *card) |
1026 | { | 1026 | { |
1027 | int mch = card->secondhalf ? 2 : 0; | 1027 | int mch = card->secondhalf ? 2 : 0; |
1028 | int pp; | 1028 | int pp; |
@@ -1057,9 +1057,9 @@ icn_writecmd(const u_char * buf, int len, int user, icn_card * card) | |||
1057 | 1057 | ||
1058 | icn_putmsg(card, '>'); | 1058 | icn_putmsg(card, '>'); |
1059 | for (p = msg, pp = readb(&cmd_i), i = count; i > 0; i--, p++, pp | 1059 | for (p = msg, pp = readb(&cmd_i), i = count; i > 0; i--, p++, pp |
1060 | ++) { | 1060 | ++) { |
1061 | writeb((*p == '\n') ? 0xff : *p, | 1061 | writeb((*p == '\n') ? 0xff : *p, |
1062 | &dev.shmem->comm_buffers.pcio_buf[pp & 0xff]); | 1062 | &dev.shmem->comm_buffers.pcio_buf[pp & 0xff]); |
1063 | len--; | 1063 | len--; |
1064 | xcount++; | 1064 | xcount++; |
1065 | icn_putmsg(card, *p); | 1065 | icn_putmsg(card, *p); |
@@ -1093,7 +1093,7 @@ icn_writecmd(const u_char * buf, int len, int user, icn_card * card) | |||
1093 | * Delete card's pending timers, send STOP to linklevel | 1093 | * Delete card's pending timers, send STOP to linklevel |
1094 | */ | 1094 | */ |
1095 | static void | 1095 | static void |
1096 | icn_stopcard(icn_card * card) | 1096 | icn_stopcard(icn_card *card) |
1097 | { | 1097 | { |
1098 | unsigned long flags; | 1098 | unsigned long flags; |
1099 | isdn_ctrl cmd; | 1099 | isdn_ctrl cmd; |
@@ -1150,7 +1150,7 @@ icn_disable_cards(void) | |||
1150 | } | 1150 | } |
1151 | 1151 | ||
1152 | static int | 1152 | static int |
1153 | icn_command(isdn_ctrl * c, icn_card * card) | 1153 | icn_command(isdn_ctrl *c, icn_card *card) |
1154 | { | 1154 | { |
1155 | ulong a; | 1155 | ulong a; |
1156 | ulong flags; | 1156 | ulong flags; |
@@ -1161,275 +1161,275 @@ icn_command(isdn_ctrl * c, icn_card * card) | |||
1161 | char __user *arg; | 1161 | char __user *arg; |
1162 | 1162 | ||
1163 | switch (c->command) { | 1163 | switch (c->command) { |
1164 | case ISDN_CMD_IOCTL: | 1164 | case ISDN_CMD_IOCTL: |
1165 | memcpy(&a, c->parm.num, sizeof(ulong)); | 1165 | memcpy(&a, c->parm.num, sizeof(ulong)); |
1166 | arg = (char __user *)a; | 1166 | arg = (char __user *)a; |
1167 | switch (c->arg) { | 1167 | switch (c->arg) { |
1168 | case ICN_IOCTL_SETMMIO: | 1168 | case ICN_IOCTL_SETMMIO: |
1169 | if (dev.memaddr != (a & 0x0ffc000)) { | 1169 | if (dev.memaddr != (a & 0x0ffc000)) { |
1170 | if (!request_mem_region(a & 0x0ffc000, 0x4000, "icn-isdn (all cards)")) { | 1170 | if (!request_mem_region(a & 0x0ffc000, 0x4000, "icn-isdn (all cards)")) { |
1171 | printk(KERN_WARNING | 1171 | printk(KERN_WARNING |
1172 | "icn: memory at 0x%08lx in use.\n", | 1172 | "icn: memory at 0x%08lx in use.\n", |
1173 | a & 0x0ffc000); | 1173 | a & 0x0ffc000); |
1174 | return -EINVAL; | 1174 | return -EINVAL; |
1175 | } | 1175 | } |
1176 | release_mem_region(a & 0x0ffc000, 0x4000); | 1176 | release_mem_region(a & 0x0ffc000, 0x4000); |
1177 | icn_stopallcards(); | 1177 | icn_stopallcards(); |
1178 | spin_lock_irqsave(&card->lock, flags); | 1178 | spin_lock_irqsave(&card->lock, flags); |
1179 | if (dev.mvalid) { | 1179 | if (dev.mvalid) { |
1180 | iounmap(dev.shmem); | 1180 | iounmap(dev.shmem); |
1181 | release_mem_region(dev.memaddr, 0x4000); | 1181 | release_mem_region(dev.memaddr, 0x4000); |
1182 | } | 1182 | } |
1183 | dev.mvalid = 0; | 1183 | dev.mvalid = 0; |
1184 | dev.memaddr = a & 0x0ffc000; | 1184 | dev.memaddr = a & 0x0ffc000; |
1185 | spin_unlock_irqrestore(&card->lock, flags); | 1185 | spin_unlock_irqrestore(&card->lock, flags); |
1186 | printk(KERN_INFO | 1186 | printk(KERN_INFO |
1187 | "icn: (%s) mmio set to 0x%08lx\n", | 1187 | "icn: (%s) mmio set to 0x%08lx\n", |
1188 | CID, | 1188 | CID, |
1189 | dev.memaddr); | 1189 | dev.memaddr); |
1190 | } | 1190 | } |
1191 | break; | 1191 | break; |
1192 | case ICN_IOCTL_GETMMIO: | 1192 | case ICN_IOCTL_GETMMIO: |
1193 | return (long) dev.memaddr; | 1193 | return (long) dev.memaddr; |
1194 | case ICN_IOCTL_SETPORT: | 1194 | case ICN_IOCTL_SETPORT: |
1195 | if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330 | 1195 | if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330 |
1196 | || a == 0x340 || a == 0x350 || a == 0x360 || | 1196 | || a == 0x340 || a == 0x350 || a == 0x360 || |
1197 | a == 0x308 || a == 0x318 || a == 0x328 || a == 0x338 | 1197 | a == 0x308 || a == 0x318 || a == 0x328 || a == 0x338 |
1198 | || a == 0x348 || a == 0x358 || a == 0x368) { | 1198 | || a == 0x348 || a == 0x358 || a == 0x368) { |
1199 | if (card->port != (unsigned short) a) { | 1199 | if (card->port != (unsigned short) a) { |
1200 | if (!request_region((unsigned short) a, ICN_PORTLEN, "icn-isdn")) { | 1200 | if (!request_region((unsigned short) a, ICN_PORTLEN, "icn-isdn")) { |
1201 | printk(KERN_WARNING | 1201 | printk(KERN_WARNING |
1202 | "icn: (%s) ports 0x%03x-0x%03x in use.\n", | 1202 | "icn: (%s) ports 0x%03x-0x%03x in use.\n", |
1203 | CID, (int) a, (int) a + ICN_PORTLEN); | 1203 | CID, (int) a, (int) a + ICN_PORTLEN); |
1204 | return -EINVAL; | ||
1205 | } | ||
1206 | release_region((unsigned short) a, ICN_PORTLEN); | ||
1207 | icn_stopcard(card); | ||
1208 | spin_lock_irqsave(&card->lock, flags); | ||
1209 | if (card->rvalid) | ||
1210 | release_region(card->port, ICN_PORTLEN); | ||
1211 | card->port = (unsigned short) a; | ||
1212 | card->rvalid = 0; | ||
1213 | if (card->doubleS0) { | ||
1214 | card->other->port = (unsigned short) a; | ||
1215 | card->other->rvalid = 0; | ||
1216 | } | ||
1217 | spin_unlock_irqrestore(&card->lock, flags); | ||
1218 | printk(KERN_INFO | ||
1219 | "icn: (%s) port set to 0x%03x\n", | ||
1220 | CID, card->port); | ||
1221 | } | ||
1222 | } else | ||
1223 | return -EINVAL; | 1204 | return -EINVAL; |
1224 | break; | ||
1225 | case ICN_IOCTL_GETPORT: | ||
1226 | return (int) card->port; | ||
1227 | case ICN_IOCTL_GETDOUBLE: | ||
1228 | return (int) card->doubleS0; | ||
1229 | case ICN_IOCTL_DEBUGVAR: | ||
1230 | if (copy_to_user(arg, | ||
1231 | &card, | ||
1232 | sizeof(ulong))) | ||
1233 | return -EFAULT; | ||
1234 | a += sizeof(ulong); | ||
1235 | { | ||
1236 | ulong l = (ulong) & dev; | ||
1237 | if (copy_to_user(arg, | ||
1238 | &l, | ||
1239 | sizeof(ulong))) | ||
1240 | return -EFAULT; | ||
1241 | } | 1205 | } |
1242 | return 0; | 1206 | release_region((unsigned short) a, ICN_PORTLEN); |
1243 | case ICN_IOCTL_LOADBOOT: | ||
1244 | if (dev.firstload) { | ||
1245 | icn_disable_cards(); | ||
1246 | dev.firstload = 0; | ||
1247 | } | ||
1248 | icn_stopcard(card); | ||
1249 | return (icn_loadboot(arg, card)); | ||
1250 | case ICN_IOCTL_LOADPROTO: | ||
1251 | icn_stopcard(card); | 1207 | icn_stopcard(card); |
1252 | if ((i = (icn_loadproto(arg, card)))) | 1208 | spin_lock_irqsave(&card->lock, flags); |
1253 | return i; | 1209 | if (card->rvalid) |
1254 | if (card->doubleS0) | 1210 | release_region(card->port, ICN_PORTLEN); |
1255 | i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other); | 1211 | card->port = (unsigned short) a; |
1256 | return i; | 1212 | card->rvalid = 0; |
1257 | break; | 1213 | if (card->doubleS0) { |
1258 | case ICN_IOCTL_ADDCARD: | 1214 | card->other->port = (unsigned short) a; |
1259 | if (!dev.firstload) | 1215 | card->other->rvalid = 0; |
1260 | return -EBUSY; | ||
1261 | if (copy_from_user(&cdef, | ||
1262 | arg, | ||
1263 | sizeof(cdef))) | ||
1264 | return -EFAULT; | ||
1265 | return (icn_addcard(cdef.port, cdef.id1, cdef.id2)); | ||
1266 | break; | ||
1267 | case ICN_IOCTL_LEASEDCFG: | ||
1268 | if (a) { | ||
1269 | if (!card->leased) { | ||
1270 | card->leased = 1; | ||
1271 | while (card->ptype == ISDN_PTYPE_UNKNOWN) { | ||
1272 | msleep_interruptible(ICN_BOOT_TIMEOUT1); | ||
1273 | } | ||
1274 | msleep_interruptible(ICN_BOOT_TIMEOUT1); | ||
1275 | sprintf(cbuf, "00;FV2ON\n01;EAZ%c\n02;EAZ%c\n", | ||
1276 | (a & 1)?'1':'C', (a & 2)?'2':'C'); | ||
1277 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1278 | printk(KERN_INFO | ||
1279 | "icn: (%s) Leased-line mode enabled\n", | ||
1280 | CID); | ||
1281 | cmd.command = ISDN_STAT_RUN; | ||
1282 | cmd.driver = card->myid; | ||
1283 | cmd.arg = 0; | ||
1284 | card->interface.statcallb(&cmd); | ||
1285 | } | ||
1286 | } else { | ||
1287 | if (card->leased) { | ||
1288 | card->leased = 0; | ||
1289 | sprintf(cbuf, "00;FV2OFF\n"); | ||
1290 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1291 | printk(KERN_INFO | ||
1292 | "icn: (%s) Leased-line mode disabled\n", | ||
1293 | CID); | ||
1294 | cmd.command = ISDN_STAT_RUN; | ||
1295 | cmd.driver = card->myid; | ||
1296 | cmd.arg = 0; | ||
1297 | card->interface.statcallb(&cmd); | ||
1298 | } | ||
1299 | } | 1216 | } |
1300 | return 0; | 1217 | spin_unlock_irqrestore(&card->lock, flags); |
1301 | default: | 1218 | printk(KERN_INFO |
1302 | return -EINVAL; | 1219 | "icn: (%s) port set to 0x%03x\n", |
1303 | } | 1220 | CID, card->port); |
1221 | } | ||
1222 | } else | ||
1223 | return -EINVAL; | ||
1304 | break; | 1224 | break; |
1305 | case ISDN_CMD_DIAL: | 1225 | case ICN_IOCTL_GETPORT: |
1306 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1226 | return (int) card->port; |
1307 | return -ENODEV; | 1227 | case ICN_IOCTL_GETDOUBLE: |
1308 | if (card->leased) | 1228 | return (int) card->doubleS0; |
1309 | break; | 1229 | case ICN_IOCTL_DEBUGVAR: |
1310 | if ((c->arg & 255) < ICN_BCH) { | 1230 | if (copy_to_user(arg, |
1311 | char *p; | 1231 | &card, |
1312 | char dial[50]; | 1232 | sizeof(ulong))) |
1313 | char dcode[4]; | 1233 | return -EFAULT; |
1314 | 1234 | a += sizeof(ulong); | |
1315 | a = c->arg; | 1235 | { |
1316 | p = c->parm.setup.phone; | 1236 | ulong l = (ulong)&dev; |
1317 | if (*p == 's' || *p == 'S') { | 1237 | if (copy_to_user(arg, |
1318 | /* Dial for SPV */ | 1238 | &l, |
1319 | p++; | 1239 | sizeof(ulong))) |
1320 | strcpy(dcode, "SCA"); | 1240 | return -EFAULT; |
1321 | } else | ||
1322 | /* Normal Dial */ | ||
1323 | strcpy(dcode, "CAL"); | ||
1324 | strcpy(dial, p); | ||
1325 | sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), | ||
1326 | dcode, dial, c->parm.setup.si1, | ||
1327 | c->parm.setup.si2, c->parm.setup.eazmsn); | ||
1328 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1329 | } | 1241 | } |
1242 | return 0; | ||
1243 | case ICN_IOCTL_LOADBOOT: | ||
1244 | if (dev.firstload) { | ||
1245 | icn_disable_cards(); | ||
1246 | dev.firstload = 0; | ||
1247 | } | ||
1248 | icn_stopcard(card); | ||
1249 | return (icn_loadboot(arg, card)); | ||
1250 | case ICN_IOCTL_LOADPROTO: | ||
1251 | icn_stopcard(card); | ||
1252 | if ((i = (icn_loadproto(arg, card)))) | ||
1253 | return i; | ||
1254 | if (card->doubleS0) | ||
1255 | i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other); | ||
1256 | return i; | ||
1257 | break; | ||
1258 | case ICN_IOCTL_ADDCARD: | ||
1259 | if (!dev.firstload) | ||
1260 | return -EBUSY; | ||
1261 | if (copy_from_user(&cdef, | ||
1262 | arg, | ||
1263 | sizeof(cdef))) | ||
1264 | return -EFAULT; | ||
1265 | return (icn_addcard(cdef.port, cdef.id1, cdef.id2)); | ||
1330 | break; | 1266 | break; |
1331 | case ISDN_CMD_ACCEPTD: | 1267 | case ICN_IOCTL_LEASEDCFG: |
1332 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1268 | if (a) { |
1333 | return -ENODEV; | 1269 | if (!card->leased) { |
1334 | if (c->arg < ICN_BCH) { | 1270 | card->leased = 1; |
1335 | a = c->arg + 1; | 1271 | while (card->ptype == ISDN_PTYPE_UNKNOWN) { |
1336 | if (card->fw_rev >= 300) { | 1272 | msleep_interruptible(ICN_BOOT_TIMEOUT1); |
1337 | switch (card->l2_proto[a - 1]) { | ||
1338 | case ISDN_PROTO_L2_X75I: | ||
1339 | sprintf(cbuf, "%02d;BX75\n", (int) a); | ||
1340 | break; | ||
1341 | case ISDN_PROTO_L2_HDLC: | ||
1342 | sprintf(cbuf, "%02d;BTRA\n", (int) a); | ||
1343 | break; | ||
1344 | } | 1273 | } |
1274 | msleep_interruptible(ICN_BOOT_TIMEOUT1); | ||
1275 | sprintf(cbuf, "00;FV2ON\n01;EAZ%c\n02;EAZ%c\n", | ||
1276 | (a & 1) ? '1' : 'C', (a & 2) ? '2' : 'C'); | ||
1345 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | 1277 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); |
1278 | printk(KERN_INFO | ||
1279 | "icn: (%s) Leased-line mode enabled\n", | ||
1280 | CID); | ||
1281 | cmd.command = ISDN_STAT_RUN; | ||
1282 | cmd.driver = card->myid; | ||
1283 | cmd.arg = 0; | ||
1284 | card->interface.statcallb(&cmd); | ||
1285 | } | ||
1286 | } else { | ||
1287 | if (card->leased) { | ||
1288 | card->leased = 0; | ||
1289 | sprintf(cbuf, "00;FV2OFF\n"); | ||
1290 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1291 | printk(KERN_INFO | ||
1292 | "icn: (%s) Leased-line mode disabled\n", | ||
1293 | CID); | ||
1294 | cmd.command = ISDN_STAT_RUN; | ||
1295 | cmd.driver = card->myid; | ||
1296 | cmd.arg = 0; | ||
1297 | card->interface.statcallb(&cmd); | ||
1346 | } | 1298 | } |
1347 | sprintf(cbuf, "%02d;DCON_R\n", (int) a); | ||
1348 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1349 | } | 1299 | } |
1300 | return 0; | ||
1301 | default: | ||
1302 | return -EINVAL; | ||
1303 | } | ||
1304 | break; | ||
1305 | case ISDN_CMD_DIAL: | ||
1306 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1307 | return -ENODEV; | ||
1308 | if (card->leased) | ||
1350 | break; | 1309 | break; |
1351 | case ISDN_CMD_ACCEPTB: | 1310 | if ((c->arg & 255) < ICN_BCH) { |
1352 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1311 | char *p; |
1353 | return -ENODEV; | 1312 | char dial[50]; |
1354 | if (c->arg < ICN_BCH) { | 1313 | char dcode[4]; |
1355 | a = c->arg + 1; | 1314 | |
1356 | if (card->fw_rev >= 300) | 1315 | a = c->arg; |
1357 | switch (card->l2_proto[a - 1]) { | 1316 | p = c->parm.setup.phone; |
1358 | case ISDN_PROTO_L2_X75I: | 1317 | if (*p == 's' || *p == 'S') { |
1359 | sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a); | 1318 | /* Dial for SPV */ |
1360 | break; | 1319 | p++; |
1361 | case ISDN_PROTO_L2_HDLC: | 1320 | strcpy(dcode, "SCA"); |
1362 | sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a); | 1321 | } else |
1363 | break; | 1322 | /* Normal Dial */ |
1364 | } else | 1323 | strcpy(dcode, "CAL"); |
1365 | sprintf(cbuf, "%02d;BCON_R\n", (int) a); | 1324 | strcpy(dial, p); |
1325 | sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), | ||
1326 | dcode, dial, c->parm.setup.si1, | ||
1327 | c->parm.setup.si2, c->parm.setup.eazmsn); | ||
1328 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1329 | } | ||
1330 | break; | ||
1331 | case ISDN_CMD_ACCEPTD: | ||
1332 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1333 | return -ENODEV; | ||
1334 | if (c->arg < ICN_BCH) { | ||
1335 | a = c->arg + 1; | ||
1336 | if (card->fw_rev >= 300) { | ||
1337 | switch (card->l2_proto[a - 1]) { | ||
1338 | case ISDN_PROTO_L2_X75I: | ||
1339 | sprintf(cbuf, "%02d;BX75\n", (int) a); | ||
1340 | break; | ||
1341 | case ISDN_PROTO_L2_HDLC: | ||
1342 | sprintf(cbuf, "%02d;BTRA\n", (int) a); | ||
1343 | break; | ||
1344 | } | ||
1366 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | 1345 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); |
1367 | } | 1346 | } |
1347 | sprintf(cbuf, "%02d;DCON_R\n", (int) a); | ||
1348 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1349 | } | ||
1350 | break; | ||
1351 | case ISDN_CMD_ACCEPTB: | ||
1352 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1353 | return -ENODEV; | ||
1354 | if (c->arg < ICN_BCH) { | ||
1355 | a = c->arg + 1; | ||
1356 | if (card->fw_rev >= 300) | ||
1357 | switch (card->l2_proto[a - 1]) { | ||
1358 | case ISDN_PROTO_L2_X75I: | ||
1359 | sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a); | ||
1360 | break; | ||
1361 | case ISDN_PROTO_L2_HDLC: | ||
1362 | sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a); | ||
1363 | break; | ||
1364 | } else | ||
1365 | sprintf(cbuf, "%02d;BCON_R\n", (int) a); | ||
1366 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1367 | } | ||
1368 | break; | ||
1369 | case ISDN_CMD_HANGUP: | ||
1370 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1371 | return -ENODEV; | ||
1372 | if (c->arg < ICN_BCH) { | ||
1373 | a = c->arg + 1; | ||
1374 | sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a); | ||
1375 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1376 | } | ||
1377 | break; | ||
1378 | case ISDN_CMD_SETEAZ: | ||
1379 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1380 | return -ENODEV; | ||
1381 | if (card->leased) | ||
1368 | break; | 1382 | break; |
1369 | case ISDN_CMD_HANGUP: | 1383 | if (c->arg < ICN_BCH) { |
1370 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1384 | a = c->arg + 1; |
1371 | return -ENODEV; | 1385 | if (card->ptype == ISDN_PTYPE_EURO) { |
1372 | if (c->arg < ICN_BCH) { | 1386 | sprintf(cbuf, "%02d;MS%s%s\n", (int) a, |
1373 | a = c->arg + 1; | 1387 | c->parm.num[0] ? "N" : "ALL", c->parm.num); |
1374 | sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a); | 1388 | } else |
1375 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | 1389 | sprintf(cbuf, "%02d;EAZ%s\n", (int) a, |
1376 | } | 1390 | c->parm.num[0] ? (char *)(c->parm.num) : "0123456789"); |
1391 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1392 | } | ||
1393 | break; | ||
1394 | case ISDN_CMD_CLREAZ: | ||
1395 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1396 | return -ENODEV; | ||
1397 | if (card->leased) | ||
1377 | break; | 1398 | break; |
1378 | case ISDN_CMD_SETEAZ: | 1399 | if (c->arg < ICN_BCH) { |
1379 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1400 | a = c->arg + 1; |
1380 | return -ENODEV; | 1401 | if (card->ptype == ISDN_PTYPE_EURO) |
1381 | if (card->leased) | 1402 | sprintf(cbuf, "%02d;MSNC\n", (int) a); |
1403 | else | ||
1404 | sprintf(cbuf, "%02d;EAZC\n", (int) a); | ||
1405 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1406 | } | ||
1407 | break; | ||
1408 | case ISDN_CMD_SETL2: | ||
1409 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1410 | return -ENODEV; | ||
1411 | if ((c->arg & 255) < ICN_BCH) { | ||
1412 | a = c->arg; | ||
1413 | switch (a >> 8) { | ||
1414 | case ISDN_PROTO_L2_X75I: | ||
1415 | sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1); | ||
1382 | break; | 1416 | break; |
1383 | if (c->arg < ICN_BCH) { | 1417 | case ISDN_PROTO_L2_HDLC: |
1384 | a = c->arg + 1; | 1418 | sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1); |
1385 | if (card->ptype == ISDN_PTYPE_EURO) { | ||
1386 | sprintf(cbuf, "%02d;MS%s%s\n", (int) a, | ||
1387 | c->parm.num[0] ? "N" : "ALL", c->parm.num); | ||
1388 | } else | ||
1389 | sprintf(cbuf, "%02d;EAZ%s\n", (int) a, | ||
1390 | c->parm.num[0] ? (char *)(c->parm.num) : "0123456789"); | ||
1391 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1392 | } | ||
1393 | break; | ||
1394 | case ISDN_CMD_CLREAZ: | ||
1395 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1396 | return -ENODEV; | ||
1397 | if (card->leased) | ||
1398 | break; | 1419 | break; |
1399 | if (c->arg < ICN_BCH) { | 1420 | default: |
1400 | a = c->arg + 1; | 1421 | return -EINVAL; |
1401 | if (card->ptype == ISDN_PTYPE_EURO) | ||
1402 | sprintf(cbuf, "%02d;MSNC\n", (int) a); | ||
1403 | else | ||
1404 | sprintf(cbuf, "%02d;EAZC\n", (int) a); | ||
1405 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1406 | } | ||
1407 | break; | ||
1408 | case ISDN_CMD_SETL2: | ||
1409 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
1410 | return -ENODEV; | ||
1411 | if ((c->arg & 255) < ICN_BCH) { | ||
1412 | a = c->arg; | ||
1413 | switch (a >> 8) { | ||
1414 | case ISDN_PROTO_L2_X75I: | ||
1415 | sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1); | ||
1416 | break; | ||
1417 | case ISDN_PROTO_L2_HDLC: | ||
1418 | sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1); | ||
1419 | break; | ||
1420 | default: | ||
1421 | return -EINVAL; | ||
1422 | } | ||
1423 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1424 | card->l2_proto[a & 255] = (a >> 8); | ||
1425 | } | 1422 | } |
1426 | break; | 1423 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); |
1427 | case ISDN_CMD_SETL3: | 1424 | card->l2_proto[a & 255] = (a >> 8); |
1428 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1425 | } |
1429 | return -ENODEV; | 1426 | break; |
1430 | return 0; | 1427 | case ISDN_CMD_SETL3: |
1431 | default: | 1428 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1432 | return -EINVAL; | 1429 | return -ENODEV; |
1430 | return 0; | ||
1431 | default: | ||
1432 | return -EINVAL; | ||
1433 | } | 1433 | } |
1434 | return 0; | 1434 | return 0; |
1435 | } | 1435 | } |
@@ -1454,7 +1454,7 @@ icn_findcard(int driverid) | |||
1454 | * Wrapper functions for interface to linklevel | 1454 | * Wrapper functions for interface to linklevel |
1455 | */ | 1455 | */ |
1456 | static int | 1456 | static int |
1457 | if_command(isdn_ctrl * c) | 1457 | if_command(isdn_ctrl *c) |
1458 | { | 1458 | { |
1459 | icn_card *card = icn_findcard(c->driver); | 1459 | icn_card *card = icn_findcard(c->driver); |
1460 | 1460 | ||
@@ -1537,9 +1537,9 @@ icn_initcard(int port, char *id) | |||
1537 | card->interface.writecmd = if_writecmd; | 1537 | card->interface.writecmd = if_writecmd; |
1538 | card->interface.readstat = if_readstatus; | 1538 | card->interface.readstat = if_readstatus; |
1539 | card->interface.features = ISDN_FEATURE_L2_X75I | | 1539 | card->interface.features = ISDN_FEATURE_L2_X75I | |
1540 | ISDN_FEATURE_L2_HDLC | | 1540 | ISDN_FEATURE_L2_HDLC | |
1541 | ISDN_FEATURE_L3_TRANS | | 1541 | ISDN_FEATURE_L3_TRANS | |
1542 | ISDN_FEATURE_P_UNKNOWN; | 1542 | ISDN_FEATURE_P_UNKNOWN; |
1543 | card->ptype = ISDN_PTYPE_UNKNOWN; | 1543 | card->ptype = ISDN_PTYPE_UNKNOWN; |
1544 | strlcpy(card->interface.id, id, sizeof(card->interface.id)); | 1544 | strlcpy(card->interface.id, id, sizeof(card->interface.id)); |
1545 | card->msg_buf_write = card->msg_buf; | 1545 | card->msg_buf_write = card->msg_buf; |
@@ -1619,7 +1619,7 @@ icn_setup(char *line) | |||
1619 | icn_id2 = sid2; | 1619 | icn_id2 = sid2; |
1620 | } | 1620 | } |
1621 | } | 1621 | } |
1622 | return(1); | 1622 | return (1); |
1623 | } | 1623 | } |
1624 | __setup("icn=", icn_setup); | 1624 | __setup("icn=", icn_setup); |
1625 | #endif /* MODULE */ | 1625 | #endif /* MODULE */ |