/*
 * 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 L i n k C n t l . C
                                               
  OVERVIEW:
  
  This software unit holds the implementation of the WLAN BAP modules
  Link Control functions.
  
  The functions externalized by this module are to be called ONLY by other 
  WLAN modules (HDD) that properly register with the BAP Layer initially.

  DEPENDENCIES: 

  Are listed for each API below. 
  
  
  Copyright (c) 2008 QUALCOMM Incorporated.
  All Rights Reserved.
  Qualcomm Confidential and Proprietary
===========================================================================*/

/*===========================================================================

                      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/ampBlueZ_2/CORE/BAP/src/bapApiLinkCntl.c,v 1.1 2010/10/23 23:40:28 labuser Exp labuser $$DateTime$$Author: labuser $


  when        who     what, where, why
----------    ---    --------------------------------------------------------
2008-09-15    jez     Created module

===========================================================================*/

/*----------------------------------------------------------------------------
 * Include Files
 * -------------------------------------------------------------------------*/
//#include "wlan_qct_tl.h"
#include "vos_trace.h"
// Pick up the CSR callback definition
#include "csrApi.h"

/* BT-AMP PAL API header file */ 
#include "bapApi.h" 
#include "bapInternal.h" 
#include "btampFsm.h"

//#define BAP_DEBUG
/*----------------------------------------------------------------------------
 * Preprocessor Definitions and Constants
 * -------------------------------------------------------------------------*/


/*----------------------------------------------------------------------------
 * Type Declarations
 * -------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * Global Data Definitions
 * -------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * Static Variable Definitions
 * -------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * Static Function Declarations and Definitions
 * -------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * Externalized Function Definitions
* -------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * Function Declarations and Documentation
 * -------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------

  FUNCTION    WLANBAP_RoamCallback()

  DESCRIPTION 
    Callback for Roam (connection status) Events  

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
      pContext:  is the pContext passed in with the roam request
      pCsrRoamInfo: is a pointer to a tCsrRoamInfo, see definition of eRoamCmdStatus and
      eRoamCmdResult: for detail valid members. It may be NULL
      roamId: is to identify the callback related roam request. 0 means unsolicited
      roamStatus: is a flag indicating the status of the callback
      roamResult: is the result
   
  RETURN VALUE
    The eHalStatus code associated with performing the operation  

    eHAL_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
#if 0
eCSR_ROAM_RESULT_WDS_STARTED 
#define eWLAN_BAP_MAC_START_BSS_SUCCESS /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_STARTED */

eCSR_ROAM_RESULT_FAILURE 
eCSR_ROAM_RESULT_NOT_ASSOCIATED
#define eWLAN_BAP_MAC_START_FAILS /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_FAILURE or eCSR_ROAM_RESULT_NOT_ASSOCIATED */

eCSR_ROAM_RESULT_WDS_ASSOCIATED
#define eWLAN_BAP_MAC_CONNECT_COMPLETED /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_ASSOCIATED */


eCSR_ROAM_RESULT_FAILURE 
eCSR_ROAM_RESULT_NOT_ASSOCIATED 
#define eWLAN_BAP_MAC_CONNECT_FAILED /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_FAILURE or eCSR_ROAM_RESULT_NOT_ASSOCIATED */


eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND
#define eWLAN_BAP_MAC_CONNECT_INDICATION /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND */


eCSR_ROAM_RESULT_KEY_SET 
#define eWLAN_BAP_MAC_KEY_SET_SUCCESS /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_KEY_SET */


eCSR_ROAM_RESULT_WDS_DISASSOC_IND
#define eWLAN_BAP_MAC_INDICATES_MEDIA_DISCONNECTION /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_DISASSOC_IND */


eCSR_ROAM_RESULT_WDS_STOPPED
#define eWLAN_BAP_MAC_READY_FOR_CONNECTIONS /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_STOPPED */

#endif //0


eHalStatus
WLANBAP_RoamCallback
(
  void *pContext, 
  tCsrRoamInfo *pCsrRoamInfo,
  tANI_U32 roamId, 
  eRoamCmdStatus roamStatus, 
  eCsrRoamResult roamResult
)
{
    eHalStatus  halStatus = eHAL_STATUS_SUCCESS; 
    /* btampContext value */    
    ptBtampContext btampContext = (ptBtampContext) pContext; 
    tWLAN_BAPEvent bapEvent; /* State machine event */
    VOS_STATUS  vosStatus = VOS_STATUS_SUCCESS; 
    v_U8_t status;    /* return the BT-AMP status here */
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on roamStatus = %d", __func__, roamStatus);

    switch (roamStatus) {
        //JEZ081110: For testing purposes, with Infra STA as BT STA, this 
        //actually takes care of the "eCSR_ROAM_RESULT_WDS_STARTED" case, 
        //below, better than "eCSR_ROAM_RESULT_IBSS_STARTED".  
        //case eCSR_ROAM_ROAMING_START: 
        case eCSR_ROAM_ASSOCIATION_START: 
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_STARTED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_ROAMING_START", roamResult);   
            // This only gets called when CSR decides to roam on its own - due to lostlink. 
#if 0
            if ((pCsrRoamInfo) && (pCsrRoamInfo->pConnectedProfile) && (pCsrRoamInfo->pConnectedProfile->pBssDesc))
            {
                memcpy(bssid.ether_addr_octet, pCsrRoamInfo->pConnectedProfile->pBssDesc->bssId,
                       sizeof(tSirMacAddr)); 
                apple80211Interface->willRoam(&bssid);  // Return result isn't significant 
                VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: willRoam returns\n", __func__);
            }
#endif //0
            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_START_BSS_SUCCESS; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);

            break;

        case eCSR_ROAM_SET_KEY_COMPLETE:
            /* bapRoamCompleteCallback with eCSR_ROAM_SET_KEY_COMPLETE */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamStatus = %s (%d)", __func__, "eCSR_ROAM_SET_KEY_COMPLETE", roamStatus);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_KEY_SET_SUCCESS; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            break;

        case eCSR_ROAM_DISASSOCIATED: 
            /* bapRoamCompleteCallback with eCSR_ROAM_DISASSOCIATED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamStatus = %s (%d)", __func__, "eCSR_ROAM_DISASSOCIATED", roamStatus);   
        case eCSR_ROAM_LOSTLINK:
            /* bapRoamCompleteCallback with eCSR_ROAM_LOSTLINK */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamStatus = %s (%d)", __func__, "eCSR_ROAM_LOSTLINK", roamStatus);   

            if (roamResult != eCSR_ROAM_RESULT_NONE) {
                /* Fill in the event structure */ 
                bapEvent.event = eWLAN_BAP_MAC_READY_FOR_CONNECTIONS; 
                bapEvent.params = pCsrRoamInfo;
                bapEvent.u1 = roamStatus;
                bapEvent.u2 = roamResult; 
                
                /* Handle event */ 
                vosStatus = btampFsm(btampContext, &bapEvent, &status);
            }
  
            break;

        default:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, unsupported CSR roamStatus = %d", __func__, roamStatus);

            break;
    }

    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on roamResult = %d", __func__, roamResult);

    switch (roamResult) {
        //JEZ081110: Commented out for testing. Test relies upon IBSS. 
        case eCSR_ROAM_RESULT_IBSS_STARTED:  
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_IBSS_STARTED", roamResult);   
        case eCSR_ROAM_RESULT_WDS_STARTED: 
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_STARTED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_STARTED", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_START_BSS_SUCCESS; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            break;

        //JEZ081110: Commented out for testing. Test relies upon IBSS. 
        //JEZ081110: But I cannot rely upon IBSS for the initial testing. 
        case eCSR_ROAM_RESULT_FAILURE: 
        //case eCSR_ROAM_RESULT_NOT_ASSOCIATED:
        //case eCSR_ROAM_RESULT_IBSS_START_FAILED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_FAILURE or eCSR_ROAM_RESULT_NOT_ASSOCIATED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_FAILURE", roamResult);   
#ifdef FEATURE_WLAN_BTAMP_UT_RF
            break;
#endif
        case eCSR_ROAM_RESULT_WDS_START_FAILED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_START_FAILED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_START_FAILED", roamResult);   

            /* Fill in the event structure */ 
            /* I don't think I should signal a eCSR_ROAM_RESULT_FAILURE 
             * as a eWLAN_BAP_MAC_START_FAILS
             */ 
            bapEvent.event = eWLAN_BAP_MAC_START_FAILS; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);

            break;

        //JEZ081110: Commented out for testing. This handles both Infra STA and IBSS STA.
        case eCSR_ROAM_RESULT_IBSS_CONNECT:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_IBSS_CONNECT", roamResult);   
        case eCSR_ROAM_RESULT_ASSOCIATED:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_ASSOCIATED", roamResult);   
        case eCSR_ROAM_RESULT_WDS_ASSOCIATED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_ASSOCIATED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_ASSOCIATED", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_CONNECT_COMPLETED;
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            break;

        //JEZ081110: Commented out for testing. Test relies upon IBSS. 
        //JEZ081110: But I cannot rely upon IBSS for the initial testing. 
        //case eCSR_ROAM_RESULT_FAILURE: 
        case eCSR_ROAM_RESULT_IBSS_START_FAILED:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_IBSS_START_FAILED", roamResult);   
        case eCSR_ROAM_RESULT_NOT_ASSOCIATED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_FAILURE or eCSR_ROAM_RESULT_NOT_ASSOCIATED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_NOT_ASSOCIATED", roamResult);   
#ifdef FEATURE_WLAN_BTAMP_UT_RF
            break;
#endif
        case eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_CONNECT_FAILED; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            break;

        //JEZ081110: I think I have to check for the bssType to
        //differentiate between IBSS Start and IBSS Join success.  
        //case eCSR_ROAM_RESULT_IBSS_CONNECT:
            //VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_IBSS_CONNECT", roamResult);   

        //JEZ081110: Commented out for testing. Test relies upon IBSS. 
        // No longer commented out. 
        case eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_CONNECT_INDICATION;
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            /* If BAP doesn't like the incoming association, signal SME/CSR */ 
            if ( status != WLANBAP_STATUS_SUCCESS) 
                halStatus = eHAL_STATUS_FAILURE;
  
            break;

        //JEZ081110: Not supported in SME and CSR, yet. 
#if 0
        case eCSR_ROAM_RESULT_KEY_SET: 
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_KEY_SET */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_KEY_SET", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_KEY_SET_SUCCESS; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            break;
#endif //0

        case eCSR_ROAM_RESULT_DISASSOC_IND:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_DISASSOC_IND", roamResult);   
        case eCSR_ROAM_RESULT_WDS_DISASSOCIATED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_DISASSOCIATED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_DISASSOCIATED", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event =  eWLAN_BAP_MAC_INDICATES_MEDIA_DISCONNECTION; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            /* Fill in the event structure */ 
            bapEvent.event =  eWLAN_BAP_MAC_READY_FOR_CONNECTIONS;
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);

            break;

        //JEZ081110: Commented out for testing. Test relies upon IBSS. 
        case eCSR_ROAM_RESULT_IBSS_INACTIVE:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_IBSS_INACTIVE", roamResult);   
        case eCSR_ROAM_RESULT_WDS_STOPPED:
            /* bapRoamCompleteCallback with eCSR_ROAM_RESULT_WDS_STOPPED */
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR roamResult = %s (%d)", __func__, "eCSR_ROAM_RESULT_WDS_STOPPED", roamResult);   

            /* Fill in the event structure */ 
            bapEvent.event = eWLAN_BAP_MAC_READY_FOR_CONNECTIONS; 
            bapEvent.params = pCsrRoamInfo;
            bapEvent.u1 = roamStatus;
            bapEvent.u2 = roamResult;

            /* Handle event */ 
            vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
            break;

        default:
            VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, unsupported CSR roamResult = %d", __func__, roamResult);

            break;
    }

#if 0
    switch (roamResult) {
        case eCSR_ROAM_RESULT_IBSS_CONNECT:
            // we have an IBSS connection...

            // update our state
            btampContext->mAssociatedStatus = WLANBAP_STATUS_SUCCESS;
            btampContext->mAssociated = VOS_TRUE;
            // update "assocBssid" with the BSSID of the IBSS
            if (pCsrRoamInfo) 
                memcpy(btampContext->assocBssid, pCsrRoamInfo->peerMacOrBssidForIBSS, 6);

            // We must update the system role to match that of the
            // lower layers in case the upper layers decided to try
            // joining the network in infrastructure mode if the
            // initial join in IBSS mode fails.  Andreas Wolf
            // (awolf@apple.com) explains the behavior as follows:
            // "If the client attempts to join an open network and it fails 
            // on the first attempt, it reverts back to b-only mode. This
            // workaround was specifically put in place to allow the client
            // to associate to some third party b-only infrastructure APs.
            // It did not take IBSS into account, it seems that the fallback
            // always forces infrastructure." 

            btampContext->systemRole = eSYSTEM_STA_IN_IBSS_ROLE;

            if (mLinkStatus == 0)
            {
                // enable the flow of data
                DBGLOG("%s: marking link as up in %s\n", __func__, "eCSR_ROAM_RESULT_IBSS_CONNECT");
                mLinkStatus = 1;
                ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkUp);
                outputQueue->setCapacity(TRANSMIT_QUEUE_SIZE);
                outputQueue->start();
                // Let them know we are ready
                ((IO80211Interface*) mNetworkIF)->postMessage(APPLE80211_M_ASSOC_DONE);
            }
            else
            {
                DBGLOG("%s: link is already up in %s\n", __func__, "eCSR_ROAM_RESULT_IBSS_CONNECT");
            }
            break;

        case eCSR_ROAM_RESULT_IBSS_INACTIVE:
            // we have no more IBSS peers, so disable the flow of data
            if (mLinkStatus != 0)
            {
                DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_RESULT_IBSS_INACTIVE");
                mLinkStatus = (tANI_U8) 0;
                // JEZ070627: Revisit ?
                ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
                outputQueue->stop();
                outputQueue->setCapacity(0);

                // update our state
                btampContext->mAssociated = false;
            }
            else
            {
                DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_RESULT_IBSS_INACTIVE");
            }

            break;

        case eCSR_ROAM_RESULT_ASSOCIATED:
            btampContext->mAssociatedStatus = APPLE80211_STATUS_SUCCESS;
            btampContext->mAssociated = true;

            if ((pCsrRoamInfo) && (pCsrRoamInfo->pBssDesc)) {
                ccpCsrToAppleScanResult(mPMacObject, pCsrRoamInfo->pBssDesc, &scanResult); 
                
                /* Save away the IEs used by the AP */
                ccpCsrToAssocApiedata( mPMacObject, pCsrRoamInfo->pBssDesc, &(btampContext->apiedata));
                
                if (BssidChanged((tCsrBssid*) btampContext->assocBssid, (ether_addr*) scanResult.asr_bssid)) { 
                    memcpy(btampContext->assocBssid, scanResult.asr_bssid, 6);
                    ((IO80211Interface*) mNetworkIF)->postMessage(APPLE80211_M_BSSID_CHANGED );
                }
            }

            ((IO80211Interface*) mNetworkIF)->postMessage(APPLE80211_M_ASSOC_DONE);

            if (mLinkStatus == 0)
            {
                mLinkStatus = (tANI_U8) 1;
                ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkUp);
                DBGLOG("%s: marking link as up in %s\n", __func__, "eCSR_ROAM_RESULT_ASSOCIATED");
                outputQueue->setCapacity(TRANSMIT_QUEUE_SIZE);
                outputQueue->start();
            }
            else
            {
                DBGLOG("%s: link is already up in %s\n", __func__, "eCSR_ROAM_RESULT_ASSOCIATED");
            }
            break;
        case eCSR_ROAM_RESULT_NOT_ASSOCIATED:
            btampContext->mAssociatedStatus = APPLE80211_STATUS_UNAVAILABLE;
            btampContext->mAssociated = false;

            if (mLinkStatus != 0)
            {
                DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_RESULT_NOT_ASSOCIATED");
                mLinkStatus = (tANI_U8) 0;
                ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
            }
            else
            {
                DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_RESULT_NOT_ASSOCIATED");
            }
            break;
           
        case eCSR_ROAM_RESULT_FAILURE:
            btampContext->mAssociatedStatus = APPLE80211_STATUS_UNSPECIFIED_FAILURE;
            btampContext->mAssociated = false;

            if (mLinkStatus != 0)
            {
                DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_RESULT_FAILURE");
                mLinkStatus = (tANI_U8) 0;
                ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
            }
            else
            {
                DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_RESULT_FAILURE");
            }
            break;
        
        case eCSR_ROAM_RESULT_DISASSOC_IND:
            {
                btampContext->mAssociated = false;

                if (mLinkStatus != 0)
                {
                    DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_RESULT_DISASSOC_IND");
                    mLinkStatus = (tANI_U8) 0;
                    ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
                }
                else
                {
                    DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_RESULT_DISASSOC_IND");
                }

                //if (pCsrRoamInfo)  // For now, leave this commented out. Until CSR changes integrated.
                {
                    // Now set the reason and status codes.  
                    // Actually, the "result code" field in the tSirSmeDisassocInd should be named reasonCode and NOT statusCode.  
                    // "Reason Codes" are found in DisAssoc or DeAuth Ind. "Status Code" fields are found in Rsp Mgmt Frame.  
                    // For now, we are going to have to (painfully) map the only "result code" type information we have 
                    // available at ALL from LIM/CSR.  And that is the statusCode field of type tSirResultCodes         
                    // BTW, tSirResultCodes is the COMPLETELY WRONG TYPE for this "result code" field. It SHOULD be 
                    // of type tSirMacReasonCodes.         
                    // Right now, we don't even have that.  So, I have to just make up some "reason code" that I will
                    // pretend I found in the incoming DisAssoc Indication.        
                    //btampContext->statusCode = ((tpSirSmeDisassocInd) pCallbackInfo)->statusCode; // tSirResultCodes         
                    //btampContext->reasonCode = ((tpSirSmeDisassocInd) pCallbackInfo)->statusCode; // tSirResultCodes         
                    btampContext->reasonCode = (tANI_U16) eSIR_MAC_UNSPEC_FAILURE_REASON; //tANI_U16 // tSirMacReasonCodes         
                    btampContext->deAuthReasonCode = 0; // tANI_U16   // eSIR_SME_DEAUTH_FROM_PEER 
                    // Shouldn't the next line really use a tANI_U16? //0; // tANI_U16   // eSIR_SME_DISASSOC_FROM_PEER
                    btampContext->disassocReasonCode = btampContext->reasonCode; // tSirMacReasonCodes 
                    // Let's remember the peer who just disassoc'd us
                    //memcpy(btampContext->peerMacAddr, pCsrRoamInfo->peerMacOrBssidForIBSS, 6);
                } 
            }
            break;

        case eCSR_ROAM_RESULT_DEAUTH_IND:
            {
                btampContext->mAssociated = false;

                if (mLinkStatus != 0)
                {
                    DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_RESULT_DEAUTH_IND");
                    mLinkStatus = (tANI_U8) 0;
                    ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
                }
                else
                {
                    DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_RESULT_DEAUTH_IND");
                }

                //if (pCsrRoamInfo)  // For now, leave this commented out. Until CSR changes integrated.
                {
                    // Now set the reason and status codes.  
                    // Actually, the "result code" field in the tSirSmeDeauthInd should be named reasonCode and NOT statusCode.  
                    // "Reason Codes" are found in DisAssoc or DeAuth Ind. "Status Code" fields are found in Rsp Mgmt Frame.  
                    // For now, we are going to have to (painfully) map the only "result code" type information we have 
                    // available at ALL from LIM/CSR.  And that is the statusCode field of type tSirResultCodes         
                    // BTW, tSirResultCodes is the COMPLETELY WRONG TYPE for this "result code" field. It SHOULD be 
                    // of type tSirMacReasonCodes.         
                    // Right now, we don't even have that.  So, I have to just make up some "reason code" that I will
                    // pretend I found in the incoming DeAuth Indication.        
                    //btampContext->statusCode = ((tpSirSmeDeauthInd) pCallbackInfo)->statusCode; // tSirResultCodes         
                    //btampContext->reasonCode = ((tpSirSmeDeauthInd) pCallbackInfo)->statusCode; // tSirResultCodes         
                    btampContext->reasonCode = (tANI_U16) eSIR_MAC_UNSPEC_FAILURE_REASON; //tANI_U16 // tSirMacReasonCodes         
                    btampContext->disassocReasonCode = 0; // tANI_U16   // eSIR_SME_DISASSOC_FROM_PEER 
                    // Shouldn't the next line really use a tANI_U16? //0; // tANI_U16   // eSIR_SME_DEAUTH_FROM_PEER
                    btampContext->deAuthReasonCode = btampContext->reasonCode; // tSirMacReasonCodes 
                    // Let's remember the peer who just de-auth'd us
                    //memcpy(btampContext->peerMacAddr, ((tpSirSmeDeauthInd) pCallbackInfo)->peerMacAddr, 6);                
                } 
            }
            break;

        case eCSR_ROAM_RESULT_MIC_ERROR_UNICAST: 

            //if (eCSR_ROAM_MIC_ERROR_IND == roamStatus)  // Make sure
            { 
                if (btampContext->mTKIPCounterMeasures)
                {
                    ((IO80211Interface*) mNetworkIF)->postMessage(APPLE80211_M_MIC_ERROR_UCAST); 
                    DBGLOG("%s: TKIP Countermeasures in effect in %s\n", __func__, "eCSR_ROAM_RESULT_MIC_ERROR_UNICAST"); 
                } 
                else 
                { 
                    DBGLOG("%s: TKIP Countermeasures disabled in %s\n", __func__, "eCSR_ROAM_RESULT_MIC_ERROR_UNICAST"); 
                }
            }
            break;

        case eCSR_ROAM_RESULT_MIC_ERROR_GROUP: 

            //if (eCSR_ROAM_MIC_ERROR_IND == roamStatus)  // Make sure
            { 
                if (btampContext->mTKIPCounterMeasures)
                { 
                    ((IO80211Interface*) mNetworkIF)->postMessage(APPLE80211_M_MIC_ERROR_MCAST); 
                    DBGLOG("%s: TKIP Countermeasures in effect in %s\n", __func__, "eCSR_ROAM_RESULT_MIC_ERROR_GROUP"); 
                } 
                else 
                { 
                    DBGLOG("%s: TKIP Countermeasures disabled in %s\n", __func__, "eCSR_ROAM_RESULT_MIC_ERROR_GROUP"); 
                }
            }
            break;

        default:
            break;
    }
    switch (roamStatus) {
        case eCSR_ROAM_ROAMING_START: 
            DBGLOG("%s: In %s\n", __func__, "eCSR_ROAM_ROAMING_START");
            // This only gets called when CSR decides to roam on its own - due to lostlink. 
            // Apple still needs to be told.
            if ((pCsrRoamInfo) && (pCsrRoamInfo->pConnectedProfile) && (pCsrRoamInfo->pConnectedProfile->pBssDesc))
            {
                memcpy(bssid.ether_addr_octet, pCsrRoamInfo->pConnectedProfile->pBssDesc->bssId,
                       sizeof(tSirMacAddr)); 
                apple80211Interface->willRoam(&bssid);  // Return result isn't significant 
                DBGLOG("%s: willRoam returns\n", __func__);
            }
            break;

        case eCSR_ROAM_SHOULD_ROAM:
            if ((pCsrRoamInfo) && (pCsrRoamInfo->pBssDesc)) {
                // pCallbackInfo points to the BSS desc. Convert to Apple Scan Result.
                halStatus = ccpCsrToAppleScanResult( 
                        mPMacObject, 
                        pCsrRoamInfo->pBssDesc, 
                        &scanResult); 
                if ( halStatus != 0 ) 
                    return eHAL_STATUS_FAILURE;
                roamAccepted = apple80211Interface->shouldRoam(&scanResult);  // Return result is crucial
                if (roamAccepted == true) { 
                    // If the roam is acceptable, return SUCCESS 
                    DBGLOG("%s: shouldRoam returns \"acceptable\"\n", __func__);
//#if 0
                    // Actually, before returning, immediately signal willRoam
                    // This is a workaround for a CSR bug.  Eventually, when 
                    // eCSR_ROAM_ASSOCIATION_START gets called WITH callback param p1
                    // pointing to a tBssDescription, this work-around can be removed.
                    memcpy(bssid.ether_addr_octet, pCsrRoamInfo->pBssDesc->bssId, sizeof(tSirMacAddr)); 
                    apple80211Interface->willRoam(&bssid);  // Return result isn't significant 
                    DBGLOG("%s: willRoam (called out of order) returns\n", __func__);
                    DBGLOG("    with BSSID = " MAC_ADDR_STRING(bssid.ether_addr_octet));
//#endif
                    return eHAL_STATUS_SUCCESS;
                } else { 
                    // If the roam is NOT acceptable, return FAILURE
                    DBGLOG("%s: shouldRoam returns \"NOT acceptable\"\n", __func__);
                    return eHAL_STATUS_FAILURE;
                }
            }
            break;

        case eCSR_ROAM_DISASSOCIATED:
            //if (eCSR_ROAM_RESULT_FORCED == roamResult || eCSR_ROAM_RESULT_MIC_ERROR == roamResult)
            {
                btampContext->mAssociated = false;

                if (mLinkStatus != 0)
                {
                    DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_DISASSOCIATED");
                    mLinkStatus = (tANI_U8) 0;
                    ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
                }
                else
                {
                    DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_DISASSOCIATED");
                }
            }
            break;

        case eCSR_ROAM_LOSTLINK:
            btampContext->mAssociatedStatus = APPLE80211_STATUS_UNSPECIFIED_FAILURE;
            btampContext->mAssociated = false;

            if (mLinkStatus != 0)
            {
                DBGLOG("%s: marking link as down in %s\n", __func__, "eCSR_ROAM_LOSTLINK");
                mLinkStatus = (tANI_U8) 0;
                ((IO80211Interface*) mNetworkIF)->setLinkState(kIO80211NetworkLinkDown);
            }
            else
            {
                DBGLOG("%s: link already down in %s\n", __func__, "eCSR_ROAM_LOSTLINK");
            }
            break;

        case eCSR_ROAM_ASSOCIATION_START:
            DBGLOG("%s: In %s\n", __func__, "eCSR_ROAM_ASSOCIATION_START");
#if 0
            // This is the right place to call willRoam - for an "initial" association.
            // But, unfortunately, when eCSR_ROAM_ASSOCIATION_START gets called, 
            // it doesn't have a pointer to the tBssDescription in the roaming callback 
            // routines parameter p1 (pCallbackInfo in SetWextState).   So, don't use this code, yet.
            if ((pCsrRoamInfo) && (pCsrRoamInfo->pBssDesc) {
                memcpy(bssid.ether_addr_octet, pCsrRoamInfo->pBssDesc->bssId, 6); 
                apple80211Interface->willRoam(&bssid);  // Return result isn't significant 
                DBGLOG("%s: willRoam returns\n", __func__);
                DBGLOG("    with BSSID = " MAC_ADDR_STRING(bssid.ether_addr_octet));
            }
#endif //0
            break;

        case eCSR_ROAM_ASSOCIATION_COMPLETION:
            DBGLOG("%s: In %s\n", __func__, "eCSR_ROAM_ASSOCIATION_COMPLETION");
            break;

        case eCSR_ROAM_MIC_ERROR_IND:   // Handled in eCSR_ROAM_RESULT_MIC_ERROR_UNICAST and GROUP, above
        case eCSR_ROAM_CANCELLED:
        case eCSR_ROAM_ROAMING_COMPLETION:
        case eCSR_ROAM_SCAN_FOUND_NEW_BSS:
        default:
            break;
    }
#endif //0

    return halStatus;
}

/*----------------------------------------------------------------------------
    Host Controller Interface Procedural API
 ---------------------------------------------------------------------------*/

/** BT v3.0 Link Control commands */

/*----------------------------------------------------------------------------
    Each of the next eight command result in asynchronous events (e.g.,  
    HCI_PHYSICAL_LINK_COMPLETE_EVENT, HCI_LOGICAL_LINK_COMPLETE_EVENT, etc...)
    These are signalled thru the event callback. (I.E., (*tpWLAN_BAPEventCB).)
 ---------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPPhysicalLinkCreate()

  DESCRIPTION 
    Implements the actual HCI Create Physical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
                 WLANBAP_GetNewHndl has to be called before every call to 
                 WLAN_BAPPhysicalLinkCreate. Since the context is per 
                 physical link.
    pBapHCIPhysLinkCreate:  pointer to the "HCI Create Physical Link" Structure.
    pHddHdl:  The context passed in by the caller. (e.g., BSL specific context)

    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCIPhysLinkCreate is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPPhysicalLinkCreate 
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Create_Physical_Link_Cmd   *pBapHCIPhysLinkCreate,
  v_PVOID_t      pHddHdl,   /* BSL passes in its specific context */
                            /* And I get phy_link_handle from the Command */
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
    tWLAN_BAPEvent bapEvent; /* State machine event */
    VOS_STATUS  vosStatus;
    /* I am using btampContext, instead of pBapPhysLinkMachine */ 
    //tWLAN_BAPbapPhysLinkMachine *pBapPhysLinkMachine;
    ptBtampContext btampContext = (ptBtampContext) btampHandle; /* btampContext value */ 
    v_U8_t status;    /* return the BT-AMP status here */
    BTAMPFSM_INSTANCEDATA_T *instanceVar = &(btampContext->bapPhysLinkMachine);

    /* Validate params */ 
    if ((pBapHCIPhysLinkCreate == NULL) || (NULL == btampContext))
    {
      VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "%s: btampHandle value: %p, pBapHCIPhysLinkCreate is %p",
                 __func__,  btampHandle, pBapHCIPhysLinkCreate); 
      return VOS_STATUS_E_FAULT;
    }

    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %p", __func__,  btampHandle);

    if(DISCONNECTED != instanceVar->stateVar)
    {
       /* Create/Accept Phy link request in invalid state */
        status = WLANBAP_ERROR_MAX_NUM_CNCTS;

    }
    else
    {
        /* Fill in the event structure */ 
        bapEvent.event = eWLAN_BAP_HCI_PHYSICAL_LINK_CREATE;
        bapEvent.params = pBapHCIPhysLinkCreate;
        //bapEvent.callback = pBapHCIPhysLinkCreateCB;

        /* Allocate a new state machine instance */ 
        /* There will only ever be one of these (NB: Don't assume this.) */
        /* So for now this returns a pointer to a static structure */ 
        /* (With all state set to initial values) */
        vosStatus = WLANBAP_CreateNewPhyLinkCtx ( 
                btampHandle, 
                pBapHCIPhysLinkCreate->phy_link_handle, /*  I get phy_link_handle from the Command */
                pHddHdl,   /* BSL passes in its specific context */
                &btampContext, /* Handle to return per assoc btampContext value in  */ 
                BT_INITIATOR); /* BT_INITIATOR */ 

        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampContext value: %p", __func__,  btampContext);

        /* Handle event */ 
        vosStatus = btampFsm(btampContext, &bapEvent, &status);
    }
  
        /* Format the command status event to return... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
    pBapHCIEvent->u.btampCommandStatusEvent.present = 1;
    pBapHCIEvent->u.btampCommandStatusEvent.status = status;
    pBapHCIEvent->u.btampCommandStatusEvent.num_hci_command_packets = 1;
    pBapHCIEvent->u.btampCommandStatusEvent.command_opcode 
        = BTAMP_TLV_HCI_CREATE_PHYSICAL_LINK_CMD;

    /* ... */ 

    return VOS_STATUS_SUCCESS;
} /* WLAN_BAPPhysicalLinkCreate */ 

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPPhysicalLinkAccept()

  DESCRIPTION 
    Implements the actual HCI Accept Physical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCIPhysLinkAccept:  pointer to the "HCI Accept Physical Link" Structure.
    pHddHdl:  The context passed in by the caller. (e.g., BSL specific context)
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCIPhysLinkAccept is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPPhysicalLinkAccept 
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Accept_Physical_Link_Cmd   *pBapHCIPhysLinkAccept,
  v_PVOID_t      pHddHdl,   /* BSL passes in its specific context */
                            /* And I get phy_link_handle from the Command */
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
    tWLAN_BAPEvent bapEvent; /* State machine event */
    VOS_STATUS  vosStatus;
    /* I am using btampContext, instead of pBapPhysLinkMachine */ 
    //tWLAN_BAPbapPhysLinkMachine *pBapPhysLinkMachine;
    ptBtampContext btampContext = (ptBtampContext) btampHandle; /* btampContext value */ 
    v_U8_t status;    /* return the BT-AMP status here */
    BTAMPFSM_INSTANCEDATA_T *instanceVar;

    /* Validate params */ 
    if ((pBapHCIPhysLinkAccept == NULL) || (NULL == btampContext))
    {
      VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "%s: btampHandle value: %p, pBapHCIPhysLinkAccept is %p",
                 __func__,  btampHandle, pBapHCIPhysLinkAccept); 
      return VOS_STATUS_E_FAULT;
    }

    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %p", __func__,  btampHandle);

    instanceVar = &(btampContext->bapPhysLinkMachine);
    if(DISCONNECTED != instanceVar->stateVar)
    {
       /* Create/Accept Phy link request in invalid state */
        status = WLANBAP_ERROR_MAX_NUM_CNCTS;

    }
    else
    {
        /* Fill in the event structure */ 
        bapEvent.event = eWLAN_BAP_HCI_PHYSICAL_LINK_ACCEPT;
        bapEvent.params = pBapHCIPhysLinkAccept;
        //bapEvent.callback = pBapHCIPhysLinkAcceptCB;

        /* Allocate a new state machine instance */ 
        /* There will only ever be one of these (NB: Don't assume this.) */
        /* So for now this returns a pointer to a static structure */ 
        /* (With all state set to initial values) */
        vosStatus = WLANBAP_CreateNewPhyLinkCtx ( 
                btampHandle, 
                pBapHCIPhysLinkAccept->phy_link_handle, /*  I get phy_link_handle from the Command */
                pHddHdl,   /* BSL passes in its specific context */
                &btampContext, /* Handle to return per assoc btampContext value in  */ 
                BT_RESPONDER); /* BT_RESPONDER */ 

        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampContext value: %p", __func__,  btampContext);

        /* Handle event */ 
        vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
    }
    /* Format the command status event to return... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
    pBapHCIEvent->u.btampCommandStatusEvent.present = 1;
    pBapHCIEvent->u.btampCommandStatusEvent.status = status;
    pBapHCIEvent->u.btampCommandStatusEvent.num_hci_command_packets = 1;
    pBapHCIEvent->u.btampCommandStatusEvent.command_opcode 
        = BTAMP_TLV_HCI_ACCEPT_PHYSICAL_LINK_CMD;

    /* ... */ 

    return VOS_STATUS_SUCCESS;
} /* WLAN_BAPPhysicalLinkAccept */ 

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPPhysicalLinkDisconnect()

  DESCRIPTION 
    Implements the actual HCI Disconnect Physical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCIPhysLinkDisconnect:  pointer to the "HCI Disconnect Physical Link" Structure.
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCIPhysLinkDisconnect is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPPhysicalLinkDisconnect 
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Disconnect_Physical_Link_Cmd   *pBapHCIPhysLinkDisconnect,
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
    tWLAN_BAPEvent bapEvent; /* State machine event */
    VOS_STATUS  vosStatus;
    /* I am using btampContext, instead of pBapPhysLinkMachine */ 
    //tWLAN_BAPbapPhysLinkMachine *pBapPhysLinkMachine;
    ptBtampContext btampContext = (ptBtampContext) btampHandle; /* btampContext value */ 
    v_U8_t status;    /* return the BT-AMP status here */

    /* Validate params */ 
    if (pBapHCIPhysLinkDisconnect == NULL) {
      return VOS_STATUS_E_FAULT;
    }

    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %p", __func__,  btampHandle);

    /* Validate the Physical link handle */
    if (pBapHCIPhysLinkDisconnect->phy_link_handle != btampContext->phy_link_handle) 
    {
        /* Format the command status event to return... */ 
        pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
        pBapHCIEvent->u.btampCommandStatusEvent.present = 1;
        pBapHCIEvent->u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;
        pBapHCIEvent->u.btampCommandStatusEvent.num_hci_command_packets = 1;
        pBapHCIEvent->u.btampCommandStatusEvent.command_opcode
            = BTAMP_TLV_HCI_DISCONNECT_PHYSICAL_LINK_CMD;
        return VOS_STATUS_SUCCESS;
    }

    /* Fill in the event structure */ 
    bapEvent.event = eWLAN_BAP_HCI_PHYSICAL_LINK_DISCONNECT;
    bapEvent.params = pBapHCIPhysLinkDisconnect;

    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampContext value: %p", __func__,  btampContext);

    /* Handle event */ 
    vosStatus = btampFsm(btampContext, &bapEvent, &status);
  
        /* Fill in the event structure */ 
    bapEvent.event =  eWLAN_BAP_MAC_READY_FOR_CONNECTIONS;
    bapEvent.params = pBapHCIPhysLinkDisconnect;

        /* Handle event */ 
    vosStatus = btampFsm(btampContext, &bapEvent, &status);


    /* Format the command status event to return... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
    pBapHCIEvent->u.btampCommandStatusEvent.present = 1;
    pBapHCIEvent->u.btampCommandStatusEvent.status = status;
    pBapHCIEvent->u.btampCommandStatusEvent.num_hci_command_packets = 1;
    pBapHCIEvent->u.btampCommandStatusEvent.command_opcode
        = BTAMP_TLV_HCI_DISCONNECT_PHYSICAL_LINK_CMD;

    /* ... */ 

    return VOS_STATUS_SUCCESS;
} /* WLAN_BAPPhysicalLinkDisconnect */

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPLogicalLinkCreate()

  DESCRIPTION 
    Implements the actual HCI Create Logical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCILogLinkCreate:  pointer to the "HCI Create Logical Link" Structure.
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCILogLinkCreate is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPLogicalLinkCreate
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Create_Logical_Link_Cmd   *pBapHCILogLinkCreate,
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
    tBtampHCI_Event bapHCIEvent; /* This now encodes ALL event types */
    VOS_STATUS  vosStatus;
    ptBtampContext btampContext = (ptBtampContext) btampHandle;
    v_U16_t log_link_index = 0;
    BTAMPFSM_INSTANCEDATA_T *instanceVar = &(btampContext->bapPhysLinkMachine);
    VOS_STATUS  retval;
    v_U16_t index_for_logLinkCtx = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/


    /* Validate params */ 
    if (btampHandle == NULL) {
      return VOS_STATUS_E_FAULT;
    }

    /* Validate params */ 
    if (pBapHCILogLinkCreate == NULL) {
      return VOS_STATUS_E_FAULT;
    }


    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %p", __func__,  btampHandle);

    /* Validate the BAP state to accept the logical link request
       Logical Link create/accept requests are allowed only in
       CONNECTED state */
    /* Form and immediately return the command status event... */ 
    bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
    bapHCIEvent.u.btampCommandStatusEvent.present = 1;
    bapHCIEvent.u.btampCommandStatusEvent.num_hci_command_packets = 1;
    bapHCIEvent.u.btampCommandStatusEvent.command_opcode 
        = BTAMP_TLV_HCI_CREATE_LOGICAL_LINK_CMD;

    retval = VOS_STATUS_E_FAILURE;
    if(DISCONNECTED == instanceVar->stateVar)
    {
       /* Create Logical link request in invalid state */
        pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_CMND_DISALLOWED;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;

    }
    else if (CONNECTED != instanceVar->stateVar)
    {
        /* Create Logical link request in invalid state */
        pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_CMND_DISALLOWED;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_CMND_DISALLOWED;
    }
    else if (pBapHCILogLinkCreate->phy_link_handle != btampContext->phy_link_handle)
    {
       /* Invalid Physical link handle */
        pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
    }
    else
    {
        btampContext->btamp_logical_link_state = WLAN_BAPLogLinkInProgress;

        if( TRUE == btampContext->btamp_logical_link_cancel_pending )
        {
            pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
                WLANBAP_ERROR_NO_CNCT;
            bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;
            btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
            btampContext->btamp_logical_link_cancel_pending = FALSE;
        }
        else
        {
            /* If btamp_async_logical_link_create is set, we will seralize the req
               on MC thread & handle it there after; If the above flag is not set
               respond to HCI the sync way as before */
            if(FALSE == btampContext->btamp_async_logical_link_create)
            {
                 /* Allocate a logical link index for these flow specs */
                 vosStatus = WLANBAP_CreateNewLogLinkCtx( 
                   btampContext, /* per assoc btampContext value */ 
                   pBapHCILogLinkCreate->phy_link_handle, /*  I get phy_link_handle from the Command */
                   pBapHCILogLinkCreate->tx_flow_spec, /*  I get tx_flow_spec from the Command */
                   pBapHCILogLinkCreate->rx_flow_spec, /*  I get rx_flow_spec from the Command */
                   &log_link_index /*  Return the logical link index here */
                   );
                 if (VOS_STATUS_SUCCESS != vosStatus)
                 {
                     /* Invalid flow spec format */
                     pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
                        WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                     bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                     btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
                 }
                 else
                 {
                      retval = VOS_STATUS_SUCCESS;
                      bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_STATUS_SUCCESS;

                      pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status = WLANBAP_STATUS_SUCCESS;
                      btampContext->btamp_logical_link_state = WLAN_BAPLogLinkOpen;
                 }
            }
            else
            {
                btampContext->btamp_logical_link_req_info.phyLinkHandle = 
                    pBapHCILogLinkCreate->phy_link_handle;
                vos_mem_copy(btampContext->btamp_logical_link_req_info.txFlowSpec,
                             pBapHCILogLinkCreate->tx_flow_spec, 18);
                vos_mem_copy(btampContext->btamp_logical_link_req_info.rxFlowSpec,
                             pBapHCILogLinkCreate->rx_flow_spec, 18);
                btampContext->btamp_async_logical_link_create = FALSE;
                vosStatus = btampEstablishLogLink(btampContext);
                if(VOS_STATUS_SUCCESS == vosStatus)
                {
                    retval = VOS_STATUS_E_BUSY;//this will make sure event complete is not sent to HCI
                }
                else
                {
                    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
                        WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                    bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                    btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
                }
    
            }
        }
    }

    vosStatus = (*btampContext->pBapHCIEventCB) 
                (  
                 btampContext->pHddHdl,   /* this refers to the BSL per connection context */
                 &bapHCIEvent, /* This now encodes ALL event types */
                 VOS_TRUE /* Flag to indicate assoc-specific event */ 
                );

    index_for_logLinkCtx = log_link_index >> 8;
    /* Format the Logical Link Complete event to return... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_LOGICAL_LINK_COMPLETE_EVENT;
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.present = 1;

    /*  Return the logical link index here */
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.log_link_handle 
        = log_link_index;
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.phy_link_handle 
        = pBapHCILogLinkCreate->phy_link_handle;
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.flow_spec_id
        = btampContext->btampLogLinkCtx[index_for_logLinkCtx].btampFlowSpec.flow_spec_id;

    /* ... */ 

    return retval;
} /* WLAN_BAPLogicalLinkCreate */

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPLogicalLinkAccept()

  DESCRIPTION 
    Implements the actual HCI Accept Logical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCILogLinkAccept:  pointer to the "HCI Accept Logical Link" Structure.
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCILogLinkAccept is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPLogicalLinkAccept
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Accept_Logical_Link_Cmd   *pBapHCILogLinkAccept,
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
    tBtampHCI_Event bapHCIEvent; /* This now encodes ALL event types */
    VOS_STATUS  vosStatus;
    ptBtampContext btampContext = (ptBtampContext) btampHandle;
    v_U16_t log_link_index = 0;
    BTAMPFSM_INSTANCEDATA_T *instanceVar = &(btampContext->bapPhysLinkMachine);
    VOS_STATUS  retval;
    v_U16_t index_for_logLinkCtx;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/


    /* Validate params */ 
    if (btampHandle == NULL) {
      return VOS_STATUS_E_FAULT;
    }

    /* Validate params */ 
    if (pBapHCILogLinkAccept == NULL) {
      return VOS_STATUS_E_FAULT;
    }


    VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %p", __func__,  btampHandle);

    /* Validate the BAP state to accept the logical link request
       Logical Link create/accept requests are allowed only in
       CONNECTED state */
    /* Form and immediately return the command status event... */ 
    bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
    bapHCIEvent.u.btampCommandStatusEvent.present = 1;
    bapHCIEvent.u.btampCommandStatusEvent.num_hci_command_packets = 1;
    bapHCIEvent.u.btampCommandStatusEvent.command_opcode 
        = BTAMP_TLV_HCI_ACCEPT_LOGICAL_LINK_CMD;

    retval = VOS_STATUS_E_FAILURE;
    if(DISCONNECTED == instanceVar->stateVar)
    {
       /* Create Logical link request in invalid state */
        pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_CMND_DISALLOWED;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;

    }
    else if (CONNECTED != instanceVar->stateVar)
    {
        /* Create Logical link request in invalid state */
        pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_CMND_DISALLOWED;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_CMND_DISALLOWED;
    }
    else if (pBapHCILogLinkAccept->phy_link_handle != btampContext->phy_link_handle)
    {
       /* Invalid Physical link handle */
        pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
    }
    else
    {
        btampContext->btamp_logical_link_state = WLAN_BAPLogLinkInProgress;
        if( TRUE == btampContext->btamp_logical_link_cancel_pending )
        {
            pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
                WLANBAP_ERROR_NO_CNCT;
            bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;
            btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
            btampContext->btamp_logical_link_cancel_pending = FALSE;
        }
        else
        {
            /* If btamp_async_logical_link_create is set, we will seralize the req
               on MC thread & handle it there after; If the above flag is not set
               respond to HCI the sync way as before */
            if(FALSE == btampContext->btamp_async_logical_link_create)
            {
                /* Allocate a logical link index for these flow specs */
                vosStatus = WLANBAP_CreateNewLogLinkCtx( 
                        btampContext, /* per assoc btampContext value */ 
                        pBapHCILogLinkAccept->phy_link_handle, /*  I get phy_link_handle from the Command */
                        pBapHCILogLinkAccept->tx_flow_spec, /*  I get tx_flow_spec from the Command */
                        pBapHCILogLinkAccept->rx_flow_spec, /*  I get rx_flow_spec from the Command */
                        &log_link_index /*  Return the logical link index here */
                        );
                if (VOS_STATUS_SUCCESS != vosStatus)
                {
                    /* Invalid flow spec format */
                    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
                        WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                    bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                    btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
                }
                else
                {
                    retval = VOS_STATUS_SUCCESS;
                    bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_STATUS_SUCCESS;

                    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status = WLANBAP_STATUS_SUCCESS;
                    btampContext->btamp_logical_link_state = WLAN_BAPLogLinkOpen;
                }
            }
            else
            {
                btampContext->btamp_logical_link_req_info.phyLinkHandle = 
                    pBapHCILogLinkAccept->phy_link_handle;
                vos_mem_copy(btampContext->btamp_logical_link_req_info.txFlowSpec,
                             pBapHCILogLinkAccept->tx_flow_spec, 18);
                vos_mem_copy(btampContext->btamp_logical_link_req_info.rxFlowSpec,
                             pBapHCILogLinkAccept->rx_flow_spec, 18);
                btampContext->btamp_async_logical_link_create = FALSE;
                vosStatus = btampEstablishLogLink(btampContext);
                if(VOS_STATUS_SUCCESS == vosStatus)
                {
                    retval = VOS_STATUS_E_BUSY;//this will make sure event complete is not sent to HCI
                }
                else
                {
                    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.status =
                        WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                    bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
                    btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
                }
    
            }
        }
    }
    vosStatus = (*btampContext->pBapHCIEventCB) 
            (  
             btampContext->pHddHdl,   /* this refers to the BSL per connection context */
             &bapHCIEvent, /* This now encodes ALL event types */
             VOS_TRUE /* Flag to indicate assoc-specific event */ 
             );

    index_for_logLinkCtx = log_link_index >> 8;

    /* Format the Logical Link Complete event to return... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_LOGICAL_LINK_COMPLETE_EVENT;
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.present = 1;
    /*  Return the logical link index here */
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.log_link_handle 
        = log_link_index;
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.phy_link_handle 
        = pBapHCILogLinkAccept->phy_link_handle;
    pBapHCIEvent->u.btampLogicalLinkCompleteEvent.flow_spec_id
        = btampContext->btampLogLinkCtx[index_for_logLinkCtx].btampFlowSpec.flow_spec_id;

    /* ... */ 

    return retval;
} /* WLAN_BAPLogicalLinkAccept */

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPLogicalLinkDisconnect()

  DESCRIPTION 
    Implements the actual HCI Disconnect Logical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCILogLinkDisconnect:  pointer to the "HCI Disconnect Logical Link" Structure.
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCILogLinkDisconnect is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPLogicalLinkDisconnect
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Disconnect_Logical_Link_Cmd   *pBapHCILogLinkDisconnect,
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
    tBtampHCI_Event     bapHCIEvent; /* This now encodes ALL event types */
    ptBtampContext      btampContext = (ptBtampContext) btampHandle;
    tpBtampLogLinkCtx   pLogLinkContext;
    VOS_STATUS          retval = VOS_STATUS_SUCCESS;
    v_U8_t              log_link_index;

   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

   /*------------------------------------------------------------------------
    Sanity check
    ------------------------------------------------------------------------*/
    if (( NULL == pBapHCILogLinkDisconnect ) ||
        ( NULL == btampContext))
    {
        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, 
                   "Critical error: Invalid input parameter on %s", 
                   __func__); 
        return VOS_STATUS_E_FAULT; 
    }

    /* Derive logical link index from handle */
    log_link_index = ((pBapHCILogLinkDisconnect->log_link_handle) >> 8);

    if( log_link_index >= WLANBAP_MAX_LOG_LINKS )
    {
       VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, 
                  "Critical error: Invalid input parameter on %s", 
                  __func__); 
        /* Fill in the event code to propagate the event notification to BRM
           BRM generates the Command status Event based on this.*/
        pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_DISCONNECT_LOGICAL_LINK_COMPLETE_EVENT;
        pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.present = 1;
        pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
        return VOS_STATUS_E_INVAL; 

    }

#ifdef BAP_DEBUG
  /* Trace the tBtampCtx being passed in. */
  VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
            "WLAN BAP Context Monitor: btampContext value = %p in %s:%d", btampContext, __func__, __LINE__ );
#endif //BAP_DEBUG

    bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
    bapHCIEvent.u.btampCommandStatusEvent.present = 1;
    bapHCIEvent.u.btampCommandStatusEvent.num_hci_command_packets = 1;
    bapHCIEvent.u.btampCommandStatusEvent.command_opcode 
        = BTAMP_TLV_HCI_DISCONNECT_LOGICAL_LINK_CMD;

   /*------------------------------------------------------------------------
    FIXME: Validate the Logical Link handle, Generation and freeing...
    Here the Logical link is not validated and assumed that it is correct to. 
    get the Logical link context.                                                                        . 
    ------------------------------------------------------------------------*/
    pLogLinkContext = 
    &(btampContext->btampLogLinkCtx[log_link_index]);
    
    // Validate whether the context is active.
    if ((VOS_FALSE == pLogLinkContext->present) ||
        (pBapHCILogLinkDisconnect->log_link_handle != pLogLinkContext->log_link_handle))
    {
        /* If status is failed, the platform specific layer generates the
           command status event with proper status */
        pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.status =
            WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;
        retval = VOS_STATUS_E_FAILURE;
#ifdef BAP_DEBUG
        /* Log the error. */
        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
                "%s:%d Invalid Logical Link handle(should be) = %d(%d)", __func__, __LINE__,  
                pBapHCILogLinkDisconnect->log_link_handle, pLogLinkContext->log_link_handle);
        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
                " Logical Link index = %d", log_link_index);
#endif //BAP_DEBUG
    }
    else
    {
        /* Form and return the command status event... */ 
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_STATUS_SUCCESS;
        pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.status 
            = WLANBAP_STATUS_SUCCESS;
    

        pLogLinkContext->present         = VOS_FALSE; 
        pLogLinkContext->uTxPktCompleted = 0;
        pLogLinkContext->log_link_handle = 0;
        /* Decrement the total logical link count */
        btampContext->total_log_link_index--;
        btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
    }
    
    /* Notify the Command status Event */
    (*btampContext->pBapHCIEventCB) 
        (  
            btampContext->pHddHdl,   /* this refers to the BSL per connection context */
            &bapHCIEvent, /* This now encodes ALL event types */
            VOS_TRUE /* Flag to indicate assoc-specific event */ 
        );

    /* Format the Logical Link Complete event to return... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_DISCONNECT_LOGICAL_LINK_COMPLETE_EVENT;
    pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.present = 1;
    /*  Return the logical link index here */
    pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.log_link_handle 
        = pBapHCILogLinkDisconnect->log_link_handle;
    pBapHCIEvent->u.btampDisconnectLogicalLinkCompleteEvent.reason 
        = WLANBAP_ERROR_TERM_BY_LOCAL_HOST;

    return retval;
} /* WLAN_BAPLogicalLinkDisconnect */

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPLogicalLinkCancel()

  DESCRIPTION 
    Implements the actual HCI Cancel Logical Link command

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCILogLinkCancel:  pointer to the "HCI Cancel Logical Link" Structure.
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command complete event. 
                (The caller of this routine is responsible for sending 
                the Command Complete event up the HCI interface.)
                (BTW, the required "HCI Logical Link Complete Event" 
                will be generated by the BAP state machine and sent up 
                via the (*tpWLAN_BAPEventCB).)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCILogLinkCancel is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPLogicalLinkCancel
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Logical_Link_Cancel_Cmd   *pBapHCILogLinkCancel,
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
   ptBtampContext btampContext;
   BTAMPFSM_INSTANCEDATA_T *instanceVar;
    /* Validate params */ 
    if ((btampHandle == NULL) || (pBapHCILogLinkCancel == NULL) || 
        (pBapHCIEvent == NULL))
    {
        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
            "%s: Null Parameters Not allowed", __func__); 
        return VOS_STATUS_E_FAULT;
    }

    btampContext = (ptBtampContext) btampHandle;
    instanceVar = &(btampContext->bapPhysLinkMachine);

    /* Form and immediately return the command status event... */ 
    pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_COMPLETE_EVENT;
    pBapHCIEvent->u.btampCommandCompleteEvent.present = 1;
    pBapHCIEvent->u.btampCommandCompleteEvent.command_opcode =
        BTAMP_TLV_HCI_LOGICAL_LINK_CANCEL_CMD;
    pBapHCIEvent->u.btampCommandCompleteEvent.num_hci_command_packets = 1;

    if (pBapHCILogLinkCancel->phy_link_handle != btampContext->phy_link_handle) 
    {
        pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.status =
            WLANBAP_ERROR_NO_CNCT;
    }
    else
    {
        /* As the logical link create is returned immediately, the logical link is
           created and so cancel can not return success.
           And it returns WLANBAP_ERROR_NO_CNCT if not connected or
           WLANBAP_ERROR_MAX_NUM_ACL_CNCTS if connected */
        if(WLAN_BAPLogLinkClosed == btampContext->btamp_logical_link_state )
        {
           /* Cancel Logical link request in invalid state */
           pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.status =
               WLANBAP_ERROR_NO_CNCT;
        }
        else if(WLAN_BAPLogLinkOpen == btampContext->btamp_logical_link_state )
        {
           /* Cancel Logical link request in conected state */
           pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.status =
               WLANBAP_ERROR_MAX_NUM_ACL_CNCTS;       
        }
        else if(WLAN_BAPLogLinkInProgress == btampContext->btamp_logical_link_state )
        {
           /* Cancel Logical link request in progress state, need to fail logical link
            creation as well */
            btampContext->btamp_logical_link_cancel_pending = TRUE;
            pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.status =
                WLANBAP_STATUS_SUCCESS;       
        }
        else
        {
            pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.status =
                WLANBAP_ERROR_NO_CNCT;
        }
    }
    pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.phy_link_handle =
        pBapHCILogLinkCancel->phy_link_handle;
    /* Since the status is not success, the Tx flow spec Id is not meaningful and
       filling with 0 */
    pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Logical_Link_Cancel.tx_flow_spec_id = 
        pBapHCILogLinkCancel->tx_flow_spec_id;

    return VOS_STATUS_SUCCESS;
} /* WLAN_BAPLogicalLinkCancel */

/*----------------------------------------------------------------------------

  FUNCTION    WLAN_BAPFlowSpecModify()

  DESCRIPTION 
    Implements the actual HCI Modify Logical Link command
    Produces an asynchronous flow spec modify complete event. Through the 
    event callback.

  DEPENDENCIES 
    NA. 

  PARAMETERS 

    IN
    btampHandle: pointer to the BAP handle.  Returned from WLANBAP_GetNewHndl.
    pBapHCIFlowSpecModify:  pointer to the "HCI Flow Spec Modify" Structure.
   
    IN/OUT
    pBapHCIEvent:  Return event value for the command status event. 
                (The caller of this routine is responsible for sending 
                the Command Status event up the HCI interface.)
   
  RETURN VALUE
    The result code associated with performing the operation  

    VOS_STATUS_E_FAULT:  pointer to pBapHCIFlowSpecModify is NULL 
    VOS_STATUS_SUCCESS:  Success
  
  SIDE EFFECTS 
  
----------------------------------------------------------------------------*/
VOS_STATUS  
WLAN_BAPFlowSpecModify
( 
  ptBtampHandle btampHandle,
  tBtampTLVHCI_Flow_Spec_Modify_Cmd   *pBapHCIFlowSpecModify,
  tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
                                /* Including Command Complete and Command Status*/
)
{
   v_U16_t                  index_for_logLinkHandle = 0;
   ptBtampContext           btampContext;
   tpBtampLogLinkCtx        pLogLinkContext;
   v_U32_t                  retval;
   VOS_STATUS               vosStatus = VOS_STATUS_SUCCESS;
   tBtampHCI_Event          bapHCIEvent; /* This now encodes ALL event types */
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
   /* Validate params */ 
   if ((btampHandle == NULL) || (pBapHCIFlowSpecModify == NULL) || 
       (pBapHCIEvent == NULL))
   {
       VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
           "%s: Null Parameters Not allowed", __func__); 
       return VOS_STATUS_E_FAULT;
   }

   btampContext = (ptBtampContext) btampHandle;

   index_for_logLinkHandle = pBapHCIFlowSpecModify->log_link_handle >> 8; /*  Return the logical link index here */
   VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO,
              " %s:index_for_logLinkHandle=%d", __func__,index_for_logLinkHandle);

   bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_STATUS_EVENT;
   bapHCIEvent.u.btampCommandStatusEvent.present = 1;
   bapHCIEvent.u.btampCommandStatusEvent.num_hci_command_packets = 1;
   bapHCIEvent.u.btampCommandStatusEvent.command_opcode 
       = BTAMP_TLV_HCI_FLOW_SPEC_MODIFY_CMD;

   /*------------------------------------------------------------------------
     Evaluate the Tx and Rx Flow specification for this logical link.
   ------------------------------------------------------------------------*/
   // Currently we only support flow specs with service types of BE (0x01) 

   /*------------------------------------------------------------------------
     Now configure the Logical Link context.
   ------------------------------------------------------------------------*/
   pLogLinkContext = &(btampContext->btampLogLinkCtx[index_for_logLinkHandle]);

   /* Extract Tx flow spec into the context structure */
   retval = btampUnpackTlvFlow_Spec((void *)btampContext, pBapHCIFlowSpecModify->tx_flow_spec,
                                    WLAN_BAP_PAL_FLOW_SPEC_TLV_LEN,
                                    &pLogLinkContext->btampFlowSpec);
   if (retval != BTAMP_PARSE_SUCCESS)
   {
     /* Flow spec parsing failed, return failure */
     vosStatus = VOS_STATUS_E_FAILURE;
     pBapHCIEvent->u.btampFlowSpecModifyCompleteEvent.status =
         WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
     bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
   }
   else
   {
      bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_STATUS_SUCCESS;
      pBapHCIEvent->u.btampFlowSpecModifyCompleteEvent.status 
          = WLANBAP_STATUS_SUCCESS;

   }
           /* Notify the Command status Event */
   vosStatus =   
      (*btampContext->pBapHCIEventCB) 
          (  
           btampContext->pHddHdl,   /* this refers to the BSL per connection context */
           &bapHCIEvent, /* This now encodes ALL event types */
           VOS_TRUE /* Flag to indicate assoc-specific event */ 
          );

   /* Form and immediately return the command status event... */ 
   pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_FLOW_SPEC_MODIFY_COMPLETE_EVENT;
   pBapHCIEvent->u.btampFlowSpecModifyCompleteEvent.present = 1;
   pBapHCIEvent->u.btampFlowSpecModifyCompleteEvent.log_link_handle = 
      pBapHCIFlowSpecModify->log_link_handle;

   return vosStatus;
} /* WLAN_BAPFlowSpecModify */


void WLAN_BAPEstablishLogicalLink(ptBtampContext btampContext)
{
    tBtampHCI_Event bapHCIEvent; /* This now encodes ALL event types */
    v_U16_t         log_link_index = 0;
    v_U16_t         index_for_logLinkCtx = 0;
    VOS_STATUS      vosStatus = VOS_STATUS_SUCCESS;

    if (btampContext == NULL) 
    {
        VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
            "%s: Null Parameters Not allowed", __func__); 
        return;
    }

    if( TRUE == btampContext->btamp_logical_link_cancel_pending )
    {
        bapHCIEvent.u.btampCommandStatusEvent.status = WLANBAP_ERROR_NO_CNCT;
        btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
        btampContext->btamp_logical_link_cancel_pending = FALSE;
    }
    else
    {
        /* Allocate a logical link index for these flow specs */
        vosStatus = WLANBAP_CreateNewLogLinkCtx( 
            btampContext, /* per assoc btampContext value */ 
            btampContext->btamp_logical_link_req_info.phyLinkHandle, /*  I get phy_link_handle from the Command */
            btampContext->btamp_logical_link_req_info.txFlowSpec, /*  I get tx_flow_spec from the Command */
            btampContext->btamp_logical_link_req_info.rxFlowSpec, /*  I get rx_flow_spec from the Command */
            &log_link_index /*  Return the logical link index here */
            );
        if (VOS_STATUS_SUCCESS != vosStatus)
        {
            /* Invalid flow spec format */
            bapHCIEvent.u.btampLogicalLinkCompleteEvent.status = WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
            btampContext->btamp_logical_link_state = WLAN_BAPLogLinkClosed;
        }
        else
        {
            bapHCIEvent.u.btampLogicalLinkCompleteEvent.status = WLANBAP_STATUS_SUCCESS;
            btampContext->btamp_logical_link_state = WLAN_BAPLogLinkOpen;
        }
    }
    
    index_for_logLinkCtx = log_link_index >> 8;
    /* Format the Logical Link Complete event to return... */ 
    bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_LOGICAL_LINK_COMPLETE_EVENT;
    bapHCIEvent.u.btampLogicalLinkCompleteEvent.present = 1;

    /*  Return the logical link index here */
    bapHCIEvent.u.btampLogicalLinkCompleteEvent.log_link_handle 
        = log_link_index;
    bapHCIEvent.u.btampLogicalLinkCompleteEvent.phy_link_handle 
        = btampContext->btamp_logical_link_req_info.phyLinkHandle;
    bapHCIEvent.u.btampLogicalLinkCompleteEvent.flow_spec_id
        = btampContext->btampLogLinkCtx[index_for_logLinkCtx].btampFlowSpec.flow_spec_id;

    vosStatus = (*btampContext->pBapHCIEventCB) 
    (  
     btampContext->pHddHdl,   /* this refers to the BSL per connection context */
     &bapHCIEvent, /* This now encodes ALL event types */
     VOS_TRUE /* Flag to indicate assoc-specific event */ 
     );
    return;
}



