diff options
author | Shawn Joo(Seongho) <sjoo@nvidia.com> | 2012-03-10 16:57:37 +0900 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-03-23 13:58:18 -0700 |
commit | 68f6dde487f5cd0246386ed93c1e2eda3ab7bc0e (patch) | |
tree | d5f78d40904a0c276d82b342557d5f8c59ea4593 /drivers/net | |
parent | 11f2194618140f7a6628554f732e3a7f82a20dfb (diff) |
net: usb: raw-ip: rx / tx statistics
Add rx, tx, error statistics feature
Bug 932703
Change-Id: Ic7a6232dd3b48feff2b064fcff8f0d146b1e9902
Signed-off-by: Shawn Joo <sjoo@nvidia.com>
Reviewed-on: http://git-master/r/89305
Tested-by: Gerrit_Virtual_Submit
Reviewed-by: Steve Lin <stlin@nvidia.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/usb/raw_ip_net.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/net/usb/raw_ip_net.c b/drivers/net/usb/raw_ip_net.c index 958e831df655..35b696966479 100644 --- a/drivers/net/usb/raw_ip_net.c +++ b/drivers/net/usb/raw_ip_net.c @@ -68,6 +68,7 @@ MODULE_PARM_DESC(usb_net_raw_ip_tx_debug, "usb net (raw-ip) - tx debug"); struct baseband_usb { int baseband_index; + struct net_device_stats stats; struct { struct usb_driver *driver; struct usb_device *device; @@ -488,18 +489,34 @@ static netdev_tx_t baseband_usb_netdev_start_xmit( err = usb_net_raw_ip_tx_urb_submit(usb, skb); if (err < 0) { pr_err("tx urb submit error\n"); + usb->stats.tx_errors++; return NETDEV_TX_BUSY; } return NETDEV_TX_OK; } +static struct net_device_stats *baseband_usb_netdev_get_stats( + struct net_device *dev) +{ + int i; + for (i = 0; i < max_intfs; i++) { + if (dev == usb_net_raw_ip_dev[i]) { + pr_debug("%s idx(%d)\n", __func__, i); + return &baseband_usb_net[i]->stats; + } + } + pr_debug("%s mismatch dev, default idx(0)\n", __func__); + return &baseband_usb_net[0]->stats; +} + static struct net_device_ops usb_net_raw_ip_ops = { .ndo_init = baseband_usb_netdev_init, .ndo_uninit = baseband_usb_netdev_uninit, .ndo_open = baseband_usb_netdev_open, .ndo_stop = baseband_usb_netdev_stop, .ndo_start_xmit = baseband_usb_netdev_start_xmit, + .ndo_get_stats = baseband_usb_netdev_get_stats, }; static int usb_net_raw_ip_rx_urb_submit(struct baseband_usb *usb) @@ -629,6 +646,11 @@ static void usb_net_raw_ip_rx_urb_comp(struct urb *urb) pr_err("usb_net_raw_ip_rx_urb_comp_work - " "netif_rx(%p) failed\n", skb); kfree_skb(skb); + usb->stats.rx_errors++; + } else { + usb->stats.rx_packets++; + usb->stats.rx_bytes += + (14 + urb->actual_length); } } else { pr_err("usb_net_raw_ip_rx_urb_comp_work - " @@ -812,6 +834,7 @@ static void usb_net_raw_ip_tx_urb_work(struct work_struct *work) urb->transfer_buffer = (void *) 0; } usb_free_urb(urb); + usb->stats.tx_errors++; continue; } /* submit tx urb */ @@ -867,7 +890,12 @@ static void usb_net_raw_ip_tx_urb_comp(struct urb *urb) __func__, urb, urb->status); break; } - + if (urb->status) + usb->stats.tx_errors++; + else { + usb->stats.tx_packets++; + usb->stats.tx_bytes += urb->transfer_buffer_length; + } /* autosuspend after tx completed */ if (!usb->usb.interface) { pr_err("%s: usb interface disconnected" |