linux-stable/drivers/staging/most/mostcore/core.c

1997 lines
48 KiB
C
Raw Normal View History

Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
/*
* core.c - Implementation of core module of MOST Linux driver stack
*
* Copyright (C) 2013-2015 Microchip Technology Germany II GmbH & Co. KG
*
* 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.
*
* This file is licensed under GPLv2.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/list.h>
#include <linux/poll.h>
#include <linux/wait.h>
#include <linux/kobject.h>
#include <linux/mutex.h>
#include <linux/completion.h>
#include <linux/sysfs.h>
#include <linux/kthread.h>
#include <linux/dma-mapping.h>
#include <linux/idr.h>
#include "mostcore.h"
#define MAX_CHANNELS 64
#define STRING_SIZE 80
static struct class *most_class;
static struct device *class_glue_dir;
static struct ida mdev_id;
static int modref;
static int dummy_num_buffers;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
struct most_c_aim_obj {
struct most_aim *ptr;
int refs;
int num_buffers;
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
struct most_c_obj {
struct kobject kobj;
struct completion cleanup;
atomic_t mbo_ref;
atomic_t mbo_nq_level;
u16 channel_id;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
bool is_poisoned;
struct mutex start_mutex;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
int is_starving;
struct most_interface *iface;
struct most_inst_obj *inst;
struct most_channel_config cfg;
bool keep_mbo;
bool enqueue_halt;
struct list_head fifo;
spinlock_t fifo_lock;
struct list_head halt_fifo;
struct list_head list;
struct most_c_aim_obj aim0;
struct most_c_aim_obj aim1;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
struct list_head trash_fifo;
struct task_struct *hdm_enqueue_task;
struct mutex stop_task_mutex;
wait_queue_head_t hdm_fifo_wq;
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
#define to_c_obj(d) container_of(d, struct most_c_obj, kobj)
struct most_inst_obj {
int dev_id;
atomic_t tainted;
struct most_interface *iface;
struct list_head channel_list;
struct most_c_obj *channel[MAX_CHANNELS];
struct kobject kobj;
struct list_head list;
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
#define to_inst_obj(d) container_of(d, struct most_inst_obj, kobj)
/**
* list_pop_mbo - retrieves the first MBO of the list and removes it
* @ptr: the list head to grab the MBO from.
*/
#define list_pop_mbo(ptr) \
({ \
struct mbo *_mbo = list_first_entry(ptr, struct mbo, list); \
list_del(&_mbo->list); \
_mbo; \
})
static struct mutex deregister_mutex;
/* ___ ___
* ___C H A N N E L___
*/
/**
* struct most_c_attr - to access the attributes of a channel object
* @attr: attributes of a channel
* @show: pointer to the show function
* @store: pointer to the store function
*/
struct most_c_attr {
struct attribute attr;
ssize_t (*show)(struct most_c_obj *d,
struct most_c_attr *attr,
char *buf);
ssize_t (*store)(struct most_c_obj *d,
struct most_c_attr *attr,
const char *buf,
size_t count);
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
#define to_channel_attr(a) container_of(a, struct most_c_attr, attr)
#define MOST_CHNL_ATTR(_name, _mode, _show, _store) \
struct most_c_attr most_chnl_attr_##_name = \
__ATTR(_name, _mode, _show, _store)
/**
* channel_attr_show - show function of channel object
* @kobj: pointer to its kobject
* @attr: pointer to its attributes
* @buf: buffer
*/
static ssize_t channel_attr_show(struct kobject *kobj, struct attribute *attr,
char *buf)
{
struct most_c_attr *channel_attr = to_channel_attr(attr);
struct most_c_obj *c_obj = to_c_obj(kobj);
if (!channel_attr->show)
return -EIO;
return channel_attr->show(c_obj, channel_attr, buf);
}
/**
* channel_attr_store - store function of channel object
* @kobj: pointer to its kobject
* @attr: pointer to its attributes
* @buf: buffer
* @len: length of buffer
*/
static ssize_t channel_attr_store(struct kobject *kobj,
struct attribute *attr,
const char *buf,
size_t len)
{
struct most_c_attr *channel_attr = to_channel_attr(attr);
struct most_c_obj *c_obj = to_c_obj(kobj);
if (!channel_attr->store)
return -EIO;
return channel_attr->store(c_obj, channel_attr, buf, len);
}
static const struct sysfs_ops most_channel_sysfs_ops = {
.show = channel_attr_show,
.store = channel_attr_store,
};
/**
* most_free_mbo_coherent - free an MBO and its coherent buffer
* @mbo: buffer to be released
*
*/
static void most_free_mbo_coherent(struct mbo *mbo)
{
struct most_c_obj *c = mbo->context;
u16 const coherent_buf_size = c->cfg.buffer_size + c->cfg.extra_len;
dma_free_coherent(NULL, coherent_buf_size, mbo->virt_address,
mbo->bus_address);
kfree(mbo);
if (atomic_sub_and_test(1, &c->mbo_ref))
complete(&c->cleanup);
}
/**
* flush_channel_fifos - clear the channel fifos
* @c: pointer to channel object
*/
static void flush_channel_fifos(struct most_c_obj *c)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
unsigned long flags, hf_flags;
struct mbo *mbo, *tmp;
if (list_empty(&c->fifo) && list_empty(&c->halt_fifo))
return;
spin_lock_irqsave(&c->fifo_lock, flags);
list_for_each_entry_safe(mbo, tmp, &c->fifo, list) {
list_del(&mbo->list);
spin_unlock_irqrestore(&c->fifo_lock, flags);
most_free_mbo_coherent(mbo);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
spin_lock_irqsave(&c->fifo_lock, flags);
}
spin_unlock_irqrestore(&c->fifo_lock, flags);
spin_lock_irqsave(&c->fifo_lock, hf_flags);
list_for_each_entry_safe(mbo, tmp, &c->halt_fifo, list) {
list_del(&mbo->list);
spin_unlock_irqrestore(&c->fifo_lock, hf_flags);
most_free_mbo_coherent(mbo);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
spin_lock_irqsave(&c->fifo_lock, hf_flags);
}
spin_unlock_irqrestore(&c->fifo_lock, hf_flags);
if (unlikely((!list_empty(&c->fifo) || !list_empty(&c->halt_fifo))))
pr_info("WARN: fifo | trash fifo not empty\n");
}
/**
* flush_trash_fifo - clear the trash fifo
* @c: pointer to channel object
*/
static int flush_trash_fifo(struct most_c_obj *c)
{
struct mbo *mbo, *tmp;
unsigned long flags;
spin_lock_irqsave(&c->fifo_lock, flags);
list_for_each_entry_safe(mbo, tmp, &c->trash_fifo, list) {
list_del(&mbo->list);
spin_unlock_irqrestore(&c->fifo_lock, flags);
most_free_mbo_coherent(mbo);
spin_lock_irqsave(&c->fifo_lock, flags);
}
spin_unlock_irqrestore(&c->fifo_lock, flags);
return 0;
}
/**
* most_channel_release - release function of channel object
* @kobj: pointer to channel's kobject
*/
static void most_channel_release(struct kobject *kobj)
{
struct most_c_obj *c = to_c_obj(kobj);
kfree(c);
}
static ssize_t show_available_directions(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
unsigned int i = c->channel_id;
strcpy(buf, "");
if (c->iface->channel_vector[i].direction & MOST_CH_RX)
strcat(buf, "dir_rx ");
if (c->iface->channel_vector[i].direction & MOST_CH_TX)
strcat(buf, "dir_tx ");
strcat(buf, "\n");
return strlen(buf) + 1;
}
static ssize_t show_available_datatypes(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
unsigned int i = c->channel_id;
strcpy(buf, "");
if (c->iface->channel_vector[i].data_type & MOST_CH_CONTROL)
strcat(buf, "control ");
if (c->iface->channel_vector[i].data_type & MOST_CH_ASYNC)
strcat(buf, "async ");
if (c->iface->channel_vector[i].data_type & MOST_CH_SYNC)
strcat(buf, "sync ");
if (c->iface->channel_vector[i].data_type & MOST_CH_ISOC_AVP)
strcat(buf, "isoc_avp ");
strcat(buf, "\n");
return strlen(buf) + 1;
}
static
ssize_t show_number_of_packet_buffers(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
unsigned int i = c->channel_id;
return snprintf(buf, PAGE_SIZE, "%d\n",
c->iface->channel_vector[i].num_buffers_packet);
}
static
ssize_t show_number_of_stream_buffers(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
unsigned int i = c->channel_id;
return snprintf(buf, PAGE_SIZE, "%d\n",
c->iface->channel_vector[i].num_buffers_streaming);
}
static
ssize_t show_size_of_packet_buffer(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
unsigned int i = c->channel_id;
return snprintf(buf, PAGE_SIZE, "%d\n",
c->iface->channel_vector[i].buffer_size_packet);
}
static
ssize_t show_size_of_stream_buffer(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
unsigned int i = c->channel_id;
return snprintf(buf, PAGE_SIZE, "%d\n",
c->iface->channel_vector[i].buffer_size_streaming);
}
static ssize_t show_channel_starving(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%d\n", c->is_starving);
}
#define create_show_channel_attribute(val) \
static MOST_CHNL_ATTR(val, S_IRUGO, show_##val, NULL)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
create_show_channel_attribute(available_directions);
create_show_channel_attribute(available_datatypes);
create_show_channel_attribute(number_of_packet_buffers);
create_show_channel_attribute(number_of_stream_buffers);
create_show_channel_attribute(size_of_stream_buffer);
create_show_channel_attribute(size_of_packet_buffer);
create_show_channel_attribute(channel_starving);
static ssize_t show_set_number_of_buffers(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%d\n", c->cfg.num_buffers);
}
static ssize_t store_set_number_of_buffers(struct most_c_obj *c,
struct most_c_attr *attr,
const char *buf,
size_t count)
{
int ret = kstrtou16(buf, 0, &c->cfg.num_buffers);
if (ret)
return ret;
return count;
}
static ssize_t show_set_buffer_size(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%d\n", c->cfg.buffer_size);
}
static ssize_t store_set_buffer_size(struct most_c_obj *c,
struct most_c_attr *attr,
const char *buf,
size_t count)
{
int ret = kstrtou16(buf, 0, &c->cfg.buffer_size);
if (ret)
return ret;
return count;
}
static ssize_t show_set_direction(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
if (c->cfg.direction & MOST_CH_TX)
return snprintf(buf, PAGE_SIZE, "dir_tx\n");
else if (c->cfg.direction & MOST_CH_RX)
return snprintf(buf, PAGE_SIZE, "dir_rx\n");
return snprintf(buf, PAGE_SIZE, "unconfigured\n");
}
static ssize_t store_set_direction(struct most_c_obj *c,
struct most_c_attr *attr,
const char *buf,
size_t count)
{
if (!strcmp(buf, "dir_rx\n")) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c->cfg.direction = MOST_CH_RX;
} else if (!strcmp(buf, "dir_tx\n")) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c->cfg.direction = MOST_CH_TX;
} else {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
pr_info("WARN: invalid attribute settings\n");
return -EINVAL;
}
return count;
}
static ssize_t show_set_datatype(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
if (c->cfg.data_type & MOST_CH_CONTROL)
return snprintf(buf, PAGE_SIZE, "control\n");
else if (c->cfg.data_type & MOST_CH_ASYNC)
return snprintf(buf, PAGE_SIZE, "async\n");
else if (c->cfg.data_type & MOST_CH_SYNC)
return snprintf(buf, PAGE_SIZE, "sync\n");
else if (c->cfg.data_type & MOST_CH_ISOC_AVP)
return snprintf(buf, PAGE_SIZE, "isoc_avp\n");
return snprintf(buf, PAGE_SIZE, "unconfigured\n");
}
static ssize_t store_set_datatype(struct most_c_obj *c,
struct most_c_attr *attr,
const char *buf,
size_t count)
{
if (!strcmp(buf, "control\n")) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c->cfg.data_type = MOST_CH_CONTROL;
} else if (!strcmp(buf, "async\n")) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c->cfg.data_type = MOST_CH_ASYNC;
} else if (!strcmp(buf, "sync\n")) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c->cfg.data_type = MOST_CH_SYNC;
} else if (!strcmp(buf, "isoc_avp\n")) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c->cfg.data_type = MOST_CH_ISOC_AVP;
} else {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
pr_info("WARN: invalid attribute settings\n");
return -EINVAL;
}
return count;
}
static ssize_t show_set_subbuffer_size(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%d\n", c->cfg.subbuffer_size);
}
static ssize_t store_set_subbuffer_size(struct most_c_obj *c,
struct most_c_attr *attr,
const char *buf,
size_t count)
{
int ret = kstrtou16(buf, 0, &c->cfg.subbuffer_size);
if (ret)
return ret;
return count;
}
static ssize_t show_set_packets_per_xact(struct most_c_obj *c,
struct most_c_attr *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%d\n", c->cfg.packets_per_xact);
}
static ssize_t store_set_packets_per_xact(struct most_c_obj *c,
struct most_c_attr *attr,
const char *buf,
size_t count)
{
int ret = kstrtou16(buf, 0, &c->cfg.packets_per_xact);
if (ret)
return ret;
return count;
}
#define create_channel_attribute(value) \
static MOST_CHNL_ATTR(value, S_IRUGO | S_IWUSR, \
show_##value, \
store_##value)
create_channel_attribute(set_buffer_size);
create_channel_attribute(set_number_of_buffers);
create_channel_attribute(set_direction);
create_channel_attribute(set_datatype);
create_channel_attribute(set_subbuffer_size);
create_channel_attribute(set_packets_per_xact);
/**
* most_channel_def_attrs - array of default attributes of channel object
*/
static struct attribute *most_channel_def_attrs[] = {
&most_chnl_attr_available_directions.attr,
&most_chnl_attr_available_datatypes.attr,
&most_chnl_attr_number_of_packet_buffers.attr,
&most_chnl_attr_number_of_stream_buffers.attr,
&most_chnl_attr_size_of_packet_buffer.attr,
&most_chnl_attr_size_of_stream_buffer.attr,
&most_chnl_attr_set_number_of_buffers.attr,
&most_chnl_attr_set_buffer_size.attr,
&most_chnl_attr_set_direction.attr,
&most_chnl_attr_set_datatype.attr,
&most_chnl_attr_set_subbuffer_size.attr,
&most_chnl_attr_set_packets_per_xact.attr,
&most_chnl_attr_channel_starving.attr,
NULL,
};
static struct kobj_type most_channel_ktype = {
.sysfs_ops = &most_channel_sysfs_ops,
.release = most_channel_release,
.default_attrs = most_channel_def_attrs,
};
static struct kset *most_channel_kset;
/**
* create_most_c_obj - allocates a channel object
* @name: name of the channel object
* @parent: parent kobject
*
* This create a channel object and registers it with sysfs.
* Returns a pointer to the object or NULL when something went wrong.
*/
static struct most_c_obj *
create_most_c_obj(const char *name, struct kobject *parent)
{
struct most_c_obj *c;
int retval;
c = kzalloc(sizeof(*c), GFP_KERNEL);
if (!c)
return NULL;
c->kobj.kset = most_channel_kset;
retval = kobject_init_and_add(&c->kobj, &most_channel_ktype, parent,
"%s", name);
if (retval) {
kobject_put(&c->kobj);
return NULL;
}
kobject_uevent(&c->kobj, KOBJ_ADD);
return c;
}
/**
* destroy_most_c_obj - channel release function
* @c: pointer to channel object
*
* This decrements the reference counter of the channel object.
* If the reference count turns zero, its release function is called.
*/
static void destroy_most_c_obj(struct most_c_obj *c)
{
if (c->aim0.ptr)
c->aim0.ptr->disconnect_channel(c->iface, c->channel_id);
if (c->aim1.ptr)
c->aim1.ptr->disconnect_channel(c->iface, c->channel_id);
c->aim0.ptr = NULL;
c->aim1.ptr = NULL;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
mutex_lock(&deregister_mutex);
flush_trash_fifo(c);
flush_channel_fifos(c);
mutex_unlock(&deregister_mutex);
kobject_put(&c->kobj);
}
/* ___ ___
* ___I N S T A N C E___
*/
#define MOST_INST_ATTR(_name, _mode, _show, _store) \
struct most_inst_attribute most_inst_attr_##_name = \
__ATTR(_name, _mode, _show, _store)
static struct list_head instance_list;
/**
* struct most_inst_attribute - to access the attributes of instance object
* @attr: attributes of an instance
* @show: pointer to the show function
* @store: pointer to the store function
*/
struct most_inst_attribute {
struct attribute attr;
ssize_t (*show)(struct most_inst_obj *d,
struct most_inst_attribute *attr,
char *buf);
ssize_t (*store)(struct most_inst_obj *d,
struct most_inst_attribute *attr,
const char *buf,
size_t count);
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
#define to_instance_attr(a) \
container_of(a, struct most_inst_attribute, attr)
/**
* instance_attr_show - show function for an instance object
* @kobj: pointer to kobject
* @attr: pointer to attribute struct
* @buf: buffer
*/
static ssize_t instance_attr_show(struct kobject *kobj,
struct attribute *attr,
char *buf)
{
struct most_inst_attribute *instance_attr;
struct most_inst_obj *instance_obj;
instance_attr = to_instance_attr(attr);
instance_obj = to_inst_obj(kobj);
if (!instance_attr->show)
return -EIO;
return instance_attr->show(instance_obj, instance_attr, buf);
}
/**
* instance_attr_store - store function for an instance object
* @kobj: pointer to kobject
* @attr: pointer to attribute struct
* @buf: buffer
* @len: length of buffer
*/
static ssize_t instance_attr_store(struct kobject *kobj,
struct attribute *attr,
const char *buf,
size_t len)
{
struct most_inst_attribute *instance_attr;
struct most_inst_obj *instance_obj;
instance_attr = to_instance_attr(attr);
instance_obj = to_inst_obj(kobj);
if (!instance_attr->store)
return -EIO;
return instance_attr->store(instance_obj, instance_attr, buf, len);
}
static const struct sysfs_ops most_inst_sysfs_ops = {
.show = instance_attr_show,
.store = instance_attr_store,
};
/**
* most_inst_release - release function for instance object
* @kobj: pointer to instance's kobject
*
* This frees the allocated memory for the instance object
*/
static void most_inst_release(struct kobject *kobj)
{
struct most_inst_obj *inst = to_inst_obj(kobj);
kfree(inst);
}
static ssize_t show_description(struct most_inst_obj *instance_obj,
struct most_inst_attribute *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%s\n",
instance_obj->iface->description);
}
static ssize_t show_interface(struct most_inst_obj *instance_obj,
struct most_inst_attribute *attr,
char *buf)
{
switch (instance_obj->iface->interface) {
case ITYPE_LOOPBACK:
return snprintf(buf, PAGE_SIZE, "loopback\n");
case ITYPE_I2C:
return snprintf(buf, PAGE_SIZE, "i2c\n");
case ITYPE_I2S:
return snprintf(buf, PAGE_SIZE, "i2s\n");
case ITYPE_TSI:
return snprintf(buf, PAGE_SIZE, "tsi\n");
case ITYPE_HBI:
return snprintf(buf, PAGE_SIZE, "hbi\n");
case ITYPE_MEDIALB_DIM:
return snprintf(buf, PAGE_SIZE, "mlb_dim\n");
case ITYPE_MEDIALB_DIM2:
return snprintf(buf, PAGE_SIZE, "mlb_dim2\n");
case ITYPE_USB:
return snprintf(buf, PAGE_SIZE, "usb\n");
case ITYPE_PCIE:
return snprintf(buf, PAGE_SIZE, "pcie\n");
}
return snprintf(buf, PAGE_SIZE, "unknown\n");
}
#define create_inst_attribute(value) \
static MOST_INST_ATTR(value, S_IRUGO, show_##value, NULL)
create_inst_attribute(description);
create_inst_attribute(interface);
static struct attribute *most_inst_def_attrs[] = {
&most_inst_attr_description.attr,
&most_inst_attr_interface.attr,
NULL,
};
static struct kobj_type most_inst_ktype = {
.sysfs_ops = &most_inst_sysfs_ops,
.release = most_inst_release,
.default_attrs = most_inst_def_attrs,
};
static struct kset *most_inst_kset;
/**
* create_most_inst_obj - creates an instance object
* @name: name of the object to be created
*
* This allocates memory for an instance structure, assigns the proper kset
* and registers it with sysfs.
*
* Returns a pointer to the instance object or NULL when something went wrong.
*/
static struct most_inst_obj *create_most_inst_obj(const char *name)
{
struct most_inst_obj *inst;
int retval;
inst = kzalloc(sizeof(*inst), GFP_KERNEL);
if (!inst)
return NULL;
inst->kobj.kset = most_inst_kset;
retval = kobject_init_and_add(&inst->kobj, &most_inst_ktype, NULL,
"%s", name);
if (retval) {
kobject_put(&inst->kobj);
return NULL;
}
kobject_uevent(&inst->kobj, KOBJ_ADD);
return inst;
}
/**
* destroy_most_inst_obj - MOST instance release function
* @inst: pointer to the instance object
*
* This decrements the reference counter of the instance object.
* If the reference count turns zero, its release function is called
*/
static void destroy_most_inst_obj(struct most_inst_obj *inst)
{
struct most_c_obj *c, *tmp;
/* need to destroy channels first, since
* each channel incremented the
* reference count of the inst->kobj
*/
list_for_each_entry_safe(c, tmp, &inst->channel_list, list) {
destroy_most_c_obj(c);
}
kobject_put(&inst->kobj);
}
/* ___ ___
* ___A I M___
*/
struct most_aim_obj {
struct kobject kobj;
struct list_head list;
struct most_aim *driver;
char add_link[STRING_SIZE];
char remove_link[STRING_SIZE];
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
#define to_aim_obj(d) container_of(d, struct most_aim_obj, kobj)
static struct list_head aim_list;
/**
* struct most_aim_attribute - to access the attributes of AIM object
* @attr: attributes of an AIM
* @show: pointer to the show function
* @store: pointer to the store function
*/
struct most_aim_attribute {
struct attribute attr;
ssize_t (*show)(struct most_aim_obj *d,
struct most_aim_attribute *attr,
char *buf);
ssize_t (*store)(struct most_aim_obj *d,
struct most_aim_attribute *attr,
const char *buf,
size_t count);
};
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
#define to_aim_attr(a) container_of(a, struct most_aim_attribute, attr)
/**
* aim_attr_show - show function of an AIM object
* @kobj: pointer to kobject
* @attr: pointer to attribute struct
* @buf: buffer
*/
static ssize_t aim_attr_show(struct kobject *kobj,
struct attribute *attr,
char *buf)
{
struct most_aim_attribute *aim_attr;
struct most_aim_obj *aim_obj;
aim_attr = to_aim_attr(attr);
aim_obj = to_aim_obj(kobj);
if (!aim_attr->show)
return -EIO;
return aim_attr->show(aim_obj, aim_attr, buf);
}
/**
* aim_attr_store - store function of an AIM object
* @kobj: pointer to kobject
* @attr: pointer to attribute struct
* @buf: buffer
* @len: length of buffer
*/
static ssize_t aim_attr_store(struct kobject *kobj,
struct attribute *attr,
const char *buf,
size_t len)
{
struct most_aim_attribute *aim_attr;
struct most_aim_obj *aim_obj;
aim_attr = to_aim_attr(attr);
aim_obj = to_aim_obj(kobj);
if (!aim_attr->store)
return -EIO;
return aim_attr->store(aim_obj, aim_attr, buf, len);
}
static const struct sysfs_ops most_aim_sysfs_ops = {
.show = aim_attr_show,
.store = aim_attr_store,
};
/**
* most_aim_release - AIM release function
* @kobj: pointer to AIM's kobject
*/
static void most_aim_release(struct kobject *kobj)
{
struct most_aim_obj *aim_obj = to_aim_obj(kobj);
kfree(aim_obj);
}
static ssize_t show_add_link(struct most_aim_obj *aim_obj,
struct most_aim_attribute *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%s\n", aim_obj->add_link);
}
/**
* split_string - parses and changes string in the buffer buf and
* splits it into two mandatory and one optional substrings.
*
* @buf: complete string from attribute 'add_channel'
* @a: address of pointer to 1st substring (=instance name)
* @b: address of pointer to 2nd substring (=channel name)
* @c: optional address of pointer to 3rd substring (=user defined name)
*
* Examples:
*
* Input: "mdev0:ch0@ep_81:my_channel\n" or
* "mdev0:ch0@ep_81:my_channel"
*
* Output: *a -> "mdev0", *b -> "ch0@ep_81", *c -> "my_channel"
*
* Input: "mdev0:ch0@ep_81\n"
* Output: *a -> "mdev0", *b -> "ch0@ep_81", *c -> ""
*
* Input: "mdev0:ch0@ep_81"
* Output: *a -> "mdev0", *b -> "ch0@ep_81", *c == NULL
*/
static int split_string(char *buf, char **a, char **b, char **c)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
*a = strsep(&buf, ":");
if (!*a)
return -EIO;
*b = strsep(&buf, ":\n");
if (!*b)
return -EIO;
if (c)
*c = strsep(&buf, ":\n");
return 0;
}
/**
* get_channel_by_name - get pointer to channel object
* @mdev: name of the device instance
* @mdev_ch: name of the respective channel
*
* This retrieves the pointer to a channel object.
*/
static struct
most_c_obj *get_channel_by_name(char *mdev, char *mdev_ch)
{
struct most_c_obj *c, *tmp;
struct most_inst_obj *i, *i_tmp;
int found = 0;
list_for_each_entry_safe(i, i_tmp, &instance_list, list) {
if (!strcmp(kobject_name(&i->kobj), mdev)) {
found++;
break;
}
}
if (unlikely(!found))
return ERR_PTR(-EIO);
list_for_each_entry_safe(c, tmp, &i->channel_list, list) {
if (!strcmp(kobject_name(&c->kobj), mdev_ch)) {
found++;
break;
}
}
if (unlikely(found < 2))
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return ERR_PTR(-EIO);
return c;
}
/**
* store_add_link - store() function for add_link attribute
* @aim_obj: pointer to AIM object
* @attr: its attributes
* @buf: buffer
* @len: buffer length
*
* This parses the string given by buf and splits it into
* three substrings. Note: third substring is optional. In case a cdev
* AIM is loaded the optional 3rd substring will make up the name of
* device node in the /dev directory. If omitted, the device node will
* inherit the channel's name within sysfs.
*
* Searches for a pair of device and channel and probes the AIM
*
* Example:
* (1) echo -n -e "mdev0:ch0@ep_81:my_rxchannel\n" >add_link
* (2) echo -n -e "mdev0:ch0@ep_81\n" >add_link
*
* (1) would create the device node /dev/my_rxchannel
* (2) would create the device node /dev/mdev0-ch0@ep_81
*/
static ssize_t store_add_link(struct most_aim_obj *aim_obj,
struct most_aim_attribute *attr,
const char *buf,
size_t len)
{
struct most_c_obj *c;
struct most_aim **aim_ptr;
char buffer[STRING_SIZE];
char *mdev;
char *mdev_ch;
char *mdev_devnod;
char devnod_buf[STRING_SIZE];
int ret;
size_t max_len = min_t(size_t, len + 1, STRING_SIZE);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
strlcpy(buffer, buf, max_len);
strlcpy(aim_obj->add_link, buf, max_len);
ret = split_string(buffer, &mdev, &mdev_ch, &mdev_devnod);
if (ret)
return ret;
if (!mdev_devnod || *mdev_devnod == 0) {
snprintf(devnod_buf, sizeof(devnod_buf), "%s-%s", mdev,
mdev_ch);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
mdev_devnod = devnod_buf;
}
c = get_channel_by_name(mdev, mdev_ch);
if (IS_ERR(c))
return -ENODEV;
if (!c->aim0.ptr)
aim_ptr = &c->aim0.ptr;
else if (!c->aim1.ptr)
aim_ptr = &c->aim1.ptr;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
else
return -ENOSPC;
ret = aim_obj->driver->probe_channel(c->iface, c->channel_id,
&c->cfg, &c->kobj, mdev_devnod);
if (ret)
return ret;
*aim_ptr = aim_obj->driver;
return len;
}
static struct most_aim_attribute most_aim_attr_add_link =
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
__ATTR(add_link, S_IRUGO | S_IWUSR, show_add_link, store_add_link);
static ssize_t show_remove_link(struct most_aim_obj *aim_obj,
struct most_aim_attribute *attr,
char *buf)
{
return snprintf(buf, PAGE_SIZE, "%s\n", aim_obj->remove_link);
}
/**
* store_remove_link - store function for remove_link attribute
* @aim_obj: pointer to AIM object
* @attr: its attributes
* @buf: buffer
* @len: buffer length
*
* Example:
* echo -n -e "mdev0:ch0@ep_81\n" >remove_link
*/
static ssize_t store_remove_link(struct most_aim_obj *aim_obj,
struct most_aim_attribute *attr,
const char *buf,
size_t len)
{
struct most_c_obj *c;
char buffer[STRING_SIZE];
char *mdev;
char *mdev_ch;
int ret;
size_t max_len = min_t(size_t, len + 1, STRING_SIZE);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
strlcpy(buffer, buf, max_len);
strlcpy(aim_obj->remove_link, buf, max_len);
ret = split_string(buffer, &mdev, &mdev_ch, NULL);
if (ret)
return ret;
c = get_channel_by_name(mdev, mdev_ch);
if (IS_ERR(c))
return -ENODEV;
if (c->aim0.ptr == aim_obj->driver)
c->aim0.ptr = NULL;
if (c->aim1.ptr == aim_obj->driver)
c->aim1.ptr = NULL;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (aim_obj->driver->disconnect_channel(c->iface, c->channel_id))
return -EIO;
return len;
}
static struct most_aim_attribute most_aim_attr_remove_link =
__ATTR(remove_link, S_IRUGO | S_IWUSR, show_remove_link,
store_remove_link);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
static struct attribute *most_aim_def_attrs[] = {
&most_aim_attr_add_link.attr,
&most_aim_attr_remove_link.attr,
NULL,
};
static struct kobj_type most_aim_ktype = {
.sysfs_ops = &most_aim_sysfs_ops,
.release = most_aim_release,
.default_attrs = most_aim_def_attrs,
};
static struct kset *most_aim_kset;
/**
* create_most_aim_obj - creates an AIM object
* @name: name of the AIM
*
* This creates an AIM object assigns the proper kset and registers
* it with sysfs.
* Returns a pointer to the object or NULL if something went wrong.
*/
static struct most_aim_obj *create_most_aim_obj(const char *name)
{
struct most_aim_obj *most_aim;
int retval;
most_aim = kzalloc(sizeof(*most_aim), GFP_KERNEL);
if (!most_aim)
return NULL;
most_aim->kobj.kset = most_aim_kset;
retval = kobject_init_and_add(&most_aim->kobj, &most_aim_ktype,
NULL, "%s", name);
if (retval) {
kobject_put(&most_aim->kobj);
return NULL;
}
kobject_uevent(&most_aim->kobj, KOBJ_ADD);
return most_aim;
}
/**
* destroy_most_aim_obj - AIM release function
* @p: pointer to AIM object
*
* This decrements the reference counter of the AIM object. If the
* reference count turns zero, its release function will be called.
*/
static void destroy_most_aim_obj(struct most_aim_obj *p)
{
kobject_put(&p->kobj);
}
/* ___ ___
* ___C O R E___
*/
/**
* Instantiation of the MOST bus
*/
static struct bus_type most_bus = {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
.name = "most",
};
/**
* Instantiation of the core driver
*/
static struct device_driver mostcore = {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
.name = "mostcore",
.bus = &most_bus,
};
static inline void trash_mbo(struct mbo *mbo)
{
unsigned long flags;
struct most_c_obj *c = mbo->context;
spin_lock_irqsave(&c->fifo_lock, flags);
list_add(&mbo->list, &c->trash_fifo);
spin_unlock_irqrestore(&c->fifo_lock, flags);
}
static struct mbo *get_hdm_mbo(struct most_c_obj *c)
{
unsigned long flags;
struct mbo *mbo;
spin_lock_irqsave(&c->fifo_lock, flags);
if (c->enqueue_halt || list_empty(&c->halt_fifo))
mbo = NULL;
else
mbo = list_pop_mbo(&c->halt_fifo);
spin_unlock_irqrestore(&c->fifo_lock, flags);
return mbo;
}
static void nq_hdm_mbo(struct mbo *mbo)
{
unsigned long flags;
struct most_c_obj *c = mbo->context;
spin_lock_irqsave(&c->fifo_lock, flags);
list_add_tail(&mbo->list, &c->halt_fifo);
spin_unlock_irqrestore(&c->fifo_lock, flags);
wake_up_interruptible(&c->hdm_fifo_wq);
}
static int hdm_enqueue_thread(void *data)
{
struct most_c_obj *c = data;
struct mbo *mbo;
typeof(c->iface->enqueue) enqueue = c->iface->enqueue;
while (likely(!kthread_should_stop())) {
wait_event_interruptible(c->hdm_fifo_wq,
(mbo = get_hdm_mbo(c)) ||
kthread_should_stop());
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (unlikely(!mbo))
continue;
if (c->cfg.direction == MOST_CH_RX)
mbo->buffer_length = c->cfg.buffer_size;
if (unlikely(enqueue(mbo->ifp, mbo->hdm_channel_id, mbo))) {
pr_err("hdm enqueue failed\n");
nq_hdm_mbo(mbo);
c->hdm_enqueue_task = NULL;
return 0;
}
}
return 0;
}
static int run_enqueue_thread(struct most_c_obj *c, int channel_id)
{
struct task_struct *task =
kthread_run(hdm_enqueue_thread, c, "hdm_fifo_%d",
channel_id);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (IS_ERR(task))
return PTR_ERR(task);
c->hdm_enqueue_task = task;
return 0;
}
/**
* arm_mbo - recycle MBO for further usage
* @mbo: buffer object
*
* This puts an MBO back to the list to have it ready for up coming
* tx transactions.
*
* In case the MBO belongs to a channel that recently has been
* poisoned, the MBO is scheduled to be trashed.
* Calls the completion handler of an attached AIM.
*/
static void arm_mbo(struct mbo *mbo)
{
unsigned long flags;
struct most_c_obj *c;
BUG_ON((!mbo) || (!mbo->context));
c = mbo->context;
if (c->is_poisoned) {
trash_mbo(mbo);
return;
}
spin_lock_irqsave(&c->fifo_lock, flags);
++*mbo->num_buffers_ptr;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
list_add_tail(&mbo->list, &c->fifo);
spin_unlock_irqrestore(&c->fifo_lock, flags);
if (c->aim0.refs && c->aim0.ptr->tx_completion)
c->aim0.ptr->tx_completion(c->iface, c->channel_id);
if (c->aim1.refs && c->aim1.ptr->tx_completion)
c->aim1.ptr->tx_completion(c->iface, c->channel_id);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
}
/**
* arm_mbo_chain - helper function that arms an MBO chain for the HDM
* @c: pointer to interface channel
* @dir: direction of the channel
* @compl: pointer to completion function
*
* This allocates buffer objects including the containing DMA coherent
* buffer and puts them in the fifo.
* Buffers of Rx channels are put in the kthread fifo, hence immediately
* submitted to the HDM.
*
* Returns the number of allocated and enqueued MBOs.
*/
static int arm_mbo_chain(struct most_c_obj *c, int dir,
void (*compl)(struct mbo *))
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
unsigned int i;
int retval;
struct mbo *mbo;
u32 coherent_buf_size = c->cfg.buffer_size + c->cfg.extra_len;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
atomic_set(&c->mbo_nq_level, 0);
for (i = 0; i < c->cfg.num_buffers; i++) {
mbo = kzalloc(sizeof(*mbo), GFP_KERNEL);
if (!mbo) {
pr_info("WARN: Allocation of MBO failed.\n");
retval = i;
goto _exit;
}
mbo->context = c;
mbo->ifp = c->iface;
mbo->hdm_channel_id = c->channel_id;
mbo->virt_address = dma_alloc_coherent(NULL,
coherent_buf_size,
&mbo->bus_address,
GFP_KERNEL);
if (!mbo->virt_address) {
pr_info("WARN: No DMA coherent buffer.\n");
retval = i;
goto _error1;
}
mbo->complete = compl;
mbo->num_buffers_ptr = &dummy_num_buffers;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (dir == MOST_CH_RX) {
nq_hdm_mbo(mbo);
atomic_inc(&c->mbo_nq_level);
} else {
arm_mbo(mbo);
}
}
return i;
_error1:
kfree(mbo);
_exit:
return retval;
}
/**
* most_submit_mbo - submits an MBO to fifo
* @mbo: pointer to the MBO
*
*/
int most_submit_mbo(struct mbo *mbo)
{
struct most_c_obj *c;
struct most_inst_obj *i;
if (unlikely((!mbo) || (!mbo->context))) {
pr_err("Bad MBO or missing channel reference\n");
return -EINVAL;
}
c = mbo->context;
i = c->inst;
if (unlikely(atomic_read(&i->tainted)))
return -ENODEV;
nq_hdm_mbo(mbo);
return 0;
}
EXPORT_SYMBOL_GPL(most_submit_mbo);
/**
* most_write_completion - write completion handler
* @mbo: pointer to MBO
*
* This recycles the MBO for further usage. In case the channel has been
* poisoned, the MBO is scheduled to be trashed.
*/
static void most_write_completion(struct mbo *mbo)
{
struct most_c_obj *c;
BUG_ON((!mbo) || (!mbo->context));
c = mbo->context;
if (mbo->status == MBO_E_INVAL)
pr_info("WARN: Tx MBO status: invalid\n");
if (unlikely(c->is_poisoned || (mbo->status == MBO_E_CLOSE)))
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
trash_mbo(mbo);
else
arm_mbo(mbo);
}
/**
* get_channel_by_iface - get pointer to channel object
* @iface: pointer to interface instance
* @id: channel ID
*
* This retrieves a pointer to a channel of the given interface and channel ID.
*/
static struct
most_c_obj *get_channel_by_iface(struct most_interface *iface, int id)
{
struct most_inst_obj *i;
if (unlikely(!iface)) {
pr_err("Bad interface\n");
return NULL;
}
if (unlikely((id < 0) || (id >= iface->num_channels))) {
pr_err("Channel index (%d) out of range\n", id);
return NULL;
}
i = iface->priv;
if (unlikely(!i)) {
pr_err("interface is not registered\n");
return NULL;
}
return i->channel[id];
}
int channel_has_mbo(struct most_interface *iface, int id)
{
struct most_c_obj *c = get_channel_by_iface(iface, id);
unsigned long flags;
int empty;
if (unlikely(!c))
return -EINVAL;
spin_lock_irqsave(&c->fifo_lock, flags);
empty = list_empty(&c->fifo);
spin_unlock_irqrestore(&c->fifo_lock, flags);
return !empty;
}
EXPORT_SYMBOL_GPL(channel_has_mbo);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
/**
* most_get_mbo - get pointer to an MBO of pool
* @iface: pointer to interface instance
* @id: channel ID
*
* This attempts to get a free buffer out of the channel fifo.
* Returns a pointer to MBO on success or NULL otherwise.
*/
struct mbo *most_get_mbo(struct most_interface *iface, int id,
struct most_aim *aim)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
struct mbo *mbo;
struct most_c_obj *c;
unsigned long flags;
int *num_buffers_ptr;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
c = get_channel_by_iface(iface, id);
if (unlikely(!c))
return NULL;
if (c->aim0.refs && c->aim1.refs &&
((aim == c->aim0.ptr && c->aim0.num_buffers <= 0) ||
(aim == c->aim1.ptr && c->aim1.num_buffers <= 0)))
return NULL;
if (aim == c->aim0.ptr)
num_buffers_ptr = &c->aim0.num_buffers;
else if (aim == c->aim1.ptr)
num_buffers_ptr = &c->aim1.num_buffers;
else
num_buffers_ptr = &dummy_num_buffers;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
spin_lock_irqsave(&c->fifo_lock, flags);
if (list_empty(&c->fifo)) {
spin_unlock_irqrestore(&c->fifo_lock, flags);
return NULL;
}
mbo = list_pop_mbo(&c->fifo);
--*num_buffers_ptr;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
spin_unlock_irqrestore(&c->fifo_lock, flags);
mbo->num_buffers_ptr = num_buffers_ptr;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
mbo->buffer_length = c->cfg.buffer_size;
return mbo;
}
EXPORT_SYMBOL_GPL(most_get_mbo);
/**
* most_put_mbo - return buffer to pool
* @mbo: buffer object
*/
void most_put_mbo(struct mbo *mbo)
{
struct most_c_obj *c;
struct most_inst_obj *i;
c = mbo->context;
i = c->inst;
if (unlikely(atomic_read(&i->tainted))) {
mbo->status = MBO_E_CLOSE;
trash_mbo(mbo);
return;
}
if (c->cfg.direction == MOST_CH_TX) {
arm_mbo(mbo);
return;
}
nq_hdm_mbo(mbo);
atomic_inc(&c->mbo_nq_level);
}
EXPORT_SYMBOL_GPL(most_put_mbo);
/**
* most_read_completion - read completion handler
* @mbo: pointer to MBO
*
* This function is called by the HDM when data has been received from the
* hardware and copied to the buffer of the MBO.
*
* In case the channel has been poisoned it puts the buffer in the trash queue.
* Otherwise, it passes the buffer to an AIM for further processing.
*/
static void most_read_completion(struct mbo *mbo)
{
struct most_c_obj *c = mbo->context;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (unlikely(c->is_poisoned || (mbo->status == MBO_E_CLOSE))) {
trash_mbo(mbo);
return;
}
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (mbo->status == MBO_E_INVAL) {
nq_hdm_mbo(mbo);
atomic_inc(&c->mbo_nq_level);
return;
}
if (atomic_sub_and_test(1, &c->mbo_nq_level)) {
pr_info("WARN: rx device out of buffers\n");
c->is_starving = 1;
}
if (c->aim0.refs && c->aim0.ptr->rx_completion &&
c->aim0.ptr->rx_completion(mbo) == 0)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return;
if (c->aim1.refs && c->aim1.ptr->rx_completion &&
c->aim1.ptr->rx_completion(mbo) == 0)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return;
most_put_mbo(mbo);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
}
/**
* most_start_channel - prepares a channel for communication
* @iface: pointer to interface instance
* @id: channel ID
*
* This prepares the channel for usage. Cross-checks whether the
* channel's been properly configured.
*
* Returns 0 on success or error code otherwise.
*/
int most_start_channel(struct most_interface *iface, int id,
struct most_aim *aim)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
int num_buffer;
int ret;
struct most_c_obj *c = get_channel_by_iface(iface, id);
if (unlikely(!c))
return -EINVAL;
mutex_lock(&c->start_mutex);
if (c->aim0.refs + c->aim1.refs > 0)
goto out; /* already started by other aim */
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
if (!try_module_get(iface->mod)) {
pr_info("failed to acquire HDM lock\n");
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return -ENOLCK;
}
modref++;
c->cfg.extra_len = 0;
if (c->iface->configure(c->iface, c->channel_id, &c->cfg)) {
pr_info("channel configuration failed. Go check settings...\n");
ret = -EINVAL;
goto error;
}
init_waitqueue_head(&c->hdm_fifo_wq);
if (c->cfg.direction == MOST_CH_RX)
num_buffer = arm_mbo_chain(c, c->cfg.direction,
most_read_completion);
else
num_buffer = arm_mbo_chain(c, c->cfg.direction,
most_write_completion);
if (unlikely(!num_buffer)) {
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
pr_info("failed to allocate memory\n");
ret = -ENOMEM;
goto error;
}
ret = run_enqueue_thread(c, id);
if (ret)
goto error;
c->is_starving = 0;
c->aim0.num_buffers = c->cfg.num_buffers / 2;
c->aim1.num_buffers = c->cfg.num_buffers - c->aim0.num_buffers;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
atomic_set(&c->mbo_ref, num_buffer);
out:
if (aim == c->aim0.ptr)
c->aim0.refs++;
if (aim == c->aim1.ptr)
c->aim1.refs++;
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return 0;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
error:
if (iface->mod)
module_put(iface->mod);
modref--;
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return ret;
}
EXPORT_SYMBOL_GPL(most_start_channel);
/**
* most_stop_channel - stops a running channel
* @iface: pointer to interface instance
* @id: channel ID
*/
int most_stop_channel(struct most_interface *iface, int id,
struct most_aim *aim)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
{
struct most_c_obj *c;
if (unlikely((!iface) || (id >= iface->num_channels) || (id < 0))) {
pr_err("Bad interface or index out of range\n");
return -EINVAL;
}
c = get_channel_by_iface(iface, id);
if (unlikely(!c))
return -EINVAL;
mutex_lock(&c->start_mutex);
if (c->aim0.refs + c->aim1.refs >= 2)
goto out;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
mutex_lock(&c->stop_task_mutex);
if (c->hdm_enqueue_task)
kthread_stop(c->hdm_enqueue_task);
c->hdm_enqueue_task = NULL;
mutex_unlock(&c->stop_task_mutex);
mutex_lock(&deregister_mutex);
if (atomic_read(&c->inst->tainted)) {
mutex_unlock(&deregister_mutex);
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return -ENODEV;
}
mutex_unlock(&deregister_mutex);
if (iface->mod && modref) {
module_put(iface->mod);
modref--;
}
c->is_poisoned = true;
if (c->iface->poison_channel(c->iface, c->channel_id)) {
pr_err("Cannot stop channel %d of mdev %s\n", c->channel_id,
c->iface->description);
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return -EAGAIN;
}
flush_trash_fifo(c);
flush_channel_fifos(c);
#ifdef CMPL_INTERRUPTIBLE
if (wait_for_completion_interruptible(&c->cleanup)) {
pr_info("Interrupted while clean up ch %d\n", c->channel_id);
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return -EINTR;
}
#else
wait_for_completion(&c->cleanup);
#endif
c->is_poisoned = false;
out:
if (aim == c->aim0.ptr)
c->aim0.refs--;
if (aim == c->aim1.ptr)
c->aim1.refs--;
mutex_unlock(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
return 0;
}
EXPORT_SYMBOL_GPL(most_stop_channel);
/**
* most_register_aim - registers an AIM (driver) with the core
* @aim: instance of AIM to be registered
*/
int most_register_aim(struct most_aim *aim)
{
struct most_aim_obj *aim_obj;
if (!aim) {
pr_err("Bad driver\n");
return -EINVAL;
}
aim_obj = create_most_aim_obj(aim->name);
if (!aim_obj) {
pr_info("failed to alloc driver object\n");
return -ENOMEM;
}
aim_obj->driver = aim;
aim->context = aim_obj;
pr_info("registered new application interfacing module %s\n",
aim->name);
list_add_tail(&aim_obj->list, &aim_list);
return 0;
}
EXPORT_SYMBOL_GPL(most_register_aim);
/**
* most_deregister_aim - deregisters an AIM (driver) with the core
* @aim: AIM to be removed
*/
int most_deregister_aim(struct most_aim *aim)
{
struct most_aim_obj *aim_obj;
struct most_c_obj *c, *tmp;
struct most_inst_obj *i, *i_tmp;
if (!aim) {
pr_err("Bad driver\n");
return -EINVAL;
}
aim_obj = aim->context;
if (!aim_obj) {
pr_info("driver not registered.\n");
return -EINVAL;
}
list_for_each_entry_safe(i, i_tmp, &instance_list, list) {
list_for_each_entry_safe(c, tmp, &i->channel_list, list) {
if (c->aim0.ptr == aim || c->aim1.ptr == aim)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
aim->disconnect_channel(
c->iface, c->channel_id);
if (c->aim0.ptr == aim)
c->aim0.ptr = NULL;
if (c->aim1.ptr == aim)
c->aim1.ptr = NULL;
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
}
}
list_del(&aim_obj->list);
destroy_most_aim_obj(aim_obj);
pr_info("deregistering application interfacing module %s\n", aim->name);
return 0;
}
EXPORT_SYMBOL_GPL(most_deregister_aim);
/**
* most_register_interface - registers an interface with core
* @iface: pointer to the instance of the interface description.
*
* Allocates and initializes a new interface instance and all of its channels.
* Returns a pointer to kobject or an error pointer.
*/
struct kobject *most_register_interface(struct most_interface *iface)
{
unsigned int i;
int id;
char name[STRING_SIZE];
char channel_name[STRING_SIZE];
struct most_c_obj *c;
struct most_inst_obj *inst;
if (!iface || !iface->enqueue || !iface->configure ||
!iface->poison_channel || (iface->num_channels > MAX_CHANNELS)) {
pr_err("Bad interface or channel overflow\n");
return ERR_PTR(-EINVAL);
}
id = ida_simple_get(&mdev_id, 0, 0, GFP_KERNEL);
if (id < 0) {
pr_info("Failed to alloc mdev ID\n");
return ERR_PTR(id);
}
snprintf(name, STRING_SIZE, "mdev%d", id);
inst = create_most_inst_obj(name);
if (!inst) {
pr_info("Failed to allocate interface instance\n");
return ERR_PTR(-ENOMEM);
}
iface->priv = inst;
INIT_LIST_HEAD(&inst->channel_list);
inst->iface = iface;
inst->dev_id = id;
atomic_set(&inst->tainted, 0);
list_add_tail(&inst->list, &instance_list);
for (i = 0; i < iface->num_channels; i++) {
const char *name_suffix = iface->channel_vector[i].name_suffix;
if (!name_suffix)
snprintf(channel_name, STRING_SIZE, "ch%d", i);
else if (name_suffix[0] == '@')
snprintf(channel_name, STRING_SIZE, "ch%d%s", i,
name_suffix);
else
snprintf(channel_name, STRING_SIZE, "%s", name_suffix);
/* this increments the reference count of this instance */
c = create_most_c_obj(channel_name, &inst->kobj);
if (!c)
goto free_instance;
inst->channel[i] = c;
c->is_starving = 0;
c->iface = iface;
c->inst = inst;
c->channel_id = i;
c->keep_mbo = false;
c->enqueue_halt = false;
c->is_poisoned = false;
c->cfg.direction = 0;
c->cfg.data_type = 0;
c->cfg.num_buffers = 0;
c->cfg.buffer_size = 0;
c->cfg.subbuffer_size = 0;
c->cfg.packets_per_xact = 0;
spin_lock_init(&c->fifo_lock);
INIT_LIST_HEAD(&c->fifo);
INIT_LIST_HEAD(&c->trash_fifo);
INIT_LIST_HEAD(&c->halt_fifo);
init_completion(&c->cleanup);
atomic_set(&c->mbo_ref, 0);
mutex_init(&c->start_mutex);
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
mutex_init(&c->stop_task_mutex);
list_add_tail(&c->list, &inst->channel_list);
}
pr_info("registered new MOST device mdev%d (%s)\n",
inst->dev_id, iface->description);
return &inst->kobj;
free_instance:
pr_info("Failed allocate channel(s)\n");
list_del(&inst->list);
destroy_most_inst_obj(inst);
return ERR_PTR(-ENOMEM);
}
EXPORT_SYMBOL_GPL(most_register_interface);
/**
* most_deregister_interface - deregisters an interface with core
* @iface: pointer to the interface instance description.
*
* Before removing an interface instance from the list, all running
* channels are stopped and poisoned.
*/
void most_deregister_interface(struct most_interface *iface)
{
struct most_inst_obj *i = iface->priv;
struct most_c_obj *c;
mutex_lock(&deregister_mutex);
if (unlikely(!i)) {
pr_info("Bad Interface\n");
mutex_unlock(&deregister_mutex);
return;
}
pr_info("deregistering MOST device %s (%s)\n", i->kobj.name,
iface->description);
atomic_set(&i->tainted, 1);
mutex_unlock(&deregister_mutex);
while (modref) {
if (iface->mod && modref)
module_put(iface->mod);
modref--;
}
list_for_each_entry(c, &i->channel_list, list) {
if (c->aim0.refs + c->aim1.refs <= 0)
Staging: most: add MOST driver's core module This patch adds the core module of the MOST driver to the kernel's driver staging area. This module is part of the MOST driver and handles the configuration interface in sysfs, the buffer management and the data routing. MOST defines the protocol, hardware and software layers necessary to allow for the efficient and low-cost transport of control, real-time and packet data using a single medium (physical layer). Media currently in use are fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST also supports various speed grades up to 150 Mbps. For more information on MOST, visit the MOST Cooperation website: www.mostcooperation.com. Cars continue to evolve into sophisticated consumer electronics platforms, increasing the demand for reliable and simple solutions to support audio, video and data communications. MOST can be used to connect multiple consumer devices via optical or electrical physical layers directly to one another or in a network configuration. As a synchronous network, MOST provides excellent Quality of Service and seamless connectivity for audio/video streaming. Therefore, the driver perfectly fits to the mission of Automotive Grade Linux to create open source software solutions for automotive applications. The driver consists basically of three layers. The hardware layer, the core layer and the application layer. The core layer consists of the core module only. This module handles the communication flow through all three layers, the configuration of the driver, the configuration interface representation in sysfs, and the buffer management. For each of the other two layers a selection of modules is provided. These modules can arbitrarily be combined to meet the needs of the desired system architecture. A module of the hardware layer is referred to as an HDM (hardware dependent module). Each module of this layer handles exactly one of the peripheral interfaces of a network interface controller (e.g. USB, MediaLB, I2C). A module of the application layer is referred to as an AIM (application interfacing module). The modules of this layer give access to MOST via one the following ways: character devices, ALSA, Networking or V4L2. To physically access MOST, an Intelligent Network Interface Controller (INIC) is needed. For more information on available controllers visit: www.microchip.com Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-07-24 14:11:48 +00:00
continue;
mutex_lock(&c->stop_task_mutex);
if (c->hdm_enqueue_task)
kthread_stop(c->hdm_enqueue_task);
c->hdm_enqueue_task = NULL;
mutex_unlock(&c->stop_task_mutex);
if (iface->poison_channel(iface, c->channel_id))
pr_err("Can't poison channel %d\n", c->channel_id);
}
ida_simple_remove(&mdev_id, i->dev_id);
list_del(&i->list);
destroy_most_inst_obj(i);
}
EXPORT_SYMBOL_GPL(most_deregister_interface);
/**
* most_stop_enqueue - prevents core from enqueueing MBOs
* @iface: pointer to interface
* @id: channel id
*
* This is called by an HDM that _cannot_ attend to its duties and
* is imminent to get run over by the core. The core is not going to
* enqueue any further packets unless the flagging HDM calls
* most_resume enqueue().
*/
void most_stop_enqueue(struct most_interface *iface, int id)
{
struct most_c_obj *c = get_channel_by_iface(iface, id);
if (likely(c))
c->enqueue_halt = true;
}
EXPORT_SYMBOL_GPL(most_stop_enqueue);
/**
* most_resume_enqueue - allow core to enqueue MBOs again
* @iface: pointer to interface
* @id: channel id
*
* This clears the enqueue halt flag and enqueues all MBOs currently
* sitting in the wait fifo.
*/
void most_resume_enqueue(struct most_interface *iface, int id)
{
struct most_c_obj *c = get_channel_by_iface(iface, id);
if (unlikely(!c))
return;
c->enqueue_halt = false;
wake_up_interruptible(&c->hdm_fifo_wq);
}
EXPORT_SYMBOL_GPL(most_resume_enqueue);
static int __init most_init(void)
{
pr_info("init()\n");
INIT_LIST_HEAD(&instance_list);
INIT_LIST_HEAD(&aim_list);
mutex_init(&deregister_mutex);
ida_init(&mdev_id);
if (bus_register(&most_bus)) {
pr_info("Cannot register most bus\n");
goto exit;
}
most_class = class_create(THIS_MODULE, "most");
if (IS_ERR(most_class)) {
pr_info("No udev support.\n");
goto exit_bus;
}
if (driver_register(&mostcore)) {
pr_info("Cannot register core driver\n");
goto exit_class;
}
class_glue_dir =
device_create(most_class, NULL, 0, NULL, "mostcore");
if (!class_glue_dir)
goto exit_driver;
most_aim_kset =
kset_create_and_add("aims", NULL, &class_glue_dir->kobj);
if (!most_aim_kset)
goto exit_class_container;
most_inst_kset =
kset_create_and_add("devices", NULL, &class_glue_dir->kobj);
if (!most_inst_kset)
goto exit_driver_kset;
return 0;
exit_driver_kset:
kset_unregister(most_aim_kset);
exit_class_container:
device_destroy(most_class, 0);
exit_driver:
driver_unregister(&mostcore);
exit_class:
class_destroy(most_class);
exit_bus:
bus_unregister(&most_bus);
exit:
return -ENOMEM;
}
static void __exit most_exit(void)
{
struct most_inst_obj *i, *i_tmp;
struct most_aim_obj *d, *d_tmp;
pr_info("exit core module\n");
list_for_each_entry_safe(d, d_tmp, &aim_list, list) {
destroy_most_aim_obj(d);
}
list_for_each_entry_safe(i, i_tmp, &instance_list, list) {
list_del(&i->list);
destroy_most_inst_obj(i);
}
kset_unregister(most_inst_kset);
kset_unregister(most_aim_kset);
device_destroy(most_class, 0);
driver_unregister(&mostcore);
class_destroy(most_class);
bus_unregister(&most_bus);
ida_destroy(&mdev_id);
}
module_init(most_init);
module_exit(most_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Christian Gromm <christian.gromm@microchip.com>");
MODULE_DESCRIPTION("Core module of stacked MOST Linux driver");