/*******************************************************************************
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.

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

/* includes */
#include "mv802_3.h"
#include "mvCommon.h"
#include "mvOs.h"
#include "mvDebug.h"

/* Global variables effect on behave MV_DEBUG_PRINT and MV_DEBUG_CODE macros
 * mvDebug  - map of bits (one for each module) bit=1 means enable
 *          debug code and messages for this module
 * mvModuleDebug - array of 32 bits varables one for each module
 */
MV_U32 mvDebug = 0;
MV_U32 mvDebugModules[MV_MODULE_MAX];

/* Init mvModuleDebug array to default values */
void mvDebugInit(void)
{
	int bit;

	mvDebug = 0;
	for (bit = 0; bit < MV_MODULE_MAX; bit++) {
		mvDebugModules[bit] = MV_DEBUG_FLAG_ERR | MV_DEBUG_FLAG_STATS;
		mvDebug |= MV_BIT_MASK(bit);
	}
}

void mvDebugModuleEnable(MV_MODULE_ID module, MV_BOOL isEnable)
{
	if (isEnable)
		MV_BIT_SET(mvDebug, module);
	else
		MV_BIT_CLEAR(mvDebug, module);
}

void mvDebugModuleSetFlags(MV_MODULE_ID module, MV_U32 flags)
{
	mvDebugModules[module] |= flags;
}

void mvDebugModuleClearFlags(MV_MODULE_ID module, MV_U32 flags)
{
	mvDebugModules[module] &= ~flags;
}

/* Dump memory in specific format:
 * address: X1X1X1X1 X2X2X2X2 ... X8X8X8X8
 */
void mvDebugMemDump(void *addr, int size, int access)
{
	int i, j;
	MV_U32 memAddr = (MV_U32) addr;

	if (access == 0)
		access = 1;

	if ((access != 4) && (access != 2) && (access != 1)) {
		mvOsPrintf("%d wrong access size. Access must be 1 or 2 or 4\n", access);
		return;
	}
	memAddr = MV_ALIGN_DOWN((unsigned int)addr, 4);
	size = MV_ALIGN_UP(size, 4);
	addr = (void *)MV_ALIGN_DOWN((unsigned int)addr, access);
	while (size > 0) {
		mvOsPrintf("%08x: ", memAddr);
		i = 0;
		/* 32 bytes in the line */
		while (i < 32) {
			if (memAddr >= (MV_U32) addr) {
				switch (access) {
				case 1:
					mvOsPrintf("%02x ", MV_MEMIO8_READ(memAddr));
					break;

				case 2:
					mvOsPrintf("%04x ", MV_MEMIO16_READ(memAddr));
					break;

				case 4:
					mvOsPrintf("%08x ", MV_MEMIO32_READ(memAddr));
					break;
				}
			} else {
				for (j = 0; j < (access * 2 + 1); j++)
					mvOsPrintf(" ");
			}
			i += access;
			memAddr += access;
			size -= access;
			if (size <= 0)
				break;
		}
		mvOsPrintf("\n");
	}
}

void mvDebugPrintBufInfo(BUF_INFO *pBufInfo, int size, int access)
{
	if (pBufInfo == NULL) {
		mvOsPrintf("\n!!! pBufInfo = NULL\n");
		return;
	}
	mvOsPrintf("\n*** pBufInfo=0x%x, cmdSts=0x%08x, pBuf=0x%x, bufSize=%d\n",
		   (unsigned int)pBufInfo,
		   (unsigned int)pBufInfo->cmdSts, (unsigned int)pBufInfo->pBuff, (unsigned int)pBufInfo->bufSize);
	mvOsPrintf("pData=0x%x, byteCnt=%d, pNext=0x%x, uInfo1=0x%x, uInfo2=0x%x\n",
		   (unsigned int)pBufInfo->pData,
		   (unsigned int)pBufInfo->byteCnt,
		   (unsigned int)pBufInfo->pNextBufInfo,
		   (unsigned int)pBufInfo->userInfo1, (unsigned int)pBufInfo->userInfo2);
	if (pBufInfo->pData != NULL) {
		if (size > pBufInfo->byteCnt)
			size = pBufInfo->byteCnt;
		mvDebugMemDump(pBufInfo->pData, size, access);
	}
}

void mvDebugPrintPktInfo(MV_PKT_INFO *pPktInfo, int size, int access)
{
	int frag, len;

	if (pPktInfo == NULL) {
		mvOsPrintf("\n!!! pPktInfo = NULL\n");
		return;
	}
	mvOsPrintf("\npPkt=%p, stat=0x%08x, numFr=%d, size=%d, pFr=%p, osInfo=0x%lx\n",
		   pPktInfo, pPktInfo->status, pPktInfo->numFrags, pPktInfo->pktSize,
		   pPktInfo->pFrags, pPktInfo->osInfo);

	for (frag = 0; frag < pPktInfo->numFrags; frag++) {
		mvOsPrintf("#%2d. bufVirt=%p, bufSize=%d\n",
			   frag, pPktInfo->pFrags[frag].bufVirtPtr, pPktInfo->pFrags[frag].bufSize);
		if (size > 0) {
			len = MV_MIN((int)pPktInfo->pFrags[frag].bufSize, size);
			mvDebugMemDump(pPktInfo->pFrags[frag].bufVirtPtr, len, access);
			size -= len;
		}
	}

}

void mvDebugPrintIpAddr(MV_U32 ipAddr)
{
	mvOsPrintf("%d.%d.%d.%d", ((ipAddr >> 24) & 0xFF), ((ipAddr >> 16) & 0xFF),
		   ((ipAddr >> 8) & 0xFF), ((ipAddr >> 0) & 0xFF));
}

void mvDebugPrintMacAddr(const MV_U8 *pMacAddr)
{
	int i;

	mvOsPrintf("%02x", (unsigned int)pMacAddr[0]);
	for (i = 1; i < MV_MAC_ADDR_SIZE; i++)
		mvOsPrintf(":%02x", pMacAddr[i]);

	/* mvOsPrintf("\n"); */
}

/******* There are three functions deals with MV_DEBUG_TIMES structure ********/

/* Reset MV_DEBUG_TIMES entry */
void mvDebugResetTimeEntry(MV_DEBUG_TIMES *pTimeEntry, int count, char *pName)
{
	pTimeEntry->begin = 0;
	pTimeEntry->count = count;
	pTimeEntry->end = 0;
	pTimeEntry->left = pTimeEntry->count;
	pTimeEntry->total = 0;
	pTimeEntry->min = 0xFFFFFFFF;
	pTimeEntry->max = 0x0;
	strncpy(pTimeEntry->name, pName, sizeof(pTimeEntry->name) - 1);
	pTimeEntry->name[sizeof(pTimeEntry->name) - 1] = '\0';
}

/* Print out MV_DEBUG_TIMES entry */
void mvDebugPrintTimeEntry(MV_DEBUG_TIMES *pTimeEntry, MV_BOOL isTitle)
{
	int num;

	if (isTitle == MV_TRUE)
		mvOsPrintf("Event         NumOfEvents       TotalTime         Average       Min       Max\n");

	num = pTimeEntry->count - pTimeEntry->left;
	if (num > 0) {
		mvOsPrintf("%-11s     %6u          0x%08lx        %6lu     %6lu    %6lu\n",
			   pTimeEntry->name, num, pTimeEntry->total, pTimeEntry->total / num,
			   pTimeEntry->min, pTimeEntry->max);
	}
}

/* Update MV_DEBUG_TIMES entry */
void mvDebugUpdateTimeEntry(MV_DEBUG_TIMES *pTimeEntry)
{
	MV_U32 delta;

	if (pTimeEntry->left > 0) {
		if (pTimeEntry->end <= pTimeEntry->begin)
			delta = pTimeEntry->begin - pTimeEntry->end;
		else
			delta = ((MV_U32) 0x10000 - pTimeEntry->end) + pTimeEntry->begin;

		pTimeEntry->total += delta;

		if (delta < pTimeEntry->min)
			pTimeEntry->min = delta;

		if (delta > pTimeEntry->max)
			pTimeEntry->max = delta;

		pTimeEntry->left--;
	}
}
