|
|
@@ -614,6 +614,10 @@ static void axienet_start_xmit_done(struct net_device *ndev)
|
|
|
|
|
|
ndev->stats.tx_packets += packets;
|
|
|
ndev->stats.tx_bytes += size;
|
|
|
+
|
|
|
+ /* Matches barrier in axienet_start_xmit */
|
|
|
+ smp_mb();
|
|
|
+
|
|
|
netif_wake_queue(ndev);
|
|
|
}
|
|
|
|
|
|
@@ -668,9 +672,19 @@ static int axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|
|
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
|
|
|
|
|
|
if (axienet_check_tx_bd_space(lp, num_frag)) {
|
|
|
- if (!netif_queue_stopped(ndev))
|
|
|
- netif_stop_queue(ndev);
|
|
|
- return NETDEV_TX_BUSY;
|
|
|
+ if (netif_queue_stopped(ndev))
|
|
|
+ return NETDEV_TX_BUSY;
|
|
|
+
|
|
|
+ netif_stop_queue(ndev);
|
|
|
+
|
|
|
+ /* Matches barrier in axienet_start_xmit_done */
|
|
|
+ smp_mb();
|
|
|
+
|
|
|
+ /* Space might have just been freed - check again */
|
|
|
+ if (axienet_check_tx_bd_space(lp, num_frag))
|
|
|
+ return NETDEV_TX_BUSY;
|
|
|
+
|
|
|
+ netif_wake_queue(ndev);
|
|
|
}
|
|
|
|
|
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|