diff g23m/condat/ms/src/mfw/mfw_bte.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/mfw/mfw_bte.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,997 @@
+/*
++-------------------------------------------------------------------+
+| PROJECT: MMI-Framework (8445)		$Workfile:: mfw_bt.c				$|
+| $Author:: NDH						$Revision::  1						$|
+| CREATED: 17.04.04					$Modtime:: 17.04.04 17:21			$|
+| STATE  : code														 |
++-------------------------------------------------------------------+
+
+
+   MODULE  : MFW_BT
+
+   PURPOSE : This module contains the functions for MFW Bluetooth Management
+
+
+*/
+
+#define ENTITY_MFW
+
+#include <string.h>
+
+#if defined (NEW_FRAME)
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+
+#else
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif
+
+#include "bta_riviera.h"
+
+#include "bta_api.h"
+#include "mfw_bt_geh.h"
+#include "mfw_bte.h"
+#include "mfw_bt_dm.h"
+#include "mfw_bt_dg.h"
+#include "mfw_bt_ag.h"
+#include "mfw_bt_op.h"
+#include "mfw_bt_ft.h"
+#include "mfw_bt_flash.h"
+
+#include "mfw_utils.h"
+
+/*
+** Define Module wide variables
+*/
+static SHORT Mfw_Bt_Ge_Sigbuf_Id = -1;
+static BOOLEAN Mfw_Bt_Ge_InProgress;
+
+static T_MFW_STARTUP_VISIBILITY startup_visibility;
+
+/*
+** Local Function Prototypes
+*/
+static void mfw_bt_send_cb_notify_ind (void);
+
+/*
+** Define External variables and references
+*/
+EXTERN MfwHdr * current_mfw_elem;
+/*
+** Module Function Definitoins
+*/
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_enable
+
+ $Description:		This function will start the whole process of enabling Bluetooth.
+
+ $Returns:		MFW_BT_FAIL if the chip is not stopped or if the generic event handler
+ 				doesn't start correctly.
+
+ $Arguments:		startup_visibility. Visibility set by the BMI. MFW_BT_DEFAULT_VIS if 
+ 				using the settings stored in flash. 
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_enable(T_MFW_STARTUP_VISIBILITY startup_visibility )
+{
+	UINT8 delay_counter = 0;
+	T_RV_RET bt_start_status = 0;
+	T_MFW_BT_STATUS status;
+//	static tBTA_SYS_START_CBACK *fp;
+//	fp= (tBTA_SYS_START_CBACK *)&mfw_bt_dm_security_cb;
+	
+	/* first, enable the event handler */
+	status = mfw_bt_ge_enable();
+	if( status != MFW_BT_SUCCESS ) 
+		return status;
+	
+	/* start the system */
+	if( BTA_SysStart((tBTA_SYS_START_CBACK *)(&mfw_bt_dm_security_cb) ) != RV_OK )
+//	if( BTA_SysStart(fp) != RV_OK )
+	{	
+		MFW_BT_TRACE( "[mfw_bt]: failed to start BT chipset" );
+		return MFW_BT_FAIL;	
+	}
+	/* the start-up procedure has been started. We will receive an 
+	event when it is done */		
+	MFW_BT_TRACE( "[mfw_bt]: BT is starting" );
+	return MFW_BT_SUCCESS;
+
+}
+
+
+
+
+/*  */
+/*******************************************************************************
+
+ $Function:		mfw_bt_enable_cb
+
+ $Description:		mfw_bt_enable will cause a BTA_DM_SYS_START_EVT to be sent. At this 
+ 				moment we call BTA_EnableBluetooth. When we receive 
+ 				BTA_DM_ENABLE_EVT, we call this function.
+ 				
+ $Returns:		Will send a BMI signal if there is no default name. If the user cancels the 
+ 				input, BT will then be stopped.
+ 				Will send a E_BT_ENABLE_CMPL event when the initialization is done. 
+
+ $Arguments:		none 
+
+*******************************************************************************/
+void mfw_bt_enable_cb(void)
+{
+	UINT8* device_name;
+	T_MFW_BT_REM_DEVICE *ptr_device_array[MFW_BT_NUM_REM_DEVICE];
+	UINT8 number_of_devices;
+	T_MFW_BT_ENABLE_CMPL enable_evt_data;
+
+	
+	mfw_bt_cb.is_started = TRUE;
+	
+	/* set device name */
+	device_name = mfw_bt_read_local_name( );
+	if( *device_name == NULL )
+	{
+		/* no name yet. Use default one, and ask the user to specify a new one */
+		BTA_DmSetDeviceName((char*)MFW_BT_DEVICE_NAME);
+		mfw_bt_cb.is_name_requested = TRUE;
+		mfw_bt_signal(E_BT_DM_DEV_NAME_REQ, NULL);
+	}
+	else
+		BTA_DmSetDeviceName( (char*)device_name );
+
+	/* set visibility and connectability */
+	if( startup_visibility == MFW_BT_DEFAULT_VIS )
+	{
+		if( mfw_bt_read_visibility( ) == TRUE )
+		{
+			BTA_DmSetVisibility( BTA_DM_GENERAL_DISC, BTA_DM_CONN);
+		}
+		else
+		{
+			BTA_DmSetVisibility( BTA_DM_NON_DISC, BTA_DM_NON_CONN);
+		}
+	}
+	else
+	{
+		BTA_DmSetVisibility( startup_visibility, BTA_DM_NON_CONN);
+	}
+	
+	
+    	/* Update BTA with peer device information stored in NVRAM  */
+		/* first, get all the devices */
+	mfw_bt_get_device_by_service(0, 
+       							    &ptr_device_array[0],
+       							    &number_of_devices);
+
+		/* then add these devices to BTA database. */
+	for ( ; number_of_devices>0 ; number_of_devices-- )
+	{
+		if(ptr_device_array[number_of_devices]->link_key_present)
+		{
+			BTA_DmAddDevice(ptr_device_array[number_of_devices]->bd_addr, 
+							    ptr_device_array[number_of_devices]->link_key, 
+							    ptr_device_array[number_of_devices]->trusted_services, 
+							    ptr_device_array[number_of_devices]->is_trusted);
+		}
+		else if (ptr_device_array[number_of_devices]->is_trusted)
+		{
+			BTA_DmAddDevice(ptr_device_array[number_of_devices]->bd_addr, 
+							    NULL,
+							    ptr_device_array[number_of_devices]->trusted_services,
+							    ptr_device_array[number_of_devices]->is_trusted);
+		}
+	}
+
+	/* initialize all the sub-parts => BT profiles. THIS CODE IS ABSOLUTELY NOT DYNAMIC... Does it
+	need to be??? */
+	mfw_bt_ag_init();
+	mfw_bt_dg_init();
+	mfw_bt_op_init();
+	mfw_bt_ft_init();
+	
+	/* finally platform-specific initialization */
+	//nothing to do for the time being. 
+
+	/* store the new settings. this stores base conf file */
+	mfw_bt_store_status(TRUE);
+
+	enable_evt_data.Success = TRUE;
+	mfw_bt_signal(E_BT_ENABLE_CMPL, (void*)&enable_evt_data );
+	
+	return;
+
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_disable
+
+ $Description:		This function stops the BT system.
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+void mfw_bt_disable(void)
+{
+	/* disable BT. DM handler will then receive an DISABLE event => will stop the chipset
+	and kill the generic event handler. */
+	BTA_DisableBluetooth( );
+
+	return;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_init
+
+ $Description:		This function initialises the Mfw Bluetooth Persistent Data on Power Up. 
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+void mfw_bt_init(void)
+{
+
+	/*
+	** Read the Known Devices from FFS
+	*/
+	mfw_bt_flash_init( );
+	
+	/*
+	** The rest is down to you Thomas
+	*/
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_exit
+
+ $Description:		This function will tidy up any resources used by the Mfw Bluetooth Module
+ 				on Power Down
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+void mfw_bt_exit(void)
+{
+	/* nothing to do here... RAM will be automatically cleaned, and the flash wasn't modified */
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_create
+
+ $Description:		This function  initialises an Mfw Bluetooth entity and adds it to the Window Stack
+
+ $Returns:		T_MFW_HND	: A handle for the entity
+
+ $Arguments:		T_MFW_HND		: Parent Window Handle
+ 				T_MFW_EVENT	: Event Mask of the events to be handled
+ 				T_MFW_CB		: Callback function to handle the events
+
+*******************************************************************************/
+T_MFW_HND mfw_bt_create(T_MFW_HND hWin, T_MFW_EVENT event, T_MFW_CB cbfunc)
+{
+	T_MFW_HDR *hdr;
+	T_MFW_BT  *bt_para;
+
+	MFW_BT_TRACE("mfw_bt_create");
+
+	hdr = (T_MFW_HDR *) mfwAlloc(sizeof (T_MFW_HDR));
+	bt_para = (T_MFW_BT *) mfwAlloc(sizeof (T_MFW_BT));
+
+	if (!hdr OR !bt_para)
+		return FALSE;
+
+	/*
+	* initialisation of the handler
+	*/
+	bt_para->emask   = event;
+	bt_para->handler = cbfunc;
+
+	hdr->data = bt_para;		/* store parameter in node	*/
+	hdr->type = MfwTypBt;		/* store type of event handler */
+
+	/*
+	* installation of the handler
+	*/
+	return mfwInsert((T_MFW_HDR *)hWin, hdr);
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_delete
+
+ $Description:		This function clears down an Mfw Bluetooth entity and removes it from the
+ 				Window Stack
+
+ $Returns:		T_MFW_RES	: The result of the function
+
+ $Arguments:		T_MFW_HND	: The Handle of the entity to be removed
+
+*******************************************************************************/
+T_MFW_RES mfw_bt_delete(T_MFW_HND hnd)
+{
+	MFW_BT_TRACE("mfw_bt_delete");
+
+	if (!hnd OR !((T_MFW_HDR *)hnd)->data)
+		return MFW_RES_ILL_HND;
+
+	if (!mfwRemove((T_MFW_HDR *)hnd))
+		return MFW_RES_ILL_HND;
+
+	mfwFree((U8 *)(((T_MFW_HDR *) hnd)->data),sizeof(T_MFW_BT));
+	mfwFree((U8 *)hnd,sizeof(T_MFW_HDR));
+
+	return MFW_RES_OK;
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_signal
+
+ $Description:		This function sends the Mfw Bluetooth events from the Mfw to the BMI.
+
+ $Returns:		None
+
+ $Arguments:		T_MFW_EVENT	: The event to be sent to the BMI
+ 				void *			: Pointer to the Event data
+
+*******************************************************************************/
+void mfw_bt_signal(T_MFW_EVENT event, void *para)
+{
+	UBYTE temp;
+
+	temp = dspl_Enable(0);
+
+
+	if (mfwSignallingMethod EQ 0)
+	{
+		/*
+		* focus is on a window
+		*/
+		if (mfwFocus)
+		{
+			/*
+			* send event to sim management
+			* handler if available
+			*/
+			if (mfw_bt_sign_exec (mfwFocus, event, para))
+			{
+				dspl_Enable(temp);
+				return;
+			}
+		}
+
+		/*
+		* actual focussed window is not available
+		* or has no network management registration
+		* handler, then search all nodes from the root.
+		*/
+		if (mfwRoot)
+			mfw_bt_sign_exec (mfwRoot, event, para);
+	}
+	else
+	{
+		MfwHdr * h = 0;
+
+		/*
+		* Focus set, then start here
+		*/
+		if (mfwFocus)
+			h = mfwFocus;
+
+		/*
+		* Focus not set, then start root
+		*/
+		if (!h)
+			h = mfwRoot;
+
+		/*
+		* No elements available, return
+		*/
+		while (h)
+		{
+			/*
+			* Signal consumed, then return
+			*/
+			if (mfw_bt_sign_exec (h, event, para))
+			{
+				dspl_Enable(temp);
+				return;
+			}
+
+			/*
+			* All windows tried inclusive root
+			*/
+			if (h == mfwRoot)
+			{
+				dspl_Enable(temp);
+				return;
+			}
+
+			/*
+			* get parent window
+			*/
+			h = mfwParent(mfwParent(h));
+
+			if (h)
+				h = ((MfwWin * )(h->data))->elems;
+		}
+		
+		mfw_bt_sign_exec (mfwRoot, event, para);
+		
+	}
+	
+	dspl_Enable(temp);
+
+	return;
+}
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_sign_exec
+
+ $Description:		This function sends the Mfw Bluetooth events from the Mfw to the BMI.
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+BOOL mfw_bt_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_BT_PARA * para)
+{
+	MFW_BT_TRACE("mfw_bt_sign_exec");
+
+	while (cur_elem)
+	{
+		/*
+		* event handler is available
+		*/
+		if (cur_elem->type EQ MfwTypBt)
+		{
+			T_MFW_BT * bt_data;
+			/*
+			* handler is CM management handler
+			*/
+			bt_data = (T_MFW_BT *)cur_elem->data;
+			if (bt_data->emask & event)
+			{
+				/*
+				* event is expected by the call back function
+				*/
+				bt_data->event = event;
+				switch (event)
+				{
+					/*
+					** Generic Events
+					*/
+					case E_BT_ENABLE_CMPL:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_ENABLE_CMPL));
+						break;
+
+					case E_BT_DISABLE_CMPL:
+						memset(&bt_data->para, 0x00, sizeof(T_MFW_BT_PARA));
+						break;
+
+					/*
+					** Device Manager Events
+					*/
+					case E_BT_DM_LINK_UP:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_LINK_UP));
+						break;
+
+					case E_BT_DM_LINK_DOWN:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_LINK_DOWN));
+						break;
+
+					case E_BT_DM_INQ_RES:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_INQ_RES));
+						break;
+
+					case E_BT_DM_INQ_CMPL:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_INQ_CMPL));
+						break;
+
+					case E_BT_DM_DISC_RES:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_DISC_RES));
+						break;
+
+					case E_BT_DM_DISC_CMPL:
+						memset(&bt_data->para, 0x00, sizeof(T_MFW_BT_PARA));
+						break;
+
+					case E_BT_DM_PIN_REQ:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_PIN_REQ));
+						break;
+
+					case E_BT_DM_AUTH_CMPL:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_AUTH_CMPL));
+						break;
+
+					case E_BT_DM_AUTHORIZE_REQ:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_AUTHORIZE_REQ));
+						break;
+
+					case E_BT_DM_DEV_NAME_REQ:
+						memset(&bt_data->para, 0x00, sizeof(T_MFW_BT_PARA));
+						break;
+
+					case E_BT_DM_SIG_STRENGTH_IND:
+						memcpy (&bt_data->para, para, sizeof (T_MFW_BT_DM_SIG_STRENGTH_IND));
+						break;
+
+				}
+
+				/*
+				* if call back defined, call it
+				*/
+				if (bt_data->handler)
+				{
+					// store current mfw elem
+					current_mfw_elem = cur_elem;
+
+					if ((*(bt_data->handler)) (bt_data->event, (void *)&bt_data->para))
+						return TRUE;
+				}
+			}
+		}
+		cur_elem = cur_elem->next;
+	}
+	return FALSE;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_ge_enable
+
+ $Description:		This function initialises the Generic Event Handler, it should be active only
+ 				when bluetooth is enabled.
+
+ $Returns:		MFW_BT_UNABLE_TO_CREATE_EVT_BUF	: Failed to start - memory problems
+ 				MFW_BT_SUCCESS					: Started OK, and Ready
+
+ $Arguments:		None
+
+*******************************************************************************/
+
+T_MFW_BT_STATUS mfw_bt_ge_enable (void)
+{
+	SHORT cbufRetVal;
+
+	MFW_BT_TRACE("mfw_bt_ge_enable");
+
+	/*
+	** Try to create the Circular Event Buffer
+	*/
+	cbufRetVal = mfw_cbuf_create(MFW_BT_MAX_SIG_Q_ENTRIES,		/* Max Entires */
+								sizeof(T_MFW_BT_SIGNALS),		/* Item Size */
+								FALSE,							/* Don't Overwrite */
+								0xFF,							/* Null Character */
+								FALSE,							/* Dynamic Buffer */
+								(void *)0);						/* Buffer pointer not required */
+
+	if (cbufRetVal == MFW_CBUF_MEM_ALLOC_FAILURE)
+	{
+
+		MFW_BT_TRACE("mfw_bt_ge_enable > Buffer Creation Failed with Mem Constraints");
+
+		/*
+		** Failed due to memory constraints, try again with half the number of entries
+		*/
+		cbufRetVal = mfw_cbuf_create(MFW_BT_MAX_SIG_Q_ENTRIES/2,	/* Max Entires */
+									sizeof(T_MFW_BT_SIGNALS),		/* Item Size */
+									FALSE,							/* Don't Overwrite */
+									0xFF,							/* Null Character */
+									FALSE,							/* Dynamic Buffer */
+									(void *)0);						/* Buffer pointer not required */
+		/*
+		** All MFW_CBUF error codes are negative, 0 or a positive value from mfw_cbuf_create is a valid buffer Id
+		*/
+		if (cbufRetVal < 0)
+		{
+
+			MFW_BT_TRACE_P1("mfw_bt_ge_enable > Unable to Create Buffer : Error %d", cbufRetVal);
+
+			/*
+			** Failed to allocate buffer, return an error
+			*/
+			return MFW_BT_UNABLE_TO_CREATE_EVT_BUF;
+		}
+		
+	}
+	else if (cbufRetVal < 0)
+	{
+
+		MFW_BT_TRACE_P1("mfw_bt_ge_enable > Unable to Create Buffer : Error %d", cbufRetVal);
+
+		/*
+		** Failed to allocate buffer, return an error
+		*/
+		return MFW_BT_UNABLE_TO_CREATE_EVT_BUF;
+	}
+
+
+	MFW_BT_TRACE_P1("mfw_bt_ge_enable > Buffer created successfully with Id %d", cbufRetVal);
+
+	/*
+	** A buffer has been created, store the Id for future use.
+	*/
+	Mfw_Bt_Ge_Sigbuf_Id = cbufRetVal;
+
+	return MFW_BT_SUCCESS;
+
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_ge_disable
+
+ $Description:		Disbales the Generic Event Handler, and releases the Dynamic Event Buffer
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+void mfw_bt_ge_disable (void)
+{
+
+	MFW_BT_TRACE("mfw_bt_ge_disable");
+
+
+	/*
+	** Ensure the MFW Bluetooth Event handler is initialised
+	*/
+	if (Mfw_Bt_Ge_Sigbuf_Id < 0)
+	{
+		MFW_BT_TRACE("mfw_bt_ge_disable > Bluetooth Module Not Initialised");
+	}
+	else
+	{
+		mfw_cbuf_delete(Mfw_Bt_Ge_Sigbuf_Id);
+
+		Mfw_Bt_Ge_Sigbuf_Id = -1;
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_ge_post_event
+
+ $Description:		This function stores the incoming event in the event buffer, and if required,
+ 				notifies the MMI Task
+
+ $Returns:		MFW_BT_NOT_INITIALISED	: Fn mfw_bt_ge_enable not called or failed
+ 				MFW_BT_INVALID_ORIG	: Invalid Originator Id received
+ 				MFW_BT_INVALID_EVENT	: Invalid Event Id received
+ 				MFW_BT_INVALID_DATA	: Mismatch between the data pointer and datalen values
+ 				MFW_BT_FAILED_TO_STORE_EVENT	: Event Buffer Full (check trace)
+ 				MFW_BT_SUCCESS		: Event Stored successfuly
+
+ $Arguments:		originator		: Identifier for the originating profile that caused the event
+ 				eventId		: Event Identifier (See BTA Specification)
+ 				data			: pointer to the event data
+ 				dataLen		: length of the event data in bytes (must be 0 if data is (void *)0)
+
+*******************************************************************************/
+T_MFW_BT_STATUS mfw_bt_ge_post_event (T_MFW_BT_ORIGINATORS originator,
+										ULONG eventId,
+										void * data,
+										int dataLen)
+{
+	T_MFW_BT_SIGNALS	sigBuffer;
+	USHORT				numElements;
+	SHORT				cbufRetVal;
+
+	MFW_BT_TRACE("mfw_bt_ge_post_event");
+
+	/*
+	** Ensure the MFW Bluetooth Event handler is initialised
+	*/
+	if (Mfw_Bt_Ge_Sigbuf_Id < 0)
+	{
+		MFW_BT_TRACE("mfw_bt_ge_post_event > Bluetooth Module Not Initialised");
+		return MFW_BT_NOT_INITIALISED;
+	}
+
+	/*
+	** Validate the incoming Parameters
+	*/
+
+	if ((originator >= MFW_BT_MAX_ORIGINATOR) ||
+	     ((originator & (ULONG)0xFFFF) != 0))
+	{
+		MFW_BT_TRACE_P1("mfw_bt_ge_post_event > Originator Invalid : 0x%lx", originator);
+		return MFW_BT_INVALID_ORIG;
+	}
+
+	if (eventId > (ULONG)0xFFFF)
+	{
+		MFW_BT_TRACE_P1("mfw_bt_ge_post_event > Event Id  Invalid : 0x%lx", eventId);
+		return MFW_BT_INVALID_EVENT;
+	}
+
+	if ((dataLen < 0) ||
+	     ((data == (void *)0) && (dataLen != 0)) ||
+	     ((data != (void *)0) && (dataLen == 0)))
+	{
+		MFW_BT_TRACE_P2("mfw_bt_ge_post_event > Data, DataLen combination Invalid : data 0x%lx, dataLen %d", data, dataLen);
+	     return MFW_BT_INVALID_DATA;
+	}
+
+	/*
+	** Create the Event for storage, which is combined from the OriginatorId and the EventId
+	*/
+	sigBuffer.event = originator | eventId;
+
+	/*
+	** Copy the Signal Data for storage
+	*/
+	memcpy((void *)&sigBuffer.data, data, dataLen);
+
+	/*
+	** Get the existing number of elements in the Event Buffer
+	*/
+	numElements = mfw_cbuf_num_elements (Mfw_Bt_Ge_Sigbuf_Id);
+
+	/*
+	** Post the event to the buffer
+	*/
+	cbufRetVal = mfw_cbuf_put(Mfw_Bt_Ge_Sigbuf_Id, (void *)&sigBuffer);
+	
+	if (cbufRetVal != MFW_CBUF_OK)
+	{
+		/*
+		** Unable to store the data
+		*/
+		MFW_BT_TRACE_P1("mfw_bt_ge_post_event > Unable to store the event : Error %d", cbufRetVal);
+
+		return MFW_BT_FAILED_TO_STORE_EVENT;
+	}
+
+	MFW_BT_TRACE("mfw_bt_ge_post_event > Event Successfully Stored");
+
+	/*
+	** If required, Post the MMI_BT_CB_NOTIFY_RXD_IND Primitive
+	*/
+	if ((numElements == 0) &&
+	     (Mfw_Bt_Ge_InProgress == FALSE))
+	{
+		/*
+		** Sending Primitive to MMI TASK
+		*/
+		MFW_BT_TRACE("mfw_bt_ge_post_event > Sending Primitive to MMI TASK");
+		mfw_bt_send_cb_notify_ind();
+	}
+#ifdef MFW_BT_DEBUG
+	else
+	{
+		/*
+		** Sending Primitive to MMI TASK
+		*/
+		MFW_BT_TRACE("mfw_bt_ge_post_event > No need to send Primitive to MMI TASK");
+	}
+#endif
+
+	return MFW_BT_SUCCESS;
+}
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_cb_notify_rxd
+
+ $Description:		This function is called on receipt of the MMI_BT_CB_NOTIFY_IND primitive, it reads
+ 				the events from the event buffer and passes the details to the appropriate Profile
+ 				Handler. It will process a Maximum of MFW_BT_MAX_CONSEC_SIG_PROC events
+ 				before reposting the primitive to the MMI Queue and relinquishing control.
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+void mfw_bt_cb_notify_rxd(void)
+{
+	T_MFW_BT_SIGNALS sigBuffer;
+	T_MFW_BT_ORIGINATORS originatorId;
+	T_MFW_BT_STATUS hndlrRetVal;
+	ULONG eventId;
+	UBYTE numSigsProcessed;
+	SHORT cbufRetVal;
+
+	MFW_BT_TRACE("mfw_bt_cb_notify_rxd");
+
+	if (Mfw_Bt_Ge_Sigbuf_Id < 0)
+	{
+		MFW_BT_TRACE("Mfw_Bt_cb_notify_rxd > Bluetooth Module Not Initialised");
+		return;
+	}
+
+	/*
+	** Initialise Local and Module variables as required.
+	*/
+	Mfw_Bt_Ge_InProgress = TRUE;
+	numSigsProcessed = 0;
+
+	/*
+	** While there are events in the Buffer, and the maximum number of signals have not
+	** been processed ...
+	*/
+	while ((numSigsProcessed < MFW_BT_MAX_CONSEC_SIG_PROC) && (mfw_cbuf_num_elements(Mfw_Bt_Ge_Sigbuf_Id) > 0))
+	{
+		numSigsProcessed++;
+
+		/*
+		** Read the event details from the buffer
+		*/
+		cbufRetVal = mfw_cbuf_get(Mfw_Bt_Ge_Sigbuf_Id, (void *)&sigBuffer);
+
+		if (cbufRetVal != MFW_CBUF_OK)
+		{
+			Mfw_Bt_Ge_InProgress = FALSE;
+			(void)mfw_cbuf_reset(Mfw_Bt_Ge_Sigbuf_Id);
+			MFW_BT_TRACE_P1("Mfw_Bt_cb_notify_rxd > Unable to read events from Buffer : Error %d", cbufRetVal);
+			return;
+		}
+
+		/*
+		** Seperate the Originator and Event Id values
+		*/
+		originatorId = sigBuffer.event & (ULONG)0xFFFF0000;
+		eventId = sigBuffer.event & (ULONG)0x0000FFFF;
+
+		/*
+		** switch on the originator Id
+		*/
+		switch (originatorId)
+		{
+			case MFW_BT_DM_SECURITY:
+				hndlrRetVal = mfw_bt_dm_security_hndlr((T_MFW_BT_DM_SEC_EVT)eventId,
+													    (T_MFW_BT_DM_SEC_SIG_DATA *)&sigBuffer.data.dmSecSignals);
+				break;
+
+			case MFW_BT_DM_SEARCH:
+				hndlrRetVal = mfw_bt_dm_search_hndlr((T_MFW_BT_DM_SRCH_EVT)eventId,
+													  (T_MFW_BT_DM_SRCH_SIG_DATA *)&sigBuffer.data.dmSrchSignals);
+				break;
+
+			case MFW_BT_DG:
+				hndlrRetVal = mfw_bt_dg_hndlr((T_MFW_BT_DG_EVT)eventId,
+											 (T_MFW_BT_DG_SIG_DATA *)&sigBuffer.data.dgSignals);
+				break;
+
+			case MFW_BT_AG:
+				hndlrRetVal = mfw_bt_ag_hndlr((T_MFW_BT_AG_EVT)eventId,
+											  (T_MFW_BT_AG_SIG_DATA *)&sigBuffer.data.agSignals);
+				break;
+
+			case MFW_BT_OPC:
+				hndlrRetVal = mfw_bt_opc_hndlr((T_MFW_BT_OPC_EVT)eventId,
+											   (T_MFW_BT_OPC_SIG_DATA *)&sigBuffer.data.opcSignals);
+				break;
+
+			case MFW_BT_OPS:
+				hndlrRetVal = mfw_bt_ops_hndlr((T_MFW_BT_OPS_EVT)eventId,
+											   (T_MFW_BT_OPS_SIG_DATA *)&sigBuffer.data.opsSignals);
+				break;
+
+			case MFW_BT_FTC:
+				hndlrRetVal = mfw_bt_ftc_hndlr((T_MFW_BT_FTC_EVT)eventId,
+											  (T_MFW_BT_FTC_SIG_DATA *)&sigBuffer.data.ftcSignals);
+				break;
+
+			case MFW_BT_FTS:
+				hndlrRetVal = mfw_bt_fts_hndlr((T_MFW_BT_FTS_EVT)eventId,
+											  (T_MFW_BT_FTS_SIG_DATA *)&sigBuffer.data.ftsSignals);
+				break;
+
+			default:
+				MFW_BT_TRACE_P1("mfw_bt_cb_notify_rxd > Invalid Originator 0x%lx", originatorId);
+				hndlrRetVal = MFW_BT_SUCCESS;		/* Set the return value to success because an error has already been reported */
+				
+		}
+
+		if (hndlrRetVal <= 0)
+		{
+			/* Error reported by the handler, not a lot can be done, expect report it */
+			MFW_BT_TRACE_P2("mfw_bt_cb_notify_rxd > Error %d returned from Event handler for Originator 0x%lx", hndlrRetVal, originatorId);
+		}
+	}
+
+	Mfw_Bt_Ge_InProgress = FALSE;
+
+	/*
+	** If there are still signals in the buffer, send another MMI_BT_CB_NOTIFY_RXD_IND primitive
+	*/
+	if (mfw_cbuf_num_elements(Mfw_Bt_Ge_Sigbuf_Id) > 0)
+	{
+		MFW_BT_TRACE("Mfw_Bt_cb_notify_rxd > Send the MMI_BT_CB_NOTIFY_IND signal");
+		mfw_bt_send_cb_notify_ind();
+	}
+
+	return;
+}
+
+
+/**************************************************************************************************
+**
+** Local Function Definitions
+**
+**************************************************************************************************/
+
+#define hCommACI _ENTITY_PREFIXED(hCommACI)
+
+
+/*******************************************************************************
+
+ $Function:		mfw_bt_send_cb_notify_ind
+
+ $Description:		This function posts the MMI_BT_CB_NOTIFY_IND primitive to the MMI Queue
+
+ $Returns:		None
+
+ $Arguments:		None
+
+*******************************************************************************/
+static void mfw_bt_send_cb_notify_ind (void)
+{
+#if defined (NEW_FRAME)
+	EXTERN T_HANDLE hCommACI;
+
+
+	ULONG signal_raw;
+#else
+	EXTERN T_VSI_CHANDLE hCommACI;
+#endif
+
+	PALLOC(bt_cb_notify_ind,MMI_BT_CB_NOTIFY_IND);
+
+	MFW_BT_TRACE("mfw_bt_send_cb_notify_ind");
+
+#if defined (NEW_FRAME)
+	PSENDX(ACI,bt_cb_notify_ind);
+#else
+#if defined (_TMS470)
+	vsi_c_send("",hCommACI,D2P(bt_cb_notify_ind),
+	        sizeof(T_PRIM_HEADER)+sizeof(T_MMI_BT_CB_NOTIFY_IND));
+#else
+	PSEND(ACI,bt_cb_notify_ind);
+#endif
+#endif
+
+	return;
+
+}