@@ -1223,12 +1223,13 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
1223
1223
{
1224
1224
struct macb * bp = queue -> bp ;
1225
1225
u16 queue_index = queue - bp -> queues ;
1226
+ unsigned long flags ;
1226
1227
unsigned int tail ;
1227
1228
unsigned int head ;
1228
1229
int packets = 0 ;
1229
1230
u32 bytes = 0 ;
1230
1231
1231
- spin_lock (& queue -> tx_ptr_lock );
1232
+ spin_lock_irqsave (& queue -> tx_ptr_lock , flags );
1232
1233
head = queue -> tx_head ;
1233
1234
for (tail = queue -> tx_tail ; tail != head && packets < budget ; tail ++ ) {
1234
1235
struct macb_tx_skb * tx_skb ;
@@ -1291,7 +1292,7 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
1291
1292
CIRC_CNT (queue -> tx_head , queue -> tx_tail ,
1292
1293
bp -> tx_ring_size ) <= MACB_TX_WAKEUP_THRESH (bp ))
1293
1294
netif_wake_subqueue (bp -> dev , queue_index );
1294
- spin_unlock (& queue -> tx_ptr_lock );
1295
+ spin_unlock_irqrestore (& queue -> tx_ptr_lock , flags );
1295
1296
1296
1297
return packets ;
1297
1298
}
@@ -1707,8 +1708,9 @@ static void macb_tx_restart(struct macb_queue *queue)
1707
1708
{
1708
1709
struct macb * bp = queue -> bp ;
1709
1710
unsigned int head_idx , tbqp ;
1711
+ unsigned long flags ;
1710
1712
1711
- spin_lock (& queue -> tx_ptr_lock );
1713
+ spin_lock_irqsave (& queue -> tx_ptr_lock , flags );
1712
1714
1713
1715
if (queue -> tx_head == queue -> tx_tail )
1714
1716
goto out_tx_ptr_unlock ;
@@ -1720,27 +1722,28 @@ static void macb_tx_restart(struct macb_queue *queue)
1720
1722
if (tbqp == head_idx )
1721
1723
goto out_tx_ptr_unlock ;
1722
1724
1723
- spin_lock_irq (& bp -> lock );
1725
+ spin_lock (& bp -> lock );
1724
1726
macb_writel (bp , NCR , macb_readl (bp , NCR ) | MACB_BIT (TSTART ));
1725
- spin_unlock_irq (& bp -> lock );
1727
+ spin_unlock (& bp -> lock );
1726
1728
1727
1729
out_tx_ptr_unlock :
1728
- spin_unlock (& queue -> tx_ptr_lock );
1730
+ spin_unlock_irqrestore (& queue -> tx_ptr_lock , flags );
1729
1731
}
1730
1732
1731
1733
static bool macb_tx_complete_pending (struct macb_queue * queue )
1732
1734
{
1733
1735
bool retval = false;
1736
+ unsigned long flags ;
1734
1737
1735
- spin_lock (& queue -> tx_ptr_lock );
1738
+ spin_lock_irqsave (& queue -> tx_ptr_lock , flags );
1736
1739
if (queue -> tx_head != queue -> tx_tail ) {
1737
1740
/* Make hw descriptor updates visible to CPU */
1738
1741
rmb ();
1739
1742
1740
1743
if (macb_tx_desc (queue , queue -> tx_tail )-> ctrl & MACB_BIT (TX_USED ))
1741
1744
retval = true;
1742
1745
}
1743
- spin_unlock (& queue -> tx_ptr_lock );
1746
+ spin_unlock_irqrestore (& queue -> tx_ptr_lock , flags );
1744
1747
return retval ;
1745
1748
}
1746
1749
@@ -2308,6 +2311,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
2308
2311
struct macb_queue * queue = & bp -> queues [queue_index ];
2309
2312
unsigned int desc_cnt , nr_frags , frag_size , f ;
2310
2313
unsigned int hdrlen ;
2314
+ unsigned long flags ;
2311
2315
bool is_lso ;
2312
2316
netdev_tx_t ret = NETDEV_TX_OK ;
2313
2317
@@ -2368,7 +2372,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
2368
2372
desc_cnt += DIV_ROUND_UP (frag_size , bp -> max_tx_length );
2369
2373
}
2370
2374
2371
- spin_lock_bh (& queue -> tx_ptr_lock );
2375
+ spin_lock_irqsave (& queue -> tx_ptr_lock , flags );
2372
2376
2373
2377
/* This is a hard error, log it. */
2374
2378
if (CIRC_SPACE (queue -> tx_head , queue -> tx_tail ,
@@ -2392,15 +2396,15 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
2392
2396
netdev_tx_sent_queue (netdev_get_tx_queue (bp -> dev , queue_index ),
2393
2397
skb -> len );
2394
2398
2395
- spin_lock_irq (& bp -> lock );
2399
+ spin_lock (& bp -> lock );
2396
2400
macb_writel (bp , NCR , macb_readl (bp , NCR ) | MACB_BIT (TSTART ));
2397
- spin_unlock_irq (& bp -> lock );
2401
+ spin_unlock (& bp -> lock );
2398
2402
2399
2403
if (CIRC_SPACE (queue -> tx_head , queue -> tx_tail , bp -> tx_ring_size ) < 1 )
2400
2404
netif_stop_subqueue (dev , queue_index );
2401
2405
2402
2406
unlock :
2403
- spin_unlock_bh (& queue -> tx_ptr_lock );
2407
+ spin_unlock_irqrestore (& queue -> tx_ptr_lock , flags );
2404
2408
2405
2409
return ret ;
2406
2410
}
0 commit comments