diff options
| author | Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> | 2002-10-29 08:58:11 -0600 |
|---|---|---|
| committer | Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> | 2002-10-29 08:58:11 -0600 |
| commit | 5673f7e9efafbfc8506b9b4cba5d24ee45655645 (patch) | |
| tree | 5e9524d008b5ea15edb573ba30b6e6d01af4a439 | |
| parent | 91267c945b0f04f4089ce8749ff6d1a2c2114275 (diff) | |
ISDN: New timer handling for ttyI RING response
Again, use a per ttyI timer handler for RING messages, only activated
when used.
| -rw-r--r-- | drivers/isdn/i4l/isdn_ciscohdlck.c | 2 | ||||
| -rw-r--r-- | drivers/isdn/i4l/isdn_common.c | 6 | ||||
| -rw-r--r-- | drivers/isdn/i4l/isdn_tty.c | 34 | ||||
| -rw-r--r-- | drivers/isdn/i4l/isdn_tty.h | 1 | ||||
| -rw-r--r-- | include/linux/isdn.h | 6 |
5 files changed, 18 insertions, 31 deletions
diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.c b/drivers/isdn/i4l/isdn_ciscohdlck.c index e2a0c7541197..f8e903aa1b3c 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.c +++ b/drivers/isdn/i4l/isdn_ciscohdlck.c @@ -226,7 +226,7 @@ isdn_ciscohdlck_connected(isdn_net_dev *idev) cisco->myseq = 0; cisco->mineseen = 0; cisco->yourseq = 0; - cisco->keepalive_period = ISDN_TIMER_KEEPINT; + cisco->keepalive_period = 10; cisco->last_slarp_in = 0; cisco->line_state = 0; cisco->debserint = 0; diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 238bd997dbde..9c7286a012b2 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1154,7 +1154,6 @@ isdn_dc2minor(int di, int ch) } static int isdn_timer_cnt2 = 0; -static int isdn_timer_cnt3 = 0; static void isdn_timer_funct(ulong dummy) @@ -1169,11 +1168,6 @@ isdn_timer_funct(ulong dummy) if (tf & ISDN_TIMER_SLOW) { if (++isdn_timer_cnt2 >= ISDN_TIMER_1SEC) { isdn_timer_cnt2 = 0; - if (++isdn_timer_cnt3 >= ISDN_TIMER_RINGING) { - isdn_timer_cnt3 = 0; - if (tf & ISDN_TIMER_MODEMRING) - isdn_tty_modem_ring(); - } if (tf & ISDN_TIMER_CARRIER) isdn_tty_carrier_timeout(); } diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 5635c9ff3658..9036643f351e 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -20,6 +20,7 @@ #define VBUFX (VBUF/16) #endif +#define RING_TIMEOUT (5*HZ) /* repeat RING every 5 secs */ #define FIX_FILE_TRANSFER #define DUMMY_HAYES_AT @@ -27,6 +28,7 @@ static int isdn_tty_edit_at(const char *, int, modem_info *, int); static void isdn_tty_escape_timer(unsigned long data); +static void isdn_tty_ring_timer(unsigned long data); static void isdn_tty_check_esc(struct modem_info *info, const unsigned char *p, int count); static void isdn_tty_modem_reset_regs(modem_info *, int); @@ -2133,6 +2135,9 @@ isdn_tty_init(void) init_timer(&info->escape_timer); info->escape_timer.data = (unsigned long) info; info->escape_timer.function = isdn_tty_escape_timer; + init_timer(&info->ring_timer); + info->ring_timer.data = (unsigned long) info; + info->ring_timer.function = isdn_tty_ring_timer; skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); @@ -2315,7 +2320,7 @@ isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup) info->line); info->msr |= UART_MSR_RI; isdn_tty_modem_result(RESULT_RING, info); - isdn_timer_ctrl(ISDN_TIMER_MODEMRING, 1); + mod_timer(&info->ring_timer, jiffies + RING_TIMEOUT); return 1; } } @@ -3980,27 +3985,18 @@ isdn_tty_edit_at(const char *p, int count, modem_info * info, int user) return total; } -/* - * Put a RING-message to all modem-channels who have the RI-bit set. - * This function is called every second via timer-interrupt from within - * timer-dispatcher isdn_timer_function() - */ -void -isdn_tty_modem_ring(void) +static void +isdn_tty_ring_timer(unsigned long data) { - int ton = 0; - int i; + struct modem_info *info = (struct modem_info *) data; - for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &isdn_mdm.info[i]; - if (info->msr & UART_MSR_RI) { - ton = 1; - isdn_tty_modem_result(RESULT_RING, info); - } - } - isdn_timer_ctrl(ISDN_TIMER_MODEMRING, ton); -} + if (!(info->msr & UART_MSR_RI)) + return; + isdn_tty_modem_result(RESULT_RING, info); + mod_timer(&info->ring_timer, jiffies + RING_TIMEOUT); +} + /* * For all online tty's, try sending data to * the lower levels. diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index d0f53375bb54..59638874f8ba 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -98,7 +98,6 @@ ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \ (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2)) -extern void isdn_tty_modem_ring(void); extern void isdn_tty_carrier_timeout(void); extern void isdn_tty_modem_xmit(void); extern int isdn_tty_init(void); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index a9067e07e325..25a9631d0bd5 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -239,14 +239,11 @@ typedef struct { #define ISDN_TIMER_RES 4 /* Main Timer-Resolution */ #define ISDN_TIMER_02SEC (HZ/ISDN_TIMER_RES/5) /* Slow-Timer1 .2 sec */ #define ISDN_TIMER_1SEC (HZ/ISDN_TIMER_RES) /* Slow-Timer2 1 sec */ -#define ISDN_TIMER_RINGING 5 /* tty RINGs = ISDN_TIMER_1SEC * this factor */ -#define ISDN_TIMER_KEEPINT 10 /* Cisco-Keepalive = ISDN_TIMER_1SEC * this factor */ #define ISDN_TIMER_MODEMREAD 1 -#define ISDN_TIMER_MODEMRING 4 #define ISDN_TIMER_MODEMXMIT 8 #define ISDN_TIMER_CARRIER 256 /* Wait for Carrier */ #define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMXMIT) -#define ISDN_TIMER_SLOW (ISDN_TIMER_MODEMRING | ISDN_TIMER_CARRIER) +#define ISDN_TIMER_SLOW (ISDN_TIMER_CARRIER) /* GLOBAL_FLAGS */ #define ISDN_GLOBAL_STOPPED 1 @@ -362,6 +359,7 @@ typedef struct modem_info { struct tty_struct *tty; /* Pointer to corresponding tty */ atemu emu; /* AT-emulator data */ struct timer_list escape_timer; /* to recognize +++ escape */ + struct timer_list ring_timer; /* for writing 'RING' responses */ struct termios normal_termios; /* For saving termios structs */ struct termios callout_termios; wait_queue_head_t open_wait, close_wait; |
