[PATCH] Removal of big kernel lock from isdn drivers [1/3]

From: Dave Hansen (haveblue@us.ibm.com)
Date: Thu Feb 07 2002 - 11:36:36 EST


1 of 3

isdn.bkl-remove.isdn_dev_rwsem.patch:
* changes name of "dev" to "isdn_dev"
      - If there are going to be global variables,
        they can at least not have exceedingly generic
        names like "dev"!
* adds global isdn_dev_rwsem
      - isdn_dev_rwsem must be held when manipulating "isdn_dev"

This could probably be 2 different patches, but I don't imagine that
the name change will be very controvertial.

I've been examining the continuing additions of the big kernel lock
(BKL) to the 2.5 tree. I noticed that in 2.5.3, the ISDN subsystem
added the BKL to several places. In response to this, I have written
several patches to attempt removal of the BKL from the ISDN subsystem.
I have little knowledge of the drivers themselves, so I would like some
assistance from those of you who understand them better. I probably
have an over-simplified view of the code, so my patches may be too
simplistic.

-- 
Dave Hansen
haveblue@us.ibm.com
diff -ur -X exclude linux-2.5.3-clean/drivers/isdn/isdn_audio.c linux/drivers/isdn/isdn_audio.c
--- linux-2.5.3-clean/drivers/isdn/isdn_audio.c	Sun Sep 30 12:26:06 2001
+++ linux/drivers/isdn/isdn_audio.c	Mon Feb  4 11:35:49 2002
@@ -564,13 +564,13 @@
 			cli();
 			di = info->isdn_driver;
 			ch = info->isdn_channel;
-			__skb_queue_tail(&dev->drv[di]->rpqueue[ch], skb);
-			dev->drv[di]->rcvcount[ch] += 2;
+			__skb_queue_tail(&isdn_dev->drv[di]->rpqueue[ch], skb);
+			isdn_dev->drv[di]->rcvcount[ch] += 2;
 			restore_flags(flags);
 			/* Schedule dequeuing */
-			if ((dev->modempoll) && (info->rcvsched))
+			if ((isdn_dev->modempoll) && (info->rcvsched))
 				isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1);
-			wake_up_interruptible(&dev->drv[di]->rcv_waitq[ch]);
+			wake_up_interruptible(&isdn_dev->drv[di]->rcv_waitq[ch]);
 		} else
 			kfree_skb(skb);
 		s->last = what;
@@ -685,13 +685,13 @@
 	cli();
 	di = info->isdn_driver;
 	ch = info->isdn_channel;
-	__skb_queue_tail(&dev->drv[di]->rpqueue[ch], skb);
-	dev->drv[di]->rcvcount[ch] += 2;
+	__skb_queue_tail(&isdn_dev->drv[di]->rpqueue[ch], skb);
+	isdn_dev->drv[di]->rcvcount[ch] += 2;
 	restore_flags(flags);
 	/* Schedule dequeuing */
-	if ((dev->modempoll) && (info->rcvsched))
+	if ((isdn_dev->modempoll) && (info->rcvsched))
 		isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1);
-	wake_up_interruptible(&dev->drv[di]->rcv_waitq[ch]);
+	wake_up_interruptible(&isdn_dev->drv[di]->rcv_waitq[ch]);
 }
 
 void
diff -ur -X exclude linux-2.5.3-clean/drivers/isdn/isdn_common.c linux/drivers/isdn/isdn_common.c
--- linux-2.5.3-clean/drivers/isdn/isdn_common.c	Sun Jan 27 11:33:38 2002
+++ linux/drivers/isdn/isdn_common.c	Mon Feb  4 11:40:24 2002
@@ -42,7 +42,8 @@
 MODULE_AUTHOR("Fritz Elfert");
 MODULE_LICENSE("GPL");
 
-isdn_dev *dev;
+isdn_dev_t *isdn_dev;
+DECLARE_RWSEM(isdn_dev_rwsem);
 
 static char *isdn_revision = "$Revision: 1.114.6.16 $";
 
@@ -75,14 +76,14 @@
 {
 	int i;
 
-	for (i = 0; i < dev->drivers; i++) {
+	for (i = 0; i < isdn_dev->drivers; i++) {
 		isdn_ctrl cmd;
 
 		cmd.driver = i;
 		cmd.arg = 0;
 		cmd.command = ISDN_CMD_LOCK;
 		isdn_command(&cmd);
-		dev->drv[i]->locks++;
+		isdn_dev->drv[i]->locks++;
 	}
 }
 
@@ -98,16 +99,18 @@
 {
 	int i;
 
-	for (i = 0; i < dev->drivers; i++)
-		if (dev->drv[i]->locks > 0) {
+	down_read(&isdn_dev_rwsem);
+	for (i = 0; i < isdn_dev->drivers; i++)
+		if (isdn_dev->drv[i]->locks > 0) {
 			isdn_ctrl cmd;
 
 			cmd.driver = i;
 			cmd.arg = 0;
 			cmd.command = ISDN_CMD_UNLOCK;
 			isdn_command(&cmd);
-			dev->drv[i]->locks--;
+			isdn_dev->drv[i]->locks--;
 		}
+        up_read(&isdn_dev_rwsem);
 }
 
 void
@@ -230,7 +233,7 @@
 {
 	int i;
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-		if (dev->chanmap[i] == ch && dev->drvmap[i] == di)
+		if (isdn_dev->chanmap[i] == ch && isdn_dev->drvmap[i] == di)
 			return i;
 	return -1;
 }
@@ -242,7 +245,7 @@
 static void
 isdn_timer_funct(ulong dummy)
 {
-	int tf = dev->tflags;
+	int tf = isdn_dev->tflags;
 	if (tf & ISDN_TIMER_FAST) {
 		if (tf & ISDN_TIMER_MODEMREAD)
 			isdn_tty_readmodem();
@@ -276,7 +279,7 @@
 
 		save_flags(flags);
 		cli();
-		mod_timer(&dev->timer, jiffies+ISDN_TIMER_RES);
+		mod_timer(&isdn_dev->timer, jiffies+ISDN_TIMER_RES);
 		restore_flags(flags);
 	}
 }
@@ -289,18 +292,18 @@
 
 	save_flags(flags);
 	cli();
-	if ((tf & ISDN_TIMER_SLOW) && (!(dev->tflags & ISDN_TIMER_SLOW))) {
+	if ((tf & ISDN_TIMER_SLOW) && (!(isdn_dev->tflags & ISDN_TIMER_SLOW))) {
 		/* If the slow-timer wasn't activated until now */
 		isdn_timer_cnt1 = 0;
 		isdn_timer_cnt2 = 0;
 	}
-	old_tflags = dev->tflags;
+	old_tflags = isdn_dev->tflags;
 	if (onoff)
-		dev->tflags |= tf;
+		isdn_dev->tflags |= tf;
 	else
-		dev->tflags &= ~tf;
-	if (dev->tflags && !old_tflags)
-		mod_timer(&dev->timer, jiffies+ISDN_TIMER_RES);
+		isdn_dev->tflags &= ~tf;
+	if (isdn_dev->tflags && !old_tflags)
+		mod_timer(&isdn_dev->timer, jiffies+ISDN_TIMER_RES);
 	restore_flags(flags);
 }
 
@@ -317,7 +320,7 @@
 		return;
 	}
 	/* Update statistics */
-	dev->ibytes[i] += skb->len;
+	isdn_dev->ibytes[i] += skb->len;
 	
 	/* First, try to deliver data to network-device */
 	if (isdn_net_rcv_skb(i, skb))
@@ -327,10 +330,10 @@
 	 * makes sense for async streams only, so it is
 	 * called after possible net-device delivery.
 	 */
-	if (dev->v110[i]) {
-		atomic_inc(&dev->v110use[i]);
-		skb = isdn_v110_decode(dev->v110[i], skb);
-		atomic_dec(&dev->v110use[i]);
+	if (isdn_dev->v110[i]) {
+		atomic_inc(&isdn_dev->v110use[i]);
+		skb = isdn_v110_decode(isdn_dev->v110[i], skb);
+		atomic_dec(&isdn_dev->v110use[i]);
 		if (!skb)
 			return;
 	}
@@ -339,7 +342,7 @@
 	if (skb->len) {
 		if (isdn_tty_rcv_skb(i, di, channel, skb))
 			return;
-		wake_up_interruptible(&dev->drv[di]->rcv_waitq[channel]);
+		wake_up_interruptible(&isdn_dev->drv[di]->rcv_waitq[channel]);
 	} else
 		dev_kfree_skb(skb);
 }
@@ -360,7 +363,7 @@
 	if (cmd->command == ISDN_CMD_SETL2) {
 		int idx = isdn_dc2minor(cmd->driver, cmd->arg & 255);
 		unsigned long l2prot = (cmd->arg >> 8) & 255;
-		unsigned long features = (dev->drv[cmd->driver]->interface->features
+		unsigned long features = (isdn_dev->drv[cmd->driver]->interface->features
 						>> ISDN_FEATURE_L2_SHIFT) &
 						ISDN_FEATURE_L2_MASK;
 		unsigned long l2_feature = (1 << l2prot);
@@ -374,14 +377,14 @@
 			 * Layer-2 to transparent
 			 */
 				if (!(features & l2_feature)) {
-					dev->v110emu[idx] = l2prot;
+					isdn_dev->v110emu[idx] = l2prot;
 					cmd->arg = (cmd->arg & 255) |
 						(ISDN_PROTO_L2_TRANS << 8);
 				} else
-					dev->v110emu[idx] = 0;
+					isdn_dev->v110emu[idx] = 0;
 		}
 	}
-	return dev->drv[cmd->driver]->interface->command(cmd);
+	return isdn_dev->drv[cmd->driver]->interface->command(cmd);
 }
 
 void
@@ -438,7 +441,7 @@
 		case ISDN_STAT_BSENT:
 			if (i < 0)
 				return -1;
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
 			if (isdn_net_stat_callback(i, c))
 				return 0;
@@ -446,24 +449,24 @@
 				return 0;
 			if (isdn_tty_stat_callback(i, c))
 				return 0;
-			wake_up_interruptible(&dev->drv[di]->snd_waitq[c->arg]);
+			wake_up_interruptible(&isdn_dev->drv[di]->snd_waitq[c->arg]);
 			break;
 		case ISDN_STAT_STAVAIL:
 			save_flags(flags);
 			cli();
-			dev->drv[di]->stavail += c->arg;
+			isdn_dev->drv[di]->stavail += c->arg;
 			restore_flags(flags);
-			wake_up_interruptible(&dev->drv[di]->st_waitq);
+			wake_up_interruptible(&isdn_dev->drv[di]->st_waitq);
 			break;
 		case ISDN_STAT_RUN:
-			dev->drv[di]->flags |= DRV_FLAG_RUNNING;
+			isdn_dev->drv[di]->flags |= DRV_FLAG_RUNNING;
 			for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-				if (dev->drvmap[i] == di)
-					isdn_all_eaz(di, dev->chanmap[i]);
+				if (isdn_dev->drvmap[i] == di)
+					isdn_all_eaz(di, isdn_dev->chanmap[i]);
 			set_global_features();
 			break;
 		case ISDN_STAT_STOP:
-			dev->drv[di]->flags &= ~DRV_FLAG_RUNNING;
+			isdn_dev->drv[di]->flags &= ~DRV_FLAG_RUNNING;
 			break;
 		case ISDN_STAT_ICALL:
 			if (i < 0)
@@ -471,7 +474,7 @@
 #ifdef ISDN_DEBUG_STATCALLB
 			printk(KERN_DEBUG "ICALL (net): %d %ld %s\n", di, c->arg, c->parm.num);
 #endif
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED) {
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED) {
 				cmd.driver = di;
 				cmd.arg = c->arg;
 				cmd.command = ISDN_CMD_HANGUP;
@@ -494,7 +497,7 @@
                  	                  if ((retval = divert_if->stat_callback(c))) 
 					    return(retval); /* processed */
 #endif /* CONFIG_ISDN_DIVERSION */                       
-					if ((!retval) && (dev->drv[di]->flags & DRV_FLAG_REJBUS)) {
+					if ((!retval) && (isdn_dev->drv[di]->flags & DRV_FLAG_REJBUS)) {
 						/* No tty responding */
 						cmd.driver = di;
 						cmd.arg = c->arg;
@@ -509,7 +512,7 @@
 					cmd.driver = di;
 					cmd.arg = c->arg;
 					cmd.command = ISDN_CMD_ACCEPTD;
-					for ( p = dev->netdev; p; p = p->next )
+					for ( p = isdn_dev->netdev; p; p = p->next )
 						if ( p->local->isdn_channel == cmd.arg )
 						{
 							strcpy( cmd.parm.setup.eazmsn, p->local->msn );
@@ -550,7 +553,7 @@
 #ifdef ISDN_DEBUG_STATCALLB
 			printk(KERN_DEBUG "CINF: %ld %s\n", c->arg, c->parm.num);
 #endif
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
 			if (strcmp(c->parm.num, "0"))
 				isdn_net_stat_callback(i, c);
@@ -561,7 +564,7 @@
 			printk(KERN_DEBUG "CAUSE: %ld %s\n", c->arg, c->parm.num);
 #endif
 			printk(KERN_INFO "isdn: %s,ch%ld cause: %s\n",
-			       dev->drvid[di], c->arg, c->parm.num);
+			       isdn_dev->drvid[di], c->arg, c->parm.num);
 			isdn_tty_stat_callback(i, c);
 #ifdef CONFIG_ISDN_DIVERSION
                         if (divert_if)
@@ -584,7 +587,7 @@
 #ifdef ISDN_DEBUG_STATCALLB
 			printk(KERN_DEBUG "DCONN: %ld\n", c->arg);
 #endif
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
 			/* Find any net-device, waiting for D-channel setup */
 			if (isdn_net_stat_callback(i, c))
@@ -605,9 +608,9 @@
 #ifdef ISDN_DEBUG_STATCALLB
 			printk(KERN_DEBUG "DHUP: %ld\n", c->arg);
 #endif
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
-			dev->drv[di]->online &= ~(1 << (c->arg));
+			isdn_dev->drv[di]->online &= ~(1 << (c->arg));
 			isdn_info_update();
 			/* Signal hangup to network-devices */
 			if (isdn_net_stat_callback(i, c))
@@ -628,9 +631,9 @@
 			printk(KERN_DEBUG "BCONN: %ld\n", c->arg);
 #endif
 			/* Signal B-channel-connect to network-devices */
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
-			dev->drv[di]->online |= (1 << (c->arg));
+			isdn_dev->drv[di]->online |= (1 << (c->arg));
 			isdn_info_update();
 			if (isdn_net_stat_callback(i, c))
 				break;
@@ -644,9 +647,9 @@
 #ifdef ISDN_DEBUG_STATCALLB
 			printk(KERN_DEBUG "BHUP: %ld\n", c->arg);
 #endif
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
-			dev->drv[di]->online &= ~(1 << (c->arg));
+			isdn_dev->drv[di]->online &= ~(1 << (c->arg));
 			isdn_info_update();
 #ifdef CONFIG_ISDN_X25
 			/* Signal hangup to network-devices */
@@ -663,7 +666,7 @@
 #ifdef ISDN_DEBUG_STATCALLB
 			printk(KERN_DEBUG "NODCH: %ld\n", c->arg);
 #endif
-			if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+			if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 				return 0;
 			if (isdn_net_stat_callback(i, c))
 				break;
@@ -671,7 +674,7 @@
 				break;
 			break;
 		case ISDN_STAT_ADDCH:
-			if (isdn_add_channels(dev->drv[di], di, c->arg, 1))
+			if (isdn_add_channels(isdn_dev->drv[di], di, c->arg, 1))
 				return -1;
 			isdn_info_update();
 			break;
@@ -679,13 +682,13 @@
 			save_flags(flags);
 			cli();
 			for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-				if ((dev->drvmap[i] == di) &&
-				    (dev->chanmap[i] == c->arg)) {
+				if ((isdn_dev->drvmap[i] == di) &&
+				    (isdn_dev->chanmap[i] == c->arg)) {
 				    if (c->parm.num[0])
-				      dev->usage[i] &= ~ISDN_USAGE_DISABLED;
+				      isdn_dev->usage[i] &= ~ISDN_USAGE_DISABLED;
 				    else
-				      if (USG_NONE(dev->usage[i])) {
-					dev->usage[i] |= ISDN_USAGE_DISABLED;
+				      if (USG_NONE(isdn_dev->usage[i])) {
+					isdn_dev->usage[i] |= ISDN_USAGE_DISABLED;
 				      }
 				      else 
 					retval = -1;
@@ -695,35 +698,35 @@
 			isdn_info_update();
 			break;
 		case ISDN_STAT_UNLOAD:
-			while (dev->drv[di]->locks > 0) {
+			while (isdn_dev->drv[di]->locks > 0) {
 				isdn_ctrl cmd;
 				cmd.driver = di;
 				cmd.arg = 0;
 				cmd.command = ISDN_CMD_UNLOCK;
 				isdn_command(&cmd);
-				dev->drv[di]->locks--;
+				isdn_dev->drv[di]->locks--;
 			}
 			save_flags(flags);
 			cli();
 			isdn_tty_stat_callback(i, c);
 			for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-				if (dev->drvmap[i] == di) {
-					dev->drvmap[i] = -1;
-					dev->chanmap[i] = -1;
-					dev->usage[i] &= ~ISDN_USAGE_DISABLED;
+				if (isdn_dev->drvmap[i] == di) {
+					isdn_dev->drvmap[i] = -1;
+					isdn_dev->chanmap[i] = -1;
+					isdn_dev->usage[i] &= ~ISDN_USAGE_DISABLED;
 					isdn_unregister_devfs(i);
 				}
-			dev->drivers--;
-			dev->channels -= dev->drv[di]->channels;
-			kfree(dev->drv[di]->rcverr);
-			kfree(dev->drv[di]->rcvcount);
-			for (i = 0; i < dev->drv[di]->channels; i++)
-				skb_queue_purge(&dev->drv[di]->rpqueue[i]);
-			kfree(dev->drv[di]->rpqueue);
-			kfree(dev->drv[di]->rcv_waitq);
-			kfree(dev->drv[di]);
-			dev->drv[di] = NULL;
-			dev->drvid[di][0] = '\0';
+			isdn_dev->drivers--;
+			isdn_dev->channels -= isdn_dev->drv[di]->channels;
+			kfree(isdn_dev->drv[di]->rcverr);
+			kfree(isdn_dev->drv[di]->rcvcount);
+			for (i = 0; i < isdn_dev->drv[di]->channels; i++)
+				skb_queue_purge(&isdn_dev->drv[di]->rpqueue[i]);
+			kfree(isdn_dev->drv[di]->rpqueue);
+			kfree(isdn_dev->drv[di]->rcv_waitq);
+			kfree(isdn_dev->drv[di]);
+			isdn_dev->drv[di] = NULL;
+			isdn_dev->drvid[di][0] = '\0';
 			isdn_info_update();
 			set_global_features();
 			restore_flags(flags);
@@ -792,26 +795,26 @@
 	struct sk_buff *skb;
 	u_char *cp;
 
-	if (!dev->drv[di])
+	if (!isdn_dev->drv[di])
 		return 0;
-	if (skb_queue_empty(&dev->drv[di]->rpqueue[channel])) {
+	if (skb_queue_empty(&isdn_dev->drv[di]->rpqueue[channel])) {
 		if (sleep)
 			interruptible_sleep_on(sleep);
 		else
 			return 0;
 	}
-	if (len > dev->drv[di]->rcvcount[channel])
-		len = dev->drv[di]->rcvcount[channel];
+	if (len > isdn_dev->drv[di]->rcvcount[channel])
+		len = isdn_dev->drv[di]->rcvcount[channel];
 	cp = buf;
 	count = 0;
 	while (len) {
-		if (!(skb = skb_peek(&dev->drv[di]->rpqueue[channel])))
+		if (!(skb = skb_peek(&isdn_dev->drv[di]->rpqueue[channel])))
 			break;
 #ifdef CONFIG_ISDN_AUDIO
 		if (ISDN_AUDIO_SKB_LOCK(skb))
 			break;
 		ISDN_AUDIO_SKB_LOCK(skb) = 1;
-		if ((ISDN_AUDIO_SKB_DLECOUNT(skb)) || (dev->drv[di]->DLEflag & (1 << channel))) {
+		if ((ISDN_AUDIO_SKB_DLECOUNT(skb)) || (isdn_dev->drv[di]->DLEflag & (1 << channel))) {
 			char *p = skb->data;
 			unsigned long DLEmask = (1 << channel);
 
@@ -819,13 +822,13 @@
 			count_pull = count_put = 0;
 			while ((count_pull < skb->len) && (len > 0)) {
 				len--;
-				if (dev->drv[di]->DLEflag & DLEmask) {
+				if (isdn_dev->drv[di]->DLEflag & DLEmask) {
 					*cp++ = DLE;
-					dev->drv[di]->DLEflag &= ~DLEmask;
+					isdn_dev->drv[di]->DLEflag &= ~DLEmask;
 				} else {
 					*cp++ = *p;
 					if (*p == DLE) {
-						dev->drv[di]->DLEflag |= DLEmask;
+						isdn_dev->drv[di]->DLEflag |= DLEmask;
 						(ISDN_AUDIO_SKB_DLECOUNT(skb))--;
 					}
 					p++;
@@ -864,7 +867,7 @@
 #ifdef CONFIG_ISDN_AUDIO
 			ISDN_AUDIO_SKB_LOCK(skb) = 0;
 #endif
-			skb = skb_dequeue(&dev->drv[di]->rpqueue[channel]);
+			skb = skb_dequeue(&isdn_dev->drv[di]->rpqueue[channel]);
 			dev_kfree_skb(skb);
 		} else {
 			/* Not yet emptied this buff, so it
@@ -876,7 +879,7 @@
 			ISDN_AUDIO_SKB_LOCK(skb) = 0;
 #endif
 		}
-		dev->drv[di]->rcvcount[channel] -= count_put;
+		isdn_dev->drv[di]->rcvcount[channel] -= count_put;
 	}
 	return count;
 }
@@ -884,13 +887,13 @@
 static __inline int
 isdn_minor2drv(int minor)
 {
-	return (dev->drvmap[minor]);
+	return (isdn_dev->drvmap[minor]);
 }
 
 static __inline int
 isdn_minor2chan(int minor)
 {
-	return (dev->chanmap[minor]);
+	return (isdn_dev->chanmap[minor]);
 }
 
 static char *
@@ -903,32 +906,32 @@
 	sprintf(istatbuf, "idmap:\t");
 	p = istatbuf + strlen(istatbuf);
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		sprintf(p, "%s ", (dev->drvmap[i] < 0) ? "-" : dev->drvid[dev->drvmap[i]]);
+		sprintf(p, "%s ", (isdn_dev->drvmap[i] < 0) ? "-" : isdn_dev->drvid[isdn_dev->drvmap[i]]);
 		p = istatbuf + strlen(istatbuf);
 	}
 	sprintf(p, "\nchmap:\t");
 	p = istatbuf + strlen(istatbuf);
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		sprintf(p, "%d ", dev->chanmap[i]);
+		sprintf(p, "%d ", isdn_dev->chanmap[i]);
 		p = istatbuf + strlen(istatbuf);
 	}
 	sprintf(p, "\ndrmap:\t");
 	p = istatbuf + strlen(istatbuf);
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		sprintf(p, "%d ", dev->drvmap[i]);
+		sprintf(p, "%d ", isdn_dev->drvmap[i]);
 		p = istatbuf + strlen(istatbuf);
 	}
 	sprintf(p, "\nusage:\t");
 	p = istatbuf + strlen(istatbuf);
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		sprintf(p, "%d ", dev->usage[i]);
+		sprintf(p, "%d ", isdn_dev->usage[i]);
 		p = istatbuf + strlen(istatbuf);
 	}
 	sprintf(p, "\nflags:\t");
 	p = istatbuf + strlen(istatbuf);
 	for (i = 0; i < ISDN_MAX_DRIVERS; i++) {
-		if (dev->drv[i]) {
-			sprintf(p, "%ld ", dev->drv[i]->online);
+		if (isdn_dev->drv[i]) {
+			sprintf(p, "%ld ", isdn_dev->drv[i]->online);
 			p = istatbuf + strlen(istatbuf);
 		} else {
 			sprintf(p, "? ");
@@ -938,7 +941,7 @@
 	sprintf(p, "\nphone:\t");
 	p = istatbuf + strlen(istatbuf);
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		sprintf(p, "%s ", dev->num[i]);
+		sprintf(p, "%s ", isdn_dev->num[i]);
 		p = istatbuf + strlen(istatbuf);
 	}
 	sprintf(p, "\n");
@@ -952,13 +955,13 @@
 void
 isdn_info_update(void)
 {
-	infostruct *p = dev->infochain;
+	infostruct *p = isdn_dev->infochain;
 
 	while (p) {
 		*(p->private) = 1;
 		p = (infostruct *) p->next;
 	}
-	wake_up_interruptible(&(dev->info_waitq));
+	wake_up_interruptible(&(isdn_dev->info_waitq));
 }
 
 static int
@@ -970,9 +973,9 @@
 	if (!p)
 		return -ENOMEM;
 
-	p->next = (char *) dev->infochain;
+	p->next = (char *) isdn_dev->infochain;
 	p->private = (char *) &(filep->private_data);
-	dev->infochain = p;
+	isdn_dev->infochain = p;
 	/* At opening we allow a single update */
 	filep->private_data = (char *) 1;
 
@@ -982,17 +985,16 @@
 static int
 isdn_status_release(struct inode *ino, struct file *filep)
 {
-	infostruct *p = dev->infochain;
+	infostruct *p = isdn_dev->infochain;
 	infostruct *q = NULL;
 	
-	lock_kernel();
-
+	down_write(&isdn_dev_rwsem);
 	while (p) {
 		if (p->private == (char *) &(filep->private_data)) {
 			if (q)
 				q->next = p->next;
 			else
-				dev->infochain = (infostruct *) (p->next);
+				isdn_dev->infochain = (infostruct *) (p->next);
 			kfree(p);
 			goto out;
 		}
@@ -1002,7 +1004,7 @@
 	printk(KERN_WARNING "isdn: No private data while closing isdnctrl\n");
 
  out:
-	unlock_kernel();
+	up_write(&isdn_dev_rwsem);
 	return 0;
 }
 
@@ -1016,13 +1018,13 @@
 	if (off != &file->f_pos)
 		return -ESPIPE;
 
-	lock_kernel();
+	down_write(&isdn_dev_rwsem);
 	if (!file->private_data) {
 		if (file->f_flags & O_NONBLOCK) {
 			retval = -EAGAIN;
 			goto out;
 		}
-		interruptible_sleep_on(&(dev->info_waitq));
+		interruptible_sleep_on(&(isdn_dev->info_waitq));
 	}
 	p = isdn_statstr();
 	file->private_data = 0;
@@ -1039,7 +1041,7 @@
 	goto out;
 
  out:
-	unlock_kernel();
+	up_write(&isdn_dev_rwsem);
 	return retval;
 }
 
@@ -1054,13 +1056,13 @@
 {
 	unsigned int mask = 0;
 
-	lock_kernel();
+	down_read(&isdn_dev_rwsem);
 
-	poll_wait(file, &(dev->info_waitq), wait);
+	poll_wait(file, &(isdn_dev->info_waitq), wait);
 	if (file->private_data)
 		mask |= POLLIN | POLLRDNORM;
 
-	unlock_kernel();
+	up_read(&isdn_dev_rwsem);
 	return mask;
 }
 
@@ -1095,8 +1097,8 @@
 					       sizeof(ulong) * ISDN_MAX_CHANNELS * 2)))
 				return ret;
 			for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-				put_user(dev->ibytes[i], p++);
-				put_user(dev->obytes[i], p++);
+				put_user(isdn_dev->ibytes[i], p++);
+				put_user(isdn_dev->obytes[i], p++);
 			}
 			return 0;
 		} else
@@ -1146,9 +1148,11 @@
 	uint minor = minor(ino->i_rdev);
 	int drvidx;
 
+	down_read(&isdn_dev_rwsem);
 	drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL);
 	if (drvidx < 0)
 		return -ENODEV;
+	up_read(&isdn_dev_rwsem);
 
 	isdn_lock_drivers();
 	return 0;
@@ -1157,14 +1161,15 @@
 static int
 isdn_ctrl_release(struct inode *ino, struct file *filep)
 {
-	lock_kernel();
-
-	if (dev->profd == current)
-		dev->profd = NULL;
+        down_read(&isdn_dev_rwsem);
+	
+	if (isdn_dev->profd == current)
+		isdn_dev->profd = NULL;
 
 	isdn_unlock_drivers();
 
-	unlock_kernel();
+	up_read(&isdn_dev_rwsem);
+
 	return 0;
 }
 
@@ -1180,24 +1185,24 @@
 	if (off != &file->f_pos)
 		return -ESPIPE;
 
-	lock_kernel();
+	down_read(&isdn_dev_rwsem);
 
 	drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL);
 	if (drvidx < 0) {
 		retval = -ENODEV;
 		goto out;
 	}
-	if (!dev->drv[drvidx]->stavail) {
+	if (!isdn_dev->drv[drvidx]->stavail) {
 		if (file->f_flags & O_NONBLOCK) {
 			retval = -EAGAIN;
 			goto out;
 		}
-		interruptible_sleep_on(&(dev->drv[drvidx]->st_waitq));
+		interruptible_sleep_on(&(isdn_dev->drv[drvidx]->st_waitq));
 	}
-	if (dev->drv[drvidx]->interface->readstat) {
-		if (count > dev->drv[drvidx]->stavail)
-			count = dev->drv[drvidx]->stavail;
-		len = dev->drv[drvidx]->interface->
+	if (isdn_dev->drv[drvidx]->interface->readstat) {
+		if (count > isdn_dev->drv[drvidx]->stavail)
+			count = isdn_dev->drv[drvidx]->stavail;
+		len = isdn_dev->drv[drvidx]->interface->
 			readstat(buf, count, 1, drvidx,
 				 isdn_minor2chan(minor));
 	} else {
@@ -1206,15 +1211,15 @@
 	save_flags(flags);
 	cli();
 	if (len)
-		dev->drv[drvidx]->stavail -= len;
+		isdn_dev->drv[drvidx]->stavail -= len;
 	else
-		dev->drv[drvidx]->stavail = 0;
+		isdn_dev->drv[drvidx]->stavail = 0;
 	restore_flags(flags);
 	*off += len;
 	retval = len;
 	
  out:
-	unlock_kernel();
+	up_read(&isdn_dev_rwsem);
 	return retval;
 }
 
@@ -1228,22 +1233,22 @@
 	if (off != &file->f_pos)
 		return -ESPIPE;
 
-	lock_kernel();
+	down_read(&isdn_dev_rwsem);
 
 	drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL);
 	if (drvidx < 0) {
 		retval = -ENODEV;
 		goto out;
 	}
-	if (!dev->drv[drvidx]->interface->writecmd) {
+	if (!isdn_dev->drv[drvidx]->interface->writecmd) {
 		retval = -EINVAL;
 		goto out;
 	}
-	retval = dev->drv[drvidx]->interface->
+	retval = isdn_dev->drv[drvidx]->interface->
 		writecmd(buf, count, 1, drvidx, isdn_minor2chan(minor - ISDN_MINOR_CTRL));
 
  out:
-	unlock_kernel();
+	up_read(&isdn_dev_rwsem);
 	return retval;
 }
 
@@ -1259,14 +1264,14 @@
 		/* driver deregistered while file open */
 		return POLLHUP;
 
-	lock_kernel();
+	down_read(&isdn_dev_rwsem);
 
-	poll_wait(file, &(dev->drv[drvidx]->st_waitq), wait);
+	poll_wait(file, &(isdn_dev->drv[drvidx]->st_waitq), wait);
 	mask = POLLOUT | POLLWRNORM;
-	if (dev->drv[drvidx]->stavail)
+	if (isdn_dev->drv[drvidx]->stavail)
 		mask |= POLLIN | POLLRDNORM;
 
-	unlock_kernel();
+	up_read(&isdn_dev_rwsem);
 	return mask;
 }
 
@@ -1317,7 +1322,7 @@
 		} else {
 			s = NULL;
 		}
-		ret = down_interruptible(&dev->sem);
+		ret = down_interruptible(&isdn_dev->sem);
 		if( ret ) return ret;
 		if ((s = isdn_net_new(s, NULL))) {
 			if (copy_to_user((char *) arg, s, strlen(s) + 1)){
@@ -1327,7 +1332,7 @@
 			}
 		} else
 			ret = -ENODEV;
-		up(&dev->sem);
+		up(&isdn_dev->sem);
 		return ret;
 	case IIOCNETASL:
 		/* Add a slave to a network-interface */
@@ -1336,7 +1341,7 @@
 				return -EFAULT;
 		} else
 			return -EINVAL;
-		ret = down_interruptible(&dev->sem);
+		ret = down_interruptible(&isdn_dev->sem);
 		if( ret ) return ret;
 		if ((s = isdn_net_newslave(bname))) {
 			if (copy_to_user((char *) arg, s, strlen(s) + 1)){
@@ -1346,17 +1351,17 @@
 			}
 		} else
 			ret = -ENODEV;
-		up(&dev->sem);
+		up(&isdn_dev->sem);
 		return ret;
 	case IIOCNETDIF:
 		/* Delete a network-interface */
 		if (arg) {
 			if (copy_from_user(name, (char *) arg, sizeof(name)))
 				return -EFAULT;
-			ret = down_interruptible(&dev->sem);
+			ret = down_interruptible(&isdn_dev->sem);
 			if( ret ) return ret;
 			ret = isdn_net_rm(name);
-			up(&dev->sem);
+			up(&isdn_dev->sem);
 			return ret;
 		} else
 			return -EINVAL;
@@ -1385,10 +1390,10 @@
 		if (arg) {
 			if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
 				return -EFAULT;
-			ret = down_interruptible(&dev->sem);
+			ret = down_interruptible(&isdn_dev->sem);
 			if( ret ) return ret;
 			ret = isdn_net_addphone(&phone);
-			up(&dev->sem);
+			up(&isdn_dev->sem);
 			return ret;
 		} else
 			return -EINVAL;
@@ -1397,10 +1402,10 @@
 		if (arg) {
 			if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
 				return -EFAULT;
-			ret = down_interruptible(&dev->sem);
+			ret = down_interruptible(&isdn_dev->sem);
 			if( ret ) return ret;
 			ret = isdn_net_getphones(&phone, (char *) arg);
-			up(&dev->sem);
+			up(&isdn_dev->sem);
 			return ret;
 		} else
 			return -EINVAL;
@@ -1409,10 +1414,10 @@
 		if (arg) {
 			if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
 				return -EFAULT;
-			ret = down_interruptible(&dev->sem);
+			ret = down_interruptible(&isdn_dev->sem);
 			if( ret ) return ret;
 			ret = isdn_net_delphone(&phone);
-			up(&dev->sem);
+			up(&isdn_dev->sem);
 			return ret;
 		} else
 			return -EINVAL;
@@ -1448,16 +1453,16 @@
 		break;
 #endif                          /* CONFIG_NETDEVICES */
 	case IIOCSETVER:
-		dev->net_verbose = arg;
-		printk(KERN_INFO "isdn: Verbose-Level is %d\n", dev->net_verbose);
+		isdn_dev->net_verbose = arg;
+		printk(KERN_INFO "isdn: Verbose-Level is %d\n", isdn_dev->net_verbose);
 		return 0;
 	case IIOCSETGST:
 		if (arg)
-			dev->global_flags |= ISDN_GLOBAL_STOPPED;
+			isdn_dev->global_flags |= ISDN_GLOBAL_STOPPED;
 		else
-			dev->global_flags &= ~ISDN_GLOBAL_STOPPED;
+			isdn_dev->global_flags &= ~ISDN_GLOBAL_STOPPED;
 		printk(KERN_INFO "isdn: Global Mode %s\n",
-		       (dev->global_flags & ISDN_GLOBAL_STOPPED) ? "stopped" : "running");
+		       (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED) ? "stopped" : "running");
 		return 0;
 	case IIOCSETBRJ:
 		drvidx = -1;
@@ -1472,7 +1477,7 @@
 					*p = 0;
 				drvidx = -1;
 				for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-					if (!(strcmp(dev->drvid[i], iocts.drvid))) {
+					if (!(strcmp(isdn_dev->drvid[i], iocts.drvid))) {
 						drvidx = i;
 						break;
 					}
@@ -1481,12 +1486,12 @@
 		if (drvidx == -1)
 			return -ENODEV;
 		if (iocts.arg)
-			dev->drv[drvidx]->flags |= DRV_FLAG_REJBUS;
+			isdn_dev->drv[drvidx]->flags |= DRV_FLAG_REJBUS;
 		else
-			dev->drv[drvidx]->flags &= ~DRV_FLAG_REJBUS;
+			isdn_dev->drv[drvidx]->flags &= ~DRV_FLAG_REJBUS;
 		return 0;
 	case IIOCSIGPRF:
-		dev->profd = current;
+		isdn_dev->profd = current;
 		return 0;
 		break;
 	case IIOCGETPRF:
@@ -1501,14 +1506,14 @@
 				return ret;
 
 			for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-				if (copy_to_user(p, dev->mdm.info[i].emu.profile,
+				if (copy_to_user(p, isdn_dev->mdm.info[i].emu.profile,
 						 ISDN_MODEM_NUMREG))
 					return -EFAULT;
 				p += ISDN_MODEM_NUMREG;
-				if (copy_to_user(p, dev->mdm.info[i].emu.pmsn, ISDN_MSNLEN))
+				if (copy_to_user(p, isdn_dev->mdm.info[i].emu.pmsn, ISDN_MSNLEN))
 					return -EFAULT;
 				p += ISDN_MSNLEN;
-				if (copy_to_user(p, dev->mdm.info[i].emu.plmsn, ISDN_LMSNLEN))
+				if (copy_to_user(p, isdn_dev->mdm.info[i].emu.plmsn, ISDN_LMSNLEN))
 					return -EFAULT;
 				p += ISDN_LMSNLEN;
 			}
@@ -1528,14 +1533,14 @@
 				return ret;
 
 			for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-				if (copy_from_user(dev->mdm.info[i].emu.profile, p,
+				if (copy_from_user(isdn_dev->mdm.info[i].emu.profile, p,
 						   ISDN_MODEM_NUMREG))
 					return -EFAULT;
 				p += ISDN_MODEM_NUMREG;
-				if (copy_from_user(dev->mdm.info[i].emu.plmsn, p, ISDN_LMSNLEN))
+				if (copy_from_user(isdn_dev->mdm.info[i].emu.plmsn, p, ISDN_LMSNLEN))
 					return -EFAULT;
 				p += ISDN_LMSNLEN;
-				if (copy_from_user(dev->mdm.info[i].emu.pmsn, p, ISDN_MSNLEN))
+				if (copy_from_user(isdn_dev->mdm.info[i].emu.pmsn, p, ISDN_MSNLEN))
 					return -EFAULT;
 				p += ISDN_MSNLEN;
 			}
@@ -1555,7 +1560,7 @@
 			if (strlen(iocts.drvid)) {
 				drvidx = -1;
 				for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-					if (!(strcmp(dev->drvid[i], iocts.drvid))) {
+					if (!(strcmp(isdn_dev->drvid[i], iocts.drvid))) {
 						drvidx = i;
 						break;
 					}
@@ -1581,7 +1586,7 @@
 							/* Fall through */
 						case ',':
 							bname[j] = '\0';
-							strcpy(dev->drv[drvidx]->msn2eaz[i], bname);
+							strcpy(isdn_dev->drv[drvidx]->msn2eaz[i], bname);
 							j = ISDN_MSNLEN;
 							break;
 						default:
@@ -1597,8 +1602,8 @@
 				p = (char *) iocts.arg;
 				for (i = 0; i < 10; i++) {
 					sprintf(bname, "%s%s",
-						strlen(dev->drv[drvidx]->msn2eaz[i]) ?
-						dev->drv[drvidx]->msn2eaz[i] : "_",
+						strlen(isdn_dev->drv[drvidx]->msn2eaz[i]) ?
+						isdn_dev->drv[drvidx]->msn2eaz[i] : "_",
 						(i < 9) ? "," : "\0");
 					if (copy_to_user(p, bname, strlen(bname) + 1))
 						return -EFAULT;
@@ -1610,7 +1615,7 @@
 			return -EINVAL;
 	case IIOCDBGVAR:
 		if (arg) {
-			if (copy_to_user((char *) arg, (char *) &dev, sizeof(ulong)))
+			if (copy_to_user((char *) arg, (char *) &isdn_dev, sizeof(ulong)))
 				return -EFAULT;
 			return 0;
 		} else
@@ -1631,7 +1636,7 @@
 					*p = 0;
 				drvidx = -1;
 				for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-					if (!(strcmp(dev->drvid[i], iocts.drvid))) {
+					if (!(strcmp(isdn_dev->drvid[i], iocts.drvid))) {
 						drvidx = i;
 						break;
 					}
@@ -1723,7 +1728,7 @@
 char *
 isdn_map_eaz2msn(char *msn, int di)
 {
-	driver *this = dev->drv[di];
+	driver *this = isdn_dev->drv[di];
 	int i;
 
 	if (strlen(msn) == 1) {
@@ -1760,30 +1765,30 @@
 	 * because we can emulate this in linklevel.
 	 */
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-		if (USG_NONE(dev->usage[i]) &&
-		    (dev->drvmap[i] != -1)) {
-			int d = dev->drvmap[i];
-			if ((dev->usage[i] & ISDN_USAGE_EXCLUSIVE) &&
-			((pre_dev != d) || (pre_chan != dev->chanmap[i])))
+		if (USG_NONE(isdn_dev->usage[i]) &&
+		    (isdn_dev->drvmap[i] != -1)) {
+			int d = isdn_dev->drvmap[i];
+			if ((isdn_dev->usage[i] & ISDN_USAGE_EXCLUSIVE) &&
+			((pre_dev != d) || (pre_chan != isdn_dev->chanmap[i])))
 				continue;
 			if (!strcmp(isdn_map_eaz2msn(msn, d), "-"))
 				continue;
-			if (dev->usage[i] & ISDN_USAGE_DISABLED)
+			if (isdn_dev->usage[i] & ISDN_USAGE_DISABLED)
 			        continue; /* usage not allowed */
-			if (dev->drv[d]->flags & DRV_FLAG_RUNNING) {
-				if (((dev->drv[d]->interface->features & features) == features) ||
-				    (((dev->drv[d]->interface->features & vfeatures) == vfeatures) &&
-				     (dev->drv[d]->interface->features & ISDN_FEATURE_L2_TRANS))) {
+			if (isdn_dev->drv[d]->flags & DRV_FLAG_RUNNING) {
+				if (((isdn_dev->drv[d]->interface->features & features) == features) ||
+				    (((isdn_dev->drv[d]->interface->features & vfeatures) == vfeatures) &&
+				     (isdn_dev->drv[d]->interface->features & ISDN_FEATURE_L2_TRANS))) {
 					if ((pre_dev < 0) || (pre_chan < 0)) {
-						dev->usage[i] &= ISDN_USAGE_EXCLUSIVE;
-						dev->usage[i] |= usage;
+						isdn_dev->usage[i] &= ISDN_USAGE_EXCLUSIVE;
+						isdn_dev->usage[i] |= usage;
 						isdn_info_update();
 						restore_flags(flags);
 						return i;
 					} else {
-						if ((pre_dev == d) && (pre_chan == dev->chanmap[i])) {
-							dev->usage[i] &= ISDN_USAGE_EXCLUSIVE;
-							dev->usage[i] |= usage;
+						if ((pre_dev == d) && (pre_chan == isdn_dev->chanmap[i])) {
+							isdn_dev->usage[i] &= ISDN_USAGE_EXCLUSIVE;
+							isdn_dev->usage[i] |= usage;
 							isdn_info_update();
 							restore_flags(flags);
 							return i;
@@ -1808,21 +1813,21 @@
 	save_flags(flags);
 	cli();
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-		if (((!usage) || ((dev->usage[i] & ISDN_USAGE_MASK) == usage)) &&
-		    (dev->drvmap[i] == di) &&
-		    (dev->chanmap[i] == ch)) {
-			dev->usage[i] &= (ISDN_USAGE_NONE | ISDN_USAGE_EXCLUSIVE);
-			strcpy(dev->num[i], "???");
-			dev->ibytes[i] = 0;
-			dev->obytes[i] = 0;
+		if (((!usage) || ((isdn_dev->usage[i] & ISDN_USAGE_MASK) == usage)) &&
+		    (isdn_dev->drvmap[i] == di) &&
+		    (isdn_dev->chanmap[i] == ch)) {
+			isdn_dev->usage[i] &= (ISDN_USAGE_NONE | ISDN_USAGE_EXCLUSIVE);
+			strcpy(isdn_dev->num[i], "???");
+			isdn_dev->ibytes[i] = 0;
+			isdn_dev->obytes[i] = 0;
 // 20.10.99 JIM, try to reinitialize v110 !
-			dev->v110emu[i] = 0;
-			atomic_set(&(dev->v110use[i]), 0);
-			isdn_v110_close(dev->v110[i]);
-			dev->v110[i] = NULL;
+			isdn_dev->v110emu[i] = 0;
+			atomic_set(&(isdn_dev->v110use[i]), 0);
+			isdn_v110_close(isdn_dev->v110[i]);
+			isdn_dev->v110[i] = NULL;
 // 20.10.99 JIM, try to reinitialize v110 !
 			isdn_info_update();
-			skb_queue_purge(&dev->drv[di]->rpqueue[ch]);
+			skb_queue_purge(&isdn_dev->drv[di]->rpqueue[ch]);
 		}
 	restore_flags(flags);
 }
@@ -1839,9 +1844,9 @@
 	save_flags(flags);
 	cli();
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-		if ((dev->drvmap[i] == di) &&
-		    (dev->chanmap[i] == ch)) {
-			dev->usage[i] &= ~ISDN_USAGE_EXCLUSIVE;
+		if ((isdn_dev->drvmap[i] == di) &&
+		    (isdn_dev->chanmap[i] == ch)) {
+			isdn_dev->usage[i] &= ~ISDN_USAGE_EXCLUSIVE;
 			isdn_info_update();
 			restore_flags(flags);
 			return;
@@ -1860,10 +1865,10 @@
 	int v110_ret = skb->len;
 	int idx = isdn_dc2minor(drvidx, chan);
 
-	if (dev->v110[idx]) {
-		atomic_inc(&dev->v110use[idx]);
-		nskb = isdn_v110_encode(dev->v110[idx], skb);
-		atomic_dec(&dev->v110use[idx]);
+	if (isdn_dev->v110[idx]) {
+		atomic_inc(&isdn_dev->v110use[idx]);
+		nskb = isdn_v110_encode(isdn_dev->v110[idx], skb);
+		atomic_dec(&isdn_dev->v110use[idx]);
 		if (!nskb)
 			return 0;
 		v110_ret = *((int *)nskb->data);
@@ -1874,9 +1879,9 @@
 		}
 		/* V.110 must always be acknowledged */
 		ack = 1;
-		ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, nskb);
+		ret = isdn_dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, nskb);
 	} else {
-		int hl = dev->drv[drvidx]->interface->hl_hdrlen;
+		int hl = isdn_dev->drv[drvidx]->interface->hl_hdrlen;
 
 		if( skb_headroom(skb) < hl ){
 			/* 
@@ -1892,22 +1897,22 @@
 			skb_tmp = skb_realloc_headroom(skb, hl);
 			printk(KERN_DEBUG "isdn_writebuf_skb_stub: reallocating headroom%s\n", skb_tmp ? "" : " failed");
 			if (!skb_tmp) return -ENOMEM; /* 0 better? */
-			ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, skb_tmp);
+			ret = isdn_dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, skb_tmp);
 			if( ret > 0 ){
 				dev_kfree_skb(skb);
 			} else {
 				dev_kfree_skb(skb_tmp);
 			}
 		} else {
-			ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, skb);
+			ret = isdn_dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, skb);
 		}
 	}
 	if (ret > 0) {
-		dev->obytes[idx] += ret;
-		if (dev->v110[idx]) {
-			atomic_inc(&dev->v110use[idx]);
-			dev->v110[idx]->skbuser++;
-			atomic_dec(&dev->v110use[idx]);
+		isdn_dev->obytes[idx] += ret;
+		if (isdn_dev->v110[idx]) {
+			atomic_inc(&isdn_dev->v110use[idx]);
+			isdn_dev->v110[idx]->skbuser++;
+			atomic_dec(&isdn_dev->v110use[idx]);
 			/* For V.110 return unencoded data length */
 			ret = v110_ret;
 			/* if the complete frame was send we free the skb;
@@ -1916,7 +1921,7 @@
 				dev_kfree_skb(skb);
 		}
 	} else
-		if (dev->v110[idx])
+		if (isdn_dev->v110[idx])
 			dev_kfree_skb(nskb);
 	return ret;
 }
@@ -1934,7 +1939,7 @@
 
 	m = (adding) ? d->channels + n : n;
 
-	if (dev->channels + n > ISDN_MAX_CHANNELS) {
+	if (isdn_dev->channels + n > ISDN_MAX_CHANNELS) {
 		printk(KERN_WARNING "register_isdn: Max. %d channels supported\n",
 		       ISDN_MAX_CHANNELS);
 		return -1;
@@ -1992,14 +1997,14 @@
 		init_waitqueue_head(&d->snd_waitq[j]);
 	}
 
-	dev->channels += n;
+	isdn_dev->channels += n;
 	save_flags(flags);
 	cli();
 	for (j = d->channels; j < m; j++)
 		for (k = 0; k < ISDN_MAX_CHANNELS; k++)
-			if (dev->chanmap[k] < 0) {
-				dev->chanmap[k] = j;
-				dev->drvmap[k] = drvidx;
+			if (isdn_dev->chanmap[k] < 0) {
+				isdn_dev->chanmap[k] = j;
+				isdn_dev->drvmap[k] = drvidx;
 				isdn_register_devfs(k);
 				break;
 			}
@@ -2017,12 +2022,12 @@
 {
 	int drvidx;
 
-	dev->global_features = 0;
+	isdn_dev->global_features = 0;
 	for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) {
-		if (!dev->drv[drvidx])
+		if (!isdn_dev->drv[drvidx])
 			continue;
-		if (dev->drv[drvidx]->interface)
-			dev->global_features |= dev->drv[drvidx]->interface->features;
+		if (isdn_dev->drv[drvidx]->interface)
+			isdn_dev->global_features |= isdn_dev->drv[drvidx]->interface->features;
 	}
 }
 
@@ -2032,14 +2037,14 @@
 {
   if ((di < 0) || (di >= ISDN_MAX_DRIVERS)) 
     return(NULL);
-  return(dev->drvid[di]); /* driver name */
+  return(isdn_dev->drvid[di]); /* driver name */
 } /* map_drvname */
 
 static int map_namedrv(char *id)
 {  int i;
 
    for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-    { if (!strcmp(dev->drvid[i],id)) 
+    { if (!strcmp(isdn_dev->drvid[i],id)) 
         return(i);
     }
    return(-1);
@@ -2092,7 +2097,7 @@
 	ulong flags;
 	int drvidx;
 
-	if (dev->drivers >= ISDN_MAX_DRIVERS) {
+	if (isdn_dev->drivers >= ISDN_MAX_DRIVERS) {
 		printk(KERN_WARNING "register_isdn: Max. %d drivers supported\n",
 		       ISDN_MAX_DRIVERS);
 		return 0;
@@ -2115,7 +2120,7 @@
 	d->interface = i;
 	d->channels = 0;
 	for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++)
-		if (!dev->drv[drvidx])
+		if (!isdn_dev->drv[drvidx])
 			break;
 	if (isdn_add_channels(d, drvidx, i->channels, 0)) {
 		kfree(d);
@@ -2129,12 +2134,12 @@
 	save_flags(flags);
 	cli();
 	for (j = 0; j < drvidx; j++)
-		if (!strcmp(i->id, dev->drvid[j]))
+		if (!strcmp(i->id, isdn_dev->drvid[j]))
 			sprintf(i->id, "line%d", drvidx);
-	dev->drv[drvidx] = d;
-	strcpy(dev->drvid[drvidx], i->id);
+	isdn_dev->drv[drvidx] = d;
+	strcpy(isdn_dev->drvid[drvidx], i->id);
 	isdn_info_update();
-	dev->drivers++;
+	isdn_dev->drivers++;
 	set_global_features();
 	restore_flags(flags);
 	return 1;
@@ -2170,7 +2175,7 @@
 	char buf[11];
 
 	sprintf (buf, "isdnctrl%d", k);
-	dev->devfs_handle_isdnctrlX[k] =
+	isdn_dev->devfs_handle_isdnctrlX[k] =
 	    devfs_register (devfs_handle, buf, DEVFS_FL_DEFAULT,
 			    ISDN_MAJOR, ISDN_MINOR_CTRL + k, 0600 | S_IFCHR,
 			    &isdn_fops, NULL);
@@ -2178,8 +2183,8 @@
 
 static void isdn_unregister_devfs(int k)
 {
-	devfs_unregister (dev->devfs_handle_isdnX[k]);
-	devfs_unregister (dev->devfs_handle_isdnctrlX[k]);
+	devfs_unregister (isdn_dev->devfs_handle_isdnX[k]);
+	devfs_unregister (isdn_dev->devfs_handle_isdnctrlX[k]);
 }
 
 static void isdn_init_devfs(void)
@@ -2194,18 +2199,18 @@
 		char buf[8];
 
 		sprintf (buf, "ippp%d", i);
-		dev->devfs_handle_ipppX[i] =
+		isdn_dev->devfs_handle_ipppX[i] =
 		    devfs_register (devfs_handle, buf, DEVFS_FL_DEFAULT,
 				    ISDN_MAJOR, ISDN_MINOR_PPP + i,
 				    0600 | S_IFCHR, &isdn_fops, NULL);
 	}
 #  endif
 
-	dev->devfs_handle_isdninfo =
+	isdn_dev->devfs_handle_isdninfo =
 	    devfs_register (devfs_handle, "isdninfo", DEVFS_FL_DEFAULT,
 			    ISDN_MAJOR, ISDN_MINOR_STATUS, 0600 | S_IFCHR,
 			    &isdn_fops, NULL);
-	dev->devfs_handle_isdnctrl =
+	isdn_dev->devfs_handle_isdnctrl =
 	    devfs_register (devfs_handle, "isdnctrl", DEVFS_FL_DEFAULT,
 			    ISDN_MAJOR, ISDN_MINOR_CTRL, 0600 | S_IFCHR, 
 			    &isdn_fops, NULL);
@@ -2216,10 +2221,10 @@
 #  ifdef CONFIG_ISDN_PPP
 	int i;
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) 
-		devfs_unregister (dev->devfs_handle_ipppX[i]);
+		devfs_unregister (isdn_dev->devfs_handle_ipppX[i]);
 #  endif
-	devfs_unregister (dev->devfs_handle_isdninfo);
-	devfs_unregister (dev->devfs_handle_isdnctrl);
+	devfs_unregister (isdn_dev->devfs_handle_isdninfo);
+	devfs_unregister (isdn_dev->devfs_handle_isdnctrl);
 	devfs_unregister (devfs_handle);
 }
 
@@ -2254,36 +2259,40 @@
 	int i;
 	char tmprev[50];
 
-	if (!(dev = (isdn_dev *) vmalloc(sizeof(isdn_dev)))) {
+	down_write(&isdn_dev_rwsem); /* yeah, yeah, yeah, I took the easy
+ 					way out and just locked it for the
+ 					whole function */
+  	
+	if (!(isdn_dev = (isdn_dev_t *) vmalloc(sizeof(isdn_dev_t)))) {
 		printk(KERN_WARNING "isdn: Could not allocate device-struct.\n");
 		return -EIO;
 	}
-	memset((char *) dev, 0, sizeof(isdn_dev));
-	init_timer(&dev->timer);
-	dev->timer.function = isdn_timer_funct;
-	init_MUTEX(&dev->sem);
-	init_waitqueue_head(&dev->info_waitq);
+	memset((char *) isdn_dev, 0, sizeof(isdn_dev_t));
+	init_timer(&isdn_dev->timer);
+	isdn_dev->timer.function = isdn_timer_funct;
+	init_MUTEX(&isdn_dev->sem);
+	init_waitqueue_head(&isdn_dev->info_waitq);
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		dev->drvmap[i] = -1;
-		dev->chanmap[i] = -1;
-		dev->m_idx[i] = -1;
-		strcpy(dev->num[i], "???");
-		init_waitqueue_head(&dev->mdm.info[i].open_wait);
-		init_waitqueue_head(&dev->mdm.info[i].close_wait);
+		isdn_dev->drvmap[i] = -1;
+		isdn_dev->chanmap[i] = -1;
+		isdn_dev->m_idx[i] = -1;
+		strcpy(isdn_dev->num[i], "???");
+		init_waitqueue_head(&isdn_dev->mdm.info[i].open_wait);
+		init_waitqueue_head(&isdn_dev->mdm.info[i].close_wait);
 	}
 	if (devfs_register_chrdev(ISDN_MAJOR, "isdn", &isdn_fops)) {
 		printk(KERN_WARNING "isdn: Could not register control devices\n");
-		vfree(dev);
+		vfree(isdn_dev);
 		return -EIO;
 	}
 	isdn_init_devfs();
 	if ((i = isdn_tty_modem_init()) < 0) {
 		printk(KERN_WARNING "isdn: Could not register tty devices\n");
 		if (i == -3)
-			tty_unregister_driver(&dev->mdm.cua_modem);
+			tty_unregister_driver(&isdn_dev->mdm.cua_modem);
 		if (i <= -2)
-			tty_unregister_driver(&dev->mdm.tty_modem);
-		vfree(dev);
+			tty_unregister_driver(&isdn_dev->mdm.tty_modem);
+		vfree(isdn_dev);
 		isdn_cleanup_devfs();
 		devfs_unregister_chrdev(ISDN_MAJOR, "isdn");
 		return -EIO;
@@ -2291,13 +2300,13 @@
 #ifdef CONFIG_ISDN_PPP
 	if (isdn_ppp_init() < 0) {
 		printk(KERN_WARNING "isdn: Could not create PPP-device-structs\n");
-		tty_unregister_driver(&dev->mdm.tty_modem);
-		tty_unregister_driver(&dev->mdm.cua_modem);
+		tty_unregister_driver(&isdn_dev->mdm.tty_modem);
+		tty_unregister_driver(&isdn_dev->mdm.cua_modem);
 		for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-			kfree(dev->mdm.info[i].xmit_buf - 4);
+			kfree(isdn_dev->mdm.info[i].xmit_buf - 4);
 		isdn_cleanup_devfs();
 		devfs_unregister_chrdev(ISDN_MAJOR, "isdn");
-		vfree(dev);
+		vfree(isdn_dev);
 		return -EIO;
 	}
 #endif                          /* CONFIG_ISDN_PPP */
@@ -2321,6 +2330,7 @@
 	printk("\n");
 #endif
 	isdn_info_update();
+	up_write(&isdn_dev_rwsem);
 	return 0;
 }
 
@@ -2342,21 +2352,21 @@
 		restore_flags(flags);
 		return;
 	}
-	if (tty_unregister_driver(&dev->mdm.tty_modem)) {
+	if (tty_unregister_driver(&isdn_dev->mdm.tty_modem)) {
 		printk(KERN_WARNING "isdn: ttyI-device busy, remove cancelled\n");
 		restore_flags(flags);
 		return;
 	}
-	if (tty_unregister_driver(&dev->mdm.cua_modem)) {
+	if (tty_unregister_driver(&isdn_dev->mdm.cua_modem)) {
 		printk(KERN_WARNING "isdn: cui-device busy, remove cancelled\n");
 		restore_flags(flags);
 		return;
 	}
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		isdn_tty_cleanup_xmit(&dev->mdm.info[i]);
-		kfree(dev->mdm.info[i].xmit_buf - 4);
+		isdn_tty_cleanup_xmit(&isdn_dev->mdm.info[i]);
+		kfree(isdn_dev->mdm.info[i].xmit_buf - 4);
 #ifdef CONFIG_ISDN_TTY_FAX
-		kfree(dev->mdm.info[i].fax);
+		kfree(isdn_dev->mdm.info[i].fax);
 #endif
 	}
 	if (devfs_unregister_chrdev(ISDN_MAJOR, "isdn") != 0) {
@@ -2364,10 +2374,10 @@
 		restore_flags(flags);
 	} else {
 		isdn_cleanup_devfs();
-		del_timer(&dev->timer);
+		del_timer(&isdn_dev->timer);
 		restore_flags(flags);
 		/* call vfree with interrupts enabled, else it will hang */
-		vfree(dev);
+		vfree(isdn_dev);
 		printk(KERN_NOTICE "ISDN-subsystem unloaded\n");
 	}
 }
Only in linux/drivers/isdn/: isdn_common.c.orig
Only in linux/drivers/isdn/: isdn_common.c.rej
diff -ur -X exclude linux-2.5.3-clean/drivers/isdn/isdn_net.c linux/drivers/isdn/isdn_net.c
--- linux-2.5.3-clean/drivers/isdn/isdn_net.c	Fri Nov  9 13:41:41 2001
+++ linux/drivers/isdn/isdn_net.c	Mon Feb  4 11:35:49 2002
@@ -272,10 +272,10 @@
 	save_flags(flags);
 	cli();
 	lp->flags |= ISDN_NET_CONNECTED;
-	lp->isdn_device = dev->drvmap[idx];
-	lp->isdn_channel = dev->chanmap[idx];
-	dev->rx_netdev[idx] = lp->netdev;
-	dev->st_netdev[idx] = lp->netdev;
+	lp->isdn_device = isdn_dev->drvmap[idx];
+	lp->isdn_channel = isdn_dev->chanmap[idx];
+	isdn_dev->rx_netdev[idx] = lp->netdev;
+	isdn_dev->st_netdev[idx] = lp->netdev;
 	restore_flags(flags);
 }
 
@@ -299,8 +299,8 @@
 		qdisc_reset(lp->netdev->dev.qdisc);
 	}
 	lp->dialstate = 0;
-	dev->rx_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
-	dev->st_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
+	isdn_dev->rx_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
+	isdn_dev->st_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
 	isdn_free_channel(lp->isdn_device, lp->isdn_channel, ISDN_USAGE_NET);
 	lp->flags &= ~ISDN_NET_CONNECTED;
 	lp->isdn_device = -1;
@@ -327,7 +327,7 @@
 void
 isdn_net_autohup()
 {
-	isdn_net_dev *p = dev->netdev;
+	isdn_net_dev *p = isdn_dev->netdev;
 	int anymore;
 
 	anymore = 0;
@@ -338,7 +338,7 @@
 		else
 			l->cps = (l->transcount * HZ) / (jiffies - last_jiffies);
 		l->transcount = 0;
-		if (dev->net_verbose > 3)
+		if (isdn_dev->net_verbose > 3)
 			printk(KERN_DEBUG "%s: %d bogocps\n", l->name, l->cps);
 		if ((l->flags & ISDN_NET_CONNECTED) && (!l->dialstate)) {
 			anymore = 1;
@@ -375,7 +375,7 @@
 					isdn_net_hangup(&p->dev);
 			}
 
-			if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*l) == ISDN_NET_DM_OFF)) {
+			if(isdn_dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*l) == ISDN_NET_DM_OFF)) {
 				isdn_net_hangup(&p->dev);
 				break;
 			}
@@ -400,7 +400,7 @@
 int
 isdn_net_stat_callback(int idx, isdn_ctrl *c)
 {
-	isdn_net_dev *p = dev->st_netdev[idx];
+	isdn_net_dev *p = isdn_dev->st_netdev[idx];
 	int cmd = c->command;
 
 	if (p) {
@@ -484,10 +484,10 @@
 					case 10:
 					case 12:
 						if (lp->dialstate <= 6) {
-							dev->usage[idx] |= ISDN_USAGE_OUTGOING;
+						        isdn_dev->usage[idx] |= ISDN_USAGE_OUTGOING;
 							isdn_info_update();
 						} else
-							dev->rx_netdev[idx] = p;
+						        isdn_dev->rx_netdev[idx] = p;
 						lp->dialstate = 0;
 						isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 1);
 						if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
@@ -565,7 +565,7 @@
 void
 isdn_net_dial(void)
 {
-	isdn_net_dev *p = dev->netdev;
+	isdn_net_dev *p = isdn_dev->netdev;
 	int anymore = 0;
 	int i;
 	unsigned long flags;
@@ -624,9 +624,9 @@
 				 * If list of phone-numbers is exhausted, increment
 				 * retry-counter.
 				 */
-				if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF)) {
+				if(isdn_dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF)) {
 					char *s;
-					if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+					if (isdn_dev->global_flags & ISDN_GLOBAL_STOPPED)
 						s = "dial suppressed: isdn system stopped";
 					else
 						s = "dial suppressed: dialmode `off'";
@@ -696,8 +696,8 @@
 						isdn_map_eaz2msn(lp->msn, cmd.driver));
 					i = isdn_dc2minor(lp->isdn_device, lp->isdn_channel);
 					if (i >= 0) {
-						strcpy(dev->num[i], cmd.parm.setup.phone);
-						dev->usage[i] |= ISDN_USAGE_OUTGOING;
+						strcpy(isdn_dev->num[i], cmd.parm.setup.phone);
+						isdn_dev->usage[i] |= ISDN_USAGE_OUTGOING;
 						isdn_info_update();
 					}
 					printk(KERN_INFO "%s: dialing %d %s...\n", lp->name,
@@ -1263,7 +1263,7 @@
 					return 0;
 				}
 				/* Log packet, which triggered dialing */
-				if (dev->net_verbose)
+				if (isdn_dev->net_verbose)
 					isdn_net_log_skb(skb, lp);
 				lp->dialstate = 1;
 				/* Connect interface with channel */
@@ -1415,7 +1415,7 @@
 static struct sk_buff*
 isdn_net_ciscohdlck_alloc_skb(isdn_net_local *lp, int len)
 {
-	unsigned short hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
+	unsigned short hl = isdn_dev->drv[lp->isdn_device]->interface->hl_hdrlen;
 	struct sk_buff *skb;
 
 	skb = alloc_skb(hl + len, GFP_ATOMIC);
@@ -1879,7 +1879,7 @@
 int
 isdn_net_rcv_skb(int idx, struct sk_buff *skb)
 {
-	isdn_net_dev *p = dev->rx_netdev[idx];
+	isdn_net_dev *p = isdn_dev->rx_netdev[idx];
 
 	if (p) {
 		isdn_net_local *lp = p->local;
@@ -2064,9 +2064,9 @@
 	 */
 
 	for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++)
-		if (dev->drv[drvidx])
-			if (max_hlhdr_len < dev->drv[drvidx]->interface->hl_hdrlen)
-				max_hlhdr_len = dev->drv[drvidx]->interface->hl_hdrlen;
+		if (isdn_dev->drv[drvidx])
+			if (max_hlhdr_len < isdn_dev->drv[drvidx]->interface->hl_hdrlen)
+				max_hlhdr_len = isdn_dev->drv[drvidx]->interface->hl_hdrlen;
 
 	ndev->hard_header_len = ETH_HLEN + max_hlhdr_len;
 	ndev->stop = &isdn_net_close;
@@ -2084,7 +2084,7 @@
 #ifdef ISDN_DEBUG_NET_ICALL
 	printk(KERN_DEBUG "n_fi: swapping ch of %d\n", drvidx);
 #endif
-	p = dev->netdev;
+	p = isdn_dev->netdev;
 	while (p) {
 		if (p->local->pre_device == drvidx)
 			switch (p->local->pre_channel) {
@@ -2102,16 +2102,16 @@
 static void
 isdn_net_swap_usage(int i1, int i2)
 {
-	int u1 = dev->usage[i1] & ISDN_USAGE_EXCLUSIVE;
-	int u2 = dev->usage[i2] & ISDN_USAGE_EXCLUSIVE;
+	int u1 = isdn_dev->usage[i1] & ISDN_USAGE_EXCLUSIVE;
+	int u2 = isdn_dev->usage[i2] & ISDN_USAGE_EXCLUSIVE;
 
 #ifdef ISDN_DEBUG_NET_ICALL
 	printk(KERN_DEBUG "n_fi: usage of %d and %d\n", i1, i2);
 #endif
-	dev->usage[i1] &= ~ISDN_USAGE_EXCLUSIVE;
-	dev->usage[i1] |= u2;
-	dev->usage[i2] &= ~ISDN_USAGE_EXCLUSIVE;
-	dev->usage[i2] |= u1;
+	isdn_dev->usage[i1] &= ~ISDN_USAGE_EXCLUSIVE;
+	isdn_dev->usage[i1] |= u2;
+	isdn_dev->usage[i2] &= ~ISDN_USAGE_EXCLUSIVE;
+	isdn_dev->usage[i2] |= u1;
 	isdn_info_update();
 }
 
@@ -2161,21 +2161,21 @@
 		eaz = "0";
 	} else
 		eaz = setup->eazmsn;
-	if (dev->net_verbose > 1)
+	if (isdn_dev->net_verbose > 1)
 		printk(KERN_INFO "isdn_net: call from %s,%d,%d -> %s\n", nr, si1, si2, eaz);
 	/* Accept only calls with Si1 = 7 (Data-Transmission) */
 	if (si1 != 7) {
 		restore_flags(flags);
-		if (dev->net_verbose > 1)
+		if (isdn_dev->net_verbose > 1)
 			printk(KERN_INFO "isdn_net: Service-Indicator not 7, ignored\n");
 		return 0;
 	}
 	n = (isdn_net_phone *) 0;
-	p = dev->netdev;
+	p = isdn_dev->netdev;
 	ematch = wret = swapped = 0;
 #ifdef ISDN_DEBUG_NET_ICALL
 	printk(KERN_DEBUG "n_fi: di=%d ch=%d idx=%d usg=%d\n", di, ch, idx,
-	       dev->usage[idx]);
+	       isdn_dev->usage[idx]);
 #endif
 	while (p) {
 		int matchret;
@@ -2202,7 +2202,7 @@
 #endif
 		if ((!matchret) &&                                        /* EAZ is matching   */
 		    (((!(lp->flags & ISDN_NET_CONNECTED)) &&              /* but not connected */
-		      (USG_NONE(dev->usage[idx]))) ||                     /* and ch. unused or */
+		      (USG_NONE(isdn_dev->usage[idx]))) ||                     /* and ch. unused or */
 		     ((((lp->dialstate == 4) || (lp->dialstate == 12)) && /* if dialing        */
 		       (!(lp->flags & ISDN_NET_CALLBACK)))                /* but no callback   */
 		     )))
@@ -2211,7 +2211,7 @@
 			printk(KERN_DEBUG "n_fi: match1, pdev=%d pch=%d\n",
 			       lp->pre_device, lp->pre_channel);
 #endif
-			if (dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) {
+			if (isdn_dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) {
 				if ((lp->pre_channel != ch) ||
 				    (lp->pre_device != di)) {
 					/* Here we got a problem:
@@ -2228,10 +2228,10 @@
 #ifdef ISDN_DEBUG_NET_ICALL
 						printk(KERN_DEBUG "n_fi: ch is 0\n");
 #endif
-						if (USG_NONE(dev->usage[sidx])) {
+						if (USG_NONE(isdn_dev->usage[sidx])) {
 							/* Second Channel is free, now see if it is bound
 							 * exclusive too. */
-							if (dev->usage[sidx] & ISDN_USAGE_EXCLUSIVE) {
+							if (isdn_dev->usage[sidx] & ISDN_USAGE_EXCLUSIVE) {
 #ifdef ISDN_DEBUG_NET_ICALL
 								printk(KERN_DEBUG "n_fi: 2nd channel is down and bound\n");
 #endif
@@ -2259,7 +2259,7 @@
 #ifdef ISDN_DEBUG_NET_ICALL
 							printk(KERN_DEBUG "n_fi: final check\n");
 #endif
-							if ((dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) &&
+							if ((isdn_dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) &&
 							    ((lp->pre_channel != ch) ||
 							     (lp->pre_device != di))) {
 #ifdef ISDN_DEBUG_NET_ICALL
@@ -2404,11 +2404,11 @@
 						isdn_free_channel(lp->isdn_device, lp->isdn_channel,
 							 ISDN_USAGE_NET);
 					}
-					dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
-					dev->usage[idx] |= ISDN_USAGE_NET;
-					strcpy(dev->num[idx], nr);
+					isdn_dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
+					isdn_dev->usage[idx] |= ISDN_USAGE_NET;
+					strcpy(isdn_dev->num[idx], nr);
 					isdn_info_update();
-					dev->st_netdev[idx] = lp->netdev;
+					isdn_dev->st_netdev[idx] = lp->netdev;
 					lp->isdn_device = di;
 					lp->isdn_channel = ch;
 					lp->ppp_slot = -1;
@@ -2435,7 +2435,7 @@
 		p = (isdn_net_dev *) p->next;
 	}
 	/* If none of configured EAZ/MSN matched and not verbose, be silent */
-	if (!ematch || dev->net_verbose)
+	if (!ematch || isdn_dev->net_verbose)
 		printk(KERN_INFO "isdn_net: call from %s -> %d %s ignored\n", nr, di, eaz);
 	restore_flags(flags);
 	return (wret == 2)?5:0;
@@ -2447,7 +2447,7 @@
 isdn_net_dev *
 isdn_net_findif(char *name)
 {
-	isdn_net_dev *p = dev->netdev;
+	isdn_net_dev *p = isdn_dev->netdev;
 
 	while (p) {
 		if (!strcmp(p->local->name, name))
@@ -2631,8 +2631,8 @@
 	netdev->local->dialwait_timer = 0;  /* Jiffies of earliest next dial-start */
 
 	/* Put into to netdev-chain */
-	netdev->next = (void *) dev->netdev;
-	dev->netdev = netdev;
+	netdev->next = (void *) isdn_dev->netdev;
+	isdn_dev->netdev = netdev;
 	return netdev->dev.name;
 }
 
@@ -2688,8 +2688,8 @@
 		features = ((1 << cfg->l2_proto) << ISDN_FEATURE_L2_SHIFT) |
 			((1 << cfg->l3_proto) << ISDN_FEATURE_L3_SHIFT);
 		for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-			if (dev->drv[i])
-				if ((dev->drv[i]->interface->features & features) == features)
+			if (isdn_dev->drv[i])
+				if ((isdn_dev->drv[i]->interface->features & features) == features)
 					break;
 		if (i == ISDN_MAX_DRIVERS) {
 			printk(KERN_WARNING "isdn_net: No driver with selected features\n");
@@ -2778,7 +2778,7 @@
 			}
 			for (i = 0; i < ISDN_MAX_DRIVERS; i++)
 				/* Lookup driver-Id in array */
-				if (!(strcmp(dev->drvid[i], drvid))) {
+				if (!(strcmp(isdn_dev->drvid[i], drvid))) {
 					drvidx = i;
 					break;
 				}
@@ -2804,7 +2804,7 @@
 				return -EBUSY;
 			}
 			/* All went ok, so update isdninfo */
-			dev->usage[i] = ISDN_USAGE_EXCLUSIVE;
+			isdn_dev->usage[i] = ISDN_USAGE_EXCLUSIVE;
 			isdn_info_update();
 			restore_flags(flags);
 			lp->exclusive = i;
@@ -2914,7 +2914,7 @@
 		strcpy(cfg->eaz, lp->msn);
 		cfg->exclusive = lp->exclusive;
 		if (lp->pre_device >= 0) {
-			sprintf(cfg->drvid, "%s,%d", dev->drvid[lp->pre_device],
+			sprintf(cfg->drvid, "%s,%d", isdn_dev->drvid[lp->pre_device],
 				lp->pre_channel);
 		} else
 			cfg->drvid[0] = '\0';
@@ -3031,9 +3031,9 @@
 	idx = isdn_dc2minor(dv, ch);
 	if (idx<0) return -ENODEV;
 	/* for pre-bound channels, we need this extra check */
-	if ( strncmp(dev->num[idx],"???",3) == 0 ) return -ENOTCONN;
-	strncpy(phone->phone,dev->num[idx],ISDN_MSNLEN);
-	phone->outgoing=USG_OUTGOING(dev->usage[idx]);
+	if ( strncmp(isdn_dev->num[idx],"???",3) == 0 ) return -ENOTCONN;
+	strncpy(phone->phone,isdn_dev->num[idx],ISDN_MSNLEN);
+	phone->outgoing=USG_OUTGOING(isdn_dev->usage[idx]);
 	if ( copy_to_user(peer,phone,sizeof(*peer)) ) return -EFAULT;
 	return 0;
 }
@@ -3163,11 +3163,11 @@
 	if (q)
 		q->next = p->next;
 	else
-		dev->netdev = p->next;
+		isdn_dev->netdev = p->next;
 	if (p->local->slave) {
 		/* If this interface has a slave, remove it also */
 		char *slavename = ((isdn_net_local *) (p->local->slave->priv))->name;
-		isdn_net_dev *n = dev->netdev;
+		isdn_net_dev *n = isdn_dev->netdev;
 		q = NULL;
 		while (n) {
 			if (!strcmp(n->local->name, slavename)) {
@@ -3179,7 +3179,7 @@
 		}
 	}
 	/* If no more net-devices remain, disable auto-hangup timer */
-	if (dev->netdev == NULL)
+	if (isdn_dev->netdev == NULL)
 		isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 0);
 	restore_flags(flags);
 	kfree(p->local);
@@ -3198,7 +3198,7 @@
 	isdn_net_dev *q;
 
 	/* Search name in netdev-chain */
-	p = dev->netdev;
+	p = isdn_dev->netdev;
 	q = NULL;
 	while (p) {
 		if (!strcmp(p->local->name, name))
@@ -3207,7 +3207,7 @@
 		p = (isdn_net_dev *) p->next;
 	}
 	/* If no more net-devices remain, disable auto-hangup timer */
-	if (dev->netdev == NULL)
+	if (isdn_dev->netdev == NULL)
 		isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 0);
 	return -ENODEV;
 }
@@ -3224,16 +3224,16 @@
 	/* Walk through netdev-chain */
 	save_flags(flags);
 	cli();
-	while (dev->netdev) {
-		if (!dev->netdev->local->master) {
+	while (isdn_dev->netdev) {
+		if (!isdn_dev->netdev->local->master) {
 			/* Remove master-devices only, slaves get removed with their master */
-			if ((ret = isdn_net_realrm(dev->netdev, NULL))) {
+			if ((ret = isdn_net_realrm(isdn_dev->netdev, NULL))) {
 				restore_flags(flags);
 				return ret;
 			}
 		}
 	}
-	dev->netdev = NULL;
+	isdn_dev->netdev = NULL;
 	restore_flags(flags);
 	return 0;
 }
diff -ur -X exclude linux-2.5.3-clean/drivers/isdn/isdn_tty.c linux/drivers/isdn/isdn_tty.c
--- linux-2.5.3-clean/drivers/isdn/isdn_tty.c	Thu Jan  3 12:20:10 2002
+++ linux/drivers/isdn/isdn_tty.c	Mon Feb  4 11:35:49 2002
@@ -128,8 +128,8 @@
 	modem_info *info;
 
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		if ((midx = dev->m_idx[i]) >= 0) {
-			info = &dev->mdm.info[midx];
+		if ((midx = isdn_dev->m_idx[i]) >= 0) {
+			info = &isdn_dev->mdm.info[midx];
 			if (info->online) {
 				r = 0;
 #ifdef CONFIG_ISDN_AUDIO
@@ -182,11 +182,11 @@
 #endif
 	modem_info *info;
 
-	if ((midx = dev->m_idx[i]) < 0) {
+	if ((midx = isdn_dev->m_idx[i]) < 0) {
 		/* if midx is invalid, packet is not for tty */
 		return 0;
 	}
-	info = &dev->mdm.info[midx];
+	info = &isdn_dev->mdm.info[midx];
 #ifdef CONFIG_ISDN_AUDIO
 	ifmt = 1;
 	
@@ -269,7 +269,7 @@
 	/* Try to deliver directly via tty-flip-buf if queue is empty */
 	save_flags(flags);
 	cli();
-	if (skb_queue_empty(&dev->drv[di]->rpqueue[channel]))
+	if (skb_queue_empty(&isdn_dev->drv[di]->rpqueue[channel]))
 		if (isdn_tty_try_read(info, skb)) {
 			restore_flags(flags);
 			return 1;
@@ -277,8 +277,8 @@
 	/* Direct deliver failed or queue wasn't empty.
 	 * Queue up for later dequeueing via timer-irq.
 	 */
-	__skb_queue_tail(&dev->drv[di]->rpqueue[channel], skb);
-	dev->drv[di]->rcvcount[channel] +=
+	__skb_queue_tail(&isdn_dev->drv[di]->rpqueue[channel], skb);
+	isdn_dev->drv[di]->rcvcount[channel] +=
 		(skb->len
 #ifdef CONFIG_ISDN_AUDIO
 		 + ISDN_AUDIO_SKB_DLECOUNT(skb)
@@ -286,7 +286,7 @@
 			);
 	restore_flags(flags);
 	/* Schedule dequeuing */
-	if ((dev->modempoll) && (info->rcvsched))
+	if ((isdn_dev->modempoll) && (info->rcvsched))
 		isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1);
 	return 1;
 }
@@ -483,7 +483,7 @@
 		info->xmit_count = 0;
 		return;
 	}
-	skb_res = dev->drv[info->isdn_driver]->interface->hl_hdrlen + 4;
+	skb_res = isdn_dev->drv[info->isdn_driver]->interface->hl_hdrlen + 4;
 #ifdef CONFIG_ISDN_AUDIO
 	if (info->vonline & 2)
 		audio_len = buflen * voice_cf[info->emu.vpar[3]];
@@ -657,11 +657,11 @@
 		restore_flags(flags);
 		isdn_tty_modem_result(RESULT_NO_DIALTONE, info);
 	} else {
-		info->isdn_driver = dev->drvmap[i];
-		info->isdn_channel = dev->chanmap[i];
+		info->isdn_driver = isdn_dev->drvmap[i];
+		info->isdn_channel = isdn_dev->chanmap[i];
 		info->drv_index = i;
-		dev->m_idx[i] = info->line;
-		dev->usage[i] |= ISDN_USAGE_OUTGOING;
+		isdn_dev->m_idx[i] = info->line;
+		isdn_dev->usage[i] |= ISDN_USAGE_OUTGOING;
 		info->last_dir = 1;
 		strcpy(info->last_num, n);
 		isdn_info_update();
@@ -699,7 +699,7 @@
 		cmd.command = ISDN_CMD_DIAL;
 		info->dialing = 1;
 		info->emu.carrierwait = 0;
-		strcpy(dev->num[i], n);
+		strcpy(isdn_dev->num[i], n);
 		isdn_info_update();
 		isdn_command(&cmd);
 		isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1);
@@ -780,7 +780,7 @@
 	isdn_free_channel(di, ch, 0);
 
 	if (info->drv_index >= 0) {
-		dev->m_idx[info->drv_index] = -1;
+		isdn_dev->m_idx[info->drv_index] = -1;
 		info->drv_index = -1;
 	}
 }
@@ -876,11 +876,11 @@
 		restore_flags(flags);
 		isdn_tty_modem_result(RESULT_NO_DIALTONE, info);
 	} else {
-		info->isdn_driver = dev->drvmap[i];
-		info->isdn_channel = dev->chanmap[i];
+		info->isdn_driver = isdn_dev->drvmap[i];
+		info->isdn_channel = isdn_dev->chanmap[i];
 		info->drv_index = i;
-		dev->m_idx[i] = info->line;
-		dev->usage[i] |= ISDN_USAGE_OUTGOING;
+		isdn_dev->m_idx[i] = info->line;
+		isdn_dev->usage[i] |= ISDN_USAGE_OUTGOING;
 		info->last_dir = 1;
 //		strcpy(info->last_num, n);
 		isdn_info_update();
@@ -917,7 +917,7 @@
 		strncpy(&cmd.parm.cmsg.para[6], id, l);
 		cmd.command =CAPI_PUT_MESSAGE;
 		info->dialing = 1;
-//		strcpy(dev->num[i], n);
+//		strcpy(isdn_dev->num[i], n);
 		isdn_info_update();
 		isdn_command(&cmd);
 		isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1);
@@ -970,11 +970,11 @@
 		restore_flags(flags);
 		isdn_tty_modem_result(RESULT_NO_DIALTONE, info);
 	} else {
-		info->isdn_driver = dev->drvmap[i];
-		info->isdn_channel = dev->chanmap[i];
+		info->isdn_driver = isdn_dev->drvmap[i];
+		info->isdn_channel = isdn_dev->chanmap[i];
 		info->drv_index = i;
-		dev->m_idx[i] = info->line;
-		dev->usage[i] |= ISDN_USAGE_OUTGOING;
+		isdn_dev->m_idx[i] = info->line;
+		isdn_dev->usage[i] |= ISDN_USAGE_OUTGOING;
 		info->last_dir = 1;
 		isdn_info_update();
 		restore_flags(flags);
@@ -1006,7 +1006,7 @@
 		cmd.parm.cmsg.para[l+1] = 0xd;
 		cmd.command =CAPI_PUT_MESSAGE;
 /*		info->dialing = 1;
-		strcpy(dev->num[i], n);
+		strcpy(isdn_dev->num[i], n);
 		isdn_info_update();
 */
 		isdn_command(&cmd);
@@ -1186,8 +1186,8 @@
 		c = count;
 		if (c > info->xmit_size - info->xmit_count)
 			c = info->xmit_size - info->xmit_count;
-		if (info->isdn_driver >= 0 && c > dev->drv[info->isdn_driver]->maxbufsize)
-			c = dev->drv[info->isdn_driver]->maxbufsize;
+		if (info->isdn_driver >= 0 && c > isdn_dev->drv[info->isdn_driver]->maxbufsize)
+			c = isdn_dev->drv[info->isdn_driver]->maxbufsize;
 		if (c <= 0)
 			break;
 		if ((info->online > 1)
@@ -1743,7 +1743,7 @@
 	line = minor(tty->device) - tty->driver.minor_start;
 	if (line < 0 || line > ISDN_MAX_CHANNELS)
 		return -ENODEV;
-	info = &dev->mdm.info[line];
+	info = &isdn_dev->mdm.info[line];
 	if (isdn_tty_paranoia_check(info, tty->device, "isdn_tty_open"))
 		return -ENODEV;
 #ifdef ISDN_DEBUG_MODEM_OPEN
@@ -1782,7 +1782,7 @@
 #ifdef ISDN_DEBUG_MODEM_OPEN
 	printk(KERN_DEBUG "isdn_tty_open ttyi%d successful...\n", info->line);
 #endif
-	dev->modempoll++;
+	isdn_dev->modempoll++;
 #ifdef ISDN_DEBUG_MODEM_OPEN
 	printk(KERN_DEBUG "isdn_tty_open normal exit\n");
 #endif
@@ -1863,7 +1863,7 @@
 				break;
 		}
 	}
-	dev->modempoll--;
+	isdn_dev->modempoll--;
 	isdn_tty_shutdown(info);
 	if (tty->driver.flush_buffer)
 		tty->driver.flush_buffer(tty);
@@ -2006,8 +2006,8 @@
 	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)
-		send_sig(SIGIO, dev->profd, 1);
+	if (isdn_dev->profd)
+		send_sig(SIGIO, isdn_dev->profd, 1);
 }
 
 int
@@ -2017,7 +2017,7 @@
 	int i;
 	modem_info *info;
 
-	m = &dev->mdm;
+	m = &isdn_dev->mdm;
 	memset(&m->tty_modem, 0, sizeof(struct tty_driver));
 	m->tty_modem.magic = TTY_DRIVER_MAGIC;
 	m->tty_modem.name = isdn_ttyname_ttyI;
@@ -2206,7 +2206,7 @@
 	save_flags(flags);
 	cli();
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		modem_info *info = &dev->mdm.info[i];
+		modem_info *info = &isdn_dev->mdm.info[i];
 
                 if (info->count == 0)
                     continue;
@@ -2217,7 +2217,7 @@
 			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,
 			       info->flags, info->isdn_driver, info->isdn_channel,
-			       dev->usage[idx]);
+			       isdn_dev->usage[idx]);
 #endif
 			if (
 #ifndef FIX_FILE_TRANSFER
@@ -2225,7 +2225,7 @@
 #endif
 				(info->isdn_driver == -1) &&
 				(info->isdn_channel == -1) &&
-				(USG_NONE(dev->usage[idx]))) {
+				(USG_NONE(isdn_dev->usage[idx]))) {
 				int matchret;
 
 				if ((matchret = isdn_tty_match_icall(eaz, &info->emu, di)) > wret)
@@ -2234,10 +2234,10 @@
 					info->isdn_driver = di;
 					info->isdn_channel = ch;
 					info->drv_index = idx;
-					dev->m_idx[idx] = info->line;
-					dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
-					dev->usage[idx] |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]); 
-					strcpy(dev->num[idx], nr);
+					isdn_dev->m_idx[idx] = info->line;
+					isdn_dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
+					isdn_dev->usage[idx] |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]); 
+					strcpy(isdn_dev->num[idx], nr);
 					strcpy(info->emu.cpn, eaz);
 					info->emu.mdmreg[REG_SI1I] = si2bit[si1];
 					info->emu.mdmreg[REG_PLAN] = setup->plan;
@@ -2256,7 +2256,7 @@
 	}
 	restore_flags(flags);
 	printk(KERN_INFO "isdn_tty: call from %s -> %s %s\n", nr, eaz,
-	       ((dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2))? "rejected" : "ignored");
+	       ((isdn_dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2))? "rejected" : "ignored");
 	return (wret == 2)?3:0;
 }
 
@@ -2272,8 +2272,8 @@
 
 	if (i < 0)
 		return 0;
-	if ((mi = dev->m_idx[i]) >= 0) {
-		info = &dev->mdm.info[mi];
+	if ((mi = isdn_dev->m_idx[i]) >= 0) {
+		info = &isdn_dev->mdm.info[mi];
 		switch (c->command) {
                         case ISDN_STAT_CINF:
                                 printk(KERN_DEBUG "CHARGEINFO on ttyI%d: %ld %s\n", info->line, c->arg, c->parm.num);
@@ -2371,14 +2371,14 @@
 						info->last_dir = 0;
 					info->dialing = 0;
 					info->rcvsched = 1;
-					if (USG_MODEM(dev->usage[i])) {
+					if (USG_MODEM(isdn_dev->usage[i])) {
 						if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) {
 							strcpy(info->emu.connmsg, c->parm.num);
 							isdn_tty_modem_result(RESULT_CONNECT, info);
 						} else
 							isdn_tty_modem_result(RESULT_CONNECT64000, info);
 					}
-					if (USG_VOICE(dev->usage[i]))
+					if (USG_VOICE(isdn_dev->usage[i]))
 						isdn_tty_modem_result(RESULT_VCON, info);
 					return 1;
 				}
@@ -2416,7 +2416,7 @@
 				printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line);
 #endif
 				for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-					info = &dev->mdm.info[i];
+					info = &isdn_dev->mdm.info[i];
 					if (info->isdn_driver == c->driver) {
 						if (info->online)
 							isdn_tty_modem_hup(info, 1);
@@ -2485,7 +2485,7 @@
 	/* use queue instead of direct flip, if online and */
 	/* data is in queue or flip buffer is full */
 	if ((info->online) && (((tty->flip.count + strlen(msg)) >= TTY_FLIPBUF_SIZE) ||
-	    (!skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel])))) {
+	    (!skb_queue_empty(&isdn_dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel])))) {
 		skb = alloc_skb(strlen(msg)
 #ifdef CONFIG_ISDN_AUDIO
 			+ sizeof(isdn_audio_skb)
@@ -2528,11 +2528,11 @@
 		}
 	}
 	if (skb) {
-		__skb_queue_tail(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel], skb);
-		dev->drv[info->isdn_driver]->rcvcount[info->isdn_channel] += skb->len;
+		__skb_queue_tail(&isdn_dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel], skb);
+		isdn_dev->drv[info->isdn_driver]->rcvcount[info->isdn_channel] += skb->len;
 		restore_flags(flags);
 		/* Schedule dequeuing */
-		if ((dev->modempoll) && (info->rcvsched))
+		if ((isdn_dev->modempoll) && (info->rcvsched))
 			isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1);
 
 	} else {
@@ -2706,7 +2706,7 @@
 			    /* print CID, _before_ _every_ ring */
 			    if (!(m->mdmreg[REG_CIDONCE] & BIT_CIDONCE)) {
 				    isdn_tty_at_cout("\r\nCALLER NUMBER: ", info);
-				    isdn_tty_at_cout(dev->num[info->drv_index], info);
+				    isdn_tty_at_cout(isdn_dev->num[info->drv_index], info);
 				    if (m->mdmreg[REG_CDN] & BIT_CDN) {
 					    isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
 					    isdn_tty_at_cout(info->emu.cpn, info);
@@ -2735,7 +2735,7 @@
 					    (m->mdmreg[REG_RINGCNT] == 1)) {
 						isdn_tty_at_cout("\r\n", info);
 						isdn_tty_at_cout("CALLER NUMBER: ", info);
-						isdn_tty_at_cout(dev->num[info->drv_index], info);
+						isdn_tty_at_cout(isdn_dev->num[info->drv_index], info);
 						if (m->mdmreg[REG_CDN] & BIT_CDN) {
 							isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
 							isdn_tty_at_cout(info->emu.cpn, info);
@@ -3247,7 +3247,7 @@
 	if (info->msr & UART_MSR_RI) {
 		/* Accept incoming call */
 		info->last_dir = 0;
-		strcpy(info->last_num, dev->num[info->drv_index]);
+		strcpy(info->last_num, isdn_dev->num[info->drv_index]);
 		m->mdmreg[REG_RINGCNT] = 0;
 		info->msr &= ~UART_MSR_RI;
 		l2 = m->mdmreg[REG_L2PROT];
@@ -3326,7 +3326,7 @@
 #ifdef CONFIG_ISDN_TTY_FAX
 					case '1':
 						p[0]++;
-						if (!(dev->global_features &
+						if (!(isdn_dev->global_features &
 							ISDN_FEATURE_L3_FCLASS1))
 							PARSE_ERROR1;
 						m->mdmreg[REG_SI1] = 1;
@@ -3337,7 +3337,7 @@
 						break;
 					case '2':
 						p[0]++;
-						if (!(dev->global_features &
+						if (!(isdn_dev->global_features &
 							ISDN_FEATURE_L3_FCLASS2))
 							PARSE_ERROR1;
 						m->mdmreg[REG_SI1] = 1;
@@ -3359,10 +3359,10 @@
 						p[0]++;
 						strcpy(rs, "\r\n0,");
 #ifdef CONFIG_ISDN_TTY_FAX
-						if (dev->global_features &
+						if (isdn_dev->global_features &
 							ISDN_FEATURE_L3_FCLASS1)
 							strcat(rs, "1,");
-						if (dev->global_features &
+						if (isdn_dev->global_features &
 							ISDN_FEATURE_L3_FCLASS2)
 							strcat(rs, "2,");
 #endif
@@ -3968,9 +3968,9 @@
 	int midx;
 
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-		if (USG_MODEM(dev->usage[i]))
-			if ((midx = dev->m_idx[i]) >= 0) {
-				modem_info *info = &dev->mdm.info[midx];
+		if (USG_MODEM(isdn_dev->usage[i]))
+			if ((midx = isdn_dev->m_idx[i]) >= 0) {
+				modem_info *info = &isdn_dev->mdm.info[midx];
 				if (info->online) {
 					ton = 1;
 					if ((info->emu.pluscount == 3) &&
@@ -3996,7 +3996,7 @@
 	int i;
 
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		modem_info *info = &dev->mdm.info[i];
+		modem_info *info = &isdn_dev->mdm.info[i];
 		if (info->msr & UART_MSR_RI) {
 			ton = 1;
 			isdn_tty_modem_result(RESULT_RING, info);
@@ -4016,7 +4016,7 @@
 	int i;
 
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		modem_info *info = &dev->mdm.info[i];
+		modem_info *info = &isdn_dev->mdm.info[i];
 		if (info->online) {
 			ton = 1;
 			isdn_tty_senddown(info);
@@ -4037,7 +4037,7 @@
 	int i;
 
 	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-		modem_info *info = &dev->mdm.info[i];
+		modem_info *info = &isdn_dev->mdm.info[i];
 		if (info->dialing) {
 			if (info->emu.carrierwait++ > info->emu.mdmreg[REG_WAITC]) {
 				info->dialing = 0;
diff -ur -X exclude linux-2.5.3-clean/drivers/isdn/isdn_ttyfax.c linux/drivers/isdn/isdn_ttyfax.c
--- linux-2.5.3-clean/drivers/isdn/isdn_ttyfax.c	Sun Sep 30 12:26:06 2001
+++ linux/drivers/isdn/isdn_ttyfax.c	Mon Feb  4 11:35:49 2002
@@ -74,7 +74,7 @@
 		case 2:	/* +FCON */
 			/* Append CPN, if enabled */
 			if ((m->mdmreg[REG_CPNFCON] & BIT_CPNFCON) &&
-				(!(dev->usage[info->isdn_channel] & ISDN_USAGE_OUTGOING))) {
+				(!(isdn_dev->usage[info->isdn_channel] & ISDN_USAGE_OUTGOING))) {
 				sprintf(rs, "/%s", m->cpn);
 				isdn_tty_at_cout(rs, info);
 			}
@@ -380,10 +380,10 @@
 			restore_flags(flags);
 			PARSE_ERROR1;
 		}
-		info->isdn_driver = dev->drvmap[i];
-		info->isdn_channel = dev->chanmap[i];
+		info->isdn_driver = isdn_dev->drvmap[i];
+		info->isdn_channel = isdn_dev->chanmap[i];
 		info->drv_index = i;
-		dev->m_idx[i] = info->line;
+		isdn_dev->m_idx[i] = info->line;
 		c.driver = info->isdn_driver;
 		c.arg = info->isdn_channel;
 		isdn_command(&c);
@@ -392,7 +392,7 @@
 		info->isdn_driver = -1;
 		info->isdn_channel = -1;
 		if (info->drv_index >= 0) {
-			dev->m_idx[info->drv_index] = -1;
+			isdn_dev->m_idx[info->drv_index] = -1;
 			info->drv_index = -1;
 		}
 		restore_flags(flags);
diff -ur -X exclude linux-2.5.3-clean/drivers/isdn/isdn_v110.c linux/drivers/isdn/isdn_v110.c
--- linux-2.5.3-clean/drivers/isdn/isdn_v110.c	Sun Sep 30 12:26:06 2001
+++ linux/drivers/isdn/isdn_v110.c	Mon Feb  4 11:35:49 2002
@@ -531,9 +531,9 @@
 			 * send down an Idle-Frame (or an Sync-Frame, if
 			 * v->SyncInit != 0). 
 			 */
-			if (!(v = dev->v110[idx]))
+			if (!(v = isdn_dev->v110[idx]))
 				return 0;
-			atomic_inc(&dev->v110use[idx]);
+			atomic_inc(&isdn_dev->v110use[idx]);
 			if (v->skbidle > 0) {
 				v->skbidle--;
 				ret = 1;
@@ -549,7 +549,7 @@
 				else
 					skb = isdn_v110_idle(v);
 				if (skb) {
-					if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
+					if (isdn_dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
 						dev_kfree_skb(skb);
 						break;
 					} else {
@@ -560,41 +560,41 @@
 				} else
 					break;
 			}
-			atomic_dec(&dev->v110use[idx]);
+			atomic_dec(&isdn_dev->v110use[idx]);
 			return ret;
 		case ISDN_STAT_DHUP:
 		case ISDN_STAT_BHUP:
 			while (1) {
-				atomic_inc(&dev->v110use[idx]);
-				if (atomic_dec_and_test(&dev->v110use[idx])) {
-					isdn_v110_close(dev->v110[idx]);
-					dev->v110[idx] = NULL;
+				atomic_inc(&isdn_dev->v110use[idx]);
+				if (atomic_dec_and_test(&isdn_dev->v110use[idx])) {
+					isdn_v110_close(isdn_dev->v110[idx]);
+					isdn_dev->v110[idx] = NULL;
 					break;
 				}
 				sti();
 			}
 			break;
 		case ISDN_STAT_BCONN:
-			if (dev->v110emu[idx] && (dev->v110[idx] == NULL)) {
-				int hdrlen = dev->drv[c->driver]->interface->hl_hdrlen;
-				int maxsize = dev->drv[c->driver]->interface->maxbufsize;
-				atomic_inc(&dev->v110use[idx]);
-				switch (dev->v110emu[idx]) {
+			if (isdn_dev->v110emu[idx] && (isdn_dev->v110[idx] == NULL)) {
+				int hdrlen = isdn_dev->drv[c->driver]->interface->hl_hdrlen;
+				int maxsize = isdn_dev->drv[c->driver]->interface->maxbufsize;
+				atomic_inc(&isdn_dev->v110use[idx]);
+				switch (isdn_dev->v110emu[idx]) {
 					case ISDN_PROTO_L2_V11096:
-						dev->v110[idx] = isdn_v110_open(V110_9600, hdrlen, maxsize);
+						isdn_dev->v110[idx] = isdn_v110_open(V110_9600, hdrlen, maxsize);
 						break;
 					case ISDN_PROTO_L2_V11019:
-						dev->v110[idx] = isdn_v110_open(V110_19200, hdrlen, maxsize);
+						isdn_dev->v110[idx] = isdn_v110_open(V110_19200, hdrlen, maxsize);
 						break;
 					case ISDN_PROTO_L2_V11038:
-						dev->v110[idx] = isdn_v110_open(V110_38400, hdrlen, maxsize);
+						isdn_dev->v110[idx] = isdn_v110_open(V110_38400, hdrlen, maxsize);
 						break;
 					default:;
 				}
-				if ((v = dev->v110[idx])) {
+				if ((v = isdn_dev->v110[idx])) {
 					while (v->SyncInit) {
 						struct sk_buff *skb = isdn_v110_sync(v);
-						if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
+						if (isdn_dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
 							dev_kfree_skb(skb);
 							/* Unable to send, try later */
 							break;
@@ -604,7 +604,7 @@
 					}
 				} else
 					printk(KERN_WARNING "isdn_v110: Couldn't open stream for chan %d\n", idx);
-				atomic_dec(&dev->v110use[idx]);
+				atomic_dec(&isdn_dev->v110use[idx]);
 			}
 			break;
 		default:
--- linux-2.5.3-clean/include/linux/isdn.h	Sun Jan 27 11:33:38 2002
+++ linux/include/linux/isdn.h	Mon Feb  4 12:30:23 2002
@@ -636,9 +636,9 @@
 	devfs_handle_t devfs_handle_ipppX[ISDN_MAX_CHANNELS];
 #endif
 #endif /* CONFIG_DEVFS_FS */
-} isdn_dev;
+} isdn_dev_t;
 
-extern isdn_dev *dev;
+extern isdn_dev_t *isdn_dev;
 
 
 #endif /* __KERNEL__ */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Feb 07 2002 - 21:01:03 EST