ibmvnic: Fix TX descriptor tracking
authorThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Thu, 22 Feb 2018 00:21:10 +0000 (18:21 -0600)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Feb 2018 19:45:59 +0000 (14:45 -0500)
With the recent change, transmissions that only needed
one descriptor were being missed. The result is that such
packets were tracked as outstanding transmissions but never
removed when its completion notification was received.

Fixes: ffc385b95adb ("ibmvnic: Keep track of supplementary TX descriptors")
Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ibm/ibmvnic.c

index 1703b881252f02b32459c3b350605ccba9df0904..4f7b38b6e2e05463329e50d692e1f74cb99a711e 100644 (file)
@@ -1478,7 +1478,6 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
        if ((*hdrs >> 7) & 1) {
                build_hdr_descs_arr(tx_buff, &num_entries, *hdrs);
                tx_crq.v1.n_crq_elem = num_entries;
        if ((*hdrs >> 7) & 1) {
                build_hdr_descs_arr(tx_buff, &num_entries, *hdrs);
                tx_crq.v1.n_crq_elem = num_entries;
-               tx_buff->num_entries = num_entries;
                tx_buff->indir_arr[0] = tx_crq;
                tx_buff->indir_dma = dma_map_single(dev, tx_buff->indir_arr,
                                                    sizeof(tx_buff->indir_arr),
                tx_buff->indir_arr[0] = tx_crq;
                tx_buff->indir_dma = dma_map_single(dev, tx_buff->indir_arr,
                                                    sizeof(tx_buff->indir_arr),
@@ -1533,6 +1532,7 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
                netif_stop_subqueue(netdev, queue_num);
        }
 
                netif_stop_subqueue(netdev, queue_num);
        }
 
+       tx_buff->num_entries = num_entries;
        tx_packets++;
        tx_bytes += skb->len;
        txq->trans_start = jiffies;
        tx_packets++;
        tx_bytes += skb->len;
        txq->trans_start = jiffies;