Skip to content

Commit 13c822f

Browse files
John Crispindavem330
authored andcommitted
net: mediatek: fix stop and wakeup of queue
The driver supports 2 MACs. Both run on the same DMA ring. If we go above/below the TX rings threshold value, we always need to wake/stop the queue of both devices. Not doing to can cause TX stalls and packet drops on one of the devices. Signed-off-by: John Crispin <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 13439ee commit 13c822f

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

drivers/net/ethernet/mediatek/mtk_eth_soc.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,28 @@ static inline int mtk_cal_txd_req(struct sk_buff *skb)
684684
return nfrags;
685685
}
686686

687+
static void mtk_wake_queue(struct mtk_eth *eth)
688+
{
689+
int i;
690+
691+
for (i = 0; i < MTK_MAC_COUNT; i++) {
692+
if (!eth->netdev[i])
693+
continue;
694+
netif_wake_queue(eth->netdev[i]);
695+
}
696+
}
697+
698+
static void mtk_stop_queue(struct mtk_eth *eth)
699+
{
700+
int i;
701+
702+
for (i = 0; i < MTK_MAC_COUNT; i++) {
703+
if (!eth->netdev[i])
704+
continue;
705+
netif_stop_queue(eth->netdev[i]);
706+
}
707+
}
708+
687709
static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
688710
{
689711
struct mtk_mac *mac = netdev_priv(dev);
@@ -695,7 +717,7 @@ static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
695717

696718
tx_num = mtk_cal_txd_req(skb);
697719
if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
698-
netif_stop_queue(dev);
720+
mtk_stop_queue(eth);
699721
netif_err(eth, tx_queued, dev,
700722
"Tx Ring full when queue awake!\n");
701723
return NETDEV_TX_BUSY;
@@ -720,10 +742,10 @@ static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
720742
goto drop;
721743

722744
if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) {
723-
netif_stop_queue(dev);
745+
mtk_stop_queue(eth);
724746
if (unlikely(atomic_read(&ring->free_count) >
725747
ring->thresh))
726-
netif_wake_queue(dev);
748+
mtk_wake_queue(eth);
727749
}
728750

729751
return NETDEV_TX_OK;
@@ -897,13 +919,8 @@ static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again)
897919
if (!total)
898920
return 0;
899921

900-
for (i = 0; i < MTK_MAC_COUNT; i++) {
901-
if (!eth->netdev[i] ||
902-
unlikely(!netif_queue_stopped(eth->netdev[i])))
903-
continue;
904-
if (atomic_read(&ring->free_count) > ring->thresh)
905-
netif_wake_queue(eth->netdev[i]);
906-
}
922+
if (atomic_read(&ring->free_count) > ring->thresh)
923+
mtk_wake_queue(eth);
907924

908925
return total;
909926
}

0 commit comments

Comments
 (0)