1/* 2 * 3 * Copyright (c) 2007 Atheros Communications Inc. 4 * All rights reserved. 5 * 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation; 10 * 11 * Software distributed under the License is distributed on an "AS 12 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 13 * implied. See the License for the specific language governing 14 * rights and limitations under the License. 15 * 16 * 17 * 18 */ 19 20#ifndef _HTC_INTERNAL_H_ 21#define _HTC_INTERNAL_H_ 22 23/* for debugging, uncomment this to capture the last frame header, on frame header 24 * processing errors, the last frame header is dump for comparison */ 25//#define HTC_CAPTURE_LAST_FRAME 26 27//#define HTC_EP_STAT_PROFILING 28 29#ifdef __cplusplus 30extern "C" { 31#endif /* __cplusplus */ 32 33/* Header files */ 34#include "a_config.h" 35#include "athdefs.h" 36#include "a_types.h" 37#include "a_osapi.h" 38#include "a_debug.h" 39#include "htc.h" 40#include "htc_api.h" 41#include "bmi_msg.h" 42#include "hif.h" 43#include "ar6k.h" 44 45/* HTC operational parameters */ 46#define HTC_TARGET_RESPONSE_TIMEOUT 2000 /* in ms */ 47#define HTC_TARGET_DEBUG_INTR_MASK 0x01 48#define HTC_TARGET_CREDIT_INTR_MASK 0xF0 49 50typedef struct _HTC_ENDPOINT { 51 HTC_SERVICE_ID ServiceID; /* service ID this endpoint is bound to 52 non-zero value means this endpoint is in use */ 53 HTC_PACKET_QUEUE TxQueue; /* HTC frame buffer TX queue */ 54 HTC_PACKET_QUEUE RxBuffers; /* HTC frame buffer RX list */ 55 HTC_ENDPOINT_CREDIT_DIST CreditDist; /* credit distribution structure (exposed to driver layer) */ 56 HTC_EP_CALLBACKS EpCallBacks; /* callbacks associated with this endpoint */ 57 int MaxTxQueueDepth; /* max depth of the TX queue before we need to 58 call driver's full handler */ 59 int CurrentTxQueueDepth; /* current TX queue depth */ 60 int MaxMsgLength; /* max length of endpoint message */ 61#ifdef HTC_EP_STAT_PROFILING 62 HTC_ENDPOINT_STATS EndPointStats; /* endpoint statistics */ 63#endif 64} HTC_ENDPOINT; 65 66#ifdef HTC_EP_STAT_PROFILING 67#define INC_HTC_EP_STAT(p,stat,count) (p)->EndPointStats.stat += (count); 68#else 69#define INC_HTC_EP_STAT(p,stat,count) 70#endif 71 72#define HTC_SERVICE_TX_PACKET_TAG HTC_TX_PACKET_TAG_INTERNAL 73 74#define NUM_CONTROL_BUFFERS 8 75#define NUM_CONTROL_TX_BUFFERS 2 76#define NUM_CONTROL_RX_BUFFERS (NUM_CONTROL_BUFFERS - NUM_CONTROL_TX_BUFFERS) 77 78#define HTC_CONTROL_BUFFER_SIZE (HTC_MAX_CONTROL_MESSAGE_LENGTH + HTC_HDR_LENGTH) 79 80typedef struct HTC_CONTROL_BUFFER { 81 HTC_PACKET HtcPacket; 82 A_UINT8 Buffer[HTC_CONTROL_BUFFER_SIZE]; 83} HTC_CONTROL_BUFFER; 84 85/* our HTC target state */ 86typedef struct _HTC_TARGET { 87 HTC_ENDPOINT EndPoint[ENDPOINT_MAX]; 88 HTC_CONTROL_BUFFER HTCControlBuffers[NUM_CONTROL_BUFFERS]; 89 HTC_ENDPOINT_CREDIT_DIST *EpCreditDistributionListHead; 90 HTC_PACKET_QUEUE ControlBufferTXFreeList; 91 HTC_PACKET_QUEUE ControlBufferRXFreeList; 92 HTC_CREDIT_DIST_CALLBACK DistributeCredits; 93 HTC_CREDIT_INIT_CALLBACK InitCredits; 94 void *pCredDistContext; 95 int TargetCredits; 96 int TargetCreditSize; 97 A_MUTEX_T HTCLock; 98 A_MUTEX_T HTCRxLock; 99 A_MUTEX_T HTCTxLock; 100 AR6K_DEVICE Device; /* AR6K - specific state */ 101 A_UINT32 HTCStateFlags; 102 HTC_ENDPOINT_ID EpWaitingForBuffers; 103 A_BOOL TargetFailure; 104 void *pInstanceContext; 105#define HTC_STATE_WAIT_BUFFERS (1 << 0) 106#define HTC_STATE_STOPPING (1 << 1) 107#ifdef HTC_CAPTURE_LAST_FRAME 108 HTC_FRAME_HDR LastFrameHdr; /* useful for debugging */ 109 A_UINT8 LastTrailer[256]; 110 A_UINT8 LastTrailerLength; 111#endif 112} HTC_TARGET; 113 114#define HTC_STOPPING(t) ((t)->HTCStateFlags & HTC_STATE_STOPPING) 115#define LOCK_HTC(t) A_MUTEX_LOCK(&(t)->HTCLock); 116#define UNLOCK_HTC(t) A_MUTEX_UNLOCK(&(t)->HTCLock); 117#define LOCK_HTC_RX(t) A_MUTEX_LOCK(&(t)->HTCRxLock); 118#define UNLOCK_HTC_RX(t) A_MUTEX_UNLOCK(&(t)->HTCRxLock); 119#define LOCK_HTC_TX(t) A_MUTEX_LOCK(&(t)->HTCTxLock); 120#define UNLOCK_HTC_TX(t) A_MUTEX_UNLOCK(&(t)->HTCTxLock); 121 122#define GET_HTC_TARGET_FROM_HANDLE(hnd) ((HTC_TARGET *)(hnd)) 123#define HTC_RECYCLE_RX_PKT(target,p) \ 124{ \ 125 HTC_PACKET_RESET_RX(pPacket); \ 126 HTCAddReceivePkt((HTC_HANDLE)(target),(p)); \ 127} 128 129/* internal HTC functions */ 130void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket); 131void HTCControlRecv(void *Context, HTC_PACKET *pPacket); 132A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket); 133HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList); 134void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList); 135A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 Flags); 136A_STATUS HTCIssueRecv(HTC_TARGET *target, HTC_PACKET *pPacket); 137void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket); 138A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc); 139void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint); 140A_STATUS HTCSendSetupComplete(HTC_TARGET *target); 141void HTCFlushRecvBuffers(HTC_TARGET *target); 142void HTCFlushSendPkts(HTC_TARGET *target); 143void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist); 144void DumpCreditDistStates(HTC_TARGET *target); 145void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription); 146 147static INLINE HTC_PACKET *HTC_ALLOC_CONTROL_TX(HTC_TARGET *target) { 148 HTC_PACKET *pPacket = HTCAllocControlBuffer(target,&target->ControlBufferTXFreeList); 149 if (pPacket != NULL) { 150 /* set payload pointer area with some headroom */ 151 pPacket->pBuffer = pPacket->pBufferStart + HTC_HDR_LENGTH; 152 } 153 return pPacket; 154} 155 156#define HTC_FREE_CONTROL_TX(t,p) HTCFreeControlBuffer((t),(p),&(t)->ControlBufferTXFreeList) 157#define HTC_ALLOC_CONTROL_RX(t) HTCAllocControlBuffer((t),&(t)->ControlBufferRXFreeList) 158#define HTC_FREE_CONTROL_RX(t,p) \ 159{ \ 160 HTC_PACKET_RESET_RX(p); \ 161 HTCFreeControlBuffer((t),(p),&(t)->ControlBufferRXFreeList); \ 162} 163 164#ifdef __cplusplus 165} 166#endif 167 168#endif /* _HTC_INTERNAL_H_ */ 169