aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/files-2.6.30/drivers/ar6000/htc/htc_recv.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/files-2.6.30/drivers/ar6000/htc/htc_recv.c')
-rw-r--r--target/linux/s3c24xx/files-2.6.30/drivers/ar6000/htc/htc_recv.c703
1 files changed, 0 insertions, 703 deletions
diff --git a/target/linux/s3c24xx/files-2.6.30/drivers/ar6000/htc/htc_recv.c b/target/linux/s3c24xx/files-2.6.30/drivers/ar6000/htc/htc_recv.c
deleted file mode 100644
index 4be2b0833c..0000000000
--- a/target/linux/s3c24xx/files-2.6.30/drivers/ar6000/htc/htc_recv.c
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- *
- * Copyright (c) 2007 Atheros Communications Inc.
- * 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.
- *
- *
- *
- */
-
-#include "htc_internal.h"
-
-#define HTCIssueRecv(t, p) \
- DevRecvPacket(&(t)->Device, \
- (p), \
- (p)->ActualLength)
-
-#define DO_RCV_COMPLETION(t,p,e) \
-{ \
- if ((p)->ActualLength > 0) { \
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" completing packet 0x%X (%d bytes) on ep : %d \n", \
- (A_UINT32)(p), (p)->ActualLength, (p)->Endpoint)); \
- (e)->EpCallBacks.EpRecv((e)->EpCallBacks.pContext, \
- (p)); \
- } else { \
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" recycling empty packet \n")); \
- HTC_RECYCLE_RX_PKT((t), (p)); \
- } \
-}
-
-#ifdef HTC_EP_STAT_PROFILING
-#define HTC_RX_STAT_PROFILE(t,ep,lookAhead) \
-{ \
- LOCK_HTC_RX((t)); \
- INC_HTC_EP_STAT((ep), RxReceived, 1); \
- if ((lookAhead) != 0) { \
- INC_HTC_EP_STAT((ep), RxLookAheads, 1); \
- } \
- UNLOCK_HTC_RX((t)); \
-}
-#else
-#define HTC_RX_STAT_PROFILE(t,ep,lookAhead)
-#endif
-
-static INLINE A_STATUS HTCProcessTrailer(HTC_TARGET *target,
- A_UINT8 *pBuffer,
- int Length,
- A_UINT32 *pNextLookAhead,
- HTC_ENDPOINT_ID FromEndpoint)
-{
- HTC_RECORD_HDR *pRecord;
- A_UINT8 *pRecordBuf;
- HTC_LOOKAHEAD_REPORT *pLookAhead;
- A_UINT8 *pOrigBuffer;
- int origLength;
- A_STATUS status;
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessTrailer (length:%d) \n", Length));
-
- if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
- AR_DEBUG_PRINTBUF(pBuffer,Length,"Recv Trailer");
- }
-
- pOrigBuffer = pBuffer;
- origLength = Length;
- status = A_OK;
-
- while (Length > 0) {
-
- if (Length < sizeof(HTC_RECORD_HDR)) {
- status = A_EPROTO;
- break;
- }
- /* these are byte aligned structs */
- pRecord = (HTC_RECORD_HDR *)pBuffer;
- Length -= sizeof(HTC_RECORD_HDR);
- pBuffer += sizeof(HTC_RECORD_HDR);
-
- if (pRecord->Length > Length) {
- /* no room left in buffer for record */
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- (" invalid record length: %d (id:%d) buffer has: %d bytes left \n",
- pRecord->Length, pRecord->RecordID, Length));
- status = A_EPROTO;
- break;
- }
- /* start of record follows the header */
- pRecordBuf = pBuffer;
-
- switch (pRecord->RecordID) {
- case HTC_RECORD_CREDITS:
- AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_CREDIT_REPORT));
- HTCProcessCreditRpt(target,
- (HTC_CREDIT_REPORT *)pRecordBuf,
- pRecord->Length / (sizeof(HTC_CREDIT_REPORT)),
- FromEndpoint);
- break;
- case HTC_RECORD_LOOKAHEAD:
- AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_LOOKAHEAD_REPORT));
- pLookAhead = (HTC_LOOKAHEAD_REPORT *)pRecordBuf;
- if ((pLookAhead->PreValid == ((~pLookAhead->PostValid) & 0xFF)) &&
- (pNextLookAhead != NULL)) {
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
- (" LookAhead Report Found (pre valid:0x%X, post valid:0x%X) \n",
- pLookAhead->PreValid,
- pLookAhead->PostValid));
-
- /* look ahead bytes are valid, copy them over */
- ((A_UINT8 *)pNextLookAhead)[0] = pLookAhead->LookAhead[0];
- ((A_UINT8 *)pNextLookAhead)[1] = pLookAhead->LookAhead[1];
- ((A_UINT8 *)pNextLookAhead)[2] = pLookAhead->LookAhead[2];
- ((A_UINT8 *)pNextLookAhead)[3] = pLookAhead->LookAhead[3];
-
- if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
- DebugDumpBytes((A_UINT8 *)pNextLookAhead,4,"Next Look Ahead");
- }
- }
- break;
- default:
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" unhandled record: id:%d length:%d \n",
- pRecord->RecordID, pRecord->Length));
- break;
- }
-
- if (A_FAILED(status)) {
- break;
- }
-
- /* advance buffer past this record for next time around */
- pBuffer += pRecord->Length;
- Length -= pRecord->Length;
- }
-
- if (A_FAILED(status)) {
- DebugDumpBytes(pOrigBuffer,origLength,"BAD Recv Trailer");
- }
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessTrailer \n"));
- return status;
-
-}
-
-/* process a received message (i.e. strip off header, process any trailer data)
- * note : locks must be released when this function is called */
-static A_STATUS HTCProcessRecvHeader(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT32 *pNextLookAhead)
-{
- A_UINT8 temp;
- A_UINT8 *pBuf;
- A_STATUS status = A_OK;
- A_UINT16 payloadLen;
- A_UINT32 lookAhead;
-
- pBuf = pPacket->pBuffer;
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessRecvHeader \n"));
-
- if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
- AR_DEBUG_PRINTBUF(pBuf,pPacket->ActualLength,"HTC Recv PKT");
- }
-
- do {
- /* note, we cannot assume the alignment of pBuffer, so we use the safe macros to
- * retrieve 16 bit fields */
- payloadLen = A_GET_UINT16_FIELD(pBuf, HTC_FRAME_HDR, PayloadLen);
-
- ((A_UINT8 *)&lookAhead)[0] = pBuf[0];
- ((A_UINT8 *)&lookAhead)[1] = pBuf[1];
- ((A_UINT8 *)&lookAhead)[2] = pBuf[2];
- ((A_UINT8 *)&lookAhead)[3] = pBuf[3];
-
- if (lookAhead != pPacket->HTCReserved) {
- /* somehow the lookahead that gave us the full read length did not
- * reflect the actual header in the pending message */
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("HTCProcessRecvHeader, lookahead mismatch! \n"));
- DebugDumpBytes((A_UINT8 *)&pPacket->HTCReserved,4,"Expected Message LookAhead");
- DebugDumpBytes(pBuf,sizeof(HTC_FRAME_HDR),"Current Frame Header");
-#ifdef HTC_CAPTURE_LAST_FRAME
- DebugDumpBytes((A_UINT8 *)&target->LastFrameHdr,sizeof(HTC_FRAME_HDR),"Last Frame Header");
- if (target->LastTrailerLength != 0) {
- DebugDumpBytes(target->LastTrailer,
- target->LastTrailerLength,
- "Last trailer");
- }
-#endif
- status = A_EPROTO;
- break;
- }
-
- /* get flags */
- temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, Flags);
-
- if (temp & HTC_FLAGS_RECV_TRAILER) {
- /* this packet has a trailer */
-
- /* extract the trailer length in control byte 0 */
- temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, ControlBytes[0]);
-
- if ((temp < sizeof(HTC_RECORD_HDR)) || (temp > payloadLen)) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("HTCProcessRecvHeader, invalid header (payloadlength should be :%d, CB[0] is:%d) \n",
- payloadLen, temp));
- status = A_EPROTO;
- break;
- }
-
- /* process trailer data that follows HDR + application payload */
- status = HTCProcessTrailer(target,
- (pBuf + HTC_HDR_LENGTH + payloadLen - temp),
- temp,
- pNextLookAhead,
- pPacket->Endpoint);
-
- if (A_FAILED(status)) {
- break;
- }
-
-#ifdef HTC_CAPTURE_LAST_FRAME
- A_MEMCPY(target->LastTrailer, (pBuf + HTC_HDR_LENGTH + payloadLen - temp), temp);
- target->LastTrailerLength = temp;
-#endif
- /* trim length by trailer bytes */
- pPacket->ActualLength -= temp;
- }
-#ifdef HTC_CAPTURE_LAST_FRAME
- else {
- target->LastTrailerLength = 0;
- }
-#endif
-
- /* if we get to this point, the packet is good */
- /* remove header and adjust length */
- pPacket->pBuffer += HTC_HDR_LENGTH;
- pPacket->ActualLength -= HTC_HDR_LENGTH;
-
- } while (FALSE);
-
- if (A_FAILED(status)) {
- /* dump the whole packet */
- DebugDumpBytes(pBuf,pPacket->ActualLength,"BAD HTC Recv PKT");
- } else {
-#ifdef HTC_CAPTURE_LAST_FRAME
- A_MEMCPY(&target->LastFrameHdr,pBuf,sizeof(HTC_FRAME_HDR));
-#endif
- if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
- if (pPacket->ActualLength > 0) {
- AR_DEBUG_PRINTBUF(pPacket->pBuffer,pPacket->ActualLength,"HTC - Application Msg");
- }
- }
- }
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessRecvHeader \n"));
- return status;
-}
-
-/* asynchronous completion handler for recv packet fetching, when the device layer
- * completes a read request, it will call this completion handler */
-void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket)
-{
- HTC_TARGET *target = (HTC_TARGET *)Context;
- HTC_ENDPOINT *pEndpoint;
- A_UINT32 nextLookAhead = 0;
- A_STATUS status;
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCRecvCompleteHandler (status:%d, ep:%d) \n",
- pPacket->Status, pPacket->Endpoint));
-
- AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
- pEndpoint = &target->EndPoint[pPacket->Endpoint];
- pPacket->Completion = NULL;
-
- /* get completion status */
- status = pPacket->Status;
-
- do {
- if (A_FAILED(status)) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HTCRecvCompleteHandler: request failed (status:%d, ep:%d) \n",
- pPacket->Status, pPacket->Endpoint));
- break;
- }
- /* process the header for any trailer data */
- status = HTCProcessRecvHeader(target,pPacket,&nextLookAhead);
-
- if (A_FAILED(status)) {
- break;
- }
- /* was there a lookahead for the next packet? */
- if (nextLookAhead != 0) {
- A_STATUS nextStatus;
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
- ("HTCRecvCompleteHandler - next look ahead was non-zero : 0x%X \n",
- nextLookAhead));
- /* we have another packet, get the next packet fetch started (pipelined) before
- * we call into the endpoint's callback, this will start another async request */
- nextStatus = HTCRecvMessagePendingHandler(target,nextLookAhead,NULL);
- if (A_EPROTO == nextStatus) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("Next look ahead from recv header was INVALID\n"));
- DebugDumpBytes((A_UINT8 *)&nextLookAhead,
- 4,
- "BAD lookahead from lookahead report");
- }
- } else {
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
- ("HTCRecvCompleteHandler - rechecking for more messages...\n"));
- /* if we did not get anything on the look-ahead,
- * call device layer to asynchronously re-check for messages. If we can keep the async
- * processing going we get better performance. If there is a pending message we will keep processing
- * messages asynchronously which should pipeline things nicely */
- DevCheckPendingRecvMsgsAsync(&target->Device);
- }
-
- HTC_RX_STAT_PROFILE(target,pEndpoint,nextLookAhead);
- DO_RCV_COMPLETION(target,pPacket,pEndpoint);
-
- } while (FALSE);
-
- if (A_FAILED(status)) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("HTCRecvCompleteHandler , message fetch failed (status = %d) \n",
- status));
- /* recyle this packet */
- HTC_RECYCLE_RX_PKT(target, pPacket);
- }
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCRecvCompleteHandler\n"));
-}
-
-/* synchronously wait for a control message from the target,
- * This function is used at initialization time ONLY. At init messages
- * on ENDPOINT 0 are expected. */
-A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket)
-{
- A_STATUS status;
- A_UINT32 lookAhead;
- HTC_PACKET *pPacket = NULL;
- HTC_FRAME_HDR *pHdr;
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCWaitforControlMessage \n"));
-
- do {
-
- *ppControlPacket = NULL;
-
- /* call the polling function to see if we have a message */
- status = DevPollMboxMsgRecv(&target->Device,
- &lookAhead,
- HTC_TARGET_RESPONSE_TIMEOUT);
-
- if (A_FAILED(status)) {
- break;
- }
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
- ("HTCWaitforControlMessage : lookAhead : 0x%X \n", lookAhead));
-
- /* check the lookahead */
- pHdr = (HTC_FRAME_HDR *)&lookAhead;
-
- if (pHdr->EndpointID != ENDPOINT_0) {
- /* unexpected endpoint number, should be zero */
- AR_DEBUG_ASSERT(FALSE);
- status = A_EPROTO;
- break;
- }
-
- if (A_FAILED(status)) {
- /* bad message */
- AR_DEBUG_ASSERT(FALSE);
- status = A_EPROTO;
- break;
- }
-
- pPacket = HTC_ALLOC_CONTROL_RX(target);
-
- if (pPacket == NULL) {
- AR_DEBUG_ASSERT(FALSE);
- status = A_NO_MEMORY;
- break;
- }
-
- pPacket->HTCReserved = lookAhead;
- pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
-
- if (pPacket->ActualLength > pPacket->BufferLength) {
- AR_DEBUG_ASSERT(FALSE);
- status = A_EPROTO;
- break;
- }
-
- /* we want synchronous operation */
- pPacket->Completion = NULL;
-
- /* get the message from the device, this will block */
- status = HTCIssueRecv(target, pPacket);
-
- if (A_FAILED(status)) {
- break;
- }
-
- /* process receive header */
- status = HTCProcessRecvHeader(target,pPacket,NULL);
-
- pPacket->Status = status;
-
- if (A_FAILED(status)) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("HTCWaitforControlMessage, HTCProcessRecvHeader failed (status = %d) \n",
- status));
- break;
- }
-
- /* give the caller this control message packet, they are responsible to free */
- *ppControlPacket = pPacket;
-
- } while (FALSE);
-
- if (A_FAILED(status)) {
- if (pPacket != NULL) {
- /* cleanup buffer on error */
- HTC_FREE_CONTROL_RX(target,pPacket);
- }
- }
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCWaitforControlMessage \n"));
-
- return status;
-}
-
-/* callback when device layer or lookahead report parsing detects a pending message */
-A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc)
-{
- HTC_TARGET *target = (HTC_TARGET *)Context;
- A_STATUS status = A_OK;
- HTC_PACKET *pPacket = NULL;
- HTC_FRAME_HDR *pHdr;
- HTC_ENDPOINT *pEndpoint;
- A_BOOL asyncProc = FALSE;
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCRecvMessagePendingHandler LookAhead:0x%X \n",LookAhead));
-
- if (IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(&target->Device)) {
- /* We use async mode to get the packets if the device layer supports it.
- * The device layer interfaces with HIF in which HIF may have restrictions on
- * how interrupts are processed */
- asyncProc = TRUE;
- }
-
- if (pAsyncProc != NULL) {
- /* indicate to caller how we decided to process this */
- *pAsyncProc = asyncProc;
- }
-
- while (TRUE) {
-
- pHdr = (HTC_FRAME_HDR *)&LookAhead;
-
- if (pHdr->EndpointID >= ENDPOINT_MAX) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid Endpoint in look-ahead: %d \n",pHdr->EndpointID));
- /* invalid endpoint */
- status = A_EPROTO;
- break;
- }
-
- if (pHdr->PayloadLen > HTC_MAX_PAYLOAD_LENGTH) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Payload length %d exceeds max HTC : %d !\n",
- pHdr->PayloadLen, HTC_MAX_PAYLOAD_LENGTH));
- status = A_EPROTO;
- break;
- }
-
- pEndpoint = &target->EndPoint[pHdr->EndpointID];
-
- if (0 == pEndpoint->ServiceID) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Endpoint %d is not connected !\n",pHdr->EndpointID));
- /* endpoint isn't even connected */
- status = A_EPROTO;
- break;
- }
-
- /* lock RX to get a buffer */
- LOCK_HTC_RX(target);
-
- /* get a packet from the endpoint recv queue */
- pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
-
- if (NULL == pPacket) {
- /* check for refill handler */
- if (pEndpoint->EpCallBacks.EpRecvRefill != NULL) {
- UNLOCK_HTC_RX(target);
- /* call the re-fill handler */
- pEndpoint->EpCallBacks.EpRecvRefill(pEndpoint->EpCallBacks.pContext,
- pHdr->EndpointID);
- LOCK_HTC_RX(target);
- /* check if we have more buffers */
- pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
- /* fall through */
- }
- }
-
- if (NULL == pPacket) {
- /* this is not an error, we simply need to mark that we are waiting for buffers.*/
- target->HTCStateFlags |= HTC_STATE_WAIT_BUFFERS;
- target->EpWaitingForBuffers = pHdr->EndpointID;
- status = A_NO_MEMORY;
- }
-
- UNLOCK_HTC_RX(target);
-
- if (A_FAILED(status)) {
- /* no buffers */
- break;
- }
-
- AR_DEBUG_ASSERT(pPacket->Endpoint == pHdr->EndpointID);
-
- /* make sure this message can fit in the endpoint buffer */
- if ((pHdr->PayloadLen + HTC_HDR_LENGTH) > pPacket->BufferLength) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("Payload Length Error : header reports payload of: %d, endpoint buffer size: %d \n",
- pHdr->PayloadLen, pPacket->BufferLength));
- status = A_EPROTO;
- break;
- }
-
- pPacket->HTCReserved = LookAhead; /* set expected look ahead */
- /* set the amount of data to fetch */
- pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
-
- if (asyncProc) {
- /* we use async mode to get the packet if the device layer supports it
- * set our callback and context */
- pPacket->Completion = HTCRecvCompleteHandler;
- pPacket->pContext = target;
- } else {
- /* fully synchronous */
- pPacket->Completion = NULL;
- }
-
- /* go fetch the packet */
- status = HTCIssueRecv(target, pPacket);
-
- if (A_FAILED(status)) {
- break;
- }
-
- if (asyncProc) {
- /* we did this asynchronously so we can get out of the loop, the asynch processing
- * creates a chain of requests to continue processing pending messages in the
- * context of callbacks */
- break;
- }
-
- /* in the sync case, we process the packet, check lookaheads and then repeat */
-
- LookAhead = 0;
- status = HTCProcessRecvHeader(target,pPacket,&LookAhead);
-
- if (A_FAILED(status)) {
- break;
- }
-
- HTC_RX_STAT_PROFILE(target,pEndpoint,LookAhead);
- DO_RCV_COMPLETION(target,pPacket,pEndpoint);
-
- pPacket = NULL;
-
- if (0 == LookAhead) {
- break;
- }
-
- }
-
- if (A_NO_MEMORY == status) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- (" Endpoint :%d has no buffers, blocking receiver to prevent overrun.. \n",
- pHdr->EndpointID));
- /* try to stop receive at the device layer */
- DevStopRecv(&target->Device, asyncProc ? DEV_STOP_RECV_ASYNC : DEV_STOP_RECV_SYNC);
- status = A_OK;
- } else if (A_FAILED(status)) {
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
- ("Failed to get pending message : LookAhead Value: 0x%X (status = %d) \n",
- LookAhead, status));
- if (pPacket != NULL) {
- /* clean up packet on error */
- HTC_RECYCLE_RX_PKT(target, pPacket);
- }
- }
-
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCRecvMessagePendingHandler \n"));
-
- return status;
-}
-
-/* Makes a buffer available to the HTC module */
-A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
-{
- HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
- HTC_ENDPOINT *pEndpoint;
- A_BOOL unblockRecv = FALSE;
- A_STATUS status = A_OK;
-
- AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
- ("+- HTCAddReceivePkt: endPointId: %d, buffer: 0x%X, length: %d\n",
- pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->BufferLength));
-
- do {
-
- if (HTC_STOPPING(target)) {
- status = A_ECANCELED;
- break;
- }
-
- AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
-
- pEndpoint = &target->EndPoint[pPacket->Endpoint];
-
- LOCK_HTC_RX(target);
-
- /* store receive packet */
- HTC_PACKET_ENQUEUE(&pEndpoint->RxBuffers, pPacket);
-
- /* check if we are blocked waiting for a new buffer */
- if (target->HTCStateFlags & HTC_STATE_WAIT_BUFFERS) {
- if (target->EpWaitingForBuffers == pPacket->Endpoint) {
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" receiver was blocked on ep:%d, unblocking.. \n",
- target->EpWaitingForBuffers));
- target->HTCStateFlags &= ~HTC_STATE_WAIT_BUFFERS;
- target->EpWaitingForBuffers = ENDPOINT_MAX;
- unblockRecv = TRUE;
- }
- }
-
- UNLOCK_HTC_RX(target);
-
- if (unblockRecv && !HTC_STOPPING(target)) {
- /* TODO : implement a buffer threshold count? */
- DevEnableRecv(&target->Device,DEV_ENABLE_RECV_SYNC);
- }
-
- } while (FALSE);
-
- return status;
-}
-
-static void HTCFlushEndpointRX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint)
-{
- HTC_PACKET *pPacket;
-
- LOCK_HTC_RX(target);
-
- while (1) {
- pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
- if (NULL == pPacket) {
- break;
- }
- UNLOCK_HTC_RX(target);
- pPacket->Status = A_ECANCELED;
- pPacket->ActualLength = 0;
- AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" Flushing RX packet:0x%X, length:%d, ep:%d \n",
- (A_UINT32)pPacket, pPacket->BufferLength, pPacket->Endpoint));
- /* give the packet back */
- pEndpoint->EpCallBacks.EpRecv(pEndpoint->EpCallBacks.pContext,
- pPacket);
- LOCK_HTC_RX(target);
- }
-
- UNLOCK_HTC_RX(target);
-
-
-}
-
-void HTCFlushRecvBuffers(HTC_TARGET *target)
-{
- HTC_ENDPOINT *pEndpoint;
- int i;
-
- /* NOTE: no need to flush endpoint 0, these buffers were
- * allocated as part of the HTC struct */
- for (i = ENDPOINT_1; i < ENDPOINT_MAX; i++) {
- pEndpoint = &target->EndPoint[i];
- if (pEndpoint->ServiceID == 0) {
- /* not in use.. */
- continue;
- }
- HTCFlushEndpointRX(target,pEndpoint);
- }
-
-
-}
-
-