BAL and Maple Release 2.2
Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bcm68620_release/release/host_driver/api/bcmolt_api.c b/bcm68620_release/release/host_driver/api/bcmolt_api.c
new file mode 100644
index 0000000..f15f7e5
--- /dev/null
+++ b/bcm68620_release/release/host_driver/api/bcmolt_api.c
@@ -0,0 +1,291 @@
+/*
+<: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.
+
+:>
+ */
+
+#include <bcmtr_interface.h>
+#include "bcmolt_api.h"
+#include "bcmolt_msg_pack.h"
+
+system_mode_change_cb sm_change_cb;
+
+/** Set configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ */
+bcmos_errno bcmolt_cfg_set(bcmolt_devid dev, bcmolt_cfg *cfg)
+{
+ bcmos_errno err;
+ bcmolt_presence_mask ro_mask;
+
+ cfg->hdr.type = BCMOLT_MSG_TYPE_SET;
+ /* Make sure that no attemp is made to set read-only property */
+ err = bcmolt_get_prop_readonly_mask(cfg->hdr.obj_type, &ro_mask);
+ if (err)
+ {
+ return err;
+ }
+ if ((ro_mask & cfg->hdr.presence_mask))
+ {
+ cfg->hdr.dir = BCMOLT_MSG_DIR_RESPONSE;
+ cfg->hdr.err = BCM_ERR_READ_ONLY;
+ strncpy(cfg->hdr.err_text, "Read-only fields cannot be set", BCMOLT_MAX_ERR_TEXT_LENGTH);
+ return cfg->hdr.err;
+ }
+ err = bcmtr_call(dev, &cfg->hdr);
+ if ((cfg->hdr.err == BCM_ERR_OK) &&
+ (cfg->hdr.obj_type == BCMOLT_OBJ_ID_DEVICE) &&
+ (BCMOLT_CFG_PROP_IS_SET((bcmolt_device_cfg*)cfg, device, system_mode)))
+ {
+ bcmolt_system_mode_set(dev, ((bcmolt_device_cfg*)cfg)->data.system_mode);
+ if (NULL != sm_change_cb)
+ {
+ sm_change_cb(dev);
+ }
+ }
+ return err;
+}
+
+/** Get configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_cfg_get(bcmolt_devid dev, bcmolt_cfg *cfg)
+{
+ cfg->hdr.type = BCMOLT_MSG_TYPE_GET;
+ return bcmtr_call(dev, &cfg->hdr);
+}
+
+/** Clear configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_cfg_clear(bcmolt_devid dev, bcmolt_cfg *cfg)
+{
+ cfg->hdr.presence_mask = BCMOLT_PRESENCE_MASK_ALL; /* clear is always object-wide */
+ cfg->hdr.type = BCMOLT_MSG_TYPE_CLEAR;
+ return bcmtr_call(dev, &cfg->hdr);
+}
+
+/** Get statistics
+ *
+ * \param[in] dev Device id
+ * \param[in] stat Configuration
+ * \param[in] flags Flags
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_stat_get(bcmolt_devid dev, bcmolt_stat *stat, bcmolt_stat_flags flags)
+{
+ stat->hdr.type = BCMOLT_MSG_TYPE_GET;
+ if ((flags & BCMOLT_STAT_FLAGS_CLEAR_ON_READ))
+ {
+ stat->hdr.type |= BCMOLT_MSG_TYPE_CLEAR;
+ }
+ return bcmtr_call(dev, &stat->hdr);
+}
+
+/** Get statistics configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_stat_cfg_get(bcmolt_devid dev, bcmolt_stat_cfg *cfg)
+{
+ cfg->hdr.type = BCMOLT_MSG_TYPE_GET;
+ cfg->hdr.presence_mask = BCMOLT_PRESENCE_MASK_ALL;
+ return bcmtr_call(dev, &cfg->hdr);
+}
+
+/** Set statistics configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_stat_cfg_set(bcmolt_devid dev, bcmolt_stat_cfg *cfg)
+{
+ cfg->hdr.type = BCMOLT_MSG_TYPE_SET;
+ cfg->hdr.presence_mask = BCMOLT_PRESENCE_MASK_ALL;
+ return bcmtr_call(dev, &cfg->hdr);
+}
+
+/** Get indication configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_auto_cfg_get(bcmolt_devid dev, bcmolt_auto_cfg *cfg)
+{
+ cfg->hdr.type = BCMOLT_MSG_TYPE_GET;
+ if (cfg->hdr.presence_mask == 0)
+ {
+ cfg->hdr.presence_mask = BCMOLT_PRESENCE_MASK_ALL;
+ }
+ return bcmtr_call(dev, &cfg->hdr);
+}
+
+/** Set indication configuration
+ *
+ * \param[in] dev Device id
+ * \param[in] cfg Configuration
+ * \returns error code
+ * The error code can indicate local or remote failure
+ */
+bcmos_errno bcmolt_auto_cfg_set(bcmolt_devid dev, bcmolt_auto_cfg *cfg)
+{
+ cfg->hdr.type = BCMOLT_MSG_TYPE_SET;
+ return bcmtr_call(dev, &cfg->hdr);
+}
+
+/** Invoke operation
+ *
+ * \param[in] dev Device id
+ * \param[in] oper Operation
+ * \returns error code
+ */
+bcmos_errno bcmolt_oper_submit(bcmolt_devid dev, bcmolt_oper *oper)
+{
+ oper->hdr.type = BCMOLT_MSG_TYPE_SET;
+ return bcmtr_call(dev, &oper->hdr);
+}
+
+/** Send message to ONU
+ *
+ * \param[in] dev Device id
+ * \param[in] msg Message to be sent
+ * \returns error code
+ */
+bcmos_errno bcmolt_proxy_send(bcmolt_devid dev, bcmolt_proxy *msg)
+{
+ msg->hdr.type = BCMOLT_MSG_TYPE_SET;
+ return bcmtr_call(dev, &msg->hdr);
+}
+
+
+/* (Un)Register auto/proxy message */
+static bcmos_errno bcmolt_rx_cb_set(bcmolt_devid device, bcmolt_mgt_group group, bcmolt_rx_cfg *rx_cfg)
+{
+ bcmtr_handler_parm tparm = {
+ .group = group,
+ .subgroup = BCMOLT_SUBGROUP_ANY,
+ };
+ bcmos_errno rc = BCM_ERR_OK;
+ int i;
+
+ if (!rx_cfg)
+ return BCM_ERR_PARM;
+
+ tparm.object = rx_cfg->obj_type;
+ tparm.app_cb = rx_cfg->rx_cb;
+ tparm.flags = rx_cfg->flags;
+ if (rx_cfg->flags == BCMOLT_AUTO_FLAGS_DISPATCH)
+ tparm.module = rx_cfg->module;
+
+ for (i = 0; i < BCMTR_MAX_INSTANCES && !rc; i++)
+ {
+ /* Skip interfaces that are not present in the default mask */
+ if (rx_cfg->pon_ni_mask && 0 == (rx_cfg->pon_ni_mask & (1 << i)))
+ continue;
+
+ tparm.instance = i;
+ if (rx_cfg->rx_cb)
+ {
+ /* If registration of specific object - unregister the old handler first */
+ if (rx_cfg->obj_type != BCMOLT_OBJECT_ANY)
+ bcmtr_msg_handler_unregister(device, &tparm);
+ rc = bcmtr_msg_handler_register(device, &tparm);
+ }
+ else
+ {
+ rc = bcmtr_msg_handler_unregister(device, &tparm);
+ }
+ }
+ return rc;
+}
+
+/* (Un)Register autonomous indication message handler
+ *
+ * \param[in] dev Device id
+ * \param[in] rx_cfg Receive handler configuration
+ * \returns error code
+ */
+bcmos_errno bcmolt_auto_rx_cb_set(bcmolt_devid device, bcmolt_rx_cfg *rx_cfg)
+{
+ return bcmolt_rx_cb_set(device, BCMOLT_MGT_GROUP_AUTO, rx_cfg);
+}
+
+/* (Un)Register proxy message handler
+ *
+ * \param[in] dev Device id
+ * \param[in] rx_cfg Receive handler configuration
+ * \returns error code
+ */
+bcmos_errno bcmolt_proxy_rx_cb_set(bcmolt_devid device, bcmolt_rx_cfg *rx_cfg)
+{
+ return bcmolt_rx_cb_set(device, BCMOLT_MGT_GROUP_PROXY_RX, rx_cfg);
+}
+
+/* Get configuration of multiple objects */
+bcmos_errno bcmolt_cfg_get_multi(bcmolt_devid dev, bcmolt_cfg *filter,
+ bcmolt_filter_flags filter_flags, bcmolt_msg_set *msg_set)
+{
+ int i;
+
+ /* If message set already includes messages received on previous iteration - release them */
+ for (i=0; i < msg_set->num_instances; i++)
+ {
+ if (msg_set->msg[i])
+ {
+ bcmolt_msg_free(msg_set->msg[i]);
+ msg_set->msg[i] = NULL;
+ }
+ }
+
+ msg_set->filter_flags = filter_flags;
+ msg_set->num_instances = 0;
+ msg_set->more = BCMOS_FALSE;
+
+ /* Set msg_set in filter message and submit request*/
+ filter->hdr.msg_set = msg_set;
+ filter->hdr.type = BCMOLT_MSG_TYPE_GET_MULTI;
+
+ return bcmtr_call(dev, &filter->hdr);
+}