linux/drivers/net/ntb_netdev.c
<<
>>
Prefs
   1/*
   2 * This file is provided under a dual BSD/GPLv2 license.  When using or
   3 *   redistributing this file, you may do so under either license.
   4 *
   5 *   GPL LICENSE SUMMARY
   6 *
   7 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
   8 *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
   9 *
  10 *   This program is free software; you can redistribute it and/or modify
  11 *   it under the terms of version 2 of the GNU General Public License as
  12 *   published by the Free Software Foundation.
  13 *
  14 *   BSD LICENSE
  15 *
  16 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
  17 *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
  18 *
  19 *   Redistribution and use in source and binary forms, with or without
  20 *   modification, are permitted provided that the following conditions
  21 *   are met:
  22 *
  23 *     * Redistributions of source code must retain the above copyright
  24 *       notice, this list of conditions and the following disclaimer.
  25 *     * Redistributions in binary form must reproduce the above copy
  26 *       notice, this list of conditions and the following disclaimer in
  27 *       the documentation and/or other materials provided with the
  28 *       distribution.
  29 *     * Neither the name of Intel Corporation nor the names of its
  30 *       contributors may be used to endorse or promote products derived
  31 *       from this software without specific prior written permission.
  32 *
  33 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  34 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  35 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  36 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  37 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  38 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  39 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  40 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  41 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  42 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  43 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  44 *
  45 * PCIe NTB Network Linux driver
  46 *
  47 * Contact Information:
  48 * Jon Mason <jon.mason@intel.com>
  49 */
  50#include <linux/etherdevice.h>
  51#include <linux/ethtool.h>
  52#include <linux/module.h>
  53#include <linux/pci.h>
  54#include <linux/ntb.h>
  55#include <linux/ntb_transport.h>
  56
  57#define NTB_NETDEV_VER  "0.7"
  58
  59MODULE_DESCRIPTION(KBUILD_MODNAME);
  60MODULE_VERSION(NTB_NETDEV_VER);
  61MODULE_LICENSE("Dual BSD/GPL");
  62MODULE_AUTHOR("Intel Corporation");
  63
  64/* Time in usecs for tx resource reaper */
  65static unsigned int tx_time = 1;
  66
  67/* Number of descriptors to free before resuming tx */
  68static unsigned int tx_start = 10;
  69
  70/* Number of descriptors still available before stop upper layer tx */
  71static unsigned int tx_stop = 5;
  72
  73struct ntb_netdev {
  74        struct pci_dev *pdev;
  75        struct net_device *ndev;
  76        struct ntb_transport_qp *qp;
  77        struct timer_list tx_timer;
  78};
  79
  80#define NTB_TX_TIMEOUT_MS       1000
  81#define NTB_RXQ_SIZE            100
  82
  83static void ntb_netdev_event_handler(void *data, int link_is_up)
  84{
  85        struct net_device *ndev = data;
  86        struct ntb_netdev *dev = netdev_priv(ndev);
  87
  88        netdev_dbg(ndev, "Event %x, Link %x\n", link_is_up,
  89                   ntb_transport_link_query(dev->qp));
  90
  91        if (link_is_up) {
  92                if (ntb_transport_link_query(dev->qp))
  93                        netif_carrier_on(ndev);
  94        } else {
  95                netif_carrier_off(ndev);
  96        }
  97}
  98
  99static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data,
 100                                  void *data, int len)
 101{
 102        struct net_device *ndev = qp_data;
 103        struct sk_buff *skb;
 104        int rc;
 105
 106        skb = data;
 107        if (!skb)
 108                return;
 109
 110        netdev_dbg(ndev, "%s: %d byte payload received\n", __func__, len);
 111
 112        if (len < 0) {
 113                ndev->stats.rx_errors++;
 114                ndev->stats.rx_length_errors++;
 115                goto enqueue_again;
 116        }
 117
 118        skb_put(skb, len);
 119        skb->protocol = eth_type_trans(skb, ndev);
 120        skb->ip_summed = CHECKSUM_NONE;
 121
 122        if (netif_rx(skb) == NET_RX_DROP) {
 123                ndev->stats.rx_errors++;
 124                ndev->stats.rx_dropped++;
 125        } else {
 126                ndev->stats.rx_packets++;
 127                ndev->stats.rx_bytes += len;
 128        }
 129
 130        skb = netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN);
 131        if (!skb) {
 132                ndev->stats.rx_errors++;
 133                ndev->stats.rx_frame_errors++;
 134                return;
 135        }
 136
 137enqueue_again:
 138        rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN);
 139        if (rc) {
 140                dev_kfree_skb(skb);
 141                ndev->stats.rx_errors++;
 142                ndev->stats.rx_fifo_errors++;
 143        }
 144}
 145
 146static int __ntb_netdev_maybe_stop_tx(struct net_device *netdev,
 147                                      struct ntb_transport_qp *qp, int size)
 148{
 149        struct ntb_netdev *dev = netdev_priv(netdev);
 150
 151        netif_stop_queue(netdev);
 152        /* Make sure to see the latest value of ntb_transport_tx_free_entry()
 153         * since the queue was last started.
 154         */
 155        smp_mb();
 156
 157        if (likely(ntb_transport_tx_free_entry(qp) < size)) {
 158                mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time));
 159                return -EBUSY;
 160        }
 161
 162        netif_start_queue(netdev);
 163        return 0;
 164}
 165
 166static int ntb_netdev_maybe_stop_tx(struct net_device *ndev,
 167                                    struct ntb_transport_qp *qp, int size)
 168{
 169        if (netif_queue_stopped(ndev) ||
 170            (ntb_transport_tx_free_entry(qp) >= size))
 171                return 0;
 172
 173        return __ntb_netdev_maybe_stop_tx(ndev, qp, size);
 174}
 175
 176static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_data,
 177                                  void *data, int len)
 178{
 179        struct net_device *ndev = qp_data;
 180        struct sk_buff *skb;
 181        struct ntb_netdev *dev = netdev_priv(ndev);
 182
 183        skb = data;
 184        if (!skb || !ndev)
 185                return;
 186
 187        if (len > 0) {
 188                ndev->stats.tx_packets++;
 189                ndev->stats.tx_bytes += skb->len;
 190        } else {
 191                ndev->stats.tx_errors++;
 192                ndev->stats.tx_aborted_errors++;
 193        }
 194
 195        dev_kfree_skb(skb);
 196
 197        if (ntb_transport_tx_free_entry(dev->qp) >= tx_start) {
 198                /* Make sure anybody stopping the queue after this sees the new
 199                 * value of ntb_transport_tx_free_entry()
 200                 */
 201                smp_mb();
 202                if (netif_queue_stopped(ndev))
 203                        netif_wake_queue(ndev);
 204        }
 205}
 206
 207static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb,
 208                                         struct net_device *ndev)
 209{
 210        struct ntb_netdev *dev = netdev_priv(ndev);
 211        int rc;
 212
 213        ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop);
 214
 215        rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len);
 216        if (rc)
 217                goto err;
 218
 219        /* check for next submit */
 220        ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop);
 221
 222        return NETDEV_TX_OK;
 223
 224err:
 225        ndev->stats.tx_dropped++;
 226        ndev->stats.tx_errors++;
 227        return NETDEV_TX_BUSY;
 228}
 229
 230static void ntb_netdev_tx_timer(struct timer_list *t)
 231{
 232        struct ntb_netdev *dev = from_timer(dev, t, tx_timer);
 233        struct net_device *ndev = dev->ndev;
 234
 235        if (ntb_transport_tx_free_entry(dev->qp) < tx_stop) {
 236                mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time));
 237        } else {
 238                /* Make sure anybody stopping the queue after this sees the new
 239                 * value of ntb_transport_tx_free_entry()
 240                 */
 241                smp_mb();
 242                if (netif_queue_stopped(ndev))
 243                        netif_wake_queue(ndev);
 244        }
 245}
 246
 247static int ntb_netdev_open(struct net_device *ndev)
 248{
 249        struct ntb_netdev *dev = netdev_priv(ndev);
 250        struct sk_buff *skb;
 251        int rc, i, len;
 252
 253        /* Add some empty rx bufs */
 254        for (i = 0; i < NTB_RXQ_SIZE; i++) {
 255                skb = netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN);
 256                if (!skb) {
 257                        rc = -ENOMEM;
 258                        goto err;
 259                }
 260
 261                rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data,
 262                                              ndev->mtu + ETH_HLEN);
 263                if (rc) {
 264                        dev_kfree_skb(skb);
 265                        goto err;
 266                }
 267        }
 268
 269        timer_setup(&dev->tx_timer, ntb_netdev_tx_timer, 0);
 270
 271        netif_carrier_off(ndev);
 272        ntb_transport_link_up(dev->qp);
 273        netif_start_queue(ndev);
 274
 275        return 0;
 276
 277err:
 278        while ((skb = ntb_transport_rx_remove(dev->qp, &len)))
 279                dev_kfree_skb(skb);
 280        return rc;
 281}
 282
 283static int ntb_netdev_close(struct net_device *ndev)
 284{
 285        struct ntb_netdev *dev = netdev_priv(ndev);
 286        struct sk_buff *skb;
 287        int len;
 288
 289        ntb_transport_link_down(dev->qp);
 290
 291        while ((skb = ntb_transport_rx_remove(dev->qp, &len)))
 292                dev_kfree_skb(skb);
 293
 294        del_timer_sync(&dev->tx_timer);
 295
 296        return 0;
 297}
 298
 299static int ntb_netdev_change_mtu(struct net_device *ndev, int new_mtu)
 300{
 301        struct ntb_netdev *dev = netdev_priv(ndev);
 302        struct sk_buff *skb;
 303        int len, rc;
 304
 305        if (new_mtu > ntb_transport_max_size(dev->qp) - ETH_HLEN)
 306                return -EINVAL;
 307
 308        if (!netif_running(ndev)) {
 309                ndev->mtu = new_mtu;
 310                return 0;
 311        }
 312
 313        /* Bring down the link and dispose of posted rx entries */
 314        ntb_transport_link_down(dev->qp);
 315
 316        if (ndev->mtu < new_mtu) {
 317                int i;
 318
 319                for (i = 0; (skb = ntb_transport_rx_remove(dev->qp, &len)); i++)
 320                        dev_kfree_skb(skb);
 321
 322                for (; i; i--) {
 323                        skb = netdev_alloc_skb(ndev, new_mtu + ETH_HLEN);
 324                        if (!skb) {
 325                                rc = -ENOMEM;
 326                                goto err;
 327                        }
 328
 329                        rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data,
 330                                                      new_mtu + ETH_HLEN);
 331                        if (rc) {
 332                                dev_kfree_skb(skb);
 333                                goto err;
 334                        }
 335                }
 336        }
 337
 338        ndev->mtu = new_mtu;
 339
 340        ntb_transport_link_up(dev->qp);
 341
 342        return 0;
 343
 344err:
 345        ntb_transport_link_down(dev->qp);
 346
 347        while ((skb = ntb_transport_rx_remove(dev->qp, &len)))
 348                dev_kfree_skb(skb);
 349
 350        netdev_err(ndev, "Error changing MTU, device inoperable\n");
 351        return rc;
 352}
 353
 354static const struct net_device_ops ntb_netdev_ops = {
 355        .ndo_open = ntb_netdev_open,
 356        .ndo_stop = ntb_netdev_close,
 357        .ndo_start_xmit = ntb_netdev_start_xmit,
 358        .ndo_change_mtu = ntb_netdev_change_mtu,
 359        .ndo_set_mac_address = eth_mac_addr,
 360};
 361
 362static void ntb_get_drvinfo(struct net_device *ndev,
 363                            struct ethtool_drvinfo *info)
 364{
 365        struct ntb_netdev *dev = netdev_priv(ndev);
 366
 367        strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
 368        strlcpy(info->version, NTB_NETDEV_VER, sizeof(info->version));
 369        strlcpy(info->bus_info, pci_name(dev->pdev), sizeof(info->bus_info));
 370}
 371
 372static int ntb_get_link_ksettings(struct net_device *dev,
 373                                  struct ethtool_link_ksettings *cmd)
 374{
 375        ethtool_link_ksettings_zero_link_mode(cmd, supported);
 376        ethtool_link_ksettings_add_link_mode(cmd, supported, Backplane);
 377        ethtool_link_ksettings_zero_link_mode(cmd, advertising);
 378        ethtool_link_ksettings_add_link_mode(cmd, advertising, Backplane);
 379
 380        cmd->base.speed = SPEED_UNKNOWN;
 381        cmd->base.duplex = DUPLEX_FULL;
 382        cmd->base.port = PORT_OTHER;
 383        cmd->base.phy_address = 0;
 384        cmd->base.autoneg = AUTONEG_ENABLE;
 385
 386        return 0;
 387}
 388
 389static const struct ethtool_ops ntb_ethtool_ops = {
 390        .get_drvinfo = ntb_get_drvinfo,
 391        .get_link = ethtool_op_get_link,
 392        .get_link_ksettings = ntb_get_link_ksettings,
 393};
 394
 395static const struct ntb_queue_handlers ntb_netdev_handlers = {
 396        .tx_handler = ntb_netdev_tx_handler,
 397        .rx_handler = ntb_netdev_rx_handler,
 398        .event_handler = ntb_netdev_event_handler,
 399};
 400
 401static int ntb_netdev_probe(struct device *client_dev)
 402{
 403        struct ntb_dev *ntb;
 404        struct net_device *ndev;
 405        struct pci_dev *pdev;
 406        struct ntb_netdev *dev;
 407        int rc;
 408
 409        ntb = dev_ntb(client_dev->parent);
 410        pdev = ntb->pdev;
 411        if (!pdev)
 412                return -ENODEV;
 413
 414        ndev = alloc_etherdev(sizeof(*dev));
 415        if (!ndev)
 416                return -ENOMEM;
 417
 418        SET_NETDEV_DEV(ndev, client_dev);
 419
 420        dev = netdev_priv(ndev);
 421        dev->ndev = ndev;
 422        dev->pdev = pdev;
 423        ndev->features = NETIF_F_HIGHDMA;
 424
 425        ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
 426
 427        ndev->hw_features = ndev->features;
 428        ndev->watchdog_timeo = msecs_to_jiffies(NTB_TX_TIMEOUT_MS);
 429
 430        eth_random_addr(ndev->perm_addr);
 431        memcpy(ndev->dev_addr, ndev->perm_addr, ndev->addr_len);
 432
 433        ndev->netdev_ops = &ntb_netdev_ops;
 434        ndev->ethtool_ops = &ntb_ethtool_ops;
 435
 436        ndev->min_mtu = 0;
 437        ndev->max_mtu = ETH_MAX_MTU;
 438
 439        dev->qp = ntb_transport_create_queue(ndev, client_dev,
 440                                             &ntb_netdev_handlers);
 441        if (!dev->qp) {
 442                rc = -EIO;
 443                goto err;
 444        }
 445
 446        ndev->mtu = ntb_transport_max_size(dev->qp) - ETH_HLEN;
 447
 448        rc = register_netdev(ndev);
 449        if (rc)
 450                goto err1;
 451
 452        dev_set_drvdata(client_dev, ndev);
 453        dev_info(&pdev->dev, "%s created\n", ndev->name);
 454        return 0;
 455
 456err1:
 457        ntb_transport_free_queue(dev->qp);
 458err:
 459        free_netdev(ndev);
 460        return rc;
 461}
 462
 463static void ntb_netdev_remove(struct device *client_dev)
 464{
 465        struct net_device *ndev = dev_get_drvdata(client_dev);
 466        struct ntb_netdev *dev = netdev_priv(ndev);
 467
 468        unregister_netdev(ndev);
 469        ntb_transport_free_queue(dev->qp);
 470        free_netdev(ndev);
 471}
 472
 473static struct ntb_transport_client ntb_netdev_client = {
 474        .driver.name = KBUILD_MODNAME,
 475        .driver.owner = THIS_MODULE,
 476        .probe = ntb_netdev_probe,
 477        .remove = ntb_netdev_remove,
 478};
 479
 480static int __init ntb_netdev_init_module(void)
 481{
 482        int rc;
 483
 484        rc = ntb_transport_register_client_dev(KBUILD_MODNAME);
 485        if (rc)
 486                return rc;
 487        return ntb_transport_register_client(&ntb_netdev_client);
 488}
 489module_init(ntb_netdev_init_module);
 490
 491static void __exit ntb_netdev_exit_module(void)
 492{
 493        ntb_transport_unregister_client(&ntb_netdev_client);
 494        ntb_transport_unregister_client_dev(KBUILD_MODNAME);
 495}
 496module_exit(ntb_netdev_exit_module);
 497