|
@@ -3344,6 +3344,7 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
|
|
|
pkt_cnt = 0;
|
|
|
count = 0;
|
|
|
length = 0;
|
|
|
+ spin_lock_irqsave(&tqp->lock, flags);
|
|
|
for (skb = tqp->next; pkt_cnt < tqp->qlen; skb = skb->next) {
|
|
|
if (skb_is_gso(skb)) {
|
|
|
if (pkt_cnt) {
|
|
@@ -3352,7 +3353,8 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
|
|
|
}
|
|
|
count = 1;
|
|
|
length = skb->len - TX_OVERHEAD;
|
|
|
- skb2 = skb_dequeue(tqp);
|
|
|
+ __skb_unlink(skb, tqp);
|
|
|
+ spin_unlock_irqrestore(&tqp->lock, flags);
|
|
|
goto gso_skb;
|
|
|
}
|
|
|
|
|
@@ -3361,6 +3363,7 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
|
|
|
skb_totallen = skb->len + roundup(skb_totallen, sizeof(u32));
|
|
|
pkt_cnt++;
|
|
|
}
|
|
|
+ spin_unlock_irqrestore(&tqp->lock, flags);
|
|
|
|
|
|
/* copy to a single skb */
|
|
|
skb = alloc_skb(skb_totallen, GFP_ATOMIC);
|