aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn/i4l/isdn_tty.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-21 00:04:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-21 00:04:47 -0400
commit3b59bf081622b6446db77ad06c93fe23677bc533 (patch)
tree3f4bb5a27c90cc86994a1f6d3c53fbf9208003cb /drivers/isdn/i4l/isdn_tty.c
parente45836fafe157df137a837093037f741ad8f4c90 (diff)
parentbbdb32cb5b73597386913d052165423b9d736145 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking merge from David Miller: "1) Move ixgbe driver over to purely page based buffering on receive. From Alexander Duyck. 2) Add receive packet steering support to e1000e, from Bruce Allan. 3) Convert TCP MD5 support over to RCU, from Eric Dumazet. 4) Reduce cpu usage in handling out-of-order TCP packets on modern systems, also from Eric Dumazet. 5) Support the IP{,V6}_UNICAST_IF socket options, making the wine folks happy, from Erich Hoover. 6) Support VLAN trunking from guests in hyperv driver, from Haiyang Zhang. 7) Support byte-queue-limtis in r8169, from Igor Maravic. 8) Outline code intended for IP_RECVTOS in IP_PKTOPTIONS existed but was never properly implemented, Jiri Benc fixed that. 9) 64-bit statistics support in r8169 and 8139too, from Junchang Wang. 10) Support kernel side dump filtering by ctmark in netfilter ctnetlink, from Pablo Neira Ayuso. 11) Support byte-queue-limits in gianfar driver, from Paul Gortmaker. 12) Add new peek socket options to assist with socket migration, from Pavel Emelyanov. 13) Add sch_plug packet scheduler whose queue is controlled by userland daemons using explicit freeze and release commands. From Shriram Rajagopalan. 14) Fix FCOE checksum offload handling on transmit, from Yi Zou." * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1846 commits) Fix pppol2tp getsockname() Remove printk from rds_sendmsg ipv6: fix incorrent ipv6 ipsec packet fragment cpsw: Hook up default ndo_change_mtu. net: qmi_wwan: fix build error due to cdc-wdm dependecy netdev: driver: ethernet: Add TI CPSW driver netdev: driver: ethernet: add cpsw address lookup engine support phy: add am79c874 PHY support mlx4_core: fix race on comm channel bonding: send igmp report for its master fs_enet: Add MPC5125 FEC support and PHY interface selection net: bpf_jit: fix BPF_S_LDX_B_MSH compilation net: update the usage of CHECKSUM_UNNECESSARY fcoe: use CHECKSUM_UNNECESSARY instead of CHECKSUM_PARTIAL on tx net: do not do gso for CHECKSUM_UNNECESSARY in netif_needs_gso ixgbe: Fix issues with SR-IOV loopback when flow control is disabled net/hyperv: Fix the code handling tx busy ixgbe: fix namespace issues when FCoE/DCB is not enabled rtlwifi: Remove unused ETH_ADDR_LEN defines igbvf: Use ETH_ALEN ... Fix up fairly trivial conflicts in drivers/isdn/gigaset/interface.c and drivers/net/usb/{Kconfig,qmi_wwan.c} as per David.
Diffstat (limited to 'drivers/isdn/i4l/isdn_tty.c')
-rw-r--r--drivers/isdn/i4l/isdn_tty.c2440
1 files changed, 1220 insertions, 1220 deletions
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c
index ac4840124bc0..3831abdbc66f 100644
--- a/drivers/isdn/i4l/isdn_tty.c
+++ b/drivers/isdn/i4l/isdn_tty.c
@@ -61,7 +61,7 @@ char *isdn_tty_revision = "$Revision: 1.1.2.3 $";
61 * isdn_tty_readmodem(). 61 * isdn_tty_readmodem().
62 */ 62 */
63static int 63static int
64isdn_tty_try_read(modem_info * info, struct sk_buff *skb) 64isdn_tty_try_read(modem_info *info, struct sk_buff *skb)
65{ 65{
66 int c; 66 int c;
67 int len; 67 int len;
@@ -93,7 +93,7 @@ isdn_tty_try_read(modem_info * info, struct sk_buff *skb)
93 last = *dp; 93 last = *dp;
94 } else { 94 } else {
95#endif 95#endif
96 if(len > 1) 96 if (len > 1)
97 tty_insert_flip_string(tty, skb->data, len - 1); 97 tty_insert_flip_string(tty, skb->data, len - 1);
98 last = skb->data[len - 1]; 98 last = skb->data[len - 1];
99#ifdef CONFIG_ISDN_AUDIO 99#ifdef CONFIG_ISDN_AUDIO
@@ -179,7 +179,7 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb)
179 info = &dev->mdm.info[midx]; 179 info = &dev->mdm.info[midx];
180#ifdef CONFIG_ISDN_AUDIO 180#ifdef CONFIG_ISDN_AUDIO
181 ifmt = 1; 181 ifmt = 1;
182 182
183 if ((info->vonline) && (!info->emu.vpar[4])) 183 if ((info->vonline) && (!info->emu.vpar[4]))
184 isdn_audio_calc_dtmf(info, skb->data, skb->len, ifmt); 184 isdn_audio_calc_dtmf(info, skb->data, skb->len, ifmt);
185 if ((info->vonline & 1) && (info->emu.vpar[1])) 185 if ((info->vonline & 1) && (info->emu.vpar[1]))
@@ -213,29 +213,29 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb)
213 if (info->vonline & 1) { 213 if (info->vonline & 1) {
214 /* voice conversion/compression */ 214 /* voice conversion/compression */
215 switch (info->emu.vpar[3]) { 215 switch (info->emu.vpar[3]) {
216 case 2: 216 case 2:
217 case 3: 217 case 3:
218 case 4: 218 case 4:
219 /* adpcm 219 /* adpcm
220 * Since compressed data takes less 220 * Since compressed data takes less
221 * space, we can overwrite the buffer. 221 * space, we can overwrite the buffer.
222 */ 222 */
223 skb_trim(skb, isdn_audio_xlaw2adpcm(info->adpcmr, 223 skb_trim(skb, isdn_audio_xlaw2adpcm(info->adpcmr,
224 ifmt, 224 ifmt,
225 skb->data, 225 skb->data,
226 skb->data, 226 skb->data,
227 skb->len)); 227 skb->len));
228 break; 228 break;
229 case 5: 229 case 5:
230 /* a-law */ 230 /* a-law */
231 if (!ifmt) 231 if (!ifmt)
232 isdn_audio_ulaw2alaw(skb->data, skb->len); 232 isdn_audio_ulaw2alaw(skb->data, skb->len);
233 break; 233 break;
234 case 6: 234 case 6:
235 /* u-law */ 235 /* u-law */
236 if (ifmt) 236 if (ifmt)
237 isdn_audio_alaw2ulaw(skb->data, skb->len); 237 isdn_audio_alaw2ulaw(skb->data, skb->len);
238 break; 238 break;
239 } 239 }
240 ISDN_AUDIO_SKB_DLECOUNT(skb) = 240 ISDN_AUDIO_SKB_DLECOUNT(skb) =
241 isdn_tty_countDLE(skb->data, skb->len); 241 isdn_tty_countDLE(skb->data, skb->len);
@@ -275,7 +275,7 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb)
275} 275}
276 276
277static void 277static void
278isdn_tty_cleanup_xmit(modem_info * info) 278isdn_tty_cleanup_xmit(modem_info *info)
279{ 279{
280 skb_queue_purge(&info->xmit_queue); 280 skb_queue_purge(&info->xmit_queue);
281#ifdef CONFIG_ISDN_AUDIO 281#ifdef CONFIG_ISDN_AUDIO
@@ -284,7 +284,7 @@ isdn_tty_cleanup_xmit(modem_info * info)
284} 284}
285 285
286static void 286static void
287isdn_tty_tint(modem_info * info) 287isdn_tty_tint(modem_info *info)
288{ 288{
289 struct sk_buff *skb = skb_dequeue(&info->xmit_queue); 289 struct sk_buff *skb = skb_dequeue(&info->xmit_queue);
290 int len, slen; 290 int len, slen;
@@ -325,7 +325,7 @@ isdn_tty_countDLE(unsigned char *buf, int len)
325 * DLE-decoding when sending audio-data. 325 * DLE-decoding when sending audio-data.
326 */ 326 */
327static int 327static int
328isdn_tty_handleDLEdown(modem_info * info, atemu * m, int len) 328isdn_tty_handleDLEdown(modem_info *info, atemu *m, int len)
329{ 329{
330 unsigned char *p = &info->xmit_buf[info->xmit_count]; 330 unsigned char *p = &info->xmit_buf[info->xmit_count];
331 int count = 0; 331 int count = 0;
@@ -334,42 +334,42 @@ isdn_tty_handleDLEdown(modem_info * info, atemu * m, int len)
334 if (m->lastDLE) { 334 if (m->lastDLE) {
335 m->lastDLE = 0; 335 m->lastDLE = 0;
336 switch (*p) { 336 switch (*p) {
337 case DLE: 337 case DLE:
338 /* Escape code */ 338 /* Escape code */
339 if (len > 1) 339 if (len > 1)
340 memmove(p, p + 1, len - 1); 340 memmove(p, p + 1, len - 1);
341 p--; 341 p--;
342 count++; 342 count++;
343 break; 343 break;
344 case ETX: 344 case ETX:
345 /* End of data */ 345 /* End of data */
346 info->vonline |= 4; 346 info->vonline |= 4;
347 return count; 347 return count;
348 case DC4: 348 case DC4:
349 /* Abort RX */ 349 /* Abort RX */
350 info->vonline &= ~1; 350 info->vonline &= ~1;
351#ifdef ISDN_DEBUG_MODEM_VOICE 351#ifdef ISDN_DEBUG_MODEM_VOICE
352 printk(KERN_DEBUG 352 printk(KERN_DEBUG
353 "DLEdown: got DLE-DC4, send DLE-ETX on ttyI%d\n", 353 "DLEdown: got DLE-DC4, send DLE-ETX on ttyI%d\n",
354 info->line); 354 info->line);
355#endif 355#endif
356 isdn_tty_at_cout("\020\003", info); 356 isdn_tty_at_cout("\020\003", info);
357 if (!info->vonline) { 357 if (!info->vonline) {
358#ifdef ISDN_DEBUG_MODEM_VOICE 358#ifdef ISDN_DEBUG_MODEM_VOICE
359 printk(KERN_DEBUG 359 printk(KERN_DEBUG
360 "DLEdown: send VCON on ttyI%d\n", 360 "DLEdown: send VCON on ttyI%d\n",
361 info->line); 361 info->line);
362#endif 362#endif
363 isdn_tty_at_cout("\r\nVCON\r\n", info); 363 isdn_tty_at_cout("\r\nVCON\r\n", info);
364 } 364 }
365 /* Fall through */ 365 /* Fall through */
366 case 'q': 366 case 'q':
367 case 's': 367 case 's':
368 /* Silence */ 368 /* Silence */
369 if (len > 1) 369 if (len > 1)
370 memmove(p, p + 1, len - 1); 370 memmove(p, p + 1, len - 1);
371 p--; 371 p--;
372 break; 372 break;
373 } 373 }
374 } else { 374 } else {
375 if (*p == DLE) 375 if (*p == DLE)
@@ -416,7 +416,7 @@ static int voice_cf[7] =
416 * T.70 if necessary, and finally queues it up for sending via isdn_tty_tint. 416 * T.70 if necessary, and finally queues it up for sending via isdn_tty_tint.
417 */ 417 */
418static void 418static void
419isdn_tty_senddown(modem_info * info) 419isdn_tty_senddown(modem_info *info)
420{ 420{
421 int buflen; 421 int buflen;
422 int skb_res; 422 int skb_res;
@@ -440,9 +440,9 @@ isdn_tty_senddown(modem_info * info)
440#endif 440#endif
441 if (!(buflen = info->xmit_count)) 441 if (!(buflen = info->xmit_count))
442 return; 442 return;
443 if ((info->emu.mdmreg[REG_CTS] & BIT_CTS) != 0) 443 if ((info->emu.mdmreg[REG_CTS] & BIT_CTS) != 0)
444 info->msr &= ~UART_MSR_CTS; 444 info->msr &= ~UART_MSR_CTS;
445 info->lsr &= ~UART_LSR_TEMT; 445 info->lsr &= ~UART_LSR_TEMT;
446 /* info->xmit_count is modified here and in isdn_tty_write(). 446 /* info->xmit_count is modified here and in isdn_tty_write().
447 * So we return here if isdn_tty_write() is in the 447 * So we return here if isdn_tty_write() is in the
448 * critical section. 448 * critical section.
@@ -485,32 +485,32 @@ isdn_tty_senddown(modem_info * info)
485 485
486 /* voice conversion/decompression */ 486 /* voice conversion/decompression */
487 switch (info->emu.vpar[3]) { 487 switch (info->emu.vpar[3]) {
488 case 2: 488 case 2:
489 case 3: 489 case 3:
490 case 4: 490 case 4:
491 /* adpcm, compatible to ZyXel 1496 modem 491 /* adpcm, compatible to ZyXel 1496 modem
492 * with ROM revision 6.01 492 * with ROM revision 6.01
493 */ 493 */
494 audio_len = isdn_audio_adpcm2xlaw(info->adpcms, 494 audio_len = isdn_audio_adpcm2xlaw(info->adpcms,
495 ifmt, 495 ifmt,
496 skb->data, 496 skb->data,
497 skb_put(skb, audio_len), 497 skb_put(skb, audio_len),
498 buflen); 498 buflen);
499 skb_pull(skb, buflen); 499 skb_pull(skb, buflen);
500 skb_trim(skb, audio_len); 500 skb_trim(skb, audio_len);
501 break; 501 break;
502 case 5: 502 case 5:
503 /* a-law */ 503 /* a-law */
504 if (!ifmt) 504 if (!ifmt)
505 isdn_audio_alaw2ulaw(skb->data, 505 isdn_audio_alaw2ulaw(skb->data,
506 buflen); 506 buflen);
507 break; 507 break;
508 case 6: 508 case 6:
509 /* u-law */ 509 /* u-law */
510 if (ifmt) 510 if (ifmt)
511 isdn_audio_ulaw2alaw(skb->data, 511 isdn_audio_ulaw2alaw(skb->data,
512 buflen); 512 buflen);
513 break; 513 break;
514 } 514 }
515 } 515 }
516#endif /* CONFIG_ISDN_AUDIO */ 516#endif /* CONFIG_ISDN_AUDIO */
@@ -550,7 +550,7 @@ isdn_tty_modem_do_ncarrier(unsigned long data)
550 * low. 550 * low.
551 */ 551 */
552static void 552static void
553isdn_tty_modem_ncarrier(modem_info * info) 553isdn_tty_modem_ncarrier(modem_info *info)
554{ 554{
555 if (info->ncarrier) { 555 if (info->ncarrier) {
556 info->nc_timer.expires = jiffies + HZ; 556 info->nc_timer.expires = jiffies + HZ;
@@ -568,30 +568,30 @@ isdn_calc_usage(int si, int l2)
568 568
569#ifdef CONFIG_ISDN_AUDIO 569#ifdef CONFIG_ISDN_AUDIO
570 if (si == 1) { 570 if (si == 1) {
571 switch(l2) { 571 switch (l2) {
572 case ISDN_PROTO_L2_MODEM: 572 case ISDN_PROTO_L2_MODEM:
573 usg = ISDN_USAGE_MODEM; 573 usg = ISDN_USAGE_MODEM;
574 break; 574 break;
575#ifdef CONFIG_ISDN_TTY_FAX 575#ifdef CONFIG_ISDN_TTY_FAX
576 case ISDN_PROTO_L2_FAX: 576 case ISDN_PROTO_L2_FAX:
577 usg = ISDN_USAGE_FAX; 577 usg = ISDN_USAGE_FAX;
578 break; 578 break;
579#endif 579#endif
580 case ISDN_PROTO_L2_TRANS: 580 case ISDN_PROTO_L2_TRANS:
581 default: 581 default:
582 usg = ISDN_USAGE_VOICE; 582 usg = ISDN_USAGE_VOICE;
583 break; 583 break;
584 } 584 }
585 } 585 }
586#endif 586#endif
587 return(usg); 587 return (usg);
588} 588}
589 589
590/* isdn_tty_dial() performs dialing of a tty an the necessary 590/* isdn_tty_dial() performs dialing of a tty an the necessary
591 * setup of the lower levels before that. 591 * setup of the lower levels before that.
592 */ 592 */
593static void 593static void
594isdn_tty_dial(char *n, modem_info * info, atemu * m) 594isdn_tty_dial(char *n, modem_info *info, atemu *m)
595{ 595{
596 int usg = ISDN_USAGE_MODEM; 596 int usg = ISDN_USAGE_MODEM;
597 int si = 7; 597 int si = 7;
@@ -608,10 +608,10 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m)
608 } 608 }
609 usg = isdn_calc_usage(si, l2); 609 usg = isdn_calc_usage(si, l2);
610#ifdef CONFIG_ISDN_AUDIO 610#ifdef CONFIG_ISDN_AUDIO
611 if ((si == 1) && 611 if ((si == 1) &&
612 (l2 != ISDN_PROTO_L2_MODEM) 612 (l2 != ISDN_PROTO_L2_MODEM)
613#ifdef CONFIG_ISDN_TTY_FAX 613#ifdef CONFIG_ISDN_TTY_FAX
614 && (l2 != ISDN_PROTO_L2_FAX) 614 && (l2 != ISDN_PROTO_L2_FAX)
615#endif 615#endif
616 ) { 616 ) {
617 l2 = ISDN_PROTO_L2_TRANS; 617 l2 = ISDN_PROTO_L2_TRANS;
@@ -679,7 +679,7 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m)
679 * and some cleanup is done also. 679 * and some cleanup is done also.
680 */ 680 */
681void 681void
682isdn_tty_modem_hup(modem_info * info, int local) 682isdn_tty_modem_hup(modem_info *info, int local)
683{ 683{
684 isdn_ctrl cmd; 684 isdn_ctrl cmd;
685 int di, ch; 685 int di, ch;
@@ -723,7 +723,7 @@ isdn_tty_modem_hup(modem_info * info, int local)
723 info->adpcmr = NULL; 723 info->adpcmr = NULL;
724#endif 724#endif
725 if ((info->msr & UART_MSR_RI) && 725 if ((info->msr & UART_MSR_RI) &&
726 (info->emu.mdmreg[REG_RUNG] & BIT_RUNG)) 726 (info->emu.mdmreg[REG_RUNG] & BIT_RUNG))
727 isdn_tty_modem_result(RESULT_RUNG, info); 727 isdn_tty_modem_result(RESULT_RUNG, info);
728 info->msr &= ~(UART_MSR_DCD | UART_MSR_RI); 728 info->msr &= ~(UART_MSR_DCD | UART_MSR_RI);
729 info->lsr |= UART_LSR_TEMT; 729 info->lsr |= UART_LSR_TEMT;
@@ -746,7 +746,7 @@ isdn_tty_modem_hup(modem_info * info, int local)
746} 746}
747 747
748/* 748/*
749 * Begin of a CAPI like interface, currently used only for 749 * Begin of a CAPI like interface, currently used only for
750 * supplementary service (CAPI 2.0 part III) 750 * supplementary service (CAPI 2.0 part III)
751 */ 751 */
752#include <linux/isdn/capicmd.h> 752#include <linux/isdn/capicmd.h>
@@ -754,16 +754,16 @@ isdn_tty_modem_hup(modem_info * info, int local)
754 754
755int 755int
756isdn_tty_capi_facility(capi_msg *cm) { 756isdn_tty_capi_facility(capi_msg *cm) {
757 return(-1); /* dummy */ 757 return (-1); /* dummy */
758} 758}
759 759
760/* isdn_tty_suspend() tries to suspend the current tty connection 760/* isdn_tty_suspend() tries to suspend the current tty connection
761 */ 761 */
762static void 762static void
763isdn_tty_suspend(char *id, modem_info * info, atemu * m) 763isdn_tty_suspend(char *id, modem_info *info, atemu *m)
764{ 764{
765 isdn_ctrl cmd; 765 isdn_ctrl cmd;
766 766
767 int l; 767 int l;
768 768
769 if (!info) 769 if (!info)
@@ -774,7 +774,7 @@ isdn_tty_suspend(char *id, modem_info * info, atemu * m)
774#endif 774#endif
775 l = strlen(id); 775 l = strlen(id);
776 if ((info->isdn_driver >= 0)) { 776 if ((info->isdn_driver >= 0)) {
777 cmd.parm.cmsg.Length = l+18; 777 cmd.parm.cmsg.Length = l + 18;
778 cmd.parm.cmsg.Command = CAPI_FACILITY; 778 cmd.parm.cmsg.Command = CAPI_FACILITY;
779 cmd.parm.cmsg.Subcommand = CAPI_REQ; 779 cmd.parm.cmsg.Subcommand = CAPI_REQ;
780 cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1; 780 cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1;
@@ -800,7 +800,7 @@ isdn_tty_suspend(char *id, modem_info * info, atemu * m)
800 */ 800 */
801 801
802static void 802static void
803isdn_tty_resume(char *id, modem_info * info, atemu * m) 803isdn_tty_resume(char *id, modem_info *info, atemu *m)
804{ 804{
805 int usg = ISDN_USAGE_MODEM; 805 int usg = ISDN_USAGE_MODEM;
806 int si = 7; 806 int si = 7;
@@ -819,10 +819,10 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m)
819 } 819 }
820 usg = isdn_calc_usage(si, l2); 820 usg = isdn_calc_usage(si, l2);
821#ifdef CONFIG_ISDN_AUDIO 821#ifdef CONFIG_ISDN_AUDIO
822 if ((si == 1) && 822 if ((si == 1) &&
823 (l2 != ISDN_PROTO_L2_MODEM) 823 (l2 != ISDN_PROTO_L2_MODEM)
824#ifdef CONFIG_ISDN_TTY_FAX 824#ifdef CONFIG_ISDN_TTY_FAX
825 && (l2 != ISDN_PROTO_L2_FAX) 825 && (l2 != ISDN_PROTO_L2_FAX)
826#endif 826#endif
827 ) { 827 ) {
828 l2 = ISDN_PROTO_L2_TRANS; 828 l2 = ISDN_PROTO_L2_TRANS;
@@ -864,18 +864,18 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m)
864 isdn_command(&cmd); 864 isdn_command(&cmd);
865 cmd.driver = info->isdn_driver; 865 cmd.driver = info->isdn_driver;
866 cmd.arg = info->isdn_channel; 866 cmd.arg = info->isdn_channel;
867 cmd.parm.cmsg.Length = l+18; 867 cmd.parm.cmsg.Length = l + 18;
868 cmd.parm.cmsg.Command = CAPI_FACILITY; 868 cmd.parm.cmsg.Command = CAPI_FACILITY;
869 cmd.parm.cmsg.Subcommand = CAPI_REQ; 869 cmd.parm.cmsg.Subcommand = CAPI_REQ;
870 cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1; 870 cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1;
871 cmd.parm.cmsg.para[0] = 3; /* 16 bit 0x0003 suplementary service */ 871 cmd.parm.cmsg.para[0] = 3; /* 16 bit 0x0003 suplementary service */
872 cmd.parm.cmsg.para[1] = 0; 872 cmd.parm.cmsg.para[1] = 0;
873 cmd.parm.cmsg.para[2] = l+3; 873 cmd.parm.cmsg.para[2] = l + 3;
874 cmd.parm.cmsg.para[3] = 5; /* 16 bit 0x0005 Resume */ 874 cmd.parm.cmsg.para[3] = 5; /* 16 bit 0x0005 Resume */
875 cmd.parm.cmsg.para[4] = 0; 875 cmd.parm.cmsg.para[4] = 0;
876 cmd.parm.cmsg.para[5] = l; 876 cmd.parm.cmsg.para[5] = l;
877 strncpy(&cmd.parm.cmsg.para[6], id, l); 877 strncpy(&cmd.parm.cmsg.para[6], id, l);
878 cmd.command =CAPI_PUT_MESSAGE; 878 cmd.command = CAPI_PUT_MESSAGE;
879 info->dialing = 1; 879 info->dialing = 1;
880// strcpy(dev->num[i], n); 880// strcpy(dev->num[i], n);
881 isdn_info_update(); 881 isdn_info_update();
@@ -889,7 +889,7 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m)
889 */ 889 */
890 890
891static void 891static void
892isdn_tty_send_msg(modem_info * info, atemu * m, char *msg) 892isdn_tty_send_msg(modem_info *info, atemu *m, char *msg)
893{ 893{
894 int usg = ISDN_USAGE_MODEM; 894 int usg = ISDN_USAGE_MODEM;
895 int si = 7; 895 int si = 7;
@@ -912,10 +912,10 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg)
912 } 912 }
913 usg = isdn_calc_usage(si, l2); 913 usg = isdn_calc_usage(si, l2);
914#ifdef CONFIG_ISDN_AUDIO 914#ifdef CONFIG_ISDN_AUDIO
915 if ((si == 1) && 915 if ((si == 1) &&
916 (l2 != ISDN_PROTO_L2_MODEM) 916 (l2 != ISDN_PROTO_L2_MODEM)
917#ifdef CONFIG_ISDN_TTY_FAX 917#ifdef CONFIG_ISDN_TTY_FAX
918 && (l2 != ISDN_PROTO_L2_FAX) 918 && (l2 != ISDN_PROTO_L2_FAX)
919#endif 919#endif
920 ) { 920 ) {
921 l2 = ISDN_PROTO_L2_TRANS; 921 l2 = ISDN_PROTO_L2_TRANS;
@@ -956,14 +956,14 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg)
956 isdn_command(&cmd); 956 isdn_command(&cmd);
957 cmd.driver = info->isdn_driver; 957 cmd.driver = info->isdn_driver;
958 cmd.arg = info->isdn_channel; 958 cmd.arg = info->isdn_channel;
959 cmd.parm.cmsg.Length = l+14; 959 cmd.parm.cmsg.Length = l + 14;
960 cmd.parm.cmsg.Command = CAPI_MANUFACTURER; 960 cmd.parm.cmsg.Command = CAPI_MANUFACTURER;
961 cmd.parm.cmsg.Subcommand = CAPI_REQ; 961 cmd.parm.cmsg.Subcommand = CAPI_REQ;
962 cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1; 962 cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1;
963 cmd.parm.cmsg.para[0] = l+1; 963 cmd.parm.cmsg.para[0] = l + 1;
964 strncpy(&cmd.parm.cmsg.para[1], msg, l); 964 strncpy(&cmd.parm.cmsg.para[1], msg, l);
965 cmd.parm.cmsg.para[l+1] = 0xd; 965 cmd.parm.cmsg.para[l + 1] = 0xd;
966 cmd.command =CAPI_PUT_MESSAGE; 966 cmd.command = CAPI_PUT_MESSAGE;
967/* info->dialing = 1; 967/* info->dialing = 1;
968 strcpy(dev->num[i], n); 968 strcpy(dev->num[i], n);
969 isdn_info_update(); 969 isdn_info_update();
@@ -978,7 +978,7 @@ isdn_tty_paranoia_check(modem_info *info, char *name, const char *routine)
978#ifdef MODEM_PARANOIA_CHECK 978#ifdef MODEM_PARANOIA_CHECK
979 if (!info) { 979 if (!info) {
980 printk(KERN_WARNING "isdn_tty: null info_struct for %s in %s\n", 980 printk(KERN_WARNING "isdn_tty: null info_struct for %s in %s\n",
981 name, routine); 981 name, routine);
982 return 1; 982 return 1;
983 } 983 }
984 if (info->magic != ISDN_ASYNC_MAGIC) { 984 if (info->magic != ISDN_ASYNC_MAGIC) {
@@ -995,11 +995,11 @@ isdn_tty_paranoia_check(modem_info *info, char *name, const char *routine)
995 * the specified baud rate for a serial port. 995 * the specified baud rate for a serial port.
996 */ 996 */
997static void 997static void
998isdn_tty_change_speed(modem_info * info) 998isdn_tty_change_speed(modem_info *info)
999{ 999{
1000 uint cflag, 1000 uint cflag,
1001 cval, 1001 cval,
1002 quot; 1002 quot;
1003 int i; 1003 int i;
1004 1004
1005 if (!info->tty || !info->tty->termios) 1005 if (!info->tty || !info->tty->termios)
@@ -1051,7 +1051,7 @@ isdn_tty_change_speed(modem_info * info)
1051} 1051}
1052 1052
1053static int 1053static int
1054isdn_tty_startup(modem_info * info) 1054isdn_tty_startup(modem_info *info)
1055{ 1055{
1056 if (info->flags & ISDN_ASYNC_INITIALIZED) 1056 if (info->flags & ISDN_ASYNC_INITIALIZED)
1057 return 0; 1057 return 0;
@@ -1081,7 +1081,7 @@ isdn_tty_startup(modem_info * info)
1081 * DTR is dropped if the hangup on close termio flag is on. 1081 * DTR is dropped if the hangup on close termio flag is on.
1082 */ 1082 */
1083static void 1083static void
1084isdn_tty_shutdown(modem_info * info) 1084isdn_tty_shutdown(modem_info *info)
1085{ 1085{
1086 if (!(info->flags & ISDN_ASYNC_INITIALIZED)) 1086 if (!(info->flags & ISDN_ASYNC_INITIALIZED))
1087 return; 1087 return;
@@ -1116,7 +1116,7 @@ isdn_tty_shutdown(modem_info * info)
1116 * - If dialing, abort dial. 1116 * - If dialing, abort dial.
1117 */ 1117 */
1118static int 1118static int
1119isdn_tty_write(struct tty_struct *tty, const u_char * buf, int count) 1119isdn_tty_write(struct tty_struct *tty, const u_char *buf, int count)
1120{ 1120{
1121 int c; 1121 int c;
1122 int total = 0; 1122 int total = 0;
@@ -1176,27 +1176,27 @@ isdn_tty_write(struct tty_struct *tty, const u_char * buf, int count)
1176 } 1176 }
1177 } 1177 }
1178 } else 1178 } else
1179 if (TTY_IS_FCLASS1(info)) { 1179 if (TTY_IS_FCLASS1(info)) {
1180 int cc = isdn_tty_handleDLEdown(info, m, c); 1180 int cc = isdn_tty_handleDLEdown(info, m, c);
1181 1181
1182 if (info->vonline & 4) { /* ETX seen */ 1182 if (info->vonline & 4) { /* ETX seen */
1183 isdn_ctrl c; 1183 isdn_ctrl c;
1184 1184
1185 c.command = ISDN_CMD_FAXCMD; 1185 c.command = ISDN_CMD_FAXCMD;
1186 c.driver = info->isdn_driver; 1186 c.driver = info->isdn_driver;
1187 c.arg = info->isdn_channel; 1187 c.arg = info->isdn_channel;
1188 c.parm.aux.cmd = ISDN_FAX_CLASS1_CTRL; 1188 c.parm.aux.cmd = ISDN_FAX_CLASS1_CTRL;
1189 c.parm.aux.subcmd = ETX; 1189 c.parm.aux.subcmd = ETX;
1190 isdn_command(&c); 1190 isdn_command(&c);
1191 } 1191 }
1192 info->vonline = 0; 1192 info->vonline = 0;
1193#ifdef ISDN_DEBUG_MODEM_VOICE 1193#ifdef ISDN_DEBUG_MODEM_VOICE
1194 printk(KERN_DEBUG "fax dle cc/c %d/%d\n", cc, c); 1194 printk(KERN_DEBUG "fax dle cc/c %d/%d\n", cc, c);
1195#endif 1195#endif
1196 info->xmit_count += cc; 1196 info->xmit_count += cc;
1197 } else 1197 } else
1198#endif 1198#endif
1199 info->xmit_count += c; 1199 info->xmit_count += c;
1200 } else { 1200 } else {
1201 info->msr |= UART_MSR_CTS; 1201 info->msr |= UART_MSR_CTS;
1202 info->lsr |= UART_LSR_TEMT; 1202 info->lsr |= UART_LSR_TEMT;
@@ -1332,7 +1332,7 @@ isdn_tty_unthrottle(struct tty_struct *tty)
1332 * allows RS485 driver to be written in user space. 1332 * allows RS485 driver to be written in user space.
1333 */ 1333 */
1334static int 1334static int
1335isdn_tty_get_lsr_info(modem_info * info, uint __user * value) 1335isdn_tty_get_lsr_info(modem_info *info, uint __user *value)
1336{ 1336{
1337 u_char status; 1337 u_char status;
1338 uint result; 1338 uint result;
@@ -1363,16 +1363,16 @@ isdn_tty_tiocmget(struct tty_struct *tty)
1363 status = info->msr; 1363 status = info->msr;
1364 mutex_unlock(&modem_info_mutex); 1364 mutex_unlock(&modem_info_mutex);
1365 return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) 1365 return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
1366 | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) 1366 | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
1367 | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) 1367 | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0)
1368 | ((status & UART_MSR_RI) ? TIOCM_RNG : 0) 1368 | ((status & UART_MSR_RI) ? TIOCM_RNG : 0)
1369 | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0) 1369 | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0)
1370 | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0); 1370 | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
1371} 1371}
1372 1372
1373static int 1373static int
1374isdn_tty_tiocmset(struct tty_struct *tty, 1374isdn_tty_tiocmset(struct tty_struct *tty,
1375 unsigned int set, unsigned int clear) 1375 unsigned int set, unsigned int clear)
1376{ 1376{
1377 modem_info *info = (modem_info *) tty->driver_data; 1377 modem_info *info = (modem_info *) tty->driver_data;
1378 1378
@@ -1422,34 +1422,34 @@ isdn_tty_ioctl(struct tty_struct *tty, uint cmd, ulong arg)
1422 if (tty->flags & (1 << TTY_IO_ERROR)) 1422 if (tty->flags & (1 << TTY_IO_ERROR))
1423 return -EIO; 1423 return -EIO;
1424 switch (cmd) { 1424 switch (cmd) {
1425 case TCSBRK: /* SVID version: non-zero arg --> no break */ 1425 case TCSBRK: /* SVID version: non-zero arg --> no break */
1426#ifdef ISDN_DEBUG_MODEM_IOCTL 1426#ifdef ISDN_DEBUG_MODEM_IOCTL
1427 printk(KERN_DEBUG "ttyI%d ioctl TCSBRK\n", info->line); 1427 printk(KERN_DEBUG "ttyI%d ioctl TCSBRK\n", info->line);
1428#endif 1428#endif
1429 retval = tty_check_change(tty); 1429 retval = tty_check_change(tty);
1430 if (retval) 1430 if (retval)
1431 return retval; 1431 return retval;
1432 tty_wait_until_sent(tty, 0); 1432 tty_wait_until_sent(tty, 0);
1433 return 0; 1433 return 0;
1434 case TCSBRKP: /* support for POSIX tcsendbreak() */ 1434 case TCSBRKP: /* support for POSIX tcsendbreak() */
1435#ifdef ISDN_DEBUG_MODEM_IOCTL 1435#ifdef ISDN_DEBUG_MODEM_IOCTL
1436 printk(KERN_DEBUG "ttyI%d ioctl TCSBRKP\n", info->line); 1436 printk(KERN_DEBUG "ttyI%d ioctl TCSBRKP\n", info->line);
1437#endif 1437#endif
1438 retval = tty_check_change(tty); 1438 retval = tty_check_change(tty);
1439 if (retval) 1439 if (retval)
1440 return retval; 1440 return retval;
1441 tty_wait_until_sent(tty, 0); 1441 tty_wait_until_sent(tty, 0);
1442 return 0; 1442 return 0;
1443 case TIOCSERGETLSR: /* Get line status register */ 1443 case TIOCSERGETLSR: /* Get line status register */
1444#ifdef ISDN_DEBUG_MODEM_IOCTL 1444#ifdef ISDN_DEBUG_MODEM_IOCTL
1445 printk(KERN_DEBUG "ttyI%d ioctl TIOCSERGETLSR\n", info->line); 1445 printk(KERN_DEBUG "ttyI%d ioctl TIOCSERGETLSR\n", info->line);
1446#endif 1446#endif
1447 return isdn_tty_get_lsr_info(info, (uint __user *) arg); 1447 return isdn_tty_get_lsr_info(info, (uint __user *) arg);
1448 default: 1448 default:
1449#ifdef ISDN_DEBUG_MODEM_IOCTL 1449#ifdef ISDN_DEBUG_MODEM_IOCTL
1450 printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on ttyi%d\n", cmd, info->line); 1450 printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on ttyi%d\n", cmd, info->line);
1451#endif 1451#endif
1452 return -ENOIOCTLCMD; 1452 return -ENOIOCTLCMD;
1453 } 1453 }
1454 return 0; 1454 return 0;
1455} 1455}
@@ -1479,7 +1479,7 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1479 * ------------------------------------------------------------ 1479 * ------------------------------------------------------------
1480 */ 1480 */
1481static int 1481static int
1482isdn_tty_block_til_ready(struct tty_struct *tty, struct file *filp, modem_info * info) 1482isdn_tty_block_til_ready(struct tty_struct *tty, struct file *filp, modem_info *info)
1483{ 1483{
1484 DECLARE_WAITQUEUE(wait, NULL); 1484 DECLARE_WAITQUEUE(wait, NULL);
1485 int do_clocal = 0; 1485 int do_clocal = 0;
@@ -1600,7 +1600,7 @@ isdn_tty_open(struct tty_struct *tty, struct file *filp)
1600 return -ENODEV; 1600 return -ENODEV;
1601 } 1601 }
1602#ifdef ISDN_DEBUG_MODEM_OPEN 1602#ifdef ISDN_DEBUG_MODEM_OPEN
1603 printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name, 1603 printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name,
1604 info->count); 1604 info->count);
1605#endif 1605#endif
1606 info->count++; 1606 info->count++;
@@ -1700,7 +1700,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp)
1700 timeout = jiffies + HZ; 1700 timeout = jiffies + HZ;
1701 while (!(info->lsr & UART_LSR_TEMT)) { 1701 while (!(info->lsr & UART_LSR_TEMT)) {
1702 schedule_timeout_interruptible(20); 1702 schedule_timeout_interruptible(20);
1703 if (time_after(jiffies,timeout)) 1703 if (time_after(jiffies, timeout))
1704 break; 1704 break;
1705 } 1705 }
1706 } 1706 }
@@ -1743,7 +1743,7 @@ isdn_tty_hangup(struct tty_struct *tty)
1743/* This routine initializes all emulator-data. 1743/* This routine initializes all emulator-data.
1744 */ 1744 */
1745static void 1745static void
1746isdn_tty_reset_profile(atemu * m) 1746isdn_tty_reset_profile(atemu *m)
1747{ 1747{
1748 m->profile[0] = 0; 1748 m->profile[0] = 0;
1749 m->profile[1] = 0; 1749 m->profile[1] = 0;
@@ -1773,7 +1773,7 @@ isdn_tty_reset_profile(atemu * m)
1773 1773
1774#ifdef CONFIG_ISDN_AUDIO 1774#ifdef CONFIG_ISDN_AUDIO
1775static void 1775static void
1776isdn_tty_modem_reset_vpar(atemu * m) 1776isdn_tty_modem_reset_vpar(atemu *m)
1777{ 1777{
1778 m->vpar[0] = 2; /* Voice-device (2 = phone line) */ 1778 m->vpar[0] = 2; /* Voice-device (2 = phone line) */
1779 m->vpar[1] = 0; /* Silence detection level (0 = none ) */ 1779 m->vpar[1] = 0; /* Silence detection level (0 = none ) */
@@ -1786,7 +1786,7 @@ isdn_tty_modem_reset_vpar(atemu * m)
1786 1786
1787#ifdef CONFIG_ISDN_TTY_FAX 1787#ifdef CONFIG_ISDN_TTY_FAX
1788static void 1788static void
1789isdn_tty_modem_reset_faxpar(modem_info * info) 1789isdn_tty_modem_reset_faxpar(modem_info *info)
1790{ 1790{
1791 T30_s *f = info->fax; 1791 T30_s *f = info->fax;
1792 1792
@@ -1819,7 +1819,7 @@ isdn_tty_modem_reset_faxpar(modem_info * info)
1819#endif 1819#endif
1820 1820
1821static void 1821static void
1822isdn_tty_modem_reset_regs(modem_info * info, int force) 1822isdn_tty_modem_reset_regs(modem_info *info, int force)
1823{ 1823{
1824 atemu *m = &info->emu; 1824 atemu *m = &info->emu;
1825 if ((m->mdmreg[REG_DTRR] & BIT_DTRR) || force) { 1825 if ((m->mdmreg[REG_DTRR] & BIT_DTRR) || force) {
@@ -1838,7 +1838,7 @@ isdn_tty_modem_reset_regs(modem_info * info, int force)
1838} 1838}
1839 1839
1840static void 1840static void
1841modem_write_profile(atemu * m) 1841modem_write_profile(atemu *m)
1842{ 1842{
1843 memcpy(m->profile, m->mdmreg, ISDN_MODEM_NUMREG); 1843 memcpy(m->profile, m->mdmreg, ISDN_MODEM_NUMREG);
1844 memcpy(m->pmsn, m->msn, ISDN_MSNLEN); 1844 memcpy(m->pmsn, m->msn, ISDN_MSNLEN);
@@ -1848,7 +1848,7 @@ modem_write_profile(atemu * m)
1848} 1848}
1849 1849
1850static const struct tty_operations modem_ops = { 1850static const struct tty_operations modem_ops = {
1851 .open = isdn_tty_open, 1851 .open = isdn_tty_open,
1852 .close = isdn_tty_close, 1852 .close = isdn_tty_close,
1853 .write = isdn_tty_write, 1853 .write = isdn_tty_write,
1854 .flush_chars = isdn_tty_flush_chars, 1854 .flush_chars = isdn_tty_flush_chars,
@@ -1948,7 +1948,7 @@ err_unregister:
1948 kfree(info->xmit_buf - 4); 1948 kfree(info->xmit_buf - 4);
1949 } 1949 }
1950 tty_unregister_driver(m->tty_modem); 1950 tty_unregister_driver(m->tty_modem);
1951 err: 1951err:
1952 put_tty_driver(m->tty_modem); 1952 put_tty_driver(m->tty_modem);
1953 m->tty_modem = NULL; 1953 m->tty_modem = NULL;
1954 return retval; 1954 return retval;
@@ -2018,8 +2018,8 @@ isdn_tty_match_icall(char *cid, atemu *emu, int di)
2018 int tmp; 2018 int tmp;
2019 tmp = isdn_msncmp(cid, isdn_map_eaz2msn(emu->msn, di)); 2019 tmp = isdn_msncmp(cid, isdn_map_eaz2msn(emu->msn, di));
2020#ifdef ISDN_DEBUG_MODEM_ICALL 2020#ifdef ISDN_DEBUG_MODEM_ICALL
2021 printk(KERN_DEBUG "m_fi: mmsn=%s -> tmp=%d\n", 2021 printk(KERN_DEBUG "m_fi: mmsn=%s -> tmp=%d\n",
2022 isdn_map_eaz2msn(emu->msn, di), tmp); 2022 isdn_map_eaz2msn(emu->msn, di), tmp);
2023#endif 2023#endif
2024 return tmp; 2024 return tmp;
2025 } 2025 }
@@ -2068,8 +2068,8 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup)
2068 for (i = 0; i < ISDN_MAX_CHANNELS; i++) { 2068 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
2069 modem_info *info = &dev->mdm.info[i]; 2069 modem_info *info = &dev->mdm.info[i];
2070 2070
2071 if (info->count == 0) 2071 if (info->count == 0)
2072 continue; 2072 continue;
2073 if ((info->emu.mdmreg[REG_SI1] & si2bit[si1]) && /* SI1 is matching */ 2073 if ((info->emu.mdmreg[REG_SI1] & si2bit[si1]) && /* SI1 is matching */
2074 (info->emu.mdmreg[REG_SI2] == si2)) { /* SI2 is matching */ 2074 (info->emu.mdmreg[REG_SI2] == si2)) { /* SI2 is matching */
2075 idx = isdn_dc2minor(di, ch); 2075 idx = isdn_dc2minor(di, ch);
@@ -2096,7 +2096,7 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup)
2096 info->drv_index = idx; 2096 info->drv_index = idx;
2097 dev->m_idx[idx] = info->line; 2097 dev->m_idx[idx] = info->line;
2098 dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE; 2098 dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
2099 dev->usage[idx] |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]); 2099 dev->usage[idx] |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]);
2100 strcpy(dev->num[idx], nr); 2100 strcpy(dev->num[idx], nr);
2101 strcpy(info->emu.cpn, eaz); 2101 strcpy(info->emu.cpn, eaz);
2102 info->emu.mdmreg[REG_SI1I] = si2bit[si1]; 2102 info->emu.mdmreg[REG_SI1I] = si2bit[si1];
@@ -2116,11 +2116,11 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup)
2116 } 2116 }
2117 spin_unlock_irqrestore(&dev->lock, flags); 2117 spin_unlock_irqrestore(&dev->lock, flags);
2118 printk(KERN_INFO "isdn_tty: call from %s -> %s %s\n", nr, eaz, 2118 printk(KERN_INFO "isdn_tty: call from %s -> %s %s\n", nr, eaz,
2119 ((dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2))? "rejected" : "ignored"); 2119 ((dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2)) ? "rejected" : "ignored");
2120 return (wret == 2)?3:0; 2120 return (wret == 2) ? 3 : 0;
2121} 2121}
2122 2122
2123#define TTY_IS_ACTIVE(info) \ 2123#define TTY_IS_ACTIVE(info) \
2124 (info->flags & (ISDN_ASYNC_NORMAL_ACTIVE | ISDN_ASYNC_CALLOUT_ACTIVE)) 2124 (info->flags & (ISDN_ASYNC_NORMAL_ACTIVE | ISDN_ASYNC_CALLOUT_ACTIVE))
2125 2125
2126int 2126int
@@ -2135,174 +2135,174 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c)
2135 if ((mi = dev->m_idx[i]) >= 0) { 2135 if ((mi = dev->m_idx[i]) >= 0) {
2136 info = &dev->mdm.info[mi]; 2136 info = &dev->mdm.info[mi];
2137 switch (c->command) { 2137 switch (c->command) {
2138 case ISDN_STAT_CINF: 2138 case ISDN_STAT_CINF:
2139 printk(KERN_DEBUG "CHARGEINFO on ttyI%d: %ld %s\n", info->line, c->arg, c->parm.num); 2139 printk(KERN_DEBUG "CHARGEINFO on ttyI%d: %ld %s\n", info->line, c->arg, c->parm.num);
2140 info->emu.charge = (unsigned) simple_strtoul(c->parm.num, &e, 10); 2140 info->emu.charge = (unsigned) simple_strtoul(c->parm.num, &e, 10);
2141 if (e == (char *)c->parm.num) 2141 if (e == (char *)c->parm.num)
2142 info->emu.charge = 0; 2142 info->emu.charge = 0;
2143 2143
2144 break; 2144 break;
2145 case ISDN_STAT_BSENT: 2145 case ISDN_STAT_BSENT:
2146#ifdef ISDN_TTY_STAT_DEBUG
2147 printk(KERN_DEBUG "tty_STAT_BSENT ttyI%d\n", info->line);
2148#endif
2149 if ((info->isdn_driver == c->driver) &&
2150 (info->isdn_channel == c->arg)) {
2151 info->msr |= UART_MSR_CTS;
2152 if (info->send_outstanding)
2153 if (!(--info->send_outstanding))
2154 info->lsr |= UART_LSR_TEMT;
2155 isdn_tty_tint(info);
2156 return 1;
2157 }
2158 break;
2159 case ISDN_STAT_CAUSE:
2160#ifdef ISDN_TTY_STAT_DEBUG 2146#ifdef ISDN_TTY_STAT_DEBUG
2161 printk(KERN_DEBUG "tty_STAT_CAUSE ttyI%d\n", info->line); 2147 printk(KERN_DEBUG "tty_STAT_BSENT ttyI%d\n", info->line);
2162#endif 2148#endif
2163 /* Signal cause to tty-device */ 2149 if ((info->isdn_driver == c->driver) &&
2164 strncpy(info->last_cause, c->parm.num, 5); 2150 (info->isdn_channel == c->arg)) {
2151 info->msr |= UART_MSR_CTS;
2152 if (info->send_outstanding)
2153 if (!(--info->send_outstanding))
2154 info->lsr |= UART_LSR_TEMT;
2155 isdn_tty_tint(info);
2165 return 1; 2156 return 1;
2166 case ISDN_STAT_DISPLAY: 2157 }
2158 break;
2159 case ISDN_STAT_CAUSE:
2167#ifdef ISDN_TTY_STAT_DEBUG 2160#ifdef ISDN_TTY_STAT_DEBUG
2168 printk(KERN_DEBUG "tty_STAT_DISPLAY ttyI%d\n", info->line); 2161 printk(KERN_DEBUG "tty_STAT_CAUSE ttyI%d\n", info->line);
2169#endif 2162#endif
2170 /* Signal display to tty-device */ 2163 /* Signal cause to tty-device */
2171 if ((info->emu.mdmreg[REG_DISPLAY] & BIT_DISPLAY) && 2164 strncpy(info->last_cause, c->parm.num, 5);
2172 !(info->emu.mdmreg[REG_RESPNUM] & BIT_RESPNUM)) { 2165 return 1;
2173 isdn_tty_at_cout("\r\n", info); 2166 case ISDN_STAT_DISPLAY:
2174 isdn_tty_at_cout("DISPLAY: ", info);
2175 isdn_tty_at_cout(c->parm.display, info);
2176 isdn_tty_at_cout("\r\n", info);
2177 }
2178 return 1;
2179 case ISDN_STAT_DCONN:
2180#ifdef ISDN_TTY_STAT_DEBUG 2167#ifdef ISDN_TTY_STAT_DEBUG
2181 printk(KERN_DEBUG "tty_STAT_DCONN ttyI%d\n", info->line); 2168 printk(KERN_DEBUG "tty_STAT_DISPLAY ttyI%d\n", info->line);
2182#endif 2169#endif
2183 if (TTY_IS_ACTIVE(info)) { 2170 /* Signal display to tty-device */
2184 if (info->dialing == 1) { 2171 if ((info->emu.mdmreg[REG_DISPLAY] & BIT_DISPLAY) &&
2185 info->dialing = 2; 2172 !(info->emu.mdmreg[REG_RESPNUM] & BIT_RESPNUM)) {
2186 return 1; 2173 isdn_tty_at_cout("\r\n", info);
2187 } 2174 isdn_tty_at_cout("DISPLAY: ", info);
2175 isdn_tty_at_cout(c->parm.display, info);
2176 isdn_tty_at_cout("\r\n", info);
2177 }
2178 return 1;
2179 case ISDN_STAT_DCONN:
2180#ifdef ISDN_TTY_STAT_DEBUG
2181 printk(KERN_DEBUG "tty_STAT_DCONN ttyI%d\n", info->line);
2182#endif
2183 if (TTY_IS_ACTIVE(info)) {
2184 if (info->dialing == 1) {
2185 info->dialing = 2;
2186 return 1;
2188 } 2187 }
2189 break; 2188 }
2190 case ISDN_STAT_DHUP: 2189 break;
2190 case ISDN_STAT_DHUP:
2191#ifdef ISDN_TTY_STAT_DEBUG 2191#ifdef ISDN_TTY_STAT_DEBUG
2192 printk(KERN_DEBUG "tty_STAT_DHUP ttyI%d\n", info->line); 2192 printk(KERN_DEBUG "tty_STAT_DHUP ttyI%d\n", info->line);
2193#endif 2193#endif
2194 if (TTY_IS_ACTIVE(info)) { 2194 if (TTY_IS_ACTIVE(info)) {
2195 if (info->dialing == 1) 2195 if (info->dialing == 1)
2196 isdn_tty_modem_result(RESULT_BUSY, info); 2196 isdn_tty_modem_result(RESULT_BUSY, info);
2197 if (info->dialing > 1) 2197 if (info->dialing > 1)
2198 isdn_tty_modem_result(RESULT_NO_CARRIER, info); 2198 isdn_tty_modem_result(RESULT_NO_CARRIER, info);
2199 info->dialing = 0; 2199 info->dialing = 0;
2200#ifdef ISDN_DEBUG_MODEM_HUP 2200#ifdef ISDN_DEBUG_MODEM_HUP
2201 printk(KERN_DEBUG "Mhup in ISDN_STAT_DHUP\n"); 2201 printk(KERN_DEBUG "Mhup in ISDN_STAT_DHUP\n");
2202#endif 2202#endif
2203 isdn_tty_modem_hup(info, 0); 2203 isdn_tty_modem_hup(info, 0);
2204 return 1; 2204 return 1;
2205 } 2205 }
2206 break; 2206 break;
2207 case ISDN_STAT_BCONN: 2207 case ISDN_STAT_BCONN:
2208#ifdef ISDN_TTY_STAT_DEBUG 2208#ifdef ISDN_TTY_STAT_DEBUG
2209 printk(KERN_DEBUG "tty_STAT_BCONN ttyI%d\n", info->line); 2209 printk(KERN_DEBUG "tty_STAT_BCONN ttyI%d\n", info->line);
2210#endif 2210#endif
2211 /* Wake up any processes waiting 2211 /* Wake up any processes waiting
2212 * for incoming call of this device when 2212 * for incoming call of this device when
2213 * DCD follow the state of incoming carrier 2213 * DCD follow the state of incoming carrier
2214 */ 2214 */
2215 if (info->blocked_open && 2215 if (info->blocked_open &&
2216 (info->emu.mdmreg[REG_DCD] & BIT_DCD)) { 2216 (info->emu.mdmreg[REG_DCD] & BIT_DCD)) {
2217 wake_up_interruptible(&info->open_wait); 2217 wake_up_interruptible(&info->open_wait);
2218 } 2218 }
2219 2219
2220 /* Schedule CONNECT-Message to any tty 2220 /* Schedule CONNECT-Message to any tty
2221 * waiting for it and 2221 * waiting for it and
2222 * set DCD-bit of its modem-status. 2222 * set DCD-bit of its modem-status.
2223 */ 2223 */
2224 if (TTY_IS_ACTIVE(info) || 2224 if (TTY_IS_ACTIVE(info) ||
2225 (info->blocked_open && (info->emu.mdmreg[REG_DCD] & BIT_DCD))) { 2225 (info->blocked_open && (info->emu.mdmreg[REG_DCD] & BIT_DCD))) {
2226 info->msr |= UART_MSR_DCD; 2226 info->msr |= UART_MSR_DCD;
2227 info->emu.charge = 0; 2227 info->emu.charge = 0;
2228 if (info->dialing & 0xf) 2228 if (info->dialing & 0xf)
2229 info->last_dir = 1; 2229 info->last_dir = 1;
2230 else 2230 else
2231 info->last_dir = 0; 2231 info->last_dir = 0;
2232 info->dialing = 0; 2232 info->dialing = 0;
2233 info->rcvsched = 1; 2233 info->rcvsched = 1;
2234 if (USG_MODEM(dev->usage[i])) { 2234 if (USG_MODEM(dev->usage[i])) {
2235 if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) { 2235 if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) {
2236 strcpy(info->emu.connmsg, c->parm.num); 2236 strcpy(info->emu.connmsg, c->parm.num);
2237 isdn_tty_modem_result(RESULT_CONNECT, info); 2237 isdn_tty_modem_result(RESULT_CONNECT, info);
2238 } else 2238 } else
2239 isdn_tty_modem_result(RESULT_CONNECT64000, info); 2239 isdn_tty_modem_result(RESULT_CONNECT64000, info);
2240 }
2241 if (USG_VOICE(dev->usage[i]))
2242 isdn_tty_modem_result(RESULT_VCON, info);
2243 return 1;
2244 } 2240 }
2245 break; 2241 if (USG_VOICE(dev->usage[i]))
2246 case ISDN_STAT_BHUP: 2242 isdn_tty_modem_result(RESULT_VCON, info);
2243 return 1;
2244 }
2245 break;
2246 case ISDN_STAT_BHUP:
2247#ifdef ISDN_TTY_STAT_DEBUG 2247#ifdef ISDN_TTY_STAT_DEBUG
2248 printk(KERN_DEBUG "tty_STAT_BHUP ttyI%d\n", info->line); 2248 printk(KERN_DEBUG "tty_STAT_BHUP ttyI%d\n", info->line);
2249#endif 2249#endif
2250 if (TTY_IS_ACTIVE(info)) { 2250 if (TTY_IS_ACTIVE(info)) {
2251#ifdef ISDN_DEBUG_MODEM_HUP 2251#ifdef ISDN_DEBUG_MODEM_HUP
2252 printk(KERN_DEBUG "Mhup in ISDN_STAT_BHUP\n"); 2252 printk(KERN_DEBUG "Mhup in ISDN_STAT_BHUP\n");
2253#endif 2253#endif
2254 isdn_tty_modem_hup(info, 0); 2254 isdn_tty_modem_hup(info, 0);
2255 return 1; 2255 return 1;
2256 } 2256 }
2257 break; 2257 break;
2258 case ISDN_STAT_NODCH: 2258 case ISDN_STAT_NODCH:
2259#ifdef ISDN_TTY_STAT_DEBUG 2259#ifdef ISDN_TTY_STAT_DEBUG
2260 printk(KERN_DEBUG "tty_STAT_NODCH ttyI%d\n", info->line); 2260 printk(KERN_DEBUG "tty_STAT_NODCH ttyI%d\n", info->line);
2261#endif 2261#endif
2262 if (TTY_IS_ACTIVE(info)) { 2262 if (TTY_IS_ACTIVE(info)) {
2263 if (info->dialing) { 2263 if (info->dialing) {
2264 info->dialing = 0; 2264 info->dialing = 0;
2265 info->last_l2 = -1; 2265 info->last_l2 = -1;
2266 info->last_si = 0; 2266 info->last_si = 0;
2267 sprintf(info->last_cause, "0000"); 2267 sprintf(info->last_cause, "0000");
2268 isdn_tty_modem_result(RESULT_NO_DIALTONE, info); 2268 isdn_tty_modem_result(RESULT_NO_DIALTONE, info);
2269 }
2270 isdn_tty_modem_hup(info, 0);
2271 return 1;
2272 } 2269 }
2273 break; 2270 isdn_tty_modem_hup(info, 0);
2274 case ISDN_STAT_UNLOAD: 2271 return 1;
2272 }
2273 break;
2274 case ISDN_STAT_UNLOAD:
2275#ifdef ISDN_TTY_STAT_DEBUG 2275#ifdef ISDN_TTY_STAT_DEBUG
2276 printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line); 2276 printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line);
2277#endif 2277#endif
2278 for (i = 0; i < ISDN_MAX_CHANNELS; i++) { 2278 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
2279 info = &dev->mdm.info[i]; 2279 info = &dev->mdm.info[i];
2280 if (info->isdn_driver == c->driver) { 2280 if (info->isdn_driver == c->driver) {
2281 if (info->online) 2281 if (info->online)
2282 isdn_tty_modem_hup(info, 1); 2282 isdn_tty_modem_hup(info, 1);
2283 }
2284 } 2283 }
2285 return 1; 2284 }
2285 return 1;
2286#ifdef CONFIG_ISDN_TTY_FAX 2286#ifdef CONFIG_ISDN_TTY_FAX
2287 case ISDN_STAT_FAXIND: 2287 case ISDN_STAT_FAXIND:
2288 if (TTY_IS_ACTIVE(info)) { 2288 if (TTY_IS_ACTIVE(info)) {
2289 isdn_tty_fax_command(info, c); 2289 isdn_tty_fax_command(info, c);
2290 } 2290 }
2291 break; 2291 break;
2292#endif 2292#endif
2293#ifdef CONFIG_ISDN_AUDIO 2293#ifdef CONFIG_ISDN_AUDIO
2294 case ISDN_STAT_AUDIO: 2294 case ISDN_STAT_AUDIO:
2295 if (TTY_IS_ACTIVE(info)) { 2295 if (TTY_IS_ACTIVE(info)) {
2296 switch(c->parm.num[0]) { 2296 switch (c->parm.num[0]) {
2297 case ISDN_AUDIO_DTMF: 2297 case ISDN_AUDIO_DTMF:
2298 if (info->vonline) { 2298 if (info->vonline) {
2299 isdn_audio_put_dle_code(info, 2299 isdn_audio_put_dle_code(info,
2300 c->parm.num[1]); 2300 c->parm.num[1]);
2301 }
2302 break;
2303 } 2301 }
2302 break;
2304 } 2303 }
2305 break; 2304 }
2305 break;
2306#endif 2306#endif
2307 } 2307 }
2308 } 2308 }
@@ -2311,16 +2311,16 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c)
2311 2311
2312/********************************************************************* 2312/*********************************************************************
2313 Modem-Emulator-Routines 2313 Modem-Emulator-Routines
2314 *********************************************************************/ 2314*********************************************************************/
2315 2315
2316#define cmdchar(c) ((c>=' ')&&(c<=0x7f)) 2316#define cmdchar(c) ((c >= ' ') && (c <= 0x7f))
2317 2317
2318/* 2318/*
2319 * Put a message from the AT-emulator into receive-buffer of tty, 2319 * Put a message from the AT-emulator into receive-buffer of tty,
2320 * convert CR, LF, and BS to values in modem-registers 3, 4 and 5. 2320 * convert CR, LF, and BS to values in modem-registers 3, 4 and 5.
2321 */ 2321 */
2322void 2322void
2323isdn_tty_at_cout(char *msg, modem_info * info) 2323isdn_tty_at_cout(char *msg, modem_info *info)
2324{ 2324{
2325 struct tty_struct *tty; 2325 struct tty_struct *tty;
2326 atemu *m = &info->emu; 2326 atemu *m = &info->emu;
@@ -2348,7 +2348,7 @@ isdn_tty_at_cout(char *msg, modem_info * info)
2348 /* use queue instead of direct, if online and */ 2348 /* use queue instead of direct, if online and */
2349 /* data is in queue or buffer is full */ 2349 /* data is in queue or buffer is full */
2350 if (info->online && ((tty_buffer_request_room(tty, l) < l) || 2350 if (info->online && ((tty_buffer_request_room(tty, l) < l) ||
2351 !skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel]))) { 2351 !skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel]))) {
2352 skb = alloc_skb(l, GFP_ATOMIC); 2352 skb = alloc_skb(l, GFP_ATOMIC);
2353 if (!skb) { 2353 if (!skb) {
2354 spin_unlock_irqrestore(&info->readlock, flags); 2354 spin_unlock_irqrestore(&info->readlock, flags);
@@ -2363,22 +2363,22 @@ isdn_tty_at_cout(char *msg, modem_info * info)
2363 2363
2364 for (p = msg; *p; p++) { 2364 for (p = msg; *p; p++) {
2365 switch (*p) { 2365 switch (*p) {
2366 case '\r': 2366 case '\r':
2367 c = m->mdmreg[REG_CR]; 2367 c = m->mdmreg[REG_CR];
2368 break; 2368 break;
2369 case '\n': 2369 case '\n':
2370 c = m->mdmreg[REG_LF]; 2370 c = m->mdmreg[REG_LF];
2371 break; 2371 break;
2372 case '\b': 2372 case '\b':
2373 c = m->mdmreg[REG_BS]; 2373 c = m->mdmreg[REG_BS];
2374 break; 2374 break;
2375 default: 2375 default:
2376 c = *p; 2376 c = *p;
2377 } 2377 }
2378 if (skb) { 2378 if (skb) {
2379 *sp++ = c; 2379 *sp++ = c;
2380 } else { 2380 } else {
2381 if(tty_insert_flip_char(tty, c, TTY_NORMAL) == 0) 2381 if (tty_insert_flip_char(tty, c, TTY_NORMAL) == 0)
2382 break; 2382 break;
2383 } 2383 }
2384 } 2384 }
@@ -2400,7 +2400,7 @@ isdn_tty_at_cout(char *msg, modem_info * info)
2400 * Perform ATH Hangup 2400 * Perform ATH Hangup
2401 */ 2401 */
2402static void 2402static void
2403isdn_tty_on_hook(modem_info * info) 2403isdn_tty_on_hook(modem_info *info)
2404{ 2404{
2405 if (info->isdn_channel >= 0) { 2405 if (info->isdn_channel >= 0) {
2406#ifdef ISDN_DEBUG_MODEM_HUP 2406#ifdef ISDN_DEBUG_MODEM_HUP
@@ -2416,8 +2416,8 @@ isdn_tty_off_hook(void)
2416 printk(KERN_DEBUG "isdn_tty_off_hook\n"); 2416 printk(KERN_DEBUG "isdn_tty_off_hook\n");
2417} 2417}
2418 2418
2419#define PLUSWAIT1 (HZ/2) /* 0.5 sec. */ 2419#define PLUSWAIT1 (HZ / 2) /* 0.5 sec. */
2420#define PLUSWAIT2 (HZ*3/2) /* 1.5 sec */ 2420#define PLUSWAIT2 (HZ * 3 / 2) /* 1.5 sec */
2421 2421
2422/* 2422/*
2423 * Check Buffer for Modem-escape-sequence, activate timer-callback to 2423 * Check Buffer for Modem-escape-sequence, activate timer-callback to
@@ -2431,7 +2431,7 @@ isdn_tty_off_hook(void)
2431 * lastplus timestamp of last character 2431 * lastplus timestamp of last character
2432 */ 2432 */
2433static void 2433static void
2434isdn_tty_check_esc(const u_char * p, u_char plus, int count, int *pluscount, 2434isdn_tty_check_esc(const u_char *p, u_char plus, int count, int *pluscount,
2435 u_long *lastplus) 2435 u_long *lastplus)
2436{ 2436{
2437 if (plus > 127) 2437 if (plus > 127)
@@ -2471,69 +2471,69 @@ isdn_tty_check_esc(const u_char * p, u_char plus, int count, int *pluscount,
2471 */ 2471 */
2472 2472
2473static void 2473static void
2474isdn_tty_modem_result(int code, modem_info * info) 2474isdn_tty_modem_result(int code, modem_info *info)
2475{ 2475{
2476 atemu *m = &info->emu; 2476 atemu *m = &info->emu;
2477 static char *msg[] = 2477 static char *msg[] =
2478 {"OK", "CONNECT", "RING", "NO CARRIER", "ERROR", 2478 {"OK", "CONNECT", "RING", "NO CARRIER", "ERROR",
2479 "CONNECT 64000", "NO DIALTONE", "BUSY", "NO ANSWER", 2479 "CONNECT 64000", "NO DIALTONE", "BUSY", "NO ANSWER",
2480 "RINGING", "NO MSN/EAZ", "VCON", "RUNG"}; 2480 "RINGING", "NO MSN/EAZ", "VCON", "RUNG"};
2481 char s[ISDN_MSNLEN+10]; 2481 char s[ISDN_MSNLEN + 10];
2482 2482
2483 switch (code) { 2483 switch (code) {
2484 case RESULT_RING: 2484 case RESULT_RING:
2485 m->mdmreg[REG_RINGCNT]++; 2485 m->mdmreg[REG_RINGCNT]++;
2486 if (m->mdmreg[REG_RINGCNT] == m->mdmreg[REG_RINGATA]) 2486 if (m->mdmreg[REG_RINGCNT] == m->mdmreg[REG_RINGATA])
2487 /* Automatically accept incoming call */ 2487 /* Automatically accept incoming call */
2488 isdn_tty_cmd_ATA(info); 2488 isdn_tty_cmd_ATA(info);
2489 break; 2489 break;
2490 case RESULT_NO_CARRIER: 2490 case RESULT_NO_CARRIER:
2491#ifdef ISDN_DEBUG_MODEM_HUP 2491#ifdef ISDN_DEBUG_MODEM_HUP
2492 printk(KERN_DEBUG "modem_result: NO CARRIER %d %d\n", 2492 printk(KERN_DEBUG "modem_result: NO CARRIER %d %d\n",
2493 (info->flags & ISDN_ASYNC_CLOSING), 2493 (info->flags & ISDN_ASYNC_CLOSING),
2494 (!info->tty)); 2494 (!info->tty));
2495#endif 2495#endif
2496 m->mdmreg[REG_RINGCNT] = 0; 2496 m->mdmreg[REG_RINGCNT] = 0;
2497 del_timer(&info->nc_timer); 2497 del_timer(&info->nc_timer);
2498 info->ncarrier = 0; 2498 info->ncarrier = 0;
2499 if ((info->flags & ISDN_ASYNC_CLOSING) || (!info->tty)) { 2499 if ((info->flags & ISDN_ASYNC_CLOSING) || (!info->tty)) {
2500 return; 2500 return;
2501 } 2501 }
2502#ifdef CONFIG_ISDN_AUDIO 2502#ifdef CONFIG_ISDN_AUDIO
2503 if (info->vonline & 1) { 2503 if (info->vonline & 1) {
2504#ifdef ISDN_DEBUG_MODEM_VOICE 2504#ifdef ISDN_DEBUG_MODEM_VOICE
2505 printk(KERN_DEBUG "res3: send DLE-ETX on ttyI%d\n", 2505 printk(KERN_DEBUG "res3: send DLE-ETX on ttyI%d\n",
2506 info->line); 2506 info->line);
2507#endif 2507#endif
2508 /* voice-recording, add DLE-ETX */ 2508 /* voice-recording, add DLE-ETX */
2509 isdn_tty_at_cout("\020\003", info); 2509 isdn_tty_at_cout("\020\003", info);
2510 } 2510 }
2511 if (info->vonline & 2) { 2511 if (info->vonline & 2) {
2512#ifdef ISDN_DEBUG_MODEM_VOICE 2512#ifdef ISDN_DEBUG_MODEM_VOICE
2513 printk(KERN_DEBUG "res3: send DLE-DC4 on ttyI%d\n", 2513 printk(KERN_DEBUG "res3: send DLE-DC4 on ttyI%d\n",
2514 info->line); 2514 info->line);
2515#endif 2515#endif
2516 /* voice-playing, add DLE-DC4 */ 2516 /* voice-playing, add DLE-DC4 */
2517 isdn_tty_at_cout("\020\024", info); 2517 isdn_tty_at_cout("\020\024", info);
2518 } 2518 }
2519#endif 2519#endif
2520 break; 2520 break;
2521 case RESULT_CONNECT: 2521 case RESULT_CONNECT:
2522 case RESULT_CONNECT64000: 2522 case RESULT_CONNECT64000:
2523 sprintf(info->last_cause, "0000"); 2523 sprintf(info->last_cause, "0000");
2524 if (!info->online) 2524 if (!info->online)
2525 info->online = 2; 2525 info->online = 2;
2526 break; 2526 break;
2527 case RESULT_VCON: 2527 case RESULT_VCON:
2528#ifdef ISDN_DEBUG_MODEM_VOICE 2528#ifdef ISDN_DEBUG_MODEM_VOICE
2529 printk(KERN_DEBUG "res3: send VCON on ttyI%d\n", 2529 printk(KERN_DEBUG "res3: send VCON on ttyI%d\n",
2530 info->line); 2530 info->line);
2531#endif 2531#endif
2532 sprintf(info->last_cause, "0000"); 2532 sprintf(info->last_cause, "0000");
2533 if (!info->online) 2533 if (!info->online)
2534 info->online = 1; 2534 info->online = 1;
2535 break; 2535 break;
2536 } /* switch(code) */ 2536 } /* switch (code) */
2537 2537
2538 if (m->mdmreg[REG_RESP] & BIT_RESP) { 2538 if (m->mdmreg[REG_RESP] & BIT_RESP) {
2539 /* Show results */ 2539 /* Show results */
@@ -2543,87 +2543,87 @@ isdn_tty_modem_result(int code, modem_info * info)
2543 isdn_tty_at_cout(s, info); 2543 isdn_tty_at_cout(s, info);
2544 } else { 2544 } else {
2545 if (code == RESULT_RING) { 2545 if (code == RESULT_RING) {
2546 /* return if "show RUNG" and ringcounter>1 */ 2546 /* return if "show RUNG" and ringcounter>1 */
2547 if ((m->mdmreg[REG_RUNG] & BIT_RUNG) && 2547 if ((m->mdmreg[REG_RUNG] & BIT_RUNG) &&
2548 (m->mdmreg[REG_RINGCNT] > 1)) 2548 (m->mdmreg[REG_RINGCNT] > 1))
2549 return; 2549 return;
2550 /* print CID, _before_ _every_ ring */ 2550 /* print CID, _before_ _every_ ring */
2551 if (!(m->mdmreg[REG_CIDONCE] & BIT_CIDONCE)) { 2551 if (!(m->mdmreg[REG_CIDONCE] & BIT_CIDONCE)) {
2552 isdn_tty_at_cout("\r\nCALLER NUMBER: ", info); 2552 isdn_tty_at_cout("\r\nCALLER NUMBER: ", info);
2553 isdn_tty_at_cout(dev->num[info->drv_index], info); 2553 isdn_tty_at_cout(dev->num[info->drv_index], info);
2554 if (m->mdmreg[REG_CDN] & BIT_CDN) { 2554 if (m->mdmreg[REG_CDN] & BIT_CDN) {
2555 isdn_tty_at_cout("\r\nCALLED NUMBER: ", info); 2555 isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
2556 isdn_tty_at_cout(info->emu.cpn, info); 2556 isdn_tty_at_cout(info->emu.cpn, info);
2557 } 2557 }
2558 } 2558 }
2559 } 2559 }
2560 isdn_tty_at_cout("\r\n", info); 2560 isdn_tty_at_cout("\r\n", info);
2561 isdn_tty_at_cout(msg[code], info); 2561 isdn_tty_at_cout(msg[code], info);
2562 switch (code) { 2562 switch (code) {
2563 case RESULT_CONNECT: 2563 case RESULT_CONNECT:
2564 switch (m->mdmreg[REG_L2PROT]) { 2564 switch (m->mdmreg[REG_L2PROT]) {
2565 case ISDN_PROTO_L2_MODEM: 2565 case ISDN_PROTO_L2_MODEM:
2566 isdn_tty_at_cout(" ", info); 2566 isdn_tty_at_cout(" ", info);
2567 isdn_tty_at_cout(m->connmsg, info); 2567 isdn_tty_at_cout(m->connmsg, info);
2568 break;
2569 }
2570 break; 2568 break;
2571 case RESULT_RING: 2569 }
2572 /* Append CPN, if enabled */ 2570 break;
2573 if ((m->mdmreg[REG_CPN] & BIT_CPN)) { 2571 case RESULT_RING:
2574 sprintf(s, "/%s", m->cpn); 2572 /* Append CPN, if enabled */
2575 isdn_tty_at_cout(s, info); 2573 if ((m->mdmreg[REG_CPN] & BIT_CPN)) {
2576 } 2574 sprintf(s, "/%s", m->cpn);
2577 /* Print CID only once, _after_ 1st RING */ 2575 isdn_tty_at_cout(s, info);
2578 if ((m->mdmreg[REG_CIDONCE] & BIT_CIDONCE) && 2576 }
2579 (m->mdmreg[REG_RINGCNT] == 1)) { 2577 /* Print CID only once, _after_ 1st RING */
2580 isdn_tty_at_cout("\r\n", info); 2578 if ((m->mdmreg[REG_CIDONCE] & BIT_CIDONCE) &&
2581 isdn_tty_at_cout("CALLER NUMBER: ", info); 2579 (m->mdmreg[REG_RINGCNT] == 1)) {
2582 isdn_tty_at_cout(dev->num[info->drv_index], info); 2580 isdn_tty_at_cout("\r\n", info);
2583 if (m->mdmreg[REG_CDN] & BIT_CDN) { 2581 isdn_tty_at_cout("CALLER NUMBER: ", info);
2584 isdn_tty_at_cout("\r\nCALLED NUMBER: ", info); 2582 isdn_tty_at_cout(dev->num[info->drv_index], info);
2585 isdn_tty_at_cout(info->emu.cpn, info); 2583 if (m->mdmreg[REG_CDN] & BIT_CDN) {
2586 } 2584 isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
2585 isdn_tty_at_cout(info->emu.cpn, info);
2587 } 2586 }
2587 }
2588 break;
2589 case RESULT_NO_CARRIER:
2590 case RESULT_NO_DIALTONE:
2591 case RESULT_BUSY:
2592 case RESULT_NO_ANSWER:
2593 m->mdmreg[REG_RINGCNT] = 0;
2594 /* Append Cause-Message if enabled */
2595 if (m->mdmreg[REG_RESPXT] & BIT_RESPXT) {
2596 sprintf(s, "/%s", info->last_cause);
2597 isdn_tty_at_cout(s, info);
2598 }
2599 break;
2600 case RESULT_CONNECT64000:
2601 /* Append Protocol to CONNECT message */
2602 switch (m->mdmreg[REG_L2PROT]) {
2603 case ISDN_PROTO_L2_X75I:
2604 case ISDN_PROTO_L2_X75UI:
2605 case ISDN_PROTO_L2_X75BUI:
2606 isdn_tty_at_cout("/X.75", info);
2588 break; 2607 break;
2589 case RESULT_NO_CARRIER: 2608 case ISDN_PROTO_L2_HDLC:
2590 case RESULT_NO_DIALTONE: 2609 isdn_tty_at_cout("/HDLC", info);
2591 case RESULT_BUSY:
2592 case RESULT_NO_ANSWER:
2593 m->mdmreg[REG_RINGCNT] = 0;
2594 /* Append Cause-Message if enabled */
2595 if (m->mdmreg[REG_RESPXT] & BIT_RESPXT) {
2596 sprintf(s, "/%s", info->last_cause);
2597 isdn_tty_at_cout(s, info);
2598 }
2599 break; 2610 break;
2600 case RESULT_CONNECT64000: 2611 case ISDN_PROTO_L2_V11096:
2601 /* Append Protocol to CONNECT message */ 2612 isdn_tty_at_cout("/V110/9600", info);
2602 switch (m->mdmreg[REG_L2PROT]) { 2613 break;
2603 case ISDN_PROTO_L2_X75I: 2614 case ISDN_PROTO_L2_V11019:
2604 case ISDN_PROTO_L2_X75UI: 2615 isdn_tty_at_cout("/V110/19200", info);
2605 case ISDN_PROTO_L2_X75BUI: 2616 break;
2606 isdn_tty_at_cout("/X.75", info); 2617 case ISDN_PROTO_L2_V11038:
2607 break; 2618 isdn_tty_at_cout("/V110/38400", info);
2608 case ISDN_PROTO_L2_HDLC:
2609 isdn_tty_at_cout("/HDLC", info);
2610 break;
2611 case ISDN_PROTO_L2_V11096:
2612 isdn_tty_at_cout("/V110/9600", info);
2613 break;
2614 case ISDN_PROTO_L2_V11019:
2615 isdn_tty_at_cout("/V110/19200", info);
2616 break;
2617 case ISDN_PROTO_L2_V11038:
2618 isdn_tty_at_cout("/V110/38400", info);
2619 break;
2620 }
2621 if (m->mdmreg[REG_T70] & BIT_T70) {
2622 isdn_tty_at_cout("/T.70", info);
2623 if (m->mdmreg[REG_T70] & BIT_T70_EXT)
2624 isdn_tty_at_cout("+", info);
2625 }
2626 break; 2619 break;
2620 }
2621 if (m->mdmreg[REG_T70] & BIT_T70) {
2622 isdn_tty_at_cout("/T.70", info);
2623 if (m->mdmreg[REG_T70] & BIT_T70_EXT)
2624 isdn_tty_at_cout("+", info);
2625 }
2626 break;
2627 } 2627 }
2628 isdn_tty_at_cout("\r\n", info); 2628 isdn_tty_at_cout("\r\n", info);
2629 } 2629 }
@@ -2645,7 +2645,7 @@ isdn_tty_modem_result(int code, modem_info * info)
2645 * Display a modem-register-value. 2645 * Display a modem-register-value.
2646 */ 2646 */
2647static void 2647static void
2648isdn_tty_show_profile(int ridx, modem_info * info) 2648isdn_tty_show_profile(int ridx, modem_info *info)
2649{ 2649{
2650 char v[6]; 2650 char v[6];
2651 2651
@@ -2664,7 +2664,7 @@ isdn_tty_get_msnstr(char *n, char **p)
2664 while (((*p[0] >= '0' && *p[0] <= '9') || 2664 while (((*p[0] >= '0' && *p[0] <= '9') ||
2665 /* Why a comma ??? */ 2665 /* Why a comma ??? */
2666 (*p[0] == ',') || (*p[0] == ':')) && 2666 (*p[0] == ',') || (*p[0] == ':')) &&
2667 (limit--)) 2667 (limit--))
2668 *n++ = *p[0]++; 2668 *n++ = *p[0]++;
2669 *n = '\0'; 2669 *n = '\0';
2670} 2670}
@@ -2673,20 +2673,20 @@ isdn_tty_get_msnstr(char *n, char **p)
2673 * Get phone-number from modem-commandbuffer 2673 * Get phone-number from modem-commandbuffer
2674 */ 2674 */
2675static void 2675static void
2676isdn_tty_getdial(char *p, char *q,int cnt) 2676isdn_tty_getdial(char *p, char *q, int cnt)
2677{ 2677{
2678 int first = 1; 2678 int first = 1;
2679 int limit = ISDN_MSNLEN - 1; /* MUST match the size of interface var to avoid 2679 int limit = ISDN_MSNLEN - 1; /* MUST match the size of interface var to avoid
2680 buffer overflow */ 2680 buffer overflow */
2681 2681
2682 while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt>0) { 2682 while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt > 0) {
2683 if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) || 2683 if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) ||
2684 ((*p == 'R') && first) || 2684 ((*p == 'R') && first) ||
2685 (*p == '*') || (*p == '#')) { 2685 (*p == '*') || (*p == '#')) {
2686 *q++ = *p; 2686 *q++ = *p;
2687 limit--; 2687 limit--;
2688 } 2688 }
2689 if(!limit) 2689 if (!limit)
2690 break; 2690 break;
2691 p++; 2691 p++;
2692 first = 0; 2692 first = 0;
@@ -2698,7 +2698,7 @@ isdn_tty_getdial(char *p, char *q,int cnt)
2698#define PARSE_ERROR1 { isdn_tty_modem_result(RESULT_ERROR, info); return 1; } 2698#define PARSE_ERROR1 { isdn_tty_modem_result(RESULT_ERROR, info); return 1; }
2699 2699
2700static void 2700static void
2701isdn_tty_report(modem_info * info) 2701isdn_tty_report(modem_info *info)
2702{ 2702{
2703 atemu *m = &info->emu; 2703 atemu *m = &info->emu;
2704 char s[80]; 2704 char s[80];
@@ -2710,39 +2710,39 @@ isdn_tty_report(modem_info * info)
2710 isdn_tty_at_cout(s, info); 2710 isdn_tty_at_cout(s, info);
2711 isdn_tty_at_cout(" Layer-2 Protocol: ", info); 2711 isdn_tty_at_cout(" Layer-2 Protocol: ", info);
2712 switch (info->last_l2) { 2712 switch (info->last_l2) {
2713 case ISDN_PROTO_L2_X75I: 2713 case ISDN_PROTO_L2_X75I:
2714 isdn_tty_at_cout("X.75i", info); 2714 isdn_tty_at_cout("X.75i", info);
2715 break; 2715 break;
2716 case ISDN_PROTO_L2_X75UI: 2716 case ISDN_PROTO_L2_X75UI:
2717 isdn_tty_at_cout("X.75ui", info); 2717 isdn_tty_at_cout("X.75ui", info);
2718 break; 2718 break;
2719 case ISDN_PROTO_L2_X75BUI: 2719 case ISDN_PROTO_L2_X75BUI:
2720 isdn_tty_at_cout("X.75bui", info); 2720 isdn_tty_at_cout("X.75bui", info);
2721 break; 2721 break;
2722 case ISDN_PROTO_L2_HDLC: 2722 case ISDN_PROTO_L2_HDLC:
2723 isdn_tty_at_cout("HDLC", info); 2723 isdn_tty_at_cout("HDLC", info);
2724 break; 2724 break;
2725 case ISDN_PROTO_L2_V11096: 2725 case ISDN_PROTO_L2_V11096:
2726 isdn_tty_at_cout("V.110 9600 Baud", info); 2726 isdn_tty_at_cout("V.110 9600 Baud", info);
2727 break; 2727 break;
2728 case ISDN_PROTO_L2_V11019: 2728 case ISDN_PROTO_L2_V11019:
2729 isdn_tty_at_cout("V.110 19200 Baud", info); 2729 isdn_tty_at_cout("V.110 19200 Baud", info);
2730 break; 2730 break;
2731 case ISDN_PROTO_L2_V11038: 2731 case ISDN_PROTO_L2_V11038:
2732 isdn_tty_at_cout("V.110 38400 Baud", info); 2732 isdn_tty_at_cout("V.110 38400 Baud", info);
2733 break; 2733 break;
2734 case ISDN_PROTO_L2_TRANS: 2734 case ISDN_PROTO_L2_TRANS:
2735 isdn_tty_at_cout("transparent", info); 2735 isdn_tty_at_cout("transparent", info);
2736 break; 2736 break;
2737 case ISDN_PROTO_L2_MODEM: 2737 case ISDN_PROTO_L2_MODEM:
2738 isdn_tty_at_cout("modem", info); 2738 isdn_tty_at_cout("modem", info);
2739 break; 2739 break;
2740 case ISDN_PROTO_L2_FAX: 2740 case ISDN_PROTO_L2_FAX:
2741 isdn_tty_at_cout("fax", info); 2741 isdn_tty_at_cout("fax", info);
2742 break; 2742 break;
2743 default: 2743 default:
2744 isdn_tty_at_cout("unknown", info); 2744 isdn_tty_at_cout("unknown", info);
2745 break; 2745 break;
2746 } 2746 }
2747 if (m->mdmreg[REG_T70] & BIT_T70) { 2747 if (m->mdmreg[REG_T70] & BIT_T70) {
2748 isdn_tty_at_cout("/T.70", info); 2748 isdn_tty_at_cout("/T.70", info);
@@ -2752,19 +2752,19 @@ isdn_tty_report(modem_info * info)
2752 isdn_tty_at_cout("\r\n", info); 2752 isdn_tty_at_cout("\r\n", info);
2753 isdn_tty_at_cout(" Service: ", info); 2753 isdn_tty_at_cout(" Service: ", info);
2754 switch (info->last_si) { 2754 switch (info->last_si) {
2755 case 1: 2755 case 1:
2756 isdn_tty_at_cout("audio\r\n", info); 2756 isdn_tty_at_cout("audio\r\n", info);
2757 break; 2757 break;
2758 case 5: 2758 case 5:
2759 isdn_tty_at_cout("btx\r\n", info); 2759 isdn_tty_at_cout("btx\r\n", info);
2760 break; 2760 break;
2761 case 7: 2761 case 7:
2762 isdn_tty_at_cout("data\r\n", info); 2762 isdn_tty_at_cout("data\r\n", info);
2763 break; 2763 break;
2764 default: 2764 default:
2765 sprintf(s, "%d\r\n", info->last_si); 2765 sprintf(s, "%d\r\n", info->last_si);
2766 isdn_tty_at_cout(s, info); 2766 isdn_tty_at_cout(s, info);
2767 break; 2767 break;
2768 } 2768 }
2769 sprintf(s, " Hangup location: %s\r\n", info->last_lhup ? "local" : "remote"); 2769 sprintf(s, " Hangup location: %s\r\n", info->last_lhup ? "local" : "remote");
2770 isdn_tty_at_cout(s, info); 2770 isdn_tty_at_cout(s, info);
@@ -2776,7 +2776,7 @@ isdn_tty_report(modem_info * info)
2776 * Parse AT&.. commands. 2776 * Parse AT&.. commands.
2777 */ 2777 */
2778static int 2778static int
2779isdn_tty_cmd_ATand(char **p, modem_info * info) 2779isdn_tty_cmd_ATand(char **p, modem_info *info)
2780{ 2780{
2781 atemu *m = &info->emu; 2781 atemu *m = &info->emu;
2782 int i; 2782 int i;
@@ -2785,224 +2785,224 @@ isdn_tty_cmd_ATand(char **p, modem_info * info)
2785#define MAXRB (sizeof(rb) - 1) 2785#define MAXRB (sizeof(rb) - 1)
2786 2786
2787 switch (*p[0]) { 2787 switch (*p[0]) {
2788 case 'B': 2788 case 'B':
2789 /* &B - Set Buffersize */ 2789 /* &B - Set Buffersize */
2790 p[0]++; 2790 p[0]++;
2791 i = isdn_getnum(p); 2791 i = isdn_getnum(p);
2792 if ((i < 0) || (i > ISDN_SERIAL_XMIT_MAX)) 2792 if ((i < 0) || (i > ISDN_SERIAL_XMIT_MAX))
2793 PARSE_ERROR1; 2793 PARSE_ERROR1;
2794#ifdef CONFIG_ISDN_AUDIO 2794#ifdef CONFIG_ISDN_AUDIO
2795 if ((m->mdmreg[REG_SI1] & 1) && (i > VBUF)) 2795 if ((m->mdmreg[REG_SI1] & 1) && (i > VBUF))
2796 PARSE_ERROR1; 2796 PARSE_ERROR1;
2797#endif 2797#endif
2798 m->mdmreg[REG_PSIZE] = i / 16; 2798 m->mdmreg[REG_PSIZE] = i / 16;
2799 info->xmit_size = m->mdmreg[REG_PSIZE] * 16; 2799 info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
2800 switch (m->mdmreg[REG_L2PROT]) { 2800 switch (m->mdmreg[REG_L2PROT]) {
2801 case ISDN_PROTO_L2_V11096: 2801 case ISDN_PROTO_L2_V11096:
2802 case ISDN_PROTO_L2_V11019: 2802 case ISDN_PROTO_L2_V11019:
2803 case ISDN_PROTO_L2_V11038: 2803 case ISDN_PROTO_L2_V11038:
2804 info->xmit_size /= 10; 2804 info->xmit_size /= 10;
2805 } 2805 }
2806 break;
2807 case 'C':
2808 /* &C - DCD Status */
2809 p[0]++;
2810 switch (isdn_getnum(p)) {
2811 case 0:
2812 m->mdmreg[REG_DCD] &= ~BIT_DCD;
2806 break; 2813 break;
2807 case 'C': 2814 case 1:
2808 /* &C - DCD Status */ 2815 m->mdmreg[REG_DCD] |= BIT_DCD;
2809 p[0]++;
2810 switch (isdn_getnum(p)) {
2811 case 0:
2812 m->mdmreg[REG_DCD] &= ~BIT_DCD;
2813 break;
2814 case 1:
2815 m->mdmreg[REG_DCD] |= BIT_DCD;
2816 break;
2817 default:
2818 PARSE_ERROR1
2819 }
2820 break; 2816 break;
2821 case 'D': 2817 default:
2822 /* &D - Set DTR-Low-behavior */ 2818 PARSE_ERROR1
2823 p[0]++; 2819 }
2824 switch (isdn_getnum(p)) { 2820 break;
2825 case 0: 2821 case 'D':
2826 m->mdmreg[REG_DTRHUP] &= ~BIT_DTRHUP; 2822 /* &D - Set DTR-Low-behavior */
2827 m->mdmreg[REG_DTRR] &= ~BIT_DTRR; 2823 p[0]++;
2828 break; 2824 switch (isdn_getnum(p)) {
2829 case 2: 2825 case 0:
2830 m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP; 2826 m->mdmreg[REG_DTRHUP] &= ~BIT_DTRHUP;
2831 m->mdmreg[REG_DTRR] &= ~BIT_DTRR; 2827 m->mdmreg[REG_DTRR] &= ~BIT_DTRR;
2832 break;
2833 case 3:
2834 m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
2835 m->mdmreg[REG_DTRR] |= BIT_DTRR;
2836 break;
2837 default:
2838 PARSE_ERROR1
2839 }
2840 break; 2828 break;
2841 case 'E': 2829 case 2:
2842 /* &E -Set EAZ/MSN */ 2830 m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
2843 p[0]++; 2831 m->mdmreg[REG_DTRR] &= ~BIT_DTRR;
2844 isdn_tty_get_msnstr(m->msn, p);
2845 break; 2832 break;
2846 case 'F': 2833 case 3:
2847 /* &F -Set Factory-Defaults */ 2834 m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
2848 p[0]++; 2835 m->mdmreg[REG_DTRR] |= BIT_DTRR;
2849 if (info->msr & UART_MSR_DCD)
2850 PARSE_ERROR1;
2851 isdn_tty_reset_profile(m);
2852 isdn_tty_modem_reset_regs(info, 1);
2853 break; 2836 break;
2837 default:
2838 PARSE_ERROR1
2839 }
2840 break;
2841 case 'E':
2842 /* &E -Set EAZ/MSN */
2843 p[0]++;
2844 isdn_tty_get_msnstr(m->msn, p);
2845 break;
2846 case 'F':
2847 /* &F -Set Factory-Defaults */
2848 p[0]++;
2849 if (info->msr & UART_MSR_DCD)
2850 PARSE_ERROR1;
2851 isdn_tty_reset_profile(m);
2852 isdn_tty_modem_reset_regs(info, 1);
2853 break;
2854#ifdef DUMMY_HAYES_AT 2854#ifdef DUMMY_HAYES_AT
2855 case 'K': 2855 case 'K':
2856 /* only for be compilant with common scripts */ 2856 /* only for be compilant with common scripts */
2857 /* &K Flowcontrol - no function */ 2857 /* &K Flowcontrol - no function */
2858 p[0]++; 2858 p[0]++;
2859 isdn_getnum(p); 2859 isdn_getnum(p);
2860 break;
2861#endif
2862 case 'L':
2863 /* &L -Set Numbers to listen on */
2864 p[0]++;
2865 i = 0;
2866 while (*p[0] && (strchr("0123456789,-*[]?;", *p[0])) &&
2867 (i < ISDN_LMSNLEN - 1))
2868 m->lmsn[i++] = *p[0]++;
2869 m->lmsn[i] = '\0';
2870 break;
2871 case 'R':
2872 /* &R - Set V.110 bitrate adaption */
2873 p[0]++;
2874 i = isdn_getnum(p);
2875 switch (i) {
2876 case 0:
2877 /* Switch off V.110, back to X.75 */
2878 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
2879 m->mdmreg[REG_SI2] = 0;
2880 info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
2860 break; 2881 break;
2861#endif 2882 case 9600:
2862 case 'L': 2883 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11096;
2863 /* &L -Set Numbers to listen on */ 2884 m->mdmreg[REG_SI2] = 197;
2864 p[0]++; 2885 info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
2865 i = 0;
2866 while (*p[0] && (strchr("0123456789,-*[]?;", *p[0])) &&
2867 (i < ISDN_LMSNLEN - 1))
2868 m->lmsn[i++] = *p[0]++;
2869 m->lmsn[i] = '\0';
2870 break;
2871 case 'R':
2872 /* &R - Set V.110 bitrate adaption */
2873 p[0]++;
2874 i = isdn_getnum(p);
2875 switch (i) {
2876 case 0:
2877 /* Switch off V.110, back to X.75 */
2878 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
2879 m->mdmreg[REG_SI2] = 0;
2880 info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
2881 break;
2882 case 9600:
2883 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11096;
2884 m->mdmreg[REG_SI2] = 197;
2885 info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
2886 break;
2887 case 19200:
2888 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11019;
2889 m->mdmreg[REG_SI2] = 199;
2890 info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
2891 break;
2892 case 38400:
2893 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11038;
2894 m->mdmreg[REG_SI2] = 198; /* no existing standard for this */
2895 info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
2896 break;
2897 default:
2898 PARSE_ERROR1;
2899 }
2900 /* Switch off T.70 */
2901 m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
2902 /* Set Service 7 */
2903 m->mdmreg[REG_SI1] |= 4;
2904 break; 2886 break;
2905 case 'S': 2887 case 19200:
2906 /* &S - Set Windowsize */ 2888 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11019;
2907 p[0]++; 2889 m->mdmreg[REG_SI2] = 199;
2908 i = isdn_getnum(p); 2890 info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
2909 if ((i > 0) && (i < 9))
2910 m->mdmreg[REG_WSIZE] = i;
2911 else
2912 PARSE_ERROR1;
2913 break; 2891 break;
2914 case 'V': 2892 case 38400:
2915 /* &V - Show registers */ 2893 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11038;
2916 p[0]++; 2894 m->mdmreg[REG_SI2] = 198; /* no existing standard for this */
2917 isdn_tty_at_cout("\r\n", info); 2895 info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
2918 for (i = 0; i < ISDN_MODEM_NUMREG; i++) {
2919 sprintf(rb, "S%02d=%03d%s", i,
2920 m->mdmreg[i], ((i + 1) % 10) ? " " : "\r\n");
2921 isdn_tty_at_cout(rb, info);
2922 }
2923 sprintf(rb, "\r\nEAZ/MSN: %.50s\r\n",
2924 strlen(m->msn) ? m->msn : "None");
2925 isdn_tty_at_cout(rb, info);
2926 if (strlen(m->lmsn)) {
2927 isdn_tty_at_cout("\r\nListen: ", info);
2928 isdn_tty_at_cout(m->lmsn, info);
2929 isdn_tty_at_cout("\r\n", info);
2930 }
2931 break; 2896 break;
2932 case 'W': 2897 default:
2933 /* &W - Write Profile */ 2898 PARSE_ERROR1;
2899 }
2900 /* Switch off T.70 */
2901 m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
2902 /* Set Service 7 */
2903 m->mdmreg[REG_SI1] |= 4;
2904 break;
2905 case 'S':
2906 /* &S - Set Windowsize */
2907 p[0]++;
2908 i = isdn_getnum(p);
2909 if ((i > 0) && (i < 9))
2910 m->mdmreg[REG_WSIZE] = i;
2911 else
2912 PARSE_ERROR1;
2913 break;
2914 case 'V':
2915 /* &V - Show registers */
2916 p[0]++;
2917 isdn_tty_at_cout("\r\n", info);
2918 for (i = 0; i < ISDN_MODEM_NUMREG; i++) {
2919 sprintf(rb, "S%02d=%03d%s", i,
2920 m->mdmreg[i], ((i + 1) % 10) ? " " : "\r\n");
2921 isdn_tty_at_cout(rb, info);
2922 }
2923 sprintf(rb, "\r\nEAZ/MSN: %.50s\r\n",
2924 strlen(m->msn) ? m->msn : "None");
2925 isdn_tty_at_cout(rb, info);
2926 if (strlen(m->lmsn)) {
2927 isdn_tty_at_cout("\r\nListen: ", info);
2928 isdn_tty_at_cout(m->lmsn, info);
2929 isdn_tty_at_cout("\r\n", info);
2930 }
2931 break;
2932 case 'W':
2933 /* &W - Write Profile */
2934 p[0]++;
2935 switch (*p[0]) {
2936 case '0':
2934 p[0]++; 2937 p[0]++;
2935 switch (*p[0]) { 2938 modem_write_profile(m);
2936 case '0':
2937 p[0]++;
2938 modem_write_profile(m);
2939 break;
2940 default:
2941 PARSE_ERROR1;
2942 }
2943 break; 2939 break;
2944 case 'X': 2940 default:
2945 /* &X - Switch to BTX-Mode and T.70 */ 2941 PARSE_ERROR1;
2946 p[0]++; 2942 }
2947 switch (isdn_getnum(p)) { 2943 break;
2948 case 0: 2944 case 'X':
2949 m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT); 2945 /* &X - Switch to BTX-Mode and T.70 */
2950 info->xmit_size = m->mdmreg[REG_PSIZE] * 16; 2946 p[0]++;
2951 break; 2947 switch (isdn_getnum(p)) {
2952 case 1: 2948 case 0:
2953 m->mdmreg[REG_T70] |= BIT_T70; 2949 m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
2954 m->mdmreg[REG_T70] &= ~BIT_T70_EXT; 2950 info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
2955 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I; 2951 break;
2956 info->xmit_size = 112; 2952 case 1:
2957 m->mdmreg[REG_SI1] = 4; 2953 m->mdmreg[REG_T70] |= BIT_T70;
2958 m->mdmreg[REG_SI2] = 0; 2954 m->mdmreg[REG_T70] &= ~BIT_T70_EXT;
2959 break; 2955 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
2960 case 2: 2956 info->xmit_size = 112;
2961 m->mdmreg[REG_T70] |= (BIT_T70 | BIT_T70_EXT); 2957 m->mdmreg[REG_SI1] = 4;
2962 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I; 2958 m->mdmreg[REG_SI2] = 0;
2963 info->xmit_size = 112; 2959 break;
2964 m->mdmreg[REG_SI1] = 4; 2960 case 2:
2965 m->mdmreg[REG_SI2] = 0; 2961 m->mdmreg[REG_T70] |= (BIT_T70 | BIT_T70_EXT);
2966 break; 2962 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
2967 default: 2963 info->xmit_size = 112;
2968 PARSE_ERROR1; 2964 m->mdmreg[REG_SI1] = 4;
2969 } 2965 m->mdmreg[REG_SI2] = 0;
2970 break; 2966 break;
2971 default: 2967 default:
2972 PARSE_ERROR1; 2968 PARSE_ERROR1;
2969 }
2970 break;
2971 default:
2972 PARSE_ERROR1;
2973 } 2973 }
2974 return 0; 2974 return 0;
2975} 2975}
2976 2976
2977static int 2977static int
2978isdn_tty_check_ats(int mreg, int mval, modem_info * info, atemu * m) 2978isdn_tty_check_ats(int mreg, int mval, modem_info *info, atemu *m)
2979{ 2979{
2980 /* Some plausibility checks */ 2980 /* Some plausibility checks */
2981 switch (mreg) { 2981 switch (mreg) {
2982 case REG_L2PROT: 2982 case REG_L2PROT:
2983 if (mval > ISDN_PROTO_L2_MAX) 2983 if (mval > ISDN_PROTO_L2_MAX)
2984 return 1; 2984 return 1;
2985 break; 2985 break;
2986 case REG_PSIZE: 2986 case REG_PSIZE:
2987 if ((mval * 16) > ISDN_SERIAL_XMIT_MAX) 2987 if ((mval * 16) > ISDN_SERIAL_XMIT_MAX)
2988 return 1; 2988 return 1;
2989#ifdef CONFIG_ISDN_AUDIO 2989#ifdef CONFIG_ISDN_AUDIO
2990 if ((m->mdmreg[REG_SI1] & 1) && (mval > VBUFX)) 2990 if ((m->mdmreg[REG_SI1] & 1) && (mval > VBUFX))
2991 return 1;
2992#endif
2993 info->xmit_size = mval * 16;
2994 switch (m->mdmreg[REG_L2PROT]) {
2995 case ISDN_PROTO_L2_V11096:
2996 case ISDN_PROTO_L2_V11019:
2997 case ISDN_PROTO_L2_V11038:
2998 info->xmit_size /= 10;
2999 }
3000 break;
3001 case REG_SI1I:
3002 case REG_PLAN:
3003 case REG_SCREEN:
3004 /* readonly registers */
3005 return 1; 2991 return 1;
2992#endif
2993 info->xmit_size = mval * 16;
2994 switch (m->mdmreg[REG_L2PROT]) {
2995 case ISDN_PROTO_L2_V11096:
2996 case ISDN_PROTO_L2_V11019:
2997 case ISDN_PROTO_L2_V11038:
2998 info->xmit_size /= 10;
2999 }
3000 break;
3001 case REG_SI1I:
3002 case REG_PLAN:
3003 case REG_SCREEN:
3004 /* readonly registers */
3005 return 1;
3006 } 3006 }
3007 return 0; 3007 return 0;
3008} 3008}
@@ -3011,7 +3011,7 @@ isdn_tty_check_ats(int mreg, int mval, modem_info * info, atemu * m)
3011 * Perform ATS command 3011 * Perform ATS command
3012 */ 3012 */
3013static int 3013static int
3014isdn_tty_cmd_ATS(char **p, modem_info * info) 3014isdn_tty_cmd_ATS(char **p, modem_info *info)
3015{ 3015{
3016 atemu *m = &info->emu; 3016 atemu *m = &info->emu;
3017 int bitpos; 3017 int bitpos;
@@ -3023,52 +3023,52 @@ isdn_tty_cmd_ATS(char **p, modem_info * info)
3023 if (mreg < 0 || mreg >= ISDN_MODEM_NUMREG) 3023 if (mreg < 0 || mreg >= ISDN_MODEM_NUMREG)
3024 PARSE_ERROR1; 3024 PARSE_ERROR1;
3025 switch (*p[0]) { 3025 switch (*p[0]) {
3026 case '=':
3027 p[0]++;
3028 mval = isdn_getnum(p);
3029 if (mval < 0 || mval > 255)
3030 PARSE_ERROR1;
3031 if (isdn_tty_check_ats(mreg, mval, info, m))
3032 PARSE_ERROR1;
3033 m->mdmreg[mreg] = mval;
3034 break;
3035 case '.':
3036 /* Set/Clear a single bit */
3037 p[0]++;
3038 bitpos = isdn_getnum(p);
3039 if ((bitpos < 0) || (bitpos > 7))
3040 PARSE_ERROR1;
3041 switch (*p[0]) {
3026 case '=': 3042 case '=':
3027 p[0]++; 3043 p[0]++;
3028 mval = isdn_getnum(p); 3044 bval = isdn_getnum(p);
3029 if (mval < 0 || mval > 255) 3045 if (bval < 0 || bval > 1)
3030 PARSE_ERROR1; 3046 PARSE_ERROR1;
3047 if (bval)
3048 mval = m->mdmreg[mreg] | (1 << bitpos);
3049 else
3050 mval = m->mdmreg[mreg] & ~(1 << bitpos);
3031 if (isdn_tty_check_ats(mreg, mval, info, m)) 3051 if (isdn_tty_check_ats(mreg, mval, info, m))
3032 PARSE_ERROR1; 3052 PARSE_ERROR1;
3033 m->mdmreg[mreg] = mval; 3053 m->mdmreg[mreg] = mval;
3034 break; 3054 break;
3035 case '.':
3036 /* Set/Clear a single bit */
3037 p[0]++;
3038 bitpos = isdn_getnum(p);
3039 if ((bitpos < 0) || (bitpos > 7))
3040 PARSE_ERROR1;
3041 switch (*p[0]) {
3042 case '=':
3043 p[0]++;
3044 bval = isdn_getnum(p);
3045 if (bval < 0 || bval > 1)
3046 PARSE_ERROR1;
3047 if (bval)
3048 mval = m->mdmreg[mreg] | (1 << bitpos);
3049 else
3050 mval = m->mdmreg[mreg] & ~(1 << bitpos);
3051 if (isdn_tty_check_ats(mreg, mval, info, m))
3052 PARSE_ERROR1;
3053 m->mdmreg[mreg] = mval;
3054 break;
3055 case '?':
3056 p[0]++;
3057 isdn_tty_at_cout("\r\n", info);
3058 isdn_tty_at_cout((m->mdmreg[mreg] & (1 << bitpos)) ? "1" : "0",
3059 info);
3060 break;
3061 default:
3062 PARSE_ERROR1;
3063 }
3064 break;
3065 case '?': 3055 case '?':
3066 p[0]++; 3056 p[0]++;
3067 isdn_tty_show_profile(mreg, info); 3057 isdn_tty_at_cout("\r\n", info);
3058 isdn_tty_at_cout((m->mdmreg[mreg] & (1 << bitpos)) ? "1" : "0",
3059 info);
3068 break; 3060 break;
3069 default: 3061 default:
3070 PARSE_ERROR1; 3062 PARSE_ERROR1;
3071 break; 3063 }
3064 break;
3065 case '?':
3066 p[0]++;
3067 isdn_tty_show_profile(mreg, info);
3068 break;
3069 default:
3070 PARSE_ERROR1;
3071 break;
3072 } 3072 }
3073 return 0; 3073 return 0;
3074} 3074}
@@ -3077,7 +3077,7 @@ isdn_tty_cmd_ATS(char **p, modem_info * info)
3077 * Perform ATA command 3077 * Perform ATA command
3078 */ 3078 */
3079static void 3079static void
3080isdn_tty_cmd_ATA(modem_info * info) 3080isdn_tty_cmd_ATA(modem_info *info)
3081{ 3081{
3082 atemu *m = &info->emu; 3082 atemu *m = &info->emu;
3083 isdn_ctrl cmd; 3083 isdn_ctrl cmd;
@@ -3131,7 +3131,7 @@ isdn_tty_cmd_ATA(modem_info * info)
3131 * Parse AT+F.. commands 3131 * Parse AT+F.. commands
3132 */ 3132 */
3133static int 3133static int
3134isdn_tty_cmd_PLUSF(char **p, modem_info * info) 3134isdn_tty_cmd_PLUSF(char **p, modem_info *info)
3135{ 3135{
3136 atemu *m = &info->emu; 3136 atemu *m = &info->emu;
3137 char rs[20]; 3137 char rs[20];
@@ -3139,81 +3139,81 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
3139 if (!strncmp(p[0], "CLASS", 5)) { 3139 if (!strncmp(p[0], "CLASS", 5)) {
3140 p[0] += 5; 3140 p[0] += 5;
3141 switch (*p[0]) { 3141 switch (*p[0]) {
3142 case '?': 3142 case '?':
3143 p[0]++; 3143 p[0]++;
3144 sprintf(rs, "\r\n%d", 3144 sprintf(rs, "\r\n%d",
3145 (m->mdmreg[REG_SI1] & 1) ? 8 : 0); 3145 (m->mdmreg[REG_SI1] & 1) ? 8 : 0);
3146#ifdef CONFIG_ISDN_TTY_FAX 3146#ifdef CONFIG_ISDN_TTY_FAX
3147 if (TTY_IS_FCLASS2(info)) 3147 if (TTY_IS_FCLASS2(info))
3148 sprintf(rs, "\r\n2"); 3148 sprintf(rs, "\r\n2");
3149 else if (TTY_IS_FCLASS1(info)) 3149 else if (TTY_IS_FCLASS1(info))
3150 sprintf(rs, "\r\n1"); 3150 sprintf(rs, "\r\n1");
3151#endif 3151#endif
3152 isdn_tty_at_cout(rs, info); 3152 isdn_tty_at_cout(rs, info);
3153 break; 3153 break;
3154 case '=': 3154 case '=':
3155 p[0]++;
3156 switch (*p[0]) {
3157 case '0':
3155 p[0]++; 3158 p[0]++;
3156 switch (*p[0]) { 3159 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
3157 case '0': 3160 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS;
3158 p[0]++; 3161 m->mdmreg[REG_SI1] = 4;
3159 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I; 3162 info->xmit_size =
3160 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS; 3163 m->mdmreg[REG_PSIZE] * 16;
3161 m->mdmreg[REG_SI1] = 4; 3164 break;
3162 info->xmit_size =
3163 m->mdmreg[REG_PSIZE] * 16;
3164 break;
3165#ifdef CONFIG_ISDN_TTY_FAX 3165#ifdef CONFIG_ISDN_TTY_FAX
3166 case '1': 3166 case '1':
3167 p[0]++; 3167 p[0]++;
3168 if (!(dev->global_features & 3168 if (!(dev->global_features &
3169 ISDN_FEATURE_L3_FCLASS1)) 3169 ISDN_FEATURE_L3_FCLASS1))
3170 PARSE_ERROR1; 3170 PARSE_ERROR1;
3171 m->mdmreg[REG_SI1] = 1; 3171 m->mdmreg[REG_SI1] = 1;
3172 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX; 3172 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX;
3173 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS1; 3173 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS1;
3174 info->xmit_size = 3174 info->xmit_size =
3175 m->mdmreg[REG_PSIZE] * 16; 3175 m->mdmreg[REG_PSIZE] * 16;
3176 break; 3176 break;
3177 case '2': 3177 case '2':
3178 p[0]++; 3178 p[0]++;
3179 if (!(dev->global_features & 3179 if (!(dev->global_features &
3180 ISDN_FEATURE_L3_FCLASS2)) 3180 ISDN_FEATURE_L3_FCLASS2))
3181 PARSE_ERROR1; 3181 PARSE_ERROR1;
3182 m->mdmreg[REG_SI1] = 1; 3182 m->mdmreg[REG_SI1] = 1;
3183 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX; 3183 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX;
3184 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS2; 3184 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS2;
3185 info->xmit_size = 3185 info->xmit_size =
3186 m->mdmreg[REG_PSIZE] * 16; 3186 m->mdmreg[REG_PSIZE] * 16;
3187 break; 3187 break;
3188#endif 3188#endif
3189 case '8': 3189 case '8':
3190 p[0]++; 3190 p[0]++;
3191 /* L2 will change on dialout with si=1 */ 3191 /* L2 will change on dialout with si=1 */
3192 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I; 3192 m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
3193 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS; 3193 m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS;
3194 m->mdmreg[REG_SI1] = 5; 3194 m->mdmreg[REG_SI1] = 5;
3195 info->xmit_size = VBUF; 3195 info->xmit_size = VBUF;
3196 break; 3196 break;
3197 case '?': 3197 case '?':
3198 p[0]++; 3198 p[0]++;
3199 strcpy(rs, "\r\n0,"); 3199 strcpy(rs, "\r\n0,");
3200#ifdef CONFIG_ISDN_TTY_FAX 3200#ifdef CONFIG_ISDN_TTY_FAX
3201 if (dev->global_features & 3201 if (dev->global_features &
3202 ISDN_FEATURE_L3_FCLASS1) 3202 ISDN_FEATURE_L3_FCLASS1)
3203 strcat(rs, "1,"); 3203 strcat(rs, "1,");
3204 if (dev->global_features & 3204 if (dev->global_features &
3205 ISDN_FEATURE_L3_FCLASS2) 3205 ISDN_FEATURE_L3_FCLASS2)
3206 strcat(rs, "2,"); 3206 strcat(rs, "2,");
3207#endif 3207#endif
3208 strcat(rs, "8"); 3208 strcat(rs, "8");
3209 isdn_tty_at_cout(rs, info); 3209 isdn_tty_at_cout(rs, info);
3210 break;
3211 default:
3212 PARSE_ERROR1;
3213 }
3214 break; 3210 break;
3215 default: 3211 default:
3216 PARSE_ERROR1; 3212 PARSE_ERROR1;
3213 }
3214 break;
3215 default:
3216 PARSE_ERROR1;
3217 } 3217 }
3218 return 0; 3218 return 0;
3219 } 3219 }
@@ -3228,12 +3228,12 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
3228 * Parse AT+V.. commands 3228 * Parse AT+V.. commands
3229 */ 3229 */
3230static int 3230static int
3231isdn_tty_cmd_PLUSV(char **p, modem_info * info) 3231isdn_tty_cmd_PLUSV(char **p, modem_info *info)
3232{ 3232{
3233 atemu *m = &info->emu; 3233 atemu *m = &info->emu;
3234 isdn_ctrl cmd; 3234 isdn_ctrl cmd;
3235 static char *vcmd[] = 3235 static char *vcmd[] =
3236 {"NH", "IP", "LS", "RX", "SD", "SM", "TX", "DD", NULL}; 3236 {"NH", "IP", "LS", "RX", "SD", "SM", "TX", "DD", NULL};
3237 int i; 3237 int i;
3238 int par1; 3238 int par1;
3239 int par2; 3239 int par2;
@@ -3248,256 +3248,256 @@ isdn_tty_cmd_PLUSV(char **p, modem_info * info)
3248 i++; 3248 i++;
3249 } 3249 }
3250 switch (i) { 3250 switch (i) {
3251 case 0: 3251 case 0:
3252 /* AT+VNH - Auto hangup feature */ 3252 /* AT+VNH - Auto hangup feature */
3253 switch (*p[0]) {
3254 case '?':
3255 p[0]++;
3256 isdn_tty_at_cout("\r\n1", info);
3257 break;
3258 case '=':
3259 p[0]++;
3253 switch (*p[0]) { 3260 switch (*p[0]) {
3254 case '?': 3261 case '1':
3255 p[0]++; 3262 p[0]++;
3256 isdn_tty_at_cout("\r\n1", info); 3263 break;
3257 break; 3264 case '?':
3258 case '=': 3265 p[0]++;
3259 p[0]++; 3266 isdn_tty_at_cout("\r\n1", info);
3260 switch (*p[0]) { 3267 break;
3261 case '1': 3268 default:
3262 p[0]++; 3269 PARSE_ERROR1;
3263 break;
3264 case '?':
3265 p[0]++;
3266 isdn_tty_at_cout("\r\n1", info);
3267 break;
3268 default:
3269 PARSE_ERROR1;
3270 }
3271 break;
3272 default:
3273 PARSE_ERROR1;
3274 } 3270 }
3275 break; 3271 break;
3276 case 1: 3272 default:
3277 /* AT+VIP - Reset all voice parameters */ 3273 PARSE_ERROR1;
3278 isdn_tty_modem_reset_vpar(m); 3274 }
3275 break;
3276 case 1:
3277 /* AT+VIP - Reset all voice parameters */
3278 isdn_tty_modem_reset_vpar(m);
3279 break;
3280 case 2:
3281 /* AT+VLS - Select device, accept incoming call */
3282 switch (*p[0]) {
3283 case '?':
3284 p[0]++;
3285 sprintf(rs, "\r\n%d", m->vpar[0]);
3286 isdn_tty_at_cout(rs, info);
3279 break; 3287 break;
3280 case 2: 3288 case '=':
3281 /* AT+VLS - Select device, accept incoming call */ 3289 p[0]++;
3282 switch (*p[0]) { 3290 switch (*p[0]) {
3283 case '?': 3291 case '0':
3284 p[0]++; 3292 p[0]++;
3285 sprintf(rs, "\r\n%d", m->vpar[0]); 3293 m->vpar[0] = 0;
3286 isdn_tty_at_cout(rs, info); 3294 break;
3287 break; 3295 case '2':
3288 case '=': 3296 p[0]++;
3289 p[0]++; 3297 m->vpar[0] = 2;
3290 switch (*p[0]) { 3298 break;
3291 case '0': 3299 case '?':
3292 p[0]++; 3300 p[0]++;
3293 m->vpar[0] = 0; 3301 isdn_tty_at_cout("\r\n0,2", info);
3294 break; 3302 break;
3295 case '2': 3303 default:
3296 p[0]++;
3297 m->vpar[0] = 2;
3298 break;
3299 case '?':
3300 p[0]++;
3301 isdn_tty_at_cout("\r\n0,2", info);
3302 break;
3303 default:
3304 PARSE_ERROR1;
3305 }
3306 break;
3307 default:
3308 PARSE_ERROR1;
3309 }
3310 break;
3311 case 3:
3312 /* AT+VRX - Start recording */
3313 if (!m->vpar[0])
3314 PARSE_ERROR1;
3315 if (info->online != 1) {
3316 isdn_tty_modem_result(RESULT_NO_ANSWER, info);
3317 return 1;
3318 }
3319 info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
3320 if (!info->dtmf_state) {
3321 printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
3322 PARSE_ERROR1; 3304 PARSE_ERROR1;
3323 } 3305 }
3324 info->silence_state = isdn_audio_silence_init(info->silence_state); 3306 break;
3325 if (!info->silence_state) { 3307 default:
3326 printk(KERN_WARNING "isdn_tty: Couldn't malloc silence state\n"); 3308 PARSE_ERROR1;
3309 }
3310 break;
3311 case 3:
3312 /* AT+VRX - Start recording */
3313 if (!m->vpar[0])
3314 PARSE_ERROR1;
3315 if (info->online != 1) {
3316 isdn_tty_modem_result(RESULT_NO_ANSWER, info);
3317 return 1;
3318 }
3319 info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
3320 if (!info->dtmf_state) {
3321 printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
3322 PARSE_ERROR1;
3323 }
3324 info->silence_state = isdn_audio_silence_init(info->silence_state);
3325 if (!info->silence_state) {
3326 printk(KERN_WARNING "isdn_tty: Couldn't malloc silence state\n");
3327 PARSE_ERROR1;
3328 }
3329 if (m->vpar[3] < 5) {
3330 info->adpcmr = isdn_audio_adpcm_init(info->adpcmr, m->vpar[3]);
3331 if (!info->adpcmr) {
3332 printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
3327 PARSE_ERROR1; 3333 PARSE_ERROR1;
3328 } 3334 }
3329 if (m->vpar[3] < 5) { 3335 }
3330 info->adpcmr = isdn_audio_adpcm_init(info->adpcmr, m->vpar[3]);
3331 if (!info->adpcmr) {
3332 printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
3333 PARSE_ERROR1;
3334 }
3335 }
3336#ifdef ISDN_DEBUG_AT 3336#ifdef ISDN_DEBUG_AT
3337 printk(KERN_DEBUG "AT: +VRX\n"); 3337 printk(KERN_DEBUG "AT: +VRX\n");
3338#endif 3338#endif
3339 info->vonline |= 1; 3339 info->vonline |= 1;
3340 isdn_tty_modem_result(RESULT_CONNECT, info); 3340 isdn_tty_modem_result(RESULT_CONNECT, info);
3341 return 0; 3341 return 0;
3342 break;
3343 case 4:
3344 /* AT+VSD - Silence detection */
3345 switch (*p[0]) {
3346 case '?':
3347 p[0]++;
3348 sprintf(rs, "\r\n<%d>,<%d>",
3349 m->vpar[1],
3350 m->vpar[2]);
3351 isdn_tty_at_cout(rs, info);
3342 break; 3352 break;
3343 case 4: 3353 case '=':
3344 /* AT+VSD - Silence detection */ 3354 p[0]++;
3345 switch (*p[0]) { 3355 if ((*p[0] >= '0') && (*p[0] <= '9')) {
3346 case '?': 3356 par1 = isdn_getnum(p);
3347 p[0]++; 3357 if ((par1 < 0) || (par1 > 31))
3348 sprintf(rs, "\r\n<%d>,<%d>",
3349 m->vpar[1],
3350 m->vpar[2]);
3351 isdn_tty_at_cout(rs, info);
3352 break;
3353 case '=':
3354 p[0]++;
3355 if ((*p[0]>='0') && (*p[0]<='9')) {
3356 par1 = isdn_getnum(p);
3357 if ((par1 < 0) || (par1 > 31))
3358 PARSE_ERROR1;
3359 if (*p[0] != ',')
3360 PARSE_ERROR1;
3361 p[0]++;
3362 par2 = isdn_getnum(p);
3363 if ((par2 < 0) || (par2 > 255))
3364 PARSE_ERROR1;
3365 m->vpar[1] = par1;
3366 m->vpar[2] = par2;
3367 break;
3368 } else
3369 if (*p[0] == '?') {
3370 p[0]++;
3371 isdn_tty_at_cout("\r\n<0-31>,<0-255>",
3372 info);
3373 break;
3374 } else
3375 PARSE_ERROR1; 3358 PARSE_ERROR1;
3376 break; 3359 if (*p[0] != ',')
3377 default:
3378 PARSE_ERROR1; 3360 PARSE_ERROR1;
3379 } 3361 p[0]++;
3380 break; 3362 par2 = isdn_getnum(p);
3381 case 5: 3363 if ((par2 < 0) || (par2 > 255))
3382 /* AT+VSM - Select compression */ 3364 PARSE_ERROR1;
3383 switch (*p[0]) { 3365 m->vpar[1] = par1;
3384 case '?': 3366 m->vpar[2] = par2;
3385 p[0]++; 3367 break;
3386 sprintf(rs, "\r\n<%d>,<%d><8000>", 3368 } else
3387 m->vpar[3], 3369 if (*p[0] == '?') {
3388 m->vpar[1]);
3389 isdn_tty_at_cout(rs, info);
3390 break;
3391 case '=':
3392 p[0]++; 3370 p[0]++;
3393 switch (*p[0]) { 3371 isdn_tty_at_cout("\r\n<0-31>,<0-255>",
3394 case '2': 3372 info);
3395 case '3':
3396 case '4':
3397 case '5':
3398 case '6':
3399 par1 = isdn_getnum(p);
3400 if ((par1 < 2) || (par1 > 6))
3401 PARSE_ERROR1;
3402 m->vpar[3] = par1;
3403 break;
3404 case '?':
3405 p[0]++;
3406 isdn_tty_at_cout("\r\n2;ADPCM;2;0;(8000)\r\n",
3407 info);
3408 isdn_tty_at_cout("3;ADPCM;3;0;(8000)\r\n",
3409 info);
3410 isdn_tty_at_cout("4;ADPCM;4;0;(8000)\r\n",
3411 info);
3412 isdn_tty_at_cout("5;ALAW;8;0;(8000)\r\n",
3413 info);
3414 isdn_tty_at_cout("6;ULAW;8;0;(8000)\r\n",
3415 info);
3416 break;
3417 default:
3418 PARSE_ERROR1;
3419 }
3420 break; 3373 break;
3421 default: 3374 } else
3422 PARSE_ERROR1; 3375 PARSE_ERROR1;
3423 }
3424 break; 3376 break;
3425 case 6: 3377 default:
3426 /* AT+VTX - Start sending */ 3378 PARSE_ERROR1;
3427 if (!m->vpar[0]) 3379 }
3380 break;
3381 case 5:
3382 /* AT+VSM - Select compression */
3383 switch (*p[0]) {
3384 case '?':
3385 p[0]++;
3386 sprintf(rs, "\r\n<%d>,<%d><8000>",
3387 m->vpar[3],
3388 m->vpar[1]);
3389 isdn_tty_at_cout(rs, info);
3390 break;
3391 case '=':
3392 p[0]++;
3393 switch (*p[0]) {
3394 case '2':
3395 case '3':
3396 case '4':
3397 case '5':
3398 case '6':
3399 par1 = isdn_getnum(p);
3400 if ((par1 < 2) || (par1 > 6))
3401 PARSE_ERROR1;
3402 m->vpar[3] = par1;
3403 break;
3404 case '?':
3405 p[0]++;
3406 isdn_tty_at_cout("\r\n2;ADPCM;2;0;(8000)\r\n",
3407 info);
3408 isdn_tty_at_cout("3;ADPCM;3;0;(8000)\r\n",
3409 info);
3410 isdn_tty_at_cout("4;ADPCM;4;0;(8000)\r\n",
3411 info);
3412 isdn_tty_at_cout("5;ALAW;8;0;(8000)\r\n",
3413 info);
3414 isdn_tty_at_cout("6;ULAW;8;0;(8000)\r\n",
3415 info);
3416 break;
3417 default:
3428 PARSE_ERROR1; 3418 PARSE_ERROR1;
3429 if (info->online != 1) {
3430 isdn_tty_modem_result(RESULT_NO_ANSWER, info);
3431 return 1;
3432 } 3419 }
3433 info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state); 3420 break;
3434 if (!info->dtmf_state) { 3421 default:
3435 printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n"); 3422 PARSE_ERROR1;
3423 }
3424 break;
3425 case 6:
3426 /* AT+VTX - Start sending */
3427 if (!m->vpar[0])
3428 PARSE_ERROR1;
3429 if (info->online != 1) {
3430 isdn_tty_modem_result(RESULT_NO_ANSWER, info);
3431 return 1;
3432 }
3433 info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
3434 if (!info->dtmf_state) {
3435 printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
3436 PARSE_ERROR1;
3437 }
3438 if (m->vpar[3] < 5) {
3439 info->adpcms = isdn_audio_adpcm_init(info->adpcms, m->vpar[3]);
3440 if (!info->adpcms) {
3441 printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
3436 PARSE_ERROR1; 3442 PARSE_ERROR1;
3437 } 3443 }
3438 if (m->vpar[3] < 5) { 3444 }
3439 info->adpcms = isdn_audio_adpcm_init(info->adpcms, m->vpar[3]);
3440 if (!info->adpcms) {
3441 printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
3442 PARSE_ERROR1;
3443 }
3444 }
3445#ifdef ISDN_DEBUG_AT 3445#ifdef ISDN_DEBUG_AT
3446 printk(KERN_DEBUG "AT: +VTX\n"); 3446 printk(KERN_DEBUG "AT: +VTX\n");
3447#endif 3447#endif
3448 m->lastDLE = 0; 3448 m->lastDLE = 0;
3449 info->vonline |= 2; 3449 info->vonline |= 2;
3450 isdn_tty_modem_result(RESULT_CONNECT, info); 3450 isdn_tty_modem_result(RESULT_CONNECT, info);
3451 return 0; 3451 return 0;
3452 break;
3453 case 7:
3454 /* AT+VDD - DTMF detection */
3455 switch (*p[0]) {
3456 case '?':
3457 p[0]++;
3458 sprintf(rs, "\r\n<%d>,<%d>",
3459 m->vpar[4],
3460 m->vpar[5]);
3461 isdn_tty_at_cout(rs, info);
3452 break; 3462 break;
3453 case 7: 3463 case '=':
3454 /* AT+VDD - DTMF detection */ 3464 p[0]++;
3455 switch (*p[0]) { 3465 if ((*p[0] >= '0') && (*p[0] <= '9')) {
3456 case '?': 3466 if (info->online != 1)
3457 p[0]++;
3458 sprintf(rs, "\r\n<%d>,<%d>",
3459 m->vpar[4],
3460 m->vpar[5]);
3461 isdn_tty_at_cout(rs, info);
3462 break;
3463 case '=':
3464 p[0]++;
3465 if ((*p[0]>='0') && (*p[0]<='9')) {
3466 if (info->online != 1)
3467 PARSE_ERROR1;
3468 par1 = isdn_getnum(p);
3469 if ((par1 < 0) || (par1 > 15))
3470 PARSE_ERROR1;
3471 if (*p[0] != ',')
3472 PARSE_ERROR1;
3473 p[0]++;
3474 par2 = isdn_getnum(p);
3475 if ((par2 < 0) || (par2 > 255))
3476 PARSE_ERROR1;
3477 m->vpar[4] = par1;
3478 m->vpar[5] = par2;
3479 cmd.driver = info->isdn_driver;
3480 cmd.command = ISDN_CMD_AUDIO;
3481 cmd.arg = info->isdn_channel + (ISDN_AUDIO_SETDD << 8);
3482 cmd.parm.num[0] = par1;
3483 cmd.parm.num[1] = par2;
3484 isdn_command(&cmd);
3485 break;
3486 } else
3487 if (*p[0] == '?') {
3488 p[0]++;
3489 isdn_tty_at_cout("\r\n<0-15>,<0-255>",
3490 info);
3491 break;
3492 } else
3493 PARSE_ERROR1; 3467 PARSE_ERROR1;
3468 par1 = isdn_getnum(p);
3469 if ((par1 < 0) || (par1 > 15))
3470 PARSE_ERROR1;
3471 if (*p[0] != ',')
3472 PARSE_ERROR1;
3473 p[0]++;
3474 par2 = isdn_getnum(p);
3475 if ((par2 < 0) || (par2 > 255))
3476 PARSE_ERROR1;
3477 m->vpar[4] = par1;
3478 m->vpar[5] = par2;
3479 cmd.driver = info->isdn_driver;
3480 cmd.command = ISDN_CMD_AUDIO;
3481 cmd.arg = info->isdn_channel + (ISDN_AUDIO_SETDD << 8);
3482 cmd.parm.num[0] = par1;
3483 cmd.parm.num[1] = par2;
3484 isdn_command(&cmd);
3485 break;
3486 } else
3487 if (*p[0] == '?') {
3488 p[0]++;
3489 isdn_tty_at_cout("\r\n<0-15>,<0-255>",
3490 info);
3494 break; 3491 break;
3495 default: 3492 } else
3496 PARSE_ERROR1; 3493 PARSE_ERROR1;
3497 }
3498 break; 3494 break;
3499 default: 3495 default:
3500 PARSE_ERROR1; 3496 PARSE_ERROR1;
3497 }
3498 break;
3499 default:
3500 PARSE_ERROR1;
3501 } 3501 }
3502 return 0; 3502 return 0;
3503} 3503}
@@ -3507,7 +3507,7 @@ isdn_tty_cmd_PLUSV(char **p, modem_info * info)
3507 * Parse and perform an AT-command-line. 3507 * Parse and perform an AT-command-line.
3508 */ 3508 */
3509static void 3509static void
3510isdn_tty_parse_at(modem_info * info) 3510isdn_tty_parse_at(modem_info *info)
3511{ 3511{
3512 atemu *m = &info->emu; 3512 atemu *m = &info->emu;
3513 char *p; 3513 char *p;
@@ -3518,188 +3518,188 @@ isdn_tty_parse_at(modem_info * info)
3518#endif 3518#endif
3519 for (p = &m->mdmcmd[2]; *p;) { 3519 for (p = &m->mdmcmd[2]; *p;) {
3520 switch (*p) { 3520 switch (*p) {
3521 case ' ': 3521 case ' ':
3522 p++; 3522 p++;
3523 break;
3524 case 'A':
3525 /* A - Accept incoming call */
3526 p++;
3527 isdn_tty_cmd_ATA(info);
3528 return;
3529 break;
3530 case 'D':
3531 /* D - Dial */
3532 if (info->msr & UART_MSR_DCD)
3533 PARSE_ERROR;
3534 if (info->msr & UART_MSR_RI) {
3535 isdn_tty_modem_result(RESULT_NO_CARRIER, info);
3536 return;
3537 }
3538 isdn_tty_getdial(++p, ds, sizeof ds);
3539 p += strlen(p);
3540 if (!strlen(m->msn))
3541 isdn_tty_modem_result(RESULT_NO_MSN_EAZ, info);
3542 else if (strlen(ds))
3543 isdn_tty_dial(ds, info, m);
3544 else
3545 PARSE_ERROR;
3546 return;
3547 case 'E':
3548 /* E - Turn Echo on/off */
3549 p++;
3550 switch (isdn_getnum(&p)) {
3551 case 0:
3552 m->mdmreg[REG_ECHO] &= ~BIT_ECHO;
3523 break; 3553 break;
3524 case 'A': 3554 case 1:
3525 /* A - Accept incoming call */ 3555 m->mdmreg[REG_ECHO] |= BIT_ECHO;
3556 break;
3557 default:
3558 PARSE_ERROR;
3559 }
3560 break;
3561 case 'H':
3562 /* H - On/Off-hook */
3563 p++;
3564 switch (*p) {
3565 case '0':
3526 p++; 3566 p++;
3527 isdn_tty_cmd_ATA(info); 3567 isdn_tty_on_hook(info);
3528 return;
3529 break; 3568 break;
3530 case 'D': 3569 case '1':
3531 /* D - Dial */
3532 if (info->msr & UART_MSR_DCD)
3533 PARSE_ERROR;
3534 if (info->msr & UART_MSR_RI) {
3535 isdn_tty_modem_result(RESULT_NO_CARRIER, info);
3536 return;
3537 }
3538 isdn_tty_getdial(++p, ds, sizeof ds);
3539 p += strlen(p);
3540 if (!strlen(m->msn))
3541 isdn_tty_modem_result(RESULT_NO_MSN_EAZ, info);
3542 else if (strlen(ds))
3543 isdn_tty_dial(ds, info, m);
3544 else
3545 PARSE_ERROR;
3546 return;
3547 case 'E':
3548 /* E - Turn Echo on/off */
3549 p++; 3570 p++;
3550 switch (isdn_getnum(&p)) { 3571 isdn_tty_off_hook();
3551 case 0:
3552 m->mdmreg[REG_ECHO] &= ~BIT_ECHO;
3553 break;
3554 case 1:
3555 m->mdmreg[REG_ECHO] |= BIT_ECHO;
3556 break;
3557 default:
3558 PARSE_ERROR;
3559 }
3560 break; 3572 break;
3561 case 'H': 3573 default:
3562 /* H - On/Off-hook */ 3574 isdn_tty_on_hook(info);
3575 break;
3576 }
3577 break;
3578 case 'I':
3579 /* I - Information */
3580 p++;
3581 isdn_tty_at_cout("\r\nLinux ISDN", info);
3582 switch (*p) {
3583 case '0':
3584 case '1':
3563 p++; 3585 p++;
3564 switch (*p) {
3565 case '0':
3566 p++;
3567 isdn_tty_on_hook(info);
3568 break;
3569 case '1':
3570 p++;
3571 isdn_tty_off_hook();
3572 break;
3573 default:
3574 isdn_tty_on_hook(info);
3575 break;
3576 }
3577 break; 3586 break;
3578 case 'I': 3587 case '2':
3579 /* I - Information */
3580 p++; 3588 p++;
3581 isdn_tty_at_cout("\r\nLinux ISDN", info); 3589 isdn_tty_report(info);
3582 switch (*p) {
3583 case '0':
3584 case '1':
3585 p++;
3586 break;
3587 case '2':
3588 p++;
3589 isdn_tty_report(info);
3590 break;
3591 case '3':
3592 p++;
3593 snprintf(ds, sizeof(ds), "\r\n%d", info->emu.charge);
3594 isdn_tty_at_cout(ds, info);
3595 break;
3596 default:;
3597 }
3598 break; 3590 break;
3599#ifdef DUMMY_HAYES_AT 3591 case '3':
3600 case 'L':
3601 case 'M':
3602 /* only for be compilant with common scripts */
3603 /* no function */
3604 p++; 3592 p++;
3605 isdn_getnum(&p); 3593 snprintf(ds, sizeof(ds), "\r\n%d", info->emu.charge);
3594 isdn_tty_at_cout(ds, info);
3606 break; 3595 break;
3596 default:;
3597 }
3598 break;
3599#ifdef DUMMY_HAYES_AT
3600 case 'L':
3601 case 'M':
3602 /* only for be compilant with common scripts */
3603 /* no function */
3604 p++;
3605 isdn_getnum(&p);
3606 break;
3607#endif 3607#endif
3608 case 'O': 3608 case 'O':
3609 /* O - Go online */ 3609 /* O - Go online */
3610 p++; 3610 p++;
3611 if (info->msr & UART_MSR_DCD) 3611 if (info->msr & UART_MSR_DCD)
3612 /* if B-Channel is up */ 3612 /* if B-Channel is up */
3613 isdn_tty_modem_result((m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) ? RESULT_CONNECT:RESULT_CONNECT64000, info); 3613 isdn_tty_modem_result((m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) ? RESULT_CONNECT : RESULT_CONNECT64000, info);
3614 else 3614 else
3615 isdn_tty_modem_result(RESULT_NO_CARRIER, info); 3615 isdn_tty_modem_result(RESULT_NO_CARRIER, info);
3616 return;
3617 case 'Q':
3618 /* Q - Turn Emulator messages on/off */
3619 p++;
3620 switch (isdn_getnum(&p)) {
3621 case 0:
3622 m->mdmreg[REG_RESP] |= BIT_RESP;
3623 break;
3624 case 1:
3625 m->mdmreg[REG_RESP] &= ~BIT_RESP;
3626 break;
3627 default:
3628 PARSE_ERROR;
3629 }
3630 break;
3631 case 'S':
3632 /* S - Set/Get Register */
3633 p++;
3634 if (isdn_tty_cmd_ATS(&p, info))
3616 return; 3635 return;
3617 case 'Q': 3636 break;
3618 /* Q - Turn Emulator messages on/off */ 3637 case 'V':
3619 p++; 3638 /* V - Numeric or ASCII Emulator-messages */
3620 switch (isdn_getnum(&p)) { 3639 p++;
3621 case 0: 3640 switch (isdn_getnum(&p)) {
3622 m->mdmreg[REG_RESP] |= BIT_RESP; 3641 case 0:
3623 break; 3642 m->mdmreg[REG_RESP] |= BIT_RESPNUM;
3624 case 1: 3643 break;
3625 m->mdmreg[REG_RESP] &= ~BIT_RESP; 3644 case 1:
3626 break; 3645 m->mdmreg[REG_RESP] &= ~BIT_RESPNUM;
3627 default:
3628 PARSE_ERROR;
3629 }
3630 break; 3646 break;
3631 case 'S': 3647 default:
3632 /* S - Set/Get Register */ 3648 PARSE_ERROR;
3649 }
3650 break;
3651 case 'Z':
3652 /* Z - Load Registers from Profile */
3653 p++;
3654 if (info->msr & UART_MSR_DCD) {
3655 info->online = 0;
3656 isdn_tty_on_hook(info);
3657 }
3658 isdn_tty_modem_reset_regs(info, 1);
3659 break;
3660 case '+':
3661 p++;
3662 switch (*p) {
3663#ifdef CONFIG_ISDN_AUDIO
3664 case 'F':
3633 p++; 3665 p++;
3634 if (isdn_tty_cmd_ATS(&p, info)) 3666 if (isdn_tty_cmd_PLUSF(&p, info))
3635 return; 3667 return;
3636 break; 3668 break;
3637 case 'V': 3669 case 'V':
3638 /* V - Numeric or ASCII Emulator-messages */ 3670 if ((!(m->mdmreg[REG_SI1] & 1)) ||
3671 (m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM))
3672 PARSE_ERROR;
3639 p++; 3673 p++;
3640 switch (isdn_getnum(&p)) { 3674 if (isdn_tty_cmd_PLUSV(&p, info))
3641 case 0: 3675 return;
3642 m->mdmreg[REG_RESP] |= BIT_RESPNUM;
3643 break;
3644 case 1:
3645 m->mdmreg[REG_RESP] &= ~BIT_RESPNUM;
3646 break;
3647 default:
3648 PARSE_ERROR;
3649 }
3650 break; 3676 break;
3651 case 'Z': 3677#endif /* CONFIG_ISDN_AUDIO */
3652 /* Z - Load Registers from Profile */ 3678 case 'S': /* SUSPEND */
3653 p++; 3679 p++;
3654 if (info->msr & UART_MSR_DCD) { 3680 isdn_tty_get_msnstr(ds, &p);
3655 info->online = 0; 3681 isdn_tty_suspend(ds, info, m);
3656 isdn_tty_on_hook(info);
3657 }
3658 isdn_tty_modem_reset_regs(info, 1);
3659 break; 3682 break;
3660 case '+': 3683 case 'R': /* RESUME */
3661 p++; 3684 p++;
3662 switch (*p) { 3685 isdn_tty_get_msnstr(ds, &p);
3663#ifdef CONFIG_ISDN_AUDIO 3686 isdn_tty_resume(ds, info, m);
3664 case 'F':
3665 p++;
3666 if (isdn_tty_cmd_PLUSF(&p, info))
3667 return;
3668 break;
3669 case 'V':
3670 if ((!(m->mdmreg[REG_SI1] & 1)) ||
3671 (m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM))
3672 PARSE_ERROR;
3673 p++;
3674 if (isdn_tty_cmd_PLUSV(&p, info))
3675 return;
3676 break;
3677#endif /* CONFIG_ISDN_AUDIO */
3678 case 'S': /* SUSPEND */
3679 p++;
3680 isdn_tty_get_msnstr(ds, &p);
3681 isdn_tty_suspend(ds, info, m);
3682 break;
3683 case 'R': /* RESUME */
3684 p++;
3685 isdn_tty_get_msnstr(ds, &p);
3686 isdn_tty_resume(ds, info, m);
3687 break;
3688 case 'M': /* MESSAGE */
3689 p++;
3690 isdn_tty_send_msg(info, m, p);
3691 break;
3692 default:
3693 PARSE_ERROR;
3694 }
3695 break; 3687 break;
3696 case '&': 3688 case 'M': /* MESSAGE */
3697 p++; 3689 p++;
3698 if (isdn_tty_cmd_ATand(&p, info)) 3690 isdn_tty_send_msg(info, m, p);
3699 return;
3700 break; 3691 break;
3701 default: 3692 default:
3702 PARSE_ERROR; 3693 PARSE_ERROR;
3694 }
3695 break;
3696 case '&':
3697 p++;
3698 if (isdn_tty_cmd_ATand(&p, info))
3699 return;
3700 break;
3701 default:
3702 PARSE_ERROR;
3703 } 3703 }
3704 } 3704 }
3705#ifdef CONFIG_ISDN_AUDIO 3705#ifdef CONFIG_ISDN_AUDIO
@@ -3711,7 +3711,7 @@ isdn_tty_parse_at(modem_info * info)
3711/* Need own toupper() because standard-toupper is not available 3711/* Need own toupper() because standard-toupper is not available
3712 * within modules. 3712 * within modules.
3713 */ 3713 */
3714#define my_toupper(c) (((c>='a')&&(c<='z'))?(c&0xdf):c) 3714#define my_toupper(c) (((c >= 'a') && (c <= 'z')) ? (c & 0xdf) : c)
3715 3715
3716/* 3716/*
3717 * Perform line-editing of AT-commands 3717 * Perform line-editing of AT-commands
@@ -3722,7 +3722,7 @@ isdn_tty_parse_at(modem_info * info)
3722 * channel index to line (minor-device) 3722 * channel index to line (minor-device)
3723 */ 3723 */
3724static int 3724static int
3725isdn_tty_edit_at(const char *p, int count, modem_info * info) 3725isdn_tty_edit_at(const char *p, int count, modem_info *info)
3726{ 3726{
3727 atemu *m = &info->emu; 3727 atemu *m = &info->emu;
3728 int total = 0; 3728 int total = 0;
@@ -3765,23 +3765,23 @@ isdn_tty_edit_at(const char *p, int count, modem_info * info)
3765 if (m->mdmcmdl < 255) { 3765 if (m->mdmcmdl < 255) {
3766 c = my_toupper(c); 3766 c = my_toupper(c);
3767 switch (m->mdmcmdl) { 3767 switch (m->mdmcmdl) {
3768 case 1: 3768 case 1:
3769 if (c == 'T') { 3769 if (c == 'T') {
3770 m->mdmcmd[m->mdmcmdl] = c; 3770 m->mdmcmd[m->mdmcmdl] = c;
3771 m->mdmcmd[++m->mdmcmdl] = 0; 3771 m->mdmcmd[++m->mdmcmdl] = 0;
3772 break;
3773 } else
3774 m->mdmcmdl = 0;
3775 /* Fall through, check for 'A' */
3776 case 0:
3777 if (c == 'A') {
3778 m->mdmcmd[m->mdmcmdl] = c;
3779 m->mdmcmd[++m->mdmcmdl] = 0;
3780 }
3781 break; 3772 break;
3782 default: 3773 } else
3774 m->mdmcmdl = 0;
3775 /* Fall through, check for 'A' */
3776 case 0:
3777 if (c == 'A') {
3783 m->mdmcmd[m->mdmcmdl] = c; 3778 m->mdmcmd[m->mdmcmdl] = c;
3784 m->mdmcmd[++m->mdmcmdl] = 0; 3779 m->mdmcmd[++m->mdmcmdl] = 0;
3780 }
3781 break;
3782 default:
3783 m->mdmcmd[m->mdmcmdl] = c;
3784 m->mdmcmd[++m->mdmcmdl] = 0;
3785 } 3785 }
3786 } 3786 }
3787 } 3787 }