|
@@ -1218,6 +1218,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|
|
struct rhine_private *rp = netdev_priv(dev);
|
|
|
void __iomem *ioaddr = rp->base;
|
|
|
unsigned entry;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
/* Caution: the write order is important here, set the field
|
|
|
with the "ownership" bits last. */
|
|
@@ -1261,7 +1262,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|
|
cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
|
|
|
|
|
|
/* lock eth irq */
|
|
|
- spin_lock_irq(&rp->lock);
|
|
|
+ spin_lock_irqsave(&rp->lock, flags);
|
|
|
wmb();
|
|
|
rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn);
|
|
|
wmb();
|
|
@@ -1280,7 +1281,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
dev->trans_start = jiffies;
|
|
|
|
|
|
- spin_unlock_irq(&rp->lock);
|
|
|
+ spin_unlock_irqrestore(&rp->lock, flags);
|
|
|
|
|
|
if (debug > 4) {
|
|
|
printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n",
|