56
55
#define BAUD_TIMEOUT_MS 1
57
56
#define BTPWRSAV_TIMEOUT_MS 1
60
HCI_TRANSPORT_CONFIG_INFO HCIConfig;
63
A_UINT32 RecvStateFlags;
64
A_UINT32 SendStateFlags;
58
struct gmbox_proto_hci_uart {
59
struct hci_transport_config_info HCIConfig;
65
64
HCI_TRANSPORT_PACKET_TYPE WaitBufferType;
66
HTC_PACKET_QUEUE SendQueue; /* write queue holding HCI Command and ACL packets */
67
HTC_PACKET_QUEUE HCIACLRecvBuffers; /* recv queue holding buffers for incomming ACL packets */
68
HTC_PACKET_QUEUE HCIEventBuffers; /* recv queue holding buffers for incomming event packets */
65
struct htc_packet_queue SendQueue; /* write queue holding HCI Command and ACL packets */
66
struct htc_packet_queue HCIACLRecvBuffers; /* recv queue holding buffers for incomming ACL packets */
67
struct htc_packet_queue HCIEventBuffers; /* recv queue holding buffers for incomming event packets */
68
struct ar6k_device *pDev;
70
69
A_MUTEX_T HCIRxLock;
71
70
A_MUTEX_T HCITxLock;
76
75
int CreditsCurrentSeek;
77
76
int SendProcessCount;
78
} GMBOX_PROTO_HCI_UART;
80
79
#define LOCK_HCI_RX(t) A_MUTEX_LOCK(&(t)->HCIRxLock);
81
80
#define UNLOCK_HCI_RX(t) A_MUTEX_UNLOCK(&(t)->HCIRxLock);
82
81
#define LOCK_HCI_TX(t) A_MUTEX_LOCK(&(t)->HCITxLock);
83
82
#define UNLOCK_HCI_TX(t) A_MUTEX_UNLOCK(&(t)->HCITxLock);
85
#define DO_HCI_RECV_INDICATION(p,pt) \
86
{ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("HCI: Indicate Recv on packet:0x%lX status:%d len:%d type:%d \n", \
87
(unsigned long)(pt),(pt)->Status, A_SUCCESS((pt)->Status) ? (pt)->ActualLength : 0, HCI_GET_PACKET_TYPE(pt))); \
88
(p)->HCIConfig.pHCIPktRecv((p)->HCIConfig.pContext, (pt)); \
84
#define DO_HCI_RECV_INDICATION(p, pt) \
86
AR_DEBUG_PRINTF(ATH_DEBUG_RECV, \
87
("HCI: Indicate Recv on packet:0x%lX status:%d len:%d type:%d \n", \
88
(unsigned long)(pt), \
90
!(pt)->Status ? (pt)->ActualLength : 0, \
91
HCI_GET_PACKET_TYPE(pt))); \
92
(p)->HCIConfig.pHCIPktRecv((p)->HCIConfig.pContext, (pt)); \
91
95
#define DO_HCI_SEND_INDICATION(p,pt) \
92
96
{ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: Indicate Send on packet:0x%lX status:%d type:%d \n", \
94
98
(p)->HCIConfig.pHCISendComplete((p)->HCIConfig.pContext, (pt)); \
97
static A_STATUS HCITrySend(GMBOX_PROTO_HCI_UART *pProt, HTC_PACKET *pPacket, A_BOOL Synchronous);
101
static int HCITrySend(struct gmbox_proto_hci_uart *pProt, struct htc_packet *pPacket, bool Synchronous);
99
static void HCIUartCleanup(GMBOX_PROTO_HCI_UART *pProtocol)
103
static void HCIUartCleanup(struct gmbox_proto_hci_uart *pProtocol)
101
105
A_ASSERT(pProtocol != NULL);
103
107
A_MUTEX_DELETE(&pProtocol->HCIRxLock);
104
108
A_MUTEX_DELETE(&pProtocol->HCITxLock);
109
static A_STATUS InitTxCreditState(GMBOX_PROTO_HCI_UART *pProt)
113
static int InitTxCreditState(struct gmbox_proto_hci_uart *pProt)
113
117
int creditPollCount = CREDIT_POLL_COUNT;
114
A_BOOL gotCredits = FALSE;
118
bool gotCredits = false;
116
120
pProt->CreditsConsumed = 0;
169
173
/* now get the size */
170
174
status = DevGMboxReadCreditSize(pProt->pDev, &pProt->CreditSize);
172
if (A_FAILED(status)) {
178
if (A_SUCCESS(status)) {
179
183
pProt->CreditsAvailable = pProt->CreditsMax;
180
184
AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("HCI : InitTxCreditState - credits avail: %d, size: %d \n",
181
185
pProt->CreditsAvailable, pProt->CreditSize));
187
static A_STATUS CreditsAvailableCallback(void *pContext, int Credits, A_BOOL CreditIRQEnabled)
191
static int CreditsAvailableCallback(void *pContext, int Credits, bool CreditIRQEnabled)
189
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)pContext;
190
A_BOOL enableCreditIrq = FALSE;
191
A_BOOL disableCreditIrq = FALSE;
192
A_BOOL doPendingSends = FALSE;
193
A_STATUS status = A_OK;
193
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)pContext;
194
bool enableCreditIrq = false;
195
bool disableCreditIrq = false;
196
bool doPendingSends = false;
195
199
/** this callback is called under 2 conditions:
196
200
* 1. The credit IRQ interrupt was enabled and signaled.
232
236
pProt->CreditsCurrentSeek));
234
238
if (pProt->CreditsAvailable >= pProt->CreditsCurrentSeek) {
235
/* we have enough credits to fullfill at least 1 packet waiting in the queue */
239
/* we have enough credits to fulfill at least 1 packet waiting in the queue */
236
240
pProt->CreditsCurrentSeek = 0;
237
241
pProt->SendStateFlags &= ~HCI_SEND_WAIT_CREDITS;
238
doPendingSends = TRUE;
242
doPendingSends = true;
239
243
if (CreditIRQEnabled) {
240
244
/* credit IRQ was enabled, we shouldn't need it anymore */
241
disableCreditIrq = TRUE;
245
disableCreditIrq = true;
244
248
/* not enough credits yet, enable credit IRQ if we haven't already */
245
249
if (!CreditIRQEnabled) {
246
enableCreditIrq = TRUE;
250
enableCreditIrq = true;
252
256
UNLOCK_HCI_TX(pProt);
264
268
if (doPendingSends) {
265
HCITrySend(pProt, NULL, FALSE);
269
HCITrySend(pProt, NULL, false);
268
272
AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+CreditsAvailableCallback \n"));
272
static INLINE void NotifyTransportFailure(GMBOX_PROTO_HCI_UART *pProt, A_STATUS status)
276
static INLINE void NotifyTransportFailure(struct gmbox_proto_hci_uart *pProt, int status)
274
278
if (pProt->HCIConfig.TransportFailure != NULL) {
275
279
pProt->HCIConfig.TransportFailure(pProt->HCIConfig.pContext, status);
279
static void FailureCallback(void *pContext, A_STATUS Status)
283
static void FailureCallback(void *pContext, int Status)
281
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)pContext;
285
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)pContext;
283
/* target assertion occured */
287
/* target assertion occurred */
284
288
NotifyTransportFailure(pProt, Status);
287
291
static void StateDumpCallback(void *pContext)
289
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)pContext;
293
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)pContext;
291
295
AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("============ HCIUart State ======================\n"));
292
296
AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("RecvStateFlags : 0x%X \n",pProt->RecvStateFlags));
299
303
AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("==================================================\n"));
302
static A_STATUS HCIUartMessagePending(void *pContext, A_UINT8 LookAheadBytes[], int ValidBytes)
306
static int HCIUartMessagePending(void *pContext, u8 LookAheadBytes[], int ValidBytes)
304
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)pContext;
305
A_STATUS status = A_OK;
308
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)pContext;
306
310
int totalRecvLength = 0;
307
311
HCI_TRANSPORT_PACKET_TYPE pktType = HCI_PACKET_INVALID;
308
A_BOOL recvRefillCalled = FALSE;
309
A_BOOL blockRecv = FALSE;
310
HTC_PACKET *pPacket = NULL;
312
bool recvRefillCalled = false;
313
bool blockRecv = false;
314
struct htc_packet *pPacket = NULL;
312
316
/** caller guarantees that this is a fully block-able context (synch I/O is allowed) */
378
382
/* check for refill handler */
379
383
if (pProt->HCIConfig.pHCIPktRecvRefill != NULL) {
380
recvRefillCalled = TRUE;
384
recvRefillCalled = true;
381
385
UNLOCK_HCI_RX(pProt);
382
386
/* call the re-fill handler */
383
387
pProt->HCIConfig.pHCIPktRecvRefill(pProt->HCIConfig.pContext,
471
475
/* adjust buffer to move past packet ID */
472
476
pPacket->pBuffer++;
473
477
pPacket->ActualLength = totalRecvLength - 1;
474
pPacket->Status = A_OK;
475
479
/* indicate packet */
476
480
DO_HCI_RECV_INDICATION(pProt,pPacket);
479
483
/* check if we need to refill recv buffers */
480
484
if ((pProt->HCIConfig.pHCIPktRecvRefill != NULL) && !recvRefillCalled) {
481
HTC_PACKET_QUEUE *pQueue;
485
struct htc_packet_queue *pQueue;
484
488
if (pktType == HCI_ACL_TYPE) {
505
/* check if we need to disable the reciever */
506
if (A_FAILED(status) || blockRecv) {
509
/* check if we need to disable the receiver */
510
if (status || blockRecv) {
507
511
DevGMboxIRQAction(pProt->pDev, GMBOX_RECV_IRQ_DISABLE, PROC_IO_SYNC);
510
514
/* see if we need to recycle the recv buffer */
511
if (A_FAILED(status) && (pPacket != NULL)) {
512
HTC_PACKET_QUEUE queue;
515
if (status && (pPacket != NULL)) {
516
struct htc_packet_queue queue;
514
518
if (A_EPROTO == status) {
515
519
DebugDumpBytes(pPacket->pBuffer, totalRecvLength, "Bad HCI-UART Recv packet");
530
static void HCISendPacketCompletion(void *Context, HTC_PACKET *pPacket)
534
static void HCISendPacketCompletion(void *Context, struct htc_packet *pPacket)
532
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)Context;
536
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)Context;
533
537
AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCISendPacketCompletion (pPacket:0x%lX) \n",(unsigned long)pPacket));
535
if (A_FAILED(pPacket->Status)) {
539
if (pPacket->Status) {
536
540
AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" Send Packet (0x%lX) failed: %d , len:%d \n",
537
541
(unsigned long)pPacket, pPacket->Status, pPacket->ActualLength));
542
546
AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCISendPacketCompletion \n"));
545
static A_STATUS SeekCreditsSynch(GMBOX_PROTO_HCI_UART *pProt)
549
static int SeekCreditsSynch(struct gmbox_proto_hci_uart *pProt)
547
A_STATUS status = A_OK;
553
557
status = DevGMboxReadCreditCounter(pProt->pDev, PROC_IO_SYNC, &credits);
554
if (A_FAILED(status)) {
557
561
LOCK_HCI_TX(pProt);
577
static A_STATUS HCITrySend(GMBOX_PROTO_HCI_UART *pProt, HTC_PACKET *pPacket, A_BOOL Synchronous)
581
static int HCITrySend(struct gmbox_proto_hci_uart *pProt, struct htc_packet *pPacket, bool Synchronous)
579
A_STATUS status = A_OK;
580
584
int transferLength;
581
585
int creditsRequired, remainder;
583
A_BOOL synchSendComplete = FALSE;
587
bool synchSendComplete = false;
585
589
AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCITrySend (pPacket:0x%lX) %s \n",(unsigned long)pPacket,
586
590
Synchronous ? "SYNC" :"ASYNC"));
603
607
/* in synchronous mode, the send queue can only hold 1 packet */
604
608
if (!HTC_QUEUE_EMPTY(&pProt->SendQueue)) {
605
609
status = A_EBUSY;
610
614
if (pProt->SendProcessCount > 1) {
611
615
/* another thread or task is draining the TX queues */
612
616
status = A_EBUSY;
769
773
if (Synchronous) {
770
774
A_ASSERT(pPacket != NULL);
771
if (A_SUCCESS(status) && (!synchSendComplete)) {
775
if (!status && (!synchSendComplete)) {
772
776
status = A_EBUSY;
774
778
LOCK_HCI_TX(pProt);
775
779
if (pPacket->ListLink.pNext != NULL) {
776
780
/* remove from the queue */
779
783
UNLOCK_HCI_TX(pProt);
782
if (A_FAILED(status) && (pPacket != NULL)) {
786
if (status && (pPacket != NULL)) {
783
787
pPacket->Status = status;
784
788
DO_HCI_SEND_INDICATION(pProt,pPacket);
792
static void FlushSendQueue(GMBOX_PROTO_HCI_UART *pProt)
796
static void FlushSendQueue(struct gmbox_proto_hci_uart *pProt)
795
HTC_PACKET_QUEUE discardQueue;
798
struct htc_packet *pPacket;
799
struct htc_packet_queue discardQueue;
797
801
INIT_HTC_PACKET_QUEUE(&discardQueue);
816
static void FlushRecvBuffers(GMBOX_PROTO_HCI_UART *pProt)
820
static void FlushRecvBuffers(struct gmbox_proto_hci_uart *pProt)
818
HTC_PACKET_QUEUE discardQueue;
822
struct htc_packet_queue discardQueue;
823
struct htc_packet *pPacket;
821
825
INIT_HTC_PACKET_QUEUE(&discardQueue);
842
846
/*** protocol module install entry point ***/
844
A_STATUS GMboxProtocolInstall(AR6K_DEVICE *pDev)
848
int GMboxProtocolInstall(struct ar6k_device *pDev)
846
A_STATUS status = A_OK;
847
GMBOX_PROTO_HCI_UART *pProtocol = NULL;
851
struct gmbox_proto_hci_uart *pProtocol = NULL;
851
pProtocol = A_MALLOC(sizeof(GMBOX_PROTO_HCI_UART));
855
pProtocol = A_MALLOC(sizeof(struct gmbox_proto_hci_uart));
853
857
if (NULL == pProtocol) {
854
858
status = A_NO_MEMORY;
886
890
/*** protocol module uninstall entry point ***/
887
void GMboxProtocolUninstall(AR6K_DEVICE *pDev)
891
void GMboxProtocolUninstall(struct ar6k_device *pDev)
889
GMBOX_PROTO_HCI_UART *pProtocol = (GMBOX_PROTO_HCI_UART *)DEV_GMBOX_GET_PROTOCOL(pDev);
893
struct gmbox_proto_hci_uart *pProtocol = (struct gmbox_proto_hci_uart *)DEV_GMBOX_GET_PROTOCOL(pDev);
891
895
if (pProtocol != NULL) {
894
898
if (pProtocol->HCIAttached) {
895
899
A_ASSERT(pProtocol->HCIConfig.TransportRemoved != NULL);
896
900
pProtocol->HCIConfig.TransportRemoved(pProtocol->HCIConfig.pContext);
897
pProtocol->HCIAttached = FALSE;
901
pProtocol->HCIAttached = false;
900
904
HCIUartCleanup(pProtocol);
924
928
pProt->HCIConfig.pContext);
932
936
/*********** HCI UART protocol implementation ************************************************/
934
HCI_TRANSPORT_HANDLE HCI_TransportAttach(void *HTCHandle, HCI_TRANSPORT_CONFIG_INFO *pInfo)
938
HCI_TRANSPORT_HANDLE HCI_TransportAttach(void *HTCHandle, struct hci_transport_config_info *pInfo)
936
GMBOX_PROTO_HCI_UART *pProtocol = NULL;
940
struct gmbox_proto_hci_uart *pProtocol = NULL;
941
struct ar6k_device *pDev;
939
943
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("+HCI_TransportAttach \n"));
959
A_MEMCPY(&pProtocol->HCIConfig, pInfo, sizeof(HCI_TRANSPORT_CONFIG_INFO));
963
memcpy(&pProtocol->HCIConfig, pInfo, sizeof(struct hci_transport_config_info));
961
965
A_ASSERT(pProtocol->HCIConfig.pHCIPktRecv != NULL);
962
966
A_ASSERT(pProtocol->HCIConfig.pHCISendComplete != NULL);
964
pProtocol->HCIAttached = TRUE;
968
pProtocol->HCIAttached = true;
968
972
UNLOCK_AR6K(pDev);
979
983
void HCI_TransportDetach(HCI_TRANSPORT_HANDLE HciTrans)
981
GMBOX_PROTO_HCI_UART *pProtocol = (GMBOX_PROTO_HCI_UART *)HciTrans;
982
AR6K_DEVICE *pDev = pProtocol->pDev;
985
struct gmbox_proto_hci_uart *pProtocol = (struct gmbox_proto_hci_uart *)HciTrans;
986
struct ar6k_device *pDev = pProtocol->pDev;
984
988
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("+HCI_TransportDetach \n"));
989
993
UNLOCK_AR6K(pDev);
992
pProtocol->HCIAttached = FALSE;
996
pProtocol->HCIAttached = false;
993
997
UNLOCK_AR6K(pDev);
995
999
HCI_TransportStop(HciTrans);
996
1000
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("-HCI_TransportAttach \n"));
999
A_STATUS HCI_TransportAddReceivePkts(HCI_TRANSPORT_HANDLE HciTrans, HTC_PACKET_QUEUE *pQueue)
1003
int HCI_TransportAddReceivePkts(HCI_TRANSPORT_HANDLE HciTrans, struct htc_packet_queue *pQueue)
1001
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1002
A_STATUS status = A_OK;
1003
A_BOOL unblockRecv = FALSE;
1004
HTC_PACKET *pPacket;
1005
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1007
bool unblockRecv = false;
1008
struct htc_packet *pPacket;
1006
1010
AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HCI_TransportAddReceivePkt \n"));
1039
1043
pProt->WaitBufferType));
1040
1044
pProt->RecvStateFlags &= ~HCI_RECV_WAIT_BUFFERS;
1041
1045
pProt->WaitBufferType = HCI_PACKET_INVALID;
1048
1052
UNLOCK_HCI_RX(pProt);
1050
if (A_FAILED(status)) {
1051
1055
while (!HTC_QUEUE_EMPTY(pQueue)) {
1052
1056
pPacket = HTC_PACKET_DEQUEUE(pQueue);
1053
1057
pPacket->Status = A_ECANCELED;
1062
1066
AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HCI_TransportAddReceivePkt \n"));
1067
A_STATUS HCI_TransportSendPkt(HCI_TRANSPORT_HANDLE HciTrans, HTC_PACKET *pPacket, A_BOOL Synchronous)
1071
int HCI_TransportSendPkt(HCI_TRANSPORT_HANDLE HciTrans, struct htc_packet *pPacket, bool Synchronous)
1069
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1073
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1071
1075
return HCITrySend(pProt,pPacket,Synchronous);
1074
1078
void HCI_TransportStop(HCI_TRANSPORT_HANDLE HciTrans)
1076
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1080
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1078
1082
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("+HCI_TransportStop \n"));
1097
1101
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("-HCI_TransportStop \n"));
1100
A_STATUS HCI_TransportStart(HCI_TRANSPORT_HANDLE HciTrans)
1104
int HCI_TransportStart(HCI_TRANSPORT_HANDLE HciTrans)
1103
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1107
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1105
1109
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("+HCI_TransportStart \n"));
1107
1111
/* set stopped in case we have a problem in starting */
1108
pProt->HCIStopped = TRUE;
1112
pProt->HCIStopped = true;
1112
1116
status = InitTxCreditState(pProt);
1114
if (A_FAILED(status)) {
1118
1122
status = DevGMboxIRQAction(pProt->pDev, GMBOX_ERRORS_IRQ_ENABLE, PROC_IO_SYNC);
1120
if (A_FAILED(status)) {
1123
1127
/* enable recv */
1124
1128
status = DevGMboxIRQAction(pProt->pDev, GMBOX_RECV_IRQ_ENABLE, PROC_IO_SYNC);
1126
if (A_FAILED(status)) {
1129
1133
/* signal bridge side to power up BT */
1130
1134
status = DevGMboxSetTargetInterrupt(pProt->pDev, MBOX_SIG_HCI_BRIDGE_BT_ON, BTON_TIMEOUT_MS);
1132
if (A_FAILED(status)) {
1133
1137
AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("HCI_TransportStart : Failed to trigger BT ON \n"));
1137
1141
/* we made it */
1138
pProt->HCIStopped = FALSE;
1142
pProt->HCIStopped = false;
1142
1146
AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("-HCI_TransportStart \n"));
1147
A_STATUS HCI_TransportEnableDisableAsyncRecv(HCI_TRANSPORT_HANDLE HciTrans, A_BOOL Enable)
1151
int HCI_TransportEnableDisableAsyncRecv(HCI_TRANSPORT_HANDLE HciTrans, bool Enable)
1149
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1153
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1150
1154
return DevGMboxIRQAction(pProt->pDev,
1151
1155
Enable ? GMBOX_RECV_IRQ_ENABLE : GMBOX_RECV_IRQ_DISABLE,
1156
A_STATUS HCI_TransportRecvHCIEventSync(HCI_TRANSPORT_HANDLE HciTrans,
1157
HTC_PACKET *pPacket,
1160
int HCI_TransportRecvHCIEventSync(HCI_TRANSPORT_HANDLE HciTrans,
1161
struct htc_packet *pPacket,
1160
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1161
A_STATUS status = A_OK;
1162
A_UINT8 lookAhead[8];
1164
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1164
1168
int totalRecvLength;
1226
1230
#define LSB_SCRATCH_IDX 4
1227
1231
#define MSB_SCRATCH_IDX 5
1228
A_STATUS HCI_TransportSetBaudRate(HCI_TRANSPORT_HANDLE HciTrans, A_UINT32 Baud)
1232
int HCI_TransportSetBaudRate(HCI_TRANSPORT_HANDLE HciTrans, u32 Baud)
1230
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1231
HIF_DEVICE *pHIFDevice = (HIF_DEVICE *)(pProt->pDev->HIFDevice);
1232
A_UINT32 scaledBaud, scratchAddr;
1233
A_STATUS status = A_OK;
1234
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1235
struct hif_device *pHIFDevice = (struct hif_device *)(pProt->pDev->HIFDevice);
1236
u32 scaledBaud, scratchAddr;
1235
1239
/* Divide the desired baud rate by 100
1236
1240
* Store the LSB in the local scratch register 4 and the MSB in the local
1242
1246
scratchAddr = MBOX_BASE_ADDRESS | (LOCAL_SCRATCH_ADDRESS + 4 * MSB_SCRATCH_IDX);
1243
1247
scaledBaud = ((Baud / 100) >> (LOCAL_SCRATCH_VALUE_MSB+1)) & LOCAL_SCRATCH_VALUE_MASK;
1244
1248
status |= ar6000_WriteRegDiag(pHIFDevice, &scratchAddr, &scaledBaud);
1245
if (A_OK != status) {
1246
1250
AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to set up baud rate in scratch register!"));
1250
1254
/* Now interrupt the target to tell it about the baud rate */
1251
1255
status = DevGMboxSetTargetInterrupt(pProt->pDev, MBOX_SIG_HCI_BRIDGE_BAUD_SET, BAUD_TIMEOUT_MS);
1252
if (A_OK != status) {
1253
1257
AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to tell target to change baud rate!"));
1259
A_STATUS HCI_TransportEnablePowerMgmt(HCI_TRANSPORT_HANDLE HciTrans, A_BOOL Enable)
1263
int HCI_TransportEnablePowerMgmt(HCI_TRANSPORT_HANDLE HciTrans, bool Enable)
1262
GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)HciTrans;
1266
struct gmbox_proto_hci_uart *pProt = (struct gmbox_proto_hci_uart *)HciTrans;
1265
1269
status = DevGMboxSetTargetInterrupt(pProt->pDev, MBOX_SIG_HCI_BRIDGE_PWR_SAV_ON, BTPWRSAV_TIMEOUT_MS);
1267
1271
status = DevGMboxSetTargetInterrupt(pProt->pDev, MBOX_SIG_HCI_BRIDGE_PWR_SAV_OFF, BTPWRSAV_TIMEOUT_MS);
1270
if (A_FAILED(status)) {
1271
1275
AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to enable/disable HCI power management!\n"));
1273
1277
AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("HCI power management enabled/disabled!\n"));