/*
<: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_COOP_DBA_H_
#define _BCMOLT_COOP_DBA_H_

#include <bcmolt_msg.h>
#include <bcm_common_gpon_fast.h>
#include <bcmolt_tr_mux.h>

#define BCMOLT_COOP_DBA_HARDQ_SIZE 4
#define BCMOLT_COOP_DBA_SOFTQ_SIZE 0

typedef bcmos_errno (*bcmolt_coop_dba_host_handler_cb)(bcmolt_devid device, bcm_common_fast_get_stats_ind *data);

bcmos_errno bcmolt_fast_oper_set_allocs(bcmolt_devid device, uint8_t pon_ni, bcm_common_fast_set_allocs_msg *msg);
bcmos_errno bcmolt_fast_oper_set_accesses(bcmolt_devid device, uint8_t pon_ni, bcm_common_fast_set_accesses_msg *msg);
void bcmolt_coop_dba_exit(bcmolt_devid devid, bcmtrmux_channel channel);
bcmos_errno bcmolt_coop_dba_init(bcmolt_devid devid, bcmtrmux_channel *channel, f_bcmtr_rx_handler rx_handler, void *data);
void bcmolt_coop_dba_host_handler_register(bcmolt_devid devid, bcmolt_coop_dba_host_handler_cb host_handler);
void bcmolt_coop_dba_host_handler_unregister(bcmolt_devid devid);
void bcmolt_coop_dba_rx(bcmolt_devid device, bcmos_buf *sysb, bcmtrmux_channel channel, void *data);
#endif
