--- old/net/atm/clip.c Wed Apr 5 11:55:22 2000 +++ new/net/atm/clip.c Wed Apr 5 11:55:31 2000 @@ -232,17 +232,18 @@ { struct clip_vcc *clip_vcc = CLIP_VCC(vcc); int old; + unsigned long flags; DPRINTK("clip_pop(vcc %p)\n",vcc); clip_vcc->old_pop(vcc,skb); /* skb->dev == NULL in outbound ARP packets */ if (!skb->dev) return; - spin_lock(&PRIV(skb->dev)->xoff_lock); + spin_lock_irqsave(&PRIV(skb->dev)->xoff_lock, flags); if (atm_may_send(vcc,0)) { old = xchg(&clip_vcc->xoff,0); if (old) netif_wake_queue(skb->dev); } - spin_unlock(&PRIV(skb->dev)->xoff_lock); + spin_unlock_irqrestore(&PRIV(skb->dev)->xoff_lock, flags); } @@ -376,6 +377,7 @@ struct atmarp_entry *entry; struct atm_vcc *vcc; int old; + unsigned long flags; DPRINTK("clip_start_xmit (skb %p)\n",skb); if (!skb->dst) { @@ -438,7 +440,7 @@ return 0; } if (old) return 0; - spin_lock(&clip_priv->xoff_lock); + spin_lock_irqsave(&clip_priv->xoff_lock, flags); netif_stop_queue(dev); /* XOFF -> throttle immediately */ barrier(); if (!entry->vccs->xoff) @@ -447,7 +449,7 @@ good enough, because nothing should really be asleep because of the brief netif_stop_queue. If this isn't true or if it changes, use netif_wake_queue instead. */ - spin_unlock(&clip_priv->xoff_lock); + spin_unlock_irqrestore(&clip_priv->xoff_lock, flags); return 0; }