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);
+}