slot_unbind(struct fsm_inst *fi, int pr, void *arg)
{
struct isdn_slot *slot = fi->userdata;
+ int sl = slot - slots;
+ isdn_ctrl cmd;
strcpy(slot->num, "???");
+ cmd.parm.num[0] = '\0';
+ isdn_slot_command(sl, ISDN_CMD_SETEAZ, &cmd);
slot->ibytes = 0;
slot->obytes = 0;
slot->usage = ISDN_USAGE_NONE;
static int isdn_add_channels(struct isdn_driver *, int, int, int);
static void isdn_receive_skb_callback(int di, int ch, struct sk_buff *skb);
static int isdn_status_callback(isdn_ctrl * c);
+static int isdn_dc2minor(int di, int ch);
static void isdn_v110_add_features(struct isdn_driver *drv);
return isdn_wildmat( TmpMsn1, TmpMsn2 );
}
-int
+static int
isdn_dc2minor(int di, int ch)
{
int i;
/*
* Set state of ISDN-channel to 'unused'
*/
-void
-isdn_free_channel(int di, int ch, int usage)
-{
- int sl;
-
- sl = isdn_dc2minor(di, ch);
- isdn_slot_free(sl);
-}
-
void
isdn_slot_free(int sl)
{
return isdn_slot_command(sl, ISDN_CMD_DIAL, &cmd);
}
-void
-isdn_slot_all_eaz(int sl)
-{
- isdn_ctrl cmd;
-
- cmd.parm.num[0] = '\0';
- isdn_slot_command(sl, ISDN_CMD_SETEAZ, &cmd);
-}
-
int
isdn_slot_usage(int sl)
{
extern void isdn_lock_drivers(void);
extern void isdn_unlock_drivers(void);
extern void isdn_free_channel(int di, int ch, int usage);
-extern int isdn_dc2minor(int di, int ch);
extern void isdn_info_update(void);
extern char *isdn_map_eaz2msn(char *msn, int di);
extern void isdn_timer_ctrl(int tf, int onoff);
extern int isdn_get_free_slot(int, int, int, int, int, char *);
extern void isdn_slot_free(int slot);
-extern void isdn_slot_all_eaz(int slot);
extern int isdn_slot_command(int slot, int cmd, isdn_ctrl *);
extern int isdn_slot_dial(int slot, struct dial_info *dial);
extern char *isdn_slot_map_eaz2msn(int slot, char *msn);
}
static int
-isdn_net_dev_icall(isdn_net_dev *idev, int di, int ch, int si1,
+isdn_net_dev_icall(isdn_net_dev *idev, int slot, int di, int ch, int si1,
char *eaz, char *nr)
{
isdn_net_local *mlp = idev->mlp;
struct isdn_net_phone *ph;
- int slot = isdn_dc2minor(di, ch);
char *my_eaz;
/* check acceptable call types for DOV */
* would eventually match if CID was longer.
*/
int
-isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
+isdn_net_find_icall(int di, int ch, int sl, setup_parm *setup)
{
isdn_net_local *lp;
isdn_net_dev *idev;
return 0;
}
- dbg_net_icall("n_fi: di=%d ch=%d idx=%d usg=%d\n", di, ch, idx,
- isdn_slot_usage(idx));
+ dbg_net_icall("n_fi: di=%d ch=%d sl=%d usg=%d\n", di, ch, sl,
+ isdn_slot_usage(sl));
retval = 0;
spin_lock_irqsave(&running_devs_lock, flags);
spin_unlock_irqrestore(&running_devs_lock, flags);
list_for_each_entry(idev, &lp->slaves, slaves) {
- retval = isdn_net_dev_icall(idev, di, ch, si1, eaz, nr);
+ retval = isdn_net_dev_icall(idev, sl, di, ch, si1, eaz, nr);
if (retval > 0)
break;
}
isdn_net_dev *idev = fi->userdata;
del_timer(&idev->dial_timer);
- isdn_slot_all_eaz(idev->isdn_slot);
printk(KERN_INFO "%s: connection failed\n", idev->name);
isdn_net_unbind_channel(idev);
return 0;
isdn_net_dev *idev = fi->userdata;
printk(KERN_INFO "%s: Chargesum is %d\n", idev->name, idev->charge);
- isdn_slot_all_eaz(idev->isdn_slot);
isdn_net_unbind_channel(idev);
return 0;
}
if (local)
isdn_slot_command(slot, ISDN_CMD_HANGUP, &cmd);
- isdn_slot_all_eaz(slot);
info->emu.mdmreg[REG_RINGCNT] = 0;
skb_queue_purge(&info->rpqueue);
isdn_slot_free(slot);
char *eaz;
int i;
int wret;
- int idx;
int si1;
int si2;
char *nr;
continue;
if ((info->emu.mdmreg[REG_SI1] & si2bit[si1]) && /* SI1 is matching */
(info->emu.mdmreg[REG_SI2] == si2)) { /* SI2 is matching */
- idx = isdn_dc2minor(di, ch);
#ifdef ISDN_DEBUG_MODEM_ICALL
printk(KERN_DEBUG "m_fi: match1 wret=%d\n", wret);
- printk(KERN_DEBUG "m_fi: idx=%d flags=%08lx drv=%d ch=%d usg=%d\n", idx,
+ printk(KERN_DEBUG "m_fi: sl=%d flags=%08lx drv=%d ch=%d usg=%d\n", sl,
info->flags, info->isdn_driver, info->isdn_channel,
dev->usage[idx]);
#endif
(info->flags & ISDN_ASYNC_NORMAL_ACTIVE) &&
#endif
(info->isdn_slot == -1) &&
- (USG_NONE(isdn_slot_usage(idx)))) {
+ (USG_NONE(isdn_slot_usage(sl)))) {
int matchret;
if ((matchret = isdn_tty_match_icall(eaz, &info->emu, di)) > wret)
wret = matchret;
if (!matchret) { /* EAZ is matching */
- info->isdn_slot = idx;
- isdn_slot_set_m_idx(idx, info->line);
- isdn_slot_set_priv(idx, isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]), info, isdn_tty_stat_callback, isdn_tty_rcv_skb);
- strcpy(isdn_slot_num(idx), nr);
+ info->isdn_slot = sl;
+ isdn_slot_set_m_idx(sl, info->line);
+ isdn_slot_set_priv(sl, isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]), info, isdn_tty_stat_callback, isdn_tty_rcv_skb);
+ strcpy(isdn_slot_num(sl), nr);
strcpy(info->emu.cpn, eaz);
info->emu.mdmreg[REG_SI1I] = si2bit[si1];
info->emu.mdmreg[REG_PLAN] = setup->plan;
#ifdef ISDN_TTY_STAT_DEBUG
printk(KERN_DEBUG "tty_STAT_BSENT ttyI%d\n", info->line);
#endif
- if ((info->isdn_slot == isdn_dc2minor(c->driver, c->arg))) {
- info->msr |= UART_MSR_CTS;
- if (info->send_outstanding)
- if (!(--info->send_outstanding))
- info->lsr |= UART_LSR_TEMT;
- isdn_tty_tint(info);
- return 1;
- }
- break;
+ info->msr |= UART_MSR_CTS;
+ if (info->send_outstanding)
+ if (!(--info->send_outstanding))
+ info->lsr |= UART_LSR_TEMT;
+ isdn_tty_tint(info);
+ return 1;
case ISDN_STAT_CAUSE:
#ifdef ISDN_TTY_STAT_DEBUG
printk(KERN_DEBUG "tty_STAT_CAUSE ttyI%d\n", info->line);