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_connect_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);
}
#endif
info->dialing = 1;
- info->emu.carrierwait = 0;
isdn_slot_dial(info->isdn_slot, &dial);
- isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1);
+ mod_timer(&info->connect_timer, jiffies + info->emu.mdmreg[REG_WAITC] * HZ);
}
}
// strcpy(dev->num[i], n);
isdn_info_update();
isdn_slot_command(info->isdn_slot, CAPI_PUT_MESSAGE, &cmd);
- isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1);
+ mod_timer(&info->connect_timer, jiffies + info->emu.mdmreg[REG_WAITC] * HZ);
}
}
init_timer(&info->ring_timer);
info->ring_timer.data = (unsigned long) info;
info->ring_timer.function = isdn_tty_ring_timer;
+ init_timer(&info->connect_timer);
+ info->connect_timer.data = (unsigned long) info;
+ info->connect_timer.function = isdn_tty_connect_timer;
skb_queue_head_init(&info->rpqueue);
info->xmit_size = ISDN_SERIAL_XMIT_SIZE;
skb_queue_head_init(&info->xmit_queue);
#endif
isdn_slot_command(info->isdn_slot, ISDN_CMD_SETL3, &cmd);
info->dialing = 16;
- info->emu.carrierwait = 0;
isdn_slot_command(info->isdn_slot, ISDN_CMD_ACCEPTD, &cmd);
- isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1);
+ mod_timer(&info->connect_timer, jiffies + info->emu.mdmreg[REG_WAITC] * HZ);
} else
isdn_tty_modem_result(RESULT_NO_ANSWER, info);
}
isdn_timer_ctrl(ISDN_TIMER_MODEMXMIT, ton);
}
-/*
- * Check all channels if we have a 'no carrier' timeout.
- * Timeout value is set by Register S7.
- */
-void
-isdn_tty_carrier_timeout(void)
+static void
+isdn_tty_connect_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->dialing) {
- if (info->emu.carrierwait++ > info->emu.mdmreg[REG_WAITC]) {
- info->dialing = 0;
- isdn_tty_modem_result(RESULT_NO_CARRIER, info);
- isdn_tty_modem_hup(info, 1);
- }
- else
- ton = 1;
- }
+ if (info->dialing) {
+ info->dialing = 0;
+ isdn_tty_modem_result(RESULT_NO_CARRIER, info);
+ isdn_tty_modem_hup(info, 1);
}
- isdn_timer_ctrl(ISDN_TIMER_CARRIER, ton);
}
/* Timer-delays and scheduling-flags */
#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_MODEMREAD 1
#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_CARRIER)
/* GLOBAL_FLAGS */
#define ISDN_GLOBAL_STOPPED 1
int mdmcmdl; /* Length of Modem-Commandbuffer */
int pluscount; /* Counter for +++ sequence */
int lastplus; /* Timestamp of last + */
- int carrierwait; /* Seconds of carrier waiting */
char mdmcmd[255]; /* Modem-Commandbuffer */
unsigned int charge; /* Charge units of current connection */
} atemu;
atemu emu; /* AT-emulator data */
struct timer_list escape_timer; /* to recognize +++ escape */
struct timer_list ring_timer; /* for writing 'RING' responses */
+ struct timer_list connect_timer; /* waiting for CONNECT */
struct termios normal_termios; /* For saving termios structs */
struct termios callout_termios;
wait_queue_head_t open_wait, close_wait;