From: Jon Mason <jon.mason@intel.com>
To: Stephen Hemminger <shemminger@vyatta.com>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-pci@vger.kernel.org, Dave Jiang <dave.jiang@intel.com>
Subject: Re: [RFC 2/2] net: Add support for NTB virtual ethernet device
Date: Fri, 13 Jul 2012 22:55:09 -0700 [thread overview]
Message-ID: <20120714055508.GC4808@jonmason-lab> (raw)
In-Reply-To: <20120713170826.09210b80@nehalam.linuxnetplumber.net>
On Fri, Jul 13, 2012 at 05:08:26PM -0700, Stephen Hemminger wrote:
> On Fri, 13 Jul 2012 14:45:00 -0700
> Jon Mason <jon.mason@intel.com> wrote:
>
> > A virtual ethernet device that uses the NTB transport API to send/receive data.
> >
> > Signed-off-by: Jon Mason <jon.mason@intel.com>
> > ---
> > drivers/net/Kconfig | 4 +
> > drivers/net/Makefile | 1 +
> > drivers/net/ntb_netdev.c | 411 ++++++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 416 insertions(+), 0 deletions(-)
> > create mode 100644 drivers/net/ntb_netdev.c
>
>
> > +static void ntb_get_drvinfo(__attribute__((unused)) struct net_device *dev,
> > + struct ethtool_drvinfo *info)
> > +{
> > + strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
> > + strlcpy(info->version, NTB_NETDEV_VER, sizeof(info->version));
> > +}
> > +
> > +static const char ntb_nic_stats[][ETH_GSTRING_LEN] = {
> > + "rx_packets", "rx_bytes", "rx_errors", "rx_dropped", "rx_length_errors",
> > + "rx_frame_errors", "rx_fifo_errors",
> > + "tx_packets", "tx_bytes", "tx_errors", "tx_dropped",
> > +};
> > +
> > +static int ntb_get_stats_count(__attribute__((unused)) struct net_device *dev)
> > +{
> > + return ARRAY_SIZE(ntb_nic_stats);
> > +}
> > +
> > +static int ntb_get_sset_count(struct net_device *dev, int sset)
> > +{
> > + switch (sset) {
> > + case ETH_SS_STATS:
> > + return ntb_get_stats_count(dev);
> > + default:
> > + return -EOPNOTSUPP;
> > + }
> > +}
> > +
> > +static void ntb_get_strings(__attribute__((unused)) struct net_device *dev,
> > + u32 sset, u8 *data)
> > +{
> > + switch (sset) {
> > + case ETH_SS_STATS:
> > + memcpy(data, *ntb_nic_stats, sizeof(ntb_nic_stats));
> > + }
> > +}
> > +
> > +static void
> > +ntb_get_ethtool_stats(struct net_device *dev,
> > + __attribute__((unused)) struct ethtool_stats *stats,
> > + u64 *data)
> > +{
> > + int i = 0;
> > +
> > + data[i++] = dev->stats.rx_packets;
> > + data[i++] = dev->stats.rx_bytes;
> > + data[i++] = dev->stats.rx_errors;
> > + data[i++] = dev->stats.rx_dropped;
> > + data[i++] = dev->stats.rx_length_errors;
> > + data[i++] = dev->stats.rx_frame_errors;
> > + data[i++] = dev->stats.rx_fifo_errors;
> > + data[i++] = dev->stats.tx_packets;
> > + data[i++] = dev->stats.tx_bytes;
> > + data[i++] = dev->stats.tx_errors;
> > + data[i++] = dev->stats.tx_dropped;
> > +}
>
> These statistics add no value over existing network stats.
> Don't implement ethtool stats unless device has something more
> interesting to say.
Fair enough
>
> > +static const struct ethtool_ops ntb_ethtool_ops = {
> > + .get_drvinfo = ntb_get_drvinfo,
> > + .get_sset_count = ntb_get_sset_count,
> > + .get_strings = ntb_get_strings,
> > + .get_ethtool_stats = ntb_get_ethtool_stats,
> > + .get_link = ethtool_op_get_link,
> > +};
>
> If you want to implement bonding or bridging then implementing
> get_settings would help.
Will do.
> > +static int __init ntb_netdev_init_module(void)
> > +{
> > + struct ntb_netdev *dev;
> > + int rc;
> > +
> > + pr_info("%s: Probe\n", KBUILD_MODNAME);
>
> Useless message
True, will remove.
Thanks for the comments!
> > + netdev = alloc_etherdev(sizeof(struct ntb_netdev));
> > + if (!netdev)
> > + return -ENOMEM;
> > +
> > + dev = netdev_priv(netdev);
> > + dev->ndev = netdev;
> > + netdev->features = NETIF_F_HIGHDMA;
> > +
> > + netdev->hw_features = netdev->features;
> > + netdev->watchdog_timeo = msecs_to_jiffies(NTB_TX_TIMEOUT_MS);
> > +
> > + random_ether_addr(netdev->perm_addr);
> > + memcpy(netdev->dev_addr, netdev->perm_addr, netdev->addr_len);
> > +
> > + netdev->netdev_ops = &ntb_netdev_ops;
> > + SET_ETHTOOL_OPS(netdev, &ntb_ethtool_ops);
> > +
> > + dev->qp = ntb_transport_create_queue(ntb_netdev_rx_handler,
> > + ntb_netdev_tx_handler,
> > + ntb_netdev_event_handler);
> > + if (!dev->qp) {
> > + rc = -EIO;
> > + goto err;
> > + }
> > +
> > + netdev->mtu = ntb_transport_max_size(dev->qp) - ETH_HLEN;
> > +
> > + rc = register_netdev(netdev);
> > + if (rc)
> > + goto err1;
> > +
> > + pr_info("%s: %s created\n", KBUILD_MODNAME, netdev->name);
> > + return 0;
> > +
> > +err1:
> > + ntb_transport_free_queue(dev->qp);
> > +err:
> > + free_netdev(netdev);
> > + return rc;
> > +}
> > +module_init(ntb_netdev_init_module);
> > +
> > +static void __exit ntb_netdev_exit_module(void)
> > +{
> > + struct ntb_netdev *dev = netdev_priv(netdev);
> > +
> > + unregister_netdev(netdev);
> > + ntb_transport_free_queue(dev->qp);
> > + free_netdev(netdev);
> > +
> > + pr_info("%s: Driver removed\n", KBUILD_MODNAME);
> > +}
> > +module_exit(ntb_netdev_exit_module);
>
next prev parent reply other threads:[~2012-07-14 5:55 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-13 21:44 [RFC 1/2] PCI-Express Non-Transparent Bridge Support Jon Mason
2012-07-13 21:45 ` [RFC 2/2] net: Add support for NTB virtual ethernet device Jon Mason
2012-07-13 23:14 ` Jiri Pirko
2012-07-14 5:50 ` Jon Mason
2012-07-14 8:30 ` Jiri Pirko
2012-07-14 0:08 ` Stephen Hemminger
2012-07-14 5:55 ` Jon Mason [this message]
2012-07-14 0:00 ` [RFC 1/2] PCI-Express Non-Transparent Bridge Support Stephen Hemminger
2012-07-14 0:13 ` Stephen Hemminger
2012-07-14 6:19 ` Jon Mason
2012-07-15 12:37 ` David Hagood
2012-07-14 17:04 ` Greg KH
2012-07-15 23:50 ` Jon Mason
2012-07-15 23:53 ` Greg KH
2012-07-14 17:10 ` Greg KH
2012-07-15 23:55 ` Jon Mason
2012-07-16 0:19 ` Greg KH
2012-07-16 17:55 ` Jon Mason
2012-07-16 18:30 ` Greg KH
2012-07-16 16:49 ` chetan loke
2012-07-16 18:38 ` Jon Mason
2012-07-16 19:27 ` chetan loke
2012-07-17 0:23 ` Jon Mason
2012-07-16 18:26 ` chetan loke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120714055508.GC4808@jonmason-lab \
--to=jon.mason@intel.com \
--cc=dave.jiang@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.