diff options
Diffstat (limited to 'drivers/isdn/isdn_tty.c')
-rw-r--r-- | drivers/isdn/isdn_tty.c | 108 |
1 files changed, 92 insertions, 16 deletions
diff --git a/drivers/isdn/isdn_tty.c b/drivers/isdn/isdn_tty.c index 5b301adb9..0503c67a2 100644 --- a/drivers/isdn/isdn_tty.c +++ b/drivers/isdn/isdn_tty.c @@ -1,4 +1,4 @@ -/* $Id: isdn_tty.c,v 1.80 1999/11/07 13:34:30 armin Exp $ +/* $Id: isdn_tty.c,v 1.82 2000/01/23 18:45:37 keil Exp $ * Linux ISDN subsystem, tty functions and AT-command emulator (linklevel). * @@ -20,6 +20,12 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: isdn_tty.c,v $ + * Revision 1.82 2000/01/23 18:45:37 keil + * Change EAZ mapping to forbit the use of cards (insert a "-" for the MSN) + * + * Revision 1.81 2000/01/20 19:55:33 keil + * Add FAX Class 1 support + * * Revision 1.80 1999/11/07 13:34:30 armin * Fixed AT command line editor * @@ -348,6 +354,7 @@ #endif #define FIX_FILE_TRANSFER +#define DUMMY_HAYES_AT /* Prototypes */ @@ -372,7 +379,7 @@ static int bit2si[8] = static int si2bit[8] = {4, 1, 4, 4, 4, 4, 4, 4}; -char *isdn_tty_revision = "$Revision: 1.80 $"; +char *isdn_tty_revision = "$Revision: 1.82 $"; /* isdn_tty_try_read() is called from within isdn_tty_rcv_skb() @@ -976,7 +983,7 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m) m->mdmreg[REG_SI1I] = si2bit[si]; save_flags(flags); cli(); - i = isdn_get_free_channel(usg, l2, m->mdmreg[REG_L3PROT], -1, -1); + i = isdn_get_free_channel(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); if (i < 0) { restore_flags(flags); isdn_tty_modem_result(6, info); @@ -1187,7 +1194,7 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m) m->mdmreg[REG_SI1I] = si2bit[si]; save_flags(flags); cli(); - i = isdn_get_free_channel(usg, l2, m->mdmreg[REG_L3PROT], -1, -1); + i = isdn_get_free_channel(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); if (i < 0) { restore_flags(flags); isdn_tty_modem_result(6, info); @@ -1281,7 +1288,7 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg) m->mdmreg[REG_SI1I] = si2bit[si]; save_flags(flags); cli(); - i = isdn_get_free_channel(usg, l2, m->mdmreg[REG_L3PROT], -1, -1); + i = isdn_get_free_channel(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); if (i < 0) { restore_flags(flags); isdn_tty_modem_result(6, info); @@ -1555,6 +1562,23 @@ isdn_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int co } } } else + if (TTY_IS_FCLASS1(info)) { + int cc = isdn_tty_handleDLEdown(info, m, c); + + if (info->vonline & 4) { /* ETX seen */ + isdn_ctrl c; + + c.command = ISDN_CMD_FAXCMD; + c.driver = info->isdn_driver; + c.arg = info->isdn_channel; + c.parm.aux.cmd = ISDN_FAX_CLASS1_CTRL; + c.parm.aux.subcmd = ETX; + isdn_command(&c); + } + info->vonline = 0; + printk(KERN_DEBUG "fax dle cc/c %d/%d\n", cc,c); + info->xmit_count += cc; + } else #endif info->xmit_count += c; } else { @@ -2567,7 +2591,7 @@ isdn_tty_find_icall(int di, int ch, setup_parm setup) (info->flags & (ISDN_ASYNC_NORMAL_ACTIVE | ISDN_ASYNC_CALLOUT_ACTIVE)) int -isdn_tty_stat_callback(int i, isdn_ctrl * c) +isdn_tty_stat_callback(int i, isdn_ctrl *c) { int mi; modem_info *info; @@ -2668,8 +2692,7 @@ isdn_tty_stat_callback(int i, isdn_ctrl * c) if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) { strcpy(info->emu.connmsg, c->parm.num); isdn_tty_modem_result(1, info); - } - else + } else isdn_tty_modem_result(5, info); } if (USG_VOICE(dev->usage[i])) @@ -2720,7 +2743,7 @@ isdn_tty_stat_callback(int i, isdn_ctrl * c) #ifdef CONFIG_ISDN_TTY_FAX case ISDN_STAT_FAXIND: if (TTY_IS_ACTIVE(info)) { - isdn_tty_fax_command(info); + isdn_tty_fax_command(info, c); } break; #endif @@ -3247,8 +3270,22 @@ isdn_tty_cmd_ATand(char **p, modem_info * info) info->xmit_size /= 10; } break; + case 'C': + /* &C - DCD Status */ + p[0]++; + switch (isdn_getnum(p)) { + case 0: + m->mdmreg[REG_DCD] &= ~BIT_DCD; + break; + case 1: + m->mdmreg[REG_DCD] |= BIT_DCD; + break; + default: + PARSE_ERROR1 + } + break; case 'D': - /* &D - Set DCD-Low-behavior */ + /* &D - Set DTR-Low-behavior */ p[0]++; switch (isdn_getnum(p)) { case 0: @@ -3280,6 +3317,14 @@ isdn_tty_cmd_ATand(char **p, modem_info * info) isdn_tty_reset_profile(m); isdn_tty_modem_reset_regs(info, 1); break; +#ifdef DUMMY_HAYES_AT + case 'K': + /* only for be compilant with common scripts */ + /* &K Flowcontrol - no function */ + p[0]++; + isdn_getnum(p); + break; +#endif case 'L': /* &L -Set Numbers to listen on */ p[0]++; @@ -3565,8 +3610,10 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info) sprintf(rs, "\r\n%d", (m->mdmreg[REG_SI1] & 1) ? 8 : 0); #ifdef CONFIG_ISDN_TTY_FAX - if (m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) - sprintf(rs, "\r\n2"); + if (TTY_IS_FCLASS2(info)) + sprintf(rs, "\r\n2"); + else if (TTY_IS_FCLASS1(info)) + sprintf(rs, "\r\n1"); #endif isdn_tty_at_cout(rs, info); break; @@ -3582,11 +3629,25 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info) m->mdmreg[REG_PSIZE] * 16; break; #ifdef CONFIG_ISDN_TTY_FAX + case '1': + p[0]++; + if (!(dev->global_features & + ISDN_FEATURE_L3_FCLASS1)) + PARSE_ERROR1; + m->mdmreg[REG_SI1] = 1; + m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX; + m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS1; + info->xmit_size = + m->mdmreg[REG_PSIZE] * 16; + break; case '2': p[0]++; + if (!(dev->global_features & + ISDN_FEATURE_L3_FCLASS2)) + PARSE_ERROR1; m->mdmreg[REG_SI1] = 1; m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX; - m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FAX; + m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS2; info->xmit_size = m->mdmreg[REG_PSIZE] * 16; break; @@ -3601,11 +3662,17 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info) break; case '?': p[0]++; + strcpy(rs, "\r\n0,"); #ifdef CONFIG_ISDN_TTY_FAX - isdn_tty_at_cout("\r\n0,2,8", info); -#else - isdn_tty_at_cout("\r\n0,8", info); + if (dev->global_features & + ISDN_FEATURE_L3_FCLASS1) + strcat(rs, "1,"); + if (dev->global_features & + ISDN_FEATURE_L3_FCLASS2) + strcat(rs, "2,"); #endif + strcat(rs, "8"); + isdn_tty_at_cout(rs, info); break; default: PARSE_ERROR1; @@ -3995,6 +4062,15 @@ isdn_tty_parse_at(modem_info * info) default: } break; +#ifdef DUMMY_HAYES_AT + case 'L': + case 'M': + /* only for be compilant with common scripts */ + /* no function */ + p++; + isdn_getnum(&p); + break; +#endif case 'O': /* O - Go online */ p++; |