blob: 3b03e2947ee13a9adc792b9510e7d0f04caa6707 [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 BCMTR_INTERNAL_H_
#define BCMTR_INTERNAL_H_
#include <bcmos_system.h>
#include <bcmolt_buf.h>
#include <bcmolt_msg_pack.h>
#include <bcmtr_interface.h>
#include <bcmtr_plugin.h>
#include <bcm_config.h>
#include "bcmtr_header.h"
/** Transport configuration parameters */
typedef struct
{
bcmtr_plugin_cfg plugin_cfg; /**< Transport plugin configuration parameters */
/** Limits and timeouts.
* If not set, the appropriate BCM_TR_default defined in bcmConfig.h is used
*/
uint32_t max_retries; /**< Max number of request retransmissions */
uint32_t msg_timeout; /**< Max time to wait for response or next message part (ms) */
uint32_t max_requests; /**< Max number of outstanding requests */
uint32_t max_autos; /**< Max number of multi-part autonomous messages */
uint32_t max_fragments; /**< Max number of multi-part message fragments */
uint32_t msg_wait_timeout; /**< Message waiting timeout (ms) */
uint32_t msg_ready_timeout; /**< Time that transaction is kept after notifying application that it finished (ms) */
uint32_t max_mtu; /**< Max MTU size (bytes) */
int rx_thread_priority; /**< Receive thread priority. If set -1, Rx thread is NOT created */
} bcmtr_cfg;
/** Transport connection control block */
typedef struct bcmtr_conn bcmtr_conn;
/** Reassemble block */
typedef struct bcmtr_reass
{
bcmolt_buf *fragments; /** Array of bcmtr_cfg.max_fragments */
uint32_t num_fragments; /** Number of fragments filled in fragments array */
uint32_t max_fragment; /** Max fragment number. Set when last fragment is received */
uint32_t total_size; /** Total size of received fragments */
} bcmtr_reass;
/** Transport header list head */
typedef TAILQ_HEAD(bcmtr_msg_list, bcmtr_msg) bcmtr_msg_list;
/** Transport transaction control block */
struct bcmtr_msg
{
bcmolt_buf tx_buf; /**< Transmit buffer info (request only) */
bcmolt_buf rx_buf; /**< Receive buffer info (response or autonomous) */
uint32_t timestamp; /**< Message timestamp. Tx or last Rx */
uint16_t tx_count; /**< Number of times message was transmitted */
bcmtr_hdr hdr; /**< Transport header */
TAILQ_ENTRY(bcmtr_msg) l; /**< Transport message list entry */
bcmtr_reass *segm; /**< Segmentation block */
bcmtr_reass *reass; /**< Reassemble block */
bcmolt_msg *msg; /**< Message reference */
bcmolt_subchannel subch; /**< Sub-channel via which message was received */
bcmos_errno err; /**< Transport status */
/* Transport header is cleared up to this point when released.
* "err" field is the last in the section that gets cleared.
* Do not move fields below above "err"!
*/
#define BCMTR_HDR_CLEAR_SIZE (offsetof(bcmtr_msg, err) + sizeof(bcmos_errno))
bcmtr_msg_list *free_list; /**< Free list head reference */
bcmtr_conn *conn; /**< Connection back reference */
bcmos_sem sem; /**< "wait for response" semaphore */
bcmos_msg ipc_hdr; /**< IPC message header */
};
/** Message handler context */
typedef struct bcmtr_handler
{
f_bcmolt_msg_handler app_cb; /**< Application callback function */
bcmolt_auto_flags flags; /**< Registration flag: call in context of transport rx thread or app module */
bcmos_module_id module; /**< Optional module to dispatch received message to */
} bcmtr_handler;
/** Transport connection control block */
struct bcmtr_conn
{
char name[16]; /**< Transport name */
bcmolt_devid device; /**< Device index */
bcmtr_channel_id channel; /**< Channels served by this transport */
bcmtr_cfg cfg; /**< Transport configuration parameters */
bcmtr_driver driver; /**< Transport driver */
bcmtr_plugin_channel drv_priv; /**< Plugin driver private data */
bcmos_task rx_thread; /**< RX thread handle */
bcmos_mutex mutex; /**< Mutex protecting the transport structure */
uint32_t last_timeout_check; /**< Last timeout check timestamp */
uint32_t timeout_check_period; /**< Time-out check period */
bcmtr_msg_list msg_list; /**< Message list head */
bcmtr_msg_list free_req_list; /**< Free request block list */
bcmtr_msg_list free_auto_list; /**< Free autonomous block list */
bcmtr_msg *tmsg_array; /**< Pre-allocated array of transport headers */
bcmtr_stat stat; /**< Statistics */
bcmos_bool connected; /**< Transport state */
uint16_t num_requests; /**< Number of outstanding requests */
uint16_t num_auto; /**< Number of autonomous messages being reassembled */
uint16_t corr_tag; /**< Last used correlation tag */
bcmos_bool rx_thread_created; /**< TRUE=RX thread was created */
int kill_request; /**< Transport thread is commanded to die */
int kill_done; /**< Transport thread is dead */
};
#ifdef __cplusplus
extern "C" {
#endif
bcmos_errno bcmtr_cfg_get(bcmolt_devid device, bcmtr_cfg *cfg, bcmtr_driver *driver);
bcmos_errno _bcmtr_conn_get(bcmolt_devid device, bcmtr_conn **conn);
#ifdef __cplusplus
}
#endif
#endif /* BCMTR_INTERNAL_H_ */