|
@@ -1524,6 +1524,7 @@ static void net_timeout(struct net_device *dev)
|
|
static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|
static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
{
|
|
struct net_local *lp = netdev_priv(dev);
|
|
struct net_local *lp = netdev_priv(dev);
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
if (net_debug > 3) {
|
|
if (net_debug > 3) {
|
|
printk("%s: sent %d byte packet of type %x\n",
|
|
printk("%s: sent %d byte packet of type %x\n",
|
|
@@ -1535,7 +1536,7 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|
ask the chip to start transmitting before the
|
|
ask the chip to start transmitting before the
|
|
whole packet has been completely uploaded. */
|
|
whole packet has been completely uploaded. */
|
|
|
|
|
|
- spin_lock_irq(&lp->lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&lp->lock, flags);
|
|
netif_stop_queue(dev);
|
|
netif_stop_queue(dev);
|
|
|
|
|
|
/* initiate a transmit sequence */
|
|
/* initiate a transmit sequence */
|
|
@@ -1549,13 +1550,13 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|
* we're waiting for TxOk, so return 1 and requeue this packet.
|
|
* we're waiting for TxOk, so return 1 and requeue this packet.
|
|
*/
|
|
*/
|
|
|
|
|
|
- spin_unlock_irq(&lp->lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&lp->lock, flags);
|
|
if (net_debug) printk("cs89x0: Tx buffer not free!\n");
|
|
if (net_debug) printk("cs89x0: Tx buffer not free!\n");
|
|
return NETDEV_TX_BUSY;
|
|
return NETDEV_TX_BUSY;
|
|
}
|
|
}
|
|
/* Write the contents of the packet */
|
|
/* Write the contents of the packet */
|
|
writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
|
|
writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
|
|
- spin_unlock_irq(&lp->lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&lp->lock, flags);
|
|
lp->stats.tx_bytes += skb->len;
|
|
lp->stats.tx_bytes += skb->len;
|
|
dev->trans_start = jiffies;
|
|
dev->trans_start = jiffies;
|
|
dev_kfree_skb (skb);
|
|
dev_kfree_skb (skb);
|