| Index: chromeos/drivers/ath6kl/include/hci_transport_api.h
|
| diff --git a/chromeos/drivers/ath6kl/include/hci_transport_api.h b/chromeos/drivers/ath6kl/include/hci_transport_api.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f3c1577abecf4525a1d1d0424a86dc7d09528d0c
|
| --- /dev/null
|
| +++ b/chromeos/drivers/ath6kl/include/hci_transport_api.h
|
| @@ -0,0 +1,230 @@
|
| +//------------------------------------------------------------------------------
|
| +// <copyright file="HCI_TRANSPORT_api.h" company="Atheros">
|
| +// Copyright (c) 2009 Atheros Corporation. All rights reserved.
|
| +//
|
| +// This program is free software; you can redistribute it and/or modify
|
| +// it under the terms of the GNU General Public License version 2 as
|
| +// published by the Free Software Foundation;
|
| +//
|
| +// Software distributed under the License is distributed on an "AS
|
| +// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
| +// implied. See the License for the specific language governing
|
| +// rights and limitations under the License.
|
| +//
|
| +//
|
| +//------------------------------------------------------------------------------
|
| +//==============================================================================
|
| +// Author(s): ="Atheros"
|
| +//==============================================================================
|
| +#ifndef _HCI_TRANSPORT_API_H_
|
| +#define _HCI_TRANSPORT_API_H_
|
| +
|
| + /* Bluetooth HCI packets are stored in HTC packet containers */
|
| +#include "htc_packet.h"
|
| +
|
| +#ifdef __cplusplus
|
| +extern "C" {
|
| +#endif /* __cplusplus */
|
| +
|
| +typedef void *HCI_TRANSPORT_HANDLE;
|
| +
|
| +typedef HTC_ENDPOINT_ID HCI_TRANSPORT_PACKET_TYPE;
|
| +
|
| + /* we map each HCI packet class to a static Endpoint ID */
|
| +#define HCI_COMMAND_TYPE ENDPOINT_1
|
| +#define HCI_EVENT_TYPE ENDPOINT_2
|
| +#define HCI_ACL_TYPE ENDPOINT_3
|
| +#define HCI_PACKET_INVALID ENDPOINT_MAX
|
| +
|
| +#define HCI_GET_PACKET_TYPE(pP) (pP)->Endpoint
|
| +#define HCI_SET_PACKET_TYPE(pP,s) (pP)->Endpoint = (s)
|
| +
|
| +/* callback when an HCI packet was completely sent */
|
| +typedef void (*HCI_TRANSPORT_SEND_PKT_COMPLETE)(void *, HTC_PACKET *);
|
| +/* callback when an HCI packet is received */
|
| +typedef void (*HCI_TRANSPORT_RECV_PKT)(void *, HTC_PACKET *);
|
| +/* Optional receive buffer re-fill callback,
|
| + * On some OSes (like Linux) packets are allocated from a global pool and indicated up
|
| + * to the network stack. The driver never gets the packets back from the OS. For these OSes
|
| + * a refill callback can be used to allocate and re-queue buffers into HTC.
|
| + * A refill callback is used for the reception of ACL and EVENT packets. The caller must
|
| + * set the watermark trigger point to cause a refill.
|
| + */
|
| +typedef void (*HCI_TRANSPORT_RECV_REFILL)(void *, HCI_TRANSPORT_PACKET_TYPE Type, int BuffersAvailable);
|
| +/* Optional receive packet refill
|
| + * On some systems packet buffers are an extremely limited resource. Rather than
|
| + * queue largest-possible-sized buffers to the HCI bridge, some systems would rather
|
| + * allocate a specific size as the packet is received. The trade off is
|
| + * slightly more processing (callback invoked for each RX packet)
|
| + * for the benefit of committing fewer buffer resources into the bridge.
|
| + *
|
| + * The callback is provided the length of the pending packet to fetch. This includes the
|
| + * full transport header, HCI header, plus the length of payload. The callback can return a pointer to
|
| + * the allocated HTC packet for immediate use.
|
| + *
|
| + * NOTE*** This callback is mutually exclusive with the the refill callback above.
|
| + *
|
| + * */
|
| +typedef HTC_PACKET *(*HCI_TRANSPORT_RECV_ALLOC)(void *, HCI_TRANSPORT_PACKET_TYPE Type, int Length);
|
| +
|
| +typedef enum _HCI_SEND_FULL_ACTION {
|
| + HCI_SEND_FULL_KEEP = 0, /* packet that overflowed should be kept in the queue */
|
| + HCI_SEND_FULL_DROP = 1, /* packet that overflowed should be dropped */
|
| +} HCI_SEND_FULL_ACTION;
|
| +
|
| +/* callback when an HCI send queue exceeds the caller's MaxSendQueueDepth threshold,
|
| + * the callback must return the send full action to take (either DROP or KEEP) */
|
| +typedef HCI_SEND_FULL_ACTION (*HCI_TRANSPORT_SEND_FULL)(void *, HTC_PACKET *);
|
| +
|
| +typedef struct {
|
| + int HeadRoom; /* number of bytes in front of HCI packet for header space */
|
| + int TailRoom; /* number of bytes at the end of the HCI packet for tail space */
|
| + int IOBlockPad; /* I/O block padding required (always a power of 2) */
|
| +} HCI_TRANSPORT_PROPERTIES;
|
| +
|
| +typedef struct _HCI_TRANSPORT_CONFIG_INFO {
|
| + int ACLRecvBufferWaterMark; /* low watermark to trigger recv refill */
|
| + int EventRecvBufferWaterMark; /* low watermark to trigger recv refill */
|
| + int MaxSendQueueDepth; /* max number of packets in the single send queue */
|
| + void *pContext; /* context for all callbacks */
|
| + void (*TransportFailure)(void *pContext, A_STATUS Status); /* transport failure callback */
|
| + A_STATUS (*TransportReady)(HCI_TRANSPORT_HANDLE, HCI_TRANSPORT_PROPERTIES *,void *pContext); /* transport is ready */
|
| + void (*TransportRemoved)(void *pContext); /* transport was removed */
|
| + /* packet processing callbacks */
|
| + HCI_TRANSPORT_SEND_PKT_COMPLETE pHCISendComplete;
|
| + HCI_TRANSPORT_RECV_PKT pHCIPktRecv;
|
| + HCI_TRANSPORT_RECV_REFILL pHCIPktRecvRefill;
|
| + HCI_TRANSPORT_RECV_ALLOC pHCIPktRecvAlloc;
|
| + HCI_TRANSPORT_SEND_FULL pHCISendFull;
|
| +} HCI_TRANSPORT_CONFIG_INFO;
|
| +
|
| +/* ------ Function Prototypes ------ */
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Attach to the HCI transport module
|
| + @function name: HCI_TransportAttach
|
| + @input: HTCHandle - HTC handle (see HTC apis)
|
| + pInfo - initialization information
|
| + @output:
|
| + @return: HCI_TRANSPORT_HANDLE on success, NULL on failure
|
| + @notes: The HTC module provides HCI transport services.
|
| + @example:
|
| + @see also: HCI_TransportDetach
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +HCI_TRANSPORT_HANDLE HCI_TransportAttach(void *HTCHandle, HCI_TRANSPORT_CONFIG_INFO *pInfo);
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Detach from the HCI transport module
|
| + @function name: HCI_TransportDetach
|
| + @input: HciTrans - HCI transport handle
|
| + pInfo - initialization information
|
| + @output:
|
| + @return:
|
| + @notes:
|
| + @example:
|
| + @see also:
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +void HCI_TransportDetach(HCI_TRANSPORT_HANDLE HciTrans);
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Add receive packets to the HCI transport
|
| + @function name: HCI_TransportAddReceivePkts
|
| + @input: HciTrans - HCI transport handle
|
| + pQueue - a queue holding one or more packets
|
| + @output:
|
| + @return: A_OK on success
|
| + @notes: user must supply HTC packets for capturing incomming HCI packets. The caller
|
| + must initialize each HTC packet using the SET_HTC_PACKET_INFO_RX_REFILL()
|
| + macro. Each packet in the queue must be of the same type and length
|
| + @example:
|
| + @see also:
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +A_STATUS HCI_TransportAddReceivePkts(HCI_TRANSPORT_HANDLE HciTrans, HTC_PACKET_QUEUE *pQueue);
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Send an HCI packet packet
|
| + @function name: HCI_TransportSendPkt
|
| + @input: HciTrans - HCI transport handle
|
| + pPacket - packet to send
|
| + Synchronous - send the packet synchronously (blocking)
|
| + @output:
|
| + @return: A_OK
|
| + @notes: Caller must initialize packet using SET_HTC_PACKET_INFO_TX() and
|
| + HCI_SET_PACKET_TYPE() macros to prepare the packet.
|
| + If Synchronous is set to FALSE the call is fully asynchronous. On error or completion,
|
| + the registered send complete callback will be called.
|
| + If Synchronous is set to TRUE, the call will block until the packet is sent, if the
|
| + interface cannot send the packet within a 2 second timeout, the function will return
|
| + the failure code : A_EBUSY.
|
| +
|
| + Synchronous Mode should only be used at start-up to initialize the HCI device using
|
| + custom HCI commands. It should NOT be mixed with Asynchronous operations. Mixed synchronous
|
| + and asynchronous operation behavior is undefined.
|
| +
|
| + @example:
|
| + @see also:
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +A_STATUS HCI_TransportSendPkt(HCI_TRANSPORT_HANDLE HciTrans, HTC_PACKET *pPacket, A_BOOL Synchronous);
|
| +
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Stop HCI transport
|
| + @function name: HCI_TransportStop
|
| + @input: HciTrans - hci transport handle
|
| + @output:
|
| + @return:
|
| + @notes: HCI transport communication will be halted. All receive and pending TX packets will
|
| + be flushed.
|
| + @example:
|
| + @see also:
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +void HCI_TransportStop(HCI_TRANSPORT_HANDLE HciTrans);
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Start the HCI transport
|
| + @function name: HCI_TransportStart
|
| + @input: HciTrans - hci transport handle
|
| + @output:
|
| + @return: A_OK on success
|
| + @notes: HCI transport communication will begin, the caller can expect the arrival
|
| + of HCI recv packets as soon as this call returns.
|
| + @example:
|
| + @see also:
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +A_STATUS HCI_TransportStart(HCI_TRANSPORT_HANDLE HciTrans);
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Enable or Disable Asynchronous Recv
|
| + @function name: HCI_TransportEnableDisableAsyncRecv
|
| + @input: HciTrans - hci transport handle
|
| + Enable - enable or disable asynchronous recv
|
| + @output:
|
| + @return: A_OK on success
|
| + @notes: This API must be called when HCI recv is handled synchronously
|
| + @example:
|
| + @see also:
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +A_STATUS HCI_TransportEnableDisableAsyncRecv(HCI_TRANSPORT_HANDLE HciTrans, A_BOOL Enable);
|
| +
|
| +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| + @desc: Receive an event packet from the HCI transport synchronously using polling
|
| + @function name: HCI_TransportRecvHCIEventSync
|
| + @input: HciTrans - hci transport handle
|
| + pPacket - HTC packet to hold the recv data
|
| + MaxPollMS - maximum polling duration in Milliseconds;
|
| + @output:
|
| + @return: A_OK on success
|
| + @notes: This API should be used only during HCI device initialization, the caller must call
|
| + HCI_TransportEnableDisableAsyncRecv with Enable=FALSE prior to using this API.
|
| + This API will only capture HCI Event packets.
|
| + @example:
|
| + @see also: HCI_TransportEnableDisableAsyncRecv
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
| +A_STATUS HCI_TransportRecvHCIEventSync(HCI_TRANSPORT_HANDLE HciTrans,
|
| + HTC_PACKET *pPacket,
|
| + int MaxPollMS);
|
| +
|
| +#ifdef __cplusplus
|
| +}
|
| +#endif
|
| +
|
| +#endif /* _HCI_TRANSPORT_API_H_ */
|
|
|