diff options
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/divert/divert_init.c | 33 | ||||
-rw-r--r-- | drivers/isdn/divert/isdn_divert.c | 423 | ||||
-rw-r--r-- | drivers/isdn/divert/isdn_divert.h | 28 | ||||
-rw-r--r-- | drivers/isdn/gigaset/common.c | 31 | ||||
-rw-r--r-- | drivers/isdn/gigaset/ev-layer.c | 124 | ||||
-rw-r--r-- | drivers/isdn/gigaset/gigaset.h | 9 | ||||
-rw-r--r-- | drivers/isdn/gigaset/interface.c | 46 |
7 files changed, 330 insertions, 364 deletions
diff --git a/drivers/isdn/divert/divert_init.c b/drivers/isdn/divert/divert_init.c index 5374c25f036c..267dede13bfd 100644 --- a/drivers/isdn/divert/divert_init.c +++ b/drivers/isdn/divert/divert_init.c @@ -22,13 +22,13 @@ MODULE_LICENSE("GPL"); /****************************************/ /* structure containing interface to hl */ /****************************************/ -isdn_divert_if divert_if = -{ DIVERT_IF_MAGIC, /* magic value */ - DIVERT_CMD_REG, /* register cmd */ - ll_callback, /* callback routine from ll */ - NULL, /* command still not specified */ - NULL, /* drv_to_name */ - NULL, /* name_to_drv */ +isdn_divert_if divert_if = { + DIVERT_IF_MAGIC, /* magic value */ + DIVERT_CMD_REG, /* register cmd */ + ll_callback, /* callback routine from ll */ + NULL, /* command still not specified */ + NULL, /* drv_to_name */ + NULL, /* name_to_drv */ }; /*************************/ @@ -36,14 +36,15 @@ isdn_divert_if divert_if = /* no cmd line parms */ /*************************/ static int __init divert_init(void) -{ int i; +{ + int i; - if (divert_dev_init()) - { printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n"); + if (divert_dev_init()) { + printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n"); return (-EIO); } - if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) - { divert_dev_deinit(); + if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { + divert_dev_deinit(); printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n", i); return (-EIO); } @@ -61,13 +62,13 @@ static void __exit divert_exit(void) spin_lock_irqsave(&divert_lock, flags); divert_if.cmd = DIVERT_CMD_REL; /* release */ - if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) - { printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i); + if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { + printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i); spin_unlock_irqrestore(&divert_lock, flags); return; } - if (divert_dev_deinit()) - { printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n"); + if (divert_dev_deinit()) { + printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n"); spin_unlock_irqrestore(&divert_lock, flags); return; } diff --git a/drivers/isdn/divert/isdn_divert.c b/drivers/isdn/divert/isdn_divert.c index e61e55f1f193..db432e635496 100644 --- a/drivers/isdn/divert/isdn_divert.c +++ b/drivers/isdn/divert/isdn_divert.c @@ -19,8 +19,8 @@ /**********************************/ /* structure keeping calling info */ /**********************************/ -struct call_struc -{ isdn_ctrl ics; /* delivered setup + driver parameters */ +struct call_struc { + isdn_ctrl ics; /* delivered setup + driver parameters */ ulong divert_id; /* Id delivered to user */ unsigned char akt_state; /* actual state */ char deflect_dest[35]; /* deflection destination */ @@ -34,8 +34,8 @@ struct call_struc /********************************************/ /* structure keeping deflection table entry */ /********************************************/ -struct deflect_struc -{ struct deflect_struc *next, *prev; +struct deflect_struc { + struct deflect_struc *next, *prev; divert_rule rule; /* used rule */ }; @@ -64,16 +64,16 @@ static void deflect_timer_expire(ulong arg) del_timer(&cs->timer); /* delete active timer */ spin_unlock_irqrestore(&divert_lock, flags); - switch (cs->akt_state) - { case DEFLECT_PROCEED: - cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */ - divert_if.ll_cmd(&cs->ics); - spin_lock_irqsave(&divert_lock, flags); - cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ - cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); - add_timer(&cs->timer); - spin_unlock_irqrestore(&divert_lock, flags); - break; + switch (cs->akt_state) { + case DEFLECT_PROCEED: + cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */ + divert_if.ll_cmd(&cs->ics); + spin_lock_irqsave(&divert_lock, flags); + cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ + cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); + add_timer(&cs->timer); + spin_unlock_irqrestore(&divert_lock, flags); + break; case DEFLECT_ALERT: cs->ics.command = ISDN_CMD_REDIR; /* protocol */ @@ -111,7 +111,8 @@ static void deflect_timer_expire(ulong arg) int cf_command(int drvid, int mode, u_char proc, char *msn, u_char service, char *fwd_nr, ulong *procid) -{ unsigned long flags; +{ + unsigned long flags; int retval, msnlen; int fwd_len; char *p, *ielenp, tmp[60]; @@ -130,8 +131,8 @@ int cf_command(int drvid, int mode, *p++ = 1; /* length */ *p++ = service; /* service to handle */ - if (mode == 1) - { if (!*fwd_nr) return (-EINVAL); /* destination missing */ + if (mode == 1) { + if (!*fwd_nr) return (-EINVAL); /* destination missing */ if (strchr(fwd_nr, '.')) return (-EINVAL); /* subaddress not allowed */ fwd_len = strlen(fwd_nr); *p++ = 0x30; /* number enumeration */ @@ -144,12 +145,12 @@ int cf_command(int drvid, int mode, msnlen = strlen(msn); *p++ = 0x80; /* msn number */ - if (msnlen > 1) - { *p++ = msnlen; /* length */ + if (msnlen > 1) { + *p++ = msnlen; /* length */ strcpy(p, msn); p += msnlen; - } - else *p++ = 0; + } else + *p++ = 0; *ielenp = p - ielenp - 1; /* set total IE length */ @@ -186,14 +187,13 @@ int cf_command(int drvid, int mode, retval = divert_if.ll_cmd(&cs->ics); /* execute command */ - if (!retval) - { cs->prev = NULL; + if (!retval) { + cs->prev = NULL; spin_lock_irqsave(&divert_lock, flags); cs->next = divert_head; divert_head = cs; spin_unlock_irqrestore(&divert_lock, flags); - } - else + } else kfree(cs); return (retval); } /* cf_command */ @@ -203,15 +203,16 @@ int cf_command(int drvid, int mode, /* handle a external deflection command */ /****************************************/ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr) -{ struct call_struc *cs; +{ + struct call_struc *cs; isdn_ctrl ic; unsigned long flags; int i; if ((cmd & 0x7F) > 2) return (-EINVAL); /* invalid command */ cs = divert_head; /* start of parameter list */ - while (cs) - { if (cs->divert_id == callid) break; /* found */ + while (cs) { + if (cs->divert_id == callid) break; /* found */ cs = cs->next; } /* search entry */ if (!cs) return (-EINVAL); /* invalid callid */ @@ -220,32 +221,30 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr) ic.arg = cs->ics.arg; i = -EINVAL; if (cs->akt_state == DEFLECT_AUTODEL) return (i); /* no valid call */ - switch (cmd & 0x7F) - { case 0: /* hangup */ - del_timer(&cs->timer); - ic.command = ISDN_CMD_HANGUP; - i = divert_if.ll_cmd(&ic); - spin_lock_irqsave(&divert_lock, flags); - cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ - cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); - add_timer(&cs->timer); - spin_unlock_irqrestore(&divert_lock, flags); - break; + switch (cmd & 0x7F) { + case 0: /* hangup */ + del_timer(&cs->timer); + ic.command = ISDN_CMD_HANGUP; + i = divert_if.ll_cmd(&ic); + spin_lock_irqsave(&divert_lock, flags); + cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ + cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); + add_timer(&cs->timer); + spin_unlock_irqrestore(&divert_lock, flags); + break; case 1: /* alert */ if (cs->akt_state == DEFLECT_ALERT) return (0); cmd &= 0x7F; /* never wait */ del_timer(&cs->timer); ic.command = ISDN_CMD_ALERT; - if ((i = divert_if.ll_cmd(&ic))) - { + if ((i = divert_if.ll_cmd(&ic))) { spin_lock_irqsave(&divert_lock, flags); cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); add_timer(&cs->timer); spin_unlock_irqrestore(&divert_lock, flags); - } - else + } else cs->akt_state = DEFLECT_ALERT; break; @@ -254,15 +253,13 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr) strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone)); strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual"); ic.command = ISDN_CMD_REDIR; - if ((i = divert_if.ll_cmd(&ic))) - { + if ((i = divert_if.ll_cmd(&ic))) { spin_lock_irqsave(&divert_lock, flags); cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); add_timer(&cs->timer); spin_unlock_irqrestore(&divert_lock, flags); - } - else + } else cs->akt_state = DEFLECT_ALERT; break; @@ -274,19 +271,19 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr) /* insert a new rule before idx */ /********************************/ int insertrule(int idx, divert_rule *newrule) -{ struct deflect_struc *ds, *ds1 = NULL; +{ + struct deflect_struc *ds, *ds1 = NULL; unsigned long flags; - if (!(ds = kmalloc(sizeof(struct deflect_struc), - GFP_KERNEL))) + if (!(ds = kmalloc(sizeof(struct deflect_struc), GFP_KERNEL))) return (-ENOMEM); /* no memory */ ds->rule = *newrule; /* set rule */ spin_lock_irqsave(&divert_lock, flags); - if (idx >= 0) - { ds1 = table_head; + if (idx >= 0) { + ds1 = table_head; while ((ds1) && (idx > 0)) { idx--; ds1 = ds1->next; @@ -294,17 +291,16 @@ int insertrule(int idx, divert_rule *newrule) if (!ds1) idx = -1; } - if (idx < 0) - { ds->prev = table_tail; /* previous entry */ + if (idx < 0) { + ds->prev = table_tail; /* previous entry */ ds->next = NULL; /* end of chain */ if (ds->prev) ds->prev->next = ds; /* last forward */ else table_head = ds; /* is first entry */ table_tail = ds; /* end of queue */ - } - else - { ds->next = ds1; /* next entry */ + } else { + ds->next = ds1; /* next entry */ ds->prev = ds1->prev; /* prev entry */ ds1->prev = ds; /* backward chain old element */ if (!ds->prev) @@ -319,17 +315,18 @@ int insertrule(int idx, divert_rule *newrule) /* delete the rule at position idx */ /***********************************/ int deleterule(int idx) -{ struct deflect_struc *ds, *ds1; +{ + struct deflect_struc *ds, *ds1; unsigned long flags; - if (idx < 0) - { spin_lock_irqsave(&divert_lock, flags); + if (idx < 0) { + spin_lock_irqsave(&divert_lock, flags); ds = table_head; table_head = NULL; table_tail = NULL; spin_unlock_irqrestore(&divert_lock, flags); - while (ds) - { ds1 = ds; + while (ds) { + ds1 = ds; ds = ds->next; kfree(ds1); } @@ -339,13 +336,12 @@ int deleterule(int idx) spin_lock_irqsave(&divert_lock, flags); ds = table_head; - while ((ds) && (idx > 0)) - { idx--; + while ((ds) && (idx > 0)) { + idx--; ds = ds->next; } - if (!ds) - { + if (!ds) { spin_unlock_irqrestore(&divert_lock, flags); return (-EINVAL); } @@ -369,12 +365,13 @@ int deleterule(int idx) /* get a pointer to a specific rule number */ /*******************************************/ divert_rule *getruleptr(int idx) -{ struct deflect_struc *ds = table_head; +{ + struct deflect_struc *ds = table_head; if (idx < 0) return (NULL); - while ((ds) && (idx >= 0)) - { if (!(idx--)) - { return (&ds->rule); + while ((ds) && (idx >= 0)) { + if (!(idx--)) { + return (&ds->rule); break; } ds = ds->next; @@ -386,7 +383,8 @@ divert_rule *getruleptr(int idx) /* called from common module on an incoming call */ /*************************************************/ static int isdn_divert_icall(isdn_ctrl *ic) -{ int retval = 0; +{ + int retval = 0; unsigned long flags; struct call_struc *cs = NULL; struct deflect_struc *dv; @@ -394,8 +392,8 @@ static int isdn_divert_icall(isdn_ctrl *ic) u_char accept; /* first check the internal deflection table */ - for (dv = table_head; dv; dv = dv->next) - { /* scan table */ + for (dv = table_head; dv; dv = dv->next) { + /* scan table */ if (((dv->rule.callopt == 1) && (ic->command == ISDN_STAT_ICALLW)) || ((dv->rule.callopt == 2) && (ic->command == ISDN_STAT_ICALL))) continue; /* call option check */ @@ -409,10 +407,10 @@ static int isdn_divert_icall(isdn_ctrl *ic) p = dv->rule.my_msn; p1 = ic->parm.setup.eazmsn; accept = 0; - while (*p) - { /* complete compare */ - if (*p == '-') - { accept = 1; /* call accepted */ + while (*p) { + /* complete compare */ + if (*p == '-') { + accept = 1; /* call accepted */ break; } if (*p++ != *p1++) @@ -422,14 +420,15 @@ static int isdn_divert_icall(isdn_ctrl *ic) } /* complete compare */ if (!accept) continue; /* not accepted */ - if ((strcmp(dv->rule.caller, "0")) || (ic->parm.setup.phone[0])) - { p = dv->rule.caller; + if ((strcmp(dv->rule.caller, "0")) || + (ic->parm.setup.phone[0])) { + p = dv->rule.caller; p1 = ic->parm.setup.phone; accept = 0; - while (*p) - { /* complete compare */ - if (*p == '-') - { accept = 1; /* call accepted */ + while (*p) { + /* complete compare */ + if (*p == '-') { + accept = 1; /* call accepted */ break; } if (*p++ != *p1++) @@ -440,10 +439,10 @@ static int isdn_divert_icall(isdn_ctrl *ic) if (!accept) continue; /* not accepted */ } - switch (dv->rule.action) - { case DEFLECT_IGNORE: - return (0); - break; + switch (dv->rule.action) { + case DEFLECT_IGNORE: + return (0); + break; case DEFLECT_ALERT: case DEFLECT_PROCEED: @@ -465,31 +464,29 @@ static int isdn_divert_icall(isdn_ctrl *ic) cs->ics.parm.setup.screen = dv->rule.screen; if (dv->rule.waittime) cs->timer.expires = jiffies + (HZ * dv->rule.waittime); + else if (dv->rule.action == DEFLECT_PROCEED) + cs->timer.expires = jiffies + (HZ * extern_wait_max); else - if (dv->rule.action == DEFLECT_PROCEED) - cs->timer.expires = jiffies + (HZ * extern_wait_max); - else - cs->timer.expires = 0; + cs->timer.expires = 0; cs->akt_state = dv->rule.action; spin_lock_irqsave(&divert_lock, flags); cs->divert_id = next_id++; /* new sequence number */ spin_unlock_irqrestore(&divert_lock, flags); cs->prev = NULL; - if (cs->akt_state == DEFLECT_ALERT) - { strcpy(cs->deflect_dest, dv->rule.to_nr); - if (!cs->timer.expires) - { strcpy(ic->parm.setup.eazmsn, "Testtext direct"); + if (cs->akt_state == DEFLECT_ALERT) { + strcpy(cs->deflect_dest, dv->rule.to_nr); + if (!cs->timer.expires) { + strcpy(ic->parm.setup.eazmsn, + "Testtext direct"); ic->parm.setup.screen = dv->rule.screen; strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone)); cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); retval = 5; - } - else + } else retval = 1; /* alerting */ - } - else - { cs->deflect_dest[0] = '\0'; + } else { + cs->deflect_dest[0] = '\0'; retval = 4; /* only proceed */ } sprintf(cs->info, "%d 0x%lx %s %s %s %s 0x%x 0x%x %d %d %s\n", @@ -505,8 +502,8 @@ static int isdn_divert_icall(isdn_ctrl *ic) dv->rule.waittime, cs->deflect_dest); if ((dv->rule.action == DEFLECT_REPORT) || - (dv->rule.action == DEFLECT_REJECT)) - { put_info_buffer(cs->info); + (dv->rule.action == DEFLECT_REJECT)) { + put_info_buffer(cs->info); kfree(cs); /* remove */ return ((dv->rule.action == DEFLECT_REPORT) ? 0 : 2); /* nothing to do */ } @@ -519,8 +516,8 @@ static int isdn_divert_icall(isdn_ctrl *ic) break; } /* scan_table */ - if (cs) - { cs->prev = NULL; + if (cs) { + cs->prev = NULL; spin_lock_irqsave(&divert_lock, flags); cs->next = divert_head; divert_head = cs; @@ -529,21 +526,21 @@ static int isdn_divert_icall(isdn_ctrl *ic) put_info_buffer(cs->info); return (retval); - } - else + } else return (0); } /* isdn_divert_icall */ void deleteprocs(void) -{ struct call_struc *cs, *cs1; +{ + struct call_struc *cs, *cs1; unsigned long flags; spin_lock_irqsave(&divert_lock, flags); cs = divert_head; divert_head = NULL; - while (cs) - { del_timer(&cs->timer); + while (cs) { + del_timer(&cs->timer); cs1 = cs; cs = cs->next; kfree(cs1); @@ -555,12 +552,13 @@ void deleteprocs(void) /* put a address including address type into buffer */ /****************************************************/ static int put_address(char *st, u_char *p, int len) -{ u_char retval = 0; +{ + u_char retval = 0; u_char adr_typ = 0; /* network standard */ if (len < 2) return (retval); - if (*p == 0xA1) - { retval = *(++p) + 2; /* total length */ + if (*p == 0xA1) { + retval = *(++p) + 2; /* total length */ if (retval > len) return (0); /* too short */ len = retval - 2; /* remaining length */ if (len < 3) return (0); @@ -572,16 +570,13 @@ static int put_address(char *st, u_char *p, int len) if (*p++ != 0x12) return (0); if (*p > len) return (0); /* check number length */ len = *p++; - } - else - if (*p == 0x80) - { retval = *(++p) + 2; /* total length */ - if (retval > len) return (0); - len = retval - 2; - p++; - } - else - return (0); /* invalid address information */ + } else if (*p == 0x80) { + retval = *(++p) + 2; /* total length */ + if (retval > len) return (0); + len = retval - 2; + p++; + } else + return (0); /* invalid address information */ sprintf(st, "%d ", adr_typ); st += strlen(st); @@ -598,7 +593,8 @@ static int put_address(char *st, u_char *p, int len) /* report a successful interrogation */ /*************************************/ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) -{ char *src = ic->parm.dss1_io.data; +{ + char *src = ic->parm.dss1_io.data; int restlen = ic->parm.dss1_io.datalen; int cnt = 1; u_char n, n1; @@ -608,50 +604,44 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) if (*src++ != 0x30) return (-101); if ((n = *src++) > 0x81) return (-102); /* invalid length field */ restlen -= 2; /* remaining bytes */ - if (n == 0x80) - { if (restlen < 2) return (-103); + if (n == 0x80) { + if (restlen < 2) return (-103); if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-104); restlen -= 2; - } + } else if (n == 0x81) { + n = *src++; + restlen--; + if (n > restlen) return (-105); + restlen = n; + } else if (n > restlen) + return (-106); else - if (n == 0x81) - { n = *src++; - restlen--; - if (n > restlen) return (-105); - restlen = n; - } - else - if (n > restlen) return (-106); - else - restlen = n; /* standard format */ + restlen = n; /* standard format */ if (restlen < 3) return (-107); /* no procedure */ if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return (-108); restlen -= 3; if (restlen < 2) return (-109); /* list missing */ - if (*src == 0x31) - { src++; + if (*src == 0x31) { + src++; if ((n = *src++) > 0x81) return (-110); /* invalid length field */ restlen -= 2; /* remaining bytes */ - if (n == 0x80) - { if (restlen < 2) return (-111); + if (n == 0x80) { + if (restlen < 2) return (-111); if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-112); restlen -= 2; - } + } else if (n == 0x81) { + n = *src++; + restlen--; + if (n > restlen) return (-113); + restlen = n; + } else if (n > restlen) + return (-114); else - if (n == 0x81) - { n = *src++; - restlen--; - if (n > restlen) return (-113); - restlen = n; - } - else - if (n > restlen) return (-114); - else - restlen = n; /* standard format */ + restlen = n; /* standard format */ } /* result list header */ - while (restlen >= 2) - { stp = st; + while (restlen >= 2) { + stp = st; sprintf(stp, "%d 0x%lx %d %s ", DIVERT_REPORT, ic->parm.dss1_io.ll_id, cnt++, divert_if.drv_to_name(ic->driver)); stp += strlen(stp); @@ -674,8 +664,8 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) sprintf(stp, "%d ", (*p++) & 0xFF); stp += strlen(stp); n -= 6; - if (n > 2) - { if (*p++ != 0x30) continue; + if (n > 2) { + if (*p++ != 0x30) continue; if (*p > (n - 2)) continue; n = *p++; if (!(n1 = put_address(stp, p, n & 0xFF))) continue; @@ -692,58 +682,58 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) /* callback for protocol specific extensions */ /*********************************************/ static int prot_stat_callback(isdn_ctrl *ic) -{ struct call_struc *cs, *cs1; +{ + struct call_struc *cs, *cs1; int i; unsigned long flags; cs = divert_head; /* start of list */ cs1 = NULL; - while (cs) - { if (ic->driver == cs->ics.driver) - { switch (cs->ics.arg) - { case DSS1_CMD_INVOKE: - if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) && - (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id)) - { switch (ic->arg) - { case DSS1_STAT_INVOKE_ERR: - sprintf(cs->info, "128 0x%lx 0x%x\n", - ic->parm.dss1_io.ll_id, - ic->parm.dss1_io.timeout); - put_info_buffer(cs->info); - break; - - case DSS1_STAT_INVOKE_RES: - switch (cs->ics.parm.dss1_io.proc) - { case 7: - case 8: - put_info_buffer(cs->info); - break; - - case 11: - i = interrogate_success(ic, cs); - if (i) - sprintf(cs->info, "%d 0x%lx %d\n", DIVERT_REPORT, - ic->parm.dss1_io.ll_id, i); - put_info_buffer(cs->info); - break; - - default: - printk(KERN_WARNING "dss1_divert: unknown proc %d\n", cs->ics.parm.dss1_io.proc); - break; - } - + while (cs) { + if (ic->driver == cs->ics.driver) { + switch (cs->ics.arg) { + case DSS1_CMD_INVOKE: + if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) && + (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id)) { + switch (ic->arg) { + case DSS1_STAT_INVOKE_ERR: + sprintf(cs->info, "128 0x%lx 0x%x\n", + ic->parm.dss1_io.ll_id, + ic->parm.dss1_io.timeout); + put_info_buffer(cs->info); + break; + + case DSS1_STAT_INVOKE_RES: + switch (cs->ics.parm.dss1_io.proc) { + case 7: + case 8: + put_info_buffer(cs->info); + break; + case 11: + i = interrogate_success(ic, cs); + if (i) + sprintf(cs->info, "%d 0x%lx %d\n", DIVERT_REPORT, + ic->parm.dss1_io.ll_id, i); + put_info_buffer(cs->info); break; default: - printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n", ic->arg); + printk(KERN_WARNING "dss1_divert: unknown proc %d\n", cs->ics.parm.dss1_io.proc); break; } - cs1 = cs; /* remember structure */ - cs = NULL; - continue; /* abort search */ - } /* id found */ - break; + + break; + + default: + printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n", ic->arg); + break; + } + cs1 = cs; /* remember structure */ + cs = NULL; + continue; /* abort search */ + } /* id found */ + break; case DSS1_CMD_INVOKE_ABORT: printk(KERN_WARNING "dss1_divert unhandled invoke abort\n"); @@ -757,13 +747,12 @@ static int prot_stat_callback(isdn_ctrl *ic) } /* driver ok */ } - if (!cs1) - { printk(KERN_WARNING "dss1_divert unhandled process\n"); + if (!cs1) { + printk(KERN_WARNING "dss1_divert unhandled process\n"); return (0); } - if (cs1->ics.driver == -1) - { + if (cs1->ics.driver == -1) { spin_lock_irqsave(&divert_lock, flags); del_timer(&cs1->timer); if (cs1->prev) @@ -784,20 +773,22 @@ static int prot_stat_callback(isdn_ctrl *ic) /* status callback from HL */ /***************************/ static int isdn_divert_stat_callback(isdn_ctrl *ic) -{ struct call_struc *cs, *cs1; +{ + struct call_struc *cs, *cs1; unsigned long flags; int retval; retval = -1; cs = divert_head; /* start of list */ - while (cs) - { if ((ic->driver == cs->ics.driver) && (ic->arg == cs->ics.arg)) - { switch (ic->command) - { case ISDN_STAT_DHUP: - sprintf(cs->info, "129 0x%lx\n", cs->divert_id); - del_timer(&cs->timer); - cs->ics.driver = -1; - break; + while (cs) { + if ((ic->driver == cs->ics.driver) && + (ic->arg == cs->ics.arg)) { + switch (ic->command) { + case ISDN_STAT_DHUP: + sprintf(cs->info, "129 0x%lx\n", cs->divert_id); + del_timer(&cs->timer); + cs->ics.driver = -1; + break; case ISDN_STAT_CAUSE: sprintf(cs->info, "130 0x%lx %s\n", cs->divert_id, ic->parm.num); @@ -818,8 +809,7 @@ static int isdn_divert_stat_callback(isdn_ctrl *ic) } cs1 = cs; cs = cs->next; - if (cs1->ics.driver == -1) - { + if (cs1->ics.driver == -1) { spin_lock_irqsave(&divert_lock, flags); if (cs1->prev) cs1->prev->next = cs1->next; /* forward link */ @@ -840,20 +830,19 @@ static int isdn_divert_stat_callback(isdn_ctrl *ic) /********************/ int ll_callback(isdn_ctrl *ic) { - switch (ic->command) - { case ISDN_STAT_ICALL: + switch (ic->command) { + case ISDN_STAT_ICALL: case ISDN_STAT_ICALLW: return (isdn_divert_icall(ic)); break; case ISDN_STAT_PROT: - if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO) - { if (ic->arg != DSS1_STAT_INVOKE_BRD) + if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO) { + if (ic->arg != DSS1_STAT_INVOKE_BRD) return (prot_stat_callback(ic)); else return (0); /* DSS1 invoke broadcast */ - } - else + } else return (-1); /* protocol not euro */ default: diff --git a/drivers/isdn/divert/isdn_divert.h b/drivers/isdn/divert/isdn_divert.h index 42f289320d2d..55033dd872c0 100644 --- a/drivers/isdn/divert/isdn_divert.h +++ b/drivers/isdn/divert/isdn_divert.h @@ -43,8 +43,8 @@ #define DEFLECT_ALL_IDS 0xFFFFFFFF /* all drivers selected */ -typedef struct -{ ulong drvid; /* driver ids, bit mapped */ +typedef struct { + ulong drvid; /* driver ids, bit mapped */ char my_msn[35]; /* desired msn, subaddr allowed */ char caller[35]; /* caller id, partial string with * + subaddr allowed */ char to_nr[35]; /* deflected to number incl. subaddress */ @@ -65,18 +65,18 @@ typedef struct u_char waittime; /* maximum wait time for proceeding */ } divert_rule; -typedef union -{ int drv_version; /* return of driver version */ - struct - { int drvid; /* id of driver */ +typedef union { + int drv_version; /* return of driver version */ + struct { + int drvid; /* id of driver */ char drvnam[30]; /* name of driver */ } getid; - struct - { int ruleidx; /* index of rule */ + struct { + int ruleidx; /* index of rule */ divert_rule rule; /* rule parms */ } getsetrule; - struct - { u_char subcmd; /* 0 = hangup/reject, + struct { + u_char subcmd; /* 0 = hangup/reject, 1 = alert, 2 = deflect */ ulong callid; /* id of call delivered by ascii output */ @@ -84,8 +84,8 @@ typedef union else uus1 string (maxlen 31), data from rule used if empty */ } fwd_ctrl; - struct - { int drvid; /* id of driver */ + struct { + int drvid; /* id of driver */ u_char cfproc; /* cfu = 0, cfb = 1, cfnr = 2 */ ulong procid; /* process id returned when no error */ u_char service; /* basically coded service, 0 = all */ @@ -104,8 +104,8 @@ typedef union /**************************************************/ /* structure keeping ascii info for device output */ /**************************************************/ -struct divert_info -{ struct divert_info *next; +struct divert_info { + struct divert_info *next; ulong usage_cnt; /* number of files still to work */ char info_start[2]; /* info string start */ }; diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index 6849a11a1b24..7c7814497e3e 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c @@ -467,11 +467,6 @@ void gigaset_freecs(struct cardstate *cs) mutex_lock(&cs->mutex); - if (!cs->bcs) - goto f_cs; - if (!cs->inbuf) - goto f_bcs; - spin_lock_irqsave(&cs->lock, flags); cs->running = 0; spin_unlock_irqrestore(&cs->lock, flags); /* event handler and timer are @@ -507,17 +502,16 @@ void gigaset_freecs(struct cardstate *cs) gig_dbg(DEBUG_INIT, "clearing at_state"); clear_at_state(&cs->at_state); dealloc_temp_at_states(cs); + clear_events(cs); tty_port_destroy(&cs->port); /* fall through */ case 0: /* error in basic setup */ - clear_events(cs); gig_dbg(DEBUG_INIT, "freeing inbuf"); kfree(cs->inbuf); + kfree(cs->bcs); } -f_bcs: gig_dbg(DEBUG_INIT, "freeing bcs[]"); - kfree(cs->bcs); -f_cs: gig_dbg(DEBUG_INIT, "freeing cs"); + mutex_unlock(&cs->mutex); free_cs(cs); } @@ -687,19 +681,6 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, return NULL; } - gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1); - cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL); - if (!cs->bcs) { - pr_err("out of memory\n"); - goto error; - } - gig_dbg(DEBUG_INIT, "allocating inbuf"); - cs->inbuf = kmalloc(sizeof(struct inbuf_t), GFP_KERNEL); - if (!cs->inbuf) { - pr_err("out of memory\n"); - goto error; - } - cs->cs_init = 0; cs->channels = channels; cs->onechannel = onechannel; @@ -729,6 +710,12 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, cs->mode = M_UNKNOWN; cs->mstate = MS_UNINITIALIZED; + cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL); + cs->inbuf = kmalloc(sizeof(struct inbuf_t), GFP_KERNEL); + if (!cs->bcs || !cs->inbuf) { + pr_err("out of memory\n"); + goto error; + } ++cs->cs_init; gig_dbg(DEBUG_INIT, "setting up at_state"); diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index 2e6963dc740e..7459b127ddd5 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c @@ -351,10 +351,11 @@ struct reply_t gigaset_tab_cid[] = static const struct resp_type_t { - unsigned char *response; - int resp_code; - int type; -} resp_type[] = + char *response; + int resp_code; + int type; +} +resp_type[] = { {"OK", RSP_OK, RT_NOTHING}, {"ERROR", RSP_ERROR, RT_NOTHING}, @@ -374,11 +375,12 @@ static const struct resp_type_t { }; static const struct zsau_resp_t { - unsigned char *str; - int code; -} zsau_resp[] = + char *str; + int code; +} +zsau_resp[] = { - {"OUTGOING_CALL_PROCEEDING", ZSAU_OUTGOING_CALL_PROCEEDING}, + {"OUTGOING_CALL_PROCEEDING", ZSAU_PROCEEDING}, {"CALL_DELIVERED", ZSAU_CALL_DELIVERED}, {"ACTIVE", ZSAU_ACTIVE}, {"DISCONNECT_IND", ZSAU_DISCONNECT_IND}, @@ -434,7 +436,7 @@ void gigaset_handle_modem_response(struct cardstate *cs) len = cs->cbytes; if (!len) { /* ignore additional LFs/CRs (M10x config mode or cx100) */ - gig_dbg(DEBUG_MCMD, "skipped EOL [%02X]", cs->respdata[len]); + gig_dbg(DEBUG_MCMD, "skipped EOL [%02X]", cs->respdata[0]); return; } cs->respdata[len] = 0; @@ -707,27 +709,29 @@ static void schedule_init(struct cardstate *cs, int state) cs->commands_pending = 1; } -/* Add "AT" to a command, add the cid, dle encode it, send the result to the - hardware. */ -static void send_command(struct cardstate *cs, const char *cmd, int cid, - int dle, gfp_t kmallocflags) +/* send an AT command + * adding the "AT" prefix, cid and DLE encapsulation as appropriate + */ +static void send_command(struct cardstate *cs, const char *cmd, + struct at_state_t *at_state) { + int cid = at_state->cid; struct cmdbuf_t *cb; size_t buflen; buflen = strlen(cmd) + 12; /* DLE ( A T 1 2 3 4 5 <cmd> DLE ) \0 */ - cb = kmalloc(sizeof(struct cmdbuf_t) + buflen, kmallocflags); + cb = kmalloc(sizeof(struct cmdbuf_t) + buflen, GFP_ATOMIC); if (!cb) { dev_err(cs->dev, "%s: out of memory\n", __func__); return; } if (cid > 0 && cid <= 65535) cb->len = snprintf(cb->buf, buflen, - dle ? "\020(AT%d%s\020)" : "AT%d%s", + cs->dle ? "\020(AT%d%s\020)" : "AT%d%s", cid, cmd); else cb->len = snprintf(cb->buf, buflen, - dle ? "\020(AT%s\020)" : "AT%s", + cs->dle ? "\020(AT%s\020)" : "AT%s", cmd); cb->offset = 0; cb->next = NULL; @@ -886,7 +890,7 @@ static void finish_shutdown(struct cardstate *cs) gigaset_isdn_stop(cs); } - /* The rest is done by cleanup_cs () in user mode. */ + /* The rest is done by cleanup_cs() in process context. */ cs->cmd_result = -ENODEV; cs->waiting = 0; @@ -976,10 +980,9 @@ exit: } static void handle_icall(struct cardstate *cs, struct bc_state *bcs, - struct at_state_t **p_at_state) + struct at_state_t *at_state) { int retval; - struct at_state_t *at_state = *p_at_state; retval = gigaset_isdn_icall(at_state); switch (retval) { @@ -1176,7 +1179,7 @@ static void do_action(int action, struct cardstate *cs, spin_unlock_irqrestore(&cs->lock, flags); break; case ACT_ICALL: - handle_icall(cs, bcs, p_at_state); + handle_icall(cs, bcs, at_state); break; case ACT_FAILSDOWN: dev_warn(cs->dev, "Could not shut down the device.\n"); @@ -1264,7 +1267,7 @@ static void do_action(int action, struct cardstate *cs, cs->commands_pending = 1; break; } - /* fall through */ + /* bad cid: fall through */ case ACT_FAILCID: cs->cur_at_seq = SEQ_NONE; channel = cs->curchannel; @@ -1339,7 +1342,6 @@ static void do_action(int action, struct cardstate *cs, *p_resp_code = RSP_ERROR; break; } - /*at_state->getstring = 1;*/ cs->gotfwver = 0; break; case ACT_GOTVER: @@ -1471,7 +1473,6 @@ static void process_event(struct cardstate *cs, struct event_t *ev) int rcode; int genresp = 0; int resp_code = RSP_ERROR; - int sendcid; struct at_state_t *at_state; int index; int curact; @@ -1499,7 +1500,6 @@ static void process_event(struct cardstate *cs, struct event_t *ev) at_state->ConState, ev->type); bcs = at_state->bcs; - sendcid = at_state->cid; /* Setting the pointer to the dial array */ rep = at_state->replystruct; @@ -1510,10 +1510,12 @@ static void process_event(struct cardstate *cs, struct event_t *ev) || !at_state->timer_active) { ev->type = RSP_NONE; /* old timeout */ gig_dbg(DEBUG_EVENT, "old timeout"); - } else if (!at_state->waiting) - gig_dbg(DEBUG_EVENT, "timeout occurred"); - else - gig_dbg(DEBUG_EVENT, "stopped waiting"); + } else { + if (at_state->waiting) + gig_dbg(DEBUG_EVENT, "stopped waiting"); + else + gig_dbg(DEBUG_EVENT, "timeout occurred"); + } } spin_unlock_irqrestore(&cs->lock, flags); @@ -1561,45 +1563,40 @@ static void process_event(struct cardstate *cs, struct event_t *ev) do_action(rep->action[curact], cs, bcs, &at_state, &p_command, &genresp, &resp_code, ev); if (!at_state) - break; /* may be freed after disconnect */ + /* at_state destroyed by disconnect */ + return; } - if (at_state) { - /* Jump to the next con-state regarding the array */ - if (rep->new_ConState >= 0) - at_state->ConState = rep->new_ConState; + /* Jump to the next con-state regarding the array */ + if (rep->new_ConState >= 0) + at_state->ConState = rep->new_ConState; - if (genresp) { - spin_lock_irqsave(&cs->lock, flags); + if (genresp) { + spin_lock_irqsave(&cs->lock, flags); + at_state->timer_expires = 0; + at_state->timer_active = 0; + spin_unlock_irqrestore(&cs->lock, flags); + gigaset_add_event(cs, at_state, resp_code, NULL, 0, NULL); + } else { + /* Send command to modem if not NULL... */ + if (p_command) { + if (cs->connected) + send_command(cs, p_command, at_state); + else + gigaset_add_event(cs, at_state, RSP_NODEV, + NULL, 0, NULL); + } + + spin_lock_irqsave(&cs->lock, flags); + if (!rep->timeout) { at_state->timer_expires = 0; at_state->timer_active = 0; - spin_unlock_irqrestore(&cs->lock, flags); - gigaset_add_event(cs, at_state, resp_code, - NULL, 0, NULL); - } else { - /* Send command to modem if not NULL... */ - if (p_command) { - if (cs->connected) - send_command(cs, p_command, - sendcid, cs->dle, - GFP_ATOMIC); - else - gigaset_add_event(cs, at_state, - RSP_NODEV, - NULL, 0, NULL); - } - - spin_lock_irqsave(&cs->lock, flags); - if (!rep->timeout) { - at_state->timer_expires = 0; - at_state->timer_active = 0; - } else if (rep->timeout > 0) { /* new timeout */ - at_state->timer_expires = rep->timeout * 10; - at_state->timer_active = 1; - ++at_state->timer_index; - } - spin_unlock_irqrestore(&cs->lock, flags); + } else if (rep->timeout > 0) { /* new timeout */ + at_state->timer_expires = rep->timeout * 10; + at_state->timer_active = 1; + ++at_state->timer_index; } + spin_unlock_irqrestore(&cs->lock, flags); } } @@ -1693,6 +1690,11 @@ static void process_command_flags(struct cardstate *cs) for (i = 0; i < cs->channels; ++i) { bcs = cs->bcs + i; if (bcs->at_state.pending_commands & PC_HUP) { + if (cs->dle) { + cs->curchannel = bcs->channel; + schedule_sequence(cs, &cs->at_state, SEQ_DLE0); + return; + } bcs->at_state.pending_commands &= ~PC_HUP; if (bcs->at_state.pending_commands & PC_CID) { /* not yet dialing: PC_NOCID is sufficient */ diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h index 8e2fc8f31d16..eb63a0f7a02a 100644 --- a/drivers/isdn/gigaset/gigaset.h +++ b/drivers/isdn/gigaset/gigaset.h @@ -111,11 +111,10 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, /* connection state */ #define ZSAU_NONE 0 -#define ZSAU_DISCONNECT_IND 4 -#define ZSAU_OUTGOING_CALL_PROCEEDING 1 #define ZSAU_PROCEEDING 1 #define ZSAU_CALL_DELIVERED 2 #define ZSAU_ACTIVE 3 +#define ZSAU_DISCONNECT_IND 4 #define ZSAU_NULL 5 #define ZSAU_DISCONNECT_REQ 6 #define ZSAU_UNKNOWN -1 @@ -183,18 +182,22 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, #define AT_NUM 7 /* variables in struct at_state_t */ +/* - numeric */ #define VAR_ZSAU 0 #define VAR_ZDLE 1 #define VAR_ZCTP 2 +/* total number */ #define VAR_NUM 3 - +/* - string */ #define STR_NMBR 0 #define STR_ZCPN 1 #define STR_ZCON 2 #define STR_ZBC 3 #define STR_ZHLC 4 +/* total number */ #define STR_NUM 5 +/* event types */ #define EV_TIMEOUT -105 #define EV_IF_VER -106 #define EV_PROC_CIDMODE -107 diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index 67abf3ff45e8..20b7e7a1190f 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c @@ -112,36 +112,6 @@ static int if_config(struct cardstate *cs, int *arg) } /*** the terminal driver ***/ -/* stolen from usbserial and some other tty drivers */ - -static int if_open(struct tty_struct *tty, struct file *filp); -static void if_close(struct tty_struct *tty, struct file *filp); -static int if_ioctl(struct tty_struct *tty, - unsigned int cmd, unsigned long arg); -static int if_write_room(struct tty_struct *tty); -static int if_chars_in_buffer(struct tty_struct *tty); -static void if_throttle(struct tty_struct *tty); -static void if_unthrottle(struct tty_struct *tty); -static void if_set_termios(struct tty_struct *tty, struct ktermios *old); -static int if_tiocmget(struct tty_struct *tty); -static int if_tiocmset(struct tty_struct *tty, - unsigned int set, unsigned int clear); -static int if_write(struct tty_struct *tty, - const unsigned char *buf, int count); - -static const struct tty_operations if_ops = { - .open = if_open, - .close = if_close, - .ioctl = if_ioctl, - .write = if_write, - .write_room = if_write_room, - .chars_in_buffer = if_chars_in_buffer, - .set_termios = if_set_termios, - .throttle = if_throttle, - .unthrottle = if_unthrottle, - .tiocmget = if_tiocmget, - .tiocmset = if_tiocmset, -}; static int if_open(struct tty_struct *tty, struct file *filp) { @@ -355,7 +325,7 @@ done: static int if_write_room(struct tty_struct *tty) { struct cardstate *cs = tty->driver_data; - int retval = -ENODEV; + int retval; gig_dbg(DEBUG_IF, "%u: %s()", cs->minor_index, __func__); @@ -498,6 +468,20 @@ out: mutex_unlock(&cs->mutex); } +static const struct tty_operations if_ops = { + .open = if_open, + .close = if_close, + .ioctl = if_ioctl, + .write = if_write, + .write_room = if_write_room, + .chars_in_buffer = if_chars_in_buffer, + .set_termios = if_set_termios, + .throttle = if_throttle, + .unthrottle = if_unthrottle, + .tiocmget = if_tiocmget, + .tiocmset = if_tiocmset, +}; + /* wakeup tasklet for the write operation */ static void if_wake(unsigned long data) |