| OLD | NEW |
| 1 //------------------------------------------------------------------------------ | 1 //------------------------------------------------------------------------------ |
| 2 // <copyright file="ar6k_prot_hciUart.c" company="Atheros"> | 2 // <copyright file="ar6k_prot_hciUart.c" company="Atheros"> |
| 3 // Copyright (c) 2007-2008 Atheros Corporation. All rights reserved. | 3 // Copyright (c) 2007-2010 Atheros Corporation. All rights reserved. |
| 4 // | 4 // |
| 5 // This program is free software; you can redistribute it and/or modify | |
| 6 // it under the terms of the GNU General Public License version 2 as | |
| 7 // published by the Free Software Foundation; | |
| 8 // | 5 // |
| 9 // Software distributed under the License is distributed on an "AS | 6 // Permission to use, copy, modify, and/or distribute this software for any |
| 10 // IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | 7 // purpose with or without fee is hereby granted, provided that the above |
| 11 // implied. See the License for the specific language governing | 8 // copyright notice and this permission notice appear in all copies. |
| 12 // rights and limitations under the License. | 9 // |
| 10 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 11 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 12 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 13 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 14 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 15 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 16 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 13 // | 17 // |
| 14 // | 18 // |
| 15 //------------------------------------------------------------------------------ | 19 //------------------------------------------------------------------------------ |
| 16 //============================================================================== | 20 //============================================================================== |
| 17 // Protocol module for use in bridging HCI-UART packets over the GMBOX interface | 21 // Protocol module for use in bridging HCI-UART packets over the GMBOX interface |
| 18 // | 22 // |
| 19 // Author(s): ="Atheros" | 23 // Author(s): ="Atheros" |
| 20 //============================================================================== | 24 //============================================================================== |
| 21 #include "a_config.h" | 25 #include "a_config.h" |
| 22 #include "athdefs.h" | 26 #include "athdefs.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 int CreditsCurrentSeek; | 76 int CreditsCurrentSeek; |
| 73 int SendProcessCount; | 77 int SendProcessCount; |
| 74 } GMBOX_PROTO_HCI_UART; | 78 } GMBOX_PROTO_HCI_UART; |
| 75 | 79 |
| 76 #define LOCK_HCI_RX(t) A_MUTEX_LOCK(&(t)->HCIRxLock); | 80 #define LOCK_HCI_RX(t) A_MUTEX_LOCK(&(t)->HCIRxLock); |
| 77 #define UNLOCK_HCI_RX(t) A_MUTEX_UNLOCK(&(t)->HCIRxLock); | 81 #define UNLOCK_HCI_RX(t) A_MUTEX_UNLOCK(&(t)->HCIRxLock); |
| 78 #define LOCK_HCI_TX(t) A_MUTEX_LOCK(&(t)->HCITxLock); | 82 #define LOCK_HCI_TX(t) A_MUTEX_LOCK(&(t)->HCITxLock); |
| 79 #define UNLOCK_HCI_TX(t) A_MUTEX_UNLOCK(&(t)->HCITxLock); | 83 #define UNLOCK_HCI_TX(t) A_MUTEX_UNLOCK(&(t)->HCITxLock); |
| 80 | 84 |
| 81 #define DO_HCI_RECV_INDICATION(p,pt) \ | 85 #define DO_HCI_RECV_INDICATION(p,pt) \ |
| 82 { AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("HCI: Indicate Recv on packet:0x%X status:%d
len:%d type:%d \n", \ | 86 { AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("HCI: Indicate Recv on packet:0x%lX status:%
d len:%d type:%d \n", \ |
| 83 (A_UINT32)(pt),(pt)->Status, A_SUCCESS((pt)->Status) ? (pt)->ActualLength
: 0, HCI_GET_PACKET_TYPE(pt))); \ | 87 (unsigned long)(pt),(pt)->Status, A_SUCCESS((pt)->Status) ? (pt)->ActualLe
ngth : 0, HCI_GET_PACKET_TYPE(pt))); \ |
| 84 (p)->HCIConfig.pHCIPktRecv((p)->HCIConfig.pContext, (pt));
\ | 88 (p)->HCIConfig.pHCIPktRecv((p)->HCIConfig.pContext, (pt));
\ |
| 85 } | 89 } |
| 86 | 90 |
| 87 #define DO_HCI_SEND_INDICATION(p,pt) \ | 91 #define DO_HCI_SEND_INDICATION(p,pt) \ |
| 88 { AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: Indicate Send on packet:0x%X status:%d
type:%d \n", \ | 92 { AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: Indicate Send on packet:0x%lX status:%
d type:%d \n", \ |
| 89 (A_UINT32)(pt),(pt)->Status,HCI_GET_PACKET_TYPE(pt)));
\ | 93 (unsigned long)(pt),(pt)->Status,HCI_GET_PACKET_TYPE(pt)));
\ |
| 90 (p)->HCIConfig.pHCISendComplete((p)->HCIConfig.pContext, (pt));
\ | 94 (p)->HCIConfig.pHCISendComplete((p)->HCIConfig.pContext, (pt));
\ |
| 91 } | 95 } |
| 92 | 96 |
| 93 static A_STATUS HCITrySend(GMBOX_PROTO_HCI_UART *pProt, HTC_PACKET *pPacket, A_B
OOL Synchronous); | 97 static A_STATUS HCITrySend(GMBOX_PROTO_HCI_UART *pProt, HTC_PACKET *pPacket, A_B
OOL Synchronous); |
| 94 | 98 |
| 95 static void HCIUartCleanup(GMBOX_PROTO_HCI_UART *pProtocol) | 99 static void HCIUartCleanup(GMBOX_PROTO_HCI_UART *pProtocol) |
| 96 { | 100 { |
| 97 A_ASSERT(pProtocol != NULL); | 101 A_ASSERT(pProtocol != NULL); |
| 98 | 102 |
| 99 A_MUTEX_DELETE(&pProtocol->HCIRxLock); | 103 A_MUTEX_DELETE(&pProtocol->HCIRxLock); |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 | 523 |
| 520 | 524 |
| 521 AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HCIUartMessagePending \n")); | 525 AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HCIUartMessagePending \n")); |
| 522 | 526 |
| 523 return status; | 527 return status; |
| 524 } | 528 } |
| 525 | 529 |
| 526 static void HCISendPacketCompletion(void *Context, HTC_PACKET *pPacket) | 530 static void HCISendPacketCompletion(void *Context, HTC_PACKET *pPacket) |
| 527 { | 531 { |
| 528 GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)Context; | 532 GMBOX_PROTO_HCI_UART *pProt = (GMBOX_PROTO_HCI_UART *)Context; |
| 529 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCISendPacketCompletion (pPacket:0x%X) \n"
,(A_UINT32)pPacket)); | 533 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCISendPacketCompletion (pPacket:0x%lX) \n
",(unsigned long)pPacket)); |
| 530 | 534 |
| 531 if (A_FAILED(pPacket->Status)) { | 535 if (A_FAILED(pPacket->Status)) { |
| 532 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" Send Packet (0x%X) failed: %d , len:%d
\n", | 536 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" Send Packet (0x%lX) failed: %d , len:%d
\n", |
| 533 (A_UINT32)pPacket, pPacket->Status, pPacket->ActualLength)); | 537 (unsigned long)pPacket, pPacket->Status, pPacket->ActualLength));
|
| 534 } | 538 } |
| 535 | 539 |
| 536 DO_HCI_SEND_INDICATION(pProt,pPacket); | 540 DO_HCI_SEND_INDICATION(pProt,pPacket); |
| 537 | 541 |
| 538 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCISendPacketCompletion \n")); | 542 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCISendPacketCompletion \n")); |
| 539 } | 543 } |
| 540 | 544 |
| 541 static A_STATUS SeekCreditsSynch(GMBOX_PROTO_HCI_UART *pProt) | 545 static A_STATUS SeekCreditsSynch(GMBOX_PROTO_HCI_UART *pProt) |
| 542 { | 546 { |
| 543 A_STATUS status = A_OK; | 547 A_STATUS status = A_OK; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 571 } | 575 } |
| 572 | 576 |
| 573 static A_STATUS HCITrySend(GMBOX_PROTO_HCI_UART *pProt, HTC_PACKET *pPacket, A_B
OOL Synchronous) | 577 static A_STATUS HCITrySend(GMBOX_PROTO_HCI_UART *pProt, HTC_PACKET *pPacket, A_B
OOL Synchronous) |
| 574 { | 578 { |
| 575 A_STATUS status = A_OK; | 579 A_STATUS status = A_OK; |
| 576 int transferLength; | 580 int transferLength; |
| 577 int creditsRequired, remainder; | 581 int creditsRequired, remainder; |
| 578 A_UINT8 hciUartType; | 582 A_UINT8 hciUartType; |
| 579 A_BOOL synchSendComplete = FALSE; | 583 A_BOOL synchSendComplete = FALSE; |
| 580 | 584 |
| 581 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCITrySend (pPacket:0x%X) %s \n",(A_UINT32
)pPacket, | 585 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HCITrySend (pPacket:0x%lX) %s \n",(unsigne
d long)pPacket, |
| 582 Synchronous ? "SYNC" :"ASYNC")); | 586 Synchronous ? "SYNC" :"ASYNC")); |
| 583 | 587 |
| 584 LOCK_HCI_TX(pProt); | 588 LOCK_HCI_TX(pProt); |
| 585 | 589 |
| 586 /* increment write processing count on entry */ | 590 /* increment write processing count on entry */ |
| 587 pProt->SendProcessCount++; | 591 pProt->SendProcessCount++; |
| 588 | 592 |
| 589 do { | 593 do { |
| 590 | 594 |
| 591 if (pProt->HCIStopped) { | 595 if (pProt->HCIStopped) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 default: | 668 default: |
| 665 status = A_EINVAL; | 669 status = A_EINVAL; |
| 666 A_ASSERT(FALSE); | 670 A_ASSERT(FALSE); |
| 667 break; | 671 break; |
| 668 } | 672 } |
| 669 | 673 |
| 670 if (A_FAILED(status)) { | 674 if (A_FAILED(status)) { |
| 671 break; | 675 break; |
| 672 } | 676 } |
| 673 | 677 |
| 674 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: Got head packet:0x%X , Type:%d
Length: %d Remaining Queue Depth: %d\n", | 678 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: Got head packet:0x%lX , Type:%
d Length: %d Remaining Queue Depth: %d\n", |
| 675 (A_UINT32)pPacket, HCI_GET_PACKET_TYPE(pPacket), pPacket->Actual
Length, | 679 (unsigned long)pPacket, HCI_GET_PACKET_TYPE(pPacket), pPacket->A
ctualLength, |
| 676 HTC_PACKET_QUEUE_DEPTH(&pProt->SendQueue))); | 680 HTC_PACKET_QUEUE_DEPTH(&pProt->SendQueue))); |
| 677 | 681 |
| 678 transferLength = 1; /* UART type header is 1 byte */ | 682 transferLength = 1; /* UART type header is 1 byte */ |
| 679 transferLength += pPacket->ActualLength; | 683 transferLength += pPacket->ActualLength; |
| 680 transferLength = DEV_CALC_SEND_PADDED_LEN(pProt->pDev, transferLengt
h); | 684 transferLength = DEV_CALC_SEND_PADDED_LEN(pProt->pDev, transferLengt
h); |
| 681 | 685 |
| 682 /* figure out how many credits this message requires */ | 686 /* figure out how many credits this message requires */ |
| 683 creditsRequired = transferLength / pProt->CreditSize; | 687 creditsRequired = transferLength / pProt->CreditSize; |
| 684 remainder = transferLength % pProt->CreditSize; | 688 remainder = transferLength % pProt->CreditSize; |
| 685 | 689 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 702 } | 706 } |
| 703 /* fall through and continue processing this send op */
| 707 /* fall through and continue processing this send op */
|
| 704 } else { | 708 } else { |
| 705 /* not enough credits, queue back to the head */ | 709 /* not enough credits, queue back to the head */ |
| 706 HTC_PACKET_ENQUEUE_TO_HEAD(&pProt->SendQueue,pPacket); | 710 HTC_PACKET_ENQUEUE_TO_HEAD(&pProt->SendQueue,pPacket); |
| 707 /* waiting for credits */ | 711 /* waiting for credits */ |
| 708 pProt->SendStateFlags |= HCI_SEND_WAIT_CREDITS; | 712 pProt->SendStateFlags |= HCI_SEND_WAIT_CREDITS; |
| 709 /* provide a hint to reduce attempts to re-send if credi
ts are dribbling back | 713 /* provide a hint to reduce attempts to re-send if credi
ts are dribbling back |
| 710 * this hint is the short fall of credits */ | 714 * this hint is the short fall of credits */ |
| 711 pProt->CreditsCurrentSeek = creditsRequired; | 715 pProt->CreditsCurrentSeek = creditsRequired; |
| 712 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: packet:0x%X placed bac
k in queue. head packet needs: %d credits \n", | 716 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("HCI: packet:0x%lX placed ba
ck in queue. head packet needs: %d credits \n", |
| 713 (A_UINT32)pPacket, pProt->CreditsCurrent
Seek)); | 717 (unsigned long)pPacket, pProt->CreditsCu
rrentSeek)); |
| 714 pPacket = NULL; | 718 pPacket = NULL; |
| 715 UNLOCK_HCI_TX(pProt); | 719 UNLOCK_HCI_TX(pProt); |
| 716 | 720 |
| 717 /* schedule a credit counter read, our CreditsAvailableC
allback callback will be called | 721 /* schedule a credit counter read, our CreditsAvailableC
allback callback will be called |
| 718 * with the result */ | 722 * with the result */ |
| 719 DevGMboxReadCreditCounter(pProt->pDev, PROC_IO_ASYNC, NULL); | 723 DevGMboxReadCreditCounter(pProt->pDev, PROC_IO_ASYNC, NULL); |
| 720 | 724 |
| 721 LOCK_HCI_TX(pProt); | 725 LOCK_HCI_TX(pProt); |
| 722 break; | 726 break; |
| 723 } | 727 } |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 | 965 |
| 962 } while (FALSE); | 966 } while (FALSE); |
| 963 | 967 |
| 964 UNLOCK_AR6K(pDev); | 968 UNLOCK_AR6K(pDev); |
| 965 | 969 |
| 966 if (pProtocol != NULL) { | 970 if (pProtocol != NULL) { |
| 967 /* TODO ... should we use a worker? */ | 971 /* TODO ... should we use a worker? */ |
| 968 NotifyTransportReady(pProtocol); | 972 NotifyTransportReady(pProtocol); |
| 969 } | 973 } |
| 970 | 974 |
| 971 AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("-HCI_TransportAttach (0x%X) \n",(A_UINT32)pP
rotocol)); | 975 AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("-HCI_TransportAttach (0x%lX) \n",(unsigned l
ong)pProtocol)); |
| 972 return (HCI_TRANSPORT_HANDLE)pProtocol; | 976 return (HCI_TRANSPORT_HANDLE)pProtocol; |
| 973 } | 977 } |
| 974 | 978 |
| 975 void HCI_TransportDetach(HCI_TRANSPORT_HANDLE HciTrans) | 979 void HCI_TransportDetach(HCI_TRANSPORT_HANDLE HciTrans) |
| 976 { | 980 { |
| 977 GMBOX_PROTO_HCI_UART *pProtocol = (GMBOX_PROTO_HCI_UART *)HciTrans; | 981 GMBOX_PROTO_HCI_UART *pProtocol = (GMBOX_PROTO_HCI_UART *)HciTrans; |
| 978 AR6K_DEVICE *pDev = pProtocol->pDev; | 982 AR6K_DEVICE *pDev = pProtocol->pDev; |
| 979 | 983 |
| 980 AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("+HCI_TransportDetach \n")); | 984 AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("+HCI_TransportDetach \n")); |
| 981 | 985 |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to enable/disable HCI power manag
ement!\n")); | 1271 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to enable/disable HCI power manag
ement!\n")); |
| 1268 } else { | 1272 } else { |
| 1269 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("HCI power management enabled/disabled!\n
")); | 1273 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("HCI power management enabled/disabled!\n
")); |
| 1270 } | 1274 } |
| 1271 | 1275 |
| 1272 return status; | 1276 return status; |
| 1273 } | 1277 } |
| 1274 | 1278 |
| 1275 #endif //ATH_AR6K_ENABLE_GMBOX | 1279 #endif //ATH_AR6K_ENABLE_GMBOX |
| 1276 | 1280 |
| OLD | NEW |