| /* |
| * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved. |
| * |
| * Previously licensed under the ISC license by Qualcomm Atheros, Inc. |
| * |
| * |
| * Permission to use, copy, modify, and/or distribute this software for |
| * any purpose with or without fee is hereby granted, provided that the |
| * above copyright notice and this permission notice appear in all |
| * copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL |
| * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE |
| * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL |
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
| * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| * PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| /* |
| * This file was originally distributed by Qualcomm Atheros, Inc. |
| * under proprietary terms before Copyright ownership was assigned |
| * to the Linux Foundation. |
| */ |
| |
| /*=========================================================================== |
| |
| b a p A p i T i m e r . C |
| |
| OVERVIEW: |
| |
| This software unit holds the implementation of the timer routines |
| required by the WLAN BAP module. |
| |
| The functions provide by this module are called by the rest of |
| the BT-AMP PAL module. |
| |
| DEPENDENCIES: |
| |
| Are listed for each API below. |
| |
| |
| ===========================================================================*/ |
| |
| /*=========================================================================== |
| |
| EDIT HISTORY FOR FILE |
| |
| |
| This section contains comments describing changes made to the module. |
| Notice that changes are listed in reverse chronological order. |
| |
| |
| $Header: /home/labuser/btamp-label9/CORE/BAP/src/bapApiTimer.c,v 1.5 2010/09/04 00:14:37 labuser Exp labuser $$DateTime$$Author: labuser $ |
| |
| |
| when who what, where, why |
| ---------- --- -------------------------------------------------------- |
| 2008-10-23 jez Created module |
| |
| ===========================================================================*/ |
| |
| /*---------------------------------------------------------------------------- |
| * Include Files |
| * -------------------------------------------------------------------------*/ |
| // I think this pulls in everything |
| #include "vos_types.h" |
| #include "bapApiTimer.h" |
| |
| //#define BAP_DEBUG |
| |
| /*---------------------------------------------------------------------------- |
| * Preprocessor Definitions and Constants |
| * -------------------------------------------------------------------------*/ |
| #define WLAN_BAP_TX_PKT_MONITOR_TIME 100 |
| |
| /*---------------------------------------------------------------------------- |
| * Type Declarations |
| * -------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| * Global Data Definitions |
| * -------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| * External declarations for global context |
| * -------------------------------------------------------------------------*/ |
| #if 1 |
| //*BT-AMP packet LLC OUI value*/ |
| static const v_U8_t WLANBAP_BT_AMP_OUI[] = {0x00, 0x19, 0x58 }; |
| |
| #endif |
| |
| /*---------------------------------------------------------------------------- |
| * Static Variable Definitions |
| * -------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| * Static Function Declarations and Definitions |
| * -------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| * Externalized Function Definitions |
| * -------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| * Function Declarations and Documentation |
| * -------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| * Utility Function implementations |
| * -------------------------------------------------------------------------*/ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_InitConnectionAcceptTimer |
| |
| DESCRIPTION |
| Initialize the Connection Accept Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_InitConnectionAcceptTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Initialize the timer */ |
| vosStatus = vos_timer_init( |
| &pBtampCtx->bapConnectionAcceptTimer, |
| VOS_TIMER_TYPE_SW, /* use this type */ |
| WLANBAP_ConnectionAcceptTimerHandler, |
| pBtampCtx); |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_InitConnectionAcceptTimer */ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_DeinitConnectionAcceptTimer |
| |
| DESCRIPTION |
| Destroy the Connection Accept Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_DeinitConnectionAcceptTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Initialize and then Start the timer */ |
| vosStatus = vos_timer_destroy ( |
| &pBtampCtx->bapConnectionAcceptTimer ); |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_DeinitConnectionAcceptTimer */ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_StartConnectionAcceptTimer |
| |
| DESCRIPTION |
| Start the Connection Accept Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| interval: time interval. |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_StartConnectionAcceptTimer |
| ( |
| ptBtampContext pBtampCtx, |
| v_U32_t interval |
| ) |
| { |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Start the connection accept timer*/ |
| vos_timer_start( |
| &pBtampCtx->bapConnectionAcceptTimer, |
| interval); |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_StartConnectionAcceptTimer */ |
| |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_StopConnectionAcceptTimer |
| |
| DESCRIPTION |
| Stop the Connection Accept Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_StopConnectionAcceptTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Stop the timer */ |
| vosStatus = vos_timer_stop( |
| &pBtampCtx->bapConnectionAcceptTimer); |
| |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_StopConnectionAcceptTimer */ |
| |
| |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_ConnectionAcceptTimerHandler |
| |
| DESCRIPTION |
| Callback function registered with vos timer for the Connection |
| Accept timer |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| userData: pointer can be used to retrive the BT-AMP context |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| v_VOID_t |
| WLANBAP_ConnectionAcceptTimerHandler |
| ( |
| v_PVOID_t userData |
| ) |
| { |
| ptBtampContext pBtampCtx = (ptBtampContext)userData; |
| tWLAN_BAPEvent bapEvent; /* State machine event */ |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| v_U8_t status; /* return the BT-AMP status here */ |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| /*----------------------------------------------------------------------- |
| Sanity check |
| -----------------------------------------------------------------------*/ |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "WLAN BAP: Fatal error in %s", __func__ ); |
| VOS_ASSERT(0); |
| return; |
| } |
| |
| /*--------------------------------------------------------------------- |
| Feed this timeout to the BTAMP FSM |
| ---------------------------------------------------------------------*/ |
| /* Fill in the event structure */ |
| bapEvent.event = eWLAN_BAP_TIMER_CONNECT_ACCEPT_TIMEOUT; |
| bapEvent.params = NULL; |
| |
| /* Handle event */ |
| vosStatus = btampFsm(pBtampCtx, &bapEvent, &status); |
| |
| /* Now transition to fully disconnected and notify phy link disconnect*/ |
| bapEvent.event = eWLAN_BAP_MAC_READY_FOR_CONNECTIONS; |
| bapEvent.params = NULL; |
| |
| /* Handle event */ |
| vosStatus = btampFsm(pBtampCtx, &bapEvent, &status); |
| |
| |
| }/*WLANBAP_ConnectionAcceptTimerHandler*/ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_InitLinkSupervisionTimer |
| |
| DESCRIPTION |
| Initialize the Link Supervision Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_InitLinkSupervisionTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Initialize the timer */ |
| vosStatus = vos_timer_init( |
| &pBtampCtx->bapLinkSupervisionTimer, |
| VOS_TIMER_TYPE_SW, /* use this type */ |
| WLANBAP_LinkSupervisionTimerHandler, |
| pBtampCtx); |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_InitLinkSupervisionTimer */ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_DeinitLinkSupervisionTimer |
| |
| DESCRIPTION |
| Destroy the Link Supervision Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_DeinitLinkSupervisionTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Initialize and then Start the timer */ |
| vosStatus = vos_timer_destroy ( |
| &pBtampCtx->bapLinkSupervisionTimer ); |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_DeinitLinkSupervisionTimer */ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_StartLinkSupervisionTimer |
| |
| DESCRIPTION |
| Start the LinkSupervisionTimer Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| interval: time interval. |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_StartLinkSupervisionTimer |
| ( |
| ptBtampContext pBtampCtx, |
| v_U32_t interval |
| ) |
| { |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| vos_timer_start( |
| &pBtampCtx->bapLinkSupervisionTimer, |
| interval); |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_StartLinkSupervisionTimer */ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_StopLinkSupervisionTimer |
| |
| DESCRIPTION |
| Stop the LinkSupervision Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_StopLinkSupervisionTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Stop the timer */ |
| vosStatus = vos_timer_stop( |
| &pBtampCtx->bapLinkSupervisionTimer); |
| |
| |
| return VOS_STATUS_SUCCESS; |
| }/* WLANBAP_StopLinkSupervisionTimer */ |
| |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_LinkSupervisionTimerHandler |
| |
| DESCRIPTION |
| Callback function registered with vos timer for the LinkSupervision timer |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| userData: pointer can be used to retrive the BT-AMP context |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| v_VOID_t |
| WLANBAP_LinkSupervisionTimerHandler |
| ( |
| v_PVOID_t userData |
| ) |
| { |
| ptBtampContext pBtampCtx = (ptBtampContext)userData; |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| ptBtampHandle btampHandle = (ptBtampHandle)userData; |
| tWLAN_BAPEvent bapEvent; /* State machine event */ |
| v_U8_t phy_link_handle; |
| |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| /*----------------------------------------------------------------------- |
| Sanity check |
| -----------------------------------------------------------------------*/ |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "WLAN BAP: Fatal error in %s", __func__ ); |
| VOS_ASSERT(0); |
| return; |
| } |
| |
| phy_link_handle = pBtampCtx->phy_link_handle; |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "WLAN BAP:In LinkSupervision Timer handler %s", __func__ ); |
| |
| if(pBtampCtx->dataPktPending == VOS_TRUE) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "%s: Data seen. Do nothing", __func__ ); |
| |
| pBtampCtx->dataPktPending = VOS_FALSE; |
| pBtampCtx->lsReqPktPending = VOS_FALSE; |
| pBtampCtx->retries = 0; |
| vosStatus = WLANBAP_StopLinkSupervisionTimer(pBtampCtx); |
| vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, |
| pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); |
| |
| //Data is seen. or our previous packet is not yet fetched by TL.Don't do any thing.Just return; |
| return; |
| } |
| else if((pBtampCtx->lsReqPktPending == VOS_TRUE ) |
| && (pBtampCtx->retries == WLANBAP_LINK_SUPERVISION_RETRIES)) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "#########WLAN BAP: LinkSupervision Timed OUT######## %s", __func__ ); |
| |
| /*--------------------------------------------------------------------- |
| Feed this timeout to the BTAMP FSM |
| ---------------------------------------------------------------------*/ |
| /* Fill in the event structure */ |
| /* JEZ110307: Which should this be? */ |
| //bapEvent.event =eWLAN_BAP_HCI_PHYSICAL_LINK_DISCONNECT; |
| bapEvent.event =eWLAN_BAP_MAC_INDICATES_MEDIA_DISCONNECTION; |
| bapEvent.params = NULL; |
| |
| /* Handle event */ |
| vosStatus = btampFsm(pBtampCtx, &bapEvent, (v_U8_t *)&vosStatus); |
| } |
| else |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "%s: Resend the LS packet", __func__ ); |
| |
| /* If we have transmit pkt pending and the time out occurred,resend the ls packet */ |
| WLANBAP_StopLinkSupervisionTimer(pBtampCtx); |
| pBtampCtx->pPacket = pBtampCtx->lsReqPacket; |
| vosStatus = WLANBAP_TxLinkSupervision( btampHandle, |
| phy_link_handle, |
| pBtampCtx->pPacket , |
| WLANTL_BT_AMP_TYPE_LS_REQ); |
| } |
| |
| }/*WLANBAP_LinkSupervisionTimerHandler*/ |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_StartTxPacketMonitorTimer |
| |
| DESCRIPTION |
| Start the Tx Packet Monitor Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| interval: time interval. |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_StartTxPacketMonitorTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| v_U32_t uInterval = WLAN_BAP_TX_PKT_MONITOR_TIME; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Start the timer */ |
| vosStatus = vos_timer_start( &pBtampCtx->bapTxPktMonitorTimer, |
| uInterval); |
| |
| return vosStatus; |
| }/* WLANBAP_StartTxPacketMonitorTimer */ |
| |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_StopTxPacketMonitorTimer |
| |
| DESCRIPTION |
| Stop the Tx Packet Monitor Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| The result code associated with performing the operation |
| |
| VOS_STATUS_E_FAULT: access would cause a page fault |
| VOS_STATUS_SUCCESS: Everything is good :) |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| VOS_STATUS |
| WLANBAP_StopTxPacketMonitorTimer |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| |
| /*------------------------------------------------------------------------ |
| Sanity check BAP control block |
| ------------------------------------------------------------------------*/ |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "Invalid BAP pointer in %s", __func__); |
| return VOS_STATUS_E_FAULT; |
| } |
| |
| /*Stop the timer */ |
| vosStatus = vos_timer_stop( &pBtampCtx->bapTxPktMonitorTimer); |
| |
| |
| return vosStatus; |
| }/* WLANBAP_StopTxPacketMonitorTimer */ |
| |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_SendCompletedPktsEvent |
| |
| DESCRIPTION |
| Utility function for sending the NUM_OF_COMPLETED_PKTS_EVENT to HCI |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| v_VOID_t |
| WLANBAP_SendCompletedPktsEvent |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| v_U8_t i, j; |
| tBtampHCI_Event bapHCIEvent; /* This now encodes ALL event types */ |
| v_U32_t uTxCompleted = 0; |
| tpBtampLogLinkCtx pLogLinkContext = NULL; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| /* Format the Number of completed packets event */ |
| bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_NUM_OF_COMPLETED_PKTS_EVENT; |
| bapHCIEvent.u.btampNumOfCompletedPktsEvent.num_handles = 0; |
| |
| /*--------------------------------------------------------------------- |
| Check if LL still exists, if TRUE generate num_pkt_event and |
| restart the timer |
| ---------------------------------------------------------------------*/ |
| for (i = 0, j = 0; i < WLANBAP_MAX_LOG_LINKS ; i++) |
| { |
| pLogLinkContext = &pBtampCtx->btampLogLinkCtx[i]; |
| if ( pLogLinkContext->present ) |
| { |
| uTxCompleted = pLogLinkContext->uTxPktCompleted; |
| bapHCIEvent.u.btampNumOfCompletedPktsEvent.conn_handles[j] = |
| pLogLinkContext->log_link_handle; |
| bapHCIEvent.u.btampNumOfCompletedPktsEvent.num_completed_pkts[j] = |
| uTxCompleted; |
| |
| j++; |
| |
| vos_atomic_decrement_U32_by_value((v_U32_t *) &pLogLinkContext->uTxPktCompleted, |
| (v_U32_t) uTxCompleted); |
| |
| if (uTxCompleted) { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "wlan bap: %s Log Link handle - %d No Of Pkts - %d", __func__, |
| pLogLinkContext->log_link_handle, uTxCompleted); |
| } |
| } |
| } |
| |
| /* Indicate only if at least one logical link is present and number of |
| completed packets is non zero */ |
| if (j && uTxCompleted) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "WLAN BAP: Indicating Num Completed packets Event"); |
| |
| /*issue num_pkt_event for uTxCompleted*/ |
| bapHCIEvent.u.btampNumOfCompletedPktsEvent.num_handles = j; |
| (*pBtampCtx->pBapHCIEventCB) |
| ( |
| pBtampCtx->pHddHdl, /* this refers the BSL per application context */ |
| &bapHCIEvent, /* This now encodes ALL event types */ |
| VOS_TRUE /* Flag to indicate assoc-specific event */ |
| ); |
| } |
| |
| } |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_SendCompletedDataBlksEvent |
| |
| DESCRIPTION |
| Utility function for sending the NUM_OF_COMPLETED_DATA_BLOCKS_EVENT to HCI |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| pBtampCtx: pointer to the BAP control block |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| v_VOID_t |
| WLANBAP_SendCompletedDataBlksEvent |
| ( |
| ptBtampContext pBtampCtx |
| ) |
| { |
| v_U8_t i, j; |
| tBtampHCI_Event bapHCIEvent; /* This now encodes ALL event types */ |
| v_U32_t uTxCompleted = 0; |
| tpBtampLogLinkCtx pLogLinkContext = NULL; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| /* Format the Number of completed data blocks event */ |
| bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_NUM_OF_COMPLETED_DATA_BLOCKS_EVENT; |
| bapHCIEvent.u.btampNumOfCompletedDataBlocksEvent.num_handles = 0; |
| |
| /*--------------------------------------------------------------------- |
| Check if LL still exists, if TRUE generate num_data_blocks_event and |
| restart the timer |
| ---------------------------------------------------------------------*/ |
| for (i = 0, j = 0; i < WLANBAP_MAX_LOG_LINKS ; i++) |
| { |
| pLogLinkContext = &pBtampCtx->btampLogLinkCtx[i]; |
| if ( pLogLinkContext->present ) |
| { |
| uTxCompleted = pLogLinkContext->uTxPktCompleted; |
| bapHCIEvent.u.btampNumOfCompletedDataBlocksEvent.conn_handles[j] = |
| pLogLinkContext->log_link_handle; |
| bapHCIEvent.u.btampNumOfCompletedDataBlocksEvent.num_completed_pkts[j] = |
| uTxCompleted; |
| bapHCIEvent.u.btampNumOfCompletedDataBlocksEvent.num_completed_blocks[j] = |
| uTxCompleted; |
| bapHCIEvent.u.btampNumOfCompletedDataBlocksEvent.total_num_data_blocks = 16; |
| |
| j++; |
| |
| vos_atomic_decrement_U32_by_value((v_U32_t *) &pLogLinkContext->uTxPktCompleted, |
| (v_U32_t) uTxCompleted); |
| |
| if (uTxCompleted) { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "wlan bap: %s Log Link handle - %d No Of Pkts - %d", __func__, |
| pLogLinkContext->log_link_handle, uTxCompleted); |
| } |
| } |
| } |
| |
| /* Indicate only if at least one logical link is present and number of |
| completed data blocks is non zero */ |
| if (j && uTxCompleted) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "WLAN BAP: Indicating Num Completed Data Blocks Event"); |
| |
| /*issue num_data_blocks_event for uTxCompleted*/ |
| bapHCIEvent.u.btampNumOfCompletedDataBlocksEvent.num_handles = j; |
| (*pBtampCtx->pBapHCIEventCB) |
| ( |
| pBtampCtx->pHddHdl, /* this refers the BSL per application context */ |
| &bapHCIEvent, /* This now encodes ALL event types */ |
| VOS_TRUE /* Flag to indicate assoc-specific event */ |
| ); |
| } |
| |
| } |
| |
| /*========================================================================== |
| |
| FUNCTION WLANBAP_TxPacketMonitorHandler |
| |
| DESCRIPTION |
| Callback function registered with vos timer for the Tx Packet Monitor |
| Timer. |
| |
| DEPENDENCIES |
| |
| PARAMETERS |
| |
| IN |
| userData: pointer can be used to retrive the BT-AMP context |
| |
| RETURN VALUE |
| None |
| |
| SIDE EFFECTS |
| |
| ============================================================================*/ |
| v_VOID_t |
| WLANBAP_TxPacketMonitorHandler |
| ( |
| v_PVOID_t userData |
| ) |
| { |
| ptBtampContext pBtampCtx = (ptBtampContext)userData; |
| BTAMPFSM_INSTANCEDATA_T *instanceVar = &pBtampCtx->bapPhysLinkMachine; |
| /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| |
| /*----------------------------------------------------------------------- |
| Sanity check |
| -----------------------------------------------------------------------*/ |
| if ( NULL == pBtampCtx ) |
| { |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, |
| "WLAN BAP: Fatal error in %s", __func__ ); |
| VOS_ASSERT(0); |
| return; |
| } |
| |
| #if 0 //BAP_DEBUG |
| /* Trace the tBtampCtx being passed in. */ |
| VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, |
| "WLAN BAP Context Monitor: pBtampCtx value = %x in %s:%d", pBtampCtx, __func__, __LINE__ ); |
| #endif //BAP_DEBUG |
| |
| if(WLANBAP_FLOW_CONTROL_MODE_BLOCK_BASED == pBtampCtx->ucDataTrafficMode) |
| { |
| WLANBAP_SendCompletedDataBlksEvent(pBtampCtx); |
| } |
| else |
| { |
| WLANBAP_SendCompletedPktsEvent(pBtampCtx); |
| } |
| |
| /* Restart the Packet monitoring timer if still Physical link |
| * is present. |
| * It is possible that when the physical link is tear down, |
| * timer start request is in Q and could start again. |
| */ |
| if (CONNECTED == instanceVar->stateVar) |
| { |
| WLANBAP_StartTxPacketMonitorTimer(pBtampCtx); |
| } |
| }/*WLANBAP_TxPacketMonitorHandler*/ |
| |