patch-2.3.99-pre3 linux/drivers/isdn/isdn_net.c
Next file: linux/drivers/isdn/isdn_net.h
Previous file: linux/drivers/isdn/isdn_concap.c
Back to the patch index
Back to the overall index
- Lines: 708
- Date:
Thu Mar 23 08:38:57 2000
- Orig file:
v2.3.99-pre2/linux/drivers/isdn/isdn_net.c
- Orig date:
Sat Feb 26 22:31:46 2000
diff -u --recursive --new-file v2.3.99-pre2/linux/drivers/isdn/isdn_net.c linux/drivers/isdn/isdn_net.c
@@ -1,4 +1,4 @@
-/* $Id: isdn_net.c,v 1.110 2000/02/26 01:00:53 keil Exp $
+/* $Id: isdn_net.c,v 1.122 2000/03/20 22:37:46 detabc Exp $
* Linux ISDN subsystem, network interfaces and related functions (linklevel).
*
@@ -21,6 +21,50 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: isdn_net.c,v $
+ * Revision 1.122 2000/03/20 22:37:46 detabc
+ * modify abc-extension to work together with the new LL.
+ * remove abc frame-counter (is obsolete now).
+ * use the new lp->super_tx_queue for internal queueing (bsd-rawip-compress).
+ * modify isdn_net_xmit() and isdn_net_write_super().
+ * -- Kai, please have a look to this two function's. Thank's.
+ *
+ * Revision 1.121 2000/03/19 15:27:53 kai
+ * no known bugs left...
+ *
+ * Revision 1.120 2000/03/18 16:20:25 kai
+ * cosmetics / renaming
+ *
+ * Revision 1.118 2000/03/17 18:20:46 kai
+ * moved to frame_cnt based flow control
+ * some races still need to be fixed
+ *
+ * Revision 1.117 2000/03/17 17:01:00 kai
+ * cleanup
+ *
+ * Revision 1.116 2000/03/17 16:22:55 kai
+ * we keep track of outstanding packets (given to HL, but not confirmed yet)
+ * now, but we don't use it for flow control yet.
+ *
+ * Revision 1.115 2000/03/17 12:49:42 kai
+ * calling statcallb with ISDN_STAT_BSENT in hard-IRQ context is now
+ * officially allowed. writebuf_skb() will never be called in hard-IRQ context
+ * anymore.
+ *
+ * Revision 1.114 2000/03/16 16:37:41 kai
+ * Allow phone numbers starting with "*" as outgoing numbers for
+ * networking interface. Some PBX's need this to allow dialing internal
+ * numbers (mine, for example ;-)
+ *
+ * Revision 1.113 2000/03/16 15:46:37 kai
+ * a little bugfix and cosmetic changes
+ *
+ * Revision 1.112 2000/03/04 16:20:42 detabc
+ * copy frames before rewriting frame's saddr
+ *
+ * Revision 1.111 2000/02/28 22:28:24 he
+ * moved tx_timeout warning messages in old (2.2.x) branch where it really only
+ * indicates problems.
+ *
* Revision 1.110 2000/02/26 01:00:53 keil
* changes from 2.3.47
*
@@ -487,19 +531,6 @@
* the network layer, and therefore, it only makes sense to call netif_*
* functions on them.
*
- * The old code abused the slaves dev->start to remember the corresponding
- * master's interface state (ifup'ed or not). This does not work with SOFTNET
- * any more, because there's now dev->start anymore.
- * Instead I chose to add isdn_net_started() which gives the state of the
- * master in case of slaves.
- * I'm still not sure if this is how it's supposed to be done this way
- * because it uses netif_running(dev) which might be
- * considered private to the network layer. However, it works for now.
- * Alternative: set a flag in _open() and clear it in _close()
- *
- * I left some dead code around in #if 0 which I'm not absolutely sure about.
- * If no problems turn up, it should be removed later
- *
* --KG
*/
@@ -507,7 +538,7 @@
* Find out if the netdevice has been ifup-ed yet.
* For slaves, look at the corresponding master.
*/
-static int __inline__ isdn_net_started(isdn_net_dev *n)
+static __inline__ int isdn_net_device_started(isdn_net_dev *n)
{
isdn_net_local *lp = n->local;
struct net_device *dev;
@@ -523,7 +554,7 @@
* wake up the network -> net_device queue.
* For slaves, wake the corresponding master interface.
*/
-static void __inline__ isdn_net_lp_xon(isdn_net_local * lp)
+static __inline__ void isdn_net_device_wake_queue(isdn_net_local *lp)
{
if (lp->master)
netif_wake_queue(lp->master);
@@ -531,6 +562,75 @@
netif_wake_queue(&lp->netdev->dev);
}
+/*
+ * stop the network -> net_device queue.
+ * For slaves, stop the corresponding master interface.
+ */
+static __inline__ void isdn_net_device_stop_queue(isdn_net_local *lp)
+{
+ if (lp->master)
+ netif_stop_queue(lp->master);
+ else
+ netif_stop_queue(&lp->netdev->dev);
+}
+
+/*
+ * find out if the net_device which this lp belongs to (lp can be
+ * master or slave) is busy. It's busy iff all (master and slave)
+ * queues are busy
+ */
+static __inline__ int isdn_net_device_busy(isdn_net_local *lp)
+{
+ isdn_net_local *nlp;
+ isdn_net_dev *nd;
+ unsigned long flags;
+
+ if (!isdn_net_lp_busy(lp))
+ return 0;
+
+ if (lp->master)
+ nd = ((isdn_net_local *) lp->master->priv)->netdev;
+ else
+ nd = lp->netdev;
+
+ spin_lock_irqsave(&nd->queue_lock, flags);
+ nlp = lp->next;
+ while (nlp != lp) {
+ if (!isdn_net_lp_busy(nlp)) {
+ spin_unlock_irqrestore(&nd->queue_lock, flags);
+ return 0;
+ }
+ nlp = nlp->next;
+ }
+ spin_unlock_irqrestore(&nd->queue_lock, flags);
+ return 1;
+}
+
+static __inline__ void isdn_net_inc_frame_cnt(isdn_net_local *lp)
+{
+ atomic_inc(&lp->frame_cnt);
+ if (isdn_net_device_busy(lp))
+ isdn_net_device_stop_queue(lp);
+}
+
+static __inline__ void isdn_net_dec_frame_cnt(isdn_net_local *lp)
+{
+ atomic_dec(&lp->frame_cnt);
+
+ if (!(isdn_net_device_busy(lp))) {
+ if (!skb_queue_empty(&lp->super_tx_queue)) {
+ queue_task(&lp->tqueue, &tq_immediate);
+ } else {
+ isdn_net_device_wake_queue(lp);
+ }
+ }
+}
+
+static __inline__ void isdn_net_zero_frame_cnt(isdn_net_local *lp)
+{
+ atomic_set(&lp->frame_cnt, 0);
+}
+
/* For 2.2.x we leave the transmitter busy timeout at 2 secs, just
* to be safe.
* For 2.3.x we push it up to 20 secs, because call establishment
@@ -546,9 +646,8 @@
int isdn_net_force_dial_lp(isdn_net_local *);
static int isdn_net_start_xmit(struct sk_buff *, struct net_device *);
-static int isdn_net_xmit(struct net_device *, isdn_net_local *, struct sk_buff *);
-char *isdn_net_revision = "$Revision: 1.110 $";
+char *isdn_net_revision = "$Revision: 1.122 $";
/*
* Code for raw-networking over ISDN
@@ -660,16 +759,12 @@
isdn_net_unbind_channel(isdn_net_local * lp)
{
ulong flags;
+ struct sk_buff *skb;
save_flags(flags);
cli();
- if (lp->first_skb) {
- dev_kfree_skb(lp->first_skb);
- lp->first_skb = NULL;
- }
- if (lp->sav_skb) {
- dev_kfree_skb(lp->sav_skb);
- lp->sav_skb = NULL;
+ while ((skb = skb_dequeue(&lp->super_tx_queue))) {
+ kfree_skb(skb);
}
if (!lp->master) { /* reset only master device */
/* Moral equivalent of dev_purge_queues():
@@ -766,6 +861,11 @@
isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, anymore);
}
+static void isdn_net_lp_disconnected(isdn_net_local *lp)
+{
+ isdn_net_rm_from_bundle(lp);
+}
+
/*
* Handle status-messages from ISDN-interfacecard.
* This function is called from within the main-status-dispatcher
@@ -789,28 +889,9 @@
/* A packet has successfully been sent out */
if ((lp->flags & ISDN_NET_CONNECTED) &&
(!lp->dialstate)) {
+ isdn_net_dec_frame_cnt(lp);
lp->stats.tx_packets++;
lp->stats.tx_bytes += c->parm.length;
- /* some HL drivers deliver
- ISDN_STAT_BSENT from hw interrupt.
- Output routines in isdn_ppp are now
- called with irq disabled such that
- dequeueing the sav_skb while another
- frame is sent will not occur.
- */
- if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP && lp->sav_skb) {
- struct net_device *mdev;
- if (lp->master)
- mdev = lp->master;
- else
- mdev = &lp->netdev->dev;
- if (!isdn_net_send_skb(mdev, lp, lp->sav_skb)) {
- lp->sav_skb = NULL;
- } else {
- return 1;
- }
- }
- isdn_net_lp_xon(lp);
}
return 1;
case ISDN_STAT_DCONN:
@@ -842,6 +923,7 @@
#ifdef CONFIG_ISDN_PPP
isdn_ppp_free(lp);
#endif
+ isdn_net_lp_disconnected(lp);
isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
printk(KERN_INFO "%s: remote hangup\n", lp->name);
printk(KERN_INFO "%s: Chargesum is %d\n", lp->name,
@@ -864,6 +946,7 @@
#endif /* CONFIG_ISDN_X25 */
case ISDN_STAT_BCONN:
/* B-Channel is up */
+ isdn_net_zero_frame_cnt(lp);
switch (lp->dialstate) {
case 5:
case 6:
@@ -881,13 +964,17 @@
isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 1);
if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
isdn_timer_ctrl(ISDN_TIMER_KEEPALIVE, 1);
+ if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP) {
+ if (lp->master) { /* is lp a slave? */
+ isdn_net_dev *nd = ((isdn_net_local *)lp->master->priv)->netdev;
+ isdn_net_add_to_bundle(nd, lp);
+ }
+ }
printk(KERN_INFO "isdn_net: %s connected\n", lp->name);
/* If first Chargeinfo comes before B-Channel connect,
* we correct the timestamp here.
*/
lp->chargetime = jiffies;
- printk(KERN_DEBUG "isdn_net: chargetime of %s now %lu\n",
- lp->name, lp->chargetime);
/* reset dial-timeout */
lp->dialstarted = 0;
@@ -903,13 +990,9 @@
if( pops->connect_ind)
pops->connect_ind(cprot);
#endif /* CONFIG_ISDN_X25 */
- /* Immediately send first skb to speed up arp */
- if (lp->first_skb) {
-
- if (!(isdn_net_xmit(&p->dev, lp, lp->first_skb)))
- lp->first_skb = NULL;
- }
- if(! lp->first_skb) isdn_net_lp_xon(lp);
+ /* ppp needs to do negotiations first */
+ if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
+ isdn_net_device_wake_queue(lp);
return 1;
}
break;
@@ -942,20 +1025,6 @@
}
/*
- * Check, if a number contains wildcard-characters, in which case it
- * is for incoming purposes only.
- */
-static int
-isdn_net_checkwild(char *num)
-{
- return ((strchr(num, '?')) ||
- (strchr(num, '*')) ||
- (strchr(num, '[')) ||
- (strchr(num, ']')) ||
- (strchr(num, '^')));
-}
-
-/*
* Perform dialout for net-interfaces and timeout-handling for
* D-Channel-up and B-Channel-up Messages.
* This function is initially called from within isdn_net_start_xmit() or
@@ -1033,7 +1102,7 @@
s = "dial suppressed: isdn system stopped";
else
s = "dial suppressed: dialmode `off'";
- isdn_net_unreachable(&p->dev, lp->first_skb, s);
+ isdn_net_unreachable(&p->dev, 0, s);
isdn_net_hangup(&p->dev);
break;
}
@@ -1066,7 +1135,7 @@
restore_flags(flags);
lp->dialwait_timer = jiffies + lp->dialwait;
lp->dialstarted = 0;
- isdn_net_unreachable(&p->dev, lp->first_skb, "dial: timed out");
+ isdn_net_unreachable(&p->dev, 0, "dial: timed out");
isdn_net_hangup(&p->dev);
break;
}
@@ -1084,7 +1153,7 @@
if (lp->dialtimeout == 0) {
lp->dialwait_timer = jiffies + lp->dialwait;
lp->dialstarted = 0;
- isdn_net_unreachable(&p->dev, lp->first_skb, "dial: tried all numbers dialmax times");
+ isdn_net_unreachable(&p->dev, 0, "dial: tried all numbers dialmax times");
}
isdn_net_hangup(&p->dev);
break;
@@ -1248,6 +1317,7 @@
#ifdef CONFIG_ISDN_PPP
isdn_ppp_free(lp);
#endif
+ isdn_net_lp_disconnected(lp);
#ifdef CONFIG_ISDN_X25
/* try if there are generic encap protocol
receiver routines and signal the closure of
@@ -1360,31 +1430,83 @@
}
/*
- * Generic routine to send out an skbuf.
- * If lowlevel-device does not support support skbufs, use
- * standard send-routine, else send directly.
- *
- * Return: 0 on success, !0 on failure.
+ * this function is used to send supervisory data, i.e. data which was
+ * not received from the network layer, but e.g. frames from ipppd, CCP
+ * reset frames etc.
+ */
+void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb)
+{
+ if (in_interrupt()) {
+ printk("isdn BUG at %s:%d!\n", __FILE__, __LINE__);
+ return;
+ }
+
+ spin_lock_bh(&lp->xmit_lock);
+ if (!isdn_net_lp_busy(lp)) {
+ isdn_net_writebuf_skb(lp, skb);
+ } else {
+ skb_queue_tail(&lp->super_tx_queue, skb);
+ }
+ spin_unlock_bh(&lp->xmit_lock);
+}
+
+/*
+ * called from tq_immediate
*/
-int isdn_net_send_skb
- (struct net_device *ndev, isdn_net_local * lp,struct sk_buff *skb)
+static void
+isdn_net_softint(void *private)
+{
+ isdn_net_local *lp = private;
+ struct sk_buff *skb;
+
+ spin_lock_bh(&lp->xmit_lock);
+ while (!isdn_net_lp_busy(lp)) {
+ skb = skb_dequeue(&lp->super_tx_queue);
+ if (!skb)
+ break;
+ isdn_net_writebuf_skb(lp, skb);
+ }
+ spin_unlock_bh(&lp->xmit_lock);
+}
+
+/*
+ * all frames sent from the (net) LL to a HL driver should go via this function
+ * it's serialized by the caller holding the lp->xmit_lock spinlock
+ */
+void isdn_net_writebuf_skb(isdn_net_local *lp, struct sk_buff *skb)
{
int ret;
int len = skb->len; /* save len */
- ret = isdn_writebuf_skb_stub(lp->isdn_device, lp->isdn_channel, 1, skb);
- if (ret == len) {
- lp->transcount += len;
- return 0;
+ /* before obtaining the lock the caller should have checked that
+ the lp isn't busy */
+ if (isdn_net_lp_busy(lp)) {
+ printk("isdn BUG at %s:%d!\n", __FILE__, __LINE__);
+ goto error;
}
- if (ret < 0) {
- dev_kfree_skb(skb);
- lp->stats.tx_errors++;
- return 0;
+
+ if (!(lp->flags & ISDN_NET_CONNECTED)) {
+ printk("isdn BUG at %s:%d!\n", __FILE__, __LINE__);
+ goto error;
}
- return 1;
+ ret = isdn_writebuf_skb_stub(lp->isdn_device, lp->isdn_channel, 1, skb);
+ if (ret != len) {
+ /* we should never get here */
+ printk(KERN_WARNING "%s: HL driver queue full\n", lp->name);
+ goto error;
+ }
+
+ lp->transcount += len;
+ isdn_net_inc_frame_cnt(lp);
+ return;
+
+ error:
+ dev_kfree_skb(skb);
+ lp->stats.tx_errors++;
+
}
+
/*
* Helper function for isdn_net_start_xmit.
* When called, the connection is already established.
@@ -1397,9 +1519,18 @@
*/
static int
-isdn_net_xmit(struct net_device *ndev, isdn_net_local * lp, struct sk_buff *skb)
+isdn_net_xmit(struct net_device *ndev, struct sk_buff *skb)
{
- int ret;
+ isdn_net_dev *nd;
+ isdn_net_local *slp;
+ isdn_net_local *lp = (isdn_net_local *) ndev->priv;
+ int retv = 0;
+
+ if (((isdn_net_local *) (ndev->priv))->master) {
+ printk("isdn BUG at %s:%d!\n", __FILE__, __LINE__);
+ dev_kfree_skb(skb);
+ return 0;
+ }
/* For the other encaps the header has already been built */
#ifdef CONFIG_ISDN_PPP
@@ -1407,31 +1538,27 @@
return isdn_ppp_xmit(skb, ndev);
}
#endif
+
+ nd = ((isdn_net_local *) ndev->priv)->netdev;
+
+ lp = isdn_net_get_locked_lp(nd);
+ if (!lp) {
+ printk(KERN_WARNING "%s: all channels busy - requeuing!\n", lp->name);
+ return 1;
+ }
+ /* we have our lp locked from now on */
+
/* Reset hangup-timeout */
- lp->huptimer = 0;
+ lp->huptimer = 0; // FIXME?
+ isdn_net_writebuf_skb(lp, skb);
+ spin_unlock_bh(&lp->xmit_lock);
+
+ /* the following stuff is here for backwards compatibility.
+ * in future, start-up and hangup of slaves (based on current load)
+ * should move to userspace and get based on an overall cps
+ * calculation
+ */
if (lp->cps > lp->triggercps) {
- /* Device overloaded */
-
- /*
- * Packet-delivery via round-robin over master
- * and all connected slaves.
- */
- if (lp->master)
- /* Slaves always deliver themselves */
- ret = isdn_net_send_skb(ndev, lp, skb);
- else {
- isdn_net_local *slp = (isdn_net_local *) (lp->srobin->priv);
- /* Master delivers via srobin and maintains srobin */
- if (lp->srobin == ndev)
- ret = isdn_net_send_skb(ndev, lp, skb);
- else
- ret = isdn_net_start_xmit(skb, lp->srobin);
- lp->srobin = (slp->slave) ? slp->slave : ndev;
- slp = (isdn_net_local *) (lp->srobin->priv);
- if (!((slp->flags & ISDN_NET_CONNECTED) && (slp->dialstate == 0)))
- lp->srobin = ndev;
- }
- /* Slave-startup using delay-variable */
if (lp->slave) {
if (!lp->sqfull) {
/* First time overload: set timestamp only */
@@ -1439,17 +1566,24 @@
lp->sqfull_stamp = jiffies;
} else {
/* subsequent overload: if slavedelay exceeded, start dialing */
- if ((jiffies - lp->sqfull_stamp) > lp->slavedelay)
- isdn_net_force_dial_lp((isdn_net_local *) lp->slave->priv);
+ if ((jiffies - lp->sqfull_stamp) > lp->slavedelay) {
+ slp = lp->slave->priv;
+ if (!(slp->flags & ISDN_NET_CONNECTED)) {
+ isdn_net_force_dial_lp((isdn_net_local *) lp->slave->priv);
+ }
+ }
}
}
} else {
- /* Not overloaded, deliver locally */
- ret = isdn_net_send_skb(ndev, lp, skb);
- if (lp->sqfull && ((jiffies - lp->sqfull_stamp) > (lp->slavedelay + (10 * HZ))))
+ if (lp->sqfull && ((jiffies - lp->sqfull_stamp) > (lp->slavedelay + (10 * HZ)))) {
lp->sqfull = 0;
+ }
+ /* this is a hack to allow auto-hangup for slaves on moderate loads */
+ nd->queue = nd->local;
}
- return ret;
+
+ return retv;
+
}
static void
@@ -1489,7 +1623,7 @@
* actually, this may not matter at all, because ISDN hardware
* should not see transmitter hangs at all IMO
* changed KERN_DEBUG to KERN_WARNING to find out if this is
- * ever called
+ * ever called --KG
*/
}
ndev->trans_start = jiffies;
@@ -1608,19 +1742,11 @@
return 1; /* let upper layer requeue skb packet */
}
#endif
- /* remember first skb to speed up arp
- * when using encap ETHER
- */
- if (lp->first_skb) {
- printk(KERN_WARNING "isdn_net_start_xmit: First skb already set!\n");
- dev_kfree_skb(lp->first_skb);
- lp->first_skb = NULL;
- }
- lp->first_skb = skb;
/* Initiate dialing */
restore_flags(flags);
isdn_net_dial();
- return 0;
+ isdn_net_device_stop_queue(lp);
+ return 1;
} else {
isdn_net_unreachable(ndev, skb,
"No phone number");
@@ -1633,14 +1759,7 @@
if (!lp->dialstate) {
/* ISDN connection is established, try sending */
int ret;
- if (lp->first_skb) {
- if (isdn_net_xmit(ndev, lp, lp->first_skb)){
- netif_stop_queue(ndev);
- return 1;
-}
- lp->first_skb = NULL;
- }
- ret = (isdn_net_xmit(ndev, lp, skb));
+ ret = (isdn_net_xmit(ndev, skb));
if(ret) netif_stop_queue(ndev);
return ret;
} else
@@ -1754,7 +1873,6 @@
unsigned short hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
struct sk_buff *skb = alloc_skb(hl + sizeof(cisco_hdr) + sizeof(cisco_slarp), GFP_ATOMIC);
unsigned long t = (jiffies / HZ * 1000000);
- int len;
cisco_hdr *ch;
cisco_slarp *s;
@@ -1782,9 +1900,7 @@
s->rel = 0xffff;
s->t1 = t >> 16;
s->t0 = t & 0xffff;
- len = skb->len;
- if (isdn_writebuf_skb_stub(lp->isdn_device, lp->isdn_channel, 0, skb) != len)
- dev_kfree_skb(skb);
+ isdn_net_write_super(lp, skb);
}
static void
@@ -2417,7 +2533,7 @@
* Is the interface up?
* If not, reject the call actively.
*/
- if (!isdn_net_started(p)) {
+ if (!isdn_net_device_started(p)) {
restore_flags(flags);
printk(KERN_INFO "%s: incoming call, interface down -> rejected\n",
lp->name);
@@ -2508,6 +2624,7 @@
if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
isdn_ppp_free(lp);
#endif
+ isdn_net_lp_disconnected(lp);
isdn_free_channel(lp->isdn_device, lp->isdn_channel,
ISDN_USAGE_NET);
}
@@ -2707,10 +2824,17 @@
netdev->ib.last = NULL;
#endif
netdev->queue = netdev->local;
+ spin_lock_init(&netdev->queue_lock);
+
netdev->local->last = netdev->local;
netdev->local->netdev = netdev;
netdev->local->next = netdev->local;
+ memset(&netdev->local->tqueue, 0, sizeof(struct tq_struct));
+ netdev->local->tqueue.routine = isdn_net_softint;
+ netdev->local->tqueue.data = netdev->local;
+ spin_lock_init(&netdev->local->xmit_lock);
+
netdev->local->isdn_device = -1;
netdev->local->isdn_channel = -1;
netdev->local->pre_device = -1;
@@ -2718,13 +2842,11 @@
netdev->local->exclusive = -1;
netdev->local->ppp_slot = -1;
netdev->local->pppbind = -1;
- netdev->local->sav_skb = NULL;
- netdev->local->first_skb = NULL;
+ skb_queue_head_init(&netdev->local->super_tx_queue);
netdev->local->l2_proto = ISDN_PROTO_L2_X75I;
netdev->local->l3_proto = ISDN_PROTO_L3_TRANS;
netdev->local->triggercps = 6000;
netdev->local->slavedelay = 10 * HZ;
- netdev->local->srobin = &netdev->dev;
netdev->local->hupflags = ISDN_INHUP; /* Do hangup even on incoming calls */
netdev->local->onhtime = 10; /* Default hangup-time for saving costs
of those who forget configuring this */
@@ -2762,7 +2884,7 @@
if (n->local->master)
return NULL;
/* Master must not be started yet */
- if (isdn_net_started(n))
+ if (isdn_net_device_started(n))
return NULL;
return (isdn_net_new(newname, &(n->dev)));
}
@@ -2805,7 +2927,7 @@
#ifdef CONFIG_ISDN_X25
struct concap_proto * cprot = p -> cprot;
#endif
- if (isdn_net_started(p)) {
+ if (isdn_net_device_started(p)) {
printk(KERN_WARNING "%s: cannot change encap when if is up\n",
lp->name);
return -EBUSY;
@@ -3066,8 +3188,6 @@
isdn_net_dev *p = isdn_net_findif(phone->name);
isdn_net_phone *n;
- if (isdn_net_checkwild(phone->phone) && (phone->outgoing & 1))
- return -EINVAL;
if (p) {
if (!(n = (isdn_net_phone *) kmalloc(sizeof(isdn_net_phone), GFP_KERNEL)))
return -ENOMEM;
@@ -3240,7 +3360,7 @@
save_flags(flags);
cli();
- if (isdn_net_started(p)) {
+ if (isdn_net_device_started(p)) {
restore_flags(flags);
return -EBUSY;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)