blob: f8373751c3a2c39f5df76d668c546a76845bff92 [file] [log] [blame]
/*
<:copyright-BRCM:2016:DUAL/GPL:standard
Broadcom Proprietary and Confidential.(c) 2016 Broadcom
All Rights Reserved
Unless you and Broadcom execute a separate written software license
agreement governing use of this software, this software is licensed
to you under the terms of the GNU General Public License version 2
(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
with the following added to such license:
As a special exception, the copyright holders of this software give
you permission to link this software with independent modules, and
to copy and distribute the resulting executable under terms of your
choice, provided that you also meet, for each linked independent
module, the terms and conditions of the license of that module.
An independent module is a module which is not derived from this
software. The special exception does not apply to any modifications
of the software.
Not withstanding the above, under no circumstances may you combine
this software in any way with any other Broadcom software provided
under a license other than the GPL, without Broadcom's express prior
written consent.
:>
*/
#ifndef BCMOLT_TR_MUX_H_
#define BCMOLT_TR_MUX_H_
/** \defgroup tr_mux Transport Multiplexer
* - PCIe channel multiplexer
* - locally/remotely - terminated message multiplexer
* - autonomous messages de-multiplexer
* @{
*/
#include <bcmolt_msg.h>
#ifndef IN_BAND
#include <bcmtr_pcie_sw_queue.h>
#endif
/* Message destination: local or remote */
typedef enum
{
BCMTRMUX_DEST_LOCAL,
BCMTRMUX_DEST_REMOTE,
} bcmtrmux_msg_dest;
typedef bcmtrmux_msg_dest (*bcmtrmux_msg_filter_cb_t)(bcmolt_devid, bcmolt_obj_id obj, bcmolt_mgt_group group, uint16_t subgroup);
/** Initialize mux service
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_init(bcmtrmux_msg_filter_cb_t msg_filter_cb);
/** Notify mux driver that low-level transport connection is ready
* \returns: 0 in case of success or error code < 0
*/
#ifdef IN_BAND
bcmos_errno bcmtrmux_connect(bcmolt_devid device, bcmos_ipv4_address ip_address, uint16_t udp_port);
#else
bcmos_errno bcmtrmux_connect(bcmolt_devid device, uint32_t txq_size, uint32_t rxq_size);
#endif
/** Notify mux driver that low-level transport connection is disconnected
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_disconnect(bcmolt_devid device);
/** Cleanup and exit
*/
void bcmtrmux_exit(void);
/*
* PCIe channel multiplexer
*/
/** Logical channel id */
typedef int bcmtrmux_channel;
/** Mux statistics */
typedef struct bcmtrmux_stat
{
uint32_t tx_remote; /**< Attempted transmit to device (incuding discards) */
uint32_t tx_local; /**< Attempted "transmit" to device control */
uint32_t tx_disc_remote; /**< Discarded when transmitting to remote device (not ready or queue overflow) */
uint32_t tx_disc_local; /**< Couldn't deliver to device control. No handler */
uint32_t rx_remote; /**< Received from device */
uint32_t rx_local; /**< Message from the line intercepted by device control */
uint32_t rx_auto; /**< Received autonomous messages */
uint32_t control_to_host; /**< Sent by device control to the host */
uint32_t control_to_line; /**< Sent by device control to line */
uint32_t rx_disc_remote; /**< Discarded packets received from device. Can't demux channel */
uint32_t rx_disc_auto; /**< Discarded autonomous messages. Can't demux auto message */
uint32_t rx_disc_local; /**< Discarded packets received from device control. Can't demux channel */
uint32_t rx_disc_inv_ch; /**< Discarded because channel is invalid */
uint32_t rx_poll_urgent; /**< Urgent buffers counted by bcmtr_sw_queue_rx_poll() */
uint32_t rx_poll_normal; /**< Normal buffers counted by bcmtr_sw_queue_rx_poll() */
} bcmtrmux_stat;
/** Max number of channels per device */
#define BCMTRMUX_MAX_CHANNELS 32
/** First urgent channel */
#ifndef IN_BAND
#define BCMTRMUX_FIRST_URGENT_CHANNEL BCMTR_SWQ_FIRST_URGENT_CHANNEL
#if BCMTRMUX_FIRST_URGENT_CHANNEL >= BCMTRMUX_MAX_CHANNELS
#error BCMTRMUX_FIRST_URGENT_CHANNEL and BCMTRMUX_MAX_CHANNELS settings are inconsistent
#endif
#else
#define BCMTRMUX_FIRST_URGENT_CHANNEL (BCMTRMUX_MAX_CHANNELS - 1) /* Urgent channel is not supported for INBAND. */
#endif
/** Auto-assign channel */
#define BCMTRMUX_CHANNEL_AUTO_ASSIGN (-1)
/** Channel id reserved for autonomous/proxy messages */
#define BCMTRMUX_CHANNEL_AUTO_PROXY 0
/** Channel id reserved for device control */
#define BCMTRMUX_CHANNEL_DEV_CONTROL 1
/** First channel id that is not reserved */
#define BCMTRMUX_CHANNEL_FIRST_FREE (BCMTRMUX_CHANNEL_DEV_CONTROL + 1)
/** Receive message handler */
typedef void (*f_bcmtr_rx_handler)(bcmolt_devid device, bcmos_buf *buf, bcmtrmux_channel channel, void *data);
/** Local receive message handler */
typedef void (*f_bcmtr_local_rx_handler)(bcmolt_devid device, bcmolt_msg *msg, void *data);
/** Register PCIe channel owner
*
* \param[in] device Maple device index
* \param[in,out] channel Logical PCIe channel id.
* If BCMTRMUX_CHANNEL_AUTO_ASSIGN, unused channel is allocated internally.
* \param[in] rx Receive callback that should be used for packets received over channel
* \param[in] data Data to be passed to receive callback
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_channel_register(bcmolt_devid device, bcmtrmux_channel *channel,
f_bcmtr_rx_handler rx, void *data);
/** Release PCIe channel allocated by bcmtrmux_channel_register()
*
* \param[in] device Maple device index
* \param[in] channel
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_channel_unregister(bcmolt_devid device, bcmtrmux_channel channel);
/** Receive message from host application
*
* This function is called for messages transmitted from the host.
* Message can be locally or remotely terminated
* \param[in] device Maple device index
* \param[in] channel Logical channel
* \param[in] buf Buffer to be transmitted
*/
void bcmtrmux_rx_from_host(bcmolt_devid device, bcmtrmux_channel channel, bcmos_buf *buf);
/** Receive packet from PCIe interface
*
* \param[in] device Maple device index
* \param[in] channel Logical channel
* \param[in] buf Buffer to be forwarded to application.
* It is de-allocated automatically
*/
void bcmtrmux_rx_from_line(bcmolt_devid device, bcmtrmux_channel channel, bcmos_buf *buf);
/** Send packet from local control process to the host application
*
* \param[in] device Maple device index
* \param[in] msg Message to be sent to host application.
* Attention! It is responsibility of the caller to release the message
* after return from this function - if necessary.
* The reason for this is that it is expected that often msg will be allocated on stack.
* It is also responsibility of the caller to make sure that msg->subch is set correctly
* - preserved for request/response exchange
* - set = BCMTRMUX_CHANNEL_AUTO_PROXY for autonomous indications
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_control_to_host(bcmolt_devid device, bcmolt_msg *msg);
/** Send packet from local control process to the embedded system
*
* \param[in] device Maple device index
* \param[in] msg Message to be sent to the embedded system.
* Attention! It is responsibility of the caller to release the message
* after return from this function - if necessary.
* The reason for this is that it is expected that often msg will be allocated on stack.
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_control_to_line(bcmolt_devid device, bcmolt_msg *msg);
/** Register message for intercept by dev_ctrl
*
* Matched message receive from the line will be intercepted and
* delivered to callback registered using bcmtrmux_local_handler_register()
*
* \param[in] device Maple device index
* \param[in] object Object for which message is to be intercepted
* \param[in] subgroup Message subgroup
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_control_auto_intercept_filter(bcmolt_devid device, bcmolt_obj_id object, uint16_t subgroup);
/*
* Local termination handler
*/
/** Register local termination handler.
*
* This handler is called for messages transmitted by host application
* that should be terminated locally by device control driver and
* for messages received from the line that match bcmtrmux_control_auto_intercept_filter()
*
* \param[in] device Maple device index
* \param[in] rx Receive callback that should be used for locally-terminated packets.
* It must release the buffer when no longer needed
* \param[in] data Data to be passed to receive callback
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_local_handler_register(bcmolt_devid device, f_bcmtr_local_rx_handler rx, void *data);
/** Unregister local termination handler registered by bcmtrmux_local_handler_register()
*
* \param[in] device Maple device index
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_local_handler_unregister(bcmolt_devid device);
/** Get transport mux statistics.
*
* \param[in] device Maple device index
* \param[out] stat Statistics
* \returns: 0 in case of success or error code < 0
*/
bcmos_errno bcmtrmux_stat_get(bcmolt_devid device, bcmtrmux_stat *stat);
#endif