Commit b0deac08 authored by Karsten Keil's avatar Karsten Keil Committed by Linus Torvalds

[PATCH] next fixes

here are the next fixes, sorry for the delay, but one of bugs was a really
odd one.

Note:
- here are lot of bugs left, so ISDN is not stable yet but
  I think it's really time to fix it, even if it need some cycles
  to get it right (normally I'm only send patches if it works 100% for
  me).
- I add some additional #warnings to address places which need fixing
  (I hope that some of the other ISDN developer jump in)
parent e0cce02e
......@@ -58,12 +58,16 @@ MODULE_LICENSE("GPL");
int capi_major = 68; /* allocated */
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
#define CAPINC_NR_PORTS 32
#define CAPINC_MAX_PORTS 256
int capi_ttymajor = 191;
int capi_ttyminors = CAPINC_NR_PORTS;
#endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
MODULE_PARM(capi_major, "i");
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
MODULE_PARM(capi_ttymajor, "i");
MODULE_PARM(capi_ttyminors, "i");
#endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
/* -------- defines ------------------------------------------------- */
......@@ -1262,7 +1266,6 @@ static int capinc_tty_read_proc(char *page, char **start, off_t off,
return 0;
}
#define CAPINC_NR_PORTS 256
static struct tty_driver *capinc_tty_driver;
static struct tty_operations capinc_ops = {
......@@ -1289,8 +1292,14 @@ static struct tty_operations capinc_ops = {
static int capinc_tty_init(void)
{
struct tty_driver *drv = alloc_tty_driver(CAPINC_NR_PORTS);
struct tty_driver *drv;
if (capi_ttyminors > CAPINC_MAX_PORTS)
capi_ttyminors = CAPINC_MAX_PORTS;
if (capi_ttyminors <= 0)
capi_ttyminors = CAPINC_NR_PORTS;
drv = alloc_tty_driver(capi_ttyminors);
if (!drv)
return -ENOMEM;
......@@ -1454,7 +1463,6 @@ static int __init capi_init(void)
char *p;
char *compileinfo;
if ((p = strchr(revision, ':')) != 0 && p[1]) {
strlcpy(rev, p + 2, sizeof(rev));
if ((p = strchr(rev, '$')) != 0 && p > rev)
......@@ -1470,8 +1478,6 @@ static int __init capi_init(void)
devfs_mk_cdev(MKDEV(capi_major, 0), S_IFCHR | S_IRUSR | S_IWUSR,
"isdn/capi20");
printk(KERN_NOTICE "capi20: started up with major %d\n", capi_major);
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
if (capinc_tty_init() < 0) {
unregister_chrdev(capi_major, "capi20");
......
......@@ -1991,6 +1991,10 @@ static int capidrv_addcontr(u16 contr, struct capi_profile *profp)
int i;
sprintf(id, "capidrv-%d", contr);
if (!try_module_get(THIS_MODULE)) {
printk(KERN_WARNING "capidrv: (%s) Could not reserve module\n", id);
return -1;
}
if (!(card = (capidrv_contr *) kmalloc(sizeof(capidrv_contr), GFP_ATOMIC))) {
printk(KERN_WARNING
"capidrv: (%s) Could not allocate contr-struct.\n", id);
......@@ -1998,11 +2002,6 @@ static int capidrv_addcontr(u16 contr, struct capi_profile *profp)
}
memset(card, 0, sizeof(capidrv_contr));
card->owner = THIS_MODULE;
if (!try_module_get(card->owner)) {
printk(KERN_WARNING "capidrv: (%s) Could not reserve module\n", id);
kfree(card);
return -1;
}
init_timer(&card->listentimer);
strcpy(card->name, id);
card->contrnr = contr;
......@@ -2099,6 +2098,7 @@ static int capidrv_delcontr(u16 contr)
printk(KERN_ERR "capidrv: delcontr: no contr %u\n", contr);
return -1;
}
#warning FIXME: maybe a race condition the card should be removed here from global list /kkeil
spin_unlock_irqrestore(&global_lock, flags);
del_timer(&card->listentimer);
......
......@@ -77,31 +77,17 @@ static struct work_struct tq_recv_notify;
static inline struct capi_ctr *
capi_ctr_get(struct capi_ctr *card)
{
if (try_module_get(card->owner))
return card;
return NULL;
if (!try_module_get(card->owner))
return NULL;
DBG("Reserve module: %s", card->owner->name);
return card;
}
static inline void
capi_ctr_put(struct capi_ctr *card)
{
module_put(card->owner);
DBG("MOD_COUNT DEC");
}
/* -------- own ref counting -------------------------------------- */
static inline void
kcapi_get_ref(void)
{
if (!try_module_get(THIS_MODULE))
printk(KERN_WARNING "%s: cannot reserve module\n", __FUNCTION__);
}
static inline void
kcapi_put_ref(void)
{
module_put(THIS_MODULE);
DBG("Release module: %s", card->owner->name);
}
/* ------------------------------------------------------------- */
......@@ -224,10 +210,13 @@ static int notify_push(unsigned int cmd, u32 controller,
{
struct capi_notifier *np;
kcapi_get_ref();
if (!try_module_get(THIS_MODULE)) {
printk(KERN_WARNING "%s: cannot reserve module\n", __FUNCTION__);
return -1;
}
np = (struct capi_notifier *)kmalloc(sizeof(struct capi_notifier), GFP_ATOMIC);
if (!np) {
kcapi_put_ref();
module_put(THIS_MODULE);
return -1;
}
memset(np, 0, sizeof(struct capi_notifier));
......@@ -241,9 +230,9 @@ static int notify_push(unsigned int cmd, u32 controller,
* of devices. Devices can only removed in
* user process, not in bh.
*/
kcapi_get_ref();
__module_get(THIS_MODULE);
if (schedule_work(&tq_state_notify) == 0)
kcapi_put_ref();
module_put(THIS_MODULE);
return 0;
}
......@@ -301,9 +290,9 @@ static void notify_handler(void *dummy)
while ((np = notify_dequeue()) != 0) {
notify_doit(np);
kfree(np);
kcapi_put_ref();
module_put(THIS_MODULE);
}
kcapi_put_ref();
module_put(THIS_MODULE);
}
/* -------- Receiver ------------------------------------------ */
......
......@@ -37,8 +37,8 @@
static int suppress_pollack;
static struct pci_device_id c4_pci_tbl[] = {
{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C4, 4 },
{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C2, 2 },
{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C4, 0, 0, (unsigned long)4 },
{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C2, 0, 0, (unsigned long)2 },
{ } /* Terminating entry */
};
......@@ -145,6 +145,7 @@ static inline int wait_for_doorbell(avmcard *card, unsigned long t)
while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
if (!time_before(jiffies, stop))
return -1;
mb();
}
return 0;
}
......@@ -297,6 +298,7 @@ static void c4_reset(avmcard *card)
if (!time_before(jiffies, stop))
return;
c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
mb();
}
c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
......@@ -320,6 +322,7 @@ static int c4_detect(avmcard *card)
if (!time_before(jiffies, stop))
return 2;
c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
mb();
}
c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
......@@ -899,6 +902,9 @@ static void c4_remove(struct pci_dev *pdev)
avmctrl_info *cinfo;
u_int i;
if (!card)
return;
c4_reset(card);
for (i=0; i < card->nr_controllers; i++) {
......@@ -910,6 +916,7 @@ static void c4_remove(struct pci_dev *pdev)
iounmap(card->mbase);
release_region(card->port, AVMB1_PORTLEN);
avmcard_dma_free(card->dma);
pci_set_drvdata(pdev, NULL);
b1_free_card(card);
}
......@@ -1141,7 +1148,7 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
retval = c4_detect(card);
if (retval != 0) {
printk(KERN_NOTICE "c4: NO card at 0x%x (%d)\n",
printk(KERN_NOTICE "c4: NO card at 0x%x error(%d)\n",
card->port, retval);
retval = -EIO;
goto err_unmap;
......@@ -1185,7 +1192,7 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
printk(KERN_INFO "c4: AVM C%d at i/o %#x, irq %d, mem %#lx\n",
nr_controllers, card->port, card->irq,
card->membase);
pci_set_drvdata(dev, card);
return 0;
err_free_irq:
......
......@@ -559,7 +559,7 @@ isdn_audio_eval_dtmf(modem_info * info)
ISDN_AUDIO_SKB_DLECOUNT(skb) = 0;
ISDN_AUDIO_SKB_LOCK(skb) = 0;
isdn_tty_queue_tail(info, skb, 2);
if ((dev->modempoll) && (info->rcvsched))
if (((get_isdn_dev())->modempoll) && (info->rcvsched))
mod_timer(&info->read_timer, jiffies + 4);
} else
kfree_skb(skb);
......@@ -670,7 +670,7 @@ isdn_audio_put_dle_code(modem_info * info, u_char code)
ISDN_AUDIO_SKB_LOCK(skb) = 0;
isdn_tty_queue_tail(info, skb, 2);
/* Schedule dequeuing */
if ((dev->modempoll) && (info->rcvsched))
if (((get_isdn_dev())->modempoll) && (info->rcvsched))
mod_timer(&info->read_timer, jiffies + 4);
}
......
This diff is collapsed.
......@@ -837,7 +837,7 @@ isdn_net_force_hangup(char *name) // FIXME rename?
if (!idev)
return -ENODEV;
if (idev->isdn_slot < 0)
if (idev->isdn_slot == NULL)
return -ENOTCONN;
isdn_net_hangup(idev);
......@@ -1186,7 +1186,7 @@ isdn_net_unbind_channel(isdn_net_dev *idev)
{
isdn_net_local *mlp = idev->mlp;
if (idev->isdn_slot < 0) {
if (idev->isdn_slot == NULL) {
isdn_BUG();
return;
}
......@@ -1344,7 +1344,7 @@ isdn_net_autodial(struct sk_buff *skb, struct net_device *ndev)
goto discard;
/* Log packet, which triggered dialing */
if (dev->net_verbose)
if ((get_isdn_dev())->net_verbose)
isdn_net_log_skb(skb, idev);
stop_queue:
......@@ -1497,12 +1497,13 @@ isdn_net_dev_icall(isdn_net_dev *idev, struct isdn_slot *slot,
int
isdn_net_find_icall(struct isdn_slot *slot, setup_parm *setup)
{
isdn_net_local *lp;
isdn_net_dev *idev;
char *nr, *eaz;
unsigned char si1, si2;
int retval;
unsigned long flags;
isdn_net_local *lp;
isdn_net_dev *idev;
char *nr, *eaz;
unsigned char si1, si2;
int retval;
int verbose = (get_isdn_dev())->net_verbose;
unsigned long flags;
/* fix up calling number */
if (!setup->phone[0]) {
......@@ -1522,14 +1523,14 @@ isdn_net_find_icall(struct isdn_slot *slot, setup_parm *setup)
}
si1 = setup->si1;
si2 = setup->si2;
if (dev->net_verbose > 1)
if (verbose > 1)
printk(KERN_INFO "isdn_net: call from %s,%d,%d -> %s\n",
nr, si1, si2, eaz);
/* check service indicator */
/* Accept DATA and VOICE calls at this stage
local eaz is checked later for allowed call types */
if ((si1 != 7) && (si1 != 1)) {
if (dev->net_verbose > 1)
if (verbose > 1)
printk(KERN_INFO "isdn_net: "
"Service-Indicator not 1 or 7, ignored\n");
return 0;
......@@ -1558,7 +1559,7 @@ isdn_net_find_icall(struct isdn_slot *slot, setup_parm *setup)
}
spin_unlock_irqrestore(&running_devs_lock, flags);
if (!retval) {
if (dev->net_verbose)
if (verbose)
printk(KERN_INFO "isdn_net: call "
"from %s -> %s ignored\n", nr, eaz);
}
......@@ -2174,10 +2175,10 @@ isdn_net_bsent(isdn_net_dev *idev, isdn_ctrl *c)
int
isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
{
isdn_net_dev *idev;
isdn_net_local *mlp = ndev->priv;
unsigned long flags;
int retval;
isdn_net_dev *idev;
isdn_net_local *mlp = ndev->priv;
unsigned long flags;
int retval;
ndev->trans_start = jiffies;
......@@ -2208,7 +2209,7 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
idev->last_jiffies = jiffies;
idev->transcount = 0;
}
if (dev->net_verbose > 3)
if ((get_isdn_dev())->net_verbose > 3)
printk(KERN_DEBUG "%s: %d bogocps\n", idev->name, idev->cps);
if (idev->cps > mlp->triggercps) {
......
......@@ -381,7 +381,7 @@ isdn_tty_rcv_skb(struct isdn_slot *slot, struct sk_buff *skb)
);
restore_flags(flags);
/* Schedule dequeuing */
if (dev->modempoll && info->rcvsched)
if ((get_isdn_dev())->modempoll && info->rcvsched)
mod_timer(&info->read_timer, jiffies + 4);
return 1;
}
......@@ -1735,8 +1735,10 @@ isdn_tty_open(struct tty_struct *tty, struct file *filp)
info = &isdn_mdm.info[line];
if (isdn_tty_paranoia_check(info, tty->name, "isdn_tty_open"))
return -ENODEV;
if (!try_module_get(info->owner))
if (!try_module_get(info->owner)) {
printk(KERN_WARNING "%s: cannot reserve module\n", __FUNCTION__);
return -ENODEV;
}
#ifdef ISDN_DEBUG_MODEM_OPEN
printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name,
info->count);
......@@ -1766,7 +1768,7 @@ isdn_tty_open(struct tty_struct *tty, struct file *filp)
#ifdef ISDN_DEBUG_MODEM_OPEN
printk(KERN_DEBUG "isdn_tty_open ttyi%d successful...\n", info->line);
#endif
dev->modempoll++;
(get_isdn_dev())->modempoll++;
#ifdef ISDN_DEBUG_MODEM_OPEN
printk(KERN_DEBUG "isdn_tty_open normal exit\n");
#endif
......@@ -1785,6 +1787,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp)
if (isdn_tty_paranoia_check(info, tty->name, "isdn_tty_close"))
goto out;
#warning need fixing /kkeil
save_flags(flags);
cli();
if (tty_hung_up_p(filp)) {
......@@ -1841,7 +1844,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp)
break;
}
}
dev->modempoll--;
(get_isdn_dev())->modempoll--;
isdn_tty_shutdown(info);
if (tty->driver->flush_buffer)
tty->driver->flush_buffer(tty);
......@@ -1985,8 +1988,8 @@ modem_write_profile(atemu * m)
memcpy(m->profile, m->mdmreg, ISDN_MODEM_NUMREG);
memcpy(m->pmsn, m->msn, ISDN_MSNLEN);
memcpy(m->plmsn, m->lmsn, ISDN_LMSNLEN);
if (dev->profd)
kill_pg_info(SIGIO, SEND_SIG_PRIV, dev->profd->pgrp);
if ((get_isdn_dev())->profd)
kill_pg_info(SIGIO, SEND_SIG_PRIV, (get_isdn_dev())->profd->pgrp);
}
static struct tty_operations modem_ops = {
......@@ -2228,7 +2231,7 @@ isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup)
printk(KERN_DEBUG "m_fi: match1 wret=%d\n", wret);
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]);
slot->usage);
#endif
if (
#ifndef FIX_FILE_TRANSFER
......@@ -2504,7 +2507,7 @@ isdn_tty_at_cout(char *msg, modem_info * info)
isdn_tty_queue_tail(info, skb, skb->len);
restore_flags(flags);
/* Schedule dequeuing */
if (dev->modempoll && info->rcvsched)
if ((get_isdn_dev())->modempoll && info->rcvsched)
mod_timer(&info->read_timer, jiffies + 4);
} else {
restore_flags(flags);
......@@ -3289,7 +3292,7 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
#ifdef CONFIG_ISDN_TTY_FAX
case '1':
p[0]++;
if (!(dev->global_features &
if (!((get_isdn_dev())->global_features &
ISDN_FEATURE_L3_FCLASS1))
PARSE_ERROR1;
m->mdmreg[REG_SI1] = 1;
......@@ -3300,7 +3303,7 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
break;
case '2':
p[0]++;
if (!(dev->global_features &
if (!((get_isdn_dev())->global_features &
ISDN_FEATURE_L3_FCLASS2))
PARSE_ERROR1;
m->mdmreg[REG_SI1] = 1;
......@@ -3322,10 +3325,10 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
p[0]++;
strcpy(rs, "\r\n0,");
#ifdef CONFIG_ISDN_TTY_FAX
if (dev->global_features &
if ((get_isdn_dev())->global_features &
ISDN_FEATURE_L3_FCLASS1)
strcat(rs, "1,");
if (dev->global_features &
if ((get_isdn_dev())->global_features &
ISDN_FEATURE_L3_FCLASS2)
strcat(rs, "2,");
#endif
......
This diff is collapsed.
......@@ -142,15 +142,15 @@ typedef struct icn_card {
int myid; /* Driver-Nr. assigned by linklevel */
int rvalid; /* IO-portregion has been requested */
int leased; /* Flag: This Adapter is connected */
/* to a leased line */
/* to a leased line */
unsigned short flags; /* Statusflags */
int doubleS0; /* Flag: ICN4B */
int secondhalf; /* Flag: Second half of a doubleS0 */
int fw_rev; /* Firmware revision loaded */
int ptype; /* Protocol type (1TR6 or Euro) */
struct timer_list st_timer; /* Timer for Status-Polls */
struct timer_list rb_timer; /* Timer for B-Channel-Polls */
u_char rcvbuf[ICN_BCH][4096]; /* B-Channel-Receive-Buffers */
struct timer_list st_timer; /* Timer for Status-Polls */
struct timer_list rb_timer; /* Timer for B-Channel-Polls */
u_char rcvbuf[ICN_BCH][4096]; /* B-Channel-Receive-Buffers */
int rcvidx[ICN_BCH]; /* Index for above buffers */
int l2_proto[ICN_BCH]; /* Current layer-2-protocol */
isdn_if interface; /* Interface to upper layer */
......@@ -162,18 +162,18 @@ typedef struct icn_card {
char *msg_buf_end; /* Pointer to end of statusbuffer */
int sndcount[ICN_BCH]; /* Byte-counters for B-Ch.-send */
int xlen[ICN_BCH]; /* Byte-counters/Flags for sent-ACK */
struct sk_buff *xskb[ICN_BCH];
/* Current transmitted skb */
struct sk_buff_head
spqueue[ICN_BCH]; /* Sendqueue */
struct sk_buff *xskb[ICN_BCH]; /* Current transmitted skb */
struct sk_buff_head spqueue[ICN_BCH]; /* Sendqueue */
char regname[35]; /* Name used for request_region */
u_char xmit_lock[ICN_BCH]; /* Semaphore for pollbchan_send() */
u_char xmit_lock[ICN_BCH]; /* Semaphore for pollbchan_send()*/
spinlock_t lock; /* protect critical operations */
} icn_card;
/*
* Main driver data
*/
typedef struct icn_dev {
spinlock_t devlock; /* spinlock to protect this struct */
unsigned long memaddr; /* Address of memory mapped buffers */
icn_shmem *shmem; /* Pointer to memory-mapped-buffers */
int mvalid; /* IO-shmem has been requested */
......
......@@ -94,48 +94,48 @@
#define ISDN_CMSGLEN 50 /* Length of CONNECT-Message to add for Modem */
#define ISDN_MSNLEN 32
#define NET_DV 0x06 /* Data version for isdn_net_ioctl_cfg */
#define TTY_DV 0x06 /* Data version for iprofd etc. */
#define NET_DV 0x06 /* Data version for isdn_net_ioctl_cfg */
#define TTY_DV 0x06 /* Data version for iprofd etc. */
#define INF_DV 0x01 /* Data version for /dev/isdninfo */
#define INF_DV 0x01 /* Data version for /dev/isdninfo */
typedef struct {
char drvid[25];
unsigned long arg;
char drvid[25];
unsigned long arg;
} isdn_ioctl_struct;
typedef struct {
char name[10];
char phone[ISDN_MSNLEN];
int outgoing;
char name[10];
char phone[ISDN_MSNLEN];
int outgoing;
} isdn_net_ioctl_phone;
typedef struct {
char name[10]; /* Name of interface */
char master[10]; /* Name of Master for Bundling */
char slave[10]; /* Name of Slave for Bundling */
char eaz[256]; /* EAZ/MSN */
char drvid[25]; /* DriverId for Bindings */
int onhtime; /* Hangup-Timeout */
int charge; /* Charge-Units */
int l2_proto; /* Layer-2 protocol */
int l3_proto; /* Layer-3 protocol */
int p_encap; /* Encapsulation */
int exclusive; /* Channel, if bound exclusive */
int dialmax; /* Dial Retry-Counter */
int slavedelay; /* Delay until slave starts up */
int cbdelay; /* Delay before Callback */
int chargehup; /* Flag: Charge-Hangup */
int ihup; /* Flag: Hangup-Timeout on incoming line */
int secure; /* Flag: Secure */
int callback; /* Flag: Callback */
int cbhup; /* Flag: Reject Call before Callback */
int pppbind; /* ippp device for bindings */
int chargeint; /* Use fixed charge interval length */
int triggercps; /* BogoCPS needed for triggering slave */
int dialtimeout; /* Dial-Timeout */
int dialwait; /* Time to wait after failed dial */
int dialmode; /* Flag: off / on / auto */
char name[10]; /* Name of interface */
char master[10]; /* Name of Master for Bundling */
char slave[10]; /* Name of Slave for Bundling */
char eaz[256]; /* EAZ/MSN */
char drvid[25]; /* DriverId for Bindings */
int onhtime; /* Hangup-Timeout */
int charge; /* Charge-Units */
int l2_proto; /* Layer-2 protocol */
int l3_proto; /* Layer-3 protocol */
int p_encap; /* Encapsulation */
int exclusive; /* Channel, if bound exclusive */
int dialmax; /* Dial Retry-Counter */
int slavedelay; /* Delay until slave starts up */
int cbdelay; /* Delay before Callback */
int chargehup; /* Flag: Charge-Hangup */
int ihup; /* Flag: Hangup-Timeout on incoming line */
int secure; /* Flag: Secure */
int callback; /* Flag: Callback */
int cbhup; /* Flag: Reject Call before Callback */
int pppbind; /* ippp device for bindings */
int chargeint; /* Use fixed charge interval length */
int triggercps; /* BogoCPS needed for triggering slave */
int dialtimeout; /* Dial-Timeout */
int dialwait; /* Time to wait after failed dial */
int dialmode; /* Flag: off / on / auto */
} isdn_net_ioctl_cfg;
#define ISDN_NET_DIALMODE_MASK 0xC0 /* bits for status */
......@@ -385,24 +385,22 @@ typedef struct {
} infostruct;
/* Main driver-data */
typedef struct isdn_devt {
unsigned short flags; /* Bitmapped Flags: */
/* */
int channels; /* Current number of channels */
int net_verbose; /* Verbose-Flag */
int modempoll; /* Flag: tty-read active */
int tflags; /* Timer-Flags: */
/* see ISDN_TIMER_..defines */
int global_flags;
infostruct *infochain; /* List of open info-devs. */
wait_queue_head_t info_waitq; /* Wait-Queue for isdninfo */
struct task_struct *profd; /* For iprofd */
struct semaphore sem; /* serialize list access*/
unsigned long global_features;
} isdn_dev;
extern isdn_dev *dev;
typedef struct _isdn_dev_t {
unsigned short flags; /* Bitmapped Flags: */
int channels; /* Current number of channels */
int net_verbose; /* Verbose-Flag */
int modempoll; /* Flag: tty-read active */
int tflags; /* Timer-Flags: */
/* see ISDN_TIMER_..defines */
int global_flags;
infostruct *infochain; /* List of open info-devs. */
wait_queue_head_t info_waitq; /* Wait-Queue for isdninfo */
struct task_struct *profd; /* For iprofd */
struct semaphore sem; /* serialize list access*/
unsigned long global_features;
} isdn_dev_t;
extern isdn_dev_t *get_isdn_dev(void);
#endif /* __KERNEL__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment