staging: ath6kl: Convert enum A_STATUS to int
[deliverable/linux.git] / drivers / staging / ath6kl / htc2 / htc_internal.h
CommitLineData
30295c89
VM
1//------------------------------------------------------------------------------
2// <copyright file="htc_internal.h" company="Atheros">
3// Copyright (c) 2007-2010 Atheros Corporation. All rights reserved.
4//
5//
6// Permission to use, copy, modify, and/or distribute this software for any
7// purpose with or without fee is hereby granted, provided that the above
8// copyright notice and this permission notice appear in all copies.
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.
17//
18//
19//------------------------------------------------------------------------------
20//==============================================================================
21// Author(s): ="Atheros"
22//==============================================================================
23#ifndef _HTC_INTERNAL_H_
24#define _HTC_INTERNAL_H_
25
26/* for debugging, uncomment this to capture the last frame header, on frame header
27 * processing errors, the last frame header is dump for comparison */
28//#define HTC_CAPTURE_LAST_FRAME
29
30//#define HTC_EP_STAT_PROFILING
31
32#ifdef __cplusplus
33extern "C" {
34#endif /* __cplusplus */
35
36/* Header files */
37
38#include "a_config.h"
39#include "athdefs.h"
40#include "a_types.h"
41#include "a_osapi.h"
42#include "htc_debug.h"
43#include "htc.h"
44#include "htc_api.h"
45#include "bmi_msg.h"
46#include "hif.h"
47#include "AR6000/ar6k.h"
48
49/* HTC operational parameters */
50#define HTC_TARGET_RESPONSE_TIMEOUT 2000 /* in ms */
51#define HTC_TARGET_DEBUG_INTR_MASK 0x01
52#define HTC_TARGET_CREDIT_INTR_MASK 0xF0
53
54#define HTC_HOST_MAX_MSG_PER_BUNDLE 8
55#define HTC_MIN_HTC_MSGS_TO_BUNDLE 2
56
57/* packet flags */
58
59#define HTC_RX_PKT_IGNORE_LOOKAHEAD (1 << 0)
60#define HTC_RX_PKT_REFRESH_HDR (1 << 1)
61#define HTC_RX_PKT_PART_OF_BUNDLE (1 << 2)
62#define HTC_RX_PKT_NO_RECYCLE (1 << 3)
63
64/* scatter request flags */
65
66#define HTC_SCATTER_REQ_FLAGS_PARTIAL_BUNDLE (1 << 0)
67
68typedef struct _HTC_ENDPOINT {
69 HTC_ENDPOINT_ID Id;
70 HTC_SERVICE_ID ServiceID; /* service ID this endpoint is bound to
71 non-zero value means this endpoint is in use */
72 HTC_PACKET_QUEUE TxQueue; /* HTC frame buffer TX queue */
73 HTC_PACKET_QUEUE RxBuffers; /* HTC frame buffer RX list */
74 HTC_ENDPOINT_CREDIT_DIST CreditDist; /* credit distribution structure (exposed to driver layer) */
75 HTC_EP_CALLBACKS EpCallBacks; /* callbacks associated with this endpoint */
76 int MaxTxQueueDepth; /* max depth of the TX queue before we need to
77 call driver's full handler */
78 int MaxMsgLength; /* max length of endpoint message */
79 int TxProcessCount; /* reference count to continue tx processing */
80 HTC_PACKET_QUEUE RecvIndicationQueue; /* recv packets ready to be indicated */
81 int RxProcessCount; /* reference count to allow single processing context */
82 struct _HTC_TARGET *target; /* back pointer to target */
83 A_UINT8 SeqNo; /* TX seq no (helpful) for debugging */
84 A_UINT32 LocalConnectionFlags; /* local connection flags */
85#ifdef HTC_EP_STAT_PROFILING
86 HTC_ENDPOINT_STATS EndPointStats; /* endpoint statistics */
87#endif
88} HTC_ENDPOINT;
89
90#ifdef HTC_EP_STAT_PROFILING
91#define INC_HTC_EP_STAT(p,stat,count) (p)->EndPointStats.stat += (count);
92#else
93#define INC_HTC_EP_STAT(p,stat,count)
94#endif
95
96#define HTC_SERVICE_TX_PACKET_TAG HTC_TX_PACKET_TAG_INTERNAL
97
98#define NUM_CONTROL_BUFFERS 8
99#define NUM_CONTROL_TX_BUFFERS 2
100#define NUM_CONTROL_RX_BUFFERS (NUM_CONTROL_BUFFERS - NUM_CONTROL_TX_BUFFERS)
101
102typedef struct HTC_CONTROL_BUFFER {
103 HTC_PACKET HtcPacket;
104 A_UINT8 *Buffer;
105} HTC_CONTROL_BUFFER;
106
107#define HTC_RECV_WAIT_BUFFERS (1 << 0)
108#define HTC_OP_STATE_STOPPING (1 << 0)
109
110/* our HTC target state */
111typedef struct _HTC_TARGET {
112 HTC_ENDPOINT EndPoint[ENDPOINT_MAX];
113 HTC_CONTROL_BUFFER HTCControlBuffers[NUM_CONTROL_BUFFERS];
114 HTC_ENDPOINT_CREDIT_DIST *EpCreditDistributionListHead;
115 HTC_PACKET_QUEUE ControlBufferTXFreeList;
116 HTC_PACKET_QUEUE ControlBufferRXFreeList;
117 HTC_CREDIT_DIST_CALLBACK DistributeCredits;
118 HTC_CREDIT_INIT_CALLBACK InitCredits;
119 void *pCredDistContext;
120 int TargetCredits;
121 unsigned int TargetCreditSize;
122 A_MUTEX_T HTCLock;
123 A_MUTEX_T HTCRxLock;
124 A_MUTEX_T HTCTxLock;
125 AR6K_DEVICE Device; /* AR6K - specific state */
126 A_UINT32 OpStateFlags;
127 A_UINT32 RecvStateFlags;
128 HTC_ENDPOINT_ID EpWaitingForBuffers;
129 A_BOOL TargetFailure;
130#ifdef HTC_CAPTURE_LAST_FRAME
131 HTC_FRAME_HDR LastFrameHdr; /* useful for debugging */
132 A_UINT8 LastTrailer[256];
133 A_UINT8 LastTrailerLength;
134#endif
135 HTC_INIT_INFO HTCInitInfo;
136 A_UINT8 HTCTargetVersion;
137 int MaxMsgPerBundle; /* max messages per bundle for HTC */
138 A_BOOL SendBundlingEnabled; /* run time enable for send bundling (dynamic) */
139 int RecvBundlingEnabled; /* run time enable for recv bundling (dynamic) */
140} HTC_TARGET;
141
142#define HTC_STOPPING(t) ((t)->OpStateFlags & HTC_OP_STATE_STOPPING)
143#define LOCK_HTC(t) A_MUTEX_LOCK(&(t)->HTCLock);
144#define UNLOCK_HTC(t) A_MUTEX_UNLOCK(&(t)->HTCLock);
145#define LOCK_HTC_RX(t) A_MUTEX_LOCK(&(t)->HTCRxLock);
146#define UNLOCK_HTC_RX(t) A_MUTEX_UNLOCK(&(t)->HTCRxLock);
147#define LOCK_HTC_TX(t) A_MUTEX_LOCK(&(t)->HTCTxLock);
148#define UNLOCK_HTC_TX(t) A_MUTEX_UNLOCK(&(t)->HTCTxLock);
149
150#define GET_HTC_TARGET_FROM_HANDLE(hnd) ((HTC_TARGET *)(hnd))
151#define HTC_RECYCLE_RX_PKT(target,p,e) \
152{ \
153 if ((p)->PktInfo.AsRx.HTCRxFlags & HTC_RX_PKT_NO_RECYCLE) { \
154 HTC_PACKET_RESET_RX(pPacket); \
155 pPacket->Status = A_ECANCELED; \
156 (e)->EpCallBacks.EpRecv((e)->EpCallBacks.pContext, \
157 (p)); \
158 } else { \
159 HTC_PACKET_RESET_RX(pPacket); \
160 HTCAddReceivePkt((HTC_HANDLE)(target),(p)); \
161 } \
162}
163
164/* internal HTC functions */
165void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket);
166void HTCControlRecv(void *Context, HTC_PACKET *pPacket);
1f4c34bd 167int HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket);
30295c89
VM
168HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList);
169void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList);
1f4c34bd 170int HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket);
30295c89 171void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket);
1f4c34bd 172int HTCRecvMessagePendingHandler(void *Context, A_UINT32 MsgLookAheads[], int NumLookAheads, A_BOOL *pAsyncProc, int *pNumPktsFetched);
30295c89 173void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint);
1f4c34bd 174int HTCSendSetupComplete(HTC_TARGET *target);
30295c89
VM
175void HTCFlushRecvBuffers(HTC_TARGET *target);
176void HTCFlushSendPkts(HTC_TARGET *target);
177
178#ifdef ATH_DEBUG_MODULE
179void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist);
180void DumpCreditDistStates(HTC_TARGET *target);
181void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
182#endif
183
184static INLINE HTC_PACKET *HTC_ALLOC_CONTROL_TX(HTC_TARGET *target) {
185 HTC_PACKET *pPacket = HTCAllocControlBuffer(target,&target->ControlBufferTXFreeList);
186 if (pPacket != NULL) {
187 /* set payload pointer area with some headroom */
188 pPacket->pBuffer = pPacket->pBufferStart + HTC_HDR_LENGTH;
189 }
190 return pPacket;
191}
192
193#define HTC_FREE_CONTROL_TX(t,p) HTCFreeControlBuffer((t),(p),&(t)->ControlBufferTXFreeList)
194#define HTC_ALLOC_CONTROL_RX(t) HTCAllocControlBuffer((t),&(t)->ControlBufferRXFreeList)
195#define HTC_FREE_CONTROL_RX(t,p) \
196{ \
197 HTC_PACKET_RESET_RX(p); \
198 HTCFreeControlBuffer((t),(p),&(t)->ControlBufferRXFreeList); \
199}
200
201#define HTC_PREPARE_SEND_PKT(pP,sendflags,ctrl0,ctrl1) \
202{ \
203 A_UINT8 *pHdrBuf; \
204 (pP)->pBuffer -= HTC_HDR_LENGTH; \
205 pHdrBuf = (pP)->pBuffer; \
206 A_SET_UINT16_FIELD(pHdrBuf,HTC_FRAME_HDR,PayloadLen,(A_UINT16)(pP)->ActualLength); \
207 A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,Flags,(sendflags)); \
208 A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,EndpointID, (A_UINT8)(pP)->Endpoint); \
209 A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,ControlBytes[0], (A_UINT8)(ctrl0)); \
210 A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,ControlBytes[1], (A_UINT8)(ctrl1)); \
211}
212
213#define HTC_UNPREPARE_SEND_PKT(pP) \
214 (pP)->pBuffer += HTC_HDR_LENGTH; \
215
216#ifdef __cplusplus
217}
218#endif
219
220#endif /* _HTC_INTERNAL_H_ */
This page took 0.067822 seconds and 5 git commands to generate.