view src/cs/riviera/rvf/rvf_i.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/****************************************************************************/
/*                                                                          */
/*  Name        rvf_i.h                                                     */
/*                                                                          */
/*  Function    this file contains rvf private definitions                  */
/*                                                                          */
/*  Version		0.4															*/
/*																			*/
/* 	Date       	Modification												*/
/*  ------------------------------------									*/
/*  3/12/99		Create														*/
/*	30/11/99	compliant to RV coding guidelines							*/
/*  12/23/1999	change buffer structures, add memory bank related structures*/
/*  02/21/2000	change memory bank implementation.							*/
/*  12/07/2000	implement dynamic memory allocation.						*/
/*																			*/
/*	Author		David Lamy-Charrier (dlamy@tif.ti.com)						*/
/*																			*/
/* (C) Copyright 1999 by Texas Instruments Incorporated, All Rights Reserved*/
/****************************************************************************/


#ifndef _RVF_I_H
#define _RVF_I_H


#include "rv/general.h"
#include "rvf/rvf_api.h"
#include "nucleus.h" 	/* A-M-E-N-D-E-D! */
#include "rvm/rvm_i.h"

/********************************************************************/
/**  Buffer Management Data Structures                             **/
/********************************************************************/
#define MAX_RVF_G_ADDR_ID	200


/* define the OVERHEAD per buffer */
#if RVF_ENABLE_BUF_CORRUPTION_CHECK
	#define RVF_CORRUPT_OVERHEAD (sizeof(UINT32))
	BOOLEAN _rvf_chk_buf_damage(void *bptr);
#else
	#define RVF_CORRUPT_OVERHEAD 0
#endif
/* calculate the size required in bytes, add the overhead for buffer corruption and round up to a multiple of 4 */
#define REQ2SIZE(size) ( ((size) + 3 + RVF_CORRUPT_OVERHEAD) & ~0x00000003)


#define RVF_MIN_USABLE_SIZE	( sizeof(T_RVF_INTERNAL_BUF) + sizeof(UINT32) )

/* macros to get the internal header from the user pointer and vice-versa */
#define USER2MEM(buf)  ( (T_RVF_INTERNAL_BUF*)(((UINT8*)(buf)) - sizeof(T_RVF_INTERNAL_BUF) ) )
#define MEM2USER(buf)  ( ((UINT8*)(buf)) + sizeof(T_RVF_INTERNAL_BUF) )


/* NOTE: since buffer size is always a multiple of 4, the last 2 bits may be used for flags */

#define GETSIZE(hdr)	((UINT32)(hdr->buf_size & ~0x03) )

/* macros to manage if buffers are linked or not */
#define RVF_BUF_IS_LINKED(hdr) 		(0x00000001 & hdr->buf_size)
#define RVF_SET_BUF_LINKED(hdr)		( (hdr)->buf_size |= 0x00000001)

#define RVF_BUF_IS_UNLINKED(hdr)	(!(RVF_BUF_IS_LINKED(hdr)) )
#define RVF_SET_BUF_UNLINKED(hdr)	( (hdr)->buf_size &= ~0x00000001)


/* macros to set and check the usage of the previous buffer */
#define RVF_IS_PREV_IN_USE(hdr) 	(0x00000002 & hdr->buf_size)
#define RVF_SET_PREV_IN_USE(hdr)	( (hdr)->buf_size |= 0x00000002)

#define RVF_IS_PREV_FREE(hdr)		(!(RVF_IS_PREV_IN_USE(hdr)) )
#define RVF_SET_PREV_FREE(hdr)		( (hdr)->buf_size &= ~0x00000002)


#define SETSIZE(hdr, size)			{	(hdr)->buf_size &= 0x03;\
										(hdr)->buf_size |= (size); }
									


#define NEXTCHUNK(hdr)	( (T_RVF_INTERNAL_BUF *)( (UINT8*)hdr + GETSIZE(hdr) + sizeof(T_RVF_INTERNAL_BUF) ) )

#define ENDSIZE(hdr)	( ((T_RVF_INTERNAL_BUF*)( (UINT8*)hdr + GETSIZE(hdr) + sizeof(T_RVF_INTERNAL_BUF) - sizeof(UINT32) ))->buf_size )


#define RVF_NB_FREE_LISTS	32
/* macro used to get the list index from the buffer size */
/* 32 lists :	8  lists for buffer < 256  all spaced 32 bytes apart,
				8  lists for buffer < 1280 all spaced 128 bytes apart,
				8  lists for buffer < 5376 all spaced 512 bytes apart, 
				8  lists for buffer > 5376 all spaced 16384 bytes apart.*/

#define RVF_BUF_LIST_INDEX(size)	( ((size) < 256 ) ? ( (UINT8)((size)>>5) ) :\
									( ((size) < 1280 ) ? ((UINT8)(8 + ((size-256)>>7) ) ) :\
									( ((size) < 5376) ? ((UINT8)(16 + ((size-1280)>>9) ) ) :\
									( ((size) < 136448)? ((UINT8)(24 + ((size-5376)>>14) ) ): (UINT8)(31) ) ) ) )

/* internal buffer structure */
typedef struct _t_internal_buf
{	UINT32	buf_size;					/* size of the user buffer */
	struct	_t_internal_buf * p_next;	/* pointer to the next buffer in the queue */ 
	
	union header
	{	struct external
		{	UINT16	mb_id;						/* id of the memory bank which owns the buffer */
			UINT16	mb_expected;				/* id of the memory bank on which the buffer want to be counted */
		}external;
		
		struct	_t_internal_buf * p_prev;		/* pointer to the previous buffer in the queue */ 
	}header;
	
	
} T_RVF_INTERNAL_BUF;





/* RVF will managed at most 2 pools of memory for dynamic allocation */
/* buffer pool structure*/
typedef struct _t_rvf_pool
{
	void * start_address;			/* address of the beginnig of the pool */
	UINT32 pool_size;				/* total size of the pool */
} T_RVF_POOL;




/* memory bank structure */
typedef struct _t_rvf_mb
{	UINT32	cur_memory_used;		/* size of current memory usage */
	UINT32	watermark;				/* watermark */
	UINT32	max;					/* max size */
	MB_CALLBACK_FUNC func;			/* function to call when mb_state switch to GREEN */
	BOOLEAN	returned_red;			/* flag indicating that this memory bank returned a RED value, */
									/* its callback function has to be called and/or buffer are waiting */	
	UINT16	first_buffer_index;		/* index of the first waiting buffer in the array */
	UINT16	last_buffer_index;		/* index of the last waiting buffer in the array */
#if RVF_ENABLE_STATS
	UINT32	max_reached;			/* maximum memory usage reached */
	UINT32	required_size;			/* total size in byte required by the rvf_get_buf function */
	UINT32	num_buf;				/* total number of buffer allocated by rvf_get_buf function */
#endif

} T_RVF_MB;


/* structure which associates mb name and mb id */
typedef struct _t_rvf_mb_name_id
{	char mb_name[RVF_MAX_MB_LEN];	/* name of the memory bank */
	UINT16 mb_id;					/* id of the memory bank */
	T_RVF_MB_PARAM mb_params;		/* parameters of the memory bank */
} T_RVF_MB_NAME_ID;


/* note:
 * - hosting_list overhead is reduced with an 8 bit addr id
 * - is hosting_list needed? would known_swe struct be enough to derive all info?  */
typedef struct _rvf_rt_addr_id_data {					/* A-M-E-N-D-E-D!  */
	UINT8				type_code;						/* poss. derived?  */
	UINT8				priority;
	T_RVF_G_ADDR_ID		host_addr_id;					/* Poss. union: JavaRef-32b or addrId-16 */
	UINT8				hosting_count;
	T_RVF_G_ADDR_ID		parasites[MAX_PARASITES];
	UINT8				swe_db_index;
	char*				symbolic_name;
	NU_TASK*			pOSTCB;
	NU_EVENT_GROUP*		pOSEvtGrp;
	UINT8*				p_os_stack;
	UINT16				os_stack_size;
	T_RVF_G_ADDR_ID		virtualContext;
	UINT8				gdHost;
	T_RVF_INTERNAL_BUF* OSTaskQFirst[RVF_NUM_TASK_MBOX]; 
	T_RVF_INTERNAL_BUF*	OSTaskQLast [RVF_NUM_TASK_MBOX];
	T_RV_RET			(* handle_message)	(T_RV_HDR * msg);  // note: T_RV_RETURN and not T_RVM...
	T_RV_RET			(* handle_timer)	(T_RV_HDR * msg);
} T_RVF_RT_ADDR_ID_DATA;

typedef struct _rvf_tm_attrib {					
	T_RVF_G_ADDR_ID		host_addr_id;		
	UINT8				legacyFlag;
	void*				action;
} T_RVF_TM_ATTRIB;

typedef NU_TIMER T_RV_TM;

typedef union _rvf_tm_ublk {					
	T_RV_TM*		ptr;		
	UINT32			id;
	
} T_RVF_TM_UBLK;

typedef union _rvf_tm_attib {
	char				str[8];
	T_RVF_TM_ATTRIB		attrib;
} T_RVF_TM_ATTRIB_UBLK;

typedef union _rvf_tm_action {
	UINT32				action_id;
	void*				p_action;
} T_RVF_TM_ACTION_UBLK;

#ifdef __cplusplus
extern "C" {
#endif

T_RVF_RET	rvf_send_priority_msg	(T_RVF_G_ADDR_ID addr_id, void *msg) ;
T_RVF_RET	rvf_adapt_send_msg (T_RVF_G_ADDR_ID addr_id, void *msg, UINT8 mbox) ;

void		rvf_yield();

void		rvf_mbox_buffer_init(T_RVF_RT_ADDR_ID_DATA* pRtAddrIdElement);
void		_rvf_buffer_init (void);
void		_rvf_timers_init(void);
T_RVF_RET	rvf_get_available_mem( UINT32 * total_size, UINT32 * used_size );
T_RV_RET	_rvf_empty_mailboxes (T_RVF_G_ADDR_ID task_id);

void		_rvf_init_mem_pool(void);
void		_rvf_init_free_queue (UINT8 id, UINT32 size, void *p_mem);
UINT16		_rvf_get_mem_usage_ratio(void);
UINT16		_rvf_get_number_of_pool(void);
#ifdef		_WINDOWS
  void		_rvf_window_dump_mem(void *m);
#endif


T_RVF_RET		rvf_free_sys_resources(T_RVF_G_ADDR_ID gid, UINT8 rm);
T_RVF_G_ADDR_ID	rvf_allocate_task_id(UINT8 isRealTask) ;   /* return should be changed to 16 or 32 bit val */
T_RVF_RET		rvf_setRtAddrSweIndex(T_RVF_G_ADDR_ID id, UINT8 sweIndex);
T_RVF_G_ADDR_ID	resolveHostAddrId(T_RVF_G_ADDR_ID id) ;
T_RVF_RET		rvf_create_virtual_task(T_RV_RET (* handle_message)(T_RV_HDR * msg),
										T_RV_RET (* handle_timer)(T_RV_HDR * msg),
										T_RVF_G_ADDR_ID task_id, T_RVF_G_ADDR_ID host_task_id, char *taskname, UINT8 priority, UINT8 tcode) ;
T_RVF_RET		rvf_register_t3_handlers (T_RVF_G_ADDR_ID task_id,
								   T_RV_RET (* handle_message)(T_RV_HDR * msg),
								   T_RV_RET (* handle_timer)(T_RV_HDR * msg) ) ;
T_RVF_RET		rvf_create_host_task (T_RV_RET (* proxy)(void), T_RVF_G_ADDR_ID task_id, char *taskname, UINT8 *stack, UINT16 stacksize,\
										 UINT8 priority, UINT8 tcode, UINT8 time_slicing, T_RVF_TASK_STATE suspend);
T_RVF_RET		rvf_registerToHost(T_RVF_G_ADDR_ID host_id, T_RVF_G_ADDR_ID eid) ;
T_RVF_RET		rvf_unregisterFromHost(T_RVF_G_ADDR_ID host_id, T_RVF_G_ADDR_ID pid) ;
T_RVF_RET		rvf_setHostTaskStackPtr(T_RVF_G_ADDR_ID id, UINT8* pStack) ;

T_RVF_G_ADDR_ID rvf_resolveHostingAddrId(T_RVM_GROUP_DIRECTIVE gd);
T_RVF_RET		rvf_associateGrpToHost(T_RVF_G_ADDR_ID host_id, T_RVF_GD_ID gd_id);
T_RVF_RET		rvf_isHostingTaskIdle(T_RVF_G_ADDR_ID id, UINT8* status);
void			rvf_setRDV(T_RVF_G_ADDR_ID tid,T_RVF_G_ADDR_ID vid);

/* Internal RVF data structures*/

extern T_RVF_INTERNAL_BUF *OSTaskQFirst[1][1]; //MAX_RVF_TASKS][RVF_NUM_TASK_MBOX];
extern T_RVF_INTERNAL_BUF *OSTaskQLast[1][1]; //[MAX_RVF_TASKS][RVF_NUM_TASK_MBOX];

extern T_RVF_RT_ADDR_ID_DATA* pRtAddrIdTable[MAX_RVF_G_ADDR_ID];



#ifdef __cplusplus
}
#endif

#endif /* _RVF_I_H */