_mbo; \
})
-/* ___ ___
- * ___C H A N N E L___
- */
-
/**
* most_free_mbo_coherent - free an MBO and its coherent buffer
- * @mbo: buffer to be released
- *
+ * @mbo: most buffer
*/
static void most_free_mbo_coherent(struct mbo *mbo)
{
NULL,
};
-/* ___ ___
- * ___I N S T A N C E___
- */
static ssize_t description_show(struct device *dev,
struct device_attribute *attr,
char *buf)
NULL,
};
-/* ___ ___
- * ___A I M___
- */
static struct core_component *match_module(char *name)
{
struct core_component *comp;
return offs;
}
/**
- * split_string - parses and changes string in the buffer buf and
- * splits it into two mandatory and one optional substrings.
+ * split_string - parses buf and extracts ':' separated 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)
+ * @a: storage for 1st substring (=interface name)
+ * @b: storage for 2nd substring (=channel name)
+ * @c: storage for 3rd substring (=component name)
+ * @d: storage optional 4th substring (=user defined name)
*
* Examples:
*
- * Input: "mdev0:ch6:my_channel\n" or
- * "mdev0:ch6:my_channel"
+ * Input: "mdev0:ch6:cdev:my_channel\n" or
+ * "mdev0:ch6:cdev:my_channel"
*
- * Output: *a -> "mdev0", *b -> "ch6", *c -> "my_channel"
+ * Output: *a -> "mdev0", *b -> "ch6", *c -> "cdev" *d -> "my_channel"
*
- * Input: "mdev1:ep81\n"
- * Output: *a -> "mdev1", *b -> "ep81", *c -> ""
+ * Input: "mdev1:ep81:cdev\n"
+ * Output: *a -> "mdev1", *b -> "ep81", *c -> "cdev" *d -> ""
*
* Input: "mdev1:ep81"
- * Output: *a -> "mdev1", *b -> "ep81", *c == NULL
+ * Output: *a -> "mdev1", *b -> "ep81", *c -> "cdev" *d == NULL
*/
static int split_string(char *buf, char **a, char **b, char **c, char **d)
{
}
/**
- * get_channel - 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.
+ * get_channel - get pointer to channel
+ * @mdev: name of the device interface
+ * @mdev_ch: name of channel
*/
static struct most_channel *get_channel(char *mdev, char *mdev_ch)
{
}
/**
- * add_link_store - store() function for add_link attribute
- * @aim_obj: pointer to AIM object
- * @attr: its attributes
+ * add_link_store - store function for add_link attribute
+ * @drv: device driver
* @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
+ * four substrings. Note: last substring is optional. In case a cdev
+ * component is loaded the optional 4th 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
+ * Searches for (device, channel) pair and probes the component
*
* Example:
- * (1) echo "mdev0:ch6:my_rxchannel" >add_link
- * (2) echo "mdev1:ep81" >add_link
+ * (1) echo "mdev0:ch6:cdev:my_rxchannel" >add_link
+ * (2) echo "mdev1:ep81:cdev" >add_link
*
* (1) would create the device node /dev/my_rxchannel
* (2) would create the device node /dev/mdev1-ep81
/**
* remove_link_store - store function for remove_link attribute
- * @aim_obj: pointer to AIM object
- * @attr: its attributes
+ * @drv: device driver
* @buf: buffer
* @len: buffer length
*
NULL,
};
-/* ___ ___
- * ___C O R E___
- */
-
int most_match(struct device *dev, struct device_driver *drv)
{
if (!strcmp(dev_name(dev), "most"))
/**
* arm_mbo - recycle MBO for further usage
- * @mbo: buffer object
+ * @mbo: most buffer
*
* 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.
+ * Calls the completion handler of an attached component.
*/
static void arm_mbo(struct mbo *mbo)
{
/**
* most_submit_mbo - submits an MBO to fifo
- * @mbo: pointer to the MBO
+ * @mbo: most buffer
*/
void most_submit_mbo(struct mbo *mbo)
{
/**
* most_write_completion - write completion handler
- * @mbo: pointer to MBO
+ * @mbo: most buffer
*
* This recycles the MBO for further usage. In case the channel has been
* poisoned, the MBO is scheduled to be trashed.
* most_get_mbo - get pointer to an MBO of pool
* @iface: pointer to interface instance
* @id: channel ID
+ * @comp: driver component
*
* This attempts to get a free buffer out of the channel fifo.
* Returns a pointer to MBO on success or NULL otherwise.
/**
* most_put_mbo - return buffer to pool
- * @mbo: buffer object
+ * @mbo: most buffer
*/
void most_put_mbo(struct mbo *mbo)
{
/**
* most_read_completion - read completion handler
- * @mbo: pointer to MBO
+ * @mbo: most buffer
*
* 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.
+ * Otherwise, it passes the buffer to an component for further processing.
*/
static void most_read_completion(struct mbo *mbo)
{
* most_start_channel - prepares a channel for communication
* @iface: pointer to interface instance
* @id: channel ID
+ * @comp: driver component
*
* This prepares the channel for usage. Cross-checks whether the
* channel's been properly configured.
mutex_lock(&c->start_mutex);
if (c->pipe0.refs + c->pipe1.refs > 0)
- goto out; /* already started by other comp */
+ goto out; /* already started by another component */
if (!try_module_get(iface->mod)) {
pr_info("failed to acquire HDM lock\n");
* most_stop_channel - stops a running channel
* @iface: pointer to interface instance
* @id: channel ID
+ * @comp: driver component
*/
int most_stop_channel(struct most_interface *iface, int id,
struct core_component *comp)
EXPORT_SYMBOL_GPL(most_stop_channel);
/**
- * most_register_component - registers an AIM (driver) with the core
- * @aim: instance of AIM to be registered
+ * most_register_component - registers a driver component with the core
+ * @comp: driver component
*/
int most_register_component(struct core_component *comp)
{
if (!comp) {
- pr_err("Bad driver\n");
+ pr_err("Bad component\n");
return -EINVAL;
}
list_add_tail(&comp->list, &mc.comp_list);
- pr_info("registered new application interfacing module %s\n", comp->name);
+ pr_info("registered new core component %s\n", comp->name);
return 0;
}
EXPORT_SYMBOL_GPL(most_register_component);
}
/**
- * most_deregister_component - deregisters an AIM (driver) with the core
- * @aim: AIM to be removed
+ * most_deregister_component - deregisters a driver component with the core
+ * @comp: driver component
*/
int most_deregister_component(struct core_component *comp)
{
if (!comp) {
- pr_err("Bad driver\n");
+ pr_err("Bad component\n");
return -EINVAL;
}
bus_for_each_dev(&mc.bus, NULL, comp, disconnect_channels);
list_del(&comp->list);
- pr_info("deregistering module %s\n", comp->name);
+ pr_info("deregistering component %s\n", comp->name);
return 0;
}
EXPORT_SYMBOL_GPL(most_deregister_component);
/**
* most_register_interface - registers an interface with core
- * @iface: pointer to the instance of the interface description.
+ * @iface: device interface
*
* Allocates and initializes a new interface instance and all of its channels.
* Returns a pointer to kobject or an error pointer.
mutex_init(&c->nq_mutex);
list_add_tail(&c->list, &iface->p->channel_list);
}
- pr_info("registered new MOST device mdev%d (%s)\n",
+ pr_info("registered new device mdev%d (%s)\n",
id, iface->description);
return 0;
/**
* most_deregister_interface - deregisters an interface with core
- * @iface: pointer to the interface instance description.
+ * @iface: device interface
*
* Before removing an interface instance from the list, all running
* channels are stopped and poisoned.
int i;
struct most_channel *c;
- pr_info("deregistering MOST device %s (%s)\n", dev_name(&iface->dev), iface->description);
+ pr_info("deregistering device %s (%s)\n", dev_name(&iface->dev), iface->description);
for (i = 0; i < iface->num_channels; i++) {
c = iface->p->channel[i];
if (c->pipe0.comp)
// SPDX-License-Identifier: GPL-2.0
/*
- * most.h - Interface between MostCore,
- * Hardware Dependent Module (HDM) and Application Interface Module (AIM).
+ * most.h - API for component and adapter drivers
*
* Copyright (C) 2013-2015, Microchip Technology Germany II GmbH & Co. KG
*/
-/*
- * Authors:
- * Andrey Shvetsov <andrey.shvetsov@k2l.de>
- * Christian Gromm <christian.gromm@microchip.com>
- * Sebastian Graf
- */
-
#ifndef __MOST_CORE_H__
#define __MOST_CORE_H__
* The value is bitwise OR-combination of the values from the
* enumeration most_channel_data_type. Zero is allowed value and means
* "channel may not be used".
- * @num_buffer_packet: Maximum number of buffers supported by this channel
+ * @num_buffers_packet: Maximum number of buffers supported by this channel
* for packet data types (Async,Control,QoS)
* @buffer_size_packet: Maximum buffer size supported by this channel
* for packet data types (Async,Control,QoS)
- * @num_buffer_streaming: Maximum number of buffers supported by this channel
+ * @num_buffers_streaming: Maximum number of buffers supported by this channel
* for streaming data types (Sync,AV Packetized)
* @buffer_size_streaming: Maximum buffer size supported by this channel
* for streaming data types (Sync,AV Packetized)
* @name_suffix: Optional suffix providean by an HDM that is attached to the
* regular channel name.
*
- * Describes the capabilities of a MostCore channel like supported Data Types
+ * Describes the capabilities of a MOST channel like supported Data Types
* and directions. This information is provided by an HDM for the MostCore.
*
* The Core creates read only sysfs attribute files in
- * /sys/devices/virtual/most/mostcore/devices/mdev-#/mdev#-ch#/ with the
+ * /sys/devices/most/mdev#/<channel>/ with the
* following attributes:
* -available_directions
* -available_datatypes
* @packets_per_xact: number of MOST frames that are packet inside one USB
* packet. This is USB specific
*
- * Describes the configuration for a MostCore channel. This information is
+ * Describes the configuration for a MOST channel. This information is
* provided from the MostCore to a HDM (like the Medusa PCIe Interface) as a
* parameter of the "configure" function call.
*/
*
* @list: list head for use by the mbo's current owner
* @ifp: (in) associated interface instance
+ * @num_buffers_ptr: amount of pool buffers
* @hdm_channel_id: (in) HDM channel instance
* @virt_address: (in) kernel virtual address of the buffer
* @bus_address: (in) bus address of the buffer
* @status: (out) transfer status
* @complete: (in) completion routine
*
- * The MostCore allocates and initializes the MBO.
+ * The core allocates and initializes the MBO.
*
- * The HDM receives MBO for transfer from MostCore with the call to enqueue().
+ * The HDM receives MBO for transfer from the core with the call to enqueue().
* The HDM copies the data to- or from the buffer depending on configured
* channel direction, set "processed_length" and "status" and completes
* the transfer procedure by calling the completion routine.
*
- * At the end the MostCore deallocates the MBO or recycles it for further
- * transfers for the same or different HDM.
+ * Finally, the MBO is being deallocated or recycled for further
+ * transfers of the same or a different HDM.
*
* Directions of usage:
* The core driver should never access any MBO fields (even if marked
/**
* Interface instance description.
*
- * Describes one instance of an interface like Medusa PCIe or Vantage USB.
+ * Describes an interface of a MOST device the core driver is bound to.
* This structure is allocated and initialized in the HDM. MostCore may not
* modify this structure.
*
+ * @dev: the actual device
+ * @mod: module
* @interface Interface type. \sa most_interface_type.
* @description PRELIMINARY.
* Unique description of the device instance from point of view of the
#define to_most_interface(d) container_of(d, struct most_interface, dev)
/**
- * struct most_aim - identifies MOST device driver to mostcore
- * @name: Driver name
+ * struct core_component - identifies a loadable component for the mostcore
+ * @list: list_head
+ * @name: component name
* @probe_channel: function for core to notify driver about channel connection
* @disconnect_channel: callback function to disconnect a certain channel
* @rx_completion: completion handler for received packets
* @tx_completion: completion handler for transmitted packets
- * @context: context pointer to be used by mostcore
*/
struct core_component {
struct list_head list;