Update error handling code in ibmvnic_xmit to be more readable
and remove unused statistics counters. Also record statistics
when TX completions are received to improve accuracy.

Signed-off-by: Thomas Falcon <tlfal...@linux.ibm.com>
---
 drivers/net/ethernet/ibm/ibmvnic.c | 38 ++++++++++--------------------
 drivers/net/ethernet/ibm/ibmvnic.h |  2 --
 2 files changed, 13 insertions(+), 27 deletions(-)

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c 
b/drivers/net/ethernet/ibm/ibmvnic.c
index b523da20bffc..2c24d4774457 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1535,13 +1535,9 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, 
struct net_device *netdev)
        struct ibmvnic_tx_buff *tx_buff = NULL;
        struct ibmvnic_sub_crq_queue *tx_scrq;
        struct ibmvnic_tx_pool *tx_pool;
-       unsigned int tx_send_failed = 0;
        netdev_tx_t ret = NETDEV_TX_OK;
-       unsigned int tx_map_failed = 0;
        union sub_crq indir_arr[16];
        unsigned int tx_dropped = 0;
-       unsigned int tx_packets = 0;
-       unsigned int tx_bytes = 0;
        dma_addr_t data_dma_addr;
        struct netdev_queue *txq;
        unsigned long lpar_rc;
@@ -1558,18 +1554,13 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, 
struct net_device *netdev)
                if (!netif_subqueue_stopped(netdev, skb))
                        netif_stop_subqueue(netdev, queue_num);
                dev_kfree_skb_any(skb);
-
-               tx_send_failed++;
                tx_dropped++;
-               ret = NETDEV_TX_OK;
-               goto out;
+               goto err_out;
        }
 
        if (ibmvnic_xmit_workarounds(skb, netdev)) {
                tx_dropped++;
-               tx_send_failed++;
-               ret = NETDEV_TX_OK;
-               goto out;
+               goto err_out;
        }
        if (skb_is_gso(skb))
                tx_pool = &adapter->tso_pool[queue_num];
@@ -1584,10 +1575,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, 
struct net_device *netdev)
 
        if (index == IBMVNIC_INVALID_MAP) {
                dev_kfree_skb_any(skb);
-               tx_send_failed++;
                tx_dropped++;
-               ret = NETDEV_TX_OK;
-               goto out;
+               goto err_out;
        }
 
        tx_pool->free_map[tx_pool->consumer_index] = IBMVNIC_INVALID_MAP;
@@ -1707,12 +1696,9 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, 
struct net_device *netdev)
                netif_stop_subqueue(netdev, queue_num);
        }
 
-       tx_packets++;
-       tx_bytes += skb->len;
        txq->trans_start = jiffies;
-       ret = NETDEV_TX_OK;
-       goto out;
 
+       return ret;
 tx_flush_err:
        dev_kfree_skb_any(skb);
        tx_buff->skb = NULL;
@@ -1758,14 +1744,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, 
struct net_device *netdev)
                netif_tx_stop_all_queues(netdev);
                netif_carrier_off(netdev);
        }
-out:
+err_out:
        netdev->stats.tx_dropped += tx_dropped;
-       netdev->stats.tx_bytes += tx_bytes;
-       netdev->stats.tx_packets += tx_packets;
-       adapter->tx_send_failed += tx_send_failed;
-       adapter->tx_map_failed += tx_map_failed;
-       adapter->tx_stats_buffers[queue_num].packets += tx_packets;
-       adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
        adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;
 
        return ret;
@@ -3147,6 +3127,7 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter 
*adapter,
                int num_entries = 0;
                int total_bytes = 0;
                int num_packets = 0;
+               int tx_dropped = 0;
 
                next = ibmvnic_next_scrq(adapter, scrq);
                /* ensure that we are reading the correct queue entry */
@@ -3157,6 +3138,7 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter 
*adapter,
                        if (next->tx_comp.rcs[i]) {
                                dev_err(dev, "tx error %x\n",
                                        next->tx_comp.rcs[i]);
+                               tx_dropped++;
                                error = true;
                        }
                        index = be32_to_cpu(next->tx_comp.correlators[i]);
@@ -3200,6 +3182,12 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter 
*adapter,
                        netdev_dbg(adapter->netdev, "Started queue %d\n",
                                   scrq->pool_index);
                }
+               adapter->netdev->stats.tx_packets += num_packets;
+               adapter->netdev->stats.tx_bytes += total_bytes;
+               adapter->netdev->stats.tx_dropped += tx_dropped;
+               adapter->tx_stats_buffers[scrq->pool_index].packets += 
num_packets;
+               adapter->tx_stats_buffers[scrq->pool_index].bytes += 
total_bytes;
+               adapter->tx_stats_buffers[scrq->pool_index].dropped_packets += 
tx_dropped;
        }
 
        enable_scrq_irq(adapter, scrq);
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h 
b/drivers/net/ethernet/ibm/ibmvnic.h
index 11af1f29210b..c6f1842d2023 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -992,8 +992,6 @@ struct ibmvnic_adapter {
        int replenish_add_buff_success;
        int replenish_add_buff_failure;
        int replenish_task_cycles;
-       int tx_send_failed;
-       int tx_map_failed;
 
        struct ibmvnic_tx_queue_stats *tx_stats_buffers;
        struct ibmvnic_rx_queue_stats *rx_stats_buffers;
-- 
2.26.2

Reply via email to