linux/drivers/ntb/test/ntb_pingpong.c

/*
 *   This file is provided under a dual BSD/GPLv2 license.  When using or
 *   redistributing this file, you may do so under either license.
 *
 *   GPL LICENSE SUMMARY
 *
 *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
 *   Copyright (C) 2017 T-Platforms. All Rights Reserved.
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of version 2 of the GNU General Public License as
 *   published by the Free Software Foundation.
 *
 *   This program is distributed in the hope that it will be useful, but
 *   WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *   General Public License for more details.
 *
 *   BSD LICENSE
 *
 *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
 *   Copyright (C) 2017 T-Platforms. All Rights Reserved.
 *
 *   Redistribution and use in source and binary forms, with or without
 *   modification, are permitted provided that the following conditions
 *   are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copy
 *       notice, this list of conditions and the following disclaimer in
 *       the documentation and/or other materials provided with the
 *       distribution.
 *     * Neither the name of Intel Corporation nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * PCIe NTB Pingpong Linux driver
 */

/*
 * How to use this tool, by example.
 *
 * Assuming $DBG_DIR is something like:
 * '/sys/kernel/debug/ntb_perf/0000:00:03.0'
 * Suppose aside from local device there is at least one remote device
 * connected to NTB with index 0.
 *-----------------------------------------------------------------------------
 * Eg: install driver with specified delay between doorbell event and response
 *
 * root@self# insmod ntb_pingpong.ko delay_ms=1000
 *-----------------------------------------------------------------------------
 * Eg: get number of ping-pong cycles performed
 *
 * root@self# cat $DBG_DIR/count
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/bitops.h>

#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/hrtimer.h>
#include <linux/debugfs.h>

#include <linux/ntb.h>

#define DRIVER_NAME
#define DRIVER_VERSION

MODULE_LICENSE();
MODULE_VERSION();
MODULE_AUTHOR();
MODULE_DESCRIPTION();

static unsigned int unsafe;
module_param(unsafe, uint, 0644);
MODULE_PARM_DESC();

static unsigned int delay_ms =;
module_param(delay_ms, uint, 0644);
MODULE_PARM_DESC();

struct pp_ctx {};
#define to_pp_timer(__timer)

static struct dentry *pp_dbgfs_topdir;

static int pp_find_next_peer(struct pp_ctx *pp)
{}

static void pp_setup(struct pp_ctx *pp)
{}

static void pp_clear(struct pp_ctx *pp)
{}

static void pp_ping(struct pp_ctx *pp)
{}

static void pp_pong(struct pp_ctx *pp)
{}

static enum hrtimer_restart pp_timer_func(struct hrtimer *t)
{}

static void pp_link_event(void *ctx)
{}

static void pp_db_event(void *ctx, int vec)
{}

static const struct ntb_ctx_ops pp_ops =;

static int pp_check_ntb(struct ntb_dev *ntb)
{}

static struct pp_ctx *pp_create_data(struct ntb_dev *ntb)
{}

static void pp_init_flds(struct pp_ctx *pp)
{}

static int pp_mask_events(struct pp_ctx *pp)
{}

static int pp_setup_ctx(struct pp_ctx *pp)
{}

static void pp_clear_ctx(struct pp_ctx *pp)
{}

static void pp_setup_dbgfs(struct pp_ctx *pp)
{}

static void pp_clear_dbgfs(struct pp_ctx *pp)
{}

static int pp_probe(struct ntb_client *client, struct ntb_dev *ntb)
{}

static void pp_remove(struct ntb_client *client, struct ntb_dev *ntb)
{}

static struct ntb_client pp_client =;

static int __init pp_init(void)
{}
module_init();

static void __exit pp_exit(void)
{}
module_exit(pp_exit);