net: mhi: Improve MBIM packet counting
authorRichard Laing <richard.laing@alliedtelesis.co.nz>
Mon, 26 Jul 2021 05:30:03 +0000 (17:30 +1200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Jul 2021 11:21:00 +0000 (12:21 +0100)
Packets are aggregated over the MBIM link and currently the MHI net
device will count each aggregated packet rather then the actual
packets themselves.

If a protocol handler module is specified, use that to count the
packets rather than directly in the MHI net device. This is in line
with the behaviour of the USB net cdc_mbim driver.

Signed-off-by: Richard Laing <richard.laing@alliedtelesis.co.nz>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mhi/net.c
drivers/net/mhi/proto_mbim.c

index a5a2aa19bb91809c5649b0e39754d503e11a7753..0cc7dcd0ff96cf4de17547ca03bdd749505af906 100644 (file)
@@ -205,11 +205,6 @@ static void mhi_net_dl_callback(struct mhi_device *mhi_dev,
                        mhi_netdev->skbagg_head = NULL;
                }
 
-               u64_stats_update_begin(&mhi_netdev->stats.rx_syncp);
-               u64_stats_inc(&mhi_netdev->stats.rx_packets);
-               u64_stats_add(&mhi_netdev->stats.rx_bytes, skb->len);
-               u64_stats_update_end(&mhi_netdev->stats.rx_syncp);
-
                switch (skb->data[0] & 0xf0) {
                case 0x40:
                        skb->protocol = htons(ETH_P_IP);
@@ -222,10 +217,15 @@ static void mhi_net_dl_callback(struct mhi_device *mhi_dev,
                        break;
                }
 
-               if (proto && proto->rx)
+               if (proto && proto->rx) {
                        proto->rx(mhi_netdev, skb);
-               else
+               } else {
+                       u64_stats_update_begin(&mhi_netdev->stats.rx_syncp);
+                       u64_stats_inc(&mhi_netdev->stats.rx_packets);
+                       u64_stats_add(&mhi_netdev->stats.rx_bytes, skb->len);
+                       u64_stats_update_end(&mhi_netdev->stats.rx_syncp);
                        netif_rx(skb);
+               }
        }
 
        /* Refill if RX buffers queue becomes low */
index f1cc7f35bb85898818809316a15f30be242c3c5e..761d90b28ee625b3cc4791db46cf42baeb573ed2 100644 (file)
@@ -211,6 +211,10 @@ static void mbim_rx(struct mhi_net_dev *mhi_netdev, struct sk_buff *skb)
                                continue;
                        }
 
+                       u64_stats_update_begin(&mhi_netdev->stats.rx_syncp);
+                       u64_stats_inc(&mhi_netdev->stats.rx_packets);
+                       u64_stats_add(&mhi_netdev->stats.rx_bytes, skbn->len);
+                       u64_stats_update_end(&mhi_netdev->stats.rx_syncp);
                        netif_rx(skbn);
                }
 next_ndp: