|
@@ -895,6 +895,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
struct lance_private *lp = netdev_priv(dev);
|
|
struct lance_private *lp = netdev_priv(dev);
|
|
|
volatile struct lance_regs *ll = lp->ll;
|
|
volatile struct lance_regs *ll = lp->ll;
|
|
|
volatile u16 *ib = (volatile u16 *)dev->mem_start;
|
|
volatile u16 *ib = (volatile u16 *)dev->mem_start;
|
|
|
|
|
+ unsigned long flags;
|
|
|
int entry, len;
|
|
int entry, len;
|
|
|
|
|
|
|
|
len = skb->len;
|
|
len = skb->len;
|
|
@@ -907,6 +908,8 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
|
|
dev->stats.tx_bytes += len;
|
|
dev->stats.tx_bytes += len;
|
|
|
|
|
|
|
|
|
|
+ spin_lock_irqsave(&lp->lock, flags);
|
|
|
|
|
+
|
|
|
entry = lp->tx_new;
|
|
entry = lp->tx_new;
|
|
|
*lib_ptr(ib, btx_ring[entry].length, lp->type) = (-len);
|
|
*lib_ptr(ib, btx_ring[entry].length, lp->type) = (-len);
|
|
|
*lib_ptr(ib, btx_ring[entry].misc, lp->type) = 0;
|
|
*lib_ptr(ib, btx_ring[entry].misc, lp->type) = 0;
|
|
@@ -925,6 +928,8 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
/* Kick the lance: transmit now */
|
|
/* Kick the lance: transmit now */
|
|
|
writereg(&ll->rdp, LE_C0_INEA | LE_C0_TDMD);
|
|
writereg(&ll->rdp, LE_C0_INEA | LE_C0_TDMD);
|
|
|
|
|
|
|
|
|
|
+ spin_unlock_irqrestore(&lp->lock, flags);
|
|
|
|
|
+
|
|
|
dev->trans_start = jiffies;
|
|
dev->trans_start = jiffies;
|
|
|
dev_kfree_skb(skb);
|
|
dev_kfree_skb(skb);
|
|
|
|
|
|