/*
 *  Copyright (c) 2011 Mindspeed Technologies, Inc.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.

 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 *
 */


#ifndef _PE_STATUS_H_
#define _PE_STATUS_H_

#include "types.h"
#include "hal.h"

typedef struct tPE_STATUS
{
	U32	cpu_state;
	U32	activity_counter;
	U32	rx;
	union {
		U32	tx;
		U32	tmu_qstatus;
	};
	U32	drop;
#if defined(CFG_PE_DEBUG)
	U32	debug_indicator;
	U32	debug[16];
#endif
} __attribute__((aligned(16))) PE_STATUS;

extern volatile PE_STATUS pe_status;

#define PESTATUS_SETSTATE(newstate) do { pe_status.cpu_state = (U32)(newstate); } while (0)
#define PESTATUS_INCR_ACTIVE() do { pe_status.activity_counter++; } while (0)
#define PESTATUS_INCR_RX() do { pe_status.rx++; } while (0)
#define PESTATUS_INCR_TX() do { pe_status.tx++; } while (0)
#define PESTATUS_SET_TMU_QSTATUS(qstatus) do { pe_status.tmu_qstatus = (U32)(qstatus); } while (0)
#define PESTATUS_SETERROR(err) do { pe_status.activity_counter = (U32)(err); } while (0)
#define PESTATUS_INCR_DROP() do { pe_status.drop++; } while (0)
#if defined(CFG_PE_DEBUG)
#define PEDEBUG_SET(i, val) do { pe_status.debug[i] = (U32)(val); } while (0)
#define PEDEBUG_INCR(i) do { pe_status.debug[i]++; } while (0)
#else
#define PEDEBUG_SET(i, val) do { } while (0)
#define PEDEBUG_INCR(i) do { } while (0)
#endif

#endif /* _PE_STATUS_H_ */
