blob: 16b96fbd8ed047a4b80999e84e7e26b86f7b8e30 [file] [log] [blame]
/*
* Copyright (c) 2012-2013, 2017 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 S t a t u s . C
OVERVIEW:
This software unit holds the implementation of the WLAN BAP modules
Status 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.
===========================================================================*/
/*===========================================================================
EDIT HISTORY FOR FILE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
$Header: /cygdrive/d/Builds/M7201JSDCAAPAD52240B/WM/platform/msm7200/Src/Drivers/SD/ClientDrivers/WLAN/QCT_BTAMP_RSN/CORE/BAP/src/bapApiStatus.c,v 1.7 2009/03/09 08:45:04 jzmuda Exp jzmuda $$DateTime$$Author: jzmuda $
when who what, where, why
---------- --- --------------------------------------------------------
2008-09-15 jez Created module
===========================================================================*/
/*----------------------------------------------------------------------------
* Include Files
* -------------------------------------------------------------------------*/
//#include "wlan_qct_tl.h"
#include "vos_trace.h"
/* BT-AMP PAL API header file */
#include "bapApi.h"
#include "bapInternal.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
* -------------------------------------------------------------------------*/
/*
Status Parameters
*/
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPReadFailedContactCounter()
DESCRIPTION
Implements the actual HCI Read Failed Contact Counter command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIReadFailedContactCounter: pointer to the "HCI Read Failed Contact Counter" structure.
pFailedContactCounter: pointer to return value for the "Failed Contact Counter"
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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIReadFailedContactCounter or
pFailedContactCounter is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPReadFailedContactCounter
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Read_Failed_Contact_Counter_Cmd *pBapHCIReadFailedContactCounter,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including "Read" Command Complete*/
)
{
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPReadFailedContactCounter */
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPResetFailedContactCounter()
DESCRIPTION
Implements the actual HCI Reset Failed Contact Counter command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIResetFailedContactCounter: pointer to the "HCI Reset Failed Contact Counter" 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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIResetFailedContactCounter is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPResetFailedContactCounter
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Reset_Failed_Contact_Counter_Cmd *pBapHCIResetFailedContactCounter,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including Command Complete and Command Status*/
)
{
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPResetFailedContactCounter */
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPReadLinkQuality()
DESCRIPTION
Implements the actual HCI Read Link Quality command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIReadLinkQuality: pointer to the "HCI Read Link Quality" structure.
pBapHCILinkQuality: pointer to return value for the "Link Quality"
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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIReadLinkQuality or
pBapHCILinkQuality is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPReadLinkQuality
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Read_Link_Quality_Cmd *pBapHCIReadLinkQuality,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including Command Complete and Command Status*/
)
{
ptBtampContext btampContext = (ptBtampContext) btampHandle;
v_U8_t phyLinkHandle;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"%s: btampHandle value: %pK", __func__, btampHandle);
/* Validate params */
if ((NULL == btampHandle) || (NULL == pBapHCIReadLinkQuality) ||
(NULL == pBapHCIEvent))
{
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"Invalid input parameters in %s", __func__);
return VOS_STATUS_E_FAULT;
}
/* Validate the physical link handle extracted from
input parameter. This parameter has 2 bytes for physical handle
(only lower byte valid) */
phyLinkHandle = (v_U8_t) pBapHCIReadLinkQuality->log_link_handle;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Link_Quality.log_link_handle
= phyLinkHandle;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Link_Quality.link_quality = 0;
if (phyLinkHandle != btampContext->phy_link_handle)
{
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"Invalid Physical link handle in %s", __func__);
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Link_Quality.status
= WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
}
else
{
/* Get the Link quality indication status from control block.
Link quality value is being updated on the SME callback */
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Link_Quality.link_quality
= btampContext->link_quality;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Link_Quality.status
= WLANBAP_STATUS_SUCCESS;
}
/* Fill in the parameters for command complete event... */
pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_COMPLETE_EVENT;
pBapHCIEvent->u.btampCommandCompleteEvent.present = TRUE;
pBapHCIEvent->u.btampCommandCompleteEvent.num_hci_command_packets = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.command_opcode
= BTAMP_TLV_HCI_READ_LINK_QUALITY_CMD;
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPReadLinkQuality */
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPReadRSSI()
DESCRIPTION
Implements the actual HCI Read RSSI command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIReadRSSI: pointer to the "HCI Read RSSI" structure.
pBapHCIRSSI: pointer to return value for the "RSSI".
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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIReadRSSI or
pBapHCIRSSI is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPReadRSSI
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Read_RSSI_Cmd *pBapHCIReadRSSI,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including Command Complete and Command Status*/
)
{
VOS_STATUS vosStatus;
ptBtampContext btampContext = (ptBtampContext) btampHandle;
v_U8_t phyLinkHandle;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"%s: btampHandle value: %pK", __func__, btampHandle);
/* Validate params */
if ((NULL == btampHandle) || (NULL == pBapHCIReadRSSI) ||
(NULL == pBapHCIEvent))
{
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"Invalid input parameters in %s", __func__);
return VOS_STATUS_E_FAULT;
}
/* Validate the physical link handle extracted from
input parameter. This parameter has 2 bytes for physical handle
(only lower byte valid) */
phyLinkHandle = (v_U8_t) pBapHCIReadRSSI->log_link_handle;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_RSSI.phy_link_handle
= phyLinkHandle;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_RSSI.rssi = 0;
if (phyLinkHandle != btampContext->phy_link_handle)
{
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"Invalid Physical link handle in %s", __func__);
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_RSSI.status
= WLANBAP_ERROR_INVALID_HCI_CMND_PARAM;
}
else
{
/* Get the RSSI value for this station (physical link) */
vosStatus = WLANTL_GetRssi(btampContext->pvosGCtx, btampContext->ucSTAId,
&pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_RSSI.rssi);
if (VOS_STATUS_SUCCESS == vosStatus)
{
/* GetRssi success, indicate the to upper layer */
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_RSSI.status
= WLANBAP_STATUS_SUCCESS;
}
else
{
/* API failed, indicate unspecified error to upper layer */
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_RSSI.status
= WLANBAP_ERROR_UNSPECIFIED_ERROR;
}
}
/* Fill in the parameters for command complete event... */
pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_COMPLETE_EVENT;
pBapHCIEvent->u.btampCommandCompleteEvent.present = TRUE;
pBapHCIEvent->u.btampCommandCompleteEvent.num_hci_command_packets = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.command_opcode
= BTAMP_TLV_HCI_READ_RSSI_CMD;
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPReadRSSI */
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPReadLocalAMPInfo()
DESCRIPTION
Implements the actual HCI Read Local AMP Information command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIReadLocalAMPInfo: pointer to the "HCI Read Local AMP Info" 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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIReadLocalAMPInfo or
pBapHCILocalAMPInfo is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPReadLocalAMPInfo
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Read_Local_AMP_Information_Cmd *pBapHCIReadLocalAMPInfo,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including Command Complete and Command Status*/
)
{
/* Validate params */
if (btampHandle == NULL) {
return VOS_STATUS_E_FAULT;
}
/* Validate params */
if (pBapHCIReadLocalAMPInfo == NULL) {
return VOS_STATUS_E_FAULT;
}
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %pK", __func__, btampHandle);
/* Format the command complete event to return... */
pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_COMPLETE_EVENT;
pBapHCIEvent->u.btampCommandCompleteEvent.present = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.num_hci_command_packets = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.command_opcode
= BTAMP_TLV_HCI_READ_LOCAL_AMP_INFORMATION_CMD;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.status
= WLANBAP_STATUS_SUCCESS;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_AMP_Status
= WLANBAP_HCI_AMP_STATUS_NOT_SHARED;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_Total_BW
= 24000;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_Max_Guaranteed_BW
= 12000;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_Min_Latency
= 100;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_Max_PDU_Size
= WLANBAP_MAX_80211_PAL_PDU_SIZE;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_Controller_Type
= 1;
#if 0
AMP Info PAL_Capabilities: Size: 2 Octets
Value Parameter Description
0xXXXX Bit 0: "Service Type = Guaranteed" is not supported by PAL = 0
"Service Type = Guaranteed" is supported by PAL = 1
Bits 15-1: Reserved (shall be set to 0)
(See EFS in Generic AMP FIPD [1])
#endif //0
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_PAL_Capabilities
= 0x00; // was 0x03. Completely wrong.
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_AMP_Assoc_Length
= 248;
//= 40;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_Max_Flush_Timeout
= 10000; //10;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Local_AMP_Info.HC_BE_Flush_Timeout
= 10000; //8;
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPReadLocalAMPInfo */
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPReadLocalAMPAssoc()
DESCRIPTION
Implements the actual HCI Read Local AMP Assoc command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIReadLocalAMPAssoc: pointer to the "HCI Read Local AMP Assoc" 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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIReadLocalAMPAssoc
(or pBapHCILocalAMPAssoc) is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPReadLocalAMPAssoc
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Read_Local_AMP_Assoc_Cmd *pBapHCIReadLocalAMPAssoc,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including Command Complete and Command Status*/
)
{
VOS_STATUS vosStatus;
ptBtampContext btampContext = (ptBtampContext) btampHandle; /* btampContext value */
tHalHandle hHal;
tBtampAMP_ASSOC btamp_ASSOC;
v_U32_t nConsumed = 0;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Validate params */
if ((pBapHCIReadLocalAMPAssoc == NULL) || (NULL == btampHandle))
{
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
"param is NULL in %s", __func__);
return VOS_STATUS_E_FAULT;
}
hHal = VOS_GET_HAL_CB(btampContext->pvosGCtx);
if (NULL == hHal)
{
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
"hHal is NULL in %s", __func__);
return VOS_STATUS_E_FAULT;
}
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %pK", __func__, btampHandle);
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"In %s, phy_link_handle = %d", __func__,
pBapHCIReadLocalAMPAssoc->phy_link_handle);
/* Update the MAC address and SSID if in case the Read Local AMP Assoc
* Request is made before Create Physical Link creation.
*/
WLANBAP_ReadMacConfig (btampContext);
/* Fill in the contents of an AMP_Assoc structure in preparation
* for Packing it into the AMP_assoc_fragment field of the Read
* Local AMP Assoc Command Complete Event
*/
/* Return the local MAC address */
btamp_ASSOC.AMP_Assoc_MAC_Addr.present = 1;
vos_mem_copy(
btamp_ASSOC.AMP_Assoc_MAC_Addr.mac_addr,
btampContext->self_mac_addr,
sizeof(btampContext->self_mac_addr));
/*Save the local AMP assoc info*/
vos_mem_copy(btampContext->btamp_AMP_Assoc.HC_mac_addr,
btampContext->self_mac_addr,
sizeof(btampContext->self_mac_addr));
/* JEZ090303: This logic should return a single channel list with the */
/* selected channel, if we have one. */
//if (btampContext->channel)
if (1)
{
/* Return the local Preferred Channel List */
/* Return both the Regulatory Info and one channel list */
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.present = 1;
vos_mem_copy (btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.country, "XXX", 3);
/*Save the local AMP assoc info*/
vos_mem_copy(btampContext->btamp_AMP_Assoc.HC_pref_country, "XXX", 3);
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.num_triplets = 2;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][0] = 201;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][1] = 254;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][2] = 0;
if (( BT_INITIATOR == btampContext->BAPDeviceRole ) &&
( 0 != btampContext->channel ))
{
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][0] = btampContext->channel;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][1] = 0x01; //we are AP - we start on their 1st preferred channel
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][2] = 0x11;
}
else
{
if (btampContext->config.ucPreferredChannel)
{
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][0] = btampContext->config.ucPreferredChannel;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][1] =
0x0B - btampContext->config.ucPreferredChannel + 1;
}
else
{
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][0] = 0x01;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][1] = 0x0B; //all channels for 1 to 11
}
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][2] = 0x11;
}
} else
{
/* Return the local Preferred Channel List */
/* Return only the Regulatory Info */
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.present = 1;
vos_mem_copy (btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.country, "XXX", 3);
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.num_triplets = 1;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][0] = 201;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][1] = 254;
btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][2] = 0;
}
/*Save the local AMP assoc info*/
btampContext->btamp_AMP_Assoc.HC_pref_num_triplets = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.num_triplets;
btampContext->btamp_AMP_Assoc.HC_pref_triplets[0][0] = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][0];
btampContext->btamp_AMP_Assoc.HC_pref_triplets[0][1] = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][1];
btampContext->btamp_AMP_Assoc.HC_pref_triplets[0][2] = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[0][2];
btampContext->btamp_AMP_Assoc.HC_pref_triplets[1][0] = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][0];
btampContext->btamp_AMP_Assoc.HC_pref_triplets[1][1] = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][1];
btampContext->btamp_AMP_Assoc.HC_pref_triplets[1][2] = btamp_ASSOC.AMP_Assoc_Preferred_Channel_List.triplets[1][2];
/* Also, at this point, lie and tell the other side we are connected on */
/* the one channel we support. I hope this convinces the peer as BT-AMP AP */
/* We really want him to use our channel. Since we only support one.*/
/* Return the local Connected Channel */
btamp_ASSOC.AMP_Assoc_Connected_Channel.present = 1;
vos_mem_copy (btamp_ASSOC.AMP_Assoc_Connected_Channel.country, "XXX", 3);
btamp_ASSOC.AMP_Assoc_Connected_Channel.num_triplets = 2;
btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[0][0] = 201;
btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[0][1] = 254;
btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[0][2] = 0;
//btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[1][0] = 0x01;
btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[1][0] = (0 != btampContext->channel)?btampContext->channel:0x01;
btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[1][1] = 0x01;
btamp_ASSOC.AMP_Assoc_Connected_Channel.triplets[1][2] = 0x11;
/* Return the local PAL Capabilities */
btamp_ASSOC.AMP_Assoc_PAL_Capabilities.present = 1;
#if 0
AMP ASSOC Pal Capabilities: Size: 4 Octets
Value Description
4 TypeID for 802.11 PAL Capabilities
4 Length
0xXXXXXXXX Bit 0:
0 signifies the PAL is not capable of utilizing
received Activity Reports
1 signifies the PAL is capable of utilizing
received Activity Reports
Bit 1:
0 signifies the PAL is not capable of utilizing
scheduling information sent in an Activity Report
1 signifies the PAL is capable of utilizing
scheduling information sent in an Activity Report
Bits 2..31 Reserved
#endif //0
btamp_ASSOC.AMP_Assoc_PAL_Capabilities.pal_capabilities
// = btampContext->btamp_Remote_AMP_Assoc.HC_pal_capabilities;
//= 0x03;
= 0x00;
/* Return the local PAL Version */
btamp_ASSOC.AMP_Assoc_PAL_Version.present = 1;
/* Return the version and company ID data */
btamp_ASSOC.AMP_Assoc_PAL_Version.pal_version = WLANBAP_PAL_VERSION;
btamp_ASSOC.AMP_Assoc_PAL_Version.pal_CompanyID = WLANBAP_QUALCOMM_COMPANY_ID; // Qualcomm Company ID
btamp_ASSOC.AMP_Assoc_PAL_Version.pal_subversion = WLANBAP_PAL_SUBVERSION;
//Pack the AMP Assoc structure
vosStatus = btampPackAMP_ASSOC(
hHal,
&btamp_ASSOC,
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Read_Local_AMP_Assoc.AMP_assoc_fragment,
248,
&nConsumed);
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: nConsumed value: %d", __func__, nConsumed);
/* Format the command complete event to return... */
pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_COMPLETE_EVENT;
pBapHCIEvent->u.btampCommandCompleteEvent.present = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.num_hci_command_packets = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.command_opcode
= BTAMP_TLV_HCI_READ_LOCAL_AMP_ASSOC_CMD;
/*Validate the Physical handle*/
if(pBapHCIReadLocalAMPAssoc->phy_link_handle !=
btampContext->phy_link_handle) {
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH,
"%s: Wrong Physical Link handle in Read Local AMP Assoc cmd: current: %x, new: %x", __func__,
btampContext->phy_link_handle,
pBapHCIReadLocalAMPAssoc->phy_link_handle);
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Read_Local_AMP_Assoc.status
= WLANBAP_ERROR_NO_CNCT;
} else
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Read_Local_AMP_Assoc.status
= WLANBAP_STATUS_SUCCESS;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Read_Local_AMP_Assoc.phy_link_handle
= pBapHCIReadLocalAMPAssoc->phy_link_handle;
/* We will fit in one fragment, so remaining is exactly equal to encoded size*/
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Read_Read_Local_AMP_Assoc.remaining_length
= nConsumed;
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPReadLocalAMPAssoc */
/*----------------------------------------------------------------------------
FUNCTION WLAN_BAPWriteRemoteAMPAssoc()
DESCRIPTION
Implements the actual HCI Write Remote AMP Assoc command. There
is no need for a callback because when this call returns the action
has been completed.
DEPENDENCIES
NA.
PARAMETERS
IN
btampHandle: pointer to the BAP handle. Returned from WLANBAP_GetNewHndl.
pBapHCIWriteRemoteAMPAssoc: pointer to the "HCI Write Remote AMP Assoc" 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.)
RETURN VALUE
The result code associated with performing the operation
VOS_STATUS_E_FAULT: pointer to pBapHCIWriteRemoteAMPAssoc is NULL
VOS_STATUS_SUCCESS: Success
SIDE EFFECTS
----------------------------------------------------------------------------*/
VOS_STATUS
WLAN_BAPWriteRemoteAMPAssoc
(
ptBtampHandle btampHandle,
tBtampTLVHCI_Write_Remote_AMP_ASSOC_Cmd *pBapHCIWriteRemoteAMPAssoc,
tpBtampHCI_Event pBapHCIEvent /* This now encodes ALL event types */
/* Including Command Complete and Command Status*/
)
{
tWLAN_BAPEvent bapEvent; /* State machine event */
VOS_STATUS vosStatus;
tBtampHCI_Event bapHCIEvent;
/* 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 (pBapHCIWriteRemoteAMPAssoc == NULL) {
return VOS_STATUS_E_FAULT;
}
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampHandle value: %pK", __func__, btampHandle);
/* Fill in the event structure */
bapEvent.event = eWLAN_BAP_HCI_WRITE_REMOTE_AMP_ASSOC;
bapEvent.params = pBapHCIWriteRemoteAMPAssoc;
VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: btampContext value: %pK", __func__, btampContext);
/* Handle event */
vosStatus = btampFsm(btampContext, &bapEvent, &status);
/* Format the command complete event to return... */
pBapHCIEvent->bapHCIEventCode = BTAMP_TLV_HCI_COMMAND_COMPLETE_EVENT;
pBapHCIEvent->u.btampCommandCompleteEvent.present = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.num_hci_command_packets = 1;
pBapHCIEvent->u.btampCommandCompleteEvent.command_opcode
= BTAMP_TLV_HCI_WRITE_REMOTE_AMP_ASSOC_CMD;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Write_Remote_AMP_Assoc.status
= status;
pBapHCIEvent->u.btampCommandCompleteEvent.cc_event.Write_Remote_AMP_Assoc.phy_link_handle
= pBapHCIWriteRemoteAMPAssoc->phy_link_handle;
if(WLANBAP_ERROR_NO_SUITABLE_CHANNEL == status)
{
/* Format the Physical Link Complete event to return... */
bapHCIEvent.bapHCIEventCode = BTAMP_TLV_HCI_PHYSICAL_LINK_COMPLETE_EVENT;
bapHCIEvent.u.btampPhysicalLinkCompleteEvent.present = 1;
bapHCIEvent.u.btampPhysicalLinkCompleteEvent.status = status;
bapHCIEvent.u.btampPhysicalLinkCompleteEvent.phy_link_handle
= btampContext->phy_link_handle;
bapHCIEvent.u.btampPhysicalLinkCompleteEvent.ch_number
= 0;
vosStatus = (*btampContext->pBapHCIEventCB)
(
btampContext->pHddHdl, /* this refers the BSL per application context */
&bapHCIEvent, /* This now encodes ALL event types */
VOS_TRUE /* Flag to indicate assoc-specific event */
);
}
/* ... */
return VOS_STATUS_SUCCESS;
} /* WLAN_BAPWriteRemoteAMPAssoc */