diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/isdn/icn | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/isdn/icn')
-rw-r--r-- | drivers/isdn/icn/icn.c | 806 | ||||
-rw-r--r-- | drivers/isdn/icn/icn.h | 32 |
2 files changed, 419 insertions, 419 deletions
diff --git a/drivers/isdn/icn/icn.c b/drivers/isdn/icn/icn.c index e74df7c4658..1f355bb85e5 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); | ||
478 | card->flags &= ~((channel) ? | 500 | card->flags &= ~((channel) ? |
479 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE); | 501 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE); |
480 | 502 | icn_free_queue(card, channel); | |
481 | memset(&ncmd, 0, sizeof(ncmd)); | 503 | card->rcvidx[channel] = 0; |
482 | |||
483 | ncmd.driver = card->myid; | ||
484 | ncmd.arg = channel; | ||
485 | ncmd.command = ISDN_STAT_BHUP; | ||
486 | spin_unlock_irqrestore(&card->lock, flags); | 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; | ||
487 | card->interface.statcallb(&cmd); | 565 | card->interface.statcallb(&cmd); |
488 | } else | 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; | ||
489 | spin_unlock_irqrestore(&card->lock, flags); | 575 | spin_unlock_irqrestore(&card->lock, flags); |
490 | break; | 576 | cmd.arg = 1; |
491 | case 1: | 577 | cmd.driver = card->myid; |
492 | spin_lock_irqsave(&card->lock, flags); | 578 | card->interface.statcallb(&cmd); |
493 | icn_free_queue(card, channel); | 579 | cmd.command = ISDN_STAT_DHUP; |
494 | card->flags |= (channel) ? | 580 | cmd.arg = 1; |
495 | ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE; | 581 | cmd.driver = card->myid; |
496 | spin_unlock_irqrestore(&card->lock, flags); | 582 | break; |
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 | ||
1204 | return -EINVAL; | 1223 | 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; | ||
1205 | } | 1241 | } |
1206 | release_region((unsigned short) a, ICN_PORTLEN); | 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: | ||
1207 | icn_stopcard(card); | 1251 | icn_stopcard(card); |
1208 | spin_lock_irqsave(&card->lock, flags); | 1252 | if ((i = (icn_loadproto(arg, card)))) |
1209 | if (card->rvalid) | 1253 | return i; |
1210 | release_region(card->port, ICN_PORTLEN); | 1254 | if (card->doubleS0) |
1211 | card->port = (unsigned short) a; | 1255 | i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other); |
1212 | card->rvalid = 0; | 1256 | return i; |
1213 | if (card->doubleS0) { | 1257 | break; |
1214 | card->other->port = (unsigned short) a; | 1258 | case ICN_IOCTL_ADDCARD: |
1215 | card->other->rvalid = 0; | 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)); | ||
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 | } | ||
1216 | } | 1299 | } |
1217 | spin_unlock_irqrestore(&card->lock, flags); | 1300 | return 0; |
1218 | printk(KERN_INFO | 1301 | default: |
1219 | "icn: (%s) port set to 0x%03x\n", | 1302 | return -EINVAL; |
1220 | CID, card->port); | ||
1221 | } | ||
1222 | } else | ||
1223 | 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 | } | ||
1242 | return 0; | ||
1243 | case ICN_IOCTL_LOADBOOT: | ||
1244 | if (dev.firstload) { | ||
1245 | icn_disable_cards(); | ||
1246 | dev.firstload = 0; | ||
1247 | } | 1303 | } |
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; | 1304 | break; |
1258 | case ICN_IOCTL_ADDCARD: | 1305 | case ISDN_CMD_DIAL: |
1259 | if (!dev.firstload) | 1306 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1260 | return -EBUSY; | 1307 | return -ENODEV; |
1261 | if (copy_from_user(&cdef, | 1308 | if (card->leased) |
1262 | arg, | 1309 | break; |
1263 | sizeof(cdef))) | 1310 | if ((c->arg & 255) < ICN_BCH) { |
1264 | return -EFAULT; | 1311 | char *p; |
1265 | return (icn_addcard(cdef.port, cdef.id1, cdef.id2)); | 1312 | char dial[50]; |
1313 | char dcode[4]; | ||
1314 | |||
1315 | a = c->arg; | ||
1316 | p = c->parm.setup.phone; | ||
1317 | if (*p == 's' || *p == 'S') { | ||
1318 | /* Dial for SPV */ | ||
1319 | p++; | ||
1320 | strcpy(dcode, "SCA"); | ||
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 | } | ||
1266 | break; | 1330 | break; |
1267 | case ICN_IOCTL_LEASEDCFG: | 1331 | case ISDN_CMD_ACCEPTD: |
1268 | if (a) { | 1332 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1269 | if (!card->leased) { | 1333 | return -ENODEV; |
1270 | card->leased = 1; | 1334 | if (c->arg < ICN_BCH) { |
1271 | while (card->ptype == ISDN_PTYPE_UNKNOWN) { | 1335 | a = c->arg + 1; |
1272 | msleep_interruptible(ICN_BOOT_TIMEOUT1); | 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; | ||
1273 | } | 1344 | } |
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); | 1345 | 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 | } | 1346 | } |
1347 | sprintf(cbuf, "%02d;DCON_R\n", (int) a); | ||
1348 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | ||
1299 | } | 1349 | } |
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) | ||
1309 | break; | 1350 | break; |
1310 | if ((c->arg & 255) < ICN_BCH) { | 1351 | case ISDN_CMD_ACCEPTB: |
1311 | char *p; | 1352 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1312 | char dial[50]; | 1353 | return -ENODEV; |
1313 | char dcode[4]; | 1354 | if (c->arg < ICN_BCH) { |
1314 | 1355 | a = c->arg + 1; | |
1315 | a = c->arg; | 1356 | if (card->fw_rev >= 300) |
1316 | p = c->parm.setup.phone; | 1357 | switch (card->l2_proto[a - 1]) { |
1317 | if (*p == 's' || *p == 'S') { | 1358 | case ISDN_PROTO_L2_X75I: |
1318 | /* Dial for SPV */ | 1359 | sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a); |
1319 | p++; | 1360 | break; |
1320 | strcpy(dcode, "SCA"); | 1361 | case ISDN_PROTO_L2_HDLC: |
1321 | } else | 1362 | sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a); |
1322 | /* Normal Dial */ | 1363 | break; |
1323 | strcpy(dcode, "CAL"); | 1364 | } else |
1324 | strcpy(dial, p); | 1365 | sprintf(cbuf, "%02d;BCON_R\n", (int) a); |
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 | } | ||
1345 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | 1366 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); |
1346 | } | 1367 | } |
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) | ||
1382 | break; | 1368 | break; |
1383 | if (c->arg < ICN_BCH) { | 1369 | case ISDN_CMD_HANGUP: |
1384 | a = c->arg + 1; | 1370 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1385 | if (card->ptype == ISDN_PTYPE_EURO) { | 1371 | return -ENODEV; |
1386 | sprintf(cbuf, "%02d;MS%s%s\n", (int) a, | 1372 | if (c->arg < ICN_BCH) { |
1387 | c->parm.num[0] ? "N" : "ALL", c->parm.num); | 1373 | a = c->arg + 1; |
1388 | } else | 1374 | sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a); |
1389 | sprintf(cbuf, "%02d;EAZ%s\n", (int) a, | 1375 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); |
1390 | c->parm.num[0] ? (char *)(c->parm.num) : "0123456789"); | 1376 | } |
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; | 1377 | break; |
1399 | if (c->arg < ICN_BCH) { | 1378 | case ISDN_CMD_SETEAZ: |
1400 | a = c->arg + 1; | 1379 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1401 | if (card->ptype == ISDN_PTYPE_EURO) | 1380 | return -ENODEV; |
1402 | sprintf(cbuf, "%02d;MSNC\n", (int) a); | 1381 | if (card->leased) |
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; | 1382 | break; |
1417 | case ISDN_PROTO_L2_HDLC: | 1383 | if (c->arg < ICN_BCH) { |
1418 | sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1); | 1384 | a = c->arg + 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) | ||
1419 | break; | 1398 | break; |
1420 | default: | 1399 | if (c->arg < ICN_BCH) { |
1421 | return -EINVAL; | 1400 | a = c->arg + 1; |
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); | ||
1422 | } | 1406 | } |
1423 | i = icn_writecmd(cbuf, strlen(cbuf), 0, card); | 1407 | break; |
1424 | card->l2_proto[a & 255] = (a >> 8); | 1408 | case ISDN_CMD_SETL2: |
1425 | } | 1409 | if (!(card->flags & ICN_FLAGS_RUNNING)) |
1426 | break; | 1410 | return -ENODEV; |
1427 | case ISDN_CMD_SETL3: | 1411 | if ((c->arg & 255) < ICN_BCH) { |
1428 | if (!(card->flags & ICN_FLAGS_RUNNING)) | 1412 | a = c->arg; |
1429 | return -ENODEV; | 1413 | switch (a >> 8) { |
1430 | return 0; | 1414 | case ISDN_PROTO_L2_X75I: |
1431 | default: | 1415 | sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1); |
1432 | return -EINVAL; | 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 | } | ||
1426 | break; | ||
1427 | case ISDN_CMD_SETL3: | ||
1428 | if (!(card->flags & ICN_FLAGS_RUNNING)) | ||
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 */ |
diff --git a/drivers/isdn/icn/icn.h b/drivers/isdn/icn/icn.h index b713466997a..7d7245fb0b3 100644 --- a/drivers/isdn/icn/icn.h +++ b/drivers/isdn/icn/icn.h | |||
@@ -54,7 +54,7 @@ typedef struct icn_cdef { | |||
54 | 54 | ||
55 | /* some useful macros for debugging */ | 55 | /* some useful macros for debugging */ |
56 | #ifdef ICN_DEBUG_PORT | 56 | #ifdef ICN_DEBUG_PORT |
57 | #define OUTB_P(v, p) {printk(KERN_DEBUG "icn: outb_p(0x%02x,0x%03x)\n", v, p); outb_p(v, p);} | 57 | #define OUTB_P(v,p) {printk(KERN_DEBUG "icn: outb_p(0x%02x,0x%03x)\n",v,p); outb_p(v,p);} |
58 | #else | 58 | #else |
59 | #define OUTB_P outb | 59 | #define OUTB_P outb |
60 | #endif | 60 | #endif |
@@ -71,8 +71,8 @@ typedef struct icn_cdef { | |||
71 | 71 | ||
72 | #define ICN_BOOT_TIMEOUT1 1000 /* Delay for Boot-download (msecs) */ | 72 | #define ICN_BOOT_TIMEOUT1 1000 /* Delay for Boot-download (msecs) */ |
73 | 73 | ||
74 | #define ICN_TIMER_BCREAD (HZ / 100) /* B-Channel poll-cycle */ | 74 | #define ICN_TIMER_BCREAD (HZ/100) /* B-Channel poll-cycle */ |
75 | #define ICN_TIMER_DCREAD (HZ / 2) /* D-Channel poll-cycle */ | 75 | #define ICN_TIMER_DCREAD (HZ/2) /* D-Channel poll-cycle */ |
76 | 76 | ||
77 | #define ICN_CODE_STAGE1 4096 /* Size of bootcode */ | 77 | #define ICN_CODE_STAGE1 4096 /* Size of bootcode */ |
78 | #define ICN_CODE_STAGE2 65536 /* Size of protocol-code */ | 78 | #define ICN_CODE_STAGE2 65536 /* Size of protocol-code */ |
@@ -140,7 +140,7 @@ typedef struct icn_card { | |||
140 | int myid; /* Driver-Nr. assigned by linklevel */ | 140 | int myid; /* Driver-Nr. assigned by linklevel */ |
141 | int rvalid; /* IO-portregion has been requested */ | 141 | int rvalid; /* IO-portregion has been requested */ |
142 | int leased; /* Flag: This Adapter is connected */ | 142 | int leased; /* Flag: This Adapter is connected */ |
143 | /* to a leased line */ | 143 | /* to a leased line */ |
144 | unsigned short flags; /* Statusflags */ | 144 | unsigned short flags; /* Statusflags */ |
145 | int doubleS0; /* Flag: ICN4B */ | 145 | int doubleS0; /* Flag: ICN4B */ |
146 | int secondhalf; /* Flag: Second half of a doubleS0 */ | 146 | int secondhalf; /* Flag: Second half of a doubleS0 */ |
@@ -197,16 +197,16 @@ static icn_dev dev; | |||
197 | 197 | ||
198 | /* Macros for accessing ports */ | 198 | /* Macros for accessing ports */ |
199 | #define ICN_CFG (card->port) | 199 | #define ICN_CFG (card->port) |
200 | #define ICN_MAPRAM (card->port + 1) | 200 | #define ICN_MAPRAM (card->port+1) |
201 | #define ICN_RUN (card->port + 2) | 201 | #define ICN_RUN (card->port+2) |
202 | #define ICN_BANK (card->port + 3) | 202 | #define ICN_BANK (card->port+3) |
203 | 203 | ||
204 | /* Return true, if there is a free transmit-buffer */ | 204 | /* Return true, if there is a free transmit-buffer */ |
205 | #define sbfree (((readb(&dev.shmem->data_control.scns) + 1) & 0xf) != \ | 205 | #define sbfree (((readb(&dev.shmem->data_control.scns)+1) & 0xf) != \ |
206 | readb(&dev.shmem->data_control.scnr)) | 206 | readb(&dev.shmem->data_control.scnr)) |
207 | 207 | ||
208 | /* Switch to next transmit-buffer */ | 208 | /* Switch to next transmit-buffer */ |
209 | #define sbnext (writeb((readb(&dev.shmem->data_control.scns) + 1) & 0xf, \ | 209 | #define sbnext (writeb((readb(&dev.shmem->data_control.scns)+1) & 0xf, \ |
210 | &dev.shmem->data_control.scns)) | 210 | &dev.shmem->data_control.scns)) |
211 | 211 | ||
212 | /* Shortcuts for transmit-buffer-access */ | 212 | /* Shortcuts for transmit-buffer-access */ |
@@ -220,7 +220,7 @@ static icn_dev dev; | |||
220 | readb(&dev.shmem->data_control.ecns)) | 220 | readb(&dev.shmem->data_control.ecns)) |
221 | 221 | ||
222 | /* Switch to next receive-buffer */ | 222 | /* Switch to next receive-buffer */ |
223 | #define rbnext (writeb((readb(&dev.shmem->data_control.ecnr) + 1) & 0xf, \ | 223 | #define rbnext (writeb((readb(&dev.shmem->data_control.ecnr)+1) & 0xf, \ |
224 | &dev.shmem->data_control.ecnr)) | 224 | &dev.shmem->data_control.ecnr)) |
225 | 225 | ||
226 | /* Shortcuts for receive-buffer-access */ | 226 | /* Shortcuts for receive-buffer-access */ |
@@ -234,18 +234,18 @@ static icn_dev dev; | |||
234 | #define cmd_i (dev.shmem->comm_control.pcio_i) | 234 | #define cmd_i (dev.shmem->comm_control.pcio_i) |
235 | 235 | ||
236 | /* Return free space in command-buffer */ | 236 | /* Return free space in command-buffer */ |
237 | #define cmd_free ((readb(&cmd_i) >= readb(&cmd_o)) ? \ | 237 | #define cmd_free ((readb(&cmd_i)>=readb(&cmd_o))? \ |
238 | 0x100 - readb(&cmd_i) + readb(&cmd_o) : \ | 238 | 0x100-readb(&cmd_i)+readb(&cmd_o): \ |
239 | readb(&cmd_o) - readb(&cmd_i)) | 239 | readb(&cmd_o)-readb(&cmd_i)) |
240 | 240 | ||
241 | /* Shortcuts for message-buffer-access */ | 241 | /* Shortcuts for message-buffer-access */ |
242 | #define msg_o (dev.shmem->comm_control.iopc_o) | 242 | #define msg_o (dev.shmem->comm_control.iopc_o) |
243 | #define msg_i (dev.shmem->comm_control.iopc_i) | 243 | #define msg_i (dev.shmem->comm_control.iopc_i) |
244 | 244 | ||
245 | /* Return length of Message, if avail. */ | 245 | /* Return length of Message, if avail. */ |
246 | #define msg_avail ((readb(&msg_o) > readb(&msg_i)) ? \ | 246 | #define msg_avail ((readb(&msg_o)>readb(&msg_i))? \ |
247 | 0x100 - readb(&msg_o) + readb(&msg_i) : \ | 247 | 0x100-readb(&msg_o)+readb(&msg_i): \ |
248 | readb(&msg_i) - readb(&msg_o)) | 248 | readb(&msg_i)-readb(&msg_o)) |
249 | 249 | ||
250 | #define CID (card->interface.id) | 250 | #define CID (card->interface.id) |
251 | 251 | ||