/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	    this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.

    *   Neither the name of Marvell nor the names of its contributors may be
        used to endorse or promote products derived from this software without
        specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

******************************************************************************/

/******************************************************************************
**  FILE        : gponOnuAlloc.c                                             **
**                                                                           **
**  DESCRIPTION : This file implements ONU GPON BW Allocation Table          **
**                                                                           **
*******************************************************************************
*                                                                             *
*  MODIFICATION HISTORY:                                                      *
*                                                                             *
*   29Oct06  Oren Ben Hayun   created                                         *
* =========================================================================== *
 ******************************************************************************/

/* Include Files
------------------------------------------------------------------------------*/
#include "gponOnuHeader.h"

/* Local Constant
------------------------------------------------------------------------------*/
#define __FILE_DESC__ "mv_pon/core/gpon/gponOnuAlloc.c"
/* Global Variables
------------------------------------------------------------------------------*/

/* Local Variables
------------------------------------------------------------------------------*/
MV_U32 onuIdleAllocTcont = PON_ONU_IDLE_ALLOC_TCONT;

/* Export Functions
------------------------------------------------------------------------------*/

/* Local Functions
------------------------------------------------------------------------------*/
MV_STATUS onuGponAllocIdTcontClearAll(void);
MV_STATUS onuGponAllocIdTcontSet(MV_U32 allocId, MV_U32 tcontNum);

/*
** ALLOC ID & T-CONT Handling
** ==========================
** Three tables to used to handle Alloc-Id and T-Cont management
**
** Software tables:
** ==> Alloc Id table           - contains all Alloc Id configured by the OLT
** ==> Idle Alloc Id table      - contains all configured Alloc not connected to HW
** ==> T-Cont table             - contains the XC between configured Alloc Id and T-Cont
**
** Hanrdware table
** ==> BW Map table             - contains the hardware configuration of the GMAC
**
** Rules
** =====
** 1. Default Alloc Id == ONU ID, is set to default T-Cont and can not be changed
** 2. Configure T-cont is only valid for a pre-defined Alloc Id which is not used
*/

MV_BOOL sendNotifyToMng = MV_FALSE;

 /******************************************************************************/
/* ========================================================================== */
/*                     SoC BW MAP Table Access Operations                     */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponAllocIdMacInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init Rx Bw Map
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponAllocIdMacInit(void)
{
	MV_U32 iEntry;
	MV_STATUS status = MV_OK;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++)
		status |= mvOnuGponMacRxBwMapSet(iEntry, 0, GPON_BW_MAP_IDLE_TCONT, MV_FALSE);

	return (status);
}

/*******************************************************************************
**
**  onuGponAllocIdMacAllocExistCheck
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function checks if allocId is configured to T-Cont and
**               returns T-Cont entry index in the BW MAP table
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *entry
**
**  OUTPUTS:     MV_U32 *entry
**
**  RETURNS:     MV_TRUE or MV_FALSE
**
*******************************************************************************/
MV_BOOL onuGponAllocIdMacAllocExistCheck(MV_U32 allocId, MV_U32 *entry, MV_U32 *tcont)
{
	MV_U32  iEntry;
	MV_U32  macAllocId;
	MV_U32  tcontNum;
	MV_BOOL valid;
	MV_STATUS status;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		status = mvOnuGponMacRxBwMapGet(iEntry,&macAllocId,&valid,&tcontNum);
		if ((status == MV_OK) && (macAllocId == allocId) && (valid == MV_TRUE)) {
			*entry = iEntry;
			*tcont = tcontNum;
			return (MV_TRUE);
		}
	}

	return (MV_FALSE);
}

/*******************************************************************************
**
**  onuGponAllocIdMacAllocFreeEntryGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns free T-Cont entry in the BW MAP table
**
**  PARAMETERS:  MV_U32 *entry
**
**  OUTPUTS:     MV_U32 *entry
**
**  RETURNS:     MV_TRUE or MV_FALSE
**
*******************************************************************************/
MV_BOOL onuGponAllocIdMacAllocFreeEntryGet(MV_U32 *entry)
{
	MV_U32  iEntry;
	MV_U32  macAllocId;
	MV_U32  tcontNum;
	MV_BOOL valid;
	MV_STATUS status;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		status = mvOnuGponMacRxBwMapGet(iEntry, &macAllocId, &valid, &tcontNum);
		if ((status == MV_OK) && (valid == MV_FALSE)) {
			*entry = iEntry;
			return (MV_TRUE);
		}
	}

	return (MV_FALSE);
}

/*******************************************************************************
**
**  onuGponAllocIdMacAdd
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function adds an entry to the BW MAP table
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 tcontId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuGponAllocIdMacAdd(MV_U32 allocId, MV_U32 tcontId)
{
	MV_STATUS status = MV_OK;
	MV_U32    entry;
	MV_BOOL   exist;

	exist = onuGponAllocIdMacAllocFreeEntryGet(&entry);
	if (exist == MV_FALSE)
		return (MV_ERROR);

	status = mvOnuGponMacRxBwMapSet(entry, allocId, tcontId, MV_TRUE);
	if (status != MV_OK)
	{
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
			   "ERROR: (%s:%d) onuGponAllocIdMacAdd, failed to add alloc Id(%d) entry(%d)\n",
			   __FILE_DESC__, __LINE__, allocId, entry);
		return (status);
	}

	return (status);
}

/*******************************************************************************
**
**  onuGponAllocIdMacConnect
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function connect Alloc-Id to  T-Cont
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 tcontnum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdMacConnect(MV_U32 allocId, MV_U32 tcontNum)
{
	MV_STATUS status;
	MV_BOOL   exist;
	MV_U32    entry;
	MV_U32    tcont;
	MV_U32    newIdleTcontEntry;
	MV_U32    freeTcontEntry;
	MV_U32    entryAllocId;
	MV_U32    bwMapEntry;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
              "DEBUG: (%s:%d) AllocIdMacConnect, AllocId(%d), Tcont(%d)\n",
              __FILE_DESC__, __LINE__, allocId, tcontNum);
#endif /* MV_GPON_DEBUG_PRINT */

	/* validate that requested alloc-Id is configured in HW and is valid */
	exist = onuGponAllocIdMacAllocExistCheck(allocId, &entry, &tcont);
	if (exist != MV_TRUE) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
					"ERROR: (%s:%d) onuGponAllocIdMacConnect, alloc Id(%d) entry(%d)\n",
					__FILE_DESC__, __LINE__, allocId, entry);
		return (MV_ERROR);
	}

	if (tcontNum == onuIdleAllocTcont) {
		/* If the input T-Cont is the T-Cont used as an Idle T-Cont, all alloc-Id connected to the T-Cont
		** should be changed to another Idle T-Cont */

		/* Check for a free (idle) entry in the Tcont DB table */
		exist = onuGponDbBwTcontFreeGet(allocId, &freeTcontEntry);
		if (exist != MV_TRUE) {
#ifdef MV_GPON_DEBUG_PRINT
			mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
						"DEBUG: (%s:%d) onuGponAllocIdMacConnect, alloc Id(%d) freeTcontEntry(%d)\n",
						__FILE_DESC__, __LINE__, allocId, freeTcontEntry);
#endif /* MV_GPON_DEBUG_PRINT */
		} else {
			/* new idle Tcont entry allocated, update it globally */
			onuIdleAllocTcont = freeTcontEntry;

			/* scan all T-Cont / Alloc-Id in DB and update each HW Idle Alloc-Id to the new Idle T-Cont */
			for (newIdleTcontEntry = 0 ; newIdleTcontEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; newIdleTcontEntry++) {
				/* find the idle Alloc ID for this Tcont entry in DB */
				onuGponDbBwIdleAllocGet(newIdleTcontEntry, &entryAllocId);
				if (entryAllocId != PON_ONU_ALLOC_NOT_EXIST) {
					/* Check if this idle Alloc ID exists in the HW table */
					exist = onuGponAllocIdMacAllocExistCheck(entryAllocId, &bwMapEntry, &tcont);
					if (exist == MV_TRUE) {
						/* re-assign this Alloc ID to the new idle Tcont in HW */
						status = mvOnuGponMacRxBwMapSet(bwMapEntry, entryAllocId, onuIdleAllocTcont, MV_TRUE);
						if (status != MV_OK) {
							mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
										"ERROR: (%s:%d) onuGponAllocIdMacConnect, Faild to re-ssign alloc Id(%d) "
										"to idle Tcont(%d)%d\n",
										__FILE_DESC__, __LINE__, entryAllocId, onuIdleAllocTcont);
						}
					} else {
						/* Gewalt! DB and HW are not in sync! */
						mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
									"ERROR: (%s:%d) onuGponAllocIdMacConnect, alloc Id(%d) is not in sync!\n",
									__FILE_DESC__, __LINE__, allocId);
					}
				} /* entryAllocId != PON_ONU_ALLOC_NOT_EXIST */
			}
		}
		 /* There is a free entry in Tcont table */
	} /* tcontNum == onuIdleAllocTcont */

	/* update input Alloc-Id and T-Cont in the HW */
	status = mvOnuGponMacRxBwMapSet(entry, allocId, tcontNum, MV_TRUE);

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
              "DEBUG: (%s:%d) AllocIdMacConnect, tpm_active_tcont, Tcont(%d)\n",
              __FILE_DESC__, __LINE__, tcontNum);
#endif /* MV_GPON_DEBUG_PRINT */

	printk("TCONT (%d) active, Connect\n", tcontNum);
	status = onuGponWqTcontActivate(tcontNum);
	if (status != MV_OK)
	{
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
			   "ERROR: (%s:%d) onuGponAllocIdMacAdd, failed to schedule T-Cont(%d) activate in WQ\n",
			   __FILE_DESC__, __LINE__, tcontNum);
		return (status);
	}

	return (status);
}

/*******************************************************************************
**
**  onuGponAllocIdMacReconnect
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reconnect alloc-Id to idle tcont
**
**  PARAMETERS:  MV_U32 allocId
**  		 MV_U32 tcontNum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdMacReconnect(MV_U32 allocId, MV_U32 tcontNum)
{
	MV_BOOL   exist;
	MV_STATUS status = MV_OK;
	MV_U32    entry;
	MV_U32    onuId;
	MV_U32    tcont;
	MV_U32    tcontFreeNum;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
              "DEBUG: (%s:%d) AllocIdMacReconnect, AllocId(%d), Tcont(%d)\n",
              __FILE_DESC__, __LINE__, allocId, tcontNum);
#endif /* MV_GPON_DEBUG_PRINT */

	/* Get free entry */
	exist = onuGponAllocIdMacAllocExistCheck(allocId, &entry, &tcont);
	if (exist != MV_TRUE)
		return (MV_ERROR);

	exist = onuGponDbBwTcontFreeGet(allocId, &tcontFreeNum);
	if (exist != MV_TRUE)
		onuIdleAllocTcont = tcontFreeNum;

	/* Check if default Alloc Id */
	onuId = onuGponDbOnuIdGet();
	if (allocId != onuId) {

#ifdef MV_GPON_DEBUG_PRINT
	        mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
                      "DEBUG: (%s:%d) AllocIdMacReconnect, tpm_deactive_tcont, Tcont(%d)\n",
                      __FILE_DESC__, __LINE__, tcontNum);
#endif /* MV_GPON_DEBUG_PRINT */

	       // printk("TCONT (%d) flush, Reconnect\n", tcontNum);
	       // status = onuGponWqTcontFlush(tcontNum);
	       // if (status != MV_OK)
	       //{
	       // 	mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
	       // 		   "ERROR: (%s:%d) onuGponAllocIdMacReconnect, failed to schedule T-Cont(%d) flush in WQ\n",
	       // 		   __FILE_DESC__, __LINE__, tcontNum);
	       //}

		/* Set Alloc Id to T-Cont in the GMAC hardware */
		status = mvOnuGponMacRxBwMapSet(entry, allocId, onuIdleAllocTcont, MV_TRUE);
	}

	return (status);
}

/*******************************************************************************
**
**  onuGponAllocIdMacDisconnect
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function disconnect alloc-Id from tcont
**
**  PARAMETERS:  MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdMacDisconnect(MV_U32 allocId)
{
	MV_U32  onuId;
	MV_U32  entry;
	MV_U32  tcont;
	MV_BOOL exist;
	MV_STATUS status = MV_OK;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
              "DEBUG: (%s:%d) AllocIdMacDisconnect, AllocId(%d)\n",
              __FILE_DESC__, __LINE__, allocId);
#endif /* MV_GPON_DEBUG_PRINT */

	/* Check if already exist */
	exist = onuGponAllocIdMacAllocExistCheck(allocId, &entry, &tcont);
	if (exist == MV_FALSE)
		return (MV_ERROR);

	/* Check if default Alloc Id */
	onuId = onuGponDbOnuIdGet();
	if (allocId != onuId)
	{
#ifdef MV_GPON_DEBUG_PRINT
	        mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
                      "DEBUG: (%s:%d) tpm_deactive_tcont, Tcont(%d)\n",
                      __FILE_DESC__, __LINE__, tcont);
#endif /* MV_GPON_DEBUG_PRINT */

		printk("TCONT (%d) flush, Disconnect\n", tcont);
		status = onuGponWqTcontFlush(tcont);
		if (status != MV_OK)
		{
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				   "ERROR: (%s:%d) onuGponAllocIdMacDisconnect, failed to schedule T-Cont(%d) flush in WQ\n",
				   __FILE_DESC__, __LINE__, tcont);
		}

		status = mvOnuGponMacRxBwMapSet(entry, 0, 0, MV_FALSE);
		if (status != MV_OK)
		{
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				   "ERROR: (%s:%d) onuGponAllocIdMacDisconnect, failed to disconnect  Alloc Id(%d), T-Cont(%d)\n",
				   __FILE_DESC__, __LINE__, allocId, tcont);
		}
	}

	return (status);
}

/******************************************************************************/
/* ========================================================================== */
/*                                    APIs                                    */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponAllocIdInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init Tconts Bitmap
**
**  PARAMETERS:  MV_U32 existTcontsBitmap
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponAllocIdInit(MV_U32 existTcontsBitmap)
{
	MV_U32  iEntry;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"DEBUG: (%s:%d) Tconts Bitmap(0x%x)\n", __FILE_DESC__, __LINE__, existTcontsBitmap);
#endif /* MV_GPON_DEBUG_PRINT */

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		/* Check if T-CONT Exist */
		if ((existTcontsBitmap >> iEntry) & 0x01)
			onuGponDbBwTcontSet(iEntry, MV_TRUE, PON_ONU_ALLOC_NOT_EXIST, MV_FALSE);
	}

	return (MV_OK);
}

/*******************************************************************************
**
**  onuGponAllocIdAssign
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Assign Alloc ID
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 notifyFlag
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdAssign(MV_U32 allocId, MV_U32 notifyFlag)
{
	MV_STATUS status;
	MV_U32    entry;
	MV_U32    idleEntry;
	MV_U32    onuId;
	MV_BOOL   allocIdExist;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"DEBUG: (%s:%d) Alloc ID Assign, alloc Id(%d)\n", __FILE_DESC__, __LINE__, allocId);
#endif /* MV_GPON_DEBUG_PRINT */

	/* check if Alloc-Id exist in the alloc Id DB table */
	allocIdExist = onuGponDbBwAllocExist(allocId);
	if (allocIdExist == MV_TRUE)
		return (MV_OK);

	/* set the Alloc-Id exist to the database */
	status = onuGponDbBwAllocInsert(allocId, &entry);
	if (status != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) onuGponDbBwAllocInsert, alloc Id(%d)\n",
					__FILE_DESC__, __LINE__, allocId);
		return (status);
	}

	onuId = onuGponDbOnuIdGet();

	/* Default AllocId */
	/* =============== */
	/* configured in the T-Cont table and BW MAP */
	if (allocId == onuId) {
#ifdef MV_GPON_DEBUG_PRINT
		mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
			   "DEBUG: (%s:%d) Alloc ID Assign, default alloc Id(%d) set to T-Cont 0(def)\n", __FILE_DESC__, __LINE__, allocId);
#endif /* MV_GPON_DEBUG_PRINT */
		/* Set default Alloc Id to T-Cont table */
		status = onuGponDbBwTcontAlloc(PON_ONU_DEFAULT_ALLOC_TCONT, allocId);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) tcont to alloc set failed, tcont (%d) alloc Id(%d)\n",
						__FILE_DESC__, __LINE__, PON_ONU_DEFAULT_ALLOC_TCONT, allocId);
			return (MV_ERROR);
		}

		sendNotifyToMng = MV_TRUE;

	} else {

		/* Data AllocId  */
		/* ============= */
		/* Configured in the Idle Alloc table and BW MAP */
		/* set the Alloc-Id exist to the database */
		status = onuGponDbBwIdleAllocInsert(allocId, &idleEntry);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) onuGponDbBwIdleAllocInsert, alloc Id(%d))\n",
						__FILE_DESC__, __LINE__, allocId);
			return (status);
		}

		/* set the Alloc-Id exist to the BW table in the MAC (hardware) */
		status = onuGponAllocIdMacAdd(allocId, onuIdleAllocTcont);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) onuGponAllocIdMacAdd, alloc Id(%d)\n",
						__FILE_DESC__, __LINE__, allocId);
			return (status);
		}

		sendNotifyToMng = MV_TRUE;
	}

	if ((sendNotifyToMng == MV_TRUE) && (notifyFlag != 0)) {
		/* Send Status Notification to upper layer */
		onuGponSrvcStatusNotify(GPON_ONU_STATUS_RANGED);
	}

	return (MV_OK);
}

/*******************************************************************************
**
**  onuGponAllocIdDeAssign
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function De-Assign Alloc ID
**
**  PARAMETERS:  MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdDeAssign(MV_U32 allocId)
{
	MV_STATUS status;
	MV_U32    entry;
	MV_U32    tcontNum;
	MV_BOOL   allocIdExist;
	MV_BOOL   valid;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"DEBUG: (%s:%d) De-Assign Alloc ID, alloc Id(%d)\n", __FILE_DESC__, __LINE__, allocId);
#endif /* MV_GPON_DEBUG_PRINT */

	/* Check if Alloc-Id exist in the database alloc Id, if not exist */
	allocIdExist = onuGponDbBwAllocExist(allocId);
	if (allocIdExist == MV_FALSE)
		return (MV_OK);

	/* Delete the Alloc Id from the BW MAP table (if it is not the default T-Cont) */
	status = onuGponAllocIdMacDisconnect(allocId);
	if (status != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) onuGponAllocIdMacDisconnect, alloc Id(%d)\n",
					__FILE_DESC__, __LINE__, allocId);
		return (status);
	}

	/* check if Alloc-Id is connected Data T-Cont */
	status = onuGponDbBwTcontConnectCheck(allocId, &tcontNum, &valid);
	if ((status == MV_OK) && (valid == MV_TRUE)) {
		/* Delete Alloc ID from the Alloc Id / T-Cont table in the database */
		onuGponDbBwTcontClear(tcontNum);
	}

	/* check if Alloc-Id is Idle Alloc-Id */
	if (onuGponDbBwIdleAllocExist(allocId, &entry) == MV_TRUE) {
		/* Delete Alloc ID from the Idle Alloc Id table */
		status = onuGponDbBwIdleAllocRemove(allocId, &entry);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) onuGponDbBwIdleAllocRemove, alloc Id(%d) entry(%d)\n",
						__FILE_DESC__, __LINE__, allocId, entry);
			return (status);
		}
	}

	/* Delete Alloc Id from the Alloc Id table in the database */
	status = onuGponDbBwAllocRemove(allocId, &entry);
	if (status != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) onuGponDbBwAllocRemove, alloc Id(%d) entry(%d)\n",
					__FILE_DESC__, __LINE__, allocId, entry);
		return (status);
	}

	return (MV_OK);
}

/*******************************************************************************
**
**  onuGponAllocIdFreeAllBuffers
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function release all buffers assigned to All Alloc IDs
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponAllocIdFreeAllBuffers(void)
{
    MV_STATUS status;
    MV_U32    tcontNum = 0xFF;
#ifdef MV_GPON_DEBUG_PRINT
    mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
               "DEBUG: (%s:%d) release All T-Conts buffers, tpm_deactive_tcont\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

    //printk("TCONT flush, FreeAllBuffers\n");
    status = onuGponWqTcontFlush(tcontNum);
    if (status != MV_OK)
    {
            mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
        	       "ERROR: (%s:%d) onuGponAllocIdFreeAllBuffers, failed to schedule All T-Cont flush in WQ\n",
        	       __FILE_DESC__, __LINE__, tcontNum);
    }

    return(status);
}

/*******************************************************************************
**
**  onuGponAllocIdDeAssignAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function De-Assign All Alloc IDs
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponAllocIdDeAssignAll(void)
{
#ifdef MV_GPON_DEBUG_PRINT
    mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
               "DEBUG: (%s:%d) De-Assign All Alloc IDs and T-Conts\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

    onuGponDbBwAllocInit();
    onuGponAllocIdMacInit();
    onuGponAllocIdInit(0x00FF);

    sendNotifyToMng = MV_FALSE;

    return (MV_OK);
}

/*******************************************************************************
**
**  onuGponAllocIdTcontSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Set Alloc ID to T-CONT
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 tcontnum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdTcontSet(MV_U32 allocId, MV_U32 tcontNum)
{
	MV_STATUS status;
	MV_U32    otherTcontNum;
	MV_U32    dbAllocId;
	MV_U32    entry;
	MV_BOOL   valid;
	MV_BOOL   exist;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"DEBUG: (%s:%d) Set Alloc ID to T-CONT, alloc Id(%d) tcont(%d)\n",
				__FILE_DESC__, __LINE__, allocId, tcontNum);
#endif /* MV_GPON_DEBUG_PRINT */

	/* Check if Alloc Id was assigned by the OLT */
	exist = onuGponDbBwAllocExist(allocId);
	if (exist == MV_FALSE) {
		mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) Alloc ID Not Exist, alloc Id(%d)\n",
				__FILE_DESC__, __LINE__, allocId, tcontNum);
		return (MV_OK);
	}

	/* Check if T-CONT Exist - all 8 tconts are set to exist during onuGponAllocIdInit function */
	status = onuGponDbBwTcontExist(tcontNum,&exist);
	if ((status != MV_OK) || (exist == MV_FALSE)) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) Tcont Not Exist, alloc Id(%d) tcont(%d)\n",
				__FILE_DESC__, __LINE__, allocId, tcontNum);
		return (MV_ERROR);
	}

	/* Check that Alloc Id is not exist on other T-CONT */
	status = onuGponDbBwTcontConnectCheck(allocId, &otherTcontNum, &valid);
	if ((status == MV_OK) && (valid == MV_TRUE)) {
		if (otherTcontNum == tcontNum) {

			mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) Alloc Id/T-CONT Already Configured, alloc Id(%d) tcont(%d) otherTcontNum(%d)\n",
						__FILE_DESC__, __LINE__, allocId, tcontNum, otherTcontNum);
			return (MV_OK);

		} else {

			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) Alloc Id Already Exist on T-CONT, alloc Id(%d) tcont(%d) otherTcontNum(%d)\n",
						__FILE_DESC__, __LINE__, allocId, tcontNum, otherTcontNum);
			return (MV_ERROR);
		}
	}

	/* Check that the T-CONT is valid */
	onuGponDbBwTcontGet(tcontNum, &exist, &dbAllocId, &valid);
	if (valid == MV_TRUE) {
		if (dbAllocId != PON_ONU_ALLOC_NOT_EXIST) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) Alloc Id/T-CONT Already Configured, alloc Id(%d) tcont(%d)\n",
						__FILE_DESC__, __LINE__, allocId, tcontNum);
			return (MV_OK);
		}
	}

	/* configure Alloc Id / T-Cont table */
	status = onuGponDbBwTcontAlloc(tcontNum, allocId);
	if (status != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) onuGponDbBwTcontAlloc, alloc Id(%d) tcont(%d)\n",
				__FILE_DESC__, __LINE__, allocId, tcontNum);
		return (MV_ERROR);
	}

	/* remove Alloc Id from Idle Alloc table */
	status = onuGponDbBwIdleAllocRemove(allocId, &entry);
	if (status != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) onuGponDbBwIdleAllocRemove, alloc Id(%d) entry(%d) removed from Idle table\n",
				__FILE_DESC__, __LINE__, allocId, entry);
		return (MV_ERROR);
	}

	/* set Alloc Id to T-Cont in the GMAC hardware */
	status = onuGponAllocIdMacConnect(allocId, tcontNum);
	if (status != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) onuGponAllocIdMacConnect, alloc Id(%d) tcont(%d)\n",
				__FILE_DESC__, __LINE__, allocId, tcontNum);
		return (MV_ERROR);
	}

	return (MV_OK);
}

/*******************************************************************************
**
**  onuGponAllocIdTcontClear
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Clear Alloc ID from T-CONT
**
**  PARAMETERS:  MV_U32 tcontnum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponAllocIdTcontClear(MV_U32 tcontNum)
{
	MV_STATUS status;
	MV_U32    allocId;
	MV_U32    onuId;
	MV_U32    idleEntry;
	MV_BOOL   valid;
	MV_BOOL   exist;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"DEBUG: (%s:%d) Clear Alloc ID from T-CONT: T-CONT(%d)\n",
				__FILE_DESC__, __LINE__, tcontNum);
#endif /* MV_GPON_DEBUG_PRINT */

	/* Check if T-CONT Exist */
	status = onuGponDbBwTcontExist(tcontNum,&exist);
	if ((status != MV_OK) || (exist == MV_FALSE)) {
		mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
				"ERROR: (%s:%d) T-CONT Not Exist, tcont(%d)\n",
				__FILE_DESC__, __LINE__, tcontNum);
		return (MV_ERROR);
	}

	/* Get tcont params from the database */
	onuGponDbBwTcontGet(tcontNum, &exist, &allocId, &valid);
	if (valid == MV_FALSE)
		return (MV_OK);

	/* Check if Alloc Id Exist */
	exist = onuGponDbBwAllocExist(allocId);
	if (exist == MV_TRUE) {
		/* Clear T-Cont in hardware in case T-Cont is not connected to default Alloc-Id (== ONU ID) */
		status = onuGponAllocIdMacReconnect(allocId, tcontNum);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) onuGponAllocIdMacReconnect, alloc Id(%d)\n",
						__FILE_DESC__, __LINE__, allocId);
			return (MV_ERROR);
		}
	}

	/* Clear T-Cont in the database */
	onuId = onuGponDbOnuIdGet();
	if (allocId != onuId) {
		onuGponDbBwTcontClear(tcontNum);

		/* set the Alloc-Id exist to the idle alloc-Id */
		status = onuGponDbBwIdleAllocInsert(allocId, &idleEntry);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
						"ERROR: (%s:%d) onuGponAllocIdTcontClear, idle alloc Id(%d) entry(%d)\n",
						__FILE_DESC__, __LINE__, allocId, idleEntry);
			return (status);
		}
	}

	return (MV_OK);
}

/*******************************************************************************
**
**  onuGponAllocIdTcontClearAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Clear All Alloc-Ids from T-TCONTs
**
**  PARAMETERS:  MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponAllocIdTcontClearAll(void)
{
	MV_U32  iEntry;
	MV_BOOL exist;
	MV_STATUS status;
	MV_U32    tcontNum = 0xFF;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
				"DEBUG: (%s:%d) Clear All Alloc-Ids from T-TCONTs\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		/* Check if T-CONT Exist */
		status = onuGponDbBwTcontExist(iEntry,&exist);
		if ((status == MV_OK) && (exist == MV_TRUE))
			onuGponAllocIdTcontClear(iEntry);
	}

	printk("TCONT flush, Clear All\n");
	status = onuGponWqTcontFlush(tcontNum);
	if (status != MV_OK)
	{
	 	mvPonPrint(PON_PRINT_ERROR, PON_ALLOC_MODULE,
	 		   "ERROR: (%s:%d) onuGponAllocIdTcontClearAll, failed to schedule All T-Cont flush in WQ\n",
	 		   __FILE_DESC__, __LINE__);
	}


	return (MV_OK);
}

/*******************************************************************************
**
**  onuGponIdleAllocIdTcontGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Idle Alloc-Id
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_U32 allocId
**
*******************************************************************************/
MV_U32 onuGponIdleAllocIdTcontGet(void)
{
  return (onuIdleAllocTcont);
}

